2
respostas

Erro executar a criação do teste com thread

Pessoal, quando executo a criação do arquivo após a alteração de criação de thread, estou recebendo o erro abaixo:

Apagando arquivos gerados ...
Traceback (most recent call last):
Erro no arquivo: main.py"
assistente = criar_assistente(lista_ids_arquivos=lista_ids_arquivos)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Erro no arquivo: assistente_projeto.py"
assistente = cliente.beta.assistants.create(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Assistants.create() got an unexpected keyword argument 'file_ids'

During handling of the above exception, another exception occurred:

Erro no arquivo: main.py"
apagar_assistente(assistant_id=assistente.id)
^^^^^^^^^^
UnboundLocalError: cannot access local variable 'assistente' where it is not associated with a value

Esse erro acontece mesmo quando fiz o download do arquivo do curso e executei a main, isso acontece devido a versão da api da openai que estou usando? Se for, qual é a correta?

Versão da API da OpenAI utilizada na minha máquina: 1.97.0

Se for por outro, se puderem me ajudar por favor.

Obrigado.

2 respostas

Olá, Leonardo!

Obrigado por compartilhar o erro de forma tão detalhada. Sua suspeita está correta, e é um problema bastante comum em projetos que usam APIs que evoluem rapidamente, como a da OpenAI.

O erro TypeError: Assistants.create() got an unexpected keyword argument 'file_ids' indica que a sua versão da biblioteca da OpenAI (1.97.0) não aceita mais o parâmetro file_ids na função client.beta.assistants.create(). Isso acontece porque, em versões mais recentes, o processo de anexar arquivos a um assistente foi alterado.

A solução é usar o parâmetro tool_resources para anexar o arquivo. Em vez de passar file_ids diretamente, você precisa criar uma lista de FileSearch ou de CodeInterpreter e anexá-la ao assistente.

A nova forma de criar o assistente seria algo parecido com isto (adaptando ao seu código):

assistente = cliente.beta.assistants.create(
    name="Seu assistente",
    instructions="Suas instruções...",
    model="gpt-4o",  # Ou o modelo que você estiver usando
    tools=[{"type": "file_search"}],
    tool_resources={
        "file_search": {
            "vector_stores": [
                {
                    "file_ids": lista_ids_arquivos
                }
            ]
        }
    }
)

Sobre o UnboundLocalError: Esse erro (cannot access local variable 'assistente' where it is not associated with a value) é uma consequência do primeiro. Como a chamada para cliente.beta.assistants.create() falhou, a variável assistente nunca foi criada, e por isso não é possível acessá-la mais tarde na função apagar_assistente(). Corrigindo o primeiro erro, o segundo será resolvido automaticamente.

Então, a solução é atualizar o seu código para a nova sintaxe da API.

Espero que isso ajude a resolver o seu problema! Me avise se funcionar.

Olá João, tudo bem? Obrigado pelo retorno.

Tentei realizar a alteração no arquivo assistente_projeto.py, porém, retornou a mensagem de erro abaixo:

Digite um caso de uso: Ana deseja realizar login na plataforma AcordeLab
Deu erro:  Error code: 400 - {'error': {'message': "Invalid value: 'retrieval'. Supported values are: 'code_interpreter', 'function', and 'file_search'.", 'type': 'invaion', and 'file_search'.", 'type': 'invalid_request_error', 'param': 'tools[0].type', 'code': 'invalid_value'}}
Apagando arquivos gerados ...

Minha alteração está no arquivo correto? Vou enviar todo o código desse arquivo:

from openai import OpenAI
from tools import *
from dotenv import load_dotenv
import os

load_dotenv()

cliente = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def apagar_assistente(assistant_id):
    cliente.beta.assistants.delete(assistant_id)

def apagar_thread(thread_id):
    cliente.beta.threads.delete(thread_id)

def apagar_arquivos(lista_ids_arquivos):
    for um_id in lista_ids_arquivos:
        cliente.files.delete(um_id)

def criar_thread():
    return cliente.beta.threads.create()

def criar_assistente(lista_ids_arquivos=[], modelo =MODELO_GPT_4):
    assistente = cliente.beta.assistants.create(
        name="Atendente Eng. Software",
        instructions = f"""
            Assuma que você é um assistente virtual especializado em orientar desenvolvedores e QA testers na criação de testes automatizados para aplicações web usando Python e Selenium. 
            
            Você deve oferecer suporte abrangente, desde o setup inicial do ambiente de desenvolvimento até a implementação 
            de testes complexos, adotando e consultando principalmente os documentos de sua
            base (para identificar padrões e formas de estruturar os scripts solicitados).

            Consulte sempre os arquivos html, css e js para elaborar um teste.
            
            Adicionalmente, você deve ser capaz de explicar conceitos chave de 
            testes automatizados e Selenium, fornecer templates de código personalizáveis, e oferecer feedback sobre scripts de teste escritos pelo usuário. 

            O objetivo é facilitar o aprendizado e a aplicação de testes automatizados, 
            melhorando a qualidade e a confiabilidade das aplicações web desenvolvidas.

            Caso solicitado a gerar um script, apenas gere ele sem outros comentários adicionais.

            Você também é um especialista em casos de uso, seguindo os templates indicados.
            E também é um especialista em gerar cenários de teste.
                """,
        model=modelo,
        tools=[{"type": "file_search"}],
        tool_resources={
            "file_search": {
                "vector_stores": [
                    {
                        "file_ids": lista_ids_arquivos
                    }
                ]
            }
        }
    )

    return assistente

def criar_lista_ids_app_web(diretorio = "AcordeLab"):
    lista_ids_arquivos = []
    dicionario_arquivos = {}

    for caminho_diretorio, nomes_diretorios, nomes_arquivos in os.walk(diretorio):
        arquivos_web = [f for f in nomes_arquivos if f.endswith(('.html', '.css', '.js'))]
        
        for arquivo in arquivos_web:
            caminho_completo = os.path.join(caminho_diretorio, arquivo)
            with open(caminho_completo, 'rb') as arquivo_aberto:
                web_file = cliente.files.create(
                    file=arquivo_aberto,
                    purpose="assistants"
                )
                lista_ids_arquivos.append(web_file.id)
                dicionario_arquivos[arquivo] = web_file.id

    caminho_arquivo = "documentos/exemplos_caso_uso.txt"
    nome_arquivo = os.path.basename(caminho_arquivo)
    arquivo_exemplo_caso = cliente.files.create(
        file=open(caminho_arquivo, "rb"),
        purpose="assistants"
    )

    lista_ids_arquivos.append(arquivo_exemplo_caso.id)
    dicionario_arquivos[nome_arquivo] = arquivo_exemplo_caso.id

    return lista_ids_arquivos, dicionario_arquivos