hub
F5 Hub
Painel de Sistemas
chat

Kommo Agent

Agentes
● Online

Assistente WhatsApp comercial via Kommo Salesbot

info O que faz

Calculadora de malhas F5. Responde leads via Salesbot (return_url). Debounce 6s, allowlist pipelines. FSM - DÚVIDAS + funil de calculo.

schedule Agendamentos (1)

Backup pg_dump → Google Drive 15 3 * * *
Diário 03:15 BRT
pg_dump → tar.gz → rclone → Google Drive F5

description Documentação (CLAUDE.md)

# CLAUDE.md — Contexto Permanente do Projeto
# F5 Têxtil | Kommo Agent
# Atualizado em: 2026-04-10

## 1. SOBRE O PROJETO

**Nome:** Kommo Agent
**Objetivo:** Agente conversacional que recebe leads pelo Kommo, roteia por funil para um dos três modos (cálculo de malhas, dúvidas do workshop FSM, consultor genérico) e responde via Salesbot mantendo a conversa rastreável no chat do Kommo.
**Fase atual:** Produção
**Documentação completa:** [PRD.md](PRD.md) · [ARCHITECTURE.md](ARCHITECTURE.md) · [SCHEMA.md](SCHEMA.md) · [STATUS.md](STATUS.md)

## 2. STACK TECNOLÓGICO

- **Linguagem:** Python 3.12
- **Backend:** FastAPI 0.115 + Uvicorn 0.30
- **LLM:** Anthropic SDK 0.40 — modelo `claude-haiku-4-5-20251001`
- **Banco:** SQLite — único banco vivo é `/app/data/conversations.db`. Outros `.db` no disco estão mortos e serão apagados na Fase 1.
- **Auth dashboard:** HTTP Basic (deprecated, marcado para remoção)
- **Deploy:** Docker Compose + Traefik (Let's Encrypt) → `https://kommo-agent.srv1440237.hstgr.cloud`
- **Envs:** `/root/shared.env` (montado como `env_file`)

## 3. INVARIANTES — NÃO QUEBRAR NUNCA

Estas são as leis do sistema. Mudar qualquer uma delas exige decisão arquitetural explícita do Sandro.

### I1. `return_url` do Salesbot é o ÚNICO gate
- Sem `return_url` armazenado para o `lead_id` → **não chama LLM, não responde, não faz nada**.
- O gate vive em [`main.py`:`_processar_lead_debounced`](main.py).
- **Proibido** adicionar filtros de `pipeline_id`/`status_id` no código que substituam o gate. Quem decide onde o agente atua é o Salesbot configurado dentro do Kommo.
- Audit notes (⚠️) no lead Kommo são **obrigatórias** quando o gate é atravessado erroneamente — foram elas que revelaram o vazamento do lead 38998716 historicamente.

### I2. Toda resposta de conversação sai pelo Salesbot `return_url`
- **Proibido** fallback WhatsApp direto para respostas de conversação geradas pelo LLM (modos `calculo`, `consultor`, `duvidas_workshop`).
- Motivo: rastreabilidade. Mensagem fora do Salesbot não aparece no chat do Kommo e desorganiza o histórico do lead.

**Exceções legítimas** (única parte do código onde WhatsApp direto é permitido):
- **[`leadform.py`](leadform.py):** inicializa conversa nova a partir de Facebook Lead Ads, onde o lead ainda não existe no Kommo e portanto **não há Salesbot ativo nem `return_url` disponível**. Usa `whatsapp_client.enviar_mensagem` direto + `message_router.enviar_template` para templates aprovados (`lead_form_resultado`, `lead_form_incompleto`).
- **Depois da primeira mensagem** do `leadform`, o lead vira contato no Kommo, o Salesbot assume o fluxo, e a exceção deixa de se aplicar — todas as próximas mensagens passam pelo caminho normal (webhook Kommo → Salesbot → return_url).
- **F14 `resgate.py` (desabilitado em 2026-04-08):** tentava usar WhatsApp direto para leads parados. Foi desabilitado **exatamente** por quebrar essa rastreabilidade. Não reativar sem antes decidir canal de saída alternativo.

**Regra para futuras exceções:** qualquer novo ponto de entrada que precise mandar WhatsApp direto (ex: importação via API externa, cron de re-engajamento) **exige decisão arquitetural explícita do Sandro antes de ser implementado**. Não copiar o padrão do `leadform.py` sem revalidar por que a exceção se aplica ao novo caso. Ver decisão D11 no [ARCHITECTURE.md](ARCHITECTURE.md).

### I3. Sem emoji nem travessão NAS RESPOSTAS QUE VÃO PELO SALESBOT
- **Escopo:** respostas do bot que saem pelo `return_url` do Salesbot (modos `calculo`, `consultor`, `duvidas_workshop`) **nunca** contêm emoji nem travessão (`—`).
- **Por quê:** o canal Salesbot → WhatsApp renderiza emoji como `?`, produzindo padrões `! ?` indesejados na conversa.
- **Como:** o LLM eventualmente desobedece o prompt → `_fix_whatsapp_formatting()` em [`agent.py`](agent.py) aplica regex pós-geração como defesa em profundidade. Cobre 8 ranges Unicode de emoji + `**bold**`→`*bold*` + travessão→vírgula + normalização de espaços.
- Use `*um asterisco*` para negrito (formatação WhatsApp), nunca `**dois**`.
- **Canais que podem usar emoji** (não passam pelo `_fix_whatsapp_formatting`):
  - Notas internas no Kommo via `kommo_client.adicionar_nota` (cabeçalhos `🧶`, `📊`, `🎯`, `🔍`, `⚠️` etc.)
  - Notificações Telegram via `_notificar_telegram` (`✅`, `💰`)
  - Templates WhatsApp aprovados (não passam pelo Salesbot)
  - Canais futuros que não sejam Salesbot return_url

### I4. F5 só atende malha
- F5 não vende malha — ensina a fabricar terceirizado.
- F5 NÃO atende tecido plano: oxford, linho, cetim, tricoline, sarja, brim, jeans, popeline, tafetá, gabardine, voil, chiffon, organza.
- Atenção: viscose e microfibra existem em malha e plano → tratar como malha por default; só recusar se lead disser explicitamente que é a versão plana.
- Recusa é educada e sempre redireciona para malha.

### I5. Tokens nunca em código nem prompts
- Tudo via `/root/shared.env`.
- Nada de `KOMMO_TOKEN = "abc..."` em arquivo. Se ver isso, recusar e reportar.

#