You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:27:46