AutomationFlowsAI & RAG › Turn Telegram Into an AI Assistant with Openai Voice, Memory and Tools

Turn Telegram Into an AI Assistant with Openai Voice, Memory and Tools

ByStefan Joulien @stefanjoulien on n8n.io

This workflow is for users who want to turn Telegram into a personal AI-powered assistant capable of handling everyday tasks through natural language. It's ideal for solo founders, operators, or professionals who want to manage communication, scheduling, calculations, and…

Event trigger★★★★★ complexityAI-powered43 nodesMemory Buffer WindowTool WorkflowTool ThinkTool CalculatorTelegram TriggerTelegramOpenAIAgent
AI & RAG Trigger: Event Nodes: 43 Complexity: ★★★★★ AI nodes: yes Added:
Turn Telegram Into an AI Assistant with Openai Voice, Memory and Tools — n8n workflow card showing Memory Buffer Window, Tool Workflow, Tool Think integration

This workflow corresponds to n8n.io template #13748 — we link there as the canonical source.

This workflow follows the Agent → Chainllm 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 →

Download .json
{
  "id": "8U5foEBmC4Vb3H1i",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Personal Assistant for Telegram with Voice, Memory & Productivity Tools",
  "tags": [
    {
      "id": "ODwcqtH2rGDMvTeh",
      "name": "template",
      "createdAt": "2026-02-27T09:48:11.280Z",
      "updatedAt": "2026-02-27T09:48:11.280Z"
    }
  ],
  "nodes": [
    {
      "id": "bb4b8f62-17a9-40ad-8ad6-ac810a85ee91",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        800,
        1168
      ],
      "parameters": {
        "sessionKey": "={{ $('Telegram Trigger2').item.json.message.from.id }}",
        "sessionIdType": "customKey",
        "contextWindowLength": 15
      },
      "typeVersion": 1.3
    },
    {
      "id": "73f0455a-d35f-4da1-a539-13a7795dd8a7",
      "name": "Email Agent",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        1072,
        1168
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "hP433ypKMDsZysu5",
          "cachedResultUrl": "/workflow/hP433ypKMDsZysu5",
          "cachedResultName": "EmailAgent"
        },
        "description": "call this tool to take action in email",
        "workflowInputs": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Response"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fc113e51-b1c8-430c-b432-987ce0f9c5a2",
      "name": "CalendarAgent",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        1216,
        1168
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "SPMNXFXkK2Tvvr90",
          "cachedResultUrl": "/workflow/SPMNXFXkK2Tvvr90",
          "cachedResultName": "CalendarAgent"
        },
        "description": "Call this tool to take action in calendar",
        "workflowInputs": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "05ab59ea-3a31-47d8-83c8-70f25fb24fc3",
      "name": "Think",
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "position": [
        1488,
        1168
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "74b705a6-3baa-4d6b-9808-bbafc386e175",
      "name": "ResearchAgent",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        1360,
        1168
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "y3hBFzucMzFuCxtW",
          "cachedResultUrl": "/workflow/y3hBFzucMzFuCxtW",
          "cachedResultName": "ResearchAgent"
        },
        "description": "call this tool to search the Internet to unswer the user's question",
        "workflowInputs": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "980bb84d-9308-4b79-95e3-d8505de00a1b",
      "name": "Calculator",
      "type": "@n8n/n8n-nodes-langchain.toolCalculator",
      "position": [
        1600,
        1168
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "04a0ad29-8ef7-4bd7-ae42-033c58571819",
      "name": "ContactAgent",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        944,
        1168
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "27xaYaVvesNUFhBp",
          "cachedResultUrl": "/workflow/27xaYaVvesNUFhBp",
          "cachedResultName": "ContactAgent"
        },
        "description": "Utiliza esta herramienta para obtener, actualizar, agregar o eliminar contacto",
        "workflowInputs": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "0e3be517-996f-47c0-b169-664e91d13a75",
      "name": "Telegram Trigger2",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -688,
        944
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d2fdac2e-b342-411c-9e40-12829bc238ef",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -256,
        928
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1e4c4b87-4e51-43f0-a261-6d3577c4fa9b",
              "name": "chat_id",
              "type": "string",
              "value": "={{ $json.message.from.id }}"
            },
            {
              "id": "de00a6d2-6007-4ff1-82c2-46d69223291d",
              "name": "mensaje.texto",
              "type": "string",
              "value": "={{ $json.message.text }}"
            },
            {
              "id": "4b2acffc-ecb9-4bad-b8ed-e37b0516b6eb",
              "name": "mensaje.audio.file_id",
              "type": "string",
              "value": "={{ $json.message.voice.file_id }}"
            },
            {
              "id": "98d33826-753e-4ea1-a14f-916f2cef8707",
              "name": "mensaje.audio.mime_type",
              "type": "string",
              "value": "={{ $json.message.voice?.mime_type || '' }}"
            },
            {
              "id": "37e9aa9d-ad7b-4930-adbd-33b33e6c4a9e",
              "name": "mensaje.documento.file_id",
              "type": "string",
              "value": "={{ $json.message.document?.file_id || '' }}"
            },
            {
              "id": "2c4783d4-e393-4fac-9865-a1100b516336",
              "name": "mensaje.documento.file_name",
              "type": "string",
              "value": "={{ $json.message.document?.file_name || '' }}"
            },
            {
              "id": "9851fa6a-0d41-4bef-8aac-5f8721189542",
              "name": "mensaje.documento.mime_type",
              "type": "string",
              "value": "={{ $json.message.document?.mime_type || '' }}"
            },
            {
              "id": "6ada7832-f03f-44e4-9cd1-bc4c21328da5",
              "name": "timestamp",
              "type": "string",
              "value": "={{ $now.format('dd/LL/yyyy h:mm a') }}"
            },
            {
              "id": "2ac21b46-3e93-49c8-b219-05373f99f661",
              "name": "nombre",
              "type": "string",
              "value": "={{ $json.message.from.first_name }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "30852e6d-2aa2-457a-a53f-677ad9ce65fe",
      "name": "Get a file",
      "type": "n8n-nodes-base.telegram",
      "position": [
        64,
        768
      ],
      "parameters": {
        "fileId": "={{ $json.mensaje.audio.file_id }}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "198795a8-f237-4b19-a833-3f6e92d301f7",
      "name": "OpenAI2",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        240,
        768
      ],
      "parameters": {
        "options": {},
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "cad03fd3-d8fe-4242-bbab-5f97993376a0",
      "name": "If1",
      "type": "n8n-nodes-base.if",
      "position": [
        -480,
        944
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "598cd4c0-566f-4f2f-8fdc-34da2881ad0c",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.message.from.id }}",
              "rightValue": 6471510081
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e4d12df9-764e-4f79-a62c-2a6d4efd57e5",
      "name": "No Operation, do nothing1",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -464,
        1184
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5cc9e7a6-9c3f-461a-9e0a-08cb5338c026",
      "name": "Switch2",
      "type": "n8n-nodes-base.switch",
      "position": [
        -64,
        928
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "audio",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "fefd198c-a517-4b8c-996a-285497fcc1be",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.mensaje.audio.file_id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "texto",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8ca54693-6159-4c26-8c0f-831e7a08c9df",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.mensaje.texto }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "08a1355b-e837-4d0b-8a2d-c0dfe08a2b4d",
      "name": "Lucy",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        992,
        944
      ],
      "parameters": {
        "text": "={{ $json.mensaje_final }}",
        "options": {
          "systemMessage": "=#Overview\n\nEres Lucy, un asistente personal \u00fatil. Responde siempre al idioma que recibes el mensaje.\n\nEres una inteligencia artificial de asistente personal, para Christian, altamente eficiente y orientada a los detalles, dise\u00f1ada para gestionar tareas de comunicaci\u00f3n y programaci\u00f3n de manera fluida. Te llamas Lucy. Tienes acceso a las siguientes herramientas: base de datos de contactos, EmailAgent, CalendarAgent, ResearchAgent, ContactAgent y Calculadora. Tu prioridad es utilizar estas herramientas en el orden correcto para garantizar precisi\u00f3n y fiabilidad.\n\n\n#Tools\n\n1. ContactAgent\nDescripci\u00f3n:\nLa base de datos de contactos se utiliza para obtener la informaci\u00f3n de contacto de una persona (como su direcci\u00f3n de correo electr\u00f3nico) antes de realizar cualquier acci\u00f3n con EmailAgent o CalendarAgent.\n\nCu\u00e1ndo usarla:\n\nSiempre antes de enviar un correo electr\u00f3nico o programar un evento.\n\nPara confirmar que los datos de contacto son correctos.\n\nPara a\u00f1adir, eliminar o ver todos los contactos que hay en la hoja. \n\n2. EmailAgent\nDescripci\u00f3n:\nEmailAgent es una herramienta utilizada para redactar, enviar, responder o eliminar correos electr\u00f3nicos.\n\nCu\u00e1ndo usarla:\nSolo despu\u00e9s de confirmar la direcci\u00f3n de correo electr\u00f3nico mediante la base de datos de contactos o cuando te diga el correo de dicha perosna que debes de enviar el correo.\n\n3. CalendarAgent\nDescripci\u00f3n:\nCalendarAgent se usa para programar, actualizar, ver, modificar o cancelar eventos en un sistema de calendario.\n\nCu\u00e1ndo usarla:\n\nSolo despu\u00e9s de verificar que los participantes tienen datos de contacto v\u00e1lidos mediante la base de datos de contactos o te he dicho ya el contacto y lo tienes en tu memoria guardada.\n\n4. ResearchAgent\nDescripci\u00f3n:\nResearchAgent permite buscar en Internet cualquier informaci\u00f3n relevante (art\u00edculos, documentos, datos p\u00fablicos, etc.) para enriquecer correos, eventos o respuestas al usuario.\n\nCu\u00e1ndo usarla:\n\nCuando necesites contexto adicional, estad\u00edsticas o contenido de respaldo.\n\nPara confirmar hechos antes de enviarlos por EmailAgent o discutirlos en CalendarAgent.\n\nNotas clave:\n\nPresenta las fuentes o un breve resumen de d\u00f3nde se obtuvo la informaci\u00f3n.\n\nPrioriza la fiabilidad y actualidad de los datos.\n\nEstamos en el a\u00f1o 2025\nFecha y hora actuales: {{ $now.format(('dd/LL/yyyy h:nn a')) }}"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "abeddc9a-0449-4679-93fc-eeff5be7bd87",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        624,
        1168
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "ea2241de-b447-47a4-a2aa-9ef625f17151",
      "name": "Auto-fixing Output Parser2",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        2224,
        624
      ],
      "parameters": {
        "options": {
          "prompt": "Instructions:\n--------------\n{instructions}\n\nCompletion:\n--------------\n{completion}\n\nError:\n--------------\n{error}\n\nThe above completion did not match the required format. Please correct it according to the instructions and return a valid JSON."
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f4898385-3728-4dcf-b8df-ab67268c29ed",
      "name": "OpenAI Chat Model8",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2000,
        848
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1d7169a2-6745-462a-b821-1d68a2cdb09c",
      "name": "Structured Output Parser2",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2288,
        832
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"response\": {\n    \"part_1\": \"Parte uno de la respuesta (obligatoria)\",\n    \"part_2\": \"Parte dos de la respuesta (opcional)\",\n    \"part_3\": \"Parte tres de la respuesta (opcional)\",\n    \"part_4\": \"Parte cuatro de la respuesta (opcional)\"\n  }\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "60f7a4f6-0dd0-4835-8132-597b9aad2357",
      "name": "Wait5",
      "type": "n8n-nodes-base.wait",
      "position": [
        2896,
        336
      ],
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "04763596-1f66-477f-b7ce-8786d8e3412d",
      "name": "Wait6",
      "type": "n8n-nodes-base.wait",
      "position": [
        3536,
        336
      ],
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "39ee5e66-7e2e-4e35-bba8-94a5021f84ab",
      "name": "Wait7",
      "type": "n8n-nodes-base.wait",
      "position": [
        4160,
        352
      ],
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "40376b08-db4f-4865-8d0d-4e72194ecd4f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        -400
      ],
      "parameters": {
        "width": 1040,
        "height": 992,
        "content": "## Who this template is for\n\nThis workflow is designed for users who want to turn Telegram into a personal AI-powered assistant capable of handling everyday tasks through natural language. It is ideal for solo founders, operators, or professionals who want to manage communication, scheduling, calculations, and information retrieval from a single chat interface.\n\nNo advanced n8n knowledge is required, and the workflow is designed to be easily extended with additional tools.\n\n## What this workflow does\n\nThis workflow creates a Telegram-based AI assistant that can receive text or voice messages, understand user intent, and respond with text or audio. The assistant can reason about requests and use multiple tools such as contacts lookup, email drafting, calendar management, research, messaging, and calculations.\n\nVoice messages are automatically transcribed, processed like text input, and answered accordingly.\n\n## How it works\n\nThe workflow listens for incoming Telegram messages and validates the sender. It then detects whether the message is text or voice. Voice messages are transcribed using OpenAI before being passed to the AI agent.\n\nThe AI agent processes the request using a chat model, short-term memory, and a set of productivity tools. The response is then cleaned and either sent back as text or converted into audio before being delivered to Telegram.\n\n## How to set up\n\n1. Create a Telegram bot and connect it to the Telegram Trigger node.\n2. Add your Telegram user ID to the authorization fields.\n3. Connect your OpenAI credentials for chat, transcription, and text-to-speech.\n4. Activate the workflow and start chatting with your assistant.\n\n## Requirements\n\n- Telegram account and bot token\n- OpenAI API credentials\n- n8n instance (cloud or self-hosted)\n\n## How to customize the workflow\n\nYou can rename the assistant, adjust its behavior rules, add or remove tools, or connect additional services such as CRMs or databases. The authorization logic can also be expanded to support multiple users."
      },
      "typeVersion": 1
    },
    {
      "id": "584eb6ea-e2e1-4fe0-96d6-b03ac0653d48",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        1152
      ],
      "parameters": {
        "width": 512,
        "height": 128,
        "content": "## B. Sticky: \u201cMessage type detection\u201d\n\nThis step detects whether the incoming Telegram message is text or voice and routes the workflow accordingly."
      },
      "typeVersion": 1
    },
    {
      "id": "646059f7-6bed-4cb3-9e02-e14c5fa8d874",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        1152
      ],
      "parameters": {
        "width": 400,
        "height": 240,
        "content": "## A. Sticky: \u201cWorkflow entry & user validation\u201d\n\nThis section listens for incoming Telegram messages and validates the sender.\n\nOnly authorized user IDs are allowed to continue. Unauthorized messages are ignored to protect private interactions with the assistant."
      },
      "typeVersion": 1
    },
    {
      "id": "395d9995-1e6d-499c-87a8-ca73da44cd29",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        928,
        1328
      ],
      "parameters": {
        "width": 400,
        "height": 272,
        "content": "## C. Sticky: \u201cAI personal assistant agent\u201d\n\nThis is the core AI agent. It uses an OpenAI chat model, short-term memory, and multiple tools to understand user requests and execute actions such as sending emails, managing contacts, scheduling events, performing research, or running calculations.\n\nThe assistant follows predefined rules to ensure safe, consistent, and professional behavior."
      },
      "typeVersion": 1
    },
    {
      "id": "2eb4e873-a24d-4b43-a29f-8c4f4ba6db16",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2528,
        1088
      ],
      "parameters": {
        "width": 400,
        "height": 208,
        "content": "## D. Sticky: \u201cResponse formatting and delivery\u201d\n\nThe assistant response is cleaned and formatted before delivery. Depending on the output type, the response is sent as plain text or converted into audio and returned to the user in Telegram."
      },
      "typeVersion": 1
    },
    {
      "id": "c4d6afe4-241d-4452-b885-7cc186fb1a29",
      "name": "Text Message",
      "type": "n8n-nodes-base.set",
      "position": [
        240,
        944
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a9a6b137-1aee-4542-a955-9004397d7ff0",
              "name": "texto",
              "type": "string",
              "value": "={{ $json.mensaje.texto }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5c19d85b-1035-4aab-873e-74923e4c5486",
      "name": "audio message",
      "type": "n8n-nodes-base.set",
      "position": [
        416,
        768
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "734e0b89-6760-42a7-8d52-1bd2eab2c941",
              "name": "mensaje",
              "type": "string",
              "value": "={{ $json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c209d9f7-0454-45f0-bfbd-9cb4e1361ec4",
      "name": "Clean Message",
      "type": "n8n-nodes-base.code",
      "position": [
        608,
        944
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  let partes = [];\n\n  if (item.json.texto) {\n    partes.push(item.json.texto);\n  }\n\n  if (item.json.mensaje) {\n    partes.push(item.json.mensaje);\n  }\n\n  if (item.json.mensaje?.imagen?.file_id) {\n    partes.push(item.json.mensaje.imagen.file_id);\n  }\n\n  if (item.json.contenidoPDF) {\n    partes.push(item.json.contenidoPDF);\n  }\n\n  if (item.json.text) {\n    partes.push(item.json.text);\n  }\n\n  item.json.mensaje_final = partes.join(' ');\n  return item;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "8839cbf8-6a95-4fd8-80cd-727558d7f4b0",
      "name": "final message",
      "type": "n8n-nodes-base.set",
      "position": [
        784,
        944
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f06019b6-989e-4e2d-bf7f-1b174cd4e3b7",
              "name": "mensaje_final",
              "type": "string",
              "value": "={{ $json.mensaje_final }}"
            },
            {
              "id": "e17baa73-76d3-4652-8cf0-54d01543ef9c",
              "name": "chat_id",
              "type": "string",
              "value": "={{ $('Edit Fields').item.json.chat_id }}"
            },
            {
              "id": "7d626963-600d-4198-ac0d-d4dcb882d8e3",
              "name": "timestamp",
              "type": "string",
              "value": "={{ $now.format('dd/LL/yyyy h:mm a') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0e4eb989-c94f-4bc4-81a0-2c7337db0015",
      "name": "transform text",
      "type": "n8n-nodes-base.code",
      "position": [
        1312,
        944
      ],
      "parameters": {
        "jsCode": "// Longitud m\u00e1xima aproximada por p\u00e1rrafo\nconst maxChars = 400;\n\n/**\n * Normaliza listas para que:\n * - Cada \u00edtem vaya en una l\u00ednea separada\n * - Haya una l\u00ednea en blanco entre \u00edtems\n * - Siempre sean listas numeradas en Markdown: \"1. ...\", \"2. ...\"\n */\nfunction normalizarListasMarkdown(texto) {\n  if (!texto) return '';\n\n  const lineasOriginales = String(texto).split('\\n');\n\n  const nuevasLineas = [];\n  const esLineaLista = [];\n\n  let enLista = false;\n  let contador = 0;\n\n  for (let i = 0; i < lineasOriginales.length; i++) {\n    let linea = lineasOriginales[i].trimEnd(); // mantenemos posibles espacios iniciales\n\n    // Detectamos bullets t\u00edpicos:\n    // - \"- algo\", \"* algo\", \"\u2022 algo\"\n    // - \"1. algo\", \"1) algo\"\n    const match = linea.match(/^\\s*(?:([-*\u2022])\\s+|(\\d+)[\\.\\)]\\s+)(.+)$/);\n\n    if (match) {\n      const contenido = (match[3] || '').trim();\n      if (!contenido) {\n        continue;\n      }\n\n      if (!enLista) {\n        enLista = true;\n        contador = 1;\n      } else {\n        contador++;\n      }\n\n      // Siempre numeramos en formato Markdown: \"n. contenido\"\n      linea = `${contador}. ${contenido}`;\n      nuevasLineas.push(linea.trim());\n      esLineaLista.push(true);\n    } else {\n      // L\u00ednea normal (no de lista)\n      enLista = false;\n      contador = 0;\n\n      // Respetamos l\u00edneas en blanco\n      if (linea === '') {\n        nuevasLineas.push('');\n        esLineaLista.push(false);\n      } else {\n        nuevasLineas.push(linea);\n        esLineaLista.push(false);\n      }\n    }\n  }\n\n  // Recomponemos el texto asegurando l\u00ednea en blanco entre \u00edtems de lista\n  let resultado = '';\n\n  for (let i = 0; i < nuevasLineas.length; i++) {\n    const linea = nuevasLineas[i];\n\n    if (i > 0) {\n      if (esLineaLista[i] && esLineaLista[i - 1]) {\n        // Entre dos \u00edtems de lista => doble salto de l\u00ednea\n        resultado += '\\n\\n';\n      } else {\n        // Resto de casos => salto normal\n        resultado += '\\n';\n      }\n    }\n\n    resultado += linea;\n  }\n\n  // Limpiamos exceso de l\u00edneas en blanco (m\u00e1ximo doble salto)\n  resultado = resultado.replace(/\\n{3,}/g, '\\n\\n');\n\n  return resultado.trim();\n}\n\nfunction formatearTexto(textoBruto) {\n  // Normalizamos saltos de l\u00ednea\n  let texto = String(textoBruto || '').replace(/\\r\\n/g, '\\n').trim();\n\n  if (!texto) return '';\n\n  // Forzamos que las listas/enumeraciones empiecen en l\u00ednea nueva\n  // Ejemplos detectados:\n  // \"1. algo\", \"2) algo\", \"- algo\", \"* algo\", \"\u2022 algo\"\n  texto = texto\n    .replace(/\\s*((?:\\d+[\\.\\)]\\s+|[-*\u2022]\\s+))/g, '\\n\\n$1')\n    .trim();\n\n  // \u00bfEl texto ya tiene p\u00e1rrafos (doble salto de l\u00ednea)?\n  if (texto.includes('\\n\\n')) {\n    // Solo normalizamos listas y salimos, respetando el resto\n    return normalizarListasMarkdown(texto);\n  }\n\n  // Si no hay p\u00e1rrafos, creamos p\u00e1rrafos a partir de frases y longitud m\u00e1xima\n  const frases = texto.match(/[^.!?]+[.!?]?/g) || [texto];\n\n  const parrafos = [];\n  let actual = '';\n\n  for (const frase of frases) {\n    const f = frase.trim();\n    if (!f) continue;\n\n    const candidata = actual ? actual + ' ' + f : f;\n\n    if (candidata.length > maxChars && actual) {\n      parrafos.push(actual.trim());\n      actual = f;\n    } else {\n      actual = candidata;\n    }\n  }\n\n  if (actual.trim()) {\n    parrafos.push(actual.trim());\n  }\n\n  const textoConParrafos = parrafos.join('\\n\\n');\n\n  // Siempre terminamos normalizando listas en el texto final\n  return normalizarListasMarkdown(textoConParrafos);\n}\n\n// =======================\n// L\u00d3GICA PRINCIPAL\n// =======================\n\nconst items = $input.all();\nconst resultados = [];\n\nfor (const item of items) {\n  const data = item.json || {};\n\n  // De d\u00f3nde sacamos la respuesta del agente\n  let texto = data.respuesta_bot ?? data.output ?? data.text ?? '';\n\n  // Si viene en objeto (p.ej. { text: \"...\" })\n  if (texto && typeof texto === 'object') {\n    if (typeof texto.text === 'string') {\n      texto = texto.text;\n    } else if (Array.isArray(texto)) {\n      texto = texto.join(' ');\n    } else {\n      texto = JSON.stringify(texto);\n    }\n  }\n\n  // Si no hay texto, devolvemos el item tal cual\n  if (typeof texto !== 'string' || !texto.trim()) {\n    resultados.push(item);\n    continue;\n  }\n\n  // Formateamos el texto a p\u00e1rrafos + listas premium\n  const textoFormateado = formatearTexto(texto);\n\n  // Sobrescribimos SOLO el campo output\n  resultados.push({\n    json: {\n      ...data,\n      output: textoFormateado,\n    },\n  });\n}\n\nreturn resultados;"
      },
      "typeVersion": 2
    },
    {
      "id": "65e8ed72-30a4-4f3b-a7d8-d2a868578609",
      "name": "swich",
      "type": "n8n-nodes-base.code",
      "position": [
        1504,
        944
      ],
      "parameters": {
        "jsCode": "// Obtenemos el item de entrada\nconst item = $input.first();\nconst texto = (item.json.output ?? \"\").toString().trim();\n\n// Si no hay texto, devolvemos 0 palabras\nif (!texto) {\n\treturn [\n\t\t{\n\t\t\tjson: {\n\t\t\t\tnumeroDePalabras: 0\n\t\t\t}\n\t\t}\n\t];\n}\n\n// Reemplazamos saltos de l\u00ednea m\u00faltiples para evitar falsos vac\u00edos\nconst normalizado = texto.replace(/\\s+/g, \" \").trim();\n\n// Dividimos por espacios\nconst palabras = normalizado.length > 0 ? normalizado.split(\" \") : [];\n\n// Total de palabras\nconst cantidad = palabras.length;\n\n// Devolvemos el resultado\nreturn [\n\t{\n\t\tjson: {\n\t\t\tnumeroDePalabras: cantidad\n\t\t}\n\t}\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "5a5b50a5-cf24-4548-b4dc-f985273d47fd",
      "name": "path",
      "type": "n8n-nodes-base.if",
      "position": [
        1696,
        944
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "24b9e5f2-896f-42f0-85c4-df0ad7bdeed2",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.numeroDePalabras }}",
              "rightValue": 15
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "cbe9a08b-b570-407a-9a41-e0cf8abd20a3",
      "name": "message breakdown",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2000,
        448
      ],
      "parameters": {
        "text": "={{ $('Lucy').item.json.output }}",
        "messages": {
          "messageValues": [
            {
              "message": "=# CONTEXTO\nEres un formateador experto de salidas para Whatsapp.\n\n# OBJETIVO\n\nToma el texto de la entrada y devuelve la salida en formato JSON como te describo en el Output Parser. Debes dividir la salida en 4 partes, pero solo una parte es obligatoria. Si la respuesta es corta, la part_2, la part_3 y la parte_4 pueden ir vac\u00edas.\n\n# INSTRUCCIONES Y REGLAS CLAVE\n\n- El input debe contener siempre texto. part_2, part_3 y parte_4 pueden quedar vac\u00edas (\u201c\u201d) o no incluirse si no son necesarias.\n\n- Jam\u00e1s devuelvas en la salida algo que no venga del input de la entrada.\n\n- Aseg\u00farate que la respuesta es en idioma Espa\u00f1ol de Espa\u00f1a (Castellano).\n\n- Elimina todos los caracteres: \"*, |, !, #.\"\n\n- Divide la entrada en hasta 4 partes l\u00f3gicas, manteniendo el sentido original.\n\n- Si la entrada contiene una lista, depos\u00edtala entera en una \u00fanica parte.\n\n- MUY IMPORTANTE: Cada vez que des una lista o enumeraci\u00f3n, cada punto debe ir siempre en una l\u00ednea separada, con salto de l\u00ednea entre ellos. Devuelve siempre las listas numeradas en formato Markdown, usando un salto de l\u00ednea entre cada punto. Por ejemplo:\n\n\"1. \u00bfCu\u00e1nto tiempo llevas con dificultades para pagar...?\n\n2. \u00bfTienes otras deudas adem\u00e1s de ese pr\u00e9stamo?\n\n3. \u00bfCu\u00e1ntos...\"\n\n\n- No a\u00f1adas, quites ni reordenes informaci\u00f3n.\n\n- Nunca env\u00edes texto fuera del JSON; ni explicaciones ni comillas traza.\n\n# COMPORTAMIENTO\n\n- Lee el contenido de Entrada a formatear.\n- Aplica las reglas para limpiar y segmentar.\n- Devuelve solo el JSON resultante.\n\n### EJEMPLO SIMPLE\n\n- Entrada:\nHola, estoy aqu\u00ed para ayudarte. \u00bfEn qu\u00e9 puedo asistirte hoy?\n\n- Salida esperada:\n{\n  \"response\": {\n    \"part_1\": \"Hola, estoy aqu\u00ed para ayudarte.\",\n    \"part_2\": \"\u00bfEn qu\u00e9 puedo asistirte hoy?\",\n    \"part_3\": \"\",\n    \"part_4\": \"\"\n  }\n}\n"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.6
    },
    {
      "id": "26e9a797-e9fc-4e65-baf0-2bd69f1d1f01",
      "name": "message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        3408,
        960
      ],
      "parameters": {
        "text": "={{ $('Lucy').item.json.output }}",
        "chatId": "={{ $('Telegram Trigger2').item.json.message.from.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "493612f4-f5b7-4303-8691-ebbe79e8c403",
      "name": "1st bubble",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2480,
        448
      ],
      "parameters": {
        "text": "={{ $json.output.response.part_1 }}",
        "chatId": "={{ $('Telegram Trigger2').item.json.message.from.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "06512c43-4276-460a-8a49-7c44101b8407",
      "name": "2nd?",
      "type": "n8n-nodes-base.if",
      "position": [
        2688,
        448
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "78de0084-4e66-4d1c-9aa7-74ca033a4d7c",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $('message breakdown').item.json.output.response.part_2 }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f33a0ef5-3ac0-48e6-a360-ff9d83815699",
      "name": "3rd?",
      "type": "n8n-nodes-base.if",
      "position": [
        3296,
        464
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "10e08bab-8587-4a0d-92aa-1c8e834e9ed5",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $('message breakdown').item.json.output.response.part_3 }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "12edb49c-ef12-4eeb-83fa-8711a9f83906",
      "name": "2nd bubble",
      "type": "n8n-nodes-base.telegram",
      "position": [
        3104,
        336
      ],
      "parameters": {
        "text": "={{ $('message breakdown').item.json.output.response.part_2 }}",
        "chatId": "={{ $('Telegram Trigger2').item.json.message.chat.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9e3d28b3-67c4-42a6-8cf9-a92e7a0a0973",
      "name": "3rd bubble",
      "type": "n8n-nodes-base.telegram",
      "position": [
        3728,
        336
      ],
      "parameters": {
        "text": "={{ $('message breakdown').item.json.output.response.part_3 }}",
        "chatId": "={{ $('Telegram Trigger2').item.json.message.from.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0ae532d3-d604-46a0-8578-6171fe31d8fb",
      "name": "4th?",
      "type": "n8n-nodes-base.if",
      "position": [
        3936,
        480
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "10e08bab-8587-4a0d-92aa-1c8e834e9ed5",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $('message breakdown').item.json.output.response.part_4 }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "cf710ea4-1aa6-404b-b1b6-9c77e5f9ca51",
      "name": "4th bubble",
      "type": "n8n-nodes-base.telegram",
      "position": [
        4352,
        352
      ],
      "parameters": {
        "text": "={{ $('message breakdown').item.json.output.response.part_4 }}",
        "chatId": "={{ $('Telegram Trigger2').item.json.message.chat.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    }
  ],
  "active": false,
  "settings": {
    "timezone": "Europe/Madrid",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "6acbd90c-e748-40f8-bd86-5d7d989a46cf",
  "connections": {
    "If1": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2nd?": {
      "main": [
        [
          {
            "node": "Wait5",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "3rd?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3rd?": {
      "main": [
        [
          {
            "node": "Wait6",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "4th?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4th?": {
      "main": [
        [
          {
            "node": "Wait7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lucy": {
      "main": [
        [
          {
            "node": "transform text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "path": {
      "main": [
        [
          {
            "node": "message breakdown",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Think": {
      "ai_tool": [
        [
          {
            "node": "Lucy",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Wait5": {
      "main": [
        [
          {
            "node": "2nd bubble",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait6": {
      "main": [
        [
          {
            "node": "3rd bubble",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait7": {
      "main": [
        [
          {
            "node": "4th bubble",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "swich": {
      "main": [
        [
          {
            "node": "path",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI2": {
      "main": [
        [
          {
            "node": "audio message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch2": {
      "main": [
        [
          {
            "node": "Get a file",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Text Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1st bubble": {
      "main": [
        [
          {
            "node": "2nd?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2nd bubble": {
      "main": [
        [
          {
            "node": "3rd?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3rd bubble": {
      "main": [
        [
          {
            "node": "4th?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculator": {
      "ai_tool": [
        [
          {
            "node": "Lucy",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get a file": {
      "main": [
        [
          {
            "node": "OpenAI2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Switch2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Agent": {
      "ai_tool": [
        [
          {
            "node": "Lucy",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "ContactAgent": {
      "ai_tool": [
        [
          {
            "node": "Lucy",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Text Message": {
      "main": [
        [
          {
            "node": "Clean Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CalendarAgent": {
      "ai_tool": [
        [
          {
            "node": "Lucy",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Clean Message": {
      "main": [
        [
          {
            "node": "final message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ResearchAgent": {
      "ai_tool": [
        [
          {
            "node": "Lucy",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Lucy",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "audio message": {
      "main": [
        [
          {
            "node": "Clean Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "final message": {
      "main": [
        [
          {
            "node": "Lucy",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "transform text": {
      "main": [
        [
          {
            "node": "swich",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger2": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "message breakdown": {
      "main": [
        [
          {
            "node": "1st bubble",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Lucy",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model8": {
      "ai_languageModel": [
        [
          {
            "node": "Auto-fixing Output Parser2",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "message breakdown",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser2": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser2",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser2": {
      "ai_outputParser": [
        [
          {
            "node": "message breakdown",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow is for users who want to turn Telegram into a personal AI-powered assistant capable of handling everyday tasks through natural language. It's ideal for solo founders, operators, or professionals who want to manage communication, scheduling, calculations, and…

Source: https://n8n.io/workflows/13748/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.

Telegram, Telegram Trigger, OpenAI Chat +8
AI & RAG

How it Works

Memory Buffer Window, Agent, Output Parser Structured +9
AI & RAG

The best content automation template in the market is now even better—with “deep research” on time-sensitive topics\! Unlike most n8n content automation templates that are mainly for “demo purposes,”

OpenAI, HTTP Request, XML +11
AI & RAG

Digital marketers, content creators, social media managers, and businesses who want to use AI marketing automation for YouTube Shorts without spending hours on production. This AI workflow helps anyon

OpenAI, HTTP Request, OpenAI Chat +7