现场是这样的。上传一份 40 页 PDF 后立刻在请求里引用 file_id,返回 400,提示 file 状态不为 processed,无法用于对话,同一份文件过几分钟再引用就正常了。

中间走过弯路,把「文件超过单文件大小限制,被静默标记为失败」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。文件上传成功不代表解析完成,中间还有处理态;上传后没有轮询状态就直接发起对话;同名文件重复上传,引用到的是旧版本 id。

上传后拿到 file_id 并查询状态

curl https://api.moonshot.cn/v1/files/$FILE_ID -H "Authorization: Bearer $MOONSHOT_KEY"

轮询直到状态变成 processed 再使用

while s['status'] != 'processed': time.sleep(2); s = get_file(fid)

接着把 file_id 放进消息内容里引用

content = [{'type':'file','file_id': fid}]

剩下的就是对失败状态单独记录并重传

if s['status'] == 'failed': print('retry', fid)

怎么算真的好了,看的是同一批现象。文件状态变为 processed 后发起对话返回 200,回答里有 PDF 中的具体数字,批量任务也不会卡在解析态。

解析失败的文件状态同样是终态,轮询时要同时判断 failed,否则会一直等到超时,白白占住任务队列。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189