这个坑值得记一笔。把 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 校验不通过。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189