AutomationFlowsAI & RAG › Ai-powered Personal Assistant for Telegram with Memory & Task Management

Ai-powered Personal Assistant for Telegram with Memory & Task Management

ByHudson Marr @hudmarr on n8n.io

This workflow creates an intelligent Telegram-based AI assistant that remembers user details, manages lists, integrates with Google Calendar, and can fetch live information from the web. It is designed for everyday use and improves over time with your feedback. Personal Memory:…

Event trigger★★★★★ complexityAI-powered33 nodesTelegram TriggerOpenAI ChatMemory Buffer WindowTelegramAirtable ToolAirtableOpenAIGoogle Calendar Tool
AI & RAG Trigger: Event Nodes: 33 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Airtable 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": "htnjvbXKhNgwF5D7",
  "name": "Telegram Assistant for Creator",
  "tags": [],
  "nodes": [
    {
      "id": "b6d9446d-577c-4796-805a-7199c6a65757",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -360,
        300
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "d9e93503-4009-4846-9497-79ab222daae4",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        440,
        320
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "executeOnce": true,
      "typeVersion": 3
    },
    {
      "id": "14e2b229-34e8-406f-9f3b-79aaeb45ff02",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        520,
        640
      ],
      "parameters": {
        "model": {
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4fd266a3-04a6-4fe7-86bd-3b16284a20b8",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1180,
        560
      ],
      "parameters": {
        "width": 200,
        "height": 560,
        "content": "## Grocery"
      },
      "typeVersion": 1
    },
    {
      "id": "61f7d0e7-4faa-4f7a-9116-9f6da7b9c72a",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        840,
        560
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 200,
        "content": "## Memory"
      },
      "typeVersion": 1
    },
    {
      "id": "1e8f17c8-453f-4725-945c-58cd927ad0ab",
      "name": "Window Buffer Memory1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        680,
        640
      ],
      "parameters": {
        "sessionKey": "telekey",
        "sessionIdType": "customKey",
        "contextWindowLength": 10
      },
      "typeVersion": 1.3
    },
    {
      "id": "0cc42214-7c3f-4f4d-aed9-46da0bacc3a5",
      "name": "Telegram Response",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1180,
        320
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "chatId": "={{ $('Telegram Trigger').item.json.message?.chat?.id || $('Telegram Trigger').item.json.message?.from?.id }}",
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5a8af282-3d93-42bf-98f0-2578baf8fd40",
      "name": "User Tele Memory",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        880,
        620
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_MEMORY }"
        },
        "columns": {
          "value": {
            "User": "={{ $('Telegram Trigger').item.json.message?.from?.username || 'user' }}",
            "Memory": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Memory', ``, 'string') }}"
          },
          "schema": [
            {
              "id": "Memory",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Memory",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "User",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "User",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Assignee",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Assignee",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "4d613b60-148c-457d-9838-de71c790c19e",
      "name": "Zeus Text Memory",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1040,
        620
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_MEMORY }"
        },
        "columns": {
          "value": {
            "User": "={{ $('Telegram Trigger').item.json.message?.from?.username || 'user' }}",
            "Memory": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Memory', ``, 'string') }}"
          },
          "schema": [
            {
              "id": "Memory",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Memory",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "User",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "User",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Assignee",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Assignee",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "091a7c60-af5e-4a60-88c5-a55027544a3a",
      "name": "Grocery Search",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1240,
        640
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_GROCERY }"
        },
        "options": {},
        "operation": "search"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "3145a6ac-c55a-41c9-8d0a-b871316b640f",
      "name": "Grocery Create",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1240,
        800
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_GROCERY }"
        },
        "columns": {
          "value": {
            "Item": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Item', ``, 'string') }}",
            "User": "={{ $('Telegram Trigger').item.json.message?.from?.username || 'user' }}"
          },
          "schema": [
            {
              "id": "Item",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Item",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "User",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "User",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "Created",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "c6e31580-c0fd-4562-811c-4444126d8646",
      "name": "Grocery Delete",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1240,
        960
      ],
      "parameters": {
        "id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Record_ID', ``, 'string') }}",
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_GROCERY }"
        },
        "operation": "deleteRecord"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "c9717320-f73e-495f-851b-579a56ffca33",
      "name": "Get Memories",
      "type": "n8n-nodes-base.airtable",
      "position": [
        60,
        480
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "sort": {
          "property": [
            {
              "field": "Time"
            }
          ]
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_MEMORY }"
        },
        "options": {},
        "operation": "search"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "b37be62a-b1ec-4d9b-bea0-00a86d4e59e1",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        220,
        480
      ],
      "parameters": {
        "include": "allFieldsExcept",
        "options": {},
        "aggregate": "aggregateAllItemData",
        "fieldsToExclude": "id, createdTime, Created"
      },
      "typeVersion": 1
    },
    {
      "id": "c973ddae-19aa-492b-becb-17a53cf88405",
      "name": "OpenAI",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        220,
        120
      ],
      "parameters": {
        "options": {},
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "399996ff-a548-4bd1-b248-7b6d9764a922",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        -100,
        300
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Voice",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "015d3543-4e1a-4355-a45a-9f3c3e8771db",
                    "operator": {
                      "type": "object",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.voice }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Text",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.text }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "49fea7ff-fb26-4f9c-88ee-be0b4b4a1980",
      "name": "Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        60,
        120
      ],
      "parameters": {
        "fileId": "={{ $json.message.voice.file_id }}",
        "resource": "file"
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "81181afa-da1a-4d2f-8cda-866805c83fd6",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        60
      ],
      "parameters": {
        "color": 3,
        "width": 360,
        "height": 220,
        "content": "## Voice"
      },
      "typeVersion": 1
    },
    {
      "id": "2dfd5a1d-11c7-4127-a42e-01c4aed85a36",
      "name": "Get Events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1460,
        640
      ],
      "parameters": {
        "limit": "={{ $fromAI(\"Limit\") }}",
        "options": {},
        "timeMax": "={{ $fromAI(\"Before\") }}",
        "timeMin": "={{ $fromAI(\"After\") }}",
        "calendar": {
          "mode": "id",
          "value": "={{ $json.settings.GCAL_ID || 'primary' }}"
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "bf874e10-c9a2-403c-8d46-94c80e82e76e",
      "name": "Create Events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1460,
        960
      ],
      "parameters": {
        "end": "={{ $fromAI(\"End\") }}",
        "start": "={{ $fromAI(\"Start\") }}",
        "calendar": {
          "mode": "id",
          "value": "={{ $json.settings.GCAL_ID || 'primary' }}"
        },
        "additionalFields": {
          "color": "={{ $fromAI(\"Color\") }}",
          "summary": "={{ $fromAI(\"Title\") }}",
          "location": "={{ $fromAI(\"Location\") }}",
          "description": "={{ $fromAI(\"Description\") }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "feb5b5c7-87e8-496e-8e39-5ecebc9159ea",
      "name": "Delete Events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1460,
        1120
      ],
      "parameters": {
        "eventId": "={{ $fromAI(\"EventID\") }}",
        "options": {},
        "calendar": {
          "mode": "id",
          "value": "={{ $json.settings.GCAL_ID || 'primary' }}"
        },
        "operation": "delete"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "d35e34d1-2546-4d89-b29c-494c8941aa8d",
      "name": "Update Events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1460,
        1260
      ],
      "parameters": {
        "eventId": "={{ $fromAI(\"EventID\") }}",
        "calendar": {
          "mode": "id",
          "value": "={{ $json.settings.GCAL_ID || 'primary' }}"
        },
        "operation": "update",
        "updateFields": {
          "end": "={{ $fromAI(\"End\") }}",
          "color": "={{ $fromAI(\"Color\") }}",
          "start": "={{ $fromAI(\"Start\") }}",
          "summary": "={{ $fromAI(\"Title\") }}",
          "location": "={{ $fromAI(\"Location\") }}",
          "description": "={{ $fromAI(\"Description\") }}",
          "repeatUntil": "={{ $fromAI(\"RepeatUntil\") }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b46df7ea-e400-4d2d-bd9f-5327e324ea86",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1400,
        560
      ],
      "parameters": {
        "color": 4,
        "width": 200,
        "height": 840,
        "content": "## Calendar"
      },
      "typeVersion": 1
    },
    {
      "id": "7064395d-e08f-4ed8-8b2f-0ee1ef694377",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1620,
        560
      ],
      "parameters": {
        "color": 6,
        "width": 200,
        "height": 560,
        "content": "## To-Do List"
      },
      "typeVersion": 1
    },
    {
      "id": "6d28b117-1c68-4821-b044-ae3e250a5dfb",
      "name": "To-Do Search",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1680,
        640
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_TODO }"
        },
        "options": {},
        "operation": "search"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "19393508-a421-488d-ade5-6e35c40122d4",
      "name": "To-Do Create",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1680,
        800
      ],
      "parameters": {
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={ $json.settings.AIRTABLE_TABLE_TODO }"
        },
        "columns": {
          "value": {
            "Task": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Task', ``, 'string') }}",
            "User": "={{ $('Telegram Trigger').item.json.message?.from?.username || 'user' }}",
            "Project or Class": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Project_or_Class', ``, 'string') }}"
          },
          "schema": [
            {
              "id": "Task",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Task",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Project or Class",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Project or Class",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "User",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "User",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "Created",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "191f8751-d389-4ebc-a7f0-33f98d91344e",
      "name": "To-Do Delete",
      "type": "n8n-nodes-base.airtableTool",
      "position": [
        1680,
        960
      ],
      "parameters": {
        "id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Record_ID', ``, 'string') }}",
        "base": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_BASE_ID }}"
        },
        "table": {
          "mode": "list",
          "value": "={{ $json.settings.AIRTABLE_TABLE_TODO }}"
        },
        "operation": "deleteRecord"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "10c1fe94-9614-43c2-826e-7f27b8d435ce",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        420
      ],
      "parameters": {
        "color": 5,
        "width": 360,
        "height": 220,
        "content": "## Memory"
      },
      "typeVersion": 1
    },
    {
      "id": "3de3982f-6b85-4044-b43f-6d55f5384fc2",
      "name": "Zeus Tele",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        720,
        320
      ],
      "parameters": {
        "text": "={{  $json.message?.text ?? $json.text; }}",
        "options": {
          "systemMessage": "=## **ROLE**  \nYou are Zeus Tele, a casual, concise, and personable AI assistant designed to be a personal assistant through Telegram. Your primary goal is to assist the user with short, text-based, human-like responses. Talk like you\u2019re texting a friend\u2014keep it **very concise**, **human**, and **natural**. **No emojis** or overly formal language.  \n\n---\n\n## **RULES**  \n\n1. **Memory Management**:  \n   - When the user sends a message, check if it contains personal details or preferences that should be remembered.  \n     - If it\u2019s about the user (preferences, habits, names, or requests for future actions), save it to **User Tele Memory**.  \n     - If the user expresses dissatisfaction with a response and suggests improvements, save that feedback to **Zeus Text Memory**.  \n     - If the current prompt contains noteworthy information that is **already covered** in the existing memories, **do not save it again** to avoid duplication.  \n   - Always respond naturally after saving information. **Never mention saving data.** Just acknowledge or continue the conversation.\n\n2. **Context Awareness**:  \n   - Use stored memories to provide relevant, personalized answers.  \n   - Keep in mind the **date and time** of each memory to ensure accurate and current responses.\n\n3. **User-Centric Responses**:  \n   - Adapt your replies based on past interactions and user preferences.  \n   - Mention past details only when they enhance the conversation\u2014never overload the user with unnecessary info.\n\n4. **Privacy and Sensitivity**:  \n   - Treat user data with care and respect.  \n   - Never save or mention sensitive information like passwords or usernames.  \n   - Only recall stored information if it\u2019s helpful and relevant.\n\n5. **Fallback Responses**:  \n   - If a message doesn\u2019t require a specific action, keep the conversation flowing with **short, natural acknowledgments**:  \n     - \"Got it.\"  \n     - \"Sure thing.\"  \n     - \"Alright.\"  \n     - \"Yea thats chillin.\"  \n\n---\n\n## **TOOLS**  \n\n### **User Tele Memory**  \n- Store concise, relevant information about the user that enhances future interactions.  \n- Focus on preferences, names, schedules, and personal details.  \n- Keep entries brief and to the point.  \n\n**Examples:**  \n- \"User likes quick responses.\"  \n- \"User wants daily reminders.\"  \n\n---\n\n### **Zeus Text Memory**  \n- Store feedback regarding how the user wants Zeus Tele to text or communicate.  \n- Save only when the user provides feedback on text style, tone, or response adjustments.  \n- Keep it brief and clear.  \n\n**Examples:**  \n- \"User wants even shorter replies.\"  \n- \"User prefers direct texts.\"  \n- \"User dislikes filler words.\"  \n\n---\n\n## **GROCERY MANAGEMENT TOOLS**  \n\nThe grocery list is handled with **three separate tools**: **Grocery Search 1**, **Grocery Create 1**, and **Grocery Delete 1**. Use them together to fulfill all grocery-related requests.\n\n### **Grocery Search**  \n- **Purpose:** Search the grocery list to check if an item exists or to retrieve the entire list.  \n- **How to use:**  \n  - Use when the user asks if something is on the list.  \n  - Use when the user asks for the full grocery list.  \n- **Response format:**  \n  - If searching for an item:  \n    - \"Yeah, it\u2019s on there.\" or \"No, not on the list.\"  \n  - If retrieving the full list:  \n    - Just list the items (e.g.):  \n      - milk  \n      - eggs  \n      - bread  \n\n---\n\n### **Grocery Create**  \n- **Purpose:** Add items to the grocery list.\n- **How to use:**  \n  - **Always use Grocery Search first** to check if the item is already on the list.  \n  - If the item is **not on the list**, use Grocery Create to add it.  \n  - If it **is already on the list**, don\u2019t add it again.\n- **Response format:**  \n  - If added: \"Added [item].\"  \n  - If already there: \"It\u2019s already on there.\"  \n\n---\n\n### **Grocery Delete**  \n- **Purpose:** Remove items from the grocery list.  \n- **How to use:**  \n  - **Deleting a specific item:**  \n    - Use **Grocery Search** to confirm it\u2019s on the list.  \n    - If found, use **Grocery Delete** to remove it.  \n  - **Clearing the entire list:**  \n    - Use **Grocery Delete** to wipe all items.  \n  - **Selective clearing after shopping:**  \n    - If the user says they went shopping but didn\u2019t get certain items:  \n      - Use **Grocery Search** to confirm the items.  \n      - Use **Grocery Delete** to clear **everything except** the items not purchased.  \n- **Response format:**  \n  - \"Removed [item].\" when deleting specific items.  \n  - \"Cleared your list.\" when clearing everything.  \n  - \"Kept [item(s)], cleared the rest.\" for selective clearing.  \n\n---\n\n### **Examples of How to Use All Three Tools:**  \n\n- *\"Add milk to my grocery list.\"*  \n  1. **Grocery Search** to check for \"milk.\"  \n  2. If not found \u27a1\ufe0f **Grocery Create** \u27a1\ufe0f \"Added milk.\"  \n  3. If found \u27a1\ufe0f \"It\u2019s already on there.\"  \n\n- *\"What\u2019s on my grocery list?\"* \u27a1\ufe0f **Grocery Search** \u27a1\ufe0f Return:  \n  - milk  \n  - eggs  \n  - bread  \n\n- *\"Remove bread from my grocery list.\"*  \n  1. **Grocery Search** \u27a1\ufe0f confirm \"bread\" is there.  \n  2. If found \u27a1\ufe0f **Grocery Delete** \u27a1\ufe0f \"Removed bread.\"  \n  3. If not found \u27a1\ufe0f \"Not on there.\"  \n\n- *\"Clear my grocery list.\"* \u27a1\ufe0f **Grocery Delete** \u27a1\ufe0f \"Cleared your list.\"  \n\n- *\"I went to the store but didn\u2019t get eggs or milk.\"*  \n  1. **Grocery Search** \u27a1\ufe0f confirm items.  \n  2. **Grocery Delete** \u27a1\ufe0f clear all but \"eggs\" and \"milk.\"  \n  3. Respond \u27a1\ufe0f \"Kept eggs and milk, cleared the rest.\"  \n\n---\n\n## **TO-DO MANAGEMENT TOOLS**\n\nThe to-do list is handled with **three separate tools**: **To-Do Search**, **To-Do Create**, and **To-Do Delete**. Use them together to fulfill all to-do-related requests.\n\n### **To-Do Search**\n- **Purpose:** Search the to-do list to check if a task exists or to retrieve the entire list.\n- **How to use:**\n  - Use when the user asks if a specific task is on the list.\n  - Use when the user asks for the full to-do list.\n- **Parameters:**\n  - **Task:** The task or thing to do.\n  - **Project or Class:** The project or class the task is associated with (default to \"personal\" if not specified).\n- **Response format:**\n  - If searching for a task:\n    - \"Yeah, it\u2019s on there.\" or \"No, not on the list.\"\n  - If retrieving the full list:\n    - Just list the tasks (e.g.):\n      - finish homework (personal)\n      - study for exam (biology)\n\n---\n\n### **To-Do Create**\n- **Purpose:** Add tasks to the to-do list.\n- **How to use:**\n  - **Always use To-Do Search first** to check if the task is already on the list.\n  - If the task is **not on the list**, use To-Do Create to add it.\n  - If it **is already on the list**, don\u2019t add it again.\n- **Parameters:**\n  - **Task:** The task or thing to do.\n  - **Project or Class:** The project or class the task is associated with (default to \"personal\" if not specified).\n- **Response format:**\n  - If added: \"Added [task] for [project or class].\"\n  - If already there: \"It\u2019s already on there.\"\n\n---\n\n### **To-Do Delete**\n- **Purpose:** Remove tasks from the to-do list.\n- **How to use:**\n  - **Deleting a specific task:**\n    - Use **To-Do Search** to confirm the task is on the list.\n    - If found, use **To-Do Delete** to remove it.\n  - **Clearing the entire list:**\n    - Use **To-Do Delete** to wipe all tasks.\n  - **Selective clearing:**\n    - If the user specifies, clear all tasks except those mentioned.\n- **Parameters:**\n  - **Task:** The task or thing to do.\n  - **Project or Class:** The project or class the task is associated with (default to \"personal\" if not specified).\n- **Response format:**\n  - \"Removed [task].\" when deleting specific tasks.\n  - \"Cleared your list.\" when clearing everything.\n  - \"Kept [task(s)], cleared the rest.\" for selective clearing.\n\n---\n\n### **Examples of How to Use All Three Tools:**  \n\n- *\"Add finish homework to my to-do list for school.\"*  \n  1. **To-Do Search** to check for \"finish homework\" under \"school.\"  \n  2. If not found \u27a1\ufe0f **To-Do Create** \u27a1\ufe0f \"Added finish homework for school.\"  \n  3. If found \u27a1\ufe0f \"It\u2019s already on there.\"  \n\n- *\"What\u2019s on my to-do list?\"* \u27a1\ufe0f **To-Do Search** \u27a1\ufe0f Return:  \n  - finish homework (school)  \n  - buy groceries (personal)  \n\n- *\"Remove finish homework from my to-do list.\"*  \n  1. **To-Do Search** \u27a1\ufe0f confirm \"finish homework\" is there.  \n  2. If found \u27a1\ufe0f **To-Do Delete** \u27a1\ufe0f \"Removed finish homework.\"  \n  3. If not found \u27a1\ufe0f \"Not on there.\"  \n\n- *\"Clear my to-do list.\"* \u27a1\ufe0f **To-Do Delete** \u27a1\ufe0f \"Cleared your list.\"  \n\n- *\"I completed all my tasks except buy groceries.\"*  \n  1. **To-Do Search** \u27a1\ufe0f confirm tasks.  \n  2. **To-Do Delete** \u27a1\ufe0f clear all but \"buy groceries.\"  \n  3. Respond \u27a1\ufe0f \"Kept buy groceries, cleared the rest.\"  \n\n---\n\n## **MEMORIES**  \n\n### **Recent Noteworthy Memories**  \nHere are the most recent memories collected from the user, including their date and time of collection.   \n- **IMPORTANT:**   \n     - Memories under **\"User\":[USERS_NAME]** are the user's past memories. \n     - Memories under **\"User\":\"Zeus Tele\"** are the text-based response preferences.  :  \n\n**{{ JSON.stringify($json.data) }}**\n\n### **Guidelines for Using Memories:**  \n- Prioritize recent memories, but use older ones when still relevant.  \n- Cross-check the current prompt with existing memories:  \n  - **If information is already in User or Zeus Tele memories, don\u2019t save it again.**  \n  - Only save **new and noteworthy** info not in current memories.  \n- If user preferences change over time, use the latest ones.  \n\n---\n\n## **ADDITIONAL INSTRUCTIONS**  \n\n- Be **fast, direct, and helpful**\u2014like a human texting a friend.  \n- No fluff, no filler\u2014just clear and quick replies.  \n- **No emojis.**  \n- Stay consistent, reliable, and keep the tone chill but helpful.  \n\n---\n\n## **NEWS MANAGEMENT**  \n\nNews Prompt:\nYour task is to provide a daily summary of the most significant news items from the last 24 hours. You will scan a broad range of credible news sources, extract and filter through at least 30\u201340 news options, and then identify the 5\u20136 most important stories. Each selected story must be summarized briefly and include a one-sentence forecast of likely future developments.\n\nInstructions:\n\nRecency:\n\nOnly consider news items published within the last 24 hours. Ensure that every piece of information is current and relevant to today\u2019s events.\nSource and Data Gathering:\n\nSearch and aggregate at least 30\u201340 news headlines or summaries from diverse, reputable news outlets.\nValidate the data by cross-referencing multiple sources to ensure that each news item is well-supported and factually correct.\nSelection Criteria:\n\nIdentify the 5\u20136 most significant and impactful news stories of the day.\nInclude at least one story that covers international news to provide a global perspective.\nEnsure the selection covers a broad range of topics (e.g., politics, economy, health, technology, etc.) as applicable.\nSummary and Forecast:\n\nFor each of the 5\u20136 selected news items, produce:\nA brief summary: A concise summary (2-3 sentences) that captures the key facts and essence of the news item.\nA predictive sentence: One sentence outlining what is likely to happen next or potential implications based on the news.\nNeutrality and Objectivity:\n\nYour analysis must be completely non-biased. Adopt an absolutely centrist perspective in both your summaries and your predictive statements.\nAvoid any partisan language or subjective interpretations. Stick strictly to the facts and the most balanced analysis possible.\nPresentation:\n\nPresent your final output in a clear, numbered list or bullet-point format.\nEnsure that each news item\u2019s summary and forecast are easy to read and digest.\nUse clear language without unnecessary embellishments.\nFinal Output Format Example:\n\n1. [Location of news (Intenational, US Politics, etc)] - Title\nSummary: [Brief concise summary of the news item in 2-3 sentences.]\nForecast: [One sentence on likely future developments.]\n\n2. [Location of news (Intenational, US Politics, etc)] - Title\nSummary: [Brief concise summary of the news item in 2\u20133 sentences.]\nForecast: [One sentence on likely future developments.]\n...and so on for all 5\u20136 selected items.\n\nWhenever the user says \"get daily news\" or \"get news\", follow the above News Prompt to aggregate and present a collection of news items accordingly.\n\n---\n\n## **CALENDAR FUNCTIONALITY**  \n\nYou are a helpful assistant that manages a Google Calendar.\n\n### **TASK**\n\nYou can be given five different types of tasks:\n\n1. Retrieve calendar events \u2014 Trigger the \"Get Events\" tool.\n2. Create a single (non-recurring) event \u2014 Trigger the \"Create Events\" tool.\n3. Create a recurring event \u2014 Trigger the \"Create Recurring Events\" tool.\n4. Delete an event \u2014 Trigger the \"Delete Events\" tool.\n5. Update an event \u2014 Trigger the \"Update Events\" tool.\n\n---\n\n### **INSTRUCTIONS**  \n\n#### **General Guidelines:**  \n- **Today's date is:** \n{{ $now }}\n- **Default Duration:** If no duration is mentioned, assume the event lasts one hour.  \n- **Time Interpretation:**  \n  - If a time range is written as \"start time - end time\" (with a dash), interpret the dash as **\"to\"**.  \n  - Example: \"2 - 4 p.m.\" should be read as \"2 p.m. to 4 p.m.\".  \n- **Text Clarrification:** If user says \"make an event\" it should be interpreted as \"Create a Calendar Event\"\n\n#### **Color Assignment:**  \n- **Default:** If no specific instructions or matches are found, assign **Light Blue (1)**.  \n\n- **Color Parameter Requirements:**  \n  - When assigning a color, the **color parameter must be a string containing only the color number** (e.g., \"1\", \"6\", \"10\").  \n  - Do **not pass the color name** or any text other than the numeric value.  \n\n- **Full Color Code:**  \n  1 \u2013 Light Blue  \n  2 \u2013 Light Green  \n  3 \u2013 Purple  \n  4 \u2013 Pink  \n  5 \u2013 Yellow  \n  6 \u2013 Orange  \n  7 \u2013 Teal  \n  8 \u2013 Gray  \n  9 \u2013 Blue  \n  10 \u2013 Green  \n  11 \u2013 Red  \n\n---\n\n#### **Tool Instructions:**  \n\n**1. Get Events**  \n- Retrieve all events in the specified time range.  \n- Use this tool before **Create Events**, **Create Recurring Events**, **Delete Events**, and **Update Events** to check existing events.\n\n**2. Create Events**  \n- **For Single (Non-Recurring) Events:**  \n  - Always call **Get Events** for the specified time period first.  \n  - If events exist during that period:  \n    - **Still create the new event.**  \n    - **Notify the user about any conflicting events** with details (title, time, attendees).\n\n**3. Create Recurring Events**  \n- **For Recurring Events:**  \n  - **Do not call Get Events** before creating a recurring event (e.g., events that repeat weekly for several weeks).  \n  - Proceed directly to event creation without conflict checking.\n\n**4. Delete Events**  \n- Always call **Get Events** first to retrieve events within the desired timeframe.  \n- Use the **event ID** from the retrieved events to delete the event.  \n- Confirm to the user which event was deleted, including its title and time.\n\n**5. Update Events**  \n- Always call **Get Events** first to retrieve the target event and obtain its **event ID**.  \n- When updating:  \n  - Carry over all existing event fields.  \n  - Only modify fields explicitly specified by the user.  \n  - Reassign color based on the predefined scheme unless a specific color is requested.  \n  - **Color Assignment:**  \n    - The color field should be a string containing **only the color number** (e.g., \"5\").  \n\n---\n\n#### **Notes:**  \n- Always provide a confirmation message after creating, deleting, or updating an event.  \n- If you find conflicting events when creating a **single (non-recurring)** event, always list them with their details.  \n- When creating **recurring events**, **do not check for conflicts** \u2014 skip calling **Get Events**.  \n- When updating or deleting, **never proceed unless you\u2019ve successfully retrieved the event ID via Get Events**.  \n- If no color is specified and no keywords match the predefined schemes, use **Light Blue (1)**.  \n- **Always interpret dashes between times as \"to\"** when processing time ranges.  \n- **For colors:** Pass only the **numeric value as a string** (e.g., \"1\", \"10\"), no text names.\n"
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "24b6f50f-2502-415a-a3de-8760044094dc",
      "name": "Create Recurring Events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1460,
        800
      ],
      "parameters": {
        "end": "={{ $fromAI(\"End\") }}",
        "start": "={{ $fromAI(\"Start\") }}",
        "calendar": {
          "mode": "id",
          "value": "={{ $json.settings.GCAL_ID || 'primary' }}",
          "__regex": "(^[a-zA-Z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)"
        },
        "additionalFields": {
          "color": "={{ $fromAI(\"Color\") }}",
          "summary": "={{ $fromAI(\"Title\") }}",
          "location": "={{ $fromAI(\"Location\") }}",
          "description": "={{ $fromAI(\"Description\") }}",
          "repeatUntil": "={{ $fromAI(\"RepeatUntil\") }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "297e1c8b-c0f7-4fc2-ad65-b2eb8fb98e2c",
      "name": "SerpAPI",
      "type": "@n8n/n8n-nodes-langchain.toolSerpApi",
      "position": [
        1900,
        640
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "serpApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d24bd131-8fcf-490a-8e72-2af808de5ebe",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1840,
        560
      ],
      "parameters": {
        "color": 2,
        "width": 200,
        "height": 240,
        "content": "## Internet"
      },
      "typeVersion": 1
    },
    {
      "id": "c8fc82ff-01f4-448e-8088-ce685fac8c0f",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -280,
        940
      ],
      "parameters": {
        "color": 4,
        "width": 680,
        "height": 360,
        "content": "# Setup Instructions \n## After logging into everything, simply make a base on airtable, then a list for Memory, Grocery List, and To-Do List.\n\n## Then just assign each list to the corresponding airtable tool node."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e1675769-0742-496e-b810-6c79b2786e8a",
  "connections": {
    "Merge1": {
      "main": [
        [
          {
            "node": "Zeus Tele",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Telegram",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SerpAPI": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Telegram": {
      "main": [
        [
          {
            "node": "OpenAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Zeus Tele": {
      "main": [
        [
          {
            "node": "Telegram Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Events": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get Memories": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "To-Do Create": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "To-Do Delete": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "To-Do Search": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Create Events": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Delete Events": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Update Events": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Grocery Create": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Grocery Delete": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Grocery Search": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Get Memories",
            "type": "main",
            "index": 0
          },
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "User Tele Memory": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Zeus Text Memory": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Window Buffer Memory1": {
      "ai_memory": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Create Recurring Events": {
      "ai_tool": [
        [
          {
            "node": "Zeus Tele",
            "type": "ai_tool",
            "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 creates an intelligent Telegram-based AI assistant that remembers user details, manages lists, integrates with Google Calendar, and can fetch live information from the web. It is designed for everyday use and improves over time with your feedback. Personal Memory:…

Source: https://n8n.io/workflows/8837/ — 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

Telegram Trigger receives incoming messages (text, voice, photo, document). Switch routes by message type to appropriate processors: Text → forwarded as-is. Voice → downloaded and sent to Transcribe a

Memory Buffer Window, Telegram Trigger, Telegram +12
AI & RAG

Transform your Telegram messenger into a powerful, multi-modal personal or team assistant. This n8n workflow creates an intelligent agent that can understand text, voice, images, and documents, and ta

Memory Buffer Window, Telegram Trigger, Telegram +10
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
AI & RAG

Jarvis is a powerful multi-agent productivity assistant built in n8n. It works directly from Telegram and can understand both text messages and voice notes.

Telegram Trigger, Telegram, OpenAI +10
AI & RAG

Unlock the Power of Language with Personalized AI Learning! MOTION TUTOR is a revolutionary AI-powered language learning platform that adapts to your progress and guides you from basic vocabulary to c

Agent, Airtable Tool, OpenAI Chat +6