from app.db.database import SessionLocal from app.repositories.tool_repository import ToolRepository def get_tools_definitions(): """Retorna as definicoes padrao de tools usadas para seed e sincronizacao.""" return [ { "name": "consultar_estoque", "description": ( "Use esta ferramenta para consultar veiculos disponiveis no estoque. " "Voce pode filtrar por preco maximo e categoria, e tambem ordenar por " "preco para descobrir o carro mais barato (asc + limite=1) ou mais " "caro (desc + limite=1)." ), "parameters": { "type": "object", "properties": { "preco_max": { "type": "number", "description": "Preco maximo do veiculo em reais (BRL). Opcional.", }, "categoria": { "type": "string", "description": "Categoria do veiculo, por exemplo: Hatch, Sedan, SUV. Opcional.", }, "ordenar_preco": { "type": "string", "description": "Ordenacao do preco. Use 'asc' para mais barato e 'desc' para mais caro.", }, "limite": { "type": "integer", "description": "Quantidade maxima de veiculos retornados.", }, }, "required": [], }, }, { "name": "validar_cliente_venda", "description": ( "Use esta ferramenta quando precisar avaliar se o cliente pode financiar " "um veiculo especifico. Ela recebe o CPF e o valor do veiculo, consulta " "um score simulado e retorna se o cliente esta aprovado ou reprovado " "para a compra, juntamente com o score e um limite de credito estimado." ), "parameters": { "type": "object", "properties": { "cpf": { "type": "string", "description": "CPF do cliente, com ou sem formatacao (apenas digitos tambem e aceito).", }, "valor_veiculo": { "type": "number", "description": "Valor do veiculo em reais (BRL) que o cliente deseja comprar.", }, }, "required": ["cpf", "valor_veiculo"], }, }, { "name": "avaliar_veiculo_troca", "description": ( "Use esta ferramenta quando o cliente quiser saber quanto o carro dele " "vale como entrada em uma negociacao. Ela recebe modelo, ano e " "quilometragem do veiculo atual e devolve um valor estimado de avaliacao " "para troca, ja considerando depreciacao por ano e quilometragem." ), "parameters": { "type": "object", "properties": { "modelo": { "type": "string", "description": "Modelo do veiculo que o cliente deseja oferecer na troca (por exemplo, 'Toyota Corolla').", }, "ano": { "type": "integer", "description": "Ano de fabricacao do veiculo do cliente.", }, "km": { "type": "integer", "description": "Quilometragem atual do veiculo do cliente.", }, }, "required": ["modelo", "ano", "km"], }, }, { "name": "agendar_revisao", "description": ( "Use esta ferramenta quando o cliente quiser marcar uma revisao ou " "manutencao para o veiculo. Ela recebe a placa, data/hora desejada, " "modelo, ano, quilometragem e se ja houve revisao anterior na " "concessionaria. Com esses dados, calcula o valor da revisao e cria " "um agendamento simulado. Nao permite dois agendamentos no mesmo " "horario; se o horario estiver ocupado, devolve sugestao do proximo " "horario disponivel." ), "parameters": { "type": "object", "properties": { "placa": { "type": "string", "description": "Placa do veiculo que sera levado para revisao.", }, "data_hora": { "type": "string", "description": ( "Data e hora desejada para a revisao. Aceita formatos como " "'2026-03-10T09:00:00-03:00', '2026-03-10 09:00', " "'10/03/2026 09:00' e '10/03/2026 as 09:00'." ), }, "modelo": { "type": "string", "description": "Modelo do veiculo (por exemplo: Onix, Corolla, Compass).", }, "ano": { "type": "integer", "description": "Ano do veiculo.", }, "km": { "type": "integer", "description": "Quilometragem atual do veiculo.", }, "revisao_previa_concessionaria": { "type": "boolean", "description": "Informe true se o veiculo ja fez revisao na concessionaria, senao false.", }, }, "required": [ "placa", "data_hora", "modelo", "ano", "km", "revisao_previa_concessionaria", ], }, }, { "name": "listar_agendamentos_revisao", "description": ( "Use esta ferramenta quando o cliente quiser ver os agendamentos de " "revisao que ele possui. Permite filtrar por placa, status e quantidade " "maxima de itens retornados." ), "parameters": { "type": "object", "properties": { "placa": { "type": "string", "description": "Placa do veiculo para filtrar os agendamentos. Opcional.", }, "status": { "type": "string", "description": "Status para filtrar (por exemplo: agendado, cancelado). Opcional.", }, "limite": { "type": "integer", "description": "Quantidade maxima de agendamentos retornados. Opcional.", }, }, "required": [], }, }, { "name": "cancelar_agendamento_revisao", "description": ( "Use esta ferramenta quando o cliente quiser cancelar um agendamento de " "revisao existente. Ela recebe o protocolo do agendamento e opcionalmente " "um motivo informado pelo cliente." ), "parameters": { "type": "object", "properties": { "protocolo": { "type": "string", "description": "Protocolo do agendamento de revisao que sera cancelado.", }, "motivo": { "type": "string", "description": "Motivo do cancelamento informado pelo cliente. Opcional.", }, }, "required": ["protocolo"], }, }, { "name": "editar_data_revisao", "description": ( "Use esta ferramenta quando o cliente quiser remarcar a data/hora de um " "agendamento de revisao. Se o horario estiver ocupado, retorna sugestao " "do proximo horario disponivel." ), "parameters": { "type": "object", "properties": { "protocolo": { "type": "string", "description": "Protocolo do agendamento de revisao que sera remarcado.", }, "nova_data_hora": { "type": "string", "description": ( "Nova data e hora desejada para a revisao. Aceita formatos como " "'2026-03-10T09:00:00-03:00', '2026-03-10 09:00', " "'10/03/2026 09:00' e '10/03/2026 as 09:00'." ), }, }, "required": ["protocolo", "nova_data_hora"], }, }, { "name": "realizar_pedido", "description": ( "Use esta ferramenta quando o cliente quiser efetivar uma compra/pedido. " "Ela recebe CPF e o identificador do veiculo escolhido no estoque, valida " "credito com base no preco real do carro e, se aprovado, cria um novo pedido " "com numero unico." ), "parameters": { "type": "object", "properties": { "cpf": { "type": "string", "description": "CPF do cliente, com ou sem formatacao.", }, "vehicle_id": { "type": "integer", "description": "Codigo do veiculo escolhido no estoque.", }, }, "required": ["cpf", "vehicle_id"], }, }, { "name": "listar_pedidos", "description": ( "Use esta ferramenta quando o cliente quiser listar ou consultar os pedidos " "que ja possui. Ela retorna os pedidos do usuario autenticado, com numero, " "veiculo, valor e status, e tambem pode filtrar por status quando necessario." ), "parameters": { "type": "object", "properties": { "cpf": { "type": "string", "description": "CPF do cliente quando for necessario filtrar manualmente. Opcional.", }, "status": { "type": "string", "description": "Status do pedido para filtrar, por exemplo 'Ativo' ou 'Cancelado'. Opcional.", }, "limite": { "type": "integer", "description": "Quantidade maxima de pedidos retornados. Opcional.", }, }, "required": [], }, }, { "name": "cancelar_pedido", "description": ( "Use esta ferramenta quando o cliente solicitar o cancelamento de um " "pedido ja registrado. Ela recebe o numero do pedido e o motivo do " "cancelamento, atualiza o status para 'Cancelado' e retorna os detalhes " "do cancelamento para que voce explique o resultado ao cliente." ), "parameters": { "type": "object", "properties": { "numero_pedido": { "type": "string", "description": "Numero do pedido que o cliente deseja cancelar.", }, "motivo": { "type": "string", "description": "Motivo do cancelamento informado pelo cliente (por exemplo, atraso, mudanca de planos, condicao de pagamento, etc.).", }, }, "required": ["numero_pedido", "motivo"], }, }, { "name": "consultar_frota_aluguel", "description": ( "Use esta ferramenta quando o cliente quiser consultar carros disponiveis para locacao. " "Ela retorna a frota de aluguel separada da frota de venda e permite filtrar por " "categoria, modelo, valor maximo da diaria e status." ), "parameters": { "type": "object", "properties": { "categoria": { "type": "string", "description": "Categoria do veiculo para locacao, por exemplo hatch, sedan, suv ou pickup.", }, "modelo": { "type": "string", "description": "Trecho do nome do modelo desejado para locacao. Opcional.", }, "valor_diaria_max": { "type": "number", "description": "Valor maximo da diaria em reais para filtrar a frota.", }, "status": { "type": "string", "description": "Status da frota para filtrar. Por padrao, consulte veiculos disponiveis.", }, "ordenar_diaria": { "type": "string", "description": "Ordenacao por diaria. Use 'asc' para menor diaria e 'desc' para maior diaria.", }, "limite": { "type": "integer", "description": "Quantidade maxima de veiculos retornados. Opcional.", }, }, "required": [], }, }, { "name": "abrir_locacao_aluguel", "description": ( "Use esta ferramenta quando o cliente quiser iniciar uma locacao de carro. " "Ela recebe a placa ou o identificador do veiculo da frota de aluguel, data inicial, " "data final prevista e opcionalmente CPF do cliente. Quando a locacao e aberta, o sistema " "gera um contrato e marca o veiculo como alugado." ), "parameters": { "type": "object", "properties": { "rental_vehicle_id": { "type": "integer", "description": "Identificador do veiculo na frota de aluguel. Opcional se a placa for informada.", }, "placa": { "type": "string", "description": "Placa do veiculo da frota de aluguel. Opcional se o identificador for informado.", }, "data_inicio": { "type": "string", "description": "Data e hora de inicio da locacao. Aceita formatos como 17/03/2026 e 17/03/2026 10:00.", }, "data_fim_prevista": { "type": "string", "description": "Data e hora previstas para devolucao da locacao.", }, "cpf": { "type": "string", "description": "CPF do cliente, com ou sem formatacao. Opcional.", }, "nome_cliente": { "type": "string", "description": "Nome do cliente para referencia textual. Opcional.", }, "observacoes": { "type": "string", "description": "Observacoes adicionais sobre a locacao. Opcional.", }, }, "required": ["data_inicio", "data_fim_prevista"], }, }, { "name": "registrar_devolucao_aluguel", "description": ( "Use esta ferramenta quando o cliente informar a devolucao de um carro alugado. " "Ela identifica a locacao pelo numero do contrato ou pela placa, fecha o contrato e " "deixa o veiculo disponivel novamente para a frota de aluguel." ), "parameters": { "type": "object", "properties": { "contrato_numero": { "type": "string", "description": "Numero do contrato de locacao. Opcional se a placa for informada.", }, "placa": { "type": "string", "description": "Placa do veiculo alugado. Opcional se o contrato for informado.", }, "data_devolucao": { "type": "string", "description": "Data e hora da devolucao. Opcional; se nao vier, o sistema usa o horario atual.", }, "observacoes": { "type": "string", "description": "Observacoes adicionais sobre a devolucao. Opcional.", }, }, "required": [], }, }, { "name": "registrar_pagamento_aluguel", "description": ( "Use esta ferramenta quando o usuario enviar um comprovante de pagamento " "de aluguel ou pedir para registrar que o aluguel foi pago. Ela registra " "o pagamento usando placa ou numero do contrato, valor, data do pagamento " "e dados auxiliares do comprovante." ), "parameters": { "type": "object", "properties": { "contrato_numero": { "type": "string", "description": "Numero do contrato de aluguel, quando disponivel.", }, "placa": { "type": "string", "description": "Placa do veiculo alugado, quando disponivel.", }, "valor": { "type": "number", "description": "Valor pago no comprovante de aluguel.", }, "data_pagamento": { "type": "string", "description": "Data do pagamento. Aceita formatos como 17/03/2026 e 2026-03-17 14:30.", }, "favorecido": { "type": "string", "description": "Nome do recebedor ou favorecido, quando aparecer no comprovante.", }, "identificador_comprovante": { "type": "string", "description": "Codigo, autenticacao, NSU ou identificador do comprovante.", }, "observacoes": { "type": "string", "description": "Resumo livre do que foi identificado na imagem.", }, }, "required": ["valor"], }, }, { "name": "limpar_contexto_conversa", "description": ( "Use esta ferramenta quando o usuario pedir para recomecar o atendimento, " "esquecer o contexto atual, limpar memoria volatil ou iniciar do zero. " "Ela limpa fila de pedidos, fluxos pendentes e contexto ativo do usuario." ), "parameters": { "type": "object", "properties": { "motivo": { "type": "string", "description": "Resumo curto do motivo da limpeza de contexto. Opcional.", }, }, "required": [], }, }, { "name": "continuar_proximo_pedido", "description": ( "Use esta ferramenta quando o usuario pedir para continuar, seguir ou abrir " "o proximo pedido que ficou na fila do atendimento." ), "parameters": { "type": "object", "properties": {}, "required": [], }, }, { "name": "descartar_pedidos_pendentes", "description": ( "Use esta ferramenta quando o usuario pedir para cancelar, ignorar ou " "descartar apenas os pedidos pendentes da fila, sem apagar necessariamente " "todo o contexto da conversa." ), "parameters": { "type": "object", "properties": { "motivo": { "type": "string", "description": "Resumo curto do motivo para descartar a fila pendente. Opcional.", }, }, "required": [], }, }, { "name": "cancelar_fluxo_atual", "description": ( "Use esta ferramenta quando o usuario pedir para cancelar apenas o fluxo " "atual em andamento, sem limpar toda a memoria da conversa." ), "parameters": { "type": "object", "properties": { "motivo": { "type": "string", "description": "Resumo curto do motivo do cancelamento do fluxo atual. Opcional.", }, }, "required": [], }, }, ] def seed_tools(): """Insere ou atualiza as tools padrao no banco de dados.""" db = SessionLocal() try: repo = ToolRepository(db) existing = repo.get_all() existing_names = {t.name for t in existing} for tool_def in get_tools_definitions(): if tool_def["name"] in existing_names: repo.update_by_name( name=tool_def["name"], description=tool_def["description"], parameters=tool_def["parameters"], ) continue repo.create( name=tool_def["name"], description=tool_def["description"], parameters=tool_def["parameters"], ) finally: db.close() if __name__ == "__main__": seed_tools()