Lotus e um MVP de central de atendimento com IA para WhatsApp. Hoje ele roda como um monorepo simples, com backend Express/TypeScript, banco SQLite via Prisma e um painel Next.js para configuracao, simulacao e acompanhamento de conversas.
O objetivo do projeto e validar o fluxo operacional antes de conectar um provedor real de WhatsApp: receber mensagens, responder com IA, preservar historico, acionar handoff humano quando necessario e manter um painel limpo para operacao.
Lotus/
backend/ # API Express, Prisma, IA e regras de atendimento
frontend/ # Painel Next.js
README.md
LICENSE
Backend:
backend/src/
ai/ # prompt, guardrails, token budget e providers de IA
lib/ # infraestrutura compartilhada
routes/ # rotas HTTP
services/ # regras de negocio do atendimento
utils/ # utilitarios pequenos
app.ts # configura Express
server.ts # sobe servidor e scheduler
Frontend:
frontend/src/
app/ # App Router, layout e estilos globais
components/ # blocos visuais do dashboard
hooks/ # estado e acoes da tela
lib/ # cliente HTTP
types/ # tipos do dashboard
Use dois terminais. O backend precisa subir antes do frontend para o painel conseguir chamar a API.
Terminal 1, API:
cd E:\Projetos\Lotus\backend
npm.cmd run devTerminal 2, painel:
cd E:\Projetos\Lotus\frontend
npm.cmd run devNo Windows, prefira npm.cmd. Em algumas maquinas o PowerShell bloqueia npm.ps1 por politica de execucao.
URLs esperadas:
Backend: http://localhost:3000/api/health
Frontend: http://localhost:3001
Se o frontend pegar outra porta, o Next.js mostra no terminal.
Backend, backend/.env:
PORT=3000
DATABASE_URL=file:./dev.db
AI_PROVIDER=openai
OPENAI_API_KEY=...
OPENAI_MODEL=...Frontend, frontend/.env.local:
NEXT_PUBLIC_API_URL=http://localhost:3000/apiNunca coloque chave da OpenAI no frontend. A chamada para IA deve continuar protegida no backend.
O MVP usa SQLite local em backend/dev.db.
Comandos uteis:
cd E:\Projetos\Lotus\backend
npm.cmd run prisma:migrate
npm.cmd run prisma:generate
npx.cmd tsc --noEmitO prompt padrao da IA nao fica salvo no banco. Ele vive em backend/src/ai/prompt.ts. O campo BotConfig.systemPrompt existe apenas para uma futura customizacao manual; quando vazio, o backend usa o prompt padrao do codigo.
Todas as rotas usam prefixo /api.
GET /health
GET /config
POST /config
POST /toggle
GET /conversations
GET /conversations/:id
POST /conversations/:id/assign
POST /conversations/:id/resolve
DELETE /conversations/:id/messages
GET /handoffs
POST /incoming-message
Exemplo de mensagem simulada:
Invoke-RestMethod `
-Method POST `
-Uri http://localhost:3000/api/incoming-message `
-ContentType application/json `
-Body '{"phone":"+5511999999999","name":"Cliente teste","text":"Bom dia, quais cursos voces oferecem?"}'A IA esta organizada em backend/src/ai/.
ai.service.ts # monta mensagens, chama provider e fallback
prompt.ts # prompt padrao da Lotus IA
guardrail.ts # regras deterministicas antes/depois da IA
tokenBudget.ts # limites de contexto e historico
types.ts # contratos da camada
providers/openai.provider.ts # integracao com OpenAI Responses API
Fluxo resumido:
incoming.service.tssalva a mensagem do cliente.guardrail.tsavalia se deve responder sem chamar IA.message.service.tsbusca historico recente.tokenBudget.tslimita contexto, historico e mensagem atual.openai.provider.tschama a Responses API com JSON estruturado.guardrail.tsrevisa a resposta final.- Se necessario, o atendimento vira handoff humano.
Guardrails atuais cobrem:
- pedido explicito de humano;
- reclamacao, cancelamento, fraude e assuntos sensiveis;
- indicios de emergencia;
- tentativas simples de revelar prompt ou alterar regras;
- resposta vazia ou com confianca baixa.
Checklist rapido quando algo parecer errado:
cd E:\Projetos\Lotus\backend
npx.cmd tsc --noEmitDepois:
Invoke-RestMethod http://localhost:3000/api/healthSe o frontend nao carregar:
- confirme se o backend esta vivo em
/api/health; - confirme
frontend/.env.local; - reinicie o processo do Next.js;
- se aparecer erro de manifesto vazio, pare o Next.js e remova
frontend/.next.
Se a IA parecer usar prompt antigo:
- confira se
BotConfig.systemPromptesta vazio; - reinicie o backend;
- lembre que
prompt.tse o prompt padrao real.
Backend:
cd E:\Projetos\Lotus\backend
npx.cmd tsc --noEmitFrontend:
cd E:\Projetos\Lotus\frontend
npm.cmd run lint
npm.cmd run buildFunciona hoje:
- painel Next.js para configuracao e simulacao;
- API Express;
- persistencia em SQLite;
- configuracao do bot;
- ativar e pausar bot;
- historico por contato;
- handoff humano;
- notificacao simulada para gestor;
- OpenAI Responses API com JSON estruturado;
- fallback simulado quando a OpenAI falha;
- guardrails e token budget.
Ainda nao esta pronto para producao:
- WhatsApp real;
- autenticacao no painel;
- multiempresa;
- observabilidade estruturada;
- testes automatizados;
- PostgreSQL;
- deploy.
- Adicionar botao claro de "Nova simulacao" no frontend.
- Criar tela ou filtro para handoffs abertos.
- Mover qualquer MVP estatico antigo para
legacy/, se ele voltar ao repositorio. - Adicionar testes para guardrails e
/incoming-message. - Escolher provedor real de WhatsApp.
- Migrar SQLite para PostgreSQL antes de producao.
- Adicionar autenticacao e permissao no painel.
Este projeto ainda e um MVP. Para rodar em producao, trate IA e WhatsApp como sistemas externos falhaveis: timeouts, retries controlados, logs, rate limit, backup de banco, metricas de custo e trilha de auditoria precisam entrar antes de clientes reais dependerem do atendimento.