Gateway
OpenResponses-API
Der Gateway kann einen OpenResponses-kompatiblen POST /v1/responses-Endpunkt bereitstellen. Er ist standardmäßig deaktiviert und nutzt denselben Port wie der Gateway (WS- und HTTP-Multiplexing): http://<gateway-host>:<port>/v1/responses.
Anfragen werden wie ein normaler Gateway-Agentenlauf ausgeführt (derselbe Codepfad wie openclaw agent), sodass Routing, Berechtigungen und Konfiguration mit Ihrem Gateway übereinstimmen.
Aktivieren oder deaktivieren Sie ihn mit gateway.http.endpoints.responses.enabled. Wenn er aktiviert ist, stellt dieselbe Kompatibilitätsschnittstelle auch GET /v1/models, GET /v1/models/{id}, POST /v1/embeddings und POST /v1/chat/completions bereit.
Authentifizierung, Sicherheit und Routing
Das Betriebsverhalten entspricht OpenAI Chat Completions:
- Der Authentifizierungspfad entspricht
gateway.auth.mode: Ein gemeinsames Geheimnis (token/password) verwendetAuthorization: Bearer <token-or-password>; Trusted-Proxy verwendet identitätsbezogene Proxy-Header (Loopback-Proxys auf demselben Host benötigengateway.auth.trustedProxy.allowLoopback = true, mit einem direkten Fallback auf demselben Host übergateway.auth.password/OPENCLAW_GATEWAY_PASSWORD, wenn keinForwarded-/X-Forwarded-*-/X-Real-IP-Header vorhanden ist);nonebenötigt bei privatem Ingress keinen Authentifizierungs-Header. Siehe Trusted-Proxy-Authentifizierung. - Behandeln Sie den Endpunkt als vollständigen Operatorzugriff auf die Gateway-Instanz.
- Authentifizierungsmodi mit gemeinsamem Geheimnis ignorieren einen enger gefassten, per Bearer deklarierten
x-openclaw-scopesund stellen den vollständigen standardmäßigen Operator-Berechtigungssatz wieder her:operator.admin,operator.approvals,operator.pairing,operator.read,operator.talk.secrets,operator.write. Chat-Nachrichten an diesem Endpunkt werden als vom Eigentümer gesendete Nachrichten behandelt. - Vertrauenswürdige identitätsbezogene HTTP-Modi (Trusted-Proxy oder
gateway.auth.mode="none") berücksichtigenx-openclaw-scopes, wenn es vorhanden ist, und greifen andernfalls auf den standardmäßigen Operator-Berechtigungssatz zurück. Die Eigentümersemantik geht nur verloren, wenn der Aufrufer die Berechtigungen ausdrücklich einschränkt undoperator.adminauslässt. - Wählen Sie Agenten mit
model: "openclaw","openclaw/default","openclaw/<agentId>"oder demx-openclaw-agent-id-Header aus. - Verwenden Sie
x-openclaw-model, um das Backend-Modell des ausgewählten Agenten zu überschreiben (erfordertoperator.adminbei identitätsbezogenen Authentifizierungspfaden). - Verwenden Sie
x-openclaw-session-keyfür explizites Sitzungs-Routing (wird mit400 invalid_request_errorabgelehnt, wenn ein reservierter Namensraum verwendet wird:subagent:,cron:,acp:). - Verwenden Sie
x-openclaw-message-channelfür einen vom Standard abweichenden synthetischen Ingress-Kanalkontext.
Die maßgebliche Erläuterung zu Agentenzielmodellen, openclaw/default, der unveränderten Weitergabe von Embeddings und Überschreibungen des Backend-Modells finden Sie unter OpenAI Chat Completions.
Siehe Operator-Berechtigungen und Sicherheit.
Sitzungsverhalten
Standardmäßig ist der Endpunkt pro Anfrage zustandslos (bei jedem Aufruf wird ein neuer Sitzungsschlüssel erzeugt).
Wenn die Anfrage eine OpenResponses-Zeichenfolge user enthält, leitet der Gateway daraus einen stabilen Sitzungsschlüssel ab, sodass wiederholte Aufrufe dieselbe Agentensitzung verwenden können.
previous_response_id verwendet die Sitzung der früheren Antwort erneut, wenn die Anfrage innerhalb desselben Agenten-/Benutzer-/angeforderten Sitzungsbereichs bleibt (Abgleich anhand des Authentifizierungssubjekts, der Agenten-ID und x-openclaw-session-key).
Anfrageformat
| Feld | Unterstützung |
|---|---|
input |
Zeichenfolge oder Array von Elementobjekten. |
instructions |
Wird mit dem System-Prompt zusammengeführt. |
tools |
Client-Werkzeugdefinitionen (Funktionswerkzeuge). |
tool_choice |
"auto", "none", "required" oder { "type": "function", "name": "..." }, um Client-Werkzeuge zu filtern oder vorzuschreiben. |
stream |
Aktiviert SSE-Streaming. |
max_output_tokens |
Bestmögliche Ausgabebegrenzung (abhängig vom Provider). |
temperature |
Bestmögliche Sampling-Temperatur. Wird vom ChatGPT-basierten Codex-Responses-Backend ignoriert, das festes serverseitiges Sampling verwendet. |
top_p |
Bestmögliches Nucleus-Sampling. Derselbe Vorbehalt für Codex Responses wie bei temperature. |
user |
Stabiles Sitzungs-Routing. |
previous_response_id |
Sitzungskontinuität (siehe oben). |
max_tool_calls, reasoning, metadata, store, truncation |
Werden akzeptiert, derzeit jedoch ignoriert. |
Elemente (Eingabe)
message
Rollen: system, developer, user, assistant.
systemunddeveloperwerden an den System-Prompt angehängt.- Das neueste Element
useroderfunction_call_outputwird zur „aktuellen Nachricht“. - Frühere Benutzer-/Assistentennachrichten werden als Verlauf für den Kontext einbezogen.
function_call_output (rundenbasierte Werkzeuge)
Senden Sie Werkzeugergebnisse an das Modell zurück:
{ "type": "function_call_output", "call_id": "call_123", "output": "{\"temperature\": \"72F\"}"}reasoning und item_reference
Werden aus Gründen der Schemakompatibilität akzeptiert, beim Erstellen des Prompts jedoch ignoriert.
Werkzeuge (clientseitige Funktionswerkzeuge)
Stellen Sie Werkzeuge mit tools: [{ type: "function", name, description?, parameters? }] bereit.
Wenn der Agent ein Werkzeug aufruft, gibt die Antwort ein function_call-Ausgabeelement zurück. Senden Sie eine Folgeanfrage mit function_call_output, um die Runde fortzusetzen.
Für tool_choice: "required" und ein funktionsgebundenes tool_choice schränkt der Endpunkt die bereitgestellte Menge clientseitiger Funktionswerkzeuge ein, weist die Laufzeit an, vor der Antwort ein Client-Werkzeug aufzurufen, und lehnt die Runde ab, wenn sie keinen passenden strukturierten Client-Werkzeugaufruf enthält, entsprechend dem /v1/chat/completions-Vertrag. Nicht gestreamte Anfragen geben 502 mit einem api_error zurück; gestreamte Anfragen geben ein response.failed-Ereignis aus.
Bilder (input_image)
Unterstützt Base64- oder URL-Quellen:
{ "type": "input_image", "source": { "type": "url", "url": "https://example.com/image.png" }}Zulässige MIME-Typen (Standard): image/jpeg, image/png, image/gif, image/webp, image/heic, image/heif. Maximale Größe (Standard): 10MB.
Dateien (input_file)
Unterstützt Base64- oder URL-Quellen:
{ "type": "input_file", "source": { "type": "base64", "media_type": "text/plain", "data": "SGVsbG8gV29ybGQh", "filename": "hello.txt" }}Zulässige MIME-Typen (Standard): text/plain, text/markdown, text/html, text/csv, application/json, application/pdf. Maximale Größe (Standard): 5MB.
Aktuelles Verhalten:
- Der Dateiinhalt wird dekodiert und dem System-Prompt hinzugefügt, nicht der Benutzernachricht, sodass er flüchtig bleibt (nicht im Sitzungsverlauf gespeichert wird).
- Der dekodierte Dateitext wird als nicht vertrauenswürdiger externer Inhalt eingeschlossen, bevor er hinzugefügt wird, sodass Dateibytes als Daten und nicht als vertrauenswürdige Anweisungen behandelt werden. Der eingefügte Block verwendet explizite Begrenzungsmarkierungen (
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>) und eineSource: External-Metadatenzeile. Das langeSECURITY NOTICE:-Banner wird absichtlich ausgelassen, um das Prompt-Budget zu schonen; die Begrenzungsmarkierungen und Metadaten gelten weiterhin. - PDFs werden zunächst auf Text analysiert. Wenn wenig Text gefunden wird, werden die ersten Seiten in Rasterbilder umgewandelt und an das Modell übergeben, und der eingefügte Dateiblock verwendet den Platzhalter
[PDF content rendered to images].
Die PDF-Analyse wird vom gebündelten document-extract-Plugin bereitgestellt, das clawpdf und seine paketierte PDFium-WebAssembly-Laufzeit für die Textextraktion und Seitendarstellung verwendet.
Standardwerte für URL-Abrufe:
files.allowUrl:trueimages.allowUrl:truemaxUrlParts:8(Gesamtzahl URL-basierterinput_file- undinput_image-Teile pro Anfrage)- Anfragen werden abgesichert (DNS-Auflösung, Blockierung privater IP-Adressen, Begrenzung von Weiterleitungen, Zeitüberschreitungen).
- Optionale Hostnamen-Zulassungslisten werden pro Eingabetyp unterstützt (
files.urlAllowlist,images.urlAllowlist): exakter Host ("cdn.example.com") oder Platzhalter-Subdomains ("*.assets.example.com", stimmt nicht mit der Stammdomain überein). Leere oder ausgelassene Zulassungslisten bedeuten, dass keine Einschränkung durch eine Hostnamen-Zulassungsliste gilt. - Um URL-basierte Abrufe vollständig zu deaktivieren, setzen Sie
files.allowUrl: falseund/oderimages.allowUrl: false.
Datei- und Bildbeschränkungen
Der Endpunkt verwendet eine integrierte Begrenzung des Anfragekörpers auf 20 MB. Die Richtlinie für Datei- und Bildquellen
bleibt unter gateway.http.endpoints.responses konfigurierbar:
{ gateway: { http: { endpoints: { responses: { enabled: true, 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: 60000, 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 bei Auslassung:
| Schlüssel | Standard |
|---|---|
maxUrlParts |
8 |
files.maxBytes |
5MB |
files.maxChars |
60k |
files.maxRedirects |
3 |
files.timeoutMs |
10s |
files.pdf.maxPages |
4 |
files.pdf.maxPixels |
4,000,000 |
files.pdf.minTextChars |
200 |
images.maxBytes |
10MB |
images.maxRedirects |
3 |
images.timeoutMs |
10s |
HEIC/HEIF-input_image-Quellen werden vor der Übermittlung an den Provider durch den gemeinsamen OpenClaw-Bildprozessor (Rastermill) in JPEG normalisiert. Dieser greift bei Formaten, die externe Codec-Unterstützung benötigen, auf einen Systemkonverter (sips, ImageMagick, GraphicsMagick oder ffmpeg) zurück.
Sicherheitshinweis: URL-Zulassungslisten werden vor dem Abruf und bei Weiterleitungen durchgesetzt. Die Aufnahme eines Hostnamens in die Zulassungsliste umgeht nicht die Sperrung privater/interner IP-Adressen. Wenden Sie bei Gateways mit Internetzugriff zusätzlich zu Schutzmaßnahmen auf Anwendungsebene Kontrollen für ausgehenden Netzwerkverkehr an. Siehe Sicherheit.
Streaming (SSE)
Setzen Sie stream: true, um Server-Sent Events zu empfangen:
Content-Type: text/event-stream- Jede Ereigniszeile ist
event: <type>unddata: <json> - Der Stream endet mit
data: [DONE]
Derzeit ausgegebene Ereignistypen: response.created, response.in_progress, response.output_item.added, response.content_part.added, response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.done, response.completed, response.failed (bei einem Fehler).
Nutzung
usage wird ausgefüllt, wenn der zugrunde liegende Provider Token-Anzahlen meldet. OpenClaw normalisiert gängige Aliasse im OpenAI-Stil, bevor diese Zähler nachgelagerte Status-/Sitzungsoberflächen erreichen, darunter input_tokens / output_tokens und prompt_tokens / completion_tokens.
Fehler
Fehler verwenden ein JSON-Objekt wie dieses:
{ "error": { "message": "...", "type": "invalid_request_error" } }Häufige Fälle: 400 ungültiger Anfragetext, 401 fehlende/ungültige Authentifizierung, 403 fehlender Operator-Berechtigungsumfang, 405 falsche Methode, 429 zu viele fehlgeschlagene Authentifizierungsversuche (mit Retry-After).
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" }'