1
resposta

Está dando um erro 'str' object has no attribute 'content'

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)

Imagem do erro quando eu envio uma mensagem ao chatbot

1 resposta

Olá Felipe! Tudo bem?

O erro que você está enfrentando, 'str' object has no attribute 'content', indica que você está tentando acessar o atributo content de um objeto que, na verdade, é uma string.

No trecho do código onde você tem:

texto_resposta = resposta.content[0].text.value

Parece que resposta já é uma string, e você está tentando acessar content como se fosse um objeto mais complexo.

Para corrigir isso, você pode tentar acessar diretamente o valor de resposta se ela for uma string. Por exemplo:

texto_resposta = resposta  # Se resposta já for a string desejada

Se resposta não for a string completa que você espera, você pode precisar verificar como está estruturado o objeto historico e garantir que você está acessando o elemento correto.

Peço que verifique se os códigos dos arquivos selecionar_persona.py, selecionar_documento.py e assistente_ecomart estão exatamente como no curso. É necessário que estejam certinhas para que o chatbot possa usar as informações e funcionalidades definidas neles. Caso o problema persista, peço que compartilhe todos os códigos que construiu no curso. Assim, poderei identificar mais facilmente a causa do problema.

Espero ter ajudado. Qualquer dúvida, compartilhe no fórum.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado