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.
329 lines
7.9 KiB
Markdown
329 lines
7.9 KiB
Markdown
# AI Orquestrador
|
|
|
|
Backend conversacional para concessionária, focado em orquestrar ferramentas de negócio com apoio de LLM.
|
|
|
|
A proposta do sistema é:
|
|
- receber uma mensagem em linguagem natural
|
|
- deixar o modelo interpretar a intenção do usuário
|
|
- usar ferramentas do sistema quando precisar consultar dados ou executar ações
|
|
- devolver uma resposta objetiva ao usuário
|
|
|
|
Hoje o projeto já implementa esse fluxo, mas ainda inclui camadas de suporte ao modelo, como extração estruturada, memória temporária por usuário, coleta incremental de dados e fallback determinístico de resposta.
|
|
|
|
## Visão Geral
|
|
|
|
O domínio atual do projeto cobre dois fluxos principais:
|
|
- vendas
|
|
- revisão/pós-venda
|
|
|
|
O sistema consegue:
|
|
- consultar estoque de veículos
|
|
- validar cliente para compra
|
|
- avaliar veículo para troca
|
|
- criar pedido de compra
|
|
- cancelar pedido
|
|
- agendar revisão
|
|
- listar revisões agendadas
|
|
- cancelar revisão
|
|
- remarcar revisão
|
|
|
|
Além do roteamento por tool, o orquestrador também trata cenários conversacionais como:
|
|
- mensagens com mais de um pedido na mesma entrada
|
|
- coleta de parâmetros em múltiplas mensagens
|
|
- reaproveitamento de contexto temporário
|
|
- confirmação antes de trocar de assunto
|
|
- sugestão de próximo horário quando uma revisão entra em conflito
|
|
|
|
## Stack Atual
|
|
|
|
| Componente | Tecnologia | Observação |
|
|
| --- | --- | --- |
|
|
| Backend | FastAPI | API principal |
|
|
| LLM | Google Vertex AI | Modelos Gemini |
|
|
| Banco de tools | MySQL | Metadados das ferramentas |
|
|
| Banco mock de negócio | MySQL | Veículos, clientes, usuários, pedidos e revisões |
|
|
| ORM | SQLAlchemy | Acesso aos dois bancos |
|
|
| Runtime | Python 3.11+ | Aplicação principal |
|
|
| Integração de canal | Telegram Bot API | Long polling via serviço satélite |
|
|
| Containerização | Docker | Ambiente local e deploy |
|
|
|
|
## Como o Sistema Funciona
|
|
|
|
Fluxo principal do `/chat`:
|
|
|
|
1. O usuário envia uma mensagem.
|
|
2. O `OrquestradorService` inicializa ou atualiza o contexto temporário do usuário.
|
|
3. O sistema tenta separar múltiplos pedidos contidos na mesma mensagem.
|
|
4. O LLM ajuda a extrair intenções e entidades estruturadas.
|
|
5. Se houver fluxo em aberto, o orquestrador continua a coleta dos dados faltantes.
|
|
6. Quando necessário, o modelo escolhe uma tool.
|
|
7. A tool é executada pelos handlers do sistema.
|
|
8. O resultado é devolvido ao usuário, usando resposta do modelo ou fallback determinístico.
|
|
|
|
Importante:
|
|
- a memória de conversa atual é volátil e fica em memória do processo
|
|
- o sistema ainda não persiste histórico conversacional entre reinícios
|
|
- o `response_formatter` responde direto ao usuário; ele não devolve o resultado para o modelo
|
|
|
|
## Estrutura do Projeto
|
|
|
|
```text
|
|
app/
|
|
main.py
|
|
api/
|
|
routes/
|
|
chat.py
|
|
mock.py
|
|
tools.py
|
|
dependencies.py
|
|
schemas.py
|
|
core/
|
|
settings.py
|
|
db/
|
|
database.py
|
|
mock_database.py
|
|
init_db.py
|
|
tool_seed.py
|
|
mock_seed.py
|
|
models/
|
|
tool.py
|
|
repositories/
|
|
tool_repository.py
|
|
user_repository.py
|
|
integrations/
|
|
telegram_satellite_service.py
|
|
services/
|
|
ai/
|
|
llm_service.py
|
|
flows/
|
|
order_flow.py
|
|
review_flow.py
|
|
orchestration/
|
|
orquestrador_service.py
|
|
orchestrator_config.py
|
|
conversation_state_store.py
|
|
prompt_builders.py
|
|
response_formatter.py
|
|
tools/
|
|
handlers.py
|
|
tool_registry.py
|
|
user/
|
|
user_service.py
|
|
```
|
|
|
|
## Organização das Camadas
|
|
|
|
### `services/orchestration`
|
|
|
|
Núcleo do orquestrador:
|
|
- coordenação do fluxo conversacional
|
|
- controle de contexto ativo
|
|
- fila de pedidos
|
|
- construção de prompts
|
|
- fallback de resposta
|
|
|
|
### `services/flows`
|
|
|
|
Fluxos incrementais de negócio:
|
|
- criação e cancelamento de pedido
|
|
- agendamento, listagem, cancelamento e remarcação de revisão
|
|
|
|
### `services/ai`
|
|
|
|
Integração com Vertex AI e Gemini.
|
|
|
|
### `services/tools`
|
|
|
|
Registro das tools e implementação dos handlers que executam as ações reais.
|
|
|
|
### `services/user`
|
|
|
|
Serviços ligados à identificação e persistência de usuários de canal, como Telegram.
|
|
|
|
## Ferramentas Disponíveis
|
|
|
|
As tools padrão são semeadas a partir de [app/db/tool_seed.py](app/db/tool_seed.py):
|
|
|
|
| Tool | Finalidade |
|
|
| --- | --- |
|
|
| `consultar_estoque` | Consulta veículos por preço, categoria e ordenação |
|
|
| `validar_cliente_venda` | Valida elegibilidade de compra por CPF e valor |
|
|
| `avaliar_veiculo_troca` | Estima valor de troca do veículo do cliente |
|
|
| `agendar_revisao` | Agenda revisão com cálculo de valor |
|
|
| `listar_agendamentos_revisao` | Lista revisões do usuário |
|
|
| `cancelar_agendamento_revisao` | Cancela uma revisão por protocolo |
|
|
| `editar_data_revisao` | Remarca revisão existente |
|
|
| `realizar_pedido` | Cria pedido de compra |
|
|
| `cancelar_pedido` | Cancela pedido existente |
|
|
|
|
## Bancos e Seeds
|
|
|
|
O projeto usa duas conexões distintas:
|
|
|
|
### Banco de tools
|
|
|
|
Responsável por armazenar:
|
|
- nome da tool
|
|
- descrição
|
|
- schema de parâmetros
|
|
|
|
Arquivos principais:
|
|
- `app/db/database.py`
|
|
- `app/db/models/tool.py`
|
|
- `app/db/tool_seed.py`
|
|
|
|
### Banco mock de negócio
|
|
|
|
Responsável por armazenar dados fictícios de:
|
|
- veículos
|
|
- clientes
|
|
- usuários
|
|
- pedidos
|
|
- agendamentos de revisão
|
|
|
|
Arquivos principais:
|
|
- `app/db/mock_database.py`
|
|
- `app/db/mock_models.py`
|
|
- `app/db/mock_seed.py`
|
|
|
|
No startup, a aplicação tenta:
|
|
- criar as tabelas dos dois bancos
|
|
- popular tools
|
|
- popular dados mock
|
|
- fazer warmup do LLM
|
|
|
|
## Endpoints
|
|
|
|
### Chat
|
|
|
|
- `POST /chat`
|
|
- entrada principal do orquestrador
|
|
|
|
### Tools
|
|
|
|
- `GET /tools/`
|
|
- `POST /tools/`
|
|
- `GET /tools/{tool_id}`
|
|
- `DELETE /tools/{tool_id}`
|
|
|
|
### Mock
|
|
|
|
Endpoints diretos para depuração e testes manuais dos handlers:
|
|
|
|
- `POST /mock/consultar-estoque`
|
|
- `POST /mock/validar-cliente-venda`
|
|
- `POST /mock/avaliar-veiculo-troca`
|
|
- `POST /mock/agendar-revisao`
|
|
- `POST /mock/listar-agendamentos-revisao`
|
|
- `POST /mock/cancelar-agendamento-revisao`
|
|
- `POST /mock/editar-data-revisao`
|
|
- `POST /mock/realizar-pedido`
|
|
- `POST /mock/cancelar-pedido`
|
|
|
|
Documentação interativa:
|
|
- `GET /docs`
|
|
|
|
## Execução Local
|
|
|
|
### Sem Docker
|
|
|
|
```bash
|
|
uvicorn app.main:app --reload
|
|
```
|
|
|
|
### Com Docker Compose
|
|
|
|
```bash
|
|
docker-compose up
|
|
```
|
|
|
|
Para testar estado conversacional em Redis com Docker Compose:
|
|
|
|
```bash
|
|
docker-compose up redis app
|
|
```
|
|
|
|
Arquivos úteis:
|
|
- `TEST_CASES.md`
|
|
- `DEPLOY_SERVIDOR.md`
|
|
- `.env.example`
|
|
|
|
## Variáveis de Ambiente
|
|
|
|
Principais variáveis:
|
|
|
|
### Vertex AI
|
|
|
|
- `GOOGLE_PROJECT_ID`
|
|
- `GOOGLE_LOCATION`
|
|
- `VERTEX_MODEL_NAME`
|
|
|
|
### Banco de tools
|
|
|
|
- `DB_HOST`
|
|
- `DB_PORT`
|
|
- `DB_USER`
|
|
- `DB_PASSWORD`
|
|
- `DB_NAME`
|
|
- `DB_CLOUD_SQL_CONNECTION_NAME`
|
|
|
|
### Banco mock
|
|
|
|
- `MOCK_DB_HOST`
|
|
- `MOCK_DB_PORT`
|
|
- `MOCK_DB_USER`
|
|
- `MOCK_DB_PASSWORD`
|
|
- `MOCK_DB_NAME`
|
|
- `MOCK_DB_CLOUD_SQL_CONNECTION_NAME`
|
|
- `MOCK_SEED_ENABLED`
|
|
- `AUTO_SEED_TOOLS`
|
|
- `AUTO_SEED_MOCK`
|
|
|
|
### Telegram
|
|
|
|
- `TELEGRAM_BOT_TOKEN`
|
|
- `TELEGRAM_POLLING_TIMEOUT`
|
|
- `TELEGRAM_REQUEST_TIMEOUT`
|
|
|
|
### Estado Conversacional
|
|
|
|
- `CONVERSATION_STATE_BACKEND` (`memory` ou `redis`)
|
|
- `CONVERSATION_STATE_TTL_MINUTES`
|
|
- `REDIS_URL`
|
|
- `REDIS_KEY_PREFIX`
|
|
- `REDIS_SOCKET_TIMEOUT_SECONDS`
|
|
|
|
## Telegram Satellite Service
|
|
|
|
Existe um serviço satélite para atendimento via Telegram em long polling.
|
|
|
|
Arquivo principal:
|
|
- `app/integrations/telegram_satellite_service.py`
|
|
|
|
Execução:
|
|
|
|
```bash
|
|
python -m app.integrations.telegram_satellite_service
|
|
```
|
|
|
|
Esse serviço:
|
|
- consome mensagens do Telegram
|
|
- cria ou recupera o usuário interno
|
|
- encaminha a mensagem para o `OrquestradorService`
|
|
- envia a resposta de volta ao chat
|
|
|
|
## Estado Atual do Projeto
|
|
|
|
O sistema já está além de um MVP simples de tool calling. Hoje ele combina:
|
|
- decisão assistida por modelo
|
|
- execução determinística de tools
|
|
- memória volátil por usuário
|
|
- fluxos multi-etapas
|
|
- múltiplos pedidos na mesma conversa
|
|
|
|
Pontos que ainda permanecem em aberto:
|
|
- persistência real de histórico conversacional
|
|
- suíte automatizada de testes
|
|
- evolução da autonomia do modelo
|
|
- alinhamento contínuo entre prompts, fluxo e regras de negócio
|