{
  "name": "DPL · 1B · Captura Inteligente (IA contextual)",
  "nodes": [
    {
      "id": "n1",
      "name": "Webhook",
      "parameters": {
        "httpMethod": "POST",
        "options": {},
        "path": "captura-inteligente-ia",
        "responseMode": "responseNode"
      },
      "position": [240, 300],
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "webhookId": "captura-inteligente-ia",
      "onError": "continueRegularOutput"
    },
    {
      "id": "n2",
      "name": "Preparar Contexto",
      "parameters": {
        "jsCode": "// Normaliza o payload vindo do ManyChat (External Request)\nconst b = $json.body ?? $json;\nconst nome = (b.nome || b.ig_username || 'cliente').toString().replace(/^@/, '');\nconst comentario = (b.comentario || b.comment_text || b.text || '').toString();\nconst contato = (b.contato || b.ig_id || b.subscriber_id || '').toString();\nconst origem_tipo = b.partner ? 'parceiro' : 'post_proprio';\nconst origem_ref = (b.partner || b.post_id || 'desconhecido').toString();\nreturn [{ json: { nome, comentario, contato, origem_tipo, origem_ref } }];"
      },
      "position": [460, 300],
      "type": "n8n-nodes-base.code",
      "typeVersion": 2
    },
    {
      "id": "n3",
      "name": "Responder (ack imediato)",
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ ok: true, status: 'recebido_processando' }) }}"
      },
      "position": [680, 300],
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1
    },
    {
      "id": "n4",
      "name": "Aguardar (parece humano)",
      "parameters": {
        "amount": 3,
        "resume": "timeInterval",
        "unit": "minutes"
      },
      "position": [900, 300],
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "webhookId": "dpl-1b-wait"
    },
    {
      "id": "n5",
      "name": "AI Agent",
      "parameters": {
        "options": {
          "systemMessage": "=Você é a assistente virtual de uma farmácia de manipulação, respondendo no direct do Instagram logo depois que a pessoa comentou num post.\n\nCONTEXTO:\nNome: {{ $('Preparar Contexto').item.json.nome }}\nComentário original: \"{{ $('Preparar Contexto').item.json.comentario }}\"\nOrigem: {{ $('Preparar Contexto').item.json.origem_tipo }} — {{ $('Preparar Contexto').item.json.origem_ref }}\n\nREGRAS OBRIGATÓRIAS:\n1. Tom caloroso e natural, como uma pessoa da equipe escreveria. Nunca formal ou robótico (\"Prezado(a) cliente\" é proibido).\n2. Releia o comentário original e responda reconhecendo especificamente o que a pessoa disse — nunca uma resposta genérica.\n3. NUNCA cite substância, indicação terapêutica ou preço nesta mensagem — isso só acontece depois, no WhatsApp, com a farmacêutica responsável.\n4. NUNCA prometa efeito, cura ou resultado (RDC 96/2008).\n5. Máximo 2 frases curtas.\n6. Sempre termine convidando a pessoa a continuar no WhatsApp, sem soar como venda.\n7. Retorne APENAS o texto da mensagem — sem aspas, sem explicações, sem markdown."
        },
        "promptType": "define",
        "text": "={{ $('Preparar Contexto').item.json.comentario }}"
      },
      "position": [1120, 300],
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1
    },
    {
      "id": "n6",
      "name": "Anthropic Chat Model",
      "parameters": {
        "model": {
          "mode": "id",
          "value": "claude-sonnet-4-6"
        }
      },
      "position": [1120, 500],
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.5
    },
    {
      "id": "n7",
      "name": "Montar Resposta",
      "parameters": {
        "jsCode": "// Limpa a saída do agente e reanexa os dados do lead\nconst texto = ($json.output || $json.text || '').toString().trim();\nreturn [{ json: {\n  resposta_ia: texto,\n  contato: $('Preparar Contexto').item.json.contato,\n  nome: $('Preparar Contexto').item.json.nome,\n  comentario: $('Preparar Contexto').item.json.comentario,\n  origem_tipo: $('Preparar Contexto').item.json.origem_tipo,\n  origem_ref: $('Preparar Contexto').item.json.origem_ref\n} }];"
      },
      "position": [1340, 300],
      "type": "n8n-nodes-base.code",
      "typeVersion": 2
    },
    {
      "id": "n8",
      "name": "Enviar via ManyChat API",
      "parameters": {
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.MANYCHAT_API_TOKEN }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "jsonBody": "={{ JSON.stringify({ subscriber_id: $json.contato, data: { version: 'v2', content: { type: 'instagram', messages: [ { type: 'text', text: $json.resposta_ia } ] } } }) }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "url": "https://api.manychat.com/fb/sending/sendContent"
      },
      "position": [1560, 300],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4
    },
    {
      "id": "n9",
      "name": "Registrar Interação IA",
      "parameters": {
        "operation": "executeQuery",
        "options": {},
        "query": "=UPDATE leads_funil SET intencao = '{{ $json.comentario.replace(/'/g, \"''\") }}', resposta_ia = '{{ $json.resposta_ia.replace(/'/g, \"''\") }}', status = 'contatado_ia', atualizado_em = now()\nWHERE contato = '{{ $json.contato }}'\nRETURNING id"
      },
      "position": [1780, 300],
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6
    },
    {
      "id": "n10",
      "name": "Nota — Visão Geral",
      "parameters": {
        "content": "## DPL · 1B — Captura Inteligente (IA contextual)\nVersão do WF1 que lê o comentário com IA e responde reconhecendo o que a pessoa disse — não por keyword, por entendimento real.\n\n**Fluxo:** Webhook (ManyChat) → normaliza → **responde 200 na hora** (evita timeout do External Request) → espera 3 min (parece humano, não bot instantâneo) → AI Agent (Claude) lê o comentário e gera a resposta respeitando compliance → envia de volta via API do ManyChat → registra no Supabase.\n\n**Antes de ativar:** anexar credencial Anthropic no nó 'Anthropic Chat Model', credencial Postgres no nó 'Registrar Interação IA', e configurar a env var MANYCHAT_API_TOKEN (gerada em Configurações → API no ManyChat).",
        "height": 260,
        "width": 1000
      },
      "position": [200, -140],
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1
    },
    {
      "id": "n11",
      "name": "Nota — Schema",
      "parameters": {
        "content": "## Rodar 1x no Supabase\n```sql\nALTER TABLE leads_funil\nADD COLUMN IF NOT EXISTS resposta_ia text;\n```\nSem isso, o UPDATE deste workflow falha (coluna não existe). O restante do schema é o mesmo do leads_funil já criado no WF1.",
        "height": 260,
        "width": 380
      },
      "position": [1740, -140],
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1
    },
    {
      "id": "n12",
      "name": "Nota — Ajustar Tempo",
      "parameters": {
        "content": "**3 minutos é ponto de partida.**\nAjuste o campo Amount deste nó Wait conforme testar. Curto demais ainda parece bot; longo demais e o lead esfria (lembra do 21× do curso).",
        "height": 180,
        "width": 300
      },
      "position": [840, 500],
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1
    }
  ],
  "connections": {
    "AI Agent": {
      "main": [[{ "index": 0, "node": "Montar Resposta", "type": "main" }]]
    },
    "Aguardar (parece humano)": {
      "main": [[{ "index": 0, "node": "AI Agent", "type": "main" }]]
    },
    "Anthropic Chat Model": {
      "ai_languageModel": [[{ "index": 0, "node": "AI Agent", "type": "ai_languageModel" }]]
    },
    "Enviar via ManyChat API": {
      "main": [[{ "index": 0, "node": "Registrar Interação IA", "type": "main" }]]
    },
    "Montar Resposta": {
      "main": [[{ "index": 0, "node": "Enviar via ManyChat API", "type": "main" }]]
    },
    "Preparar Contexto": {
      "main": [[{ "index": 0, "node": "Responder (ack imediato)", "type": "main" }]]
    },
    "Responder (ack imediato)": {
      "main": [[{ "index": 0, "node": "Aguardar (parece humano)", "type": "main" }]]
    },
    "Webhook": {
      "main": [[{ "index": 0, "node": "Preparar Contexto", "type": "main" }]]
    }
  },
  "settings": { "executionOrder": "v1" }
}
