{ "id": "DnHvQ3KL8v8r5L5Z", "meta": { "instanceId": "ac63467607103d9c95dd644384984672b90b1cb03e07edbaf18fe72b2a6c45bb", "templateCredsSetupCompleted": true }, "name": "Telegram Chat with Buffering", "tags": [], "nodes": [ { "id": "a3cc74e9-c696-48de-a04e-d48555641897", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ -1640, -800 ], "parameters": { "color": 7, "width": 220, "height": 280, "content": "## 1. Receive Message\n\n" }, "typeVersion": 1 }, { "id": "ff18667d-0a31-4768-acf8-ed0d53b2f382", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 160, -840 ], "parameters": { "color": 7, "width": 600, "height": 520, "content": "## 3. AI Assistant\n" }, "typeVersion": 1 }, { "id": "ce90f954-19b6-4224-ae88-b20c4da639e6", "name": "Reply", "type": "n8n-nodes-base.telegram", "position": [ 920, -700 ], "webhookId": "e3313c88-0d56-4d06-81cf-b48870dfe2fe", "parameters": { "text": "={{ $json.output }}", "chatId": "={{ $('Receive Message').item.json.message.chat.id }}", "additionalFields": { "appendAttribution": false } }, "credentials": { "telegramApi": { "id": "lvrGkOs0ywXp5agp", "name": "Telegram bsde.ai" } }, "typeVersion": 1.2 }, { "id": "6f46d89b-034c-47ea-a217-8d007bec1531", "name": "Receive Message", "type": "n8n-nodes-base.telegramTrigger", "position": [ -1580, -680 ], "webhookId": "5047a673-ca1d-4e87-b51b-893108de0a59", "parameters": { "updates": [ "message" ], "additionalFields": {} }, "credentials": { "telegramApi": { "id": "lvrGkOs0ywXp5agp", "name": "Telegram bsde.ai" } }, "typeVersion": 1.1 }, { "id": "0f391daa-0e74-4058-8923-52f3c050c9ad", "name": "Wait 10 Seconds", "type": "n8n-nodes-base.wait", "position": [ -1000, -580 ], "webhookId": "87994c9a-fd20-48b6-8dbe-9af36dc40b2f", "parameters": { "amount": 10 }, "typeVersion": 1.1 }, { "id": "8e6495d8-db6e-4692-ade5-45239049de34", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [ -1320, -760 ], "parameters": { "color": 7, "width": 1400, "height": 440, "content": "## 2. Buffer Incoming Messages" }, "typeVersion": 1 }, { "id": "d4876fd2-2e0b-4f82-9dc3-553f926310bd", "name": "Add to Queued Messages", "type": "n8n-nodes-base.supabase", "position": [ -1240, -680 ], "parameters": { "tableId": "message_queue", "fieldsUi": { "fieldValues": [ { "fieldId": "user_id", "fieldValue": "={{ $json.message.chat.id }}" }, { "fieldId": "message", "fieldValue": "={{ $json.message.text }}" }, { "fieldId": "message_id", "fieldValue": "={{ $json.message.message_id }}" } ] } }, "credentials": { "supabaseApi": { "id": "1iEg1EzFrF29iqp2", "name": "Supabase (bsde.ai)" } }, "typeVersion": 1 }, { "id": "a2eeb77f-2d74-44ac-9812-c3659d2e2803", "name": "No Operation, do nothing", "type": "n8n-nodes-base.noOp", "position": [ -340, -460 ], "parameters": {}, "typeVersion": 1 }, { "id": "638fc82e-aba1-4deb-b506-33dcf4746896", "name": "Aggregate", "type": "n8n-nodes-base.aggregate", "position": [ 220, -700 ], "parameters": { "options": {}, "fieldsToAggregate": { "fieldToAggregate": [ { "fieldToAggregate": "message" } ] } }, "typeVersion": 1 }, { "id": "772f60e5-e52f-4779-aa03-e4d532ee4b5c", "name": "Delete Queued Messages", "type": "n8n-nodes-base.supabase", "position": [ -100, -700 ], "parameters": { "filters": { "conditions": [ { "keyName": "user_id", "keyValue": "={{ $json.user_id }}", "condition": "eq" } ] }, "tableId": "message_queue", "operation": "delete" }, "credentials": { "supabaseApi": { "id": "1iEg1EzFrF29iqp2", "name": "Supabase (bsde.ai)" } }, "typeVersion": 1 }, { "id": "16b46a70-85a0-4c8c-94ba-172ebe9aafa4", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ 860, -780 ], "parameters": { "color": 7, "width": 280, "height": 260, "content": "## 4. Send Reply\n\n\n" }, "typeVersion": 1 }, { "id": "9162f110-465f-4cd6-9f03-17751d7e43a4", "name": "OpenAI Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 380, -460 ], "parameters": { "model": { "__rl": true, "mode": "list", "value": "gpt-4o-mini" }, "options": {} }, "credentials": { "openAiApi": { "id": "1OMpAMAKR9l3eUDI", "name": "OpenAi account" } }, "typeVersion": 1.2 }, { "id": "b47ef0c9-725b-4837-b9e9-96a4ff2b3636", "name": "Sort by Message ID", "type": "n8n-nodes-base.sort", "position": [ -580, -680 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "fieldName": "message_id" } ] } }, "typeVersion": 1 }, { "id": "1aa80c99-eec8-4174-bcf3-c6873354ed0f", "name": "Get Queued Messages", "type": "n8n-nodes-base.supabase", "position": [ -780, -680 ], "parameters": { "filters": { "conditions": [ { "keyName": "user_id", "keyValue": "={{ $('Receive Message').item.json.message.from.id }}", "condition": "eq" } ] }, "tableId": "message_queue", "operation": "getAll", "returnAll": true }, "credentials": { "supabaseApi": { "id": "1iEg1EzFrF29iqp2", "name": "Supabase (bsde.ai)" } }, "typeVersion": 1 }, { "id": "85050328-b5aa-47fe-802c-7d9f31f225cb", "name": "Check Most Recent Message", "type": "n8n-nodes-base.if", "position": [ -360, -680 ], "parameters": { "options": {}, "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "loose" }, "combinator": "and", "conditions": [ { "id": "8852bab7-230e-442a-a4a2-994e979c8f9f", "operator": { "type": "number", "operation": "equals" }, "leftValue": "={{ $input.last().json.message_id }}\n", "rightValue": "={{ $('Receive Message').item.json.message.message_id }}" } ] }, "looseTypeValidation": true }, "typeVersion": 2.2 }, { "id": "bed86d81-bb57-42ce-aaa7-4bdc21e1651c", "name": "AI Agent", "type": "@n8n/n8n-nodes-langchain.agent", "position": [ 420, -700 ], "parameters": { "text": "={{ $json.message.join(String.fromCharCode(10)) }}", "options": {}, "promptType": "define" }, "typeVersion": 1.7 }, { "id": "4f468a14-fbea-44ec-a2b8-e4b3785c0362", "name": "Postgres Chat Memory", "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat", "position": [ 560, -460 ], "parameters": { "sessionKey": "={{ $('Receive Message').item.json.message.chat.id }}", "sessionIdType": "customKey" }, "credentials": { "postgres": { "id": "tzLXHvhykxvYghPC", "name": "bsde.ai Supabase (Session Pooler)" } }, "typeVersion": 1.3 }, { "id": "610516e8-d4ad-448e-ac97-17aad1a31862", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ -2420, -820 ], "parameters": { "width": 700, "height": 420, "content": "## Allow Users to Send a Sequence of Messages to an AI Agent in Telegram with Supabase\n### Use Case\nWhen creating chatbots that interface through applications such as **Telegram** and **WhatsApp**, users can often sends multiple shorter messages in quick succession, in place of a single, longer message. This workflow accounts for this behaviour.\n### What it Does\nThis workflow allows users to send several messages in quick succession, treating them as one coherent conversation instead of separate messages requiring individual responses. \n### How it Works\n1. When messages arrive, they are stored in a **Supabase PostgreSQL** table\n2. The system waits briefly to see if additional messages arrive\n3. If no new messages arrive within the waiting period, all queued messages are:\n - Combined and processed as a single conversation\n - Responded to with one unified reply\n - Deleted from the queue" }, "typeVersion": 1 }, { "id": "c8bd8777-fb0f-4941-8674-f5bb7c264506", "name": "Sticky Note5", "type": "n8n-nodes-base.stickyNote", "position": [ -1640, -1060 ], "parameters": { "width": 520, "height": 220, "content": "### Setup\n1. Create a table in Supabase called **message_queue**. It needs to have the following columns: **user_id** (`uint8`), **message** (`text`), and **message_id** (`uint8`)\n2. Add your **Telegram**, **Supabase**, **OpenAI**, and **PostgreSQL** credentials\n3. Activate the workflow and test by sending multiple messages the Telegram bot in one go\n4. Wait ten seconds after which you will receive a single reply to all of your messages" }, "typeVersion": 1 }, { "id": "24604fc7-7957-4e20-8303-b31f2ce1e257", "name": "Sticky Note6", "type": "n8n-nodes-base.stickyNote", "position": [ -1060, -700 ], "parameters": { "color": 5, "width": 220, "height": 280, "content": "### Modification\nChange the value of *Wait Amount* to vary the buffering window" }, "typeVersion": 1 }, { "id": "24f388f3-5655-4bd4-9c30-978efb2dc400", "name": "Sticky Note8", "type": "n8n-nodes-base.stickyNote", "position": [ 180, -480 ], "parameters": { "color": 5, "width": 340, "height": 140, "content": "### Modification\nReplace this sub-node \nto use a different language\n model" }, "typeVersion": 1 }, { "id": "3db12526-6b97-4e3a-b53d-987f5d20c46e", "name": "Sticky Note9", "type": "n8n-nodes-base.stickyNote", "position": [ 380, -800 ], "parameters": { "color": 5, "width": 340, "height": 240, "content": "### Modification\nAdd a **System Message** to tailor the chatbot to your use case" }, "typeVersion": 1 } ], "active": true, "pinData": {}, "settings": { "callerPolicy": "workflowsFromSameOwner", "executionOrder": "v1" }, "versionId": "e415eb18-1bb9-426b-b759-0ba269db1f8f", "connections": { "AI Agent": { "main": [ [ { "node": "Reply", "type": "main", "index": 0 } ] ] }, "Aggregate": { "main": [ [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Receive Message": { "main": [ [ { "node": "Add to Queued Messages", "type": "main", "index": 0 } ] ] }, "Wait 10 Seconds": { "main": [ [ { "node": "Get Queued Messages", "type": "main", "index": 0 } ] ] }, "OpenAI Chat Model": { "ai_languageModel": [ [ { "node": "AI Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "Sort by Message ID": { "main": [ [ { "node": "Check Most Recent Message", "type": "main", "index": 0 } ] ] }, "Get Queued Messages": { "main": [ [ { "node": "Sort by Message ID", "type": "main", "index": 0 } ] ] }, "Postgres Chat Memory": { "ai_memory": [ [ { "node": "AI Agent", "type": "ai_memory", "index": 0 } ] ] }, "Add to Queued Messages": { "main": [ [ { "node": "Wait 10 Seconds", "type": "main", "index": 0 } ] ] }, "Delete Queued Messages": { "main": [ [ { "node": "Aggregate", "type": "main", "index": 0 } ] ] }, "Check Most Recent Message": { "main": [ [ { "node": "Delete Queued Messages", "type": "main", "index": 0 } ], [ { "node": "No Operation, do nothing", "type": "main", "index": 0 } ] ] } } }