Gateway
API OpenResponses
Le Gateway d’OpenClaw peut servir un endpoint POST /v1/responses compatible avec OpenResponses.
Cet endpoint est désactivé par défaut. Activez-le d’abord dans la configuration.
POST /v1/responses- Même port que le Gateway (multiplexage WS + HTTP) :
http://<gateway-host>:<port>/v1/responses
En interne, les requêtes sont exécutées comme une exécution d’agent Gateway normale (même chemin de code que
openclaw agent), donc le routage, les autorisations et la configuration correspondent à votre Gateway.
Authentification, sécurité et routage
Le comportement opérationnel correspond à OpenAI Chat Completions :
- utilisez le chemin d’authentification HTTP Gateway correspondant :
- authentification par secret partagé (
gateway.auth.mode="token"ou"password") :Authorization: Bearer <token-or-password> - authentification par proxy de confiance (
gateway.auth.mode="trusted-proxy") : en-têtes de proxy tenant compte de l’identité provenant d’une source de proxy de confiance configurée ; les proxys loopback sur le même hôte nécessitent explicitementgateway.auth.trustedProxy.allowLoopback = true - authentification ouverte pour ingress privé (
gateway.auth.mode="none") : aucun en-tête d’authentification
- authentification par secret partagé (
- traitez l’endpoint comme un accès opérateur complet pour l’instance de gateway
- pour les modes d’authentification par secret partagé (
tokenetpassword), ignorez les valeursx-openclaw-scopesplus restreintes déclarées par bearer et restaurez les valeurs par défaut normales d’opérateur complet - pour les modes HTTP avec identité de confiance (par exemple l’authentification par proxy de confiance ou
gateway.auth.mode="none"), respectezx-openclaw-scopeslorsqu’il est présent, sinon revenez à l’ensemble de portées par défaut normal de l’opérateur - sélectionnez les agents avec
model: "openclaw",model: "openclaw/default",model: "openclaw/<agentId>"oux-openclaw-agent-id - utilisez
x-openclaw-modellorsque vous voulez remplacer le modèle backend de l’agent sélectionné - utilisez
x-openclaw-session-keypour un routage explicite de session - utilisez
x-openclaw-message-channellorsque vous voulez un contexte de canal d’ingress synthétique autre que celui par défaut
Matrice d’authentification :
gateway.auth.mode="token"ou"password"+Authorization: Bearer ...- prouve la possession du secret opérateur gateway partagé
- ignore
x-openclaw-scopesplus restreint - restaure l’ensemble complet de portées opérateur par défaut :
operator.admin,operator.approvals,operator.pairing,operator.read,operator.talk.secrets,operator.write - traite les tours de chat sur cet endpoint comme des tours envoyés par le propriétaire
- modes HTTP avec identité de confiance (par exemple l’authentification par proxy de confiance, ou
gateway.auth.mode="none"sur un ingress privé)- respectent
x-openclaw-scopeslorsque l’en-tête est présent - reviennent à l’ensemble de portées par défaut normal de l’opérateur lorsque l’en-tête est absent
- ne perdent la sémantique de propriétaire que lorsque l’appelant restreint explicitement les portées et omet
operator.admin
- respectent
Activez ou désactivez cet endpoint avec gateway.http.endpoints.responses.enabled.
La même surface de compatibilité inclut également :
GET /v1/modelsGET /v1/models/{id}POST /v1/embeddingsPOST /v1/chat/completions
Pour l’explication canonique de la façon dont les modèles ciblant un agent, openclaw/default, la transmission des embeddings et les remplacements de modèle backend s’articulent, consultez OpenAI Chat Completions et Liste des modèles et routage des agents.
Comportement de session
Par défaut, l’endpoint est sans état par requête (une nouvelle clé de session est générée à chaque appel).
Si la requête inclut une chaîne OpenResponses user, le Gateway en dérive une clé de session stable,
afin que les appels répétés puissent partager une session d’agent.
Forme de requête (prise en charge)
La requête suit l’API OpenResponses avec une entrée basée sur des éléments. Prise en charge actuelle :
input: chaîne ou tableau d’objets élément.instructions: fusionnées dans l’invite système.tools: définitions d’outils client (outils de fonction).tool_choice: filtre ou exige des outils client.stream: active le streaming SSE.max_output_tokens: limite de sortie au mieux (dépend du fournisseur).user: routage de session stable.
Accepté mais actuellement ignoré :
max_tool_callsreasoningmetadatastoretruncation
Pris en charge :
previous_response_id: OpenClaw réutilise la session de réponse précédente lorsque la requête reste dans la même portée agent/utilisateur/session demandée.
Éléments (entrée)
message
Rôles : system, developer, user, assistant.
systemetdevelopersont ajoutés à l’invite système.- L’élément
useroufunction_call_outputle plus récent devient le « message actuel ». - Les messages utilisateur/assistant antérieurs sont inclus comme historique pour le contexte.
function_call_output (outils par tour)
Renvoyez les résultats d’outil au modèle :
{
"type": "function_call_output",
"call_id": "call_123",
"output": "{\"temperature\": \"72F\"}"
}
reasoning et item_reference
Acceptés pour la compatibilité du schéma, mais ignorés lors de la construction de l’invite.
Outils (outils de fonction côté client)
Fournissez des outils avec tools: [{ type: "function", function: { name, description?, parameters? } }].
Si l’agent décide d’appeler un outil, la réponse renvoie un élément de sortie function_call.
Vous envoyez ensuite une requête de suivi avec function_call_output pour continuer le tour.
Images (input_image)
Prend en charge les sources base64 ou URL :
{
"type": "input_image",
"source": { "type": "url", "url": "https://example.com/image.png" }
}
Types MIME autorisés (actuels) : image/jpeg, image/png, image/gif, image/webp, image/heic, image/heif.
Taille maximale (actuelle) : 10 Mo.
Fichiers (input_file)
Prend en charge les sources base64 ou URL :
{
"type": "input_file",
"source": {
"type": "base64",
"media_type": "text/plain",
"data": "SGVsbG8gV29ybGQh",
"filename": "hello.txt"
}
}
Types MIME autorisés (actuels) : text/plain, text/markdown, text/html, text/csv,
application/json, application/pdf.
Taille maximale (actuelle) : 5 Mo.
Comportement actuel :
- Le contenu du fichier est décodé et ajouté à l’invite système, pas au message utilisateur, afin qu’il reste éphémère (non conservé dans l’historique de session).
- Le texte de fichier décodé est enveloppé comme contenu externe non fiable avant d’être ajouté, afin que les octets du fichier soient traités comme des données, et non comme des instructions fiables.
- Le bloc injecté utilise des marqueurs de limite explicites comme
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>et inclut une ligne de métadonnéesSource: External. - Ce chemin d’entrée de fichier omet intentionnellement la longue bannière
SECURITY NOTICE:afin de préserver le budget d’invite ; les marqueurs de limite et les métadonnées restent toutefois en place. - Les PDF sont d’abord analysés pour en extraire le texte. Si peu de texte est trouvé, les premières pages sont
rasterisées en images et transmises au modèle, et le bloc de fichier injecté utilise
l’espace réservé
[PDF content rendered to images].
L’analyse des PDF est fournie par le Plugin document-extract intégré, qui utilise la build héritée
compatible Node de pdfjs-dist (sans worker). La build PDF.js moderne
attend des workers de navigateur et des globales DOM ; elle n’est donc pas utilisée dans le Gateway.
Valeurs par défaut de récupération d’URL :
files.allowUrl:trueimages.allowUrl:truemaxUrlParts:8(nombre total de partiesinput_file+input_imagebasées sur URL par requête)- Les requêtes sont protégées (résolution DNS, blocage des IP privées, plafonds de redirection, délais d’expiration).
- Les listes d’autorisation de noms d’hôte facultatives sont prises en charge par type d’entrée (
files.urlAllowlist,images.urlAllowlist).- Hôte exact :
"cdn.example.com" - Sous-domaines génériques :
"*.assets.example.com"(ne correspond pas à l’apex) - Les listes d’autorisation vides ou omises signifient qu’il n’y a aucune restriction par liste d’autorisation de nom d’hôte.
- Hôte exact :
- Pour désactiver entièrement les récupérations basées sur URL, définissez
files.allowUrl: falseet/ouimages.allowUrl: false.
Limites des fichiers et images (configuration)
Les valeurs par défaut peuvent être ajustées sous gateway.http.endpoints.responses :
{
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,
},
},
},
},
},
}
Valeurs par défaut en cas d’omission :
maxBodyBytes: 20 MomaxUrlParts: 8files.maxBytes: 5 Mofiles.maxChars: 200 kfiles.maxRedirects: 3files.timeoutMs: 10 sfiles.pdf.maxPages: 4files.pdf.maxPixels: 4 000 000files.pdf.minTextChars: 200images.maxBytes: 10 Moimages.maxRedirects: 3images.timeoutMs: 10 s- Les sources HEIC/HEIF
input_imagesont acceptées et normalisées en JPEG avant la livraison au fournisseur.
Note de sécurité :
- Les listes d’autorisation d’URL sont appliquées avant la récupération et lors des sauts de redirection.
- Autoriser un nom d’hôte ne contourne pas le blocage des IP privées/internes.
- Pour les gateways exposés à Internet, appliquez des contrôles de sortie réseau en plus des protections au niveau de l’application. Voir Sécurité.
Streaming (SSE)
Définissez stream: true pour recevoir des Server-Sent Events (SSE) :
Content-Type: text/event-stream- Chaque ligne d’événement est
event: <type>etdata: <json> - Le flux se termine par
data: [DONE]
Types d’événements actuellement émis :
response.createdresponse.in_progressresponse.output_item.addedresponse.content_part.addedresponse.output_text.deltaresponse.output_text.doneresponse.content_part.doneresponse.output_item.doneresponse.completedresponse.failed(en cas d’erreur)
Utilisation
usage est renseigné lorsque le fournisseur sous-jacent rapporte le nombre de tokens.
OpenClaw normalise les alias courants de style OpenAI avant que ces compteurs n’atteignent
les surfaces de statut/session en aval, y compris input_tokens / output_tokens
et prompt_tokens / completion_tokens.
Erreurs
Les erreurs utilisent un objet JSON comme :
{ "error": { "message": "...", "type": "invalid_request_error" } }
Cas courants :
401authentification manquante/invalide400corps de requête invalide405mauvaise méthode
Exemples
Sans 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"
}'
Avec 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"
}'