Gateway
OpenResponses API
Gateway OpenClaw може надавати OpenResponses-сумісний endpoint POST /v1/responses.
Цей endpoint вимкнено за замовчуванням. Спочатку увімкніть його в конфігурації.
POST /v1/responses- Той самий порт, що й Gateway (мультиплекс WS + HTTP):
http://<gateway-host>:<port>/v1/responses
Під капотом запити виконуються як звичайний запуск агента Gateway (той самий шлях коду, що й
openclaw agent), тому маршрутизація/дозволи/конфігурація відповідають вашому Gateway.
Автентифікація, безпека та маршрутизація
Операційна поведінка відповідає OpenAI Chat Completions:
- використовуйте відповідний шлях HTTP-автентифікації Gateway:
- автентифікація зі спільним секретом (
gateway.auth.mode="token"або"password"):Authorization: Bearer <token-or-password> - автентифікація через довірений проксі (
gateway.auth.mode="trusted-proxy"): заголовки проксі з урахуванням ідентичності з налаштованого довіреного джерела проксі; проксі same-host loopback вимагають явногоgateway.auth.trustedProxy.allowLoopback = true - локальний прямий резервний варіант довіреного проксі: виклики same-host без заголовків
Forwarded,X-Forwarded-*абоX-Real-IPможуть використовуватиgateway.auth.password/OPENCLAW_GATEWAY_PASSWORD - відкрита автентифікація private-ingress (
gateway.auth.mode="none"): без заголовка автентифікації
- автентифікація зі спільним секретом (
- розглядайте endpoint як повний операторський доступ до екземпляра gateway
- для режимів автентифікації зі спільним секретом (
tokenіpassword) ігноруйте вужчі значенняx-openclaw-scopes, оголошені bearer, і відновлюйте звичайні повні операторські значення за замовчуванням - для довірених HTTP-режимів із передаванням ідентичності (наприклад, автентифікація через довірений проксі або
gateway.auth.mode="none") враховуйтеx-openclaw-scopes, коли він присутній, інакше повертайтеся до звичайного стандартного набору операторських scope - вибирайте агентів за допомогою
model: "openclaw",model: "openclaw/default",model: "openclaw/<agentId>"абоx-openclaw-agent-id - використовуйте
x-openclaw-model, коли потрібно перевизначити backend model вибраного агента - використовуйте
x-openclaw-session-keyдля явної маршрутизації сесії - використовуйте
x-openclaw-message-channel, коли потрібен нестандартний синтетичний контекст ingress-каналу
Матриця автентифікації:
gateway.auth.mode="token"або"password"+Authorization: Bearer ...- доводить володіння спільним операторським секретом gateway
- ігнорує вужчий
x-openclaw-scopes - відновлює повний стандартний операторський набір scope:
operator.admin,operator.approvals,operator.pairing,operator.read,operator.talk.secrets,operator.write - розглядає ходи чату на цьому endpoint як ходи owner-sender
- довірені HTTP-режими з передаванням ідентичності (наприклад, автентифікація через довірений проксі або
gateway.auth.mode="none"на private ingress)- враховують
x-openclaw-scopes, коли заголовок присутній - повертаються до звичайного стандартного операторського набору scope, коли заголовок відсутній
- втрачають семантику owner лише тоді, коли викликач явно звужує scope і не вказує
operator.admin
- враховують
Увімкніть або вимкніть цей endpoint за допомогою gateway.http.endpoints.responses.enabled.
Та сама поверхня сумісності також охоплює:
GET /v1/modelsGET /v1/models/{id}POST /v1/embeddingsPOST /v1/chat/completions
Канонічне пояснення того, як поєднуються моделі, націлені на агентів, openclaw/default, наскрізне передавання embeddings і перевизначення backend model, див. у OpenAI Chat Completions і Список моделей і маршрутизація агентів.
Поведінка сесії
За замовчуванням endpoint є безстанним для кожного запиту (новий ключ сесії генерується під час кожного виклику).
Якщо запит містить рядок OpenResponses user, Gateway виводить із нього стабільний ключ сесії,
тому повторні виклики можуть спільно використовувати сесію агента.
Форма запиту (підтримується)
Запит відповідає API OpenResponses із введенням на основі елементів. Поточна підтримка:
input: рядок або масив об'єктів елементів.instructions: об'єднується із системним prompt.tools: визначення клієнтських інструментів (function tools).tool_choice:"auto","none","required"або{ "type": "function", "name": "..." }для фільтрування або вимагання клієнтських інструментів.stream: вмикає SSE-стримінг.max_output_tokens: output limit за принципом best-effort (залежить від provider).temperature: sampling temperature за принципом best-effort, що передається provider. Ігнорується backend ChatGPT-based Codex Responses, який використовує фіксований серверний sampling.top_p: nucleus sampling за принципом best-effort, що передається provider. Те саме застереження Codex Responses, що й дляtemperature.user: стабільна маршрутизація сесії.
Приймаються, але наразі ігноруються:
max_tool_callsreasoningmetadatastoretruncation
Підтримується:
previous_response_id: OpenClaw повторно використовує попередню сесію відповіді, коли запит залишається в межах того самого scope агента/користувача/запитаної сесії.
Елементи (input)
message
Ролі: system, developer, user, assistant.
systemіdeveloperдодаються до системного prompt.- Найновіший елемент
userабоfunction_call_outputстає "поточним повідомленням". - Попередні повідомлення user/assistant включаються як історія для контексту.
function_call_output (інструменти на основі ходу)
Надсилайте результати інструмента назад до моделі:
{ "type": "function_call_output", "call_id": "call_123", "output": "{\"temperature\": \"72F\"}"}reasoning і item_reference
Приймаються для сумісності схеми, але ігноруються під час побудови prompt.
Інструменти (клієнтські function tools)
Надавайте інструменти через tools: [{ type: "function", name, description?, parameters? }].
Якщо агент вирішить викликати інструмент, відповідь поверне вихідний елемент function_call.
Потім ви надсилаєте follow-up request із function_call_output, щоб продовжити хід.
Для tool_choice: "required" і function-pinned tool_choice endpoint звужує відкритий набір клієнтських function-tool, інструктує runtime викликати клієнтський інструмент перед відповіддю та відхиляє хід, якщо він не містить відповідного структурованого виклику клієнтського інструмента. Цей контракт застосовується до HTTP-списку tools, наданого викликачем, а не до кожного внутрішнього інструмента агента OpenClaw. Нестрімінгові запити повертають 502 з api_error; стрімінгові запити випускають подію response.failed. Це відповідає контракту /v1/chat/completions.
Зображення (input_image)
Підтримує джерела base64 або URL:
{ "type": "input_image", "source": { "type": "url", "url": "https://example.com/image.png" }}Дозволені MIME-типи (поточні): image/jpeg, image/png, image/gif, image/webp, image/heic, image/heif.
Максимальний розмір (поточний): 10MB.
Файли (input_file)
Підтримує джерела base64 або URL:
{ "type": "input_file", "source": { "type": "base64", "media_type": "text/plain", "data": "SGVsbG8gV29ybGQh", "filename": "hello.txt" }}Дозволені MIME-типи (поточні): text/plain, text/markdown, text/html, text/csv,
application/json, application/pdf.
Максимальний розмір (поточний): 5MB.
Поточна поведінка:
- Вміст файлу декодується й додається до системного prompt, а не до повідомлення користувача, тому він залишається ephemeral (не зберігається в історії сесії).
- Декодований текст файлу обгортається як недовірений зовнішній вміст перед додаванням, тому байти файлу розглядаються як дані, а не як довірені інструкції.
- Вставлений блок використовує явні boundary markers, як-от
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>, і містить рядок метаданихSource: External. - Цей шлях file-input навмисно пропускає довгий банер
SECURITY NOTICE:, щоб зберегти бюджет prompt; boundary markers і метадані все одно залишаються на місці. - PDF спочатку аналізуються для витягування тексту. Якщо знайдено мало тексту, перші сторінки
растеризуються в зображення й передаються моделі, а вставлений файловий блок використовує
placeholder
[PDF content rendered to images].
Парсинг PDF забезпечує bundled Plugin document-extract, який використовує
clawpdf і його packaged PDFium WebAssembly runtime для витягування тексту та
рендерингу сторінок.
Стандартні параметри отримання URL:
files.allowUrl:trueimages.allowUrl:truemaxUrlParts:8(загальна кількість URL-based частинinput_file+input_imageна запит)- Запити захищаються (DNS-розв'язання, блокування приватних IP, обмеження перенаправлень, тайм-аути).
- Підтримуються необов'язкові allowlist імен хостів для кожного типу введення (
files.urlAllowlist,images.urlAllowlist).- Точний хост:
"cdn.example.com" - Wildcard-піддомени:
"*.assets.example.com"(не збігається з apex) - Порожні або пропущені allowlist означають відсутність обмеження allowlist імен хостів.
- Точний хост:
- Щоб повністю вимкнути URL-based отримання, установіть
files.allowUrl: falseта/абоimages.allowUrl: false.
Обмеження файлів і зображень (конфігурація)
Стандартні значення можна налаштувати в 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, }, }, }, }, },}Стандартні значення, якщо пропущено:
maxBodyBytes: 20MBmaxUrlParts: 8files.maxBytes: 5MBfiles.maxChars: 200kfiles.maxRedirects: 3files.timeoutMs: 10sfiles.pdf.maxPages: 4files.pdf.maxPixels: 4,000,000files.pdf.minTextChars: 200images.maxBytes: 10MBimages.maxRedirects: 3images.timeoutMs: 10s- Джерела HEIC/HEIF
input_imageприймаються, коли доступний системний converter, і нормалізуються до JPEG перед доставкою provider. Підтримувані converters: macOSsips, ImageMagick, GraphicsMagick або ffmpeg.
Примітка щодо безпеки:
- URL allowlists застосовуються перед fetch і на переходах перенаправлення.
- Додавання імені хоста до allowlist не обходить блокування приватних/внутрішніх IP.
- Для gateway, відкритих в інтернет, застосовуйте мережеві засоби контролю вихідного трафіку на додаток до захистів рівня застосунку. Див. Безпека.
Стримінг (SSE)
Установіть stream: true, щоб отримувати Server-Sent Events (SSE):
Content-Type: text/event-stream- Кожен рядок події має формат
event: <type>іdata: <json> - Потік завершується
data: [DONE]
Типи подій, які наразі випускаються:
response.createdresponse.in_progressresponse.output_item.addedresponse.content_part.addedresponse.output_text.deltaresponse.output_text.doneresponse.content_part.doneresponse.output_item.doneresponse.completedresponse.failed(у разі помилки)
Використання
usage заповнюється, коли underlying provider повідомляє кількість токенів.
OpenClaw нормалізує поширені alias у стилі OpenAI до того, як ці лічильники потрапляють
до downstream status/session surfaces, зокрема input_tokens / output_tokens
і prompt_tokens / completion_tokens.
Помилки
Помилки використовують JSON-об'єкт на кшталт:
{ "error": { "message": "...", "type": "invalid_request_error" } }Поширені випадки:
401відсутня/недійсна автентифікація400недійсне тіло запиту405неправильний метод
Приклади
Без стримінгу:
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" }'Стримінг:
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" }'