Skip to content

Guía: Estructura de Agente Básico (Single Agent)

Esta guía detalla cómo construir un Agente Básico en n8n. En esta arquitectura, contamos con un solo cerebro (un único nodo de IA) que tiene acceso a todas las herramientas y maneja toda la conversación de manera centralizada.

alt text


🧩 ¿Qué es un Agente Básico?

Es una arquitectura donde un solo nodo de IA (el Agente) es responsable de:

  1. Mantener la memoria.
  2. Decidir qué herramienta usar.
  3. Consultar la base de conocimientos (RAG).
  4. Generar la respuesta final.

Es ideal para bots que tienen un propósito único y definido, como tomar pedidos, agendar citas o responder dudas específicas.


🏗️ Estructura General

Un Agente Básico se compone de 5 pilares fundamentales que trabajan en conjunto dentro de un mismo flujo.

1. El Cerebro: AI Agent

Es el nodo central que orquesta toda la interacción. Se configura mediante un System Prompt robusto que debe contener:

  • Identidad: Quién es el agente y cuál es su rol.
  • Reglas de Negocio: Políticas de la empresa, horarios y restricciones.
  • Flujos: Instrucciones paso a paso para ejecutar tareas (ej. tomar un pedido, agendar una cita).

alt text

2. La Memoria: Redis Chat Memory

La memoria es lo que permite al agente mantener el hilo de la conversación. Sin ella, cada mensaje sería como hablar con alguien que acaba de conocerte. En n8n, usamos Redis para gestionar esto de manera eficiente.

🔑 Session Key (La Llave de la Memoria)

Es el identificador único de la conversación.

  • ¿Por qué usamos user_ns? Usamos el ID único del usuario (como su número de teléfono o ID de WhatsApp) para asegurar que cada persona tenga su propia memoria privada. Si usáramos una clave fija para todos, ¡los usuarios verían las conversaciones de los demás!
  • Resetear la Memoria: Si cambias esta clave (por ejemplo, agregando un sufijo como user_ns + "_v2"), el agente comenzará una conversación "en blanco", olvidando todo lo anterior. Esto es útil para reiniciar flujos.

⏳ Session TTL (Tiempo de Vida)

Define cuánto tiempo debe pasar antes de que la memoria se borre automáticamente si no hay actividad.

  • Estándar: 86400 segundos (equivalente a 24 horas).
  • Funcionamiento: Si el usuario deja de hablar por un día completo, al volver, el bot lo saludará como si fuera una nueva sesión. Esto evita que el bot se confunda con contextos viejos irrelevantes.

🧠 Context Window Length (Ventana de Contexto)

Determina cuántos mensajes hacia atrás "lee" el agente antes de responder.

  • ¿Qué es? Es la cantidad de interacciones pasadas que se envían al modelo en cada turno.
  • Ventajas de una ventana larga: El bot recuerda detalles dichos hace mucho rato.
  • Desventajas:
    • Mayor Costo: Se consumen más tokens en cada ejecución.
    • Confusión: Puede distraerse con información vieja que ya no es relevante.
    • Lentitud: Procesar más texto toma más tiempo.

alt textalt text

3. El Conocimiento: Vector Store (RAG)

Para evitar alucinaciones, el agente se conecta a una base de conocimientos externa (como Supabase). Aquí te explicamos cómo configurar cada campo clave del nodo Supabase Vector Store y por qué es vital el Reranker.

⚙️ Configuración del Nodo Supabase (Campo a Campo)

  1. Operation Mode (Retrieve Documents (As Tool...)):

    • Le dice a n8n que este nodo no se ejecutará automáticamente siempre. Se convierte en una Herramienta que el Agente decidirá usar solo cuando necesite información.
  2. Name / Tool Name (get_info_productos):

    • Es el nombre interno de la herramienta. El LLM verá este nombre.
  3. Description:

    • ¡CRÍTICO! Es la instrucción que lee el cerebro del Agente para saber cuándo usar esta herramienta.
    • Ejemplo: "Vas a usar esta tool cuando necesites consultar algún producto o materia prima que pida el usuario". Si no eres claro aquí, el agente ignorará tu base de datos.
  4. Table Name (documents_...):

    • La tabla específica en tu base de datos Supabase donde guardaste los vectores (tus documentos fragmentados).
  5. Limit (Top K):

    • La cantidad de "trozos" de texto que traeremos inicialmente de la base de datos.
    • Recomendación: Trae un número un poco alto (ej. 10 o 15) para que luego el Reranker filtre los mejores.
  6. Query Name (match_documents...):

    • Es el nombre de la función RPC en Supabase que ejecuta la búsqueda matemática de vectores. Debe coincidir exactamente con la que creaste en tu SQL.

🎯 El Superpoder: Reranker (Cohere)

Si activas la opción Use Reranker, conectas un segundo cerebro (como Cohere) que refina los resultados.

  • ¿El problema? La búsqueda vectorial (Embeddings) busca por "similitud matemática", pero a veces trae cosas que se parecen pero no son relevantes.
  • La solución (Rerank):
    1. Supabase trae 10 resultados "posibles" (Top K).
    2. El Reranker lee esos 10 textos y los califica del 1 al 10 según qué tan bien responden la pregunta específica del usuario.
    3. Solo le entrega al Agente los Top N (ej. los 4 mejores) depurados.
    • Resultado: Respuestas mucho más precisas y menos "paja" o alucinaciones.

alt textalt text

📋 Código del Nodo (Supabase + Reranker)

Copia este bloque para importar la configuración exacta de la herramienta de conocimiento:

json
{
  "nodes": [
    {
      "parameters": {
        "topN": 8
      },
      "type": "@n8n/n8n-nodes-langchain.rerankerCohere",
      "typeVersion": 1,
      "position": [
        544,
        480
      ],
      "id": "5411df3a-5c1d-4bb4-b26d-f7171ec52cd9",
      "name": "Reranker Cohere1",
      "credentials": {
        "cohereApi": {
          "id": "H9hE2jMOhjsY4STS",
          "name": "Botinfy: Cohere Credentials"
        }
      }
    },
    {
      "parameters": {
        "mode": "retrieve-as-tool",
        "toolName": "get_info_productos",
        "toolDescription": "=Vas a usar esta tool cuando necesites consultar algun producto o materia prima que pida el usuario",
        "tableName": {
          "__rl": true,
          "value": "documents_pizza_de_verdad_mercancia",
          "mode": "list",
          "cachedResultName": "documents_pizza_de_verdad_mercancia"
        },
        "topK": 10,
        "includeDocumentMetadata": false,
        "useReranker": true,
        "options": {
          "queryName": "match_documents_pizza_de_verdad_mercancia"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "typeVersion": 1.1,
      "position": [
        432,
        224
      ],
      "id": "8fc0048d-6903-43b0-a77f-6fc191b468b4",
      "name": "get_info_productos",
      "credentials": {
        "supabaseApi": {
          "id": "lwgrM07n5AFMxLbr",
          "name": "Botinfy Supabase Credential"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        384,
        480
      ],
      "id": "b9e41d01-7162-49da-87b2-bc37510616b9",
      "name": "Embeddings OpenAI1",
      "credentials": {
        "openAiApi": {
          "id": "RO4acqEwUiNXl2PE",
          "name": "OpenAi Sumimse ApiKey"
        }
      }
    }
  ],
  "connections": {
    "Reranker Cohere1": {
      "ai_reranker": [
        [
          {
            "node": "get_info_productos",
            "type": "ai_reranker",
            "index": 0
          }
        ]
      ]
    },
    "get_info_productos": {
      "ai_tool": [
        []
      ]
    },
    "Embeddings OpenAI1": {
      "ai_embedding": [
        [
          {
            "node": "get_info_productos",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

4. La Acción: Tools (Herramientas)

El agente no solo "habla", también "actúa". Las herramientas le permiten interactuar con el mundo exterior. A continuación, detallamos las herramientas más utilizadas y sus configuraciones:

🔌 HTTP Request: Redirigir a Asesor

Esta herramienta se utiliza para pausar al agente de IA y notificar a un asesor humano. Se conecta a un flujo de la plataforma Botinfy mediante una petición POST. Es ideal para situaciones donde el usuario solicita hablar con una persona.

alt text

javascript
{
  "nodes": [
    {
      "parameters": {
        "toolDescription": "Vas a usar este http cuando seleccionen la opcion 2 y 3, cuando pogan tambien estas palabras claves:\nConsultar el estatus de mi pedido, Hablar con un analista etc, opcion 2, opcion 3",
        "method": "POST",
        "url": "https://app.botinfy.com/api/subscriber/send-sub-flow",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "accept",
              "value": "application/json"
            },
            {
              "name": "Authorization",
              "value": "Bearer JQ3BAZo4HY1JcUzA9LzvlvB7ILRD1iIzp1yya7fO9sS075ej0JFOfjXUw5OR"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "user_ns",
              "value": "={{ $('Webhook').first().json.body.user_ns }}"
            },
            {
              "name": "sub_flow_ns",
              "value": "f228871s3152953"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequestTool",
      "typeVersion": 4.2,
      "position": [
        272,
        224
      ],
      "id": "4e858de7-6b3b-4c23-b780-9e3743ff026b",
      "name": "Redirigir_Asesor"
    }
  ],
  "connections": {
    "Redirigir_Asesor": {
      "ai_tool": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

⚠️ Importante: Configuración Personalizada Para que esta herramienta funcione correctamente en tu proyecto, debes modificar los siguientes campos dentro del nodo:

  1. Description (toolDescription):

    • Edita este texto para definir cuándo el agente debe activar esta herramienta.
    • Ejemplo: Si tu menú de soporte es la opción 5, cambia "opcion 2 y 3" por "opcion 5". Agrega palabras clave relevantes para tu negocio como "hablar con ventas", "soporte técnico", etc.
  2. Header Parameter - Authorization:

    • El valor Bearer JQ3... es un ejemplo. Debes reemplazarlo con tu propia API Key de Botinfy para tener permiso de ejecutar la redirección.
  3. Body Parameter - sub_flow_ns:

    • El valor f228871s3152953 es el ID del flujo destino. Debes cambiarlo por el ID del flujo específico al que quieres enviar al usuario (por ejemplo, el ID de tu flujo de "Atención Humana" o "Departamento de Pagos").

💵 HTTP Request: Obtener Tasa BCV

Esta herramienta permite obtener la tasa de cambio oficial del Banco Central de Venezuela (BCV) en tiempo real. Es fundamental para realizar cálculos de precios precisos en moneda local.

alt text

javascript
{
  "nodes": [
    {
      "parameters": {
        "toolDescription": "Esta tool obtiene la tasa de BCV.",
        "url": "https://pydolarve.org/api/v2/dollar?page=bcv&monitor=usd&format_date=default&rounded_price=true",
        "options": {},
        "optimizeResponse": true,
        "dataField": "price"
      },
      "type": "n8n-nodes-base.httpRequestTool",
      "typeVersion": 4.2,
      "position": [
        4000,
        848
      ],
      "id": "bb587b0a-8861-4738-85a4-ea64ca4970fb",
      "name": "get_bcv"
    }
  ],
  "connections": {
    "get_bcv": {
      "ai_tool": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

🧮 Calculator Tool

Esta herramienta asegura la precisión en los cálculos matemáticos. Los modelos de lenguaje pueden cometer errores en operaciones aritméticas; este nodo obliga al agente a utilizar una calculadora para garantizar resultados exactos.

alt text

javascript
{
  "nodes": [
    {
      "parameters": {},
      "type": "@n8n/n8n-nodes-langchain.toolCalculator",
      "typeVersion": 1,
      "position": [
        80,
        496
      ],
      "id": "a603c19f-762d-44c9-a593-960bfeb5fa4e",
      "name": "Calculator"
    }
  ],
  "connections": {
    "Calculator": {
      "ai_tool": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

🧠 Think Tool (Deep Think)

Esta herramienta permite al agente "pensar" por más tiempo antes de responder. Es útil para consultas complejas que requieren un razonamiento más profundo o la evaluación de múltiples pasos antes de generar una respuesta final.

alt text

javascript
{
  "nodes": [
    {
      "parameters": {},
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "typeVersion": 1.1,
      "position": [
        -112,
        512
      ],
      "id": "e973f602-f5b1-46e9-b8f3-7642e563a997",
      "name": "Think"
    }
  ],
  "connections": {
    "Think": {
      "ai_tool": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

🔄 Call n8n Workflow Tool

Esta herramienta es extremadamente potente, ya que permite llamar a otro flujo de n8n desde el flujo actual. Esto facilita la modularidad y la reutilización de lógica. En lugar de crear un agente monolítico gigante, puedes dividir funcionalidades complejas en sub-flujos especializados (por ejemplo, un flujo dedicado solo a consultar inventario o procesar pagos) e invocarlos cuando sea necesario.

alt text

javascript
{
  "nodes": [
    {
      "parameters": {},
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        224,
        480
      ],
      "id": "6c0fa7bb-4191-485d-b0b7-efa50556dd0f",
      "name": "Call n8n Workflow Tool"
    }
  ],
  "connections": {
    "Call n8n Workflow Tool": {
      "ai_tool": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

5. El Formato: Structured Output Parser

Para garantizar que el agente se integre correctamente con otros sistemas (como WhatsApp o Webhooks), se utiliza un parser que fuerza la salida en un formato estructurado (generalmente JSON). Esto asegura que siempre obtengas campos predecibles como mensaje, imagen o opciones.

alt text

⚙️ ¿Cómo funciona y cómo activarlo?

Este nodo actúa como un "traductor estricto". El agente de IA genera texto libre, pero este parser lo intercepta y lo obliga a encajar en un molde JSON predefinido antes de entregarlo al siguiente paso.

Para activarlo:

  1. Conecta el nodo Structured Output Parser a la entrada Output Parser de tu nodo AI Agent.
  2. Define el esquema JSON que deseas recibir.

📝 Estructura (Schema) y Personalización

El campo clave es Json Schema Example. Aquí defines qué datos quieres extraer.

Estructura Básica (Mensaje + Imagen): Esta es la configuración estándar para enviar respuestas de texto y, opcionalmente, imágenes.

json
{
  "messages": [
    {
      "message": "La respuesta unica para el usuario."
    }
  ],
  "images": [
    { "image": "URL de la imagen si aplica" },
    { "image": "URL de la imagen 2 si aplica" }
  ]
}

¿Cómo cambiarla para otros casos? Si necesitas que el bot devuelva archivos (como PDFs) o datos específicos, simplemente agrega los campos al JSON de ejemplo. El modelo entenderá que debe rellenarlos.

Ejemplo con Archivo PDF:

json
{
  "messages": [
    {
      "message": "Aquí tienes tu reporte."
    }
  ],
  "images": [
    { "image": "URL de la imagen si aplica" }
  ],
  "pdf": {
    "url": "https://ejemplo.com/reporte.pdf",
    "name": "Reporte_Mensual.pdf"
  }
}

🛠️ Auto Fix (Auto-Corrección)

La opción Auto Fix es vital. A veces, los modelos de lenguaje (especialmente los más pequeños) generan JSON con pequeños errores de sintaxis (una coma faltante, una comilla mal cerrada).

  • Si activas Auto Fix: Debes conectar un modelo de chat (como GPT-4o-mini) a la entrada del parser.
  • Funcionamiento: Si el JSON sale roto, el parser se lo envía a este segundo modelo "reparador" para que lo corrija automáticamente antes de fallar.

📋 Código del Nodo (Parser + AutoFix Model)

Copia este bloque para importar el parser configurado con su modelo de corrección:

javascript
{
  "nodes": [
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        704,
        480
      ],
      "id": "ee7062ee-65df-44df-9ae9-f293e0624bbd",
      "name": "OpenAI Chat Model5",
      "credentials": {
        "openAiApi": {
          "id": "YzxaCIS16ENhjkbF",
          "name": "PizzaDeVerdad ApiKey"
        }
      }
    },
    {
      "parameters": {
        "jsonSchemaExample": "{\n  \"messages\": [\n    {\n      \"message\": \"La respuesta unica para el usuario.\"\n    }\n  ],\n  \"images\": [\n    { \"image\": \"URL de la imagen si aplica\" },\n    { \"image\": \"URL de la imagen 2 si aplica\" }\n  ]\n}",
        "autoFix": true
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        752,
        224
      ],
      "id": "29d78f01-bf86-44ba-8feb-679d3ccc610c",
      "name": "Structured Output Parser3"
    }
  ],
  "connections": {
    "OpenAI Chat Model5": {
      "ai_languageModel": [
        [
          {
            "node": "Structured Output Parser3",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser3": {
      "ai_outputParser": [
        []
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

⚖️ Ventajas y Desventajas

✅ Ventajas

  1. Simplicidad de Configuración: Solo gestionas un Prompt principal.
  2. Menor Latencia: Al no haber saltos entre múltiples agentes, la respuesta suele ser más rápida.
  3. Contexto Unificado: El agente tiene acceso inmediato a toda la memoria y herramientas sin necesidad de traspasos complejos.
  4. Ideal para MVP: Perfecto para validar una idea o para bots con un alcance limitado (ej. solo ventas).

❌ Desventajas

  1. Confusión en Tareas Complejas: Si le das demasiadas herramientas (más de 5-6) o instrucciones contradictorias, el modelo puede confundirse.
  2. Prompt Gigante: El System Message tiende a crecer mucho, lo que puede consumir más tokens y ser difícil de mantener.
  3. Menos Especialización: Un solo agente tratando de ser experto en Soporte, Ventas y Técnico a la vez suele cometer más errores que tres agentes especialistas.

🆚 ¿Cuándo usar Agente Básico vs Árbol de Agentes?

CaracterísticaAgente Básico (Single Agent)Árbol de Agentes (Multi-Agent)
ComplejidadBaja / MediaAlta
HerramientasPocas (< 5)Muchas (> 5)
MantenimientoUn solo PromptMúltiples Prompts y Routers
Caso de UsoMVPs, Bots específicos (Solo Ventas)Sistemas Enterprise, Bots "Todoterreno"

Elige Agente Básico si:

  • Estás validando una idea (MVP).
  • El bot tiene un solo rol claro (ej. "Tomar Pedidos").
  • Quieres respuestas rápidas y configuración sencilla.

Elige Árbol de Agentes si:

  • El bot debe hacer muchas cosas distintas (Soporte + Ventas + RRHH).
  • Necesitas control granular sobre cada sub-proceso.
  • El prompt del agente básico se ha vuelto inmanejable.

🛠️ Configuración Técnica Recomendada

Para este tipo de agente, recomendamos la siguiente configuración de modelo (basada en el ejemplo):

  • Modelo: gpt-4.1-mini (Balance ideal entre costo/velocidad/inteligencia).
  • Temperatura: 0.4 (Baja creatividad, alta fidelidad a las instrucciones).
  • Top P: Estándar.

Nota sobre Modelos:

  • GPT-4o mini: Úsalo para tareas muy simples.
  • GPT-5 mini (o modelos grandes): Úsalos si el prompt es extremadamente largo y complejo, pero cuidado con la latencia.

📦 Plantilla de Referencia (JSON)

A continuación, encontrarás el código JSON de un agente completo funcional. Úsalo como plantilla de referencia para construir tu propio bot. Este ejemplo está configurado para un caso de uso de logística, pero la estructura es aplicable a cualquier industria.

Instrucciones:

  1. Copia el bloque JSON.
  2. Pega en n8n (Ctrl+V).
  3. Importante: Reemplaza el System Prompt y las credenciales (OpenAI, Supabase, Redis) con los datos de tu propio proyecto.
json
{
  "nodes": [
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('set message1').item.json.body.user_ns }}viole446",
        "sessionTTL": 86400,
        "contextWindowLength": 8
      },
      "type": "@n8n/n8n-nodes-langchain.memoryRedisChat",
      "typeVersion": 1.5,
      "position": [
        128,
        224
      ],
      "id": "1e878b2a-809b-4e37-a5c3-784989f1deb9",
      "name": "Redis Chat Memory8",
      "credentials": {
        "redis": {
          "id": "OCCM7nEKUzaNEOZ7",
          "name": "Botinfy: Redis Credentials"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {
          "temperature": 0.4
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        0,
        224
      ],
      "id": "cf311627-b7ea-415c-a9a0-e85a004b5e7b",
      "name": "OpenAI Chat Model7",
      "credentials": {
        "openAiApi": {
          "id": "YzxaCIS16ENhjkbF",
          "name": "PizzaDeVerdad ApiKey"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        704,
        480
      ],
      "id": "ee7062ee-65df-44df-9ae9-f293e0624bbd",
      "name": "OpenAI Chat Model5",
      "credentials": {
        "openAiApi": {
          "id": "YzxaCIS16ENhjkbF",
          "name": "PizzaDeVerdad ApiKey"
        }
      }
    },
    {
      "parameters": {
        "jsonSchemaExample": "{\n  \"messages\": [\n    {\n      \"message\": \"La respuesta unica para el usuario.\"\n    }\n  ],\n  \"images\": [\n    { \"image\": \"URL de la imagen si aplica\" },\n    { \"image\": \"URL de la imagen 2 si aplica\" }\n  ]\n}",
        "autoFix": true
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        752,
        224
      ],
      "id": "29d78f01-bf86-44ba-8feb-679d3ccc610c",
      "name": "Structured Output Parser3"
    },
    {
      "parameters": {
        "topN": 8
      },
      "type": "@n8n/n8n-nodes-langchain.rerankerCohere",
      "typeVersion": 1,
      "position": [
        544,
        480
      ],
      "id": "5411df3a-5c1d-4bb4-b26d-f7171ec52cd9",
      "name": "Reranker Cohere1",
      "credentials": {
        "cohereApi": {
          "id": "H9hE2jMOhjsY4STS",
          "name": "Botinfy: Cohere Credentials"
        }
      }
    },
    {
      "parameters": {
        "mode": "retrieve-as-tool",
        "toolName": "get_info_productos",
        "toolDescription": "=",
        "tableName": {
          "__rl": true,
          "value": "documents_pizza_de_verdad_mercancia",
          "mode": "list",
          "cachedResultName": "documents_pizza_de_verdad_mercancia"
        },
        "topK": 10,
        "includeDocumentMetadata": false,
        "useReranker": true,
        "options": {
          "queryName": "match_documents_pizza_de_verdad_mercancia"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "typeVersion": 1.1,
      "position": [
        432,
        224
      ],
      "id": "8fc0048d-6903-43b0-a77f-6fc191b468b4",
      "name": "get_info_productos",
      "credentials": {
        "supabaseApi": {
          "id": "lwgrM07n5AFMxLbr",
          "name": "Botinfy Supabase Credential"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        384,
        480
      ],
      "id": "b9e41d01-7162-49da-87b2-bc37510616b9",
      "name": "Embeddings OpenAI1",
      "credentials": {
        "openAiApi": {
          "id": "RO4acqEwUiNXl2PE",
          "name": "OpenAi Sumimse ApiKey"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=metadata:\n  user_ns: \"{{ $json.body.user_ns }}\"\n  phone: \"{{ $json.body.phone }}\"\n  timestamp: \"{{ $json.body.timestamp }}\"\n  message.message_content: \"{{ $json.body.message }}\"",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<system_message version=\"3.0\">\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- DEFINICIÓN DEL AGENTE -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <agent>\n        <identity>\n            <name>Beto</name>\n            <type>Asistente de Logística y Suministros</type>\n            <expertise>Experto en Inventarios, Pedidos B2B y Logística de Despacho</expertise>\n            <company>PROCESADORA DE ALIMENTOS ALBERCA (Proveedor Oficial)</company>\n        </identity>\n\n        <objectives>\n            <primary>Gestionar pedidos de suministros para franquiciados de manera eficiente y sin errores</primary>\n            <secondary>Resolver reclamos de calidad y dudas sobre rutas de despacho</secondary>\n            <tertiary>Actuar como socio estratégico para el abastecimiento de las tiendas</tertiary>\n        </objectives>\n\n        <!-- SISTEMA DE ESTADO DE CONVERSACIÓN -->\n        <conversation_state priority=\"critical\">\n            <description>Mantén un registro mental del estado actual de la conversación para gestionar el pedido paso a paso</description>\n            \n            <tracking_variables>\n                <variable name=\"Cliente_Validado\" initial=\"NO\" type=\"boolean\">\n                    <description>Indica si el usuario ya proporcionó RIF/Código y está en la Lista Blanca</description>\n                    <update_when>Al verificar credenciales exitosamente</update_when>\n                    <new_value>SÍ</new_value>\n                </variable>\n\n                <variable name=\"Pedido_En_Curso\" initial=\"NO\" type=\"boolean\">\n                    <description>Indica si hay un pedido activo construyéndose</description>\n                    <update_when>Usuario empieza a agregar productos</update_when>\n                    <new_value>SÍ</new_value>\n                </variable>\n\n                <variable name=\"Reclamo_Activo\" initial=\"NO\" type=\"boolean\">\n                    <description>Indica si se está procesando un reclamo de calidad</description>\n                    <update_when>Usuario reporta producto dañado</update_when>\n                    <new_value>SÍ</new_value>\n                </variable>\n            </tracking_variables>\n        </conversation_state>\n    </agent>\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- FORMATO DE RESPUESTA -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <output_format>\n        <type>JSON</type>\n        <strict_mode>true</strict_mode>\n        \n        <schema>\n            <description>Tu respuesta debe ser EXCLUSIVAMENTE un objeto JSON válido. No incluyas texto plano fuera del JSON.</description>\n            <structure><![CDATA[\n        {\n          \"messages\": [\n            {\n              \"message\": \"Tu respuesta textual aquí. Usa \\\\n para saltos de línea.\"\n            }\n          ],\n          \"images\": [\n            { \"image\": \"URL_IMAGEN_SI_APLICA\" }\n          ]\n        }\n            ]]></structure>\n        </schema>\n    </output_format>\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- CONTEXTO DEL NEGOCIO -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <business_context>\n        <company>\n            <name>PROCESADORA DE ALIMENTOS ALBERCA</name>\n            <role>Proveedor exclusivo de insumos para la red de franquicias</role>\n            \n            <logistics_rules>\n                <rule id=\"recepcion_pedidos\">\n                    <timing>LUNES antes de las 8:00 AM</timing>\n                    <policy>Pedidos recibidos después de esta hora salen en la siguiente ruta disponible o la semana siguiente.</policy>\n                </rule>\n                \n                <routes_schedule>\n                    <route day=\"Lunes\">Yaracuy (Corte 8am)</route>\n                    <route day=\"Martes\">Cabudare, Barquisimeto-Este (Semanal) | Falcón (Quincenal)</route>\n                    <route day=\"Miércoles\">Barquisimeto-Centro (Semanal) | Oriente (Quincenal)</route>\n                    <route day=\"Jueves\">Barquisimeto-Oeste (Semanal) | Valencia-Caracas (Quincenal)</route>\n                    <route day=\"Viernes\">Los Llanos y segundos pedidos</route>\n                </routes_schedule>\n                \n                <delivery_time>\n                    <standard>24 a 48 horas hábiles tras el procesamiento</standard>\n                    <note>Depende de ruta, combustible y disponibilidad de transporte</note>\n                </delivery_time>\n            </logistics_rules>\n\n            <financial_policy>\n                <payment_methods>\n                    <method type=\"primary\">Crédito/Post-pago (Cargo a cuentas por cobrar)</method>\n                    <method type=\"exception\">Prepago (Solo si tiene bloqueo administrativo o solicitud explícita)</method>\n                </payment_methods>\n                \n                <bank_details condition=\"Solo entregar si es Prepago\">\n                    <titular>Bionessa Castañeda</titular>\n                    <contact>04245359649 / C.I. 23.307.148</contact>\n                    <accounts>\n                        <bank>Provincial Jurídico: 0108-2413-3801-0033-6040</bank>\n                        <bank>Banplus Jurídico: 0174-0142-4614-2419-4023</bank>\n                        <bank>BNC Jurídico: 0191-0202-5421-0003-3389</bank>\n                    </accounts>\n                </bank_details>\n            </financial_policy>\n        </company>\n    </business_context>\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- TONO Y ESTILO DE COMUNICACIÓN -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <communication_style>\n        <tone>Corporativo, Eficiente, \"Pilas\" y Resolutivo (Estilo logístico venezolano)</tone>\n        <language>Español</language>\n\n        <guidelines>\n            <guideline priority=\"high\">Sé directo y preciso, valoramos el tiempo del franquiciado.</guideline>\n            <guideline priority=\"critical\">Usa EMOJIS para estructurar visualmente los pedidos y listas (📦, 🚛, 📝, ❌, ✅).</guideline>\n            <guideline priority=\"high\">Usa negritas (*texto*) para resaltar productos, cantidades y montos.</guideline>\n            <guideline priority=\"critical\">Si un producto no existe o está agotado, sé honesto y ofrece alternativas o espera.</guideline>\n        </guidelines>\n\n        <creativity_rules>\n            <rule priority=\"critical\">\n                <scope>Inventario y Precios</scope>\n                <instruction>NUNCA inventes stock ni precios. Debes consultar las tools correspondientes.</instruction>\n                <action_if_unknown>Indica: \"Déjame verificar en sistema...\" y procede a buscar.</action_if_unknown>\n            </rule>\n        </creativity_rules>\n    </communication_style>\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- HERRAMIENTAS Y LÓGICA DE TOOLS -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <tools_logic>\n        <tool id=\"Redirigir_Asesor\">\n            <name>Redirigir_Asesor</name>\n            <description>Tool HTTP para redirigir a un sub-flujo de soporte o consulta de estatus.</description>\n            <logic>\n                <condition>\n                    <trigger>Usuario selecciona Opción 2 (\"Ser atendido por un analista\")</trigger>\n                    <trigger>Palabras clave: \"hablar con asesor\", \"analista\", \"estatus pedido\", \"opcion 2\", \"Hablar con un analista\"</trigger>\n                </condition>\n                <action>ACTIVAR TOOL `Redirigir_Asesor` INMEDIATAMENTE.</action>\n            </logic>\n        </tool>\n    </tools_logic>\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- FLUJOS CONVERSACIONALES -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <conversation_flows>\n\n        <!-- FLUJO: CONSULTA GLOBAL DE CATÁLOGO -->\n        <flow id=\"global_catalog_inquiry\" priority=\"critical\">\n            <name>Consulta de Catálogo (Global)</name>\n            <trigger>Palabras clave (fuera del menú): catalogo, productos, hacer pedido, lista, precios, ver catalogo, comprar</trigger>\n            <response format=\"exact\">\n                <message><![CDATA[Aquí tienes nuestro catálogo para realizar tu pedido: https://flavoo.club/alberca/\n\nPor favor, indícame qué productos deseas solicitar y en qué cantidades. Estoy listo para ayudarte a gestionar tu pedido de manera eficiente. 📝🚛]]></message>\n            </response>\n        </flow>\n\n        <!-- FLUJO: BIENVENIDA Y MENÚ -->\n        <flow id=\"welcome\" priority=\"high\">\n            <name>Menú Principal</name>\n            <trigger>Usuario saluda o inicia conversación</trigger>\n            \n            <response format=\"exact\">\n                <message><![CDATA[Buen día, que gusto saludarte, bienvenido a Procesadora de Alimentos Alberca 👋🏼\n\nSoy Beto, tu asistente de logística 🫱🏼‍🫲🏼📝🚛\n\nEstoy listo para gestionar tu solicitud de manera eficiente, para brindarte una mejor atención, por favor selecciona una opción:\n\n1️⃣ Ver Catálogo / Hacer pedido\n\n2️⃣ Ser atendido por un analista\n\n3️⃣ Quejas y Reclamos\n\nIdentificación del reclamo]]></message>\n            </response>\n\n            <menu_logic>\n                <option id=\"1\">\n                    <trigger>1, uno, catalogo, pedido, opción 1, Ver Catalogo, hacer un pedido</trigger>\n                    <action>Responder con este MENSAJE EXACTO (Sin agregar listas de productos ni texto adicional):\n\"Buen día, que gusto saludarte, bienvenido a Procesadora de Alimentos Alberca 👋🏼\n\nAquí tienes nuestro catálogo para realizar tu pedido: https://flavoo.club/alberca/\n\nPor favor, indícame qué productos deseas solicitar y en qué cantidades. Estoy listo para ayudarte a gestionar tu pedido de manera eficiente. 📝🚛\"</action>\n                </option>\n                <option id=\"2\">\n                    <trigger>2, dos, analista, asesor, opción 2, Ser atendido por un analista, Hablar con un analista, Consultar el estatus de mi pedido</trigger>\n                    <action>Ejecutar Tool: Redirigir_Asesor</action>\n                </option>\n                <option id=\"3\">\n                    <trigger>3, tres, quejas, reclamos, opción 3, Quejas y Reclamos, Identificación del reclamo</trigger>\n                    <action>NO ACTIVAR NINGUNA TOOL. SOLO DESPLEGAR EL SIGUIENTE MENÚ:</action>\n                    <response><![CDATA[*Seleccione el motivo de su reclamo:*\n\n1️⃣.  🧊 Calidad del Producto : (Ej: Queso mozzarella llegó derretido o masa dañada).\n\n2️⃣📦 Insumos faltantes: (Ej: Faltan cajas, harina o salsa en el pedido recibido).\n\n3️⃣ 🚛 Logística y Entrega: (Ej: El camión no ha llegado o llegó fuera de horario).]]></response>\n                    <sub_menu_logic>\n                        <sub_option id=\"3.1\">\n                            <trigger>1, uno, calidad, producto, dañado, derretido, Calidad del Producto</trigger>\n                            <action>Responder PRIMERO con este mensaje: \"Se procederá a generar una Nota de Crédito ó se incluirán los faltantes en su próximo pedido programado.\" Y LUEGO EJECUTAR TOOL Redirigir_Asesor</action>\n                        </sub_option>\n                        <sub_option id=\"3.2\">\n                            <trigger>2, dos, faltantes, insumos, cajas, Insumos faltantes</trigger>\n                            <action>Responder PRIMERO con este mensaje: \"Para procesar la reposición o nota de crédito, por favor adjunte:\n\n * Foto del número de lote (etiqueta del producto).\n\n * Foto de la guía de entrega firmada con la observación.\n\n * Evidencia visual del estado del producto.\n\n\\\"Su reporte será enviado a control de calidad\\\"\n\nPor favor, resguarda el producto dañado para su recolección y análisis.\" Y LUEGO EJECUTAR TOOL Redirigir_Asesor</action>\n                        </sub_option>\n                        <sub_option id=\"3.3\">\n                            <trigger>3, tres, logistica, entrega, camion, Logística y Entrega, no ha llegado</trigger>\n                            <action>Responder PRIMERO con este mensaje: \"En los próximos minutos será contactado para informarle sobre el estatus de su despacho.\" Y LUEGO EJECUTAR TOOL Redirigir_Asesor</action>\n                        </sub_option>\n                    </sub_menu_logic>\n                </option>\n            </menu_logic>\n        </flow>\n\n        <!-- FLUJO: TOMA DE PEDIDOS -->\n        <flow id=\"order_taking\" priority=\"critical\">\n            <name>Gestión de Pedidos</name>\n            <trigger>Usuario lista productos</trigger>\n            \n            <process_steps>\n                <step_1>\n                    <name>Interpretación</name>\n                    <instruction>Mapea el lenguaje natural a productos del catálogo (Ej: \"Harina\" -> \"Harina Panadera 45kg\").</instruction>\n                </step_1>\n                \n                <step_2>\n                    <name>Verificación de Stock</name>\n                    <instruction>Consulta disponibilidad REAL. Si algo está agotado, avisa de inmediato ❌.</instruction>\n                </step_2>\n                \n                <step_3>\n                    <name>Aclaratoria de Ambigüedades</name>\n                    <instruction>Si dice \"Queso\", pregunta: \"¿Mozzarella barra o rallado? 🧀\"</instruction>\n                </step_3>\n                \n                <step_4>\n                    <name>Resumen y Confirmación</name>\n                    <instruction>Antes de procesar, muestra el resumen detallado:</instruction>\n                    <format><![CDATA[\n*Resumen de tu pedido:* 📋\n\n📦 *[Cant] [Producto]* ($[PrecioU])\n📦 *[Cant] [Producto]* ($[PrecioU])\n...\n\n*Subtotal USD:* $[Monto]\n*Tasa BCV:* [Tasa]\n*Total a Pagar:* Bs. [MontoBS] 🇻🇪\n\n*¿Procedemos con el despacho?* 🚚\n                    ]]></format>\n                </step_4>\n            </process_steps>\n        </flow>\n\n        <!-- FLUJO: RECLAMOS -->\n        <flow id=\"claims\" priority=\"medium\">\n            <name>Gestión de Calidad</name>\n            <trigger>Producto dañado, vencido o en mal estado</trigger>\n            \n            <requirements>\n                <req>Foto del producto 📸</req>\n                <req>Número de Lote 🔢</req>\n                <req>Descripción del problema 📝</req>\n            </requirements>\n            \n            <response><![CDATA[*Lamentamos el inconveniente.* 🛑 Para procesar el cambio/nota de crédito, necesito que me envíes:\n1. *Foto del producto* 📸\n2. *Número de Lote* 🔢\n3. *Breve descripción de la falla* 📝]]></response>\n        </flow>\n\n    </conversation_flows>\n\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n    <!-- INSTRUCCIONES OPERACIONALES CRÍTICAS -->\n    <!-- ═══════════════════════════════════════════════════════════════ -->\n\n    <critical_operational_instructions>\n\n        <!-- PROTOCOLO DE PENSAMIENTO (CHAIN OF THOUGHT) -->\n        <section id=\"anti_hallucination_protocol\" priority=\"critical\">\n            <title>Protocolo de Razonamiento Logístico</title>\n            <description>ANTES de confirmar cualquier pedido o dar información de stock:</description>\n            \n            <thought_sequence>\n                <step_1>IDENTIFICACIÓN: ¿Qué producto exacto quiere el usuario? (Evita ambigüedades)</step_1>\n                <step_2>VERIFICACIÓN: ¿Tengo stock real en sistema? (Nunca asumas disponibilidad)</step_2>\n                <step_3>VALIDACIÓN: ¿El cliente está autorizado (Lista Blanca)?</step_3>\n                <step_4>ACCIÓN: Solo si todo es verde, procede a cotizar.</step_4>\n            </thought_sequence>\n        </section>\n\n        <!-- REGLAS DE INTERACCIÓN -->\n        <section id=\"interaction_rules\" priority=\"high\">\n            <rule id=\"no_inventing\">\n                <description>Prohibición de Inventar</description>\n                <instruction>Si un producto no existe en tu catálogo, di: \"Disculpa, no reconozco ese ítem en nuestro listado actual. 📋\"</instruction>\n            </rule>\n            \n            <rule id=\"closing\">\n                <description>Cierre de Pedido</description>\n                <instruction>Una vez confirmado por el usuario, genera el PDF/Orden y notifica: \"Pedido procesado #12345. Enviado a despacho y copia a tu correo. ✅\"</instruction>\n            </rule>\n        </section>\n\n    </critical_operational_instructions>\n\n</system_message>"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2.2,
      "position": [
        272,
        0
      ],
      "id": "a912fcd4-a787-4aef-8b2d-e7542cd15dcc",
      "name": "Main_PIZZADVD_MERCANCIA",
      "retryOnFail": true
    },
    {
      "parameters": {
        "toolDescription": "Vas a usar este http cuando seleccionen la opcion 2 y 3, cuando pogan tambien estas palabras claves:\nConsultar el estatus de mi pedido, Hablar con un analista etc, opcion 2, opcion 3",
        "method": "POST",
        "url": "https://app.botinfy.com/api/subscriber/send-sub-flow",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "accept",
              "value": "application/json"
            },
            {
              "name": "Authorization",
              "value": "Bearer JQ3BAZo4HY1JcUzA9LzvlvB7ILRD1iIzp1yya7fO9sS075ej0JFOfjXUw5OR"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "user_ns",
              "value": "={{ $('Webhook').first().json.body.user_ns }}"
            },
            {
              "name": "sub_flow_ns",
              "value": "f228871s3152953"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequestTool",
      "typeVersion": 4.2,
      "position": [
        272,
        224
      ],
      "id": "4e858de7-6b3b-4c23-b780-9e3743ff026b",
      "name": "Redirigir_Asesor"
    }
  ],
  "connections": {
    "Redis Chat Memory8": {
      "ai_memory": [
        [
          {
            "node": "Main_PIZZADVD_MERCANCIA",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model7": {
      "ai_languageModel": [
        [
          {
            "node": "Main_PIZZADVD_MERCANCIA",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model5": {
      "ai_languageModel": [
        [
          {
            "node": "Structured Output Parser3",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser3": {
      "ai_outputParser": [
        [
          {
            "node": "Main_PIZZADVD_MERCANCIA",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Reranker Cohere1": {
      "ai_reranker": [
        [
          {
            "node": "get_info_productos",
            "type": "ai_reranker",
            "index": 0
          }
        ]
      ]
    },
    "get_info_productos": {
      "ai_tool": [
        [
          {
            "node": "Main_PIZZADVD_MERCANCIA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI1": {
      "ai_embedding": [
        [
          {
            "node": "get_info_productos",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Main_PIZZADVD_MERCANCIA": {
      "main": [
        []
      ]
    },
    "Redirigir_Asesor": {
      "ai_tool": [
        [
          {
            "node": "Main_PIZZADVD_MERCANCIA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "fc59ec4675a2b9056a2988260954715519d888519e3f03cd8f1ae3b29dcec973"
  }
}

Documentación de Botinfy