Search code examples
pythonopenai-api

How can i wait for the actual reply of an openai-assistant? (Python OpenAI API)


I am interacting with the openai assistant API (python). so far, it works well. but sometimes the api returns the message i sent to the assistant instead of the assistants reply.

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?')

as a hot fix, i implemented a sleep function that waits for 3 seconds before retrieving the reply. this works, but i don't expect it to be the best solution (or reliable at all). any ideas how to wait until the assistant REALLY replied?

thank you very much.

Update:

This works:

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')

Solution

  • This should work:

    run = openai.beta.threads.runs.create(
      thread_id=thread.id,
      assistant_id=assistant.id
    )
    print(run)
    
    
    while run.status !="completed":
      run = openai.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id
      )
      print(run.status)
    
    messages = openai.beta.threads.messages.list(
      thread_id=thread.id
    )
    
    print(messages.data[0].content[0].text.value)
    

    Thanks to @joyasree78