Gateway
API OpenResponses
OpenClaw's Gateway dapat menyajikan endpoint POST /v1/responses yang kompatibel dengan OpenResponses.
Endpoint ini dinonaktifkan secara default. Aktifkan terlebih dahulu di konfigurasi.
POST /v1/responses- Port yang sama dengan Gateway (multipleks WS + HTTP):
http://<gateway-host>:<port>/v1/responses
Di balik layar, permintaan dieksekusi sebagai run agen Gateway normal (codepath yang sama dengan
openclaw agent), sehingga routing/izin/konfigurasi cocok dengan Gateway Anda.
Autentikasi, keamanan, dan routing
Perilaku operasional cocok dengan OpenAI Chat Completions:
- gunakan jalur autentikasi HTTP Gateway yang sesuai:
- autentikasi rahasia bersama (
gateway.auth.mode="token"atau"password"):Authorization: Bearer <token-or-password> - autentikasi trusted-proxy (
gateway.auth.mode="trusted-proxy"): header proxy sadar-identitas dari sumber proxy tepercaya yang dikonfigurasi; proxy loopback host yang sama memerlukangateway.auth.trustedProxy.allowLoopback = trueeksplisit - fallback langsung lokal trusted-proxy: pemanggil host yang sama tanpa header
Forwarded,X-Forwarded-*, atauX-Real-IPdapat menggunakangateway.auth.password/OPENCLAW_GATEWAY_PASSWORD - autentikasi terbuka private-ingress (
gateway.auth.mode="none"): tanpa header autentikasi
- autentikasi rahasia bersama (
- perlakukan endpoint sebagai akses operator penuh untuk instans gateway
- untuk mode autentikasi rahasia bersama (
tokendanpassword), abaikan nilaix-openclaw-scopesyang lebih sempit yang dideklarasikan bearer dan pulihkan default operator penuh yang normal - untuk mode HTTP yang membawa identitas tepercaya (misalnya autentikasi trusted proxy atau
gateway.auth.mode="none"), hormatix-openclaw-scopessaat ada dan jika tidak gunakan set cakupan default operator normal sebagai fallback - pilih agen dengan
model: "openclaw",model: "openclaw/default",model: "openclaw/<agentId>", ataux-openclaw-agent-id - gunakan
x-openclaw-modelsaat Anda ingin menimpa model backend agen yang dipilih - gunakan
x-openclaw-session-keyuntuk routing sesi eksplisit - gunakan
x-openclaw-message-channelsaat Anda menginginkan konteks channel ingress sintetis non-default
Matriks autentikasi:
gateway.auth.mode="token"atau"password"+Authorization: Bearer ...- membuktikan kepemilikan rahasia operator gateway bersama
- mengabaikan
x-openclaw-scopesyang lebih sempit - memulihkan set cakupan operator default penuh:
operator.admin,operator.approvals,operator.pairing,operator.read,operator.talk.secrets,operator.write - memperlakukan giliran chat pada endpoint ini sebagai giliran owner-sender
- mode HTTP yang membawa identitas tepercaya (misalnya autentikasi trusted proxy, atau
gateway.auth.mode="none"pada private ingress)- menghormati
x-openclaw-scopessaat header ada - menggunakan set cakupan default operator normal sebagai fallback saat header tidak ada
- hanya kehilangan semantik owner saat pemanggil secara eksplisit mempersempit cakupan dan menghilangkan
operator.admin
- menghormati
Aktifkan atau nonaktifkan endpoint ini dengan gateway.http.endpoints.responses.enabled.
Permukaan kompatibilitas yang sama juga mencakup:
GET /v1/modelsGET /v1/models/{id}POST /v1/embeddingsPOST /v1/chat/completions
Untuk penjelasan kanonis tentang bagaimana model target agen, openclaw/default, pass-through embeddings, dan override model backend saling cocok, lihat OpenAI Chat Completions dan Daftar model dan routing agen.
Perilaku sesi
Secara default endpoint ini stateless per permintaan (kunci sesi baru dibuat setiap panggilan).
Jika permintaan menyertakan string user OpenResponses, Gateway memperoleh kunci sesi stabil
darinya, sehingga panggilan berulang dapat berbagi sesi agen.
Bentuk permintaan (didukung)
Permintaan mengikuti API OpenResponses dengan input berbasis item. Dukungan saat ini:
input: string atau array objek item.instructions: digabungkan ke prompt sistem.tools: definisi tool klien (tool fungsi).tool_choice:"auto","none","required", atau{ "type": "function", "name": "..." }untuk memfilter atau mewajibkan tool klien.stream: mengaktifkan streaming SSE.max_output_tokens: batas output upaya terbaik (bergantung pada provider).temperature: temperatur sampling upaya terbaik yang diteruskan ke provider. Diabaikan oleh backend Codex Responses berbasis ChatGPT, yang menggunakan sampling sisi server tetap.top_p: sampling nukleus upaya terbaik yang diteruskan ke provider. Catatan Codex Responses yang sama sepertitemperature.user: routing sesi stabil.
Diterima tetapi saat ini diabaikan:
max_tool_callsreasoningmetadatastoretruncation
Didukung:
previous_response_id: OpenClaw menggunakan kembali sesi respons sebelumnya saat permintaan tetap berada dalam cakupan agen/pengguna/sesi yang diminta yang sama.
Item (input)
message
Peran: system, developer, user, assistant.
systemdandeveloperditambahkan ke prompt sistem.- Item
userataufunction_call_outputterbaru menjadi "pesan saat ini." - Pesan user/assistant sebelumnya disertakan sebagai riwayat untuk konteks.
function_call_output (tool berbasis giliran)
Kirim hasil tool kembali ke model:
{ "type": "function_call_output", "call_id": "call_123", "output": "{\"temperature\": \"72F\"}"}reasoning dan item_reference
Diterima untuk kompatibilitas skema tetapi diabaikan saat membangun prompt.
Tool (tool fungsi sisi klien)
Sediakan tool dengan tools: [{ type: "function", name, description?, parameters? }].
Jika agen memutuskan untuk memanggil tool, respons mengembalikan item output function_call.
Anda kemudian mengirim permintaan lanjutan dengan function_call_output untuk melanjutkan giliran.
Untuk tool_choice: "required" dan tool_choice yang dipatok ke fungsi, endpoint mempersempit set tool fungsi klien yang diekspos, menginstruksikan runtime untuk memanggil tool klien sebelum merespons, dan menolak giliran jika tidak menyertakan panggilan tool klien terstruktur yang cocok. Kontrak ini berlaku untuk daftar HTTP tools yang disediakan pemanggil, bukan setiap tool agen OpenClaw internal. Permintaan non-streaming mengembalikan 502 dengan api_error; permintaan streaming memancarkan event response.failed. Ini cocok dengan kontrak /v1/chat/completions.
Gambar (input_image)
Mendukung sumber base64 atau URL:
{ "type": "input_image", "source": { "type": "url", "url": "https://example.com/image.png" }}Jenis MIME yang diizinkan (saat ini): image/jpeg, image/png, image/gif, image/webp, image/heic, image/heif.
Ukuran maksimum (saat ini): 10MB.
File (input_file)
Mendukung sumber base64 atau URL:
{ "type": "input_file", "source": { "type": "base64", "media_type": "text/plain", "data": "SGVsbG8gV29ybGQh", "filename": "hello.txt" }}Jenis MIME yang diizinkan (saat ini): text/plain, text/markdown, text/html, text/csv,
application/json, application/pdf.
Ukuran maksimum (saat ini): 5MB.
Perilaku saat ini:
- Konten file didekode dan ditambahkan ke prompt sistem, bukan pesan pengguna, sehingga tetap sementara (tidak dipertahankan dalam riwayat sesi).
- Teks file yang didekode dibungkus sebagai konten eksternal tidak tepercaya sebelum ditambahkan, sehingga byte file diperlakukan sebagai data, bukan instruksi tepercaya.
- Blok yang disisipkan menggunakan penanda batas eksplisit seperti
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>dan menyertakan baris metadataSource: External. - Jalur input file ini sengaja menghilangkan banner panjang
SECURITY NOTICE:untuk mempertahankan anggaran prompt; penanda batas dan metadata tetap dipertahankan. - PDF diuraikan untuk teks terlebih dahulu. Jika hanya sedikit teks ditemukan, halaman pertama
dirasterisasi menjadi gambar dan diteruskan ke model, dan blok file yang disisipkan menggunakan
placeholder
[PDF content rendered to images].
Penguraian PDF disediakan oleh Plugin bawaan document-extract, yang menggunakan
clawpdf dan runtime WebAssembly PDFium terpaketnya untuk ekstraksi teks dan
rendering halaman.
Default pengambilan URL:
files.allowUrl:trueimages.allowUrl:truemaxUrlParts:8(total bagianinput_file+input_imageberbasis URL per permintaan)- Permintaan dijaga (resolusi DNS, pemblokiran IP pribadi, batas redirect, timeout).
- Allowlist hostname opsional didukung per jenis input (
files.urlAllowlist,images.urlAllowlist).- Host persis:
"cdn.example.com" - Subdomain wildcard:
"*.assets.example.com"(tidak cocok dengan apex) - Allowlist yang kosong atau dihilangkan berarti tidak ada pembatasan allowlist hostname.
- Host persis:
- Untuk menonaktifkan pengambilan berbasis URL sepenuhnya, setel
files.allowUrl: falsedan/atauimages.allowUrl: false.
Batas file + gambar (konfigurasi)
Default dapat disetel di bawah 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, }, }, }, }, },}Default saat dihilangkan:
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- Sumber
input_imageHEIC/HEIF diterima saat konverter sistem tersedia dan dinormalisasi ke JPEG sebelum pengiriman provider. Konverter yang didukung adalahsipsmacOS, ImageMagick, GraphicsMagick, atau ffmpeg.
Catatan keamanan:
- Allowlist URL diberlakukan sebelum pengambilan dan pada hop redirect.
- Mengizinkan hostname dalam allowlist tidak melewati pemblokiran IP pribadi/internal.
- Untuk gateway yang terekspos internet, terapkan kontrol egress jaringan selain guard tingkat aplikasi. Lihat Keamanan.
Streaming (SSE)
Setel stream: true untuk menerima Server-Sent Events (SSE):
Content-Type: text/event-stream- Setiap baris event adalah
event: <type>dandata: <json> - Stream berakhir dengan
data: [DONE]
Jenis event yang saat ini dipancarkan:
response.createdresponse.in_progressresponse.output_item.addedresponse.content_part.addedresponse.output_text.deltaresponse.output_text.doneresponse.content_part.doneresponse.output_item.doneresponse.completedresponse.failed(saat error)
Penggunaan
usage diisi saat provider yang mendasarinya melaporkan jumlah token.
OpenClaw menormalisasi alias umum bergaya OpenAI sebelum penghitung tersebut mencapai
permukaan status/sesi downstream, termasuk input_tokens / output_tokens
dan prompt_tokens / completion_tokens.
Error
Error menggunakan objek JSON seperti:
{ "error": { "message": "...", "type": "invalid_request_error" } }Kasus umum:
401autentikasi hilang/tidak valid400isi permintaan tidak valid405metode salah
Contoh
Non-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" }'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" }'