- adiciona snapshots de fluxo, collected_slots e last_tool_result ao estado conversacional, incluindo persistencia no backend em memoria e no Redis\n- endurece o reaproveitamento de revisao, o reset imediato de contexto e a retomada incremental sem perder drafts apos respostas fracas do modelo\n- prioriza follow-ups operacionais de vendas antes do LLM para selecao de estoque, CPF, nova busca e continuidade de pedido/cancelamento\n- normaliza aliases de tools de compra, persiste selecoes pendentes de estoque e preserva sugestoes com budget_relaxed entre turnos\n- melhora a policy de troca de contexto para confirmacoes ambiguas, novos pedidos operacionais e onboarding orientado apos mudanca de dominio\n- amplia a cobertura de regressao para revisao, compra, cancelamento, reset global e execucao estruturada do orquestrador |
1 month ago | |
|---|---|---|
| app | 1 month ago | |
| deploy/systemd | 1 month ago | |
| tests | 1 month ago | |
| .dockerignore | 2 months ago | |
| .env.example | 1 month ago | |
| .gitignore | 2 months ago | |
| DEPLOY_SERVIDOR.md | 1 month ago | |
| Dockerfile | 2 months ago | |
| README.md | 1 month ago | |
| TEST_CASES.md | 1 month ago | |
| docker-compose.yml | 1 month ago | |
| requirements.txt | 1 month ago | |
| test-local.sh | 2 months ago | |
README.md
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:
- O usuário envia uma mensagem.
- O
OrquestradorServiceinicializa ou atualiza o contexto temporário do usuário. - O sistema tenta separar múltiplos pedidos contidos na mesma mensagem.
- O LLM ajuda a extrair intenções e entidades estruturadas.
- Se houver fluxo em aberto, o orquestrador continua a coleta dos dados faltantes.
- Quando necessário, o modelo escolhe uma tool.
- A tool é executada pelos handlers do sistema.
- 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_formatterresponde direto ao usuário; ele não devolve o resultado para o modelo
Estrutura do Projeto
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:
| 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.pyapp/db/models/tool.pyapp/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.pyapp/db/mock_models.pyapp/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-estoquePOST /mock/validar-cliente-vendaPOST /mock/avaliar-veiculo-trocaPOST /mock/agendar-revisaoPOST /mock/listar-agendamentos-revisaoPOST /mock/cancelar-agendamento-revisaoPOST /mock/editar-data-revisaoPOST /mock/realizar-pedidoPOST /mock/cancelar-pedido
Documentação interativa:
GET /docs
Execução Local
Sem Docker
uvicorn app.main:app --reload
Com Docker Compose
docker-compose up
Para testar estado conversacional em Redis com Docker Compose:
docker-compose up redis app
Arquivos úteis:
TEST_CASES.mdDEPLOY_SERVIDOR.md.env.example
Variáveis de Ambiente
Principais variáveis:
Vertex AI
GOOGLE_PROJECT_IDGOOGLE_LOCATIONVERTEX_MODEL_NAME
Banco de tools
DB_HOSTDB_PORTDB_USERDB_PASSWORDDB_NAMEDB_CLOUD_SQL_CONNECTION_NAME
Banco mock
MOCK_DB_HOSTMOCK_DB_PORTMOCK_DB_USERMOCK_DB_PASSWORDMOCK_DB_NAMEMOCK_DB_CLOUD_SQL_CONNECTION_NAMEMOCK_SEED_ENABLEDAUTO_SEED_TOOLSAUTO_SEED_MOCK
Telegram
TELEGRAM_BOT_TOKENTELEGRAM_POLLING_TIMEOUTTELEGRAM_REQUEST_TIMEOUT
Estado Conversacional
CONVERSATION_STATE_BACKEND(memoryouredis)CONVERSATION_STATE_TTL_MINUTESREDIS_URLREDIS_KEY_PREFIXREDIS_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:
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