Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

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

Estou com este erro na aplicação, já revisei várias vezes e comparei com o código da aula, pesquisei a documentação da API para verificar se tinha mudado a maneira da chamada mas ainda não consegui resolver, conseguem dar uma ajuda?

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("chave"))
modelo = "gpt-4"

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

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 e-commerce 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)
    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)
2 respostas
solução!

Olá, Natan! Como vai?

Esse tipo de erro, geralmente, ocorre quando você tenta acessar um atributo ou método que não existe para o tipo de objeto específico.

No seu caso, parece que o erro está ocorrendo na linha onde você está tentando acessar o atributo 'choices' de um objeto 'str'. Isso acontece na linha texto_resposta = resposta.choices[0].message.content.

O problema aqui é que a função bot(prompt) pode retornar uma string em caso de exceção, como você definiu aqui:

except Exception as erro:
    repeticao += 1
    if repeticao >= maximo_tentativas:
        return "Erro no GPT: %s" % erro

Nesse caso, a variável resposta se torna uma string e, portanto, não tem o atributo 'choices'.

Uma maneira de resolver isso seria verificar o tipo da resposta antes de tentar acessar o atributo 'choices'. Por exemplo:

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

Dessa forma, se a resposta for uma string (ou seja, ocorreu um erro), você retornará a mensagem de erro diretamente. Caso contrário, você tentará acessar o atributo 'choices' como antes.

Espero ter ajudado e bons estudos!

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

Oi! Resolveu aqui quando alterei o modelo.

modelo = "gpt-3.5-turbo"

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software