在 thread 的消息里挂 attachments,指定 file_id 与 tools 为 file_search,提交后 400,原文 No file found for the given ID,文件列表里这个 id 明明还在。

一开始怀疑是「附件只对 code_interpreter 与 file_search 两类工具有效」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。附件里的文件必须属于同一个项目,跨项目不可见。也可能是文件要用 assistants 用途上传,purpose 不对会被拒。

少数情况下是id 前缀是 file-,容易和向量库的 vs- 混着传。

先查这个文件的用途与状态

curl -s https://api.openai.com/v1/files/file-abc -H "Authorization: Bearer $OPENAI_API_KEY" | jq '.purpose,.status'

再往下用 assistants 用途重新上传

curl https://api.openai.com/v1/files -H "Authorization: Bearer $OPENAI_API_KEY" -F purpose=assistants -F file=@doc.pdf

带附件发消息并指定检索工具

curl https://api.openai.com/v1/threads/thr_abc/messages -H "Authorization: Bearer $OPENAI_API_KEY" -H "OpenAI-Beta: assistants=v2" -H "Content-Type: application/json" -d '{"role":"user","content":"总结附件","attachments":[{"file_id":"file-abc","tools":[{"type":"file_search"}]}]}'

末了确认线程消息里附件已挂上

curl -s "https://api.openai.com/v1/threads/thr_abc/messages?limit=1" -H "Authorization: Bearer $OPENAI_API_KEY" -H "OpenAI-Beta: assistants=v2" | jq '.data[0].attachments'

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

改完先别撤,确认这几项。消息创建返回 200 且 attachments 里能看到 file_id 与工具类型,run 完成后回答能引用附件内容,不再报找不到文件。

补一句。attachments 是消息级的临时挂载,和向量库的长期索引是两套机制,文件多大、要不要切块,选之前先想清楚用途。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189