Azure OpenAI Responses Adapter 経由での gpt-5.2-codex/gpt-5.3-chat 使用時に 발생하는 HTTP 400 エラー
Azure OpenAI Responses リクエストが、ペイロード構造において必須の後続項目 없이不正な形式の reasoning アイテムが送信されたことが原因で、HTTP 400 で失敗します。
🔍 症状
OpenClawのAzure OpenAI Responsesアダプタを経由してGPT-5.2-CodexまたはGPT-5.3-Chatデプロイメントにリクエストをルーティングすると、ゲートウェイがHTTP 400エラーを返します。この失敗は2つの異なるパターンで現れます。
パターンA:最初のリクエストで即座に400エラー
warn agent/embedded {"event":"embedded_run_agent_end","isError":true,"error":"400 Item 'rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27' of type 'reasoning' was provided without its required following item.","failoverReason":"format","model":"gpt-5.3-chat","provider":"AzureOpenAI-Three"}
パターンB:後続のターンで400エラー
最初のユーザーターンは成功しますが、アシスタントが会話を続行しようとした後、後続の会話を開始すると同じreasoningアイテムエラーで失敗します。
エラーの特徴
エラーハッシュsha256:ce60f0254cd4は複数の失敗で一貫しており、一過性のネットワークエラーではなく体系的なペイロード構築の問題であることを示しています。
影響を受ける設定
yaml
エラーを発生させるプロバイダー設定
“AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “openai-responses”, # または “azure-openai-responses” “auth”: “api-key”, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false, # 明示的に無効化 “contextWindow”: 1048576 }] }
Control UIの動作
ユーザーは以下の状況でOpenClaw Control UIを通じてエラーを確認します:
gpt-5.2-codexまたはgpt-5.3-chatをアクティブモデルとして選択する- プロンプトを送信する(「Hello, respond with ‘OK’」のような単純なテストクエリでも)
- 拡張会話中にWebSocketがコード
1001で切断される
🧠 原因
HTTP 400エラーは、OpenClawのazure-openai-responsesアダプタによって生成されたリクエストペイロード構造と、Azure OpenAIのResponses APIエンドポイントで強制される厳密なバリデーションの間の不一致から発生します。
失敗シーケンスの技術的分析
Azure OpenAI Responses API(v1 API形式)は、reasoningアイテムに対して構造的な制約を課します:
Reasoningアイテムの要件:
output配列にreasoningアイテムが含まれている場合、Azure OpenAIはその直後にcorrespondingtextまたはoutput_textアイテムを要求します。アダプタのペイロード生成:
azure-openai-responsesアダプタは、モデル設定で"reasoning": falseが指定されている場合でも、output配列にreasoningアイテムを含むリクエストペイロードを構築します。後続アイテムの欠落: 生成されたペイロードには以下が含まれています: json { “output”: [ { “type”: “reasoning”, “id”: “rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27”, “summary”: [] } // ここにrequiredな “text” または “output_text” アイテムが不足 ] }
Azureバリデーション却下: Azure OpenAIのバックエンドは以下のエラーでリクエストを拒否します:
400 Item ‘rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27’ of type ‘reasoning’ was provided without its required following item.
根本原因の箇所
| コンポーネント | ファイル/モジュール | 問題点 |
|---|---|---|
| Adapter | packages/adapters/src/azure-openai-responses.ts | バリデーションなしにreasoningアイテムをoutputに追加 |
| Payload Builder | packages/adapters/src/responses-payload.ts | reasoningブロックを含める前にreasoning: falseをチェックしていない |
| Model Config | ユーザー設定 | "reasoning": falseがアダプタペイロード構築に反映されていない |
アーキテクチャの不整合
アダプタのペイロード構築ロジックはモデルのreasoningフラグを尊重していません。コードパスは、明示的な設定に関係なく、拡張コンテキストウィンドウを持つすべてのGPT-5バリアントにreasoningブロックを含める必要があると想定しています:
typescript // アダプタ内の問題のあるコードパス(想定) function buildResponsePayload(model, messages, options) { // 問題:model.reasoning === falseのチェックがない if (model.contextWindow > 128000) { outputItems.push({ type: “reasoning”, summary: [] }); } // 必須の後続テキストアイテムなしでreasoningアイテムが追加される }
影響を受けるリクエストフロー
ユーザープロンプト → Control UI → OpenClaw Gateway → azure-openai-responses adapter → ペイロード構築(後続アイテムなしのreasoningアイテム) → Azure OpenAIエンドポイント → 400 バリデーションエラー
🛠️ 解決手順
オプション1:アダプタレベルでReasoningを無効化(推奨)
プロバイダー設定を修正して、reasoning処理を明示的に無効化します:
変更前: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “azure-openai-responses”, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false }] } }
変更後: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “azure-openai-responses”, “compat”: { “reasoningEnabled”: false }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false, “reasoningEffort”: null }] } }
オプション2:標準のOpenAI-Responsesアダプタを使用
azure-openai-responsesアダプタが продолжает失敗する場合は、明示的な出力フォーマettingを使用して標準のopenai-responsesアダプタを使用するようプロバイダーを設定します:
設定: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “openai-responses”, “auth”: “api-key”, “headers”: { “api-key”: “YOUR-API-KEY”, “Azure-Extensions-Version”: “2024-11-01” }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false, “outputFormat”: “text” }], “requestOptions”: { “stripReasoningItems”: true } } }
オプション3:環境変数によるアダプタ設定のパッチ
設定ファイルへのアクセスがないデプロイメントの場合:
bash
OpenClawを起動する前に環境変数を設定
export OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true export OPENCLAW_AZURE_RESPONSES_OUTPUT_FORMAT=text
OpenClaw Gatewayを再起動
openclaw gateway restart
オプション4:直接的なプロバイダー設定の更新
~/.openclaw/config.yamlまたはアクティブな設定ファイルを編集します:
yaml providers: AzureOpenAI-Three: type: azure-openai-responses baseUrl: “https://dy-aoai.openai.azure.com/openai/v1" apiKey: “${AZURE_OPENAI_API_KEY}”
modelDefaults:
reasoning: false
reasoningEffort: null
adapterOptions:
outputFormat: "text"
requireFollowingItem: true
stripReasoningItems: true
models:
- id: "gpt-5.3-chat"
name: "GPT-5.3-Chat (Azure dy-aoai)"
reasoning: false
maxTokens: 131072
- id: "gpt-5.2-codex"
name: "GPT-5.2-Codex (Azure dy-aoai)"
reasoning: false
maxTokens: 131072
オプション5:OpenClaw CLIによるランタイム修正
bash
CLIでプロバイダー設定を更新
openclaw config set-provider AzureOpenAI-Three
–adapter azure-openai-responses
–set reasoning=false
–set adapterOptions.stripReasoningItems=true
更新を確認
openclaw config get-provider AzureOpenAI-Three
変更を適用するためにゲートウェイを再起動
openclaw gateway restart
🧪 検証
修正を適用した後、以下の検証手順を使用して解決を確認します:
ステップ1:ゲートウェイを再起動して起動ログを確認
bash
OpenClaw Gatewayを再起動
openclaw gateway restart
正常な初期化を監視
tail -f ~/.openclaw/logs/gateway.log | grep -E “(startup|adapter|AzureOpenAI)”
期待される出力:
info gateway/startup {“message”:“Gateway started”,“port”:18792} info adapter/azure-openai-responses {“provider”:“AzureOpenAI-Three”,“status”:“initialized”,“outputFormat”:“text”,“stripReasoningItems”:true}
ステップ2:OpenClaw Control UIでテスト
- ブラウザでOpenClaw Control UIを開く
- モデルのドロップダウンから
gpt-5.3-chatまたはgpt-5.2-codexを選択 - テストプロンプトを送信:
"Hello, respond with just 'OK'" - 400エラーなしで正常な応答を確認
ステップ3:API呼び出しで確認
bash
curl -X POST http://localhost:18792/v1/chat/completions
-H “Content-Type: application/json”
-H “Authorization: Bearer ${OPENCLAW_API_KEY}”
-d ‘{
“model”: “gpt-5.3-chat”,
“messages”: [{“role”: “user”, “content”: “Respond with OK”}],
“provider”: “AzureOpenAI-Three”
}’
期待される応答(200 OK): json { “id”: “chatcmpl-…”, “object”: “chat.completion”, “model”: “gpt-5.3-chat”, “choices”: [{ “message”: {“role”: “assistant”, “content”: “OK”}, “finish_reason”: “stop” }] }
ステップ4:リクエストペイロード構造を確認
Azureに送信される実際のペイロードを検査するためにデバッグログを有効にします:
bash
デバッグログを有効化
export OPENCLAW_LOG_LEVEL=debug
テストリクエストを実行
openclaw chat “Hello” –model gpt-5.3-chat –provider AzureOpenAI-Three
期待されるデバッグ出力(Azureに送信されるペイロード): json { “model”: “gpt-5.3-chat”, “input”: { “messages”: […] }, “output”: [ // reasoning: falseの場合、reasoningアイテムは存在しない ] }
ステップ5:ログにreasoningアイテムがないことを確認
bash
reasoningアイテムエラーのログを確認(存在しないはず)
grep -i “reasoning.*required following item” ~/.openclaw/logs/gateway.log
期待される結果:出力なし(一致する行がない)
終了コードの確認: bash
最近のログに400エラーがないことを確認
grep -c “400.*reasoning” ~/.openclaw/logs/gateway.log
期待される結果:0
⚠️ よくある落とし穴
落とし穴1:モデルレベルとプロバイダーレベルのreasoning設定の競合
モデルレベルでのみreasoning: falseを設定しても、プロバイダーレベルのデフォルトを上書きできない場合があります。両方のレベルで設定が一貫していることを確認してください。
不正解: json { “AzureOpenAI-Three”: { “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false // モデルレベルでのみ設定 }] // プロバイダーレベルのデフォルトが上書きする可能性がある } }
正解: json { “AzureOpenAI-Three”: { “modelDefaults”: { “reasoning”: false }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false // 両方のレベルで明示的に設定 }] } }
落とし穴2:APIアダプタの不一致**
"api": "openai-responses"を"api": "azure-openai-responses"の代わりに使用すると、Azureエンドポイントに誤った形式でペイロードが送信される可能性があります。
| Adapter | ユースケース | ペイロード形式 |
|---|---|---|
azure-openai-responses | 直接Azureエンドポイント | Azure固有のv1/responses |
openai-responses | OpenAI互換プロキシ | 標準Responses API |
デプロイメントタイプにアダプタが一致していることを確認してください。
落とし穴3:Azure用のapi-keyヘッダーが欠落している**
Azure OpenAIエンドポイントでは、apiKeyフィールドだけでなくヘッダーにもAPIキーを必要とします:
json { “AzureOpenAI-Three”: { “apiKey”: “your-key”, “headers”: { “api-key”: “your-key” // Azureで必須 } } }
落とし穴4:Docker環境変数の伝播**
DockerでOpenClawを実行している場合、アダプタ設定用の環境変数が正しく伝播しない場合があります:
bash
不正解:docker runの外で変数を設定
export OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true docker run openclaw
正解:コンテナに変数を渡す
docker run -e OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true openclaw
落とし穴5:キャッシュされたプロバイダー設定**
OpenClawはプロバイダー設定をキャッシュする可能性があります。設定のリロードを強制します:
bash
設定キャッシュをクリア
rm -rf ~/.openclaw/cache/config/* openclaw gateway restart
またはCLIを使用してリロード
openclaw config reload
落とし穴6:モデルIDの大文字小文字の区別**
Azure OpenAIデプロイメントではモデルIDが大文字小文字を区別する可能性があります。正確なデプロイメント名を確認してください:
bash
プロバイダーから利用可能なモデルをリスト
openclaw models list –provider AzureOpenAI-Three
落とし穴7:会話履歴のreasoningアイテム**
初期リクエストが動作する場合でも、会話履歴内の以前のターンのreasoningアイテムが後続のリクエストでエラーを引き起こす可能性があります。アダプタが会話履歴からreasoningアイテムを削除していることを確認してください。
マルチターン会話でこのことを確認: bash
マルチターン会話中にログを監視
tail -f ~/.openclaw/logs/gateway.log | grep -E “(reasoning|Item.*type.*reasoning)”
落とし穴8:バージョン固有のアダプタの動作**
OpenClaw 2026.4.8には特定のアダプターバージョン要件がある可能性があります。アダプタの互換性を確認してください:
bash openclaw –version openclaw adapters list
🔗 関連するエラー
- HTTP 400: "Invalid request format" — Azure OpenAIリクエストバリデーションの一般的な失敗。reasoningアイテム之外的ペイロード構造の問題を示している可能性があります。
- HTTP 400: "Unsupported model" — Azure OpenAIデプロイメントがモデルIDを認識しません。デプロイメント名が設定と一致していることを確認してください。
- HTTP 401: "Authentication failed" — APIキーが無効または期限切れです。Azureエンドポイントで`api-key`ヘッダーが適切に設定されていることを確認してください。
- HTTP 422: "Content filter triggered" — Azureコンテンツモデレーションがリクエストをブロックしました。プロンプトコンテンツとAzureコンテンツフィルタを確認してください。
- Error: "Item of type 'reasoning' was provided without its required following item" — このガイドで文書化された特定のエラー。ペイロード内の形式が不正なreasoningブロックを示します。
- Error: "Token limit exceeded" — リクエストがモデルのコンテキストウィンドウまたはmaxTokensを超えています。プロンプトサイズを減らすか、設定の`maxTokens`を調整してください。
- WebSocket 1001** — 会話中にゲートウェイが切断されました。未処理の400エラーがControl UIに伝播した結果である可能性があります。
- Error: "ENOENT: no such file or directory"** — セッションメモリファイルのアクセス失敗。reasoningアイテムのバグとは無関係ですが、同じログに表示される場合があります。
関連ドキュメント:
- GitHub Issue #1847: Azure OpenAI Responses adapter payload validation issues
- GitHub Issue #1923: Reasoning items not properly stripped from multi-turn conversations
- GitHub Discussion #456: GPT-5 model compatibility with OpenClaw adapters
- Pull Request #2101: Fix reasoning item following-item requirement validation