This workflow follows the Agent → OpenAI Chat recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "LOW",
"nodes": [
{
"parameters": {
"updates": [
"messages"
],
"options": {}
},
"type": "n8n-nodes-base.whatsAppTrigger",
"typeVersion": 1,
"position": [
432,
0
],
"id": "525c0fbc-d13f-4557-ad9e-c1513fbac8f0",
"name": "WhatsApp Trigger",
"credentials": {
"whatsAppTriggerApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "93eb6a37-642b-480e-80fe-62a85a4a7233",
"leftValue": "={{ $('WhatsApp Trigger').item.json.messages[0].from == \"573245649442\" }}",
"rightValue": "\"573245649442\"",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
624,
0
],
"id": "f0836285-7240-42ae-9647-0557d2ac1515",
"name": "bot prove"
},
{
"parameters": {
"promptType": "define",
"text": "={{\n // Usamos un ternario para decidir qu\u00e9 devolver.\n // SI hay un documento...\n ($('WhatsApp Trigger').item.json.messages?.[0]?.document) \n \n // ENTONCES, devolvemos el objeto JSON con los datos del archivo.\n ? {\n \"inputType\": \"file\",\n \"filename\": $('WhatsApp Trigger').item.json.messages[0].document.filename,\n \"media_id\": $('WhatsApp Trigger').item.json.messages[0].document.id\n } \n \n // SI NO, devolvemos SOLO el string del texto.\n : $('WhatsApp Trigger').item.json.messages?.[0]?.text?.body || \"\"\n}}",
"options": {
"systemMessage": "# ROLE\nEres un Agente Orquestador de IA, el cerebro central de un sistema de automatizaci\u00f3n avanzado. Tu prop\u00f3sito es interpretar solicitudes de usuario, seleccionar la herramienta adecuada y ejecutarla con un formato de par\u00e1metros perfecto.\n\n# PRIMARY DIRECTIVE\nTu directiva principal es analizar la intenci\u00f3n del usuario y llamar a la herramienta correcta. Tu llamada a la herramienta DEBE coincidir exactamente con el esquema que espera la herramienta.\n\n# AVAILABLE TOOLS\nDispones de las siguientes herramientas. Sigue sus reglas de invocaci\u00f3n al pie de la letra.\n\n1. **`ResumeTailor`**:\n * **Descripci\u00f3n**: Crea una hoja de vida (CV) en PDF, personalizada para una oferta de trabajo espec\u00edfica a partir de una URL.\n * **Cu\u00e1ndo usarla**: Cuando el usuario pida \"crea un CV para este trabajo\", \"adapta mi hoja de vida\", o proporcione una URL de una oferta laboral.\n * **Par\u00e1metros**: `job_offer_url` (string, obligatorio).\n\n2. **`DuelistCardCrafter`**:\n * **Descripci\u00f3n**: Transforma cualquier concepto (texto o imagen) en una carta de Yu-Gi-Oh! completa.\n * **Cu\u00e1ndo usarla**: Para cualquier solicitud de creaci\u00f3n de cartas tem\u00e1ticas.\n * **Par\u00e1metros**: `concept_input`.\n\n3. **`google_drive_manager`**:\n * **Descripci\u00f3n**: Gestiona operaciones de archivos gen\u00e9ricos en Google Drive.\n * **Cu\u00e1ndo usarla**: Para guardar o buscar archivos que no est\u00e9n relacionados con la creaci\u00f3n de CVs.\n * **Par\u00e1metros**: `operation`, `filename`, `media_id`, `query`.\n\n4. **`researcher`**, **`prompter`**, etc... (tus otras herramientas)\n\n# OPERATIONAL RULES\n1. Analiza la intenci\u00f3n del usuario. Si la intenci\u00f3n es crear un CV a partir de un enlace, DEBES usar `ResumeTailor`.\n2. Construye la llamada a la herramienta con los par\u00e1metros correctos.\n3. Ejecuta y responde al usuario con el resultado final."
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3,
"position": [
848,
-16
],
"id": "197d72df-3a68-48c4-8fd6-85ab980bf5af",
"name": "AI Agent"
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "= {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }}",
"contextWindowLength": 10
},
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
576,
480
],
"id": "ee691e0a-0294-4fe2-bc5b-a034f433c63a",
"name": "Simple Memory"
},
{
"parameters": {
"description": "Esta herramienta recibe como entrada una cadena de texto (string) que contiene los resultados ya formateados de una consulta RAG.\nEl contenido que recibe incluye uno o varios art\u00edculos con metadatos como t\u00edtulo, a\u00f1o, fuente y resumen.\n\nSu funci\u00f3n principal es:\n\n\ud83c\udfaf Objetivo\n\nTransformar ese string en un informe narrativo, organizado y f\u00e1cil de leer, incorporando:\n\nExplicaciones claras y coherentes.\n\nEstructura ordenada por secciones.\n\nUso de \u00edconos/emojis para mejorar la legibilidad.\n\nSeparaci\u00f3n visual entre art\u00edculos.\n\nLenguaje accesible pero profesional.\n\n\ud83e\udde0 Funcionamiento\n\nEntrada: un string con varios art\u00edculos formateados en bloques (cada uno con t\u00edtulo, a\u00f1o, autores/fuente y resumen).\n\nProcesamiento: el modelo interpreta el contenido sin hacer inferencias externas ni a\u00f1adir informaci\u00f3n no presente.\n\nSalida: un informe perfectamente redactado pensado para entregarse directamente al usuario final o integrarse en reportes posteriores.\n\n\ud83d\ude80 Usos principales\n\nPresentar resultados de b\u00fasquedas acad\u00e9micas.\n\nGenerar informes legibles a partir de datos brutos.\n\nResumir investigaciones obtenidas mediante RAG.\n\nEnriquecer respuestas con un formato visualmente atractivo.\n\n\ud83d\udd0c Integraci\u00f3n en el flujo orquestador\n\nEl orquestador solo debe:\n\nPasar el string resultante del formateador como mensaje de usuario a este nodo.\n\nRecibir el informe estructurado y usarlo como salida final del proceso o como insumo para pasos posteriores.\n\n\ud83d\udcc4 Ejemplo de salida esperada\n\nIntroducci\u00f3n breve\n\nLista de art\u00edculos con secciones claras\n\nComentarios o conclusiones opcionales basadas estrictamente en el contenido recibido\n\nEmojis y formato amigable",
"workflowId": {
"__rl": true,
"value": "iExTpMqatjBL5Jm9",
"mode": "list",
"cachedResultUrl": "/workflow/iExTpMqatjBL5Jm9",
"cachedResultName": "researcher"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('query', ``, 'string') }}"
},
"matchingColumns": [
"query"
],
"schema": [
{
"id": "query",
"displayName": "query",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
1552,
592
],
"id": "735d1a43-9b0a-4f25-a561-1a0d2c88d5ef",
"name": "Call 'researcher'"
},
{
"parameters": {
"operation": "send",
"phoneNumberId": "773652655831097",
"recipientPhoneNumber": "573245649442",
"textBody": "={{ $json.output }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.whatsApp",
"typeVersion": 1.1,
"position": [
1200,
-16
],
"id": "2c100ef9-33fc-4bbd-9240-68ad6084d219",
"name": "Send message",
"credentials": {
"whatsAppApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"description": "[BEGIN TOOL]\\nname: AIContentGenerator\\ndescription: Esta herramienta est\u00e1 dise\u00f1ada para transformar cualquier solicitud del usuario en uno de dos formatos estructurados y optimizados para sistemas de IA: un prompt estructurado y completo para un Large Language Model (LLM), o una descripci\u00f3n detallada y funcional de una herramienta (capability) para un agente de IA. Su objetivo principal es reinterpretar, clarificar y expandir la intenci\u00f3n del usuario para producir una instrucci\u00f3n formal y totalmente utilizable por otro sistema de IA, llenando huecos de manera razonable si la informaci\u00f3n inicial es ambigua o incompleta.\\ninputs:\\n user_request: La solicitud del usuario en lenguaje natural, indicando su necesidad de generar ya sea un prompt para un LLM o una descripci\u00f3n de herramienta para un agente de IA.\\noutputs:\\n ai_structured_output: Una cadena de texto que contiene el prompt optimizado para LLM (en formato `[BEGIN PROMPT]...[END PROMPT]`) o la descripci\u00f3n de la herramienta para agente IA (en formato `[BEGIN TOOL]...[END TOOL]`), basado en la solicitud del usuario.\\nrules:\\n 1. **Determinaci\u00f3n de Intenci\u00f3n**: Analizar la `user_request` para determinar si el usuario solicita un prompt estructurado o una descripci\u00f3n de herramienta.\\n 2. **Clarificaci\u00f3n y Expansi\u00f3n**: Reinterpretar, clarificar y expandir la intenci\u00f3n central del usuario sin alterar su prop\u00f3sito fundamental.\\n 3. **Generaci\u00f3n de Prompt (si aplica)**:\\n * Extraer el objetivo principal, tareas espec\u00edficas, restricciones, formatos requeridos, roles o comportamientos deseados y contexto adicional de la `user_request`.\\n * Construir el prompt estructurado usando el formato exacto: `[BEGIN PROMPT] <rol del modelo> <objetivo principal> <instrucciones detalladas> <restricciones> <formato de salida> <tono/estilo si aplica> <contexto adicional si es necesario> [END PROMPT]`.\\n * Rellenar cualquier informaci\u00f3n faltante de manera razonable, incluyendo los supuestos m\u00ednimos en la secci\u00f3n `<contexto adicional>`.\\n 4. **Generaci\u00f3n de Descripci\u00f3n de Herramienta (si aplica)**:\\n * Extraer el nombre, descripci\u00f3n general, inputs (campos y descripciones), outputs (campos y descripciones), reglas de uso y ejemplos de uso de la herramienta solicitada.\\n * Construir la descripci\u00f3n de la herramienta usando el formato exacto: `[BEGIN TOOL] name: <nombre de la herramienta> description: <descripci\u00f3n general de lo que hace> inputs: <campo>: <descripci\u00f3n> outputs: <campo>: <descripci\u00f3n> rules: <regla 1> usage_examples: <ejemplo 1 de llamada o uso> [END TOOL]`.\\n * Rellenar cualquier informaci\u00f3n faltante de manera razonable, incluyendo los supuestos m\u00ednimos en la `description` de la herramienta.\\n 5. **Exclusividad de Salida**: Siempre se debe devolver \u00fanicamente uno de los dos tipos de entregables (prompt o descripci\u00f3n de herramienta); nunca ambos.\\n 6. **Autonom\u00eda de la Salida**: La respuesta final debe ser completamente aut\u00f3noma, autoexplicativa y no debe hacer referencia a la conversaci\u00f3n original o a los procesos internos de esta herramienta.\\n 7. **Ausencia de Metacomentarios**: No se deben incluir an\u00e1lisis, pasos internos, razonamientos o explicaciones sobre el proceso de generaci\u00f3n en la salida final.\\n 8. **Formato No-JSON**: La salida generada no debe ser en formato JSON, a menos que la `user_request` lo pida expl\u00edcitamente para el contenido del prompt o herramienta generada.\\nusage_examples:\\n - AIContentGenerator(user_request=\\\"Necesito un prompt para analizar el sentimiento de rese\u00f1as de productos de electr\u00f3nica en espa\u00f1ol, clasificando como positivo, negativo o neutro y explicando brevemente el porqu\u00e9. El resultado debe ser en formato JSON.\\\")\\n - AIContentGenerator(user_request=\\\"Quiero una herramienta para mi agente que permita buscar art\u00edculos cient\u00edficos en una base de datos externa. Necesitar\u00eda un input para el t\u00e9rmino de b\u00fasqueda y que devuelva una lista de t\u00edtulos y res\u00famenes.\\\")\\n[END TOOL]",
"workflowId": {
"__rl": true,
"value": "yM0MnaC26LTQxFUf",
"mode": "list",
"cachedResultUrl": "/workflow/yM0MnaC26LTQxFUf",
"cachedResultName": "prompter"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('query', ``, 'string') }}"
},
"matchingColumns": [
"query"
],
"schema": [
{
"id": "query",
"displayName": "query",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
1296,
592
],
"id": "a4f56a78-b18e-4d5c-bd87-2ceee8c164d8",
"name": "Call 'prompter'"
},
{
"parameters": {
"description": "[BEGIN TOOL]\\nname: GoogleDriveManager\\ndescription: Gestiona operaciones con archivos en Google Drive, permitiendo guardar, descargar y buscar archivos dentro de la plataforma.\\ninputs:\\n operation: La acci\u00f3n a realizar. Valores exactos: `save_file` (guardar un archivo), `download_file` (descargar un archivo), `search_file` (buscar archivos). (string, obligatorio)\\n filename: El nombre del archivo para operaciones de guardar o descargar, o para refinar una b\u00fasqueda. (string, opcional)\\n media_id: El ID \u00fanico del archivo en Google Drive para operaciones de descarga. (string, opcional)\\n query: El t\u00e9rmino de b\u00fasqueda a utilizar para encontrar archivos. (string, opcional)\\noutputs:\\n status: Indica el resultado de la operaci\u00f3n. Puede ser \"success\" o \"error\". (string)\\n message: Una descripci\u00f3n detallada del resultado de la operaci\u00f3n, incluyendo errores o confirmaciones. (string)\\n data: Contiene la informaci\u00f3n relevante de la operaci\u00f3n. Para `save_file`, incluye el ID y URL del archivo. Para `download_file`, el contenido del archivo. Para `search_file`, una lista de archivos encontrados con sus IDs, nombres y detalles. (object, opcional)\\nrules:\\n El par\u00e1metro `operation` es obligatorio y debe ser uno de los valores permitidos (`save_file`, `download_file`, `search_file`).\\n Si `operation` es `save_file`, el par\u00e1metro `filename` es obligatorio. Se espera que el contenido del archivo a guardar sea proporcionado por el contexto del agente.\\n Si `operation` es `download_file`, se debe proporcionar al menos `media_id` o `filename` para identificar el archivo a descargar.\\n Si `operation` es `search_file`, el par\u00e1metro `query` es obligatorio para especificar los t\u00e9rminos de b\u00fasqueda.\\nusage_examples:\\n GoogleDriveManager(operation='save_file', filename='informe_ventas_Q3.pdf')\\n GoogleDriveManager(operation='download_file', media_id='1a2b3c4d5e6f7g')\\n GoogleDriveManager(operation='search_file', query='presentacion marketing')\\n[END TOOL]",
"workflowId": {
"__rl": true,
"value": "ubJfxaQof60QNSfn",
"mode": "list",
"cachedResultUrl": "/workflow/ubJfxaQof60QNSfn",
"cachedResultName": "google_drive_manager"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('query', ``, 'string') }}",
"media_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('media_id', ``, 'string') }}",
"filename": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('filename', ``, 'string') }}",
"operation": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('operation', ``, 'string') }}"
},
"matchingColumns": [],
"schema": [
{
"id": "operation",
"displayName": "operation",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "filename",
"displayName": "filename",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "media_id",
"displayName": "media_id",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "query",
"displayName": "query",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
832,
576
],
"id": "fd2ecaa1-715f-4902-a317-f7ffbc2dd6f1",
"name": "Call 'google_drive_manager'"
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
416,
336
],
"id": "4ceded14-72bb-4424-a2a0-54fedde2ae7a",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"description": "[BEGIN TOOL]\nname: DuelistCardCrafter\ndescription: Esta herramienta es un sub-agente de IA y un estudio de dise\u00f1o de cartas. Su \u00fanica funci\u00f3n es tomar un concepto, texto o imagen proporcionado por el usuario y transformarlo en una carta completa de Yu-Gi-Oh!, incluyendo una imagen de arte original, un t\u00edtulo tem\u00e1tico y una descripci\u00f3n de efecto. Es la herramienta perfecta cuando el usuario quiere \"crear una carta de\", \"dise\u00f1ar una carta sobre\", \"transformar esto en una carta de Yu-Gi-Oh!\" o cualquier solicitud similar de generaci\u00f3n creativa.\ninputs:\n concept_input: El tema o la idea que el usuario quiere convertir en una carta. Puede ser un texto descriptivo (como una ecuaci\u00f3n de f\u00edsica y su explicaci\u00f3n) o la entrada de una imagen. (string, obligatorio)\noutputs:\n card_image: La imagen final de la carta de Yu-Gi-Oh! generada, lista para ser enviada. (file)\n status: Un mensaje de texto que indica el resultado de la operaci\u00f3n. (string)\nrules:\n 1. Esta herramienta debe ser utilizada para CUALQUIER solicitud de creaci\u00f3n de cartas.\n 2. La herramienta maneja todo el proceso de dise\u00f1o internamente: interpreta el concepto, escribe el texto de la carta, genera el arte y ensambla la imagen final.\n 3. No se debe usar para b\u00fasquedas o tareas que no sean la creaci\u00f3n de una carta.\nusage_examples:\n - DuelistCardCrafter(concept_input=\"La ecuaci\u00f3n de onda de Schr\u00f6dinger, que describe c\u00f3mo cambia el estado cu\u00e1ntico de un sistema f\u00edsico con el tiempo.\")\n - DuelistCardCrafter(concept_input=\"[El usuario env\u00eda una imagen de una botella de Coca-Cola]\")\n[END TOOL]",
"workflowId": {
"__rl": true,
"value": "amefsW3X5EmHzj4V",
"mode": "list",
"cachedResultUrl": "/workflow/amefsW3X5EmHzj4V",
"cachedResultName": "DuelistCardCrafter"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"concept_input": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('concept_input', ``, 'string') }}"
},
"matchingColumns": [
"planet_name"
],
"schema": [
{
"id": "concept_input",
"displayName": "concept_input",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
1776,
576
],
"id": "50dadd42-d3df-4f82-a834-34e96b070fec",
"name": "Call 'DuelistCardCrafter'"
},
{
"parameters": {
"description": "[BEGIN TOOL]\nname: ResumeTailor\ndescription: Esta herramienta es un sub-agente de IA experto en recursos humanos. Su \u00fanica funci\u00f3n es crear una hoja de vida (CV) profesional y completamente personalizada para una oferta de trabajo espec\u00edfica. El agente realiza web scraping de la URL de la oferta, recupera la informaci\u00f3n personal del usuario desde una base de conocimiento en Google Drive, y luego redacta un CV optimizado que resalta las habilidades y experiencias m\u00e1s relevantes para ese puesto. Es la herramienta perfecta cuando el usuario pide \"crear una hoja de vida para este trabajo\", \"adapta mi CV para esta oferta\", o proporciona un enlace a una vacante laboral.\ninputs:\n job_offer_url: La URL completa y directa a la p\u00e1gina web que contiene la descripci\u00f3n de la oferta de trabajo. (string, obligatorio)\noutputs:\n resume_pdf: El archivo PDF final de la hoja de vida personalizada. (file)\n status: Un mensaje de texto que indica el resultado de la operaci\u00f3n, como \"Hoja de vida para el puesto de [Cargo] creada con \u00e9xito.\" (string)\nrules:\n 1. Esta herramienta DEBE ser utilizada siempre que el usuario proporcione una URL con la intenci\u00f3n de crear un documento de aplicaci\u00f3n laboral.\n 2. La herramienta maneja todo el proceso de forma aut\u00f3noma: scraping, lectura de datos personales, redacci\u00f3n y generaci\u00f3n del PDF.\n 3. No debe usarse para b\u00fasquedas generales de trabajo ni para redacci\u00f3n de textos que no sean una hoja de vida.\nusage_examples:\n - ResumeTailor(job_offer_url=\"https://www.linkedin.com/jobs/view/1234567890/\")\n - ResumeTailor(job_offer_url=\"https://www.ejemplo.com/carreras/ingeniero-de-software-senior\")\n[END TOOL]",
"workflowId": {
"__rl": true,
"value": "FxXgtTpzc3xMHrga",
"mode": "list",
"cachedResultUrl": "/workflow/FxXgtTpzc3xMHrga",
"cachedResultName": "ResumeTailor"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"job_offer_url": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('job_offer_url', ``, 'string') }}"
},
"matchingColumns": [
"url"
],
"schema": [
{
"id": "job_offer_url",
"displayName": "job_offer_url",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "sessionId",
"displayName": "sessionId",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
1984,
592
],
"id": "7a144f5b-f187-40af-ba26-a4ecf3508493",
"name": "Call 'ResumeTailor'"
},
{
"parameters": {
"description": "[BEGIN TOOL]\\nname: VectorDataQueryTool\\ndescription: Esta herramienta est\u00e1 dise\u00f1ada para realizar b\u00fasquedas sem\u00e1nticas dentro de una base de conocimiento vectorial. Recupera segmentos de informaci\u00f3n relevantes bas\u00e1ndose en la consulta del usuario, sirviendo como la fuente principal de informaci\u00f3n para la mayor\u00eda de las solicitudes. Su funci\u00f3n es proporcionar respuestas r\u00e1pidas y concisas extrayendo datos existentes.\\ninputs:\\n query_text: Una cadena de texto que representa la pregunta o afirmaci\u00f3n del usuario para la cual se debe realizar una b\u00fasqueda en la base de datos vectorial.\\noutputs:\\n results: Una cadena de texto que contiene la informaci\u00f3n m\u00e1s relevante encontrada en la base de datos vectorial. Si no se encuentra informaci\u00f3n relevante, este campo estar\u00e1 vac\u00edo.\\n status: Una cadena de texto que indica el resultado de la operaci\u00f3n: \"success\" si se encontraron resultados relevantes, o \"not_found\" si no se pudo recuperar informaci\u00f3n para la consulta.\\nrules:\\n 1. La herramienta `VectorDataQueryTool` DEBE ser la primera herramienta invocada para cualquier consulta del usuario, a menos que la consulta indique expl\u00edcitamente la necesidad de \"papers\", \"art\u00edculos cient\u00edficos\", \"estudios de investigaci\u00f3n\" o tipos de publicaciones acad\u00e9micas similares.\\n 2. Si la herramienta `VectorDataQueryTool` es invocada y su `status` es \"not_found\", el agente DEBE informar al usuario que no se encontr\u00f3 informaci\u00f3n relevante para su consulta en la base de conocimiento actual y NO debe proceder a invocar otras herramientas de b\u00fasqueda general a menos que el usuario refine su consulta o solicite expl\u00edcitamente una b\u00fasqueda m\u00e1s amplia.\\n 3. Si la consulta del usuario se refiere claramente a la b\u00fasqueda de documentos acad\u00e9micos, como \"papers\", \"art\u00edculos de investigaci\u00f3n\" o \"estudios cient\u00edficos\" (por ejemplo, \"Necesito un paper sobre...\", \"Busca art\u00edculos sobre...\", \"D\u00f3nde encuentro estudios de...\"), el agente NO DEBE usar esta herramienta y DEBE priorizar otras herramientas dise\u00f1adas espec\u00edficamente para la b\u00fasqueda de publicaciones acad\u00e9micas.\\nusage_examples:\\n - VectorDataQueryTool(query_text=\"\u00bfCu\u00e1l es el proceso de fotos\u00edntesis en plantas?\")\\n - VectorDataQueryTool(query_text=\"Informaci\u00f3n sobre la teor\u00eda de la relatividad.\")\\n - VectorDataQueryTool(query_text=\"\u00bfQui\u00e9n fue Alan Turing?\")\\n[END TOOL]\t",
"workflowId": {
"__rl": true,
"value": "l5dueCQBG5AnW8nT",
"mode": "list",
"cachedResultUrl": "/workflow/l5dueCQBG5AnW8nT",
"cachedResultName": "vector database retriever final"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('query', ``, 'string') }}"
},
"matchingColumns": [
"query"
],
"schema": [
{
"id": "query",
"displayName": "query",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 2.2,
"position": [
1072,
592
],
"id": "fbe223f3-aa77-4ae9-9cba-8e2d9e51dc76",
"name": "Call 'vector database retriever final'"
}
],
"connections": {
"WhatsApp Trigger": {
"main": [
[
{
"node": "bot prove",
"type": "main",
"index": 0
}
]
]
},
"bot prove": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Send message",
"type": "main",
"index": 0
}
]
]
},
"Call 'researcher'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Call 'prompter'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Call 'google_drive_manager'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Call 'DuelistCardCrafter'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Call 'ResumeTailor'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Call 'vector database retriever final'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "a8d92039-af84-4aef-8984-d4a851c0de0f",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "a67SszRaDyl9uZMk",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
openAiApiwhatsAppApiwhatsAppTriggerApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
LOW. Uses whatsAppTrigger, agent, memoryBufferWindow, toolWorkflow. Event-driven trigger; 12 nodes.
Source: https://github.com/vaskiax/LOW_AI_AGENT/blob/338414e7047696aaef95554ba302fd36a5041f7f/workflows/LOW.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow is for healthcare professionals, consultants, coaches, and service businesses who want to completely automate their appointment booking system via WhatsApp — without manual intervention
Main. Uses whatsApp, agent, httpRequest, memoryBufferWindow. Event-driven trigger; 25 nodes.
This workflow turns WhatsApp into a smart email command center using AI.
Whatsapp Ai Agent. Uses whatsAppTrigger, whatsApp, httpRequest, openAi. Event-driven trigger; 23 nodes.
Streamline restaurant reservations on WhatsApp