2
respostas

Problema com a API do assistente na openai.

Então, fiz esse código para manter uma conversa com a memória usando apenas preenchimentos de chat. Não consegui fazer o mesmo em um thread com um assistente previamente configurado. Alguém sabe como? Preciso chamar o assistente, criar o thread e mantê-lo através da interação do usuário no console python.

from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
cliente = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
modelo = "gpt-4o"

prompt_sistema = """Você é uma assistente..."""

def salvar_historico(mensagem):
    with open("historico_conversa4.json", "a") as historico:
        historico.write(mensagem + "\n")

def main(prompt_sistema, prompt_usuario):
    resposta = cliente.chat.completions.create(
        messages=[
            {
                "role": "system",
                "content": prompt_sistema
            },
            {
                "role": "user",
                "content": prompt_usuario
            }
        ], 
        model=modelo,
        temperature=0.95    
    )
    return resposta


    
def recycle(prompt_sistema, resposta):
    while True:
        prompt_usuario = input('Me atualize com detalhes sobre o caso atual ou digite "sair" para encerrar: ')
        
        if prompt_usuario.lower() == "sair":
            print("Conversa encerrada.")
            break
        
        # Salva a entrada do usuário no histórico
        salvar_historico("Usuário: " + prompt_usuario)
        
        prompt_sistema = f"resposta anterior: {resposta.choices[0].message.content}\n\n" + prompt_sistema
        
        resposta = main(prompt_sistema, prompt_usuario)
        
        # Salva a resposta do sistema no histórico
        salvar_historico("Eva: " + resposta.choices[0].message.content)
        
        print(resposta.choices[0].message.content)
        
    return prompt_sistema, resposta


# Executa a primeira interação
prompt_usuario = input('Digite o caso clínico com detalhes.')
resposta = main(prompt_sistema, prompt_usuario)

# Salva a entrada inicial do usuário no histórico
salvar_historico("Usuário: " + prompt_usuario)

# Salva a primeira resposta no histórico
salvar_historico("Eva: " + resposta.choices[0].message.content)

print(resposta.choices[0].message.content)

# Executa o ciclo de reciclagem em loop
prompt_sistema, resposta = recycle(prompt_sistema, resposta)
2 respostas

Fiz essa solução. Porém, claramente não funciona tão bem quanto o método chat completions. Imagino que no GPT-5 isso fique melhor alinhado.

import time
from openai import OpenAI
from dotenv import load_dotenv
import os

# Carregar as variáveis de ambiente
load_dotenv()

# Cliente da OpenAI com chave de API
cliente = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# Definir o ID do assistente criado na plataforma OpenAI
assistente_id = "-------"  # Substitua pelo ID do seu assistente

# Criar uma nova thread para a conversa
thread_vazia = cliente.beta.threads.create()
print(f"Thread criada: {thread_vazia.id}")

# Função para enviar mensagens e processar respostas
def enviar_mensagem(mensagem_usuario, thread_id):
    # Enviar mensagem do usuário para a thread
    cliente.beta.threads.messages.create(
        thread_id=thread_id,
        role="user",
        content=mensagem_usuario
    )

    # Executar o assistente e obter a resposta
    run = cliente.beta.threads.runs.create(
        thread_id=thread_id,
        assistant_id=assistente_id
    )
    
    # Tentar recuperar a última mensagem da thread com retries
    for _ in range(5):  # Tentar até 5 vezes
        time.sleep(2)  # Aguardar 2 segundos antes de tentar novamente
        mensagens_thread = cliente.beta.threads.messages.list(thread_id)

        # Procurar a resposta da Eva
        for mensagem in mensagens_thread.data:
            if mensagem.role == "assistant":
                if isinstance(mensagem.content, list):
                    resposta = "\n".join([bloco.text.value for bloco in mensagem.content if bloco.type == 'text'])
                else:
                    resposta = mensagem.content
                
                # Retorna a resposta se encontrada
                if resposta:
                    return resposta

    # Se não encontrar uma resposta válida após 5 tentativas
    return "Desculpe, não consegui gerar uma resposta no momento."

# Função para interagir com o usuário e manter a conversa
def iniciar_conversa():
    print("Eva: Digite o caso clínico com detalhes.")
    mensagem_usuario = input("Usuário: ")
    
    # Primeira interação
    resposta_eva = enviar_mensagem(mensagem_usuario, thread_vazia.id)
    print(f"Eva: {resposta_eva}")

    while True:
        mensagem_usuario = input("Usuário: ")
        
        if mensagem_usuario.lower() == "sair":
            print("Eva: Caso encerrado. Gerando resumo do caso.")
            resumo_json = enviar_mensagem("Caso encerrado", thread_vazia.id)
            print(resumo_json)
            break
        
        # Responder com as novas atualizações
        resposta_eva = enviar_mensagem(mensagem_usuario, thread_vazia.id)
        print(f"Eva: {resposta_eva}")

# Iniciar a conversa
iniciar_conversa()

valeu por compartilhar!!