Esse é o código do arquivo app.py :
from flask import Flask,render_template, request, Response
from openai import OpenAI
from dotenv import load_dotenv
import os
from time import sleep
from helpers import *
from selecionar_persona import *
from selecionar_documento import *
from assistente_ecomart import *
load_dotenv()
cliente = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
modelo = "gpt-4"
app = Flask(__name__)
app.secret_key = 'alura'
# Cria um novo assistente através do método pegar_json.
assistente = pegar_json()
# Acessando a thread_id do json.
thread_id = assistente["thread_id"]
# Pegando o atributo assisant_id do json.
assistente_id = assistente["assistant_id"]
# Pegando a lista de arquivos do metadados
file_ids = assistente["file_ids"]
def bot(prompt):
maximo_tentativas = 1
repeticao = 0
while True:
try:
# Camada que traz a personalidade do assistente.
personalidade = personas[selecionar_persona(prompt)]
# Acessa a camada de mensagens da thread e cria uma nova mensagem que vai ser interpretada pelo assistente para chegar a resposta
# Responsável por garantir que essa persona seja associada.
cliente.beta.threads.messages.create(
thread_id=thread_id,
role = "user",
content = f"""
Assuma, de agora em diante, a personalidade abaixo.
Ignore as personalidades anteriores.
# Persona
{personalidade}
""",
file_ids=file_ids
)
# Criar uma mensagem que vai ser associada a uma thread. Essa mensagem é a pergunta que o usuário fez para o assistente.
cliente.beta.threads.messages.create(
thread_id=thread_id,
role = "user",
content = prompt,
file_ids=file_ids
)
# Execução da thread. Passando o parâmetro thread que vai manter o histórico de mensagens e o identificador do assistente que vai responder a essa thread.
run = cliente.beta.threads.runs.create(
thread_id=thread_id,
assistant_id=assistente_id
)
# Só demonstra a a resposta quando o status da execução for "completed". Enquanto o status da execução for diferente de "completed", o código vai ficar em loop, esperando a resposta do assistente.
# Passar a thread que precisa observar e a execução que está sendo realizada. Quando o status for alterado, ai consegue acessar a resposta.
while run.status !="completed":
run = cliente.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run.id
)
# Guarda todas as informações que podem ser acessadas pelo assistente em cima de uma thread.
historico = list(cliente.beta.threads.messages.list(thread_id=thread_id).data)
resposta = historico[0]
return resposta
except Exception as erro:
repeticao += 1
if repeticao >= maximo_tentativas:
return "Erro no GPT: %s" % erro
print('Erro de comunicação com OpenAI:', erro)
sleep(1)
@app.route("/chat", methods=["POST"])
def chat():
prompt = request.json["msg"]
resposta = bot(prompt)
# Resposta que tem um formato com relação ao assistente.
texto_resposta = resposta.content[0].text.value
return texto_resposta
@app.route("/")
def home():
return render_template("index.html")
if __name__ == "__main__":
app.run(debug = True)