OpenResponses API (HTTP)
OpenClaw の Gateway は、OpenResponses 互換の POST /v1/responses エンドポイントを提供できます。
このエンドポイントはデフォルトで無効です。まず設定で有効化してください。
POST /v1/responses- Gateway と同じポート(WS + HTTP マルチプレクス):
http://<gateway-host>:<port>/v1/responses
内部的には通常の Gateway エージェント実行(openclaw agent と同じコードパス)として処理されるため、ルーティング/権限/設定は Gateway の設定に従います。
認証、セキュリティ、ルーティング
動作は OpenAI Chat Completions と同じです:
- 通常の Gateway 認証設定で
Authorization: Bearer <token>を使用 - このエンドポイントは Gateway インスタンスに対するフルオペレーターアクセスとして扱うこと
model: "openclaw:<agentId>"、model: "agent:<agentId>"、またはx-openclaw-agent-idでエージェントを選択x-openclaw-session-keyで明示的なセッションルーティングを指定
このエンドポイントの有効/無効は gateway.http.endpoints.responses.enabled で切り替えます。
セッションの動作
デフォルトではリクエストごとにステートレスです(呼び出しごとに新しいセッションキーが生成されます)。
リクエストに OpenResponses の user 文字列が含まれている場合、Gateway はそこから安定したセッションキーを導出し、繰り返しの呼び出しでエージェントセッションを共有できます。
リクエスト形式(対応済み)
リクエストはアイテムベースの入力を持つ OpenResponses API に準拠します。現在のサポート内容:
input:文字列またはアイテムオブジェクトの配列。instructions:システムプロンプトにマージされます。tools:クライアントツール定義(関数ツール)。tool_choice:クライアントツールのフィルタまたは強制。stream:SSE ストリーミングを有効化。max_output_tokens:ベストエフォートの出力上限(プロバイダー依存)。user:安定したセッションルーティング。
受け付けるが現在は無視されるもの:
max_tool_callsreasoningmetadatastoreprevious_response_idtruncation
アイテム(input)
message
ロール:system、developer、user、assistant。
systemとdeveloperはシステムプロンプトに追加されます。- 最新の
userまたはfunction_call_outputアイテムが「現在のメッセージ」になります。 - それ以前の user/assistant メッセージはコンテキストとして履歴に含まれます。
function_call_output(ターンベースツール)
ツールの結果をモデルに返します:
{
"type": "function_call_output",
"call_id": "call_123",
"output": "{\"temperature\": \"72F\"}"
}
reasoning と item_reference
スキーマ互換性のために受け付けますが、プロンプト構築時には無視されます。
ツール(クライアントサイド関数ツール)
tools: [{ type: "function", function: { name, description?, parameters? } }] でツールを定義します。
エージェントがツール呼び出しを決定した場合、レスポンスに function_call 出力アイテムが返されます。
その後、function_call_output を含むフォローアップリクエストを送信してターンを継続します。
画像(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。
現在の動作:
- ファイル内容はデコードされてシステムプロンプトに追加されます(ユーザーメッセージではない)。そのためセッション履歴には永続化されません。
- PDF はテキスト抽出されます。テキストが少ない場合、最初の数ページが画像としてラスタライズされ、モデルに渡されます。
PDF パースには Node 向けの pdfjs-dist レガシービルド(ワーカーなし)を使用しています。最新の PDF.js ビルドはブラウザのワーカー/DOM グローバルを前提としているため、Gateway では使用していません。
URL 取得のデフォルト:
files.allowUrl:trueimages.allowUrl:truemaxUrlParts:8(リクエストあたりの URL ベースinput_file+input_imageパーツの合計)- リクエストはガードされています(DNS 解決、プライベート IP ブロック、リダイレクト制限、タイムアウト)。
- 入力タイプごとにオプションのホスト名許可リストをサポート(
files.urlAllowlist、images.urlAllowlist)。- 完全一致ホスト:
"cdn.example.com" - ワイルドカードサブドメイン:
"*.assets.example.com"(apex には一致しません)
- 完全一致ホスト:
ファイル・画像の制限(設定)
デフォルト値は 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:10秒files.pdf.maxPages:4files.pdf.maxPixels:4,000,000files.pdf.minTextChars:200images.maxBytes:10MBimages.maxRedirects:3images.timeoutMs:10秒- HEIC/HEIF の
input_imageソースは受け付けられ、プロバイダーへの送信前に JPEG に正規化されます。
セキュリティ上の注意:
- URL 許可リストはフェッチ前とリダイレクトの各ホップで検証されます。
- ホスト名を許可リストに追加しても、プライベート/内部 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
usage は、基盤プロバイダーがトークン数を報告した場合に値が入ります。
エラー
エラーは以下のような 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"
}'