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. #