这个坑值得记一笔。把 response_format 改成 json_schema 严格模式,返回 400,提示 additionalProperties 必须显式为 false,模型无法按 schema 输出,普通 json_object 模式却正常。
刚开始盯着「schema 里用了 anyOf 等严格模式不支持的组合」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。严格模式要求每个对象都显式关闭额外字段;嵌套对象里的 properties 也漏了同样的设置;required 列表与 properties 不一致,校验直接失败。
动手时先在每个 object 上补 additionalProperties:false
schema = {'type':'object','properties':{'name':{'type':'string'}},'required':['name'],'additionalProperties':False}
然后用 Pydantic 生成标准结构再手工补开关
python -c "from pydantic import BaseModel;print(BaseModel.model_json_schema())"
发送前本地先校验一次样例数据
python -c "import jsonschema;jsonschema.validate({'name':'a'},schema);print('ok')"
末了把 schema 固化成文件,随代码一起版本管理
python -c "import json;print(json.dumps(schema, ensure_ascii=False))")
这台环境是别人交接的,不少默认值被动过,只能一项项核。
怎么算真的好了,看的是同一批现象。请求返回 200,content 严格符合 schema,多余字段不再出现,下游解析不需要再做兜底判断。
容易忽略的是,严格模式要求所有字段都出现在 required 里,想留可选项只能改成允许 null 的类型,直接漏写会让整个 schema 校验不通过。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。