OpenResponses API (HTTP)
Das OpenClaw-Gateway kann einen OpenResponses-kompatiblen POST /v1/responses-Endpunkt bereitstellen.
Dieser Endpunkt ist standardmäßig deaktiviert. Aktiviere ihn zuerst in der Konfiguration.
POST /v1/responses- Gleicher Port wie das Gateway (WS + HTTP Multiplex):
http://<gateway-host>:<port>/v1/responses
Intern werden Anfragen als normaler Gateway-Agent-Run ausgeführt (gleicher Codepfad wie openclaw agent), sodass Routing/Berechtigungen/Konfiguration dem Gateway entsprechen.
Authentifizierung, Sicherheit und Routing
Das Betriebsverhalten entspricht den OpenAI Chat Completions:
- Verwende
Authorization: Bearer <token>mit der normalen Gateway-Auth-Konfiguration - Behandle den Endpunkt als Vollzugriff auf Operator-Ebene für die Gateway-Instanz
- Wähle Agents mit
model: "openclaw:<agentId>",model: "agent:<agentId>"oderx-openclaw-agent-id - Verwende
x-openclaw-session-keyfür explizites Session-Routing
Aktiviere oder deaktiviere diesen Endpunkt mit gateway.http.endpoints.responses.enabled.
Session-Verhalten
Standardmäßig ist der Endpunkt zustandslos pro Anfrage (bei jedem Aufruf wird ein neuer Session-Key generiert).
Wenn die Anfrage einen OpenResponses-user-String enthält, leitet das Gateway einen stabilen Session-Key daraus ab, sodass wiederholte Aufrufe eine Agent-Session teilen können.
Request-Format (unterstützt)
Die Anfrage folgt der OpenResponses API mit item-basiertem Input. Aktuell unterstützt:
input: String oder Array von Item-Objekten.instructions: wird in den System-Prompt integriert.tools: Client-seitige Tool-Definitionen (Function Tools).tool_choice: Client-Tools filtern oder erzwingen.stream: aktiviert SSE-Streaming.max_output_tokens: Best-Effort-Ausgabelimit (anbieterabhängig).user: stabiles Session-Routing.
Akzeptiert, aber derzeit ignoriert:
max_tool_callsreasoningmetadatastoreprevious_response_idtruncation
Items (Input)
message
Rollen: system, developer, user, assistant.
systemunddeveloperwerden an den System-Prompt angehängt.- Das neueste
user- oderfunction_call_output-Item wird zur “aktuellen Nachricht”. - Frühere User-/Assistant-Nachrichten werden als Kontext-Verlauf einbezogen.
function_call_output (Turn-basierte Tools)
Sende Tool-Ergebnisse an das Modell zurück:
{
"type": "function_call_output",
"call_id": "call_123",
"output": "{\"temperature\": \"72F\"}"
}
reasoning und item_reference
Werden zur Schema-Kompatibilität akzeptiert, beim Prompt-Aufbau aber ignoriert.
Tools (Client-seitige Function Tools)
Stelle Tools mit tools: [{ type: "function", function: { name, description?, parameters? } }] bereit.
Wenn der Agent ein Tool aufrufen will, gibt die Antwort ein function_call-Output-Item zurück.
Du sendest dann eine Folge-Anfrage mit function_call_output, um den Turn fortzusetzen.
Bilder (input_image)
Unterstützt Base64- oder URL-Quellen:
{
"type": "input_image",
"source": { "type": "url", "url": "https://example.com/image.png" }
}
Erlaubte MIME-Typen (aktuell): image/jpeg, image/png, image/gif, image/webp, image/heic, image/heif.
Maximale Größe (aktuell): 10 MB.
Dateien (input_file)
Unterstützt Base64- oder URL-Quellen:
{
"type": "input_file",
"source": {
"type": "base64",
"media_type": "text/plain",
"data": "SGVsbG8gV29ybGQh",
"filename": "hello.txt"
}
}
Erlaubte MIME-Typen (aktuell): text/plain, text/markdown, text/html, text/csv,
application/json, application/pdf.
Maximale Größe (aktuell): 5 MB.
Aktuelles Verhalten:
- Datei-Inhalte werden dekodiert und zum System-Prompt hinzugefügt, nicht zur User-Nachricht, sodass sie ephemer bleiben (nicht im Session-Verlauf persistiert werden).
- PDFs werden auf Text geparst. Wenn wenig Text gefunden wird, werden die ersten Seiten zu Bildern gerastert und an das Modell übergeben.
Das PDF-Parsing verwendet den Node-freundlichen pdfjs-dist Legacy-Build (ohne Worker). Der moderne
PDF.js-Build erwartet Browser-Worker/DOM-Globals und wird daher im Gateway nicht verwendet.
URL-Fetch-Standardwerte:
files.allowUrl:trueimages.allowUrl:truemaxUrlParts:8(maximale URL-basierteinput_file+input_imageTeile pro Anfrage)- Anfragen werden abgesichert (DNS-Auflösung, Private-IP-Blocking, Redirect-Limits, Timeouts).
- Optionale Hostname-Allowlists werden pro Input-Typ unterstützt (
files.urlAllowlist,images.urlAllowlist).- Exakter Host:
"cdn.example.com" - Wildcard-Subdomains:
"*.assets.example.com"(matcht nicht die Apex-Domain)
- Exakter Host:
Datei- und Bildlimits (Konfiguration)
Standardwerte können unter gateway.http.endpoints.responses angepasst werden:
{
gateway: {
http: {
endpoints: {
responses: {
enabled: true,
maxBodyBytes: 20000000,
maxUrlParts: 8,
files: {
allowUrl: true,
urlAllowlist: ["cdn.example.com", "*.assets.example.com"],
allowedMimes: [
"text/plain",
"text/markdown",
"text/html",
"text/csv",
"application/json",
"application/pdf",
],
maxBytes: 5242880,
maxChars: 200000,
maxRedirects: 3,
timeoutMs: 10000,
pdf: {
maxPages: 4,
maxPixels: 4000000,
minTextChars: 200,
},
},
images: {
allowUrl: true,
urlAllowlist: ["images.example.com"],
allowedMimes: [
"image/jpeg",
"image/png",
"image/gif",
"image/webp",
"image/heic",
"image/heif",
],
maxBytes: 10485760,
maxRedirects: 3,
timeoutMs: 10000,
},
},
},
},
},
}
Standardwerte wenn nicht angegeben:
maxBodyBytes: 20 MBmaxUrlParts: 8files.maxBytes: 5 MBfiles.maxChars: 200kfiles.maxRedirects: 3files.timeoutMs: 10 sfiles.pdf.maxPages: 4files.pdf.maxPixels: 4.000.000files.pdf.minTextChars: 200images.maxBytes: 10 MBimages.maxRedirects: 3images.timeoutMs: 10 s- HEIC/HEIF
input_image-Quellen werden akzeptiert und vor der Übergabe an den Anbieter zu JPEG normalisiert.
Sicherheitshinweis:
- URL-Allowlists werden vor dem Fetch und bei Redirect-Hops erzwungen.
- Eine Allowlist für einen Hostname umgeht nicht das Private/Internal-IP-Blocking.
- Für internetexponierte Gateways solltest du zusätzlich zu den App-Level-Schutzmaßnahmen Netzwerk-Egress-Kontrollen einsetzen. Siehe Sicherheit.
Streaming (SSE)
Setze stream: true, um Server-Sent Events (SSE) zu empfangen:
Content-Type: text/event-stream- Jede Event-Zeile ist
event: <type>unddata: <json> - Der Stream endet mit
data: [DONE]
Aktuell gesendete Event-Typen:
response.createdresponse.in_progressresponse.output_item.addedresponse.content_part.addedresponse.output_text.deltaresponse.output_text.doneresponse.content_part.doneresponse.output_item.doneresponse.completedresponse.failed(bei Fehler)
Usage
usage wird befüllt, wenn der zugrundeliegende Anbieter Token-Zähler meldet.
Fehler
Fehler verwenden ein JSON-Objekt wie:
{ "error": { "message": "...", "type": "invalid_request_error" } }
Häufige Fälle:
401fehlende/ungültige Authentifizierung400ungültiger Request-Body405falsche Methode
Beispiele
Ohne Streaming:
curl -sS http://127.0.0.1:18789/v1/responses \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-H 'x-openclaw-agent-id: main' \
-d '{
"model": "openclaw",
"input": "hi"
}'
Mit Streaming:
curl -N http://127.0.0.1:18789/v1/responses \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-H 'x-openclaw-agent-id: main' \
-d '{
"model": "openclaw",
"stream": true,
"input": "hi"
}'