为什么符合标准 Draft-07 的 JSON Schema 仍会被大模型接口返回 HTTP 400
大模型结构化输出在推理前会将你的 JSON Schema 编译为上下文无关文法(CFG)或有限状态 Token 掩码。为了控制语法图编译耗时与状态爆炸,OpenAI、Anthropic 与 Google 各自只支持标准 JSON Schema 的一个严格子集,这与 Zod、Pydantic 或 Ajv 默认导出的宽松结构经常冲突。
最典型的冲突有两处:第一,OpenAI 的 strict: true 模式要求每一层 object 都必须显式声明 additionalProperties: false,且所有属性键都必须写进 required 数组(可选字段需改写为 ["string", "null"] 联合类型);第二,Google Gemini 的 generationConfig.responseSchema 则恰恰相反,只要出现 additionalProperties 字段就会直接拒绝并返回 HTTP 400。
| Schema 约束项 | OpenAI 严格模式 (strict: true) | Anthropic 严格工具 / JSON | Gemini responseSchema |
|---|---|---|---|
| 根节点 type 必须为 "object" | 强制要求 | 强制要求 | 强烈建议 |
| 每个对象声明 "additionalProperties": false | 强制要求(缺失返回 400) | 强制要求(缺失返回 400) | 禁止出现(存在返回 400) |
| 全部属性写入 "required" 数组 | 强制要求(可选字段用 [type, "null"]) | 允许省略可选字段 | 允许省略可选字段 |
| 正则 pattern / minLength / format | 严格语法不支持 | 支持有限,建议写入描述后业务校验 | 多数字符串 format 不支持 |