记录一下那天晚上的排查过程。想让它稳定输出商品字段,把一份标准 JSON Schema 直接塞给 responseSchema,gemini-1.5-pro 返回 400,原文 response_schema must be a valid schema object。

刚开始盯着「嵌套对象没有声明 required,字段被判定不合法」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。只支持 OpenAPI 子集,$ref 与 oneOf 这类写法不认。也可能是type 要写成大写枚举值,小写字符串被拒。

另外,把 schema 与 responseMimeType 分开传,顺序不对也报错。

上来先把 type 改成大写枚举再试

python -c "import json;d=json.load(open('schema.json'));d['type']=d['type'].upper();json.dump(d,open('schema2.json','w'))"

带上 MIME 类型一起请求

curl -sS "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent?key=$GEMINI_API_KEY" -H 'content-type: application/json' -d @gemini_schema_req.json

等前面都确认过,再用最简单的单字段 schema 验证

python -c "import json;print(json.dumps({'type':'OBJECT','properties':{'name':{'type':'STRING'}},'required':['name']}))"

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改完先别撤,确认这几项。响应 200 且返回文本能直接 json.loads,字段与 schema 完全一致,不再出现 schema 合法性报错。

补一句。别把项目里现成的 JSON Schema 直接复用,Gemini 只吃一个子集,复杂约束要在提示里补而不是写进 schema。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189