记录一下那天晚上的排查过程。任务状态显示 completed,下载 output_file_id 得到 0 字节,error_file 也是空的,2 万条请求一条结果都没有,重下三次都一样。

刚开始盯着「结果文件已过保留期被清空」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。结果写在另一个字段指向的文件里。还有一种是下载用错了文件 id,拿到的是占位文件。

少数情况下是对象存储权限不足时返回空体而不是 403。

拉批次详情看所有文件字段

curl -s https://api.openai.com/v1/batches/batch_abc -H "Authorization: Bearer $KEY" | jq '{status:.status, output:.output_file_id, error:.error_file_id}'

接着对每个文件做一次 HEAD 看大小

curl -sI https://api.openai.com/v1/files/file_out/content -H "Authorization: Bearer $KEY" | grep -i content-length

带内容类型重新下载一次

curl -s https://api.openai.com/v1/files/file_out/content -H "Authorization: Bearer $KEY" -o out.jsonl -w '%{size_download}\n'

等前面都确认过,再按 custom_id 统计结果条数

wc -l out.jsonl; jq -r '.custom_id' out.jsonl | sort -u | wc -l

别只看报错消失,验证要多做一步。下载到的文件大小与请求条数匹配,custom_id 数量等于 2 万,抽样解析能拿到正常内容。

容易忽略的是,completed 只代表任务结束,不代表有结果,下载前先 HEAD 一下大小,能省掉一轮以为数据丢了的排查。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189