メインコンテンツへスキップ
Gateway は OpenResponses 互換の POST /v1/responses エンドポイントを提供できます。これはデフォルトで無効で、Gateway とポートを共有します(WS + HTTP 多重化): http://<gateway-host>:<port>/v1/responses リクエストは通常の Gateway エージェント実行(openclaw agent と同じコードパス)として実行されるため、ルーティング、権限、設定は Gateway と一致します。 gateway.http.endpoints.responses.enabled で有効化または無効化します。有効にすると、同じ互換サーフェスで GET /v1/modelsGET /v1/models/{id}POST /v1/embeddingsPOST /v1/chat/completions も提供されます。

認証、セキュリティ、ルーティング

運用上の挙動は OpenAI Chat Completions と一致します。
  • 認証パスは gateway.auth.mode と一致します。shared-secret(token/password)は Authorization: Bearer <token-or-password> を使用します。trusted-proxy は ID 対応プロキシヘッダーを使用します(同一ホストのループバックプロキシには gateway.auth.trustedProxy.allowLoopback = true が必要で、Forwarded/X-Forwarded-*/X-Real-IP ヘッダーが存在しない場合は gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD による同一ホスト直接フォールバックがあります)。プライベート ingress 上の none は認証ヘッダーを必要としません。信頼済みプロキシ認証を参照してください。
  • このエンドポイントは、Gateway インスタンスへの完全なオペレーターアクセスとして扱ってください。
  • shared-secret 認証モードは、より狭い bearer 宣言の x-openclaw-scopes を無視し、完全なデフォルトオペレータースコープセットを復元します: operator.adminoperator.approvalsoperator.pairingoperator.readoperator.talk.secretsoperator.write。このエンドポイント上のチャットターンは、所有者送信者ターンとして扱われます。
  • 信頼済み ID を持つ HTTP モード(trusted-proxy、または gateway.auth.mode="none")は、存在する場合は x-openclaw-scopes を尊重し、それ以外の場合はオペレーターのデフォルトスコープセットにフォールバックします。呼び出し元が明示的にスコープを狭め、operator.admin を省略した場合にのみ、所有者セマンティクスは失われます。
  • model: "openclaw""openclaw/default""openclaw/<agentId>"、または x-openclaw-agent-id ヘッダーでエージェントを選択します。
  • x-openclaw-model を使用して、選択したエージェントのバックエンドモデルを上書きします(ID を持つ認証パスでは operator.admin が必要です)。
  • 明示的なセッションルーティングには x-openclaw-session-key を使用します(予約済み名前空間 subagent:cron:acp: を使用している場合は 400 invalid_request_error で拒否されます)。
  • デフォルト以外の合成 ingress チャンネルコンテキストには x-openclaw-message-channel を使用します。
エージェント対象モデル、openclaw/default、embeddings パススルー、バックエンドモデル上書きの標準的な説明については、OpenAI Chat Completions を参照してください。 オペレータースコープセキュリティを参照してください。

セッションの挙動

デフォルトでは、このエンドポイントはリクエストごとにステートレスです(各呼び出しで新しいセッションキーが生成されます)。 リクエストに OpenResponses の user 文字列が含まれている場合、Gateway はそこから安定したセッションキーを導出するため、繰り返し呼び出しでエージェントセッションを共有できます。 previous_response_id は、リクエストが同じエージェント/ユーザー/要求セッションスコープ内に留まる場合、以前のレスポンスのセッションを再利用します(認証サブジェクト、エージェント ID、x-openclaw-session-key で照合されます)。

リクエスト形状

フィールドサポート
input文字列、または項目オブジェクトの配列。
instructionsシステムプロンプトにマージされます。
toolsクライアントツール定義(function tools)。
tool_choiceクライアントツールをフィルターまたは必須にするための "auto""none""required"、または { "type": "function", "name": "..." }
streamSSE ストリーミングを有効にします。
max_output_tokensベストエフォートの出力制限(プロバイダー依存)。
temperatureベストエフォートのサンプリング温度。ChatGPT ベースの Codex Responses バックエンドでは無視され、固定のサーバー側サンプリングが使用されます。
top_pベストエフォートの nucleus sampling。temperature と同じ Codex Responses の注意事項が適用されます。
user安定したセッションルーティング。
previous_response_idセッション継続性(上記を参照)。
max_tool_calls, reasoning, metadata, store, truncation受け付けられますが、現在は無視されます。

項目(入力)

message

ロール: systemdeveloperuserassistant
  • systemdeveloper はシステムプロンプトに追加されます。
  • 最新の user または function_call_output 項目が「現在のメッセージ」になります。
  • それ以前の user/assistant メッセージは、コンテキスト用の履歴として含まれます。

function_call_output(ターンベースツール)

ツール結果をモデルに返します。
{
  "type": "function_call_output",
  "call_id": "call_123",
  "output": "{\"temperature\": \"72F\"}"
}

reasoningitem_reference

スキーマ互換性のため受け付けられますが、プロンプト構築時には無視されます。

ツール(クライアント側 function tools)

tools: [{ type: "function", name, description?, parameters? }] でツールを指定します。 エージェントがツールを呼び出すと、レスポンスは function_call 出力項目を返します。ターンを続行するには、function_call_output を含むフォローアップリクエストを送信します。 tool_choice: "required" と function 固定の tool_choice では、エンドポイントは公開されるクライアント function-tool セットを狭め、レスポンス前にクライアントツールを呼び出すようランタイムに指示し、一致する構造化クライアントツール呼び出しが含まれていない場合はターンを拒否します。これは /v1/chat/completions コントラクトと一致します。非ストリーミングリクエストは api_error を伴う 502 を返し、ストリーミングリクエストは response.failed イベントを発行します。

画像(input_image

base64 または URL ソースをサポートします。
{
  "type": "input_image",
  "source": { "type": "url", "url": "https://example.com/image.png" }
}
許可される MIME タイプ(デフォルト): image/jpegimage/pngimage/gifimage/webpimage/heicimage/heif。最大サイズ(デフォルト): 10MB。

ファイル(input_file

base64 または URL ソースをサポートします。
{
  "type": "input_file",
  "source": {
    "type": "base64",
    "media_type": "text/plain",
    "data": "SGVsbG8gV29ybGQh",
    "filename": "hello.txt"
  }
}
許可される MIME タイプ(デフォルト): text/plaintext/markdowntext/htmltext/csvapplication/jsonapplication/pdf。最大サイズ(デフォルト): 5MB。 現在の挙動:
  • ファイル内容はデコードされ、ユーザーメッセージではなくシステムプロンプトに追加されるため、一時的なままです(セッション履歴には永続化されません)。
  • デコードされたファイルテキストは、追加前に信頼されない外部コンテンツとしてラップされるため、ファイルバイトは信頼済み命令ではなくデータとして扱われます。挿入されるブロックは明示的な境界マーカー(<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>> / <<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>)と Source: External メタデータ行を使用します。プロンプト予算を保つため、長い SECURITY NOTICE: バナーは意図的に省略されますが、境界マーカーとメタデータは引き続き適用されます。
  • PDF はまずテキスト解析されます。テキストがほとんど見つからない場合、最初のページが画像にラスタライズされてモデルに渡され、挿入されるファイルブロックはプレースホルダー [PDF content rendered to images] を使用します。
PDF 解析は、同梱の document-extract Plugin によって提供されます。この Plugin は、テキスト抽出とページレンダリングに clawpdf とその同梱 PDFium WebAssembly ランタイムを使用します。 URL フェッチのデフォルト:
  • files.allowUrl: true
  • images.allowUrl: true
  • maxUrlParts: 8(リクエストごとの URL ベースの input_file + input_image パート合計)
  • リクエストは保護されます(DNS 解決、プライベート IP ブロック、リダイレクト上限、タイムアウト)。
  • 任意のホスト名許可リストは入力タイプごとにサポートされます(files.urlAllowlistimages.urlAllowlist): 完全一致ホスト("cdn.example.com")またはワイルドカードサブドメイン("*.assets.example.com"、apex には一致しません)。空または省略された許可リストは、ホスト名許可リスト制限がないことを意味します。
  • URL ベースのフェッチを完全に無効化するには、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: 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,
          },
        },
      },
    },
  },
}
省略時のデフォルト:
キーデフォルト
maxBodyBytes20MB
maxUrlParts8
files.maxBytes5MB
files.maxChars60k
files.maxRedirects3
files.timeoutMs10s
files.pdf.maxPages4
files.pdf.maxPixels4,000,000
files.pdf.minTextChars200
images.maxBytes10MB
images.maxRedirects3
images.timeoutMs10s
HEIC/HEIF の input_image ソースは、共有 OpenClaw 画像プロセッサー(Rastermill)を通じて、プロバイダー配信前に JPEG に正規化されます。外部コーデックサポートが必要な形式では、システムコンバーター(sips、ImageMagick、GraphicsMagick、または ffmpeg)にフォールバックします。 セキュリティ注記: URL 許可リストは、フェッチ前およびリダイレクトホップ時に適用されます。ホスト名を許可リストに入れても、プライベート/内部 IP ブロックはバイパスされません。インターネットに公開された Gateway では、アプリレベルのガードに加えてネットワーク egress 制御を適用してください。セキュリティを参照してください。

ストリーミング(SSE)

Server-Sent Events を受信するには stream: true を設定します。
  • 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 は、基盤となるプロバイダーがトークン数を報告したときに設定されます。OpenClaw は、これらのカウンターが下流のステータス/セッションサーフェスに到達する前に、input_tokens / output_tokensprompt_tokens / completion_tokens を含む、一般的な OpenAI 形式のエイリアスを正規化します。

エラー

エラーは次のような JSON オブジェクトを使用します。
{ "error": { "message": "...", "type": "invalid_request_error" } }
一般的なケース: 400 無効なリクエスト本文、401 認証の欠落/無効、403 オペレータースコープの欠落、405 誤ったメソッド、429 認証失敗の試行回数が多すぎる (Retry-After 付き)。

非ストリーミング:
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"
  }'

関連