直接回答
400 はサーバーがリクエストを受信したものの、選択した API 契約では処理できないことを示します。縮小前に構造化エラーを保存します。
このガイドで解決できること
invalid_request_error、不正な JSON、未対応パラメータ、エンドポイント不一致による HTTP 400 を解決する。
OpenAI 互換 APIPython / Node.js SDKcurlリバースプロキシと API ゲートウェイChat Completions / Responses API
01
症状
リクエストが直ちに 400 を返し、invalid_request_error、パラメータ名、JSON 解析メッセージが含まれることがあります。
モデル一覧は成功しても、tools、stream、response_format、画像、高度なサンプリングを付けた生成だけ失敗します。
02
主な原因
- JSON の構文不正、二重エンコード、必須項目不足、値の型違い。
- Base URL と SDK のリソースパスが誤って結合され、別のエンドポイントへ送信されている。
- 選択モデルまたは互換ゲートウェイが任意項目・モダリティに未対応。
- Responses API と Chat Completions の項目を混在させている。
03
診断手順
- 01境界を確定最終 URL、Content-Type、元のエラー本文、request ID を記録します。
- 02基準を作成モデルと一件のテキスト入力だけを curl で送信します。
- 03一項目を比較curl と SDK を比較してシリアライズ差を分離します。
- 04決定的な証拠を記録stream、tools、出力形式、サンプリング項目を一つずつ戻します。
最小診断コマンド言語:bash
API_BASE_URL='https://<your-api-host>/v1'
MODEL_ID='<YOUR_MODEL_ID>'
curl -sS -D /tmp/api-headers.txt "$API_BASE_URL/chat/completions" -H "Authorization: Bearer ${API_KEY:?set API_KEY first}" -H 'Content-Type: application/json' --data "{"model":"$MODEL_ID","messages":[{"role":"user","content":"ping"}]}"04
修正
- 01障害レイヤーを修正最小再現で判明した Base URL、JSON 型、必須項目を修正します。
- 02必要な動作を復元対象 API に合わせて payload を作り直し、二種類の API 構造を混ぜません。
- 03一時回避策を除去モデルとゲートウェイが明示的に対応する機能だけを戻します。
修正例言語:python
from openai import OpenAI
client = OpenAI(api_key="<YOUR_API_KEY>", base_url="https://<your-api-host>/v1")
result = client.chat.completions.create(
model="<YOUR_MODEL_ID>",
messages=[{"role": "user", "content": "ping"}],
)
print(result.choices[0].message.content)05
検証
- 最小リクエストが期待するステータスと構造を返す。
- API バージョンとリソースパスが最終 URL に一度だけ現れる。
- 任意パラメータを個別に戻して成功する。
- ログには機密情報なしの request ID とエラー型だけが残る。
06
機密情報の扱い
- 比較時も Authorization ヘッダーを出力しない。
- プロンプト、アップロード内容、顧客識別子を診断資料から除去する。
- 決定的な 400 を無期限に再試行しない。
- UTC 時刻、request ID、エンドポイント、model ID、最小化した本文でエスカレーションする。
公式情報と検証範囲
本ガイドはプロトコル仕様とクライアント公式文書を根拠にしています。エラー文、再試行ヘッダー、設定項目はサービスやバージョンで変わるため、参照元を確認し、ログとリクエスト例を秘匿してから共有してください。
ドキュメントの適用範囲を見る