OpenResponses Gateway Integrationsplan
Kontext
OpenClaw Gateway stellt aktuell einen minimalen OpenAI-kompatiblen Chat-Completions-Endpunkt unter /v1/chat/completions bereit (siehe OpenAI Chat Completions).
Open Responses ist ein offener Inferenz-Standard basierend auf der OpenAI Responses API. Er ist für agentische Workflows konzipiert und nutzt item-basierte Eingaben plus semantische Streaming-Events. Die OpenResponses-Spezifikation definiert /v1/responses, nicht /v1/chat/completions.
Ziele
- Einen
/v1/responses-Endpunkt hinzufügen, der der OpenResponses-Semantik folgt. - Chat Completions als Kompatibilitätsschicht beibehalten, die leicht deaktiviert und irgendwann entfernt werden kann.
- Validierung und Parsing mit isolierten, wiederverwendbaren Schemas standardisieren.
Nicht-Ziele
- Volle OpenResponses-Feature-Parität im ersten Durchgang (Bilder, Dateien, gehostete Tools).
- Interne Agent-Ausführungslogik oder Tool-Orchestrierung ersetzen.
- Das bestehende
/v1/chat/completions-Verhalten während der ersten Phase ändern.
Forschungszusammenfassung
Quellen: OpenResponses OpenAPI, OpenResponses-Spezifikationsseite und der Hugging-Face-Blogbeitrag.
Extrahierte Kernpunkte:
POST /v1/responsesakzeptiertCreateResponseBody-Felder wiemodel,input(String oderItemParam[]),instructions,tools,tool_choice,stream,max_output_tokensundmax_tool_calls.ItemParamist eine diskriminierte Union aus:message-Items mit Rollensystem,developer,user,assistantfunction_callundfunction_call_outputreasoningitem_reference
- Erfolgreiche Antworten liefern eine
ResponseResourcemitobject: "response",statusundoutput-Items. - Streaming nutzt semantische Events wie:
response.created,response.in_progress,response.completed,response.failedresponse.output_item.added,response.output_item.doneresponse.content_part.added,response.content_part.doneresponse.output_text.delta,response.output_text.done
- Die Spezifikation erfordert:
Content-Type: text/event-streamevent:muss dem JSON-type-Feld entsprechen- Terminales Event muss wörtlich
[DONE]sein
- Reasoning-Items können
content,encrypted_contentundsummarybereitstellen. - HF-Beispiele enthalten
OpenResponses-Version: latestin Requests (optionaler Header).
Vorgeschlagene Architektur
src/gateway/open-responses.schema.tsmit nur Zod-Schemas hinzufügen (keine Gateway-Imports).src/gateway/openresponses-http.ts(oderopen-responses-http.ts) für/v1/responseshinzufügen.src/gateway/openai-http.tsals Legacy-Kompatibilitätsadapter intakt lassen.- Config
gateway.http.endpoints.responses.enabledhinzufügen (Standardfalse). gateway.http.endpoints.chatCompletions.enabledunabhängig halten; beide Endpunkte separat umschaltbar.- Beim Start eine Warnung ausgeben wenn Chat Completions aktiviert ist, um den Legacy-Status zu signalisieren.
Deprecation-Pfad für Chat Completions
- Strikte Modulgrenzen beibehalten: keine gemeinsamen Schema-Typen zwischen Responses und Chat Completions.
- Chat Completions per Config opt-in machen, damit es ohne Code-Änderungen deaktiviert werden kann.
- Docs aktualisieren, um Chat Completions als Legacy zu kennzeichnen sobald
/v1/responsesstabil ist. - Optionaler zukünftiger Schritt: Chat-Completions-Requests auf den Responses-Handler mappen für einen einfacheren Entfernungspfad.
Phase 1 Support-Subset
inputals String oderItemParam[]mit Nachrichtenrollen undfunction_call_outputakzeptieren.- System- und Developer-Nachrichten in
extraSystemPromptextrahieren. - Die neueste
user- oderfunction_call_output-Nachricht als aktuelle Nachricht für Agent-Runs verwenden. - Nicht unterstützte Content-Parts (Bild/Datei) mit
invalid_request_errorablehnen. - Eine einzelne Assistenten-Nachricht mit
output_text-Inhalt zurückgeben. usagemit Nullwerten zurückgeben bis Token-Accounting verbunden ist.
Validierungsstrategie (ohne SDK)
- Zod-Schemas für das unterstützte Subset implementieren:
CreateResponseBodyItemParam+ Message-Content-Part-UnionsResponseResource- Streaming-Event-Formen die vom Gateway genutzt werden
- Schemas in einem einzigen, isolierten Modul halten, um Drift zu vermeiden und zukünftige Codegen zu ermöglichen.
Streaming-Implementierung (Phase 1)
- SSE-Zeilen mit
event:unddata:. - Erforderliche Sequenz (Minimum Viable):
response.createdresponse.output_item.addedresponse.content_part.addedresponse.output_text.delta(nach Bedarf wiederholen)response.output_text.doneresponse.content_part.doneresponse.completed[DONE]
Tests und Verifikationsplan
- E2E-Coverage für
/v1/responseshinzufügen:- Auth erforderlich
- Nicht-Stream-Antwortform
- Stream-Event-Reihenfolge und
[DONE] - Session-Routing mit Headern und
user
src/gateway/openai-http.test.tsunverändert lassen.- Manuell: curl zu
/v1/responsesmitstream: trueund Event-Reihenfolge sowie terminales[DONE]verifizieren.
Docs-Updates (Follow-up)
- Neue Docs-Seite für
/v1/responses-Nutzung und Beispiele hinzufügen. /gateway/openai-http-apimit Legacy-Hinweis und Verweis auf/v1/responsesaktualisieren.