如何通过Python OpenAI API等待Assistant的实际回复?
OpenAI Assistant API 可靠等待回复的解决方案
问题场景
使用Python版本的OpenAI Assistant API时,整体功能正常,但偶尔会出现API返回用户发送的消息,而非助手回复的情况。初始实现代码如下:
from openai import OpenAI from os import environ OPEN_API_KEY = environ.get('OPEN_API_KEY') assistant_id = "xxxxxxx" client = OpenAI(api_key=OPEN_API_KEY) assistant = client.beta.assistants.retrieve(assistant_id) def ask_assistant(message_text): print(f'received message: {message_text}') thread = client.beta.threads.create() message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content=message_text ) run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id ) run_retrieve = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id ) messages = client.beta.threads.messages.list(thread.id) final_text = messages.data[0].content[0].text.value try: final_text = messages.data[0].content[0].text.value print(final_text) except Exception as e: print(e) final_text = '' return final_text if __name__ == "__main__": ask_assistant('How are you?')
目前采用添加3秒休眠的临时修复方法,虽能生效但不够可靠,也不是最优解,需要找到能可靠等待助手完成回复的方法。
可行解决方案
通过轮询Run的状态,直到其变为completed后再获取消息,即可确保拿到助手的回复。验证有效的代码如下:
from openai import OpenAI from os import environ OPEN_API_KEY = environ.get('xxxxx') assistant_id = "xxxxx" client = OpenAI(api_key=OPEN_API_KEY) assistant = client.beta.assistants.retrieve(assistant_id) def get_answer(run, thread): while not run.status == "completed": print("Waiting for answer...") run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id ) messages = client.beta.threads.messages.list(thread.id) answer = messages.data[0].content[0].text.value try: answer = messages.data[0].content[0].text.value except Exception as e: print(e) answer = '' return answer def ask_assistant(message_text): print(f'sending to assistant: {message_text}') thread = client.beta.threads.create() message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content=message_text ) run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id ) answer = get_answer(run, thread) print(f'assistant response: {answer}') return answer if __name__ == "__main__": ask_assistant('Hello')
方案说明
初始代码的问题在于创建Run后立即调用messages.list,此时助手还未完成回复,线程中只有用户发送的消息,因此会返回用户自己的内容。而新方案通过循环检查Run的状态,直到状态变为completed(表示助手已完成回复),再去获取消息,就能确保拿到的是助手的回复。
内容的提问来源于stack exchange,提问作者chrischma
相关产品推荐
相关产品推荐

