{
  "name": "WAIA Connect — Asistente con IA (ejemplo técnico)",
  "nodes": [
    {
      "parameters": {
        "content": "## Asistente con IA — EJEMPLO TÉCNICO\n\nCómo conectar un LLM a la API: entra un `message.received`, se lo pasás al modelo, y respondés con lo que devuelve.\n\n⚠ **La clave del modelo (OpenAI / Anthropic) es TUYA — ese costo corre por tu cuenta.** El nodo IA usa un placeholder.\n\n⚠ **Esto es un ejemplo de cómo cablear un LLM, NO un producto.** Si querés el asistente resuelto (memoria, tono, escalado a humano, agenda), eso es **WAIA** — no armes tu bot productivo acá.\n\n1. **Webhook (POST)** → Header Auth (Name=`X-Connect-Token`, Value=tu `wct_…`).\n2. **Config**: `apiBase`, tu API key de Connect (`wc_live_…`), tu clave del LLM y el modelo.\n3. **IF** deja pasar solo `message.received`.\n4. **Preguntar al LLM** llama al proveedor; **Responder** manda la respuesta por `POST /v1/messages`.",
        "height": 380,
        "width": 460
      },
      "id": "ai-sticky",
      "name": "Asistente IA — leeme",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-600, 80]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "waia-connect-ai-assistant",
        "authentication": "headerAuth",
        "responseMode": "onReceived",
        "options": {}
      },
      "id": "ai-webhook",
      "name": "Webhook (POST)",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1.1,
      "position": [-80, 320],
      "webhookId": "waia-connect-ai-assistant",
      "notes": "POST + Header Auth."
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            { "id": "a-base", "name": "apiBase", "type": "string", "value": "https://api.waiaconnect.com" },
            { "id": "a-key", "name": "apiKey", "type": "string", "value": "wc_live_YOUR_API_KEY" },
            { "id": "a-llm", "name": "openaiKey", "type": "string", "value": "sk-TU_CLAVE_DE_OPENAI" },
            { "id": "a-model", "name": "model", "type": "string", "value": "gpt-4o-mini" }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "ai-config",
      "name": "Config",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [200, 320],
      "notes": "La clave del LLM es TUYA (costo tuyo). Guardala en una credencial de n8n si compartís el workflow."
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "typeValidation": "strict" },
          "conditions": [
            { "id": "c-recv", "leftValue": "={{ $json.body.type }}", "rightValue": "message.received", "operator": { "type": "string", "operation": "equals" } }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "ai-if",
      "name": "¿Es message.received?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [480, 320]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.openai.com/v1/chat/completions",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            { "name": "Authorization", "value": "=Bearer {{ $('Config').item.json.openaiKey }}" },
            { "name": "Content-Type", "value": "application/json" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ model: $('Config').item.json.model, messages: [ { role: 'system', content: 'Sos un asistente breve y amable para WhatsApp. Respondé en el idioma del cliente.' }, { role: 'user', content: ($json.body.data.message && $json.body.data.message.text ? $json.body.data.message.text.body : '') } ] }) }}",
        "options": {}
      },
      "id": "ai-llm",
      "name": "Preguntar al LLM",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [760, 260],
      "notes": "Ejemplo con OpenAI. Para Anthropic: URL https://api.anthropic.com/v1/messages + header x-api-key + anthropic-version. La clave la ponés vos."
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Config').item.json.apiBase }}/v1/messages",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            { "name": "Authorization", "value": "=Bearer {{ $('Config').item.json.apiKey }}" },
            { "name": "Content-Type", "value": "application/json" },
            { "name": "Idempotency-Key", "value": "={{ $('Webhook (POST)').item.json.body.id }}" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ connectionId: $('Webhook (POST)').item.json.body.connection.id, to: $('Webhook (POST)').item.json.body.data.message.from, type: 'text', text: { body: ($json.choices && $json.choices[0] ? $json.choices[0].message.content : 'Gracias por escribir.') } }) }}",
        "options": {}
      },
      "id": "ai-reply",
      "name": "Responder (POST /v1/messages)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [1040, 260],
      "notes": "Manda la respuesta del LLM al mismo número. Idempotency-Key = id del evento."
    }
  ],
  "connections": {
    "Webhook (POST)": { "main": [ [ { "node": "Config", "type": "main", "index": 0 } ] ] },
    "Config": { "main": [ [ { "node": "¿Es message.received?", "type": "main", "index": 0 } ] ] },
    "¿Es message.received?": { "main": [ [ { "node": "Preguntar al LLM", "type": "main", "index": 0 } ], [] ] },
    "Preguntar al LLM": { "main": [ [ { "node": "Responder (POST /v1/messages)", "type": "main", "index": 0 } ] ] }
  },
  "active": false,
  "settings": { "executionOrder": "v1" },
  "pinData": {},
  "meta": { "templateCredsSetupCompleted": false }
}
