feat: ampliando parametros de consulta de estoque e seed de tools

main
parent 53ff0d6049
commit 28d7daccb2

@ -51,6 +51,36 @@ curl -X POST http://localhost:8000/chat \
--- ---
### 2.1. Consultar Carro Mais Barato
```bash
curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{
"message": "Qual e o carro mais barato que voces tem?",
"user_id": "user-123"
}'
```
**Esperado**: Modelo chama `consultar_estoque` com `ordenar_preco=asc` e `limite=1`
---
### 2.2. Consultar Carro Mais Caro
```bash
curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{
"message": "Qual e o carro mais caro que voces tem?",
"user_id": "user-123"
}'
```
**Esperado**: Modelo chama `consultar_estoque` com `ordenar_preco=desc` e `limite=1`
---
### 3. Validar Cliente Venda ### 3. Validar Cliente Venda
```bash ```bash
@ -147,6 +177,18 @@ curl -X POST http://localhost:8000/mock/consultar-estoque \
-d '{"preco_max": 50000}' -d '{"preco_max": 50000}'
``` ```
```bash
curl -X POST http://localhost:8000/mock/consultar-estoque \
-H "Content-Type: application/json" \
-d '{"ordenar_preco": "asc", "limite": 1}'
```
```bash
curl -X POST http://localhost:8000/mock/consultar-estoque \
-H "Content-Type: application/json" \
-d '{"ordenar_preco": "desc", "limite": 1}'
```
### Ver resposta do Vertex AI ### Ver resposta do Vertex AI
Adicione console.log nos handlers para ver o que o Vertex retorna. Adicione console.log nos handlers para ver o que o Vertex retorna.

@ -1,5 +1,5 @@
from pydantic import BaseModel from pydantic import BaseModel
from typing import Dict, Any, Optional from typing import Dict, Any, Optional, Literal
class ChatRequest(BaseModel): class ChatRequest(BaseModel):
message: str message: str
@ -26,8 +26,10 @@ class ToolResponse(BaseModel):
class ConsultarEstoqueRequest(BaseModel): class ConsultarEstoqueRequest(BaseModel):
preco_max: float preco_max: Optional[float] = None
categoria: Optional[str] = None categoria: Optional[str] = None
ordenar_preco: Optional[Literal["asc", "desc"]] = None
limite: Optional[int] = None
class ValidarClienteVendaRequest(BaseModel): class ValidarClienteVendaRequest(BaseModel):

@ -6,35 +6,53 @@ def get_tools_definitions():
return [ return [
{ {
"name": "consultar_estoque", "name": "consultar_estoque",
"description": "Use esta ferramenta para consultar veículos disponíveis no estoque até um preço máximo informado pelo cliente, opcionalmente filtrando por categoria (Hatch, Sedan, SUV, etc.). Ideal quando o cliente quer saber quais carros cabem no orçamento ou comparar opções dentro de uma faixa de preço.", "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": { "parameters": {
"type": "object", "type": "object",
"properties": { "properties": {
"preco_max": { "preco_max": {
"type": "number", "type": "number",
"description": "Preço máximo do veículo em reais (BRL)." "description": "Preco maximo do veiculo em reais (BRL). Opcional.",
}, },
"categoria": { "categoria": {
"type": "string", "type": "string",
"description": "Categoria do veículo, por exemplo: Hatch, Sedan, SUV. Opcional." "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": ["preco_max"], "required": [],
}, },
}, },
{ {
"name": "validar_cliente_venda", "name": "validar_cliente_venda",
"description": "Use esta ferramenta quando precisar avaliar se o cliente pode financiar um veículo específico. Ela recebe o CPF e o valor do veículo, consulta um score simulado e retorna se o cliente está aprovado ou reprovado para a compra, juntamente com o score e um limite de crédito estimado.", "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": { "parameters": {
"type": "object", "type": "object",
"properties": { "properties": {
"cpf": { "cpf": {
"type": "string", "type": "string",
"description": "CPF do cliente, com ou sem formatação (apenas dígitos também é aceito)." "description": "CPF do cliente, com ou sem formatacao (apenas digitos tambem e aceito).",
}, },
"valor_veiculo": { "valor_veiculo": {
"type": "number", "type": "number",
"description": "Valor do veículo em reais (BRL) que o cliente deseja comprar." "description": "Valor do veiculo em reais (BRL) que o cliente deseja comprar.",
}, },
}, },
"required": ["cpf", "valor_veiculo"], "required": ["cpf", "valor_veiculo"],
@ -42,21 +60,26 @@ def get_tools_definitions():
}, },
{ {
"name": "avaliar_veiculo_troca", "name": "avaliar_veiculo_troca",
"description": "Use esta ferramenta quando o cliente quiser saber quanto o carro dele vale como entrada em uma negociação. Ela recebe modelo, ano e quilometragem do veículo atual e devolve um valor estimado de avaliação para troca, já considerando depreciação por ano e quilometragem.", "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": { "parameters": {
"type": "object", "type": "object",
"properties": { "properties": {
"modelo": { "modelo": {
"type": "string", "type": "string",
"description": "Modelo do veículo que o cliente deseja oferecer na troca (por exemplo, 'Toyota Corolla')." "description": "Modelo do veiculo que o cliente deseja oferecer na troca (por exemplo, 'Toyota Corolla').",
}, },
"ano": { "ano": {
"type": "integer", "type": "integer",
"description": "Ano de fabricação do veículo do cliente." "description": "Ano de fabricacao do veiculo do cliente.",
}, },
"km": { "km": {
"type": "integer", "type": "integer",
"description": "Quilometragem atual do veículo do cliente." "description": "Quilometragem atual do veiculo do cliente.",
}, },
}, },
"required": ["modelo", "ano", "km"], "required": ["modelo", "ano", "km"],
@ -64,17 +87,22 @@ def get_tools_definitions():
}, },
{ {
"name": "agendar_revisao", "name": "agendar_revisao",
"description": "Use esta ferramenta quando o cliente quiser marcar uma revisão ou manutenção para o veículo. Ela recebe a placa e a data/hora desejada, cria um agendamento simulado e retorna um identificador, além do status do agendamento.", "description": (
"Use esta ferramenta quando o cliente quiser marcar uma revisao ou "
"manutencao para o veiculo. Ela recebe a placa e a data/hora desejada, "
"cria um agendamento simulado e retorna um identificador, alem do "
"status do agendamento."
),
"parameters": { "parameters": {
"type": "object", "type": "object",
"properties": { "properties": {
"placa": { "placa": {
"type": "string", "type": "string",
"description": "Placa do veículo que será levado para revisão." "description": "Placa do veiculo que sera levado para revisao.",
}, },
"data_hora": { "data_hora": {
"type": "string", "type": "string",
"description": "Data e hora desejada para a revisão, em formato ISO 8601 (por exemplo, '2026-03-10T09:00:00-03:00')." "description": "Data e hora desejada para a revisao, em formato ISO 8601 (por exemplo, '2026-03-10T09:00:00-03:00').",
}, },
}, },
"required": ["placa", "data_hora"], "required": ["placa", "data_hora"],
@ -82,17 +110,22 @@ def get_tools_definitions():
}, },
{ {
"name": "cancelar_pedido", "name": "cancelar_pedido",
"description": "Use esta ferramenta quando o cliente solicitar o cancelamento de um pedido já registrado. Ela recebe o número do pedido e o motivo do cancelamento, atualiza o status para 'Cancelado' e retorna os detalhes do cancelamento para que você explique o resultado ao cliente.", "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": { "parameters": {
"type": "object", "type": "object",
"properties": { "properties": {
"numero_pedido": { "numero_pedido": {
"type": "string", "type": "string",
"description": "Número do pedido que o cliente deseja cancelar." "description": "Numero do pedido que o cliente deseja cancelar.",
}, },
"motivo": { "motivo": {
"type": "string", "type": "string",
"description": "Motivo do cancelamento informado pelo cliente (por exemplo, atraso, mudança de planos, condição de pagamento, etc.)." "description": "Motivo do cancelamento informado pelo cliente (por exemplo, atraso, mudanca de planos, condicao de pagamento, etc.).",
}, },
}, },
"required": ["numero_pedido", "motivo"], "required": ["numero_pedido", "motivo"],
@ -109,6 +142,11 @@ def seed_tools():
existing_names = {t.name for t in existing} existing_names = {t.name for t in existing}
for tool_def in get_tools_definitions(): for tool_def in get_tools_definitions():
if tool_def["name"] in existing_names: if tool_def["name"] in existing_names:
repo.update_by_name(
name=tool_def["name"],
description=tool_def["description"],
parameters=tool_def["parameters"],
)
continue continue
repo.create( repo.create(
name=tool_def["name"], name=tool_def["name"],

@ -30,3 +30,14 @@ class ToolRepository:
self.db.delete(tool) self.db.delete(tool)
self.db.commit() self.db.commit()
return tool return tool
def update_by_name(self, name: str, description: str, parameters: dict):
tool = self.db.query(Tool).filter(Tool.name == name).first()
if not tool:
return None
tool.description = description
tool.parameters = parameters
self.db.commit()
self.db.refresh(tool)
return tool

Loading…
Cancel
Save