事情本身不复杂,线索都在日志里。把两个业务线的请求合到一个 jsonl 提交 Batch,前 8000 行是 gpt-4o-mini,后 2000 行是 gpt-4o,任务状态直接变成 failed,error_file 里写着 model must be consistent within a batch。原以为按行分别指定就可以。
第一反应是「失败任务的输入文件仍占用存储配额」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。一个 Batch 只允许一个模型,行内 model 必须一致。也可能是混批后校验阶段就失败,不会进入排队。
还有一种情况,重提时沿用旧文件,错误被原样带过去。
上来先统计文件里出现过的 model 值
python -c "import json,collections;print(collections.Counter(json.loads(l)['body']['model'] for l in open('in.jsonl')))"
再往下按 model 拆成两个文件分别提交
python split_by_model.py --input in.jsonl --outdir parts/
然后查看失败任务的错误明细
curl -s https://api.openai.com/v1/batches/$BATCH_ID -H "Authorization: Bearer $OPENAI_API_KEY" | jq '{status,errors}'
末了确认新文件行数与原始一致后重提
wc -l parts/*.jsonl
改完先别撤,确认这几项。两个 Batch 都进入 completed,结果行数之和与原始 jsonl 行数相同,没有 error 行。
这里还有个坑。Batch 的折扣是按整批算的,混模型不会更省,拆文件反而更容易对齐结果。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
