记录一下那天晚上的排查过程。任务状态显示 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 一下大小,能省掉一轮以为数据丢了的排查。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
