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.
orquestrador/app/db/tool_seed.py

541 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()
obsolete_tool_names = {"registrar_multa_aluguel"}
for tool in existing:
if tool.name in obsolete_tool_names:
repo.delete(tool.id)
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()