3
respostas

Erro ai pergun tar ao chat! Q erro é esse?

"http://www.w3.org/TR/html4/loose.dtd">
type="text/css">
href="?__debugger__=yes&cmd=resource&f=console.png">
AttributeError
AttributeError: 'str' object has no attribute 'choices'
Traceback (most recent call last)
File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 2464,
in __call__

return self.wsgi_app(environ, start_response)

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 2450,
in wsgi_app

response = self.handle_exception(e)

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 1867,
in handle_exception

reraise(exc_type, exc_value, tb)

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\_compat.py",
line 39,
in reraise

raise value

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 2447,
in wsgi_app
response = self.full_dispatch_request()

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 1952,
in full_dispatch_request

rv = self.handle_user_exception(e)

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 1821,
in handle_user_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\_compat.py",
line 39,
in reraise

raise value

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 1950,
in full_dispatch_request
rv = self.dispatch_request()

File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py",
line 1936,
in dispatch_request

return self.view_functions[rule.endpoint](**req.view_args)

File "C:\chatbot\app.py",
line 55,
in chat

texto_resposta = resposta.choices[0].message.content

AttributeError: 'str' object has no attribute 'choices'

This is the Copy/Paste friendly version of the traceback.

Traceback (most recent call last):<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 2464, in __call__<br>    return self.wsgi_app(environ, start_response)<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 2450, in wsgi_app<br>    response = self.handle_exception(e)<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 1867, in handle_exception<br>    reraise(exc_type, exc_value, tb)<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\_compat.py", line 39, in reraise<br>    raise value<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 2447, in wsgi_app<br>    response = self.full_dispatch_request()<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request<br>    rv = self.handle_user_exception(e)<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception<br>    reraise(exc_type, exc_value, tb)<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\_compat.py", line 39, in reraise<br>    raise value<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request<br>    rv = self.dispatch_request()<br>  File "C:\Users\laioc\anaconda3\Lib\site-packages\flask\app.py", line 1936, in dispatch_request<br>    return self.view_functions[rule.endpoint](**req.view_args)<br>  File "C:\chatbot\app.py", line 55, in chat<br>    texto_resposta = resposta.choices[0].message.content<br>AttributeError: 'str' object has no attribute 'choices'

The debugger caught an exception in your WSGI application. You can now
look at the traceback which led to the error.
If you enable JavaScript you can also use additional features such as code
execution (if the evalex feature is enabled), automatic pasting of the
exceptions and much more.

Brought to you by DON'T PANIC, your
friendly Werkzeug powered traceback interpreter.
-----------------------------------------------------------
3 respostas

Olá, Laio! Tudo bem?

O erro AttributeError: 'str' object has no attribute 'choices' indica que você está tentando acessar o atributo 'choices' de um objeto do tipo 'str' (string), que não possui esse atributo.

Ou seja, a variável 'resposta' que você está tentando acessar como se fosse um objeto com o atributo 'choices' é, na verdade, uma string.

Vamos a um exemplo prático para entender melhor:

resposta = "Olá, eu sou uma string"
print(resposta.choices)

Esse código retornará um erro similar ao seu, porque strings não têm um atributo 'choices'.

A solução para o seu problema depende do que você esperava que a variável 'resposta' fosse. Se 'resposta' deveria ser um objeto com o atributo 'choices', então você precisa verificar onde essa variável é definida e por que ela está se tornando uma string.

Se a 'resposta' é esperada ser uma string, então você precisa revisar o seu código para não tentar acessar 'choices' em uma string. Caso tenha problemas em fazer essa analisem peço que compartilhe o seu código para que eu possa ajudá-lo.

Espero ter ajudado e bons estudos!

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

Olá, Armano. Agradeço seu retorno. É o mesmo código da aula. Ao menos eu verifiquei e parece esta tudo ok.

Segue código.

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 *

load_dotenv()

cliente = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
modelo = "gpt-3.5-turbo"

app = Flask(__name__)
app.secret_key = 'alura'

contexto = carrega("dados/ecomart.txt")

def bot(prompt):
    maximo_tentativas = 1
    repeticao = 0

    while True:
        try:
            prompt_do_sistema = f"""
            Você é um chatbot de atendimento a clientes de um e-commerce. 
            Você não deve responder perguntas que não sejam dados do ecommerce informado!
            Você deve gerar respostas utilizando o contexto abaixo.
            
            # Contexto
            {contexto}
            """
            response = cliente.chat.completions.create(
                messages=[
                        {
                                "role": "system",
                                "content": prompt_do_sistema
                        },
                        {
                                "role": "user",
                                "content": prompt
                        }
                ],
                temperature=1,
                max_tokens=300,
                top_p=1,
                frequency_penalty=0,
                presence_penalty=0,
                model = modelo)
            return response
        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)
    if isinstance(resposta, str):
        return resposta
    else:
        texto_resposta = resposta.choices[0].message.content
        return texto_resposta


@app.route("/")
def home():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(debug = True)

Bom dia, Laio!

Analisando o seu código e comparando com o foi disponibilizado em aula, notei uma diferença que quando comparada com o seu erro inicial pode explicar porque esse erro está acontecendo.

O problema em questão acontece na sua função chat, mais especificamente, quando você faz o seguinte retorno:

else:
        texto_resposta = resposta.choices[0].message.content
        return texto_resposta

Já que o método choices não está presente na resposta. Então, ele precisaria estar da seguinte forma:

    else:
        texto_resposta = resposta.content[0].text.value
        return texto_resposta

Faça essa mudança no seu código e veja se resolve a sua situação. Caso o problema se mantenha, peço que diga qual a aula em questão você estava quando recebeu esse erro.

Bons estudos!