So, I made this code in order to maintain a conversation with memory using chat completions only. I could not do the same in a thread with a assistant previosly configurated. Does someone know how? I need to call the assistant, create the thread and maintain it trough the user interation in python console.
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)
I did this. It does not work as good as chat completions though.
There you go.
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()
New models in ChatGPT have been modified silently, with quite apparent tool-use post-training on using the memory, and the behavior has significantly changed.
The AI will try to produce refusals for things that attempt to alter behavior, and now phrases messages about you with the assumed tone “likes pizza with pineapple” instead of what might be instructed by the tool’s language or might be generally preserved about an ongoing chat scenario.
You can not place your own tools to replicate this model input or activate trained behavior, nor create tool recipients. You can only use functions. You aren’t meant to compete at the same level as OpenAI’s own product, apparently.
The message that the AI receives with memories is part of a system message, under a heading # model set context, with a date prefix in square brackets, so you can somewhat emulate the memories themselves with additional_instructions.
I cannot see why you’d want this particular ChatGPT behavior in most applications though, it is poor quality, and doubles the cost of getting a response.