標準の Draft-07 JSON Schema でも LLM API で HTTP 400 エラーになる理由
制約付きデコーディングエンジンは生成開始前に、JSON Schema を文脈自由文法や有限オートマトンのトークンマスクへコンパイルします。 文法コンパイルを高速かつ有界に保つため、OpenAI・Anthropic・Google はいずれも Ajv、Zod、Pydantic がデフォルト出力するものより厳格な JSON Schema サブセットを要求します。
例えば OpenAI の strict: true モードでは、additionalProperties: false の省略や required 配列に含まれないプロパティがあるオブジェクトは拒否されるため、任意項目も required に含めた上で ["string", "null"] のような null 許容ユニオンにする必要があります。 逆に、Google Gemini の generationConfig.responseSchema は additionalProperties キーワード自体を一切受け付けません。
| スキーマ制約ルール | OpenAI Strict (strict: true) | Anthropic 厳格ツール / JSON | Gemini responseSchema |
|---|---|---|---|
| ルート type が "object" | 必須 | 必須 | 推奨 |
| 全オブジェクトに "additionalProperties": false | 必須(省略時は 400) | 必須(省略時は 400) | 使用不可(指定時は 400) |
| 全プロパティを "required" に列挙 | 必須(任意項目は [type, "null"]) | 任意キーの省略可 | 任意キーの省略可 |
| 正規表現 pattern / minLength / format | strict 文法では非対応 | 一部制限あり(description+アプリ検証推奨) | 大半の文字列 format は非対応 |