使用OpenAI Assistants API开发聊天机器人遇Thread属性错误
解决OpenAI Assistants API中Thread属性不存在的问题
问题描述
使用OpenAI Assistants API开发聊天机器人时,集成Thread功能调用openai.Thread.create创建线程,触发AttributeError,提示'openai'模块没有'Thread'属性。
原代码
import openai openai.api_key = "my_key" def my_chatbot(user_input, assistant_id): thread_id = openai.Thread.create(assistant=assistant_id)["id"] openai.Message.create( thread=thread_id, role="user", content=user_input ) run = openai.Run.create( thread=thread_id, assistant=assistant_id ) messages = openai.Message.list(thread=thread_id) return messages["data"][-1]["content"] if __name__ == "__main__": assistant_id = "my_id" while True: user_input = input("Você: ") if user_input.lower() in ["sair", "fechar"]: break chatbot_response = my_chatbot(user_input, assistant_id) print("Chatbot:", chatbot_response)
报错信息
Traceback (most recent call last): File "/Users/felipestoker/PycharmProjects/chatbot/main.py", line 34, in <module> chatbot_response = chatbot_webjasper(user_input, assistant_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/felipestoker/PycharmProjects/chatbot/main.py", line 8, in chatbot_webjasper thread_id = openai.Thread.create(assistant=assistant_id)["id"] ^^^^^^^^^^^^^ AttributeError: module 'openai' has no attribute 'Thread'
问题原因
- SDK版本与API路径错误:OpenAI Assistants API属于beta功能,对应的Python SDK接口位于
openai.beta命名空间下,而非根模块openai。直接调用openai.Thread会找不到对应属性。 - Thread创建参数错误:创建Thread时不需要传入
assistant参数,Thread是独立的会话容器,Run操作时才需要关联助理ID。 - 异步处理缺失:原代码未等待Run执行完成就获取消息,此时助理还未生成回复,无法拿到正确结果。
修正方案
1. 升级OpenAI SDK
确保安装最新版本的openai包:
pip install --upgrade openai
2. 修正后的代码
import openai import time openai.api_key = "my_key" def my_chatbot(user_input, assistant_id): # 创建线程(无需assistant参数) thread = openai.beta.threads.create() thread_id = thread.id # 添加用户消息到线程 openai.beta.threads.messages.create( thread_id=thread_id, role="user", content=user_input ) # 创建并启动Run run = openai.beta.threads.runs.create( thread_id=thread_id, assistant_id=assistant_id ) # 轮询等待Run完成 while run.status != "completed": time.sleep(1) run = openai.beta.threads.runs.retrieve( thread_id=thread_id, run_id=run.id ) # 获取线程中的所有消息 messages = openai.beta.threads.messages.list(thread_id=thread_id) # 助理消息位于列表开头(按创建时间倒序),取第一个的内容 return messages.data[0].content[0].text.value if __name__ == "__main__": assistant_id = "my_id" while True: user_input = input("Você: ") if user_input.lower() in ["sair", "fechar"]: break chatbot_response = my_chatbot(user_input, assistant_id) print("Chatbot:", chatbot_response)
关键说明
- 使用
openai.beta.threads、openai.beta.threads.messages、openai.beta.threads.runs路径调用对应接口,这是Assistants API的标准调用方式。 - 创建Thread时无需绑定助理,一个Thread可以关联多个助理,或多次关联同一个助理。
- 必须等待Run状态变为
completed后再获取消息,否则无法拿到助理生成的回复。
内容的提问来源于stack exchange,提问作者Felipe Viero Goulart
相关产品推荐
相关产品推荐

