You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
536 lines
23 KiB
Python
536 lines
23 KiB
Python
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()
|