OpenResponses API (HTTP)
Das Gateway von OpenClaw kann einen OpenResponses-kompatiblen POST /v1/responses Endpoint bereitstellen.
Dieser Endpoint 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 wie ein normaler Gateway-Agent-Lauf ausgeführt (gleicher Codepfad wie
openclaw agent), sodass Routing, Berechtigungen und Konfiguration mit deinem Gateway übereinstimmen.
Authentifizierung
Verwendet die Gateway-Auth-Konfiguration. Sende einen Bearer-Token:
Authorization: Bearer <token>
Hinweise:
- Bei
gateway.auth.mode="token"verwendest dugateway.auth.token(oderOPENCLAW_GATEWAY_TOKEN). - Bei
gateway.auth.mode="password"verwendest dugateway.auth.password(oderOPENCLAW_GATEWAY_PASSWORD).
Agent auswählen
Keine benutzerdefinierten Header nötig: Kodiere die Agent-ID im OpenResponses model-Feld:
model: "openclaw:<agentId>"(Beispiel:"openclaw:main","openclaw:beta")model: "agent:<agentId>"(Alias)
Oder wähle einen bestimmten OpenClaw-Agent per Header:
x-openclaw-agent-id: <agentId>(Standard:main)
Erweitert:
x-openclaw-session-key: <sessionKey>für volle Kontrolle über das Session-Routing.
Endpoint aktivieren
Setze gateway.http.endpoints.responses.enabled auf true:
{
gateway: {
http: {
endpoints: {
responses: { enabled: true },
},
},
},
}
Endpoint deaktivieren
Setze gateway.http.endpoints.responses.enabled auf false:
{
gateway: {
http: {
endpoints: {
responses: { enabled: false },
},
},
},
}
Session-Verhalten
Standardmäßig ist der Endpoint zustandslos pro Anfrage (bei jedem Aufruf wird ein neuer Session-Key generiert).
Wenn die Anfrage einen OpenResponses user-String enthält, leitet das Gateway daraus einen stabilen
Session-Key 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 eingefügt.tools: Client-Tool-Definitionen (Function Tools).tool_choice: Client-Tools filtern oder erzwingen.stream: Aktiviert SSE-Streaming.max_output_tokens: Best-Effort Output-Limit (Provider-abhä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-Historie einbezogen.
function_call_output (Turn-basierte Tools)
Sende Tool-Ergebnisse zurück an das Modell:
{
"type": "function_call_output",
"call_id": "call_123",
"output": "{\"temperature\": \"72F\"}"
}
reasoning und item_reference
Werden für Schema-Kompatibilität akzeptiert, aber beim Prompt-Aufbau ignoriert.
Tools (Client-seitige Function Tools)
Stelle Tools bereit mit tools: [{ type: "function", function: { name, description?, parameters? } }].
Wenn der Agent ein Tool aufrufen möchte, gibt die Antwort ein function_call Output-Item zurück.
Du sendest dann eine Folgeanfrage 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.
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:
- Dateiinhalte werden dekodiert und zum System-Prompt hinzugefügt, nicht zur User-Nachricht, sodass sie temporär bleiben (nicht in der Session-Historie gespeichert).
- PDFs werden nach Text geparst. Wenn wenig Text gefunden wird, werden die ersten Seiten als Bilder 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:true- Anfragen sind geschützt (DNS-Auflösung, Private-IP-Blocking, Redirect-Limits, Timeouts).
Datei- und Bild-Limits (Konfiguration)
Standardwerte können unter gateway.http.endpoints.responses angepasst werden:
{
gateway: {
http: {
endpoints: {
responses: {
enabled: true,
maxBodyBytes: 20000000,
files: {
allowUrl: true,
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,
allowedMimes: ["image/jpeg", "image/png", "image/gif", "image/webp"],
maxBytes: 10485760,
maxRedirects: 3,
timeoutMs: 10000,
},
},
},
},
},
}
Standardwerte wenn nicht angegeben:
maxBodyBytes: 20 MBfiles.maxBytes: 5 MBfiles.maxChars: 200kfiles.maxRedirects: 3files.timeoutMs: 10sfiles.pdf.maxPages: 4files.pdf.maxPixels: 4.000.000files.pdf.minTextChars: 200images.maxBytes: 10 MBimages.maxRedirects: 3images.timeoutMs: 10s
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 ausgegebene 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 Fehlern)
Usage
usage wird befüllt, wenn der zugrundeliegende Provider Token-Counts 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"
}'