Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.
Integrations
ghl-integration
Try itFerramenta de integração com o GoHighLevel (GHL) API v2. Permite gerenciar contatos, mover cartões no Kanban, identificar leads sem resposta, adicionar contatos a fluxos, ENVIAR MENSAGENS DIRETAS e receber novos leads instantaneamente via WEBHOOK.
What it does
GoHighLevel (GHL) API v2 Integration Skill **Desenvolvido por / Créditos:** Rafa Martins (rafacpti@gmail.com)
The skill document
GoHighLevel (GHL) API v2 Integration Skill
Desenvolvido por / Créditos: Rafa Martins (rafacpti@gmail.com)
Esta skill permite ao Hermes interagir com a API v2 do GoHighLevel por meio do utilitário local ghl_client.py e receber eventos instantâneos com ghl_webhook_server.py.
⚠️ REGRA DE GOVERNANÇA E HUMAN-IN-THE-LOOP (CRÍTICO)
Para proteção contra loops e destruição de dados acidentais no CRM:
- PROIBIDO DELETAR contatos, oportunidades, mensagens, tarefas ou notas de forma autônoma.
- PROIBIDO DESATIVAR OU ALTERAR Workflows/Automações estruturais no GHL.
- Se houver comandos para destruição de dados ou cancelamento em lote, o Hermes DEVE pausar e solicitar autorização explícita do usuário humano primeiro.
- Operações de exclusão na API devem sempre usar confirmação manual (
Human-in-the-Loop).
🚨 PITFALL: mensagens de broadcast de TERCEIROS contaminam relatórios
As conversas retornadas por --action unanswered incluem listas de transmissão, grupos e
comunidades que o próprio usuário assina (ex.: comunidades de API/dev, avisos de "estamos ao
vivo", convites para imersões/webinars). Elas trazem URLs promocionais de terceiros.
Se um relatório automatizado (cron de auditoria) extrai URLs dessas conversas e as mistura com as URLs reais dos criativos de anúncio, cria um ativo fantasma que parece campanha ativa. Isso já aconteceu e gerou o falso positivo "Evolution Imersão" em relatório de Meta Ads.
Regras:
- URLs vindas de conversas do GHL nunca entram em tabelas de "Auditoria de Landing Pages"
ou de destinos de anúncio. Essas tabelas só aceitam URLs extraídas de
adcreatives. - Se links de conversas forem relevantes, coloque-os em seção separada rotulada como "links recebidos de terceiros (não são destinos de anúncio)".
- Antes de tratar um remetente como lead, verifique se é pessoa física:
phonecom formato+120363330319945564(muito longo, sem DDI válido) indica grupo/broadcast, não contato. - Ao investigar de onde saiu um nome estranho em relatório, faça grep primeiro nos outputs do
cron e nos dumps de sessão — antes de acusar a plataforma de anúncios:
grep -i -n -E "" /root/.hermes/cron/output/*.txt grep -rhoi -E ".{0,300}" /root/.hermes/sessions/*.json | sort -u | head
⚡ Variáveis de Ambiente Necessárias (Adicionar ao .env ou config.yaml)
GHL_API_KEY=sua_location_api_key_aqui
GHL_LOCATION_ID=seu_location_id_aqui
GHL_WEBHOOK_PORT=8080
MANAGER_PHONE=telefone_do_gestor_para_alertas
🟢 WEBHOOK EM TEMPO REAL: RECEBER LEADS
Para receber leads de forma síncrona sem colisões multi-conta:
- Inicie o servidor HTTP interno do Hermes:
python3 /root/.hermes/metaads/ghl_webhook_server.py - No Workflow do GoHighLevel, aponte a ação HTTP POST de Webhook para:
http://IP_DO_HERMES:GHL_WEBHOOK_PORT/webhook/
🛠️ Comandos de Execução no Terminal
O agente executa estas tarefas chamando diretamente o script /root/.hermes/metaads/ghl_client.py via Python:
1. Enviar Mensagem Direta (E-mail, SMS ou WhatsApp via STEVO)
# Enviar E-mail
python3 /root/.hermes/metaads/ghl_client.py --action send_msg --contact-id --msg-type "Email" --subject "Sua Proposta Chegou!" --message "Olá, segue aqui a sua proposta comercial."
# Enviar SMS ou WhatsApp
python3 /root/.hermes/metaads/ghl_client.py --action send_msg --contact-id --msg-type "WhatsApp" --message "Olá! Vimos seu cadastro no Instagram. Como podemos te ajudar?"
2. Encontrar Leads Sem Resposta (Inbound pendentes)
python3 /root/.hermes/metaads/ghl_client.py --action unanswered
3. Mover Lead no Kanban (Mudar Etapa)
python3 /root/.hermes/metaads/ghl_client.py --action update_opp_stage --opp-id --stage-id
4. Criar Contato com Tags do Meta Ads
python3 /root/.hermes/metaads/ghl_client.py --action create_contact --email "exemplo@email.com" --name "João Silva" --phone "+551****9999" --tags "meta-ads"
💡 COMPORTAMENTOS CONHECIDOS & TROUBLESHOOTING
- Diferença entre Conversation ID e Contact ID:
Ao executar a listagem de leads sem resposta via
--action unanswered, saiba que a chave"id"no payload de conversas representa o Conversation ID daquela conversa específica. No entanto, para enviar mensagens (--action send_msg) ou manipular o contato, é obrigatório passar o Contact ID (que vem sob a chave"contactId"no payload bruto do GHL). Sempre certifique-se de obter e usar o ID do contato e não o ID da conversa.- Header de Versão Obrigatório (
Version: 2021-04-15): Ao fazer chamadas diretas REST para a API do LeadConnector/GHL (/conversations/search), utilize obrigatoriamente o headerVersion: 2021-04-15. O uso de versões mais recentes (como2021-07-28) retorna payload vazio ({"conversations": []}). - Workaround via raw API / Helper Script: Para obter o
contactIdde cada conversa retornada pelo script, faça chamada direta utilizando obrigatoriamente a base da API v2 (https://services.leadconnectorhq.com— NUNCA utilizerest.gohighlevel.comlegada, pois ela retorna 0 conversas nos endpoints v2). Para evitar erros de parsing de.env(como 401 Invalid JWT por aspas não tratadas), importe o cliente diretamente:import sys, requests sys.path.append('/root/.hermes/metaads') import ghl_client headers = ghl_client.get_headers() loc_id = ghl_client.GHL_LOCATION_ID url = f"{ghl_client.GHL_API_BASE}/conversations/search" params = {"locationId": loc_id, "limit": 30} res = requests.get(url, headers=headers, params=params) for conv in res.json().get("conversations", []): conv_id = conv.get("id") contact_id = conv.get("contactId") # ← o campo correto name = conv.get("contactName") phone = conv.get("phone") - Ordenação Temporal de Mensagens (
dateAdded): Ao consultar/conversations/{conv_id}/messages, as mensagens na lista podem vir desordenadas. Para identificar com certeza quem enviou a última mensagem (inboundvsoutbound), ordene a lista pordateAdded(ISO 8601):sorted_msgs = sorted(msgs, key=lambda x: x.get("dateAdded", "")) last_msg = sorted_msgs[-1] if sorted_msgs else None - Notas sobre f-strings no terminal Python one-liner: Ao escrever
-cone-liners Python com f-strings, evite backslashes dentro das chaves do f-string (sintaxe inválida no Python 3.11-). Use variáveis intermediárias:# ERRADO: print(f"{d.get(\"key\")}") # CERTO: val = d.get("key") print(f"{val}")
- Header de Versão Obrigatório (
- Triagem de Mensagens Sem Resposta:
Para classificar leads obtidos via
--action unanswered, utilize a taxonomia de triagem definida emreferences/unanswered_leads_triaging_patterns.md(classificando entre Faturamento, Notificação de Sistema, Erro de Integração ou Engajamento Ativo). - Queda de Conexão do Gateway (WhatsApp Inativo):
Se o webhook ou cron relatar que o serviço "não está rodando" ou retornar tags do tipo
[P-mon] papi_disconnectedno campo de últimas mensagens, vejareferences/stevo-whatsapp.mdpara instruções de reconexão do QR Code.
Related skills
Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Read and write Excel workbooks, worksheets, ranges, tables, and charts in OneDrive through Microsoft Graph with managed OAuth.
Save, search, and manage personal notes and knowledge bases in Get笔记 on explicit request.
Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.
Write, debug, and tune Playwright specs with locator strategy, trace diagnosis, and CI-aware timeouts.
More from rafacpti23
Browse all skillsPAPI WhatsApp Cloud API - Envio e automação de mensagens WhatsApp (texto, PTT áudio de voz, mídias, botões interativos, enquetes, listas e webhooks).
Automate WhatsApp messaging, interactive content, instance and group management, catalogs, and webhooks via a scalable microservices API with an admin panel.
Zero-Knowledge persistent memory layer for Hermes Agent. Provides encrypted cross-session memory, Trust Quotient (TQ) scoring, and automatic recall across AL...
Provides persistent, encrypted AI agent memory with a 4-layer security pipeline for storing, retrieving, sharing, and analyzing agent memories.
Subagente autônomo especialista em Meta Ads. Cria campanhas completas via MCP (Super Prompt), gera criativos com IA, monitora métricas (CPA/ROAS/CTR), executa otimizações, pausa anúncios ruins e alerta via Papi. Suporta multi-contas de anúncios.
Motor autônomo de redação direta e criativos visuais de alta conversão para Meta Ads via Habilis MCP Gateway (https://xvix.com.br). Gera variações AIDA/PAS e publica criativos.