Agente de IA autônomo no WhatsApp para a Stream Lab — agência de marketing digital.
Personalidade inspirada no J.A.R.V.I.S. do Tony Stark: elegante, eficiente, com humor inteligente.
Jarvis funciona como um gerente de projetos virtual 24/7 — recebe mensagens no WhatsApp, entende contexto, responde com inteligência e executa ações em ferramentas externas (Asana, Google Calendar).
- 4 Agentes Especializados — Roteamento automático por intenção (Master, Creative, Manager, Researcher)
- Memória Persistente — Extração e consulta de fatos com 3 escopos (pessoas, conversas, operacional)
- Aprendizado Passivo — Aprende de TODA mensagem recebida, mesmo quando não responde
- Voz Premium — TTS via ElevenLabs + STT via Whisper, configurável pelo dashboard
- Integrações Nativas — Asana (gestão de projetos) + Google Calendar (captações)
- Dashboard Seguro — SPA com autenticação 2FA via WhatsApp, score de inteligência e gestão de memórias
- Estudo Exaustivo — Ingestão completa do Asana (projetos, tarefas, comentários) para base de conhecimento
┌─────────────────────────┐
│ WhatsApp (Baileys v7) │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ jarvis-v2.mjs │
│ Entry Point + Express │
└──┬────┬────┬────┬────┬──┘
│ │ │ │ │
┌─────────┘ │ │ │ └─────────┐
▼ ▼ ▼ ▼ ▼
┌───────┐ ┌────┐┌───┐┌───┐ ┌──────────┐
│ Brain │ │Mem ││STT││ DB│ │ Skills │
│ │ │ ││TTS││ │ │ (Tools) │
└───┬───┘ └────┘└───┘└───┘ └──────────┘
│ │ │
┌────────┼────────┐ │ ┌────────────┼────────────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼
┌───────┐┌───────┐┌──────┐┌─────┐┌────────┐┌──────────┐┌──────────┐
│Master ││Creat. ││Manag.││Resr.││ Asana ││ GCal ││ Memórias │
└───────┘└───────┘└──────┘└─────┘└────────┘└──────────┘└──────────┘
| Camada | Tecnologia | Versão |
|---|---|---|
| Runtime | Node.js (ESM) | 20+ |
| Baileys | v7 | |
| IA Principal | Claude API (Anthropic) | Sonnet |
| IA Extração | Claude Haiku | - |
| TTS | ElevenLabs | v3 |
| STT | Whisper (OpenAI) | v1 |
| Banco de Dados | PostgreSQL | 16 |
| Cache | Redis | 7 |
| Gestão de Projetos | Asana API | v1 |
| Calendário | Google Calendar API | v3 |
| Processo | PM2 | - |
| Containers | Docker Compose | v2 |
| CI/CD | GitHub Actions | - |
| Dashboard | Tailwind CSS + Chart.js | SPA |
jarvis-v2.mjs # Entry point — WhatsApp + Express + Cron
src/
├── config.mjs # Configurações centrais (100% via .env)
├── database.mjs # PostgreSQL — pool, initDB, CRUD
├── memory.mjs # Sistema de memória (Mem0-inspired)
├── brain.mjs # Cérebro IA + roteamento de agentes
├── audio.mjs # TTS (ElevenLabs/OpenAI) + STT (Whisper)
├── profiles.mjs # Síntese de perfis (clientes, equipe)
├── batch-asana.mjs # Estudo exaustivo do Asana
├── helpers.mjs # Utilitários (getMediaType, extractSender)
├── agents/
│ └── master.mjs # Prompts dos 4 agentes + classificador
└── skills/
└── loader.mjs # Tools do Claude (Asana + GCal)
dashboard/
└── index.html # SPA do dashboard (Tailwind, Chart.js)
tests/
└── unit.test.mjs # Suite de testes (25 casos + scan de credenciais)
.github/workflows/
├── ci.yml # CI — lint + testes
└── deploy.yml # CD — rsync + PM2 restart via SSH
docker-compose.yml # PostgreSQL 16 + Redis 7
- Node.js 20+
- Docker + Docker Compose v2
- FFmpeg (conversão de áudio para PTT do WhatsApp)
- PM2 (
npm install -g pm2)
# 1. Clonar o repositório
git clone https://github.com/gui-rocha89/jarvis.git /opt/jarvis
cd /opt/jarvis
# 2. Instalar dependências
npm ci
# 3. Configurar variáveis de ambiente
cp .env.example .env
# Preencher TODAS as variáveis obrigatórias (ver seção abaixo)
# 4. Subir PostgreSQL e Redis
docker compose up -d
# 5. Iniciar com PM2
pm2 start jarvis-v2.mjs --name jarvis
pm2 saveCopie .env.example e configure todas as variáveis. As principais:
| Variável | Descrição | Obrigatória |
|---|---|---|
ANTHROPIC_API_KEY |
Chave da API Claude | ✅ |
OPENAI_API_KEY |
Chave OpenAI (Whisper + TTS fallback) | ✅ |
ELEVENLABS_API_KEY |
Chave ElevenLabs (TTS primário) | ✅ |
ELEVENLABS_VOICE_ID |
ID da voz no ElevenLabs | ✅ |
ASANA_PAT |
Personal Access Token do Asana | ✅ |
ASANA_WORKSPACE |
GID do workspace Asana | ✅ |
DB_HOST, DB_USER, DB_PASSWORD, DB_NAME |
PostgreSQL | ✅ |
REDIS_PASSWORD |
Senha do Redis | ✅ |
JWT_SECRET |
Secret para tokens JWT do dashboard | ✅ |
API_KEY |
Chave interna da API REST | ✅ |
AI_MODEL |
Modelo principal (ex: claude-sonnet-4-20250514) |
✅ |
MEMORY_MODEL |
Modelo de extração (ex: claude-3-haiku-20240307) |
✅ |
Consulte
.env.examplepara a lista completa com valores de exemplo.
O Jarvis classifica a intenção de cada mensagem e roteia para o agente especializado:
| Agente | Especialidade | Triggers |
|---|---|---|
| Master | Conversação geral, personalidade, humor | Default (quando nenhum outro se aplica) |
| Creative | Copy, legendas, roteiros, CTAs | copy, arte, conteúdo, post, legenda... |
| Manager | Gestão de projetos, prazos, Asana | tarefa, prazo, status, cobrança... |
| Researcher | Pesquisa, dados, tendências | pesquisar, dados, benchmark, análise... |
Porta: configurada via API_PORT (default: 3100)
- API interna: header
x-api-key - Dashboard:
Authorization: Bearer <JWT>(obtido via login + 2FA)
| Método | Rota | Descrição |
|---|---|---|
GET |
/dashboard/auth/status |
Verifica se existe conta cadastrada |
POST |
/dashboard/auth/setup |
Cadastro inicial (funciona apenas 1x) |
POST |
/dashboard/auth/login |
Login → envia código 2FA via WhatsApp |
POST |
/dashboard/auth/verify |
Valida 2FA → retorna JWT (8h) |
| Método | Rota | Descrição |
|---|---|---|
GET |
/status |
Status geral do bot |
POST |
/send/text |
Enviar mensagem de texto |
POST |
/send/audio |
Enviar áudio via TTS |
GET |
/dashboard/health |
Health check |
GET |
/dashboard/intelligence |
Score de inteligência (6 eixos + patente) |
GET/POST |
/dashboard/voice |
Configurações de voz |
GET |
/dashboard/memory |
Estatísticas de memória |
GET |
/dashboard/memory/search |
Buscar memórias |
GET |
/dashboard/memory/recent |
Memórias recentes |
POST |
/dashboard/memory/add |
Adicionar memória manualmente |
POST |
/dashboard/chat |
Chat com Jarvis via dashboard |
GET |
/dashboard/profiles |
Listar perfis sintetizados |
POST |
/dashboard/asana/study/start |
Iniciar estudo exaustivo do Asana |
GET |
/dashboard/asana/study/status |
Progresso do estudo em tempo real |
POST |
/dashboard/asana/study/stop |
Parar estudo |
SPA com interface temática do JARVIS (Iron Man). Funcionalidades:
- Score de Inteligência — Radar com 6 eixos + sistema de patentes (Recruta → Diretor da S.H.I.E.L.D.)
- Gestão de Memórias — Busca, filtro por escopo, adição manual
- Configuração de Voz — Sliders para stability, similarity, style (ElevenLabs)
- Chat Integrado — Conversar com Jarvis diretamente pelo dashboard
- Estudo do Asana — Painel com progresso em tempo real (projetos, tarefas, comentários)
- Perfis — Visualização de perfis sintetizados (clientes, equipe, processos)
- Segurança — Login com 2FA via WhatsApp, log de acessos com geolocalização
- Email + Senha — hash bcrypt (custo 12)
- 2FA via WhatsApp — código de 6 dígitos, expira em 5 minutos
- JWT — token com expiração de 8 horas
- Bloqueio após 5 tentativas (lockout de 15 minutos)
- Rate limiting: 10 tentativas/min por IP
- Alerta via WhatsApp para IPs desconhecidos
- Geolocalização de acessos via ip-api.com
- Zero segredos no código — scan automático nos testes
.env— todas as credenciaisauth_session/— sessão do WhatsAppgoogle-calendar-key.json— service account do GCalaudio_files/— áudios temporários
git push origin master
│
├─ CI (ci.yml)
│ ├─ Node 20 + npm ci
│ └─ npm test (25 testes + scan de credenciais)
│
└─ Deploy (deploy.yml) — executa apenas se CI passou
├─ SSH via chave Ed25519 (GitHub Secrets)
├─ rsync (exclui .env, auth_session, node_modules)
├─ npm ci --production
└─ PM2 restart
Secrets necessários no GitHub:
VPS_SSH_KEY— chave privada Ed25519VPS_HOST— IP do servidorVPS_USER— usuário SSH
npm test25 casos de teste cobrindo:
- Detecção de tipos de mídia (
getMediaType) - Extração de remetente em DMs e grupos (
extractSender) - Validação de respostas do Jarvis (
isValidResponse) - Roteamento de agentes por intenção (
classifyIntent) - Documentação do
.env.example - Scan de credenciais — varre todos os
.mjspor chaves/tokens hardcoded
# Subir serviços
docker compose up -d
# Verificar status
docker compose ps
# Logs
docker compose logs -f
# Parar
docker compose down| Serviço | Imagem | Porta | Volume |
|---|---|---|---|
| PostgreSQL | postgres:16-alpine |
127.0.0.1:5432 |
postgres_data |
| Redis | redis:7-alpine |
127.0.0.1:6379 |
redis_data |
Ambos com health check e bind exclusivo em localhost (sem exposição externa).
pm2 start jarvis-v2.mjs --name jarvis # Iniciar
pm2 restart jarvis # Reiniciar
pm2 logs jarvis # Logs em tempo real
pm2 status # Status
pm2 save # Salvar processosProjeto privado da Stream Lab. Todos os direitos reservados.