使用ChatGPT-4 Assistant API上传文件无扩展名致检索失败求助
解决OpenAI文件上传无扩展名导致的检索不支持错误
问题场景
基于Django DRF开发试卷生成AI,读取书籍文件生成试题时,文件上传成功并获取到file_id,Thread也创建完成,但关联文件到消息时触发错误:
Files with extensions [none] are not supported for retrieval
检查OpenAI存储发现,上传的文件没有扩展名,导致无法被检索。相关代码如下:
from openai import OpenAI import environ env =environ.Env() environ.Env.read_env() openai_api_key = env("OPENAI_API_KEY") client = OpenAI(api_key=openai_api_key) def generate_exam(prompt, the_file): assistant_id = env("ASSISTANT_ID") thread = client.beta.threads.create() print("Thread is created") # Upload file to OpenAI uploaded_file = client.files.create(file=the_file.read(), purpose='assistants') file_id = uploaded_file.id print("File is uploaded: " + file_id) # Create message with file attachment message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content=prompt, # Use the prompt directly as a string attachments=[ { "file_id": file_id, "tools": [{"type": "file_search"}] } ] ) print("Message is created") # Create and monitor run run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id, ) print("Run instance is created") # Polling for run completion while run.status != "completed": run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id ) print(f"Run status: {run.status}") # Retrieve and display messages after run completion messages = client.beta.threads.messages.list(thread_id=thread.id) response = "" for msg in messages.data: if msg.role == "assistant": response += msg.content[0].text.value + "\n" return response if response else "No response generated."
问题原因
上传文件时调用the_file.read()仅传递了文件内容,没有携带原文件的文件名(包含扩展名)。OpenAI的文件存储依赖扩展名判断是否支持检索,无扩展名的文件会被判定为不支持类型,触发上述错误。
解决方案
直接传递Django DRF上传的文件对象(the_file)给client.files.create的file参数,该对象包含完整的文件名和扩展名,OpenAI会自动识别并保留扩展名。
修改后的核心代码部分:
# Upload file to OpenAI - 修改此处,直接传递文件对象而非读取后的内容 uploaded_file = client.files.create(file=the_file, purpose='assistants') file_id = uploaded_file.id print("File is uploaded: " + file_id)
完整修改后的代码
from openai import OpenAI import environ env =environ.Env() environ.Env.read_env() openai_api_key = env("OPENAI_API_KEY") client = OpenAI(api_key=openai_api_key) def generate_exam(prompt, the_file): assistant_id = env("ASSISTANT_ID") thread = client.beta.threads.create() print("Thread is created") # Upload file to OpenAI - 直接传递文件对象,保留文件名和扩展名 uploaded_file = client.files.create(file=the_file, purpose='assistants') file_id = uploaded_file.id print("File is uploaded: " + file_id) # Create message with file attachment message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content=prompt, # Use the prompt directly as a string attachments=[ { "file_id": file_id, "tools": [{"type": "file_search"}] } ] ) print("Message is created") # Create and monitor run run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id, ) print("Run instance is created") # Polling for run completion while run.status != "completed": run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id ) print(f"Run status: {run.status}") # Retrieve and display messages after run completion messages = client.beta.threads.messages.list(thread_id=thread.id) response = "" for msg in messages.data: if msg.role == "assistant": response += msg.content[0].text.value + "\n" return response if response else "No response generated."
内容的提问来源于stack exchange,提问作者Code With Moha
相关产品推荐
相关产品推荐

