為何合法的 Draft-07 JSON Schema 仍會在 LLM API 回傳 HTTP 400
受限解碼引擎會在開始生成前,先將你的 JSON Schema 編譯為上下文無關文法(CFG)或有限狀態 token 遮罩。 為了讓文法編譯保持高速且狀態可控,OpenAI、Anthropic 與 Google 各自強制執行比標準 Ajv、Zod 或 Pydantic 預設匯出更嚴格的 JSON Schema 子集。
例如 OpenAI 的 strict: true 模式會拒絕任何漏寫 additionalProperties: false 或未將所有屬性列入 required 陣列的物件節點——因此選填欄位仍須寫入 required,並改以 ["string", "null"] 等可空聯合型別表示。 相反地,Google Gemini 的 generationConfig.responseSchema 則完全拒絕出現 additionalProperties 關鍵字。
| Schema 規則 | OpenAI 嚴格模式 (strict: true) | Anthropic 嚴格工具 / JSON | Gemini responseSchema |
|---|---|---|---|
| 根節點 type 必須為 "object" | 必填要求 | 必填要求 | 強烈建議 |
| 每個物件宣告 "additionalProperties": false | 必填(省略回傳 400) | 必填(省略回傳 400) | 禁止出現(存在回傳 400) |
| 全部屬性列入 "required" | 必填(選填欄位改用 [type, "null"]) | 允許省略選填鍵 | 允許省略選填鍵 |
| 正規表示式 pattern / minLength / format | 嚴格語法不支援 | 支援有限,建議寫入 description 並由後端校驗 | 多數文字 format 不支援 |