Bot de WhatsApp que monitora conversas de grupo e gera resumos fiéis usando LLMs (OpenAI / Anthropic). Inclui quiz, retro semanal, tracker de dívidas, detector de sentimento, curador de links e mais.
- O bot conecta ao WhatsApp Web via Baileys (sem custo, sem navegador)
- Mensagens de grupo são armazenadas em SQLite
- Quando alguém pede um resumo (
/resumoou@ResumoBot), o bot envia para a LLM - A LLM gera um resumo fiel — sem inventar, mantendo o tom da conversa
- Mídias (imagens, áudios, vídeos) são descritas/transcritas e incluídas no resumo
# 1. Clonar e instalar
git clone https://github.com/vinicius1209/wa-resumo-bot.git
cd wa-resumo-bot
npm install
# 2. Configurar (wizard interativo)
npm run setup
# 3. Rodar
npm run dev
# 4. Escaneie o QR Code no terminal com seu WhatsAppO wizard
npm run setupverifica pré-requisitos, configura o LLM provider, gera o token do dashboard e cria o.envautomaticamente. Para configuração manual, copie.env.examplepara.env.
Pré-requisitos: Node.js 18+,
ffmpeginstalado (para processamento de vídeos)
| Comando | Descrição | Exemplos |
|---|---|---|
/resumo |
Resumo de mensagens | /resumo 2h, /resumo hoje, /resumo 50 |
/stats |
Métricas de uso e custo | /stats, /stats custo |
/retro |
Retrospectiva semanal com LLM | /retro |
/quiz |
Quiz "quem disse isso?" | /quiz, /quiz ranking |
/divida |
Tracker de dívidas entre membros | /divida @pessoa 50 |
/links |
Links compartilhados no grupo | /links, /links semana |
/palavras |
Palavra do dia (últimos 7 dias) | /palavras |
/temperatura |
Termômetro de sentimento do grupo | /temperatura |
/persona |
Perfil de personalidade do grupo | /persona |
/compromissos |
Compromissos e lembretes | /compromissos add reunião amanhã 15h |
/meperdi |
Resumo desde sua última mensagem | /meperdi |
/ajuda |
Lista todos os comandos | /ajuda |
Todos os comandos também funcionam via menção: @ResumoBot resumo 3h
O bot suporta conversas multi-turn via @menção. Diferente dos comandos, o modo conversacional permite perguntas livres sobre o contexto do grupo.
CONVERSATION_ENABLED=true
CONVERSATION_DM_ENABLED=false # DMs opcionaisComo funciona:
- Usuário menciona o bot sem comando:
@ResumoBot o que tão falando hoje? - Bot injeta contexto do grupo (mensagens recentes + sentimento) como grounding
- LLM responde com base apenas no contexto real
- Sessões multi-turn duram 30min (configurável) — o bot lembra o que já foi conversado
Controles:
- Toggle
conversapor grupo no dashboard - Rate limiting separado (10 turns / 5min)
- Sessões persistem no SQLite (sobrevivem restart)
O bot inclui um dashboard web (React + Tailwind + shadcn/ui) para monitoramento e gestão em tempo real.
DASHBOARD_ENABLED=true
DASHBOARD_PORT=3000
DASHBOARD_TOKEN=seu-token-aquiPáginas:
- Overview — Status, gráficos de uso por hora, tabela de grupos, live feed
- Chat — Interface para executar comandos sem enviar ao WhatsApp
- Conversas — Viewer de sessões conversacionais (turns, contexto injetado, status)
- Grupos — Allow/block, feature toggles por grupo (incluindo
conversa), notas - Config — Editor de configurações dinâmicas
# Backend (terminal 1)
npm run dev
# Frontend com hot-reload (terminal 2)
npm run dashboard:dev
# Build para produção
npm run dashboard:buildTodas as variáveis via .env (veja .env.example):
| Variável | Padrão | Descrição |
|---|---|---|
LLM_PROVIDER |
openai |
openai ou anthropic |
OPENAI_API_KEY |
— | Chave da API OpenAI |
OPENAI_MODEL |
gpt-4o-mini |
Modelo OpenAI |
ANTHROPIC_API_KEY |
— | Chave da API Anthropic |
ANTHROPIC_MODEL |
claude-sonnet-4-20250514 |
Modelo Anthropic |
SUMMARY_MAX_MESSAGES |
200 |
Mensagens padrão para resumo |
SUMMARY_LANGUAGE |
pt-BR |
Idioma do resumo |
BOT_NAME |
ResumoBot |
Nome para detecção de @menção |
COMMAND_PREFIX |
/ |
Prefixo de comandos |
RATE_LIMIT_MAX_REQUESTS |
3 |
Máx. requisições por janela |
RATE_LIMIT_WINDOW_SECONDS |
300 |
Janela de rate limit (segundos) |
MEDIA_PROCESSING_ENABLED |
true |
Processar imagens/áudios/vídeos |
MEDIA_MAX_SIZE_MB |
20 |
Tamanho máximo de mídia |
DASHBOARD_ENABLED |
false |
Habilitar dashboard admin |
DASHBOARD_PORT |
3000 |
Porta do dashboard |
DASHBOARD_TOKEN |
— | Token de autenticação do dashboard |
WORD_OF_DAY_AUTO |
false |
Enviar palavra do dia às 23h automaticamente |
CONVERSATION_ENABLED |
false |
Habilitar modo conversacional |
CONVERSATION_MAX_TURNS |
20 |
Máx. turns por sessão |
CONVERSATION_SESSION_TTL_MINUTES |
30 |
Expiração da sessão (min) |
CONVERSATION_DM_ENABLED |
false |
Conversas via DM |
CONVERSATION_TEMPERATURE |
0.7 |
Temperatura LLM para conversas |
CONVERSATION_MAX_TOKENS |
1000 |
Máx. tokens por resposta |
src/
├── index.ts # Bootstrap e orquestração
├── types/ # Interfaces e contratos
├── config/ # Configuração centralizada (.env)
├── whatsapp/ # Conexão Baileys + QR + reconexão
├── storage/ # SQLite (WAL mode, auto-migrations)
├── llm/ # OpenAI + Anthropic providers
├── commands/ # 12 comandos (ICommand)
├── services/ # 18 serviços (analytics, sentiment, quiz, etc.)
├── dashboard/ # Fastify server + WebSocket
│ ├── server.ts # HTTP server com auth Bearer
│ ├── api.ts # REST API (13 rotas)
│ ├── websocket.ts # Real-time events
│ └── public/ # Build output (gerado pelo dashboard-ui)
dashboard-ui/ # Frontend React (separado)
├── src/pages/ # 4 páginas (Overview, Chat, Groups, Settings)
├── src/components/ # shadcn/ui + componentes custom
└── vite.config.ts # Build → src/dashboard/public/
Todos os módulos dependem de contratos em src/types/index.ts:
- IMessageStorage — persistência de mensagens
- ILLMProvider — sumarização via LLM
- IRateLimiter — rate limiting por grupo
- IMediaProcessor — processamento de mídia (visão + transcrição)
- ICommand — comandos do bot
WhatsApp → Baileys → connection.ts (parse)
→ SQLiteStorage (persist)
→ DynamicConfig (allowlist check)
→ MediaProcessor (se mídia: describe/transcribe)
→ LinkService (detectar URLs)
→ SentimentService (alimentar heurísticas)
→ CatchupService (track atividade)
→ QuizService (verificar resposta)
→ CommandHandler (detectar /cmd ou @mention)
→ Service correspondente → reply
- Crie
src/commands/meu-comando.tsimplementandoICommand - Exporte em
src/commands/index.ts - Registre em
src/index.ts
- Implemente
ILLMProvideremsrc/llm/ - Registre em
provider-factory.ts
- Implemente
IMessageStorage - Substitua
SQLiteStoragenosrc/index.ts
- Runtime: Node.js + TypeScript (strict mode)
- WhatsApp: Baileys (conexão direta, zero custo)
- Storage: SQLite via better-sqlite3 (WAL mode)
- LLMs: OpenAI SDK + Anthropic SDK
- Dashboard: Fastify + WebSocket + React + Tailwind + shadcn/ui + Recharts
- Logging: Pino (structured logging)
- Rate limit: configurável por grupo (padrão: 3 requisições / 5 minutos)
- Purge automático: mensagens com +7 dias removidas diariamente
- Reconexão: automática se a conexão cair
- Allowlist: controle de grupos via dashboard
- Feature toggles: habilitar/desabilitar comandos por grupo
- Mídia: limite de tamanho configurável, processamento em memória