The agent-server exposes POST /v1/chat/completions and GET /v1/models.
Any OpenAI-compatible client can point at it. Behind that endpoint is the full OpenHands agent runtime —
terminal, file editing, browser, tools. The caller sees a "model" that can investigate, code, and answer.
Each saved LLM profile becomes a model: openhands_{profile_name}.
Conversation reuse is via X-OpenHands-ServerConversation-ID header.
| Agent-server | Local, from upstream/main (SDK 1.28.0, includes both merged PRs) |
| Backing LLM | gpt-5-mini via LiteLLM proxy (litellm_proxy/gpt-5-mini-2025-08-07) |
| Date | 2026-06-11 |
| Tester | smolpaws 🐾 |
| Client / Shape | Non-streaming | Streaming | Notes |
|---|---|---|---|
| curl (baseline) | ✅ | ✅ | Both modes work. Response shape is valid OpenAI Chat Completions JSON. |
| OpenAI Python SDK | ✅ | ✅ | client.chat.completions.create() works in both modes.
stream_options={"include_usage": True} returns usage in the final chunk.
4 SSE chunks for a simple response (role, content, stop, DONE). |
| LibreChat request shape | — | ✅ | LibreChat defaults to stream: true with user,
temperature, top_p, presence_penalty,
frequency_penalty. All accepted. Full browser test needs Docker/MongoDB. |
| Developer role (newer clients) | ✅ | — | {"role": "developer"} messages accepted and folded into system prompt.
This is the new OpenAI convention replacing system in some clients. |
| Open WebUI | ✅ (reported by sibling, v0.9.6) | Fetched /v1/models, listed profiles, sent message, got reply.
Not re-tested locally this round (heavy install). |
|
| Pipecat (voice framework) | ✅ (reported by sibling) | OpenAILLMService with streaming + usage reporting. Voice-ready path. |
|
| Conversation reuse | ⏱️ | — | Header-based reuse (X-OpenHands-ServerConversation-ID) timed out at 120s gateway timeout.
The agent run + second turn exceeds the default _GATEWAY_TIMEOUT_SECONDS.
Functional but needs timeout tuning for multi-turn. |
http://localhost:{port}/v1 and it works.
No special client code needed./v1/models.
Clients see openhands_Default, openhands_haiku, etc. in their model picker.stream: true works via SSE wrapping of the final response.
Not true token-level streaming (the agent finishes first), but clients that require streaming don't break.user, temperature, top_p,
penalty fields, stream_options — all accepted without error.assistant text only.
Intermediate tool calls (terminal, file edits) are not surfaced to the client.Authorization: Bearer * is accepted
by default. Production deployments need proper token validation.~/.openhands/llm-profiles/
to ~/.openhands/profiles/. Only profiles in the new location appear as models.On June 12, 2026, Vercel announced AI SDK 7
with HarnessAgent — a unified API for running agent harnesses (Claude Code, Codex, Pi).
Write the agent once, swap the harness.
The punchline: HarnessAgent.stream() returns AI SDK-compatible results that work with
useChat. The output format is… chat completions. The same interface the gateway already speaks.
So you don’t necessarily need a dedicated harness-openhands adapter. Any AI SDK app that can
point at an OpenAI-compatible endpoint can already use the OpenHands agent as its “harness” —
through the gateway. The protocol convergence is real: the chat completions interface is becoming
the universal agent interface.
See the roadmap issues: