OminiConnect — Arquitetura do Ecossistema
Esta é a documentação técnica de como o sistema funciona internamente.
Para visão de produto, ver
README.md. Para regras, verRULES_AND_POLICIES.md.
Visão geral
OminiConnect é um SaaS multi-tenant de prospecção e CRM, composto por 9 agents autônomos que cooperam via eventos compartilhados (Postgres + filas em-memória + HTTP interno).
┌──────────────────────────────────────────────┐
│ CANAIS │
│ WhatsApp · E-mail · Voice · Manual │
└─────────┬───────────────────┬────────────────┘
│ │
▼ ▼
┌─────────────────────────────┐ ┌─────────────────────────┐
│ 💬 WhatsApp Engine │ │ 📤 Cold Email Sender │
│ (Baileys + Intent + LLM) │ │ (SMTP + pixel + click) │
└────────┬─────────────────────┘ └──────────┬──────────────┘
│ │
│ /bot/flow-trigger │ /me/cold-email/send
▼ ▼
┌──────────────────────────────────────────────────────────┐
│ 🌐 API Backend (FastAPI) │
│ · Autenticação, multi-tenant, tracking, webhooks │
│ · Phone Reality · Email Reality │
│ · /admin/agents/overview (observabilidade unificada) │
└─────────┬──────────────────────────────┬──────────────────┘
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────────┐
│ 📊 CRM Auto-Move │ │ 📬 Email Inbox IA │
│ (poll 5min) │ │ (IMAP poll 60s) │
└─────────────────────┘ └─────────────────────────┘
│ │
└──────────┬───────────────────┘
▼
┌──────────────────────────────────────────────────────────┐
│ 🛡 Sales Sentinel · 🛡📧 Email Sentinel │
│ Monitoram tudo · pausam o que tá ruim · auto-heal │
└──────────────────────────────────────────────────────────┘
Os 9 agents
1. 💬 WhatsApp Engine (omini_engine)
- Tecnologia: Node.js + Baileys 6.7.21 + TypeScript
- Container:
omini_engine - Responsabilidades:
- Manter sessões WhatsApp ativas (multi-instância por user)
- Receber mensagens, classificar intent (DeepSeek
chat) - Gerar resposta com contexto (
lead-context.tsagrega dossier + stage + email_thread) - Aplicar Voice Safety (caps LOCKED)
- Trigger
/bot/flow-triggerno backend pra captura inbound + flows - Fonte:
/srv/omini-prod/engine/src/
2. 🌐 API Backend (evolution_ominiconnect)
- Tecnologia: Python 3.12 + FastAPI + asyncpg + Redis
- Container:
evolution_ominiconnect(porta interna 6000, publicada 5050) - Responsabilidades:
- 200+ endpoints REST (
/me/,/admin/,/api/,/v2/) - Autenticação JWT, multi-tenant strict (filtro
user_idem TODO query) - Tracking pixel/click pra cold email
- Webhooks de pagamento + outbound
- Phone Reality + Email Reality validators
- Endpoint unificado de observabilidade:
/admin/agents/overview - Fonte:
/srv/omini-prod/backend/ominiconnect_api.py+backend/modules/*
3. 🛡 Sales Sentinel (sales_sentinel)
- Tecnologia: Python loop daemon
- Container:
sales_sentinel - Responsabilidades:
- Detectar soft-ban WhatsApp (envios falhando consistentemente)
- Detectar QR-loop (instância caindo e gerando QR repetidamente)
- Auto-pausar voice_outreach quando padrão suspeito é detectado
- Atualizar
omini.sentinel_state(status, sends_today, daily_cap) - Gerar alertas em
omini.sentinel_alerts - Auto-heal: campanhas pausadas por >24h com métricas normalizadas voltam a
running
4. 📊 CRM Auto-Move (crm_auto_move_worker)
- Tecnologia: Python loop, poll 5min
- Container:
crm_auto_move_worker - Responsabilidades:
- Avaliar todos deals abertos do user
- Aplicar regras de movimento por interação:
- Lead respondeu →
EmContato - Lead pediu reunião/proposta →
Proposta - Lead disse "não" /
intent=recusou→Perdido - Open + click email + reply →
EmContato - Atualizar
crm_deals.stage+omini.leads.status - Fonte:
/opt/evolution/scripts/crm_auto_move_worker.py(sync praops/)
5. 🎙 Voice Outreach (voice_outreach_worker)
- Tecnologia: Python loop, poll 30s
- Container:
voice_outreach_worker - Responsabilidades:
- Renderizar texto → áudio (TTS Coqui/ElevenLabs/OpenAI)
- Enviar voice note via Engine
- Respeitar Voice Safety LOCKED (caps hardcoded)
- Atualizar CRM (deal → EmContato no envio)
- Caps obrigatórios: 5/dia, 3/h, 600s entre envios, require_prior_conversation=true
6. 📤 Cold Email Sender (cold_email_worker)
- Tecnologia: Python loop, poll 30s
- Container:
cold_email_worker - Responsabilidades:
- Render template (Jinja2-like, vars:
{primeiro_nome},{empresa},{nicho}) - SMTP send (porta 587 STARTTLS ou 465 SSL)
- Inject tracking pixel:
<img src="/track/open/{job_id}" width=1 height=1> - Wrap CTA WhatsApp:
https://wa.me/X?text=Y→/track/click/{job_id}?to=wa - Append unsubscribe footer obrigatório
- Update CRM: deal →
EmContatono envio - Fonte:
/srv/omini-prod/ops/cold_email_worker.py
7. 📬 Email Inbox IA (email_inbox_worker)
- Tecnologia: Python loop, IMAP poll 60s
- Container:
email_inbox_worker - Responsabilidades:
- Match Message-ID com job enviado anteriormente
- LLM classifica intent:
interessado/pediu_info/recusou/unsubscribe/duvida/outro - Gerar resposta automática + embutir CTA WhatsApp
- Respeitar
email_ai_paused(operador assumiu = IA cala) - Intent
recusou/unsubscribe→ blacklist + dealPerdido - Fonte:
/srv/omini-prod/ops/email_inbox_worker.py
8. 🛡📧 Email Sentinel (email_sentinel)
- Tecnologia: Python loop, poll 5min
- Container:
email_sentinel - Responsabilidades:
- Computar por campanha: bounce_rate, open_rate, click_rate, reply_rate
- Regras automáticas:
- bounce_rate > 8% → pausa campanha (critical)
- open_rate < 5% após 100 envios → warning
- reply_rate < 0.3% após 200 envios → throttle (cap diário caí 50%)
- fail_rate > 10% → pausa (critical)
- Self-heal: campanha pausada > 24h com bounce < 3% volta a rodar
- Alertas em
omini.sentinel_alerts(prefixcode='EMAIL_*') - Fonte:
/srv/omini-prod/ops/email_sentinel_worker.py
9. 🧠 LLM Router (evolution_llm_router)
- Tecnologia: Python + FastAPI, porta 5000
- Container:
evolution_llm_router - Responsabilidades:
- Roteamento entre OpenAI e DeepSeek por complexidade
- Mensagens simples (saudação, sim/não) → DeepSeek
chat(barato) - Mensagens complexas (negociação, objeção) → OpenAI
gpt-4o-mini - Reduz custo médio ~70% sem perder qualidade
- Logging completo em
omini.llm_calls
Arquitetura de produto (3 telas)
O sistema de outbound tem 3 telas com papéis bem definidos:
📡 Caça-Leads (gerador)
↓ leads.email, leads.phone, leads.cnpj_data preenchidos
🚀 Outbound Hub (disparador)
↓ campanhas-irmãs em N canais
📋 CRM (acionamento individual)
↓ manual / bulk / Sales Agent IA
📡 Caça-Leads — gerador oficial
Fonte primária de leads. Captura por nicho/cidade, gera dossiê comercial, enriquece automaticamente (email_enricher do website + BrasilAPI do CNPJ). Cria leads em omini.leads com source='leadgen_scrape'.
🚀 Outbound Hub — disparador unificado
Tela única /outbound agregando campanhas dos 3 canais via VIEW omini.v_outbound_campaigns.
Estratégia de canais (você decide o risco):
| Canal | Risco em frio | Comportamento |
|---|---|---|
| ✅ Seguro | LGPD B2B (Art. 7º IX). Pré-marcado, recomendado. | |
| 🎙 Voice TTS | 🟡 Médio | Cap LOCKED 5/dia. Warning visual. |
| 🔴 Alto | Warning vermelho explícito. Disparado mesmo assim se user escolher. |
Princípio: avisar, não impedir. O usuário é informado dos riscos via UI, tutorial e RULES_AND_POLICIES.md (Regra #19), mas o sistema executa a vontade dele. Sales Sentinel monitora e pausa em casos críticos.
📋 CRM — acionamentos individuais
Pipeline Kanban. Cada card de lead permite:
- Envio manual (texto WhatsApp)
- Bulk action (acionar IA em N leads)
- Live Email Thread (modal de conversa por e-mail)
- Modal de detalhe com dossiê + histórico
Fluxos canônicos
Fluxo 1: Outbound WhatsApp (Caça-Leads)
1. User cria campanha em /leadgen
2. Backend scrape Google Maps + enriquece (BrasilAPI CNPJ)
3. Lead criado com source='leadgen_scrape', deal em stage 'Lead'
4. User aciona Sales Agent IA (bulk ou single)
5. Phone Reality valida número
6. Engine envia 1ª mensagem com roteiro renderizado
7. Lead responde → Engine classifica intent → resposta personalizada
8. CRM Auto-Move avalia → deal sobe pra 'EmContato'
9. Conversa evolui → deal sobe stages → fecha em 'Fechado' ou 'Perdido'
Fluxo 2: Cold Email + Handoff WhatsApp
1. User cadastra conta SMTP/IMAP em /cold-email
2. User cria campanha (template, niche, daily_cap, window)
3. Cold Email Sender envia respeitando cap + window
4. Email Reality filtra inválidos antes
5. Pixel mede open / redirect mede click / IMAP detecta reply
6. Lead clica CTA WhatsApp → Engine recebe msg
7. Email Inbox IA marca lead como 'engaged' / clicked_wa=true
8. Engine assume conversa com contexto completo (email_context_summary no system_prompt)
9. CRM unifica: 1 deal, múltiplos canais visíveis em /me/leads/{id}/email-thread
Fluxo 3: Inbound WhatsApp (orgânico)
1. Pessoa manda WhatsApp do nada (viu Instagram, indicação, anúncio)
2. Engine recebe → chama /bot/flow-trigger com sender_pn + push_name
3. Backend: Phone Reality valida real (não broadcast/group/lid)
4. Não existe lead pra esse phone → cria com source='inbound_whatsapp', score=75
5. Cria contato CRM + deal stage 'Lead'
6. Flows com trigger='first_contact' disparam
7. Engine assume conversa com IA
8. Mesmo fluxo de qualificação do Fluxo 1 daí em diante
Fluxo 4: Sentinel detecta problema
1. Email Sentinel calcula bounce_rate da campanha X = 12%
2. Avalia regra: 12% > 8% threshold critical
3. Update campanha: status='paused', paused_by_sentinel_at=NOW(), paused_reason='high_bounce'
4. Insert alert: severity='critical', code='EMAIL_BOUNCE_HIGH', action_taken='auto_pause'
5. Admin abre /agent-observability → vê o agent 'email_sentinel' em warning
6. Timeline mostra o alert + ação taken
7. Admin investiga / corrige template / reativa manualmente OU espera self-heal
Marketing site → vendas integradas
O landing público (/landing) é parte do funil — não é só "página institucional".
Pontos de captura:
- Form inline no hero (visível imediatamente)
- Sticky CTA bar bottom-right (aparece após 800px scroll)
- Popup completo de cupom (lead-capture popup com CPF/CNPJ validados na Receita)
Endpoint público: POST /api/public/lead-capture-demo
- Aceita: name, email, phone (opcional), company, lead_magnet, utm_*
- Sem autenticação, idempotente por email
- Pipeline:
- INSERT em
omini.leads(user_id=1, source='website_landing', score=80) - INSERT em
crm_deals(pipeline default, stage='Lead', notes com UTM + magnet) - Dispara e-mail welcome via SMTP do sistema (
📧 Sistema · Hostinger) - Notifica admin via OminiComms feed
Pós-captura: admin pode rodar campanha de nurturing no Outbound Hub filtrando source='website_landing'.
Bancos de dados
Postgres evolution
- Schema
omini(multi-tenant): leads, conversations, instances, blacklist, sentinel_alerts, sentinel_state, voice_send_log, email_threads, email_send_log, email_blacklist, smtp_accounts, cold_email_campaigns, cold_email_recipients - Schema
public(CRM): crm_pipelines, crm_stages, crm_deals, crm_contacts, flows, flow_runs, leads (legado), users, billing_*
Redis
- Sessões WhatsApp (auth keys do Baileys)
- Rate-limit sliding window
- WebSocket Pub/Sub de notificações
- Cache de leads/deals quentes
Deploy
Git-based deploy via post-receive hook em /srv/omini-prod.git:
git push origin main(do dev local OU do/srv/omini-prod/)- Hook valida GATE 1 (JS
node --checkem scripts inline) + GATE 2 (py_compile) - Reseta working tree em
/srv/omini-prod/ - Copia arquivos pra runtime (
/opt/evolution/scripts/,/opt/omini-engine/src/,/var/www/saas/) - Build engine TypeScript + docker cp dist → omini_engine
- Restart granular dos containers afetados (não restarta tudo)
Detalhes em CLAUDE.md e CICD_PIPELINE.md.
Observabilidade
- Logs:
docker logs <container>(rotacionados pela Docker) - Alerts:
omini.sentinel_alerts(severity: info/warning/critical) - Audit:
omini.audit_log(todas ações sensíveis) - Metrics:
/admin/agents/overviewagrega tudo em JSON - UI: rota
/saas/#agent-observability(admin-only) — auto-refresh 10s - Sentry + OpenTelemetry: fallback silencioso se libs não instaladas
Política de segurança
Ver RULES_AND_POLICIES.md — 18 regras invioláveis cobrindo:
- Multi-tenant strict
- LGPD compliance
- Anti-banimento WhatsApp
- Cold Email LGPD B2B
- Voice Safety LOCKED
- Observabilidade & Auditoria
- Inbound Capture & Source Tracking
Última revisão: Maio 2026 — v2.1
Esta documentação reflete o sistema em produção em luizrjesus.app.br.
Para regras invioláveis, ver Termos. Para dados pessoais, ver Privacidade.