把带长文档的 8000 条请求打成 jsonl 提交 Batch,接口返回 400,原文 Line is too long, maximum 262144 bytes per line,第 118 条是一整篇 PDF 全文,单行接近 400KB。
原因不止一个,得分开看。单行请求体超过了 256KB;base64 图片让单行体积暴涨;正文里的换行没有转义 把一行拆成了多行;整个文件体积也接近总上限。
第一件事是找出超过限制的行
python -c "import io;print([(i,len(l)) for i,l in enumerate(io.open('batch.jsonl','rb')) if len(l)>262144][:5])"
再往下把长文档改走文件引用而不是内联
python split_long.py --in batch.jsonl --max 240000 --out batch_ok.jsonl
校验每行合法且 custom_id 唯一
python check_jsonl.py --in batch_ok.jsonl --unique custom_id
末了重新上传并记下文件 id
curl https://api.openai.com/v1/files -H "Authorization: Bearer $KEY" -F purpose=batch -F file=@batch_ok.jsonl
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
这台环境是别人交接的,不少默认值被动过,只能一项项核。
同事提醒我看一下最近一次发布,时间点确实对得上。
别只看报错消失,验证要多做一步。上传返回 200 并拿到文件 id,提交 Batch 后状态进入 validating,没有被拒的行。
这里还有个坑。Batch 的限制按行算,长文档内联很容易越线,先上传文件再引用既省体积也好排查。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
