现场是这样的。用订单号当 custom_id 提交 Batch,一万行里有两百多个重复订单号,结果文件里这些订单只回了一条,业务侧对账时发现少了几百条,任务状态却是 completed。

中间走过弯路,把「结果按 custom_id 建字典,天然会去重」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。custom_id 在批内必须唯一,重复时后者覆盖前者;订单号在业务上不唯一,同一单多次请求很正常;重跑时又用同一批 id,问题被掩盖。

先检查输入里的重复 id

python -c "import json,collections;c=collections.Counter(json.loads(l)['custom_id'] for l in open('in.jsonl'));print([k for k,v in c.items() if v>1][:5])"

给 id 追加序号保证唯一

python -c "import json;l=open('in.jsonl').readline();print(json.loads(l)['custom_id']+'#2')"

结果落库前按唯一键校验条数

python -c "import json;print(len({json.loads(l)['custom_id'] for l in open('out.jsonl')}))"

剩下的就是用新 id 重提缺的那部分

python resubmit.py --missing missing.csv --prefix fix1

怎么算真的好了,看的是同一批现象。结果条数与输入行数完全一致,重复订单各自拿到独立结果,对账差额归零。

批量接口的 custom_id 是主键语义,业务主键不唯一时一定要自己加后缀。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189