gemini-2.5-flash 用 responseSchema 输出 12 个字段的工单,字段值都对但每次顺序不同,下游按固定下标取值时错位,schema 里只写了 properties,没写 propertyOrdering。
一开始怀疑是「下游用下标解析,把顺序当成了契约」,查了一圈,方向不对。
原因不止一个,得分开看。JSON 对象本身无序,序列化顺序由实现决定。还有一种是responseSchema 支持 propertyOrdering 但默认不设。
不容易想到的是,网关转发时重新组装了字典。
连发两次,对比返回内容的键顺序
python -c "import json;print(list(json.load(open('a.json')).keys()));print(list(json.load(open('b.json')).keys()))"
然后在 schema 里补 propertyOrdering 数组
python -c "import json;s=json.load(open('schema.json'));s['propertyOrdering']=list(s['properties']);json.dump(s,open('schema2.json','w'))"
下游改成按 key 取值,去掉下标依赖
python -c "import json;d=json.load(open('a.json'));print(d.get('ticket_id'))"
剩下的就是用一次真实请求确认字段顺序稳定
python gemini_schema_probe.py --schema schema2.json --n 3
同一份数据我导出了两份,一份留底,一份拿来试。
别只看报错消失,验证要多做一步。三次返回的键顺序一致,下游按 key 解析全部命中,不再出现字段错位。
容易忽略的是,即便加了 propertyOrdering,解析也应按 key 而不是位置,顺序只是可读性优化,不该成为接口契约。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
