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

382 lines
16 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": "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()