{
  "name": "03 \u00b7 Triage con agente (bloque 05 \u00b7 19:00)",
  "nodes": [
    {
      "parameters": {
        "content": "## Bloque 05 \u00b7 19:00\n### De flujo a agente\n\nUn agente **no es \u00abm\u00e1s IA\u00bb**. Es qui\u00e9n decide el orden de los pasos.\n\nEn el flujo 02 el orden lo decid\u00edas vos: clasificar \u2192 rutear. Ac\u00e1 el agente tiene **tools** y elige cu\u00e1l usar y cu\u00e1ndo.\n\n\u25b6\ufe0f Corr\u00e9 la consulta pinneada: **necesita DOS tools** (buscar el estado del reintegro + consultar la base). Mir\u00e1 al agente elegir en el panel de ejecuci\u00f3n.\n\n\u2696\ufe0f El trade-off: gan\u00e1s flexibilidad, perd\u00e9s previsibilidad.",
        "height": 400,
        "width": 420,
        "color": 7
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000001",
      "name": "Gui\u00f3n",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -480,
        -120
      ]
    },
    {
      "parameters": {
        "formTitle": "Consultas",
        "formDescription": "Escribinos tu consulta y te respondemos.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "mensaje",
              "fieldType": "textarea",
              "placeholder": "Contanos qu\u00e9 necesit\u00e1s",
              "requiredField": true
            },
            {
              "fieldLabel": "email",
              "fieldType": "email",
              "requiredField": true
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000002",
      "name": "Entra una consulta",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Consulta del empleado {{ $json.email }}:\n\n{{ $json.mensaje }}",
        "options": {
          "systemMessage": "Sos el agente de soporte de una plataforma de beneficios para empleados.\n\nTu trabajo es resolver la consulta del empleado usando las herramientas que ten\u00e9s.\n\nC\u00f3mo trabaj\u00e1s:\n- Si la consulta menciona un tr\u00e1mite en curso, consult\u00e1 su estado antes de responder.\n- Si la consulta es sobre c\u00f3mo funciona un beneficio, busc\u00e1 en la base de conocimiento.\n- Si la consulta toca dos temas distintos, resolv\u00e9 los dos.\n- Si no pod\u00e9s resolverla con tus herramientas, escal\u00e1 a una persona.\n\nRespond\u00e9 en espa\u00f1ol rioplatense, en tono claro y directo. No inventes datos que no te dieron las herramientas."
        }
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000003",
      "name": "Agente de soporte",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        280,
        0
      ]
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {
          "temperature": 0.2
        }
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000004",
      "name": "Groq Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        120,
        240
      ]
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $json.email }}",
        "contextWindowLength": 5
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000005",
      "name": "Memoria",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        260,
        240
      ]
    },
    {
      "parameters": {
        "name": "consultar_estado_tramite",
        "description": "Devuelve el estado de un tr\u00e1mite en curso (reintegro, alta, cambio de plan) a partir del email del empleado. Usala cuando la consulta menciona algo que el empleado ya inici\u00f3 y est\u00e1 esperando.",
        "jsCode": "// Mock para el workshop: devuelve un estado fijo.\n// En producci\u00f3n esto ser\u00eda un HTTP Request contra tu backend.\nreturn JSON.stringify({\n  tramite: 'reintegro',\n  estado: 'pendiente de auditor\u00eda m\u00e9dica',\n  iniciado_hace_dias: 14,\n  demora_habitual_dias: 5,\n  atrasado: true\n});"
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000006",
      "name": "consultar_estado_tramite",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "typeVersion": 1.1,
      "position": [
        400,
        240
      ]
    },
    {
      "parameters": {
        "name": "buscar_en_base_de_conocimiento",
        "description": "Busca en la base de conocimiento interna c\u00f3mo funciona un beneficio o un procedimiento. Usala cuando el empleado pregunta c\u00f3mo hacer algo o qu\u00e9 cubre su plan.",
        "jsCode": "// Mock para el workshop: devuelve un art\u00edculo fijo.\n// En producci\u00f3n esto ser\u00eda un vector store o una b\u00fasqueda en tu wiki.\nreturn JSON.stringify({\n  articulo: 'Cambio de plan',\n  contenido: 'El cambio de plan se puede pedir una vez por a\u00f1o calendario. Se solicita desde el portal, secci\u00f3n Mi Plan, y se hace efectivo el primer d\u00eda del mes siguiente. No tiene costo.',\n  actualizado: '2026-03-01'\n});"
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000007",
      "name": "buscar_en_base_de_conocimiento",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "typeVersion": 1.1,
      "position": [
        560,
        240
      ]
    },
    {
      "parameters": {
        "name": "escalar_a_persona",
        "description": "Deriva la consulta a una persona del equipo. Usala solo cuando no puedas resolver la consulta con las otras herramientas.",
        "jsCode": "// Mock para el workshop.\nreturn JSON.stringify({\n  escalado: true,\n  cola: 'soporte-nivel-2',\n  mensaje: 'La consulta fue derivada a una persona del equipo.'\n});"
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000008",
      "name": "escalar_a_persona",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "typeVersion": 1.1,
      "position": [
        720,
        240
      ]
    },
    {
      "parameters": {
        "content": "### Tools + Contexto + Memoria\n\nEsto es lo que hace a un agente. Las tres cosas de la web:\n\n**Tools** \u2192 las 3 de abajo\n**Contexto** \u2192 el system message\n**Memoria** \u2192 el nodo Memoria\n\nLas tools son **mocks**: devuelven datos fijos. Para el workshop alcanza y no depend\u00e9s de ninguna API en vivo.\n\n---\n\n**La memoria necesita saber de qui\u00e9n es la conversaci\u00f3n.** Por eso la *session key* es el `email`: cada empleado tiene su propio hilo. Si pusieras un valor fijo, todos compartir\u00edan memoria y el agente mezclar\u00eda consultas ajenas.",
        "height": 400,
        "width": 340,
        "color": 5
      },
      "id": "a1b2c3d4-0003-4000-8000-000000000009",
      "name": "Nota tools",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        400,
        420
      ]
    },
    {
      "parameters": {},
      "id": "a1b2c3d4-0003-4000-8000-00000000000a",
      "name": "Responder al empleado",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        600,
        0
      ]
    }
  ],
  "connections": {
    "Entra una consulta": {
      "main": [
        [
          {
            "node": "Agente de soporte",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Agente de soporte",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memoria": {
      "ai_memory": [
        [
          {
            "node": "Agente de soporte",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "consultar_estado_tramite": {
      "ai_tool": [
        [
          {
            "node": "Agente de soporte",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "buscar_en_base_de_conocimiento": {
      "ai_tool": [
        [
          {
            "node": "Agente de soporte",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "escalar_a_persona": {
      "ai_tool": [
        [
          {
            "node": "Agente de soporte",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Agente de soporte": {
      "main": [
        [
          {
            "node": "Responder al empleado",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "tags": []
}