{
  "nodes": [
    {
      "id": "5c259a9b-75bc-4873-bbc2-34a913c46e21",
      "name": "Start: Receive Message on Telegram",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -368,
        848
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "30a57d49-8269-48ac-ac31-7873341c3afa",
      "name": "Route by Input Type",
      "type": "n8n-nodes-base.switch",
      "position": [
        80,
        816
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Vocabulary",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "71a70192-b1c2-44fc-9e0b-cad9cc5eaac4",
                    "operator": {
                      "type": "string",
                      "operation": "startsWith"
                    },
                    "leftValue": "={{ $('Start: Receive Message on Telegram').item.json.message.text }}",
                    "rightValue": "#vocabulary"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Grammar",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "1b5b1c7e-99e9-4e6d-a050-2d3c1c22c236",
                    "operator": {
                      "type": "string",
                      "operation": "startsWith"
                    },
                    "leftValue": "={{ $('Start: Receive Message on Telegram').item.json.message.text }}",
                    "rightValue": "#grammar"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Quiz",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "a9ad78e2-623b-4d1b-b0b8-bdaebf8bd71c",
                    "operator": {
                      "type": "string",
                      "operation": "startsWith"
                    },
                    "leftValue": "={{ $('Start: Receive Message on Telegram').item.json.message.text }}",
                    "rightValue": "#quiz"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Any other",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "6f3a36ca-2348-4573-bbd7-4aa8088ec296",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $('Start: Receive Message on Telegram').item.json.message.text }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "notesInFlow": false,
      "typeVersion": 3.2
    },
    {
      "id": "9f15049b-d560-4d93-b71c-f378ddb76abc",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 572,
        "height": 356,
        "content": "## \ud83d\udcd6 Getting Started in 4 Steps\n\n1) \ud83d\udd10 **Set Up Access**\nTelegram: Insert the bot token (created in BotFather) inside the Telegram Trigger and Telegram nodes.\nAI/ML API: Enter your API key in the AI/ML account credentials section.\n2) \u25b6\ufe0f **Turn On Your Workflow**\nUse the Active switch in the top bar of the editor.\n3) \ud83d\udcac **Chat via Telegram**\nUse tags like #vocabulary, #grammar, or #quiz to choose a mode.\nSend plain text without tags for a general supportive answer.\n4) \u23f3 **See the Bot in Action**\nA \u201ctyping\u2026\u201d status will appear thanks to the Show Typing Indicator node."
      },
      "typeVersion": 1
    },
    {
      "id": "acfa62af-19ff-42a9-8b27-c59b46a6937d",
      "name": "Main prompt for all other messages",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        1104
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"prompt\": \"You are an AI Russian language tutor. The user can choose a mode using hashtags: #vocabulary, #grammar, #quiz. Adapt your response format depending on the mode. The user decides how many items (words, rules, or questions) they want. Your task is to structure the response in the correct style, not to set limits. Always explain clearly in English with Russian examples. Always give feedback and encouragement in Russian at the end. Modes: #vocabulary \u2014 teach the requested number of words with pronunciation, examples, and a task. #grammar \u2014 explain the requested grammar topic with examples and practice. #quiz \u2014 create exactly the number of quiz questions requested, formatted properly, then give answers and feedback. If no hashtag is provided, ask the student to choose a mode. create good looking formatting for telegram. use ** for bold text, instead ###.\"\n}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "eececf03-0441-47a3-b5ed-fba1bef88d0f",
      "name": "Generate personalised answer",
      "type": "n8n-nodes-aimlapi.aimlApi",
      "position": [
        688,
        848
      ],
      "parameters": {
        "model": "openai/gpt-4o",
        "prompt": "={{ $json.prompt }}\n\nMessage:\n{{ $('Start: Receive Message on Telegram').item.json.message.text }}",
        "options": {},
        "requestOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "7c387949-7b74-47fc-9150-c65e464283f2",
      "name": "Send message to Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        912,
        848
      ],
      "parameters": {
        "text": "={{ $json.content }}",
        "chatId": "={{ $('Start: Receive Message on Telegram').item.json.message.chat.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2a17ec7d-31bf-4508-8302-39751e8059b1",
      "name": "Show Typing Indicator",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -144,
        848
      ],
      "parameters": {
        "chatId": "={{ $('Start: Receive Message on Telegram').item.json.message.chat.id }}",
        "operation": "sendChatAction"
      },
      "typeVersion": 1.2
    },
    {
      "id": "a4c67a53-9300-429f-a81c-a7c9c6a0c901",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        688
      ],
      "parameters": {
        "height": 368,
        "content": "### Checks message.text for #vocabulary, #grammar, #quiz, or falls back"
      },
      "typeVersion": 1
    },
    {
      "id": "b32afd82-8c14-46f1-a028-ce6b6d69c7d7",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -144
      ],
      "parameters": {
        "color": 4,
        "width": 368,
        "height": 352,
        "content": "## \ud83d\udd0d Node Overview\n\n- **Telegram Trigger**: Listens for incoming messages.  \n- **Show Typing Indicator**: Immediately shows \u201ctyping\u2026\u201d in chat.  \n- **Route by Input Type (Switch)**: Detects your tag and routes to the right prompt.  \n- **Vocabulary/Grammar/Quiz/Main Prompt**: Builds the JSON payload for the AI/ML API.  \n- **Send message to Telegram**: Delivers the AI\u2019s reply back into your chat.  "
      },
      "typeVersion": 1
    },
    {
      "id": "9024416b-fdee-49d0-95f9-098cc08b12da",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        560
      ],
      "parameters": {
        "width": 288,
        "height": 720,
        "content": "## Chooses from given prompts"
      },
      "typeVersion": 1
    },
    {
      "id": "1971bb3f-fe43-4244-915e-825b254a9a8d",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        752
      ],
      "parameters": {
        "color": 5,
        "width": 384,
        "height": 272,
        "content": "## Generates and sends answer to Telegram"
      },
      "typeVersion": 1
    },
    {
      "id": "c696bb62-4e7d-454d-b2a9-c0684127b7ac",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        224
      ],
      "parameters": {
        "color": 6,
        "width": 960,
        "height": 272,
        "content": "## \ud83d\udfe1 **Example:**\n\n**Input:**\n   ```\n\"#vocabulary \u043a\u0443\u043a\u0443\u0440\u0443\u0437\u0430\"\n   ```\n**Output:**\n   ```\n\u041a\u0443\u043a\u0443\u0440\u0443\u0437\u0430 (Kukur\u00faza) - Corn Pronunciation: koo-koo-ROO-zah  \nSentence: \u042f \u043b\u044e\u0431\u043b\u044e \u0435\u0441\u0442\u044c \u043a\u0443\u043a\u0443\u0440\u0443\u0437\u0443 \u043d\u0430 \u0433\u0440\u0438\u043b\u0435. I love eating grilled corn...\n   ```"
      },
      "typeVersion": 1
    },
    {
      "id": "6983ce9e-0209-4928-9884-c9ed3c2c5dc7",
      "name": "Vocabulary prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        656
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"prompt\": \"You are a Russian language tutor focused on expanding the student's vocabulary. The student will specify how many words they want to learn. Provide exactly that number of Russian words with English translations. Show pronunciation in Latin transcription. Use each word in a simple Russian sentence with English translation. At the end, give a small interactive task where the student can practice using some of the new words. create good looking formatting for telegram. use ** for bold text, instead ###. #vocabulary\"\n}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "0934b8df-9b9c-41d9-8a86-88b252fc7c73",
      "name": "Grammar prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        800
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"prompt\": \"You are a Russian grammar tutor. The student may ask about a specific grammar rule or request an explanation of a topic. Provide a clear explanation in English with Russian examples. Adjust the depth and number of examples based on the student's request. Ask the student to practice by forming their own sentences. Provide gentle corrections and explanations. create good looking formatting for telegram.  use ** for bold text, instead ###. #grammar\"\n}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "a6c5ca38-12d4-4dfa-b002-30ffe4af8123",
      "name": "Quiz prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        960
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"prompt\": \"You are a Russian language tutor creating quizzes or exercises. The student decides how many questions they want. Format all tasks in a quiz-friendly style (multiple-choice, translation, or fill-in-the-blank). After the student answers, provide correct solutions and short explanations. End with positive feedback in Russian. create good looking formatting for telegram.  use ** for bold text, instead ###.#quiz\"\n}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "46003c53-9ef7-4b53-88c2-06bce360209b",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        768
      ],
      "parameters": {
        "color": 4,
        "width": 384,
        "height": 272,
        "content": "### Checks for messages and emulates typing"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Quiz prompt": {
      "main": [
        [
          {
            "node": "Generate personalised answer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grammar prompt": {
      "main": [
        [
          {
            "node": "Generate personalised answer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Vocabulary prompt": {
      "main": [
        [
          {
            "node": "Generate personalised answer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Input Type": {
      "main": [
        [
          {
            "node": "Vocabulary prompt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Grammar prompt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Quiz prompt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Main prompt for all other messages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Show Typing Indicator": {
      "main": [
        [
          {
            "node": "Route by Input Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate personalised answer": {
      "main": [
        [
          {
            "node": "Send message to Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Main prompt for all other messages": {
      "main": [
        [
          {
            "node": "Generate personalised answer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start: Receive Message on Telegram": {
      "main": [
        [
          {
            "node": "Show Typing Indicator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}