Обсудить задачу

DikLabГайдыn8n

Гайд · n8n · боты

Telegram-бот с ИИ на n8n: восемь узлов, где модель, где память, где обработка ошибок

12 минn8nботы

Бот с нейросетью в n8n — это не один «умный» узел, а восемь обычных: триггер, разбор сообщения, команды, «печатает…», агент с моделью, память, инструменты и отправка. Плюс отдельный сценарий для ошибок. Разбираю учебный бот по образцу своих живых.

Поставить это мне

Содержание

В чём фокус

Бот с нейросетью в n8n — это не один «умный» узел, а восемь обычных. Так собраны три живых бота, которые я собирал: консультант для сотрудников на девять узлов и два больших, на 137 и 145. Скелет у всех один, разное только то, что на него навешано. Ниже учебный бот по этому скелету: что за узел, зачем он и что в нём настроить. Промптов и готового файла сценария здесь нет, есть порядок.

Сначала без модели

Не каждому боту нужна нейросеть. Один мой бот собран из десяти узлов, и модели среди них нет. Telegram Trigger принимает сообщение, узел Code приводит его к одному виду, Switch смотрит, что пришло, и отправляет одно из шести готовых сообщений: на /start, на четыре кодовых слова и запасное на всё остальное. Параллельно каждое обращение ложится строкой в Google Таблицу.

Пока ответы известны заранее, хватает Switch: денег на модель он не тратит и на один вопрос всегда отвечает одинаково. Модель нужна, когда человек пишет своими словами, а ответ надо найти или собрать из данных. Отсюда начинается всё, что ниже. Если пока непонятно, какой из двух случаев ваш, начните с трёх вопросов до заказа бота.

Что понадобится

  • n8n в облаке или на своём сервере. Как поставить на Beget — отдельный гайд
  • Бот от @BotFather: команда /newbot, имя, затем username от 5 до 32 знаков (латиница, цифры, подчёркивание) с bot на конце. Токен вставляется в n8n в доступ Telegram, поле Access Token
  • Второй бот для тестов, тем же путём. Telegram держит один вебхук на бота, и тестовый адрес n8n перебивает боевой
  • Ключ модели в доступах (credentials) n8n, а не в поле узла. Переменные окружения из узлов на моём сервере закрыты по умолчанию
  • Таблица или документ, откуда бот берёт ответы. Из них получится первый инструмент

Права боту давайте только на то, что ему нужно, — шесть проверок есть в статье про доступы.

Восемь узлов учебного бота

  1. Триггер — Telegram Trigger

    Запускает сценарий на каждое событие в боте. В Trigger On выберите Message, а если в боте будут кнопки — ещё Callback Query. Вариант * берёт всё, кроме Chat Member и реакций, и лишнее потом придётся отсеивать. На время теста включите Restrict to User IDs со своим id: бот будет реагировать только на вас. Нужны фото от людей — опция Download Images/Files.

  2. Разбор сообщения — Code

    Из того, что прислал Telegram, соберите одну запись: текст, id пользователя, id чата и тип — текст, голос или нажатая кнопка. Дальше все узлы читают её, а не сырое сообщение. Голос — необязательный подшаг: IF «это голосовое?» → Telegram, Get File → расшифровка через OpenAI (у меня Whisper) → текст в ту же запись. Так сделано в обоих моих больших ботах, у консультанта голоса нет.

  3. Команды — Switch

    Режим Rules: на каждое правило свой выход. /start, /help и всё, на что ответ известен заранее, уходит прямо в отправку и до модели не доходит. У моего ассистента так разведены справка, дела на сегодня, подписка и пауза: текст сначала проходит простые правила и только потом попадает к модели. Правило одно: всё фиксированное — мимо модели.

  4. «Печатает…» — Telegram, Send Chat Action

    Действие Typing, ставится до долгой работы. Модель думает секунды, и без статуса человек видит тишину. По Bot API статус держится до пяти секунд или до первого сообщения бота, так что на долгом ответе он погаснет раньше. У бота питания такой узел стоит в начале цепочки.

  5. Агент — AI Agent с моделью

    Агент получает текст и сам решает, ответить сразу или вызвать инструмент. По документации к нему подключаются модель и хотя бы один инструмент. Модель — подузел OpenAI Chat Model или другого поставщика. В его опциях есть Timeout: у меня по умолчанию стояла минута, модель с рассуждением под утренней нагрузкой не успевала, и я поднял до 120 секунд. Повторы не добавляйте — подробно в гайде про молчаливые падения. В системном промпте — что бот знает, откуда берёт факты, когда зовёт инструмент и когда отвечает «не знаю». У консультанта таблица товаров оказалась неполной, и агент отвечал по ней про наличие. После живого теста правило поменял: наличие — только из инструмента остатков, таблица — для описаний.

  6. Память — Simple Memory

    Подузел агента; в выгрузке моего n8n его тип memoryBufferWindow. Session Key — id пользователя Telegram из from.id, иначе разговоры разных людей лягут в одну память. Context Window Length — сколько прошлых обменов помнить, у консультанта 10. Проверка простая: задайте вопрос, а потом уточнение, не называя предмет. На живом тесте консультанта короткое уточнение без названия предмета поняли правильно.

  7. Инструменты — Call n8n Workflow Tool

    Каждый инструмент — отдельный сценарий: «остатки», «заказы», «база знаний». В поле Description напишите, когда агенту его звать: по этому тексту он и выбирает. Сценарий-инструмент должен быть опубликован. Иначе вызов вернёт агенту ошибку как обычный результат, агент перескажет её словами вроде «не удалось получить данные», и это легко пропустить. У консультанта два таких инструмента. Проверку инструмента «база знаний» я разбирал в гайде про бота, который врёт.

  8. Отправка — Telegram, Send Message

    Append n8n Attribution — Off. По умолчанию n8n дописывает в конец каждого сообщения «This message was sent automatically with n8n», и у меня пользователь пожаловался на это на первом же тесте. Parse Mode по умолчанию HTML. Текст — до 4096 символов после разбора разметки, длиннее Telegram не примет. Списки из данных человека выводите с потолком на каждую секцию и хвостом «…и ещё N», а общую обрезку делайте по границе строки: разорванный тег даёт ту же ошибку. На этом узле On Error — continue: сбой последней отправки не должен ронять прогон.

Где живёт память

Схем у меня две. У консультанта память — подузел Simple Memory, ключ — id пользователя, окно в десять обменов. Ничего, кроме этого подузла, заводить не нужно.

У ассистента подузла памяти нет вовсе. Сообщение человека сохраняется в базу отдельным узлом до агента, ответ модели — после, а на входе история подгружается из базы. Узлов больше, зато историю видно обычными строками: её можно открыть, прочитать и удалить.

С Simple Memory проще начать. Одно ограничение из документации: если n8n работает в режиме очереди (queue mode), в боевом сценарии этот подузел не работает.

Обработчик ошибок — отдельным сценарием

Это второй сценарий рядом с ботом: Error Trigger → сообщение себе в Telegram. В настройках сценария бота, Settings → Error workflow, выберите его. Один обработчик подходит для всех сценариев: назначьте его в каждом.

Включите его. Документация n8n на 14.10.2026 пишет, что сценарий с Error Trigger публиковать не обязательно. У меня 01.06.2026 на своём сервере выключенный обработчик пропустил три падения тестового сценария и заработал только после включения.

Ручной запуск его не вызывает — так и в документации. Проверяйте на сценарии, который запускается сам: например, временный по расписанию с узлом Stop And Error, который роняет прогон нарочно.

У ассистента между триггером и сообщением стоят ещё два шага: «не чаще заданного интервала» с журналом уведомлений в базе и отсев шумных ошибок. Это на потом, первому боту хватит двух узлов.

Схема целиком

Так агент с подузлами выглядит на холсте n8n: сверху основной узел, снизу то, что к нему подключено.

Схема из документации n8n: узел чата соединён с узлом Agent, к агенту снизу подключены подузлы OpenAI Chat Model и Window Buffer Memory, свободны гнёзда Tool и Output Parser.
Иллюстрация из документации n8n, страница Sub-nodes, на 14.10.2026. Память здесь подписана старым именем Window Buffer Memory, на странице этого узла он называется Simple Memory

А это весь учебный бот текстом.

Схема · учебный бот
СЦЕНАРИЙ БОТА
1. Telegram Trigger
   Message, Callback Query
2. Разбор сообщения (Code)
   голос: IF → файл → расшифровка
3. Команды (Switch)
   ответ известен → сразу в п. 8
   остальное → в п. 4
4. «Печатает…» (Send Chat Action)
5. AI Agent + Chat Model
   Timeout больше минуты
   к агенту снизу: п. 6 и п. 7
6. Simple Memory
   ключ = id пользователя
7. Call n8n Workflow Tool
   подсценарии, опубликованы
8. Отправка (Send Message)
   без подписи n8n, до 4096,
   On Error: continue

ОТДЕЛЬНЫЙ СЦЕНАРИЙ, ВКЛЮЧЁН
Error Trigger → сообщение оператору

Узел → зачем → что настроить

Девять строк: восемь узлов бота и обработчик ошибок
УзелТип в n8nЧто настроитьЧем ловится ошибка
ТриггерTelegram TriggerMessage, Callback Query; на тест Restrict to User IDsВторой бот для тестов: вебхук у бота один
Разбор сообщенияCodeОдна запись: текст, id, типВывод узла: пустой текст — сломан разбор
КомандыSwitch, режим RulesПравило на каждую командуЗапасной ответ на всё неузнанное
«Печатает…»Telegram, Send Chat ActionTyping до долгой работыСтатус живёт до пяти секунд — это нормально
АгентAI Agent + Chat ModelПромпт с «не знаю», Timeout больше минуты«Request timed out» — поднять таймаут, а не повторы
ПамятьSimple MemorySession Key = id пользователя, окно около 10Уточнение без предмета
ИнструментыCall n8n Workflow ToolDescription: когда зватьПодсценарий не опубликован — ошибка уходит агенту в ответ
ОтправкаTelegram, Send MessageAttribution Off, потолок 4096, On Error: continue«message is too long» на длинном списке
ОбработчикError Trigger, отдельный сценарийНазначить в Settings, включитьПадение прогона, запущенного не руками

Как у меня

Числа узлов — из выгрузки моего n8n на 14.10.2026.

Консультант для сотрудников розничного бренда — 9 узлов. Триггер, чтение таблицы товаров, узел Code склеивает её в текст и отдаёт агенту. К агенту подключены модель, Simple Memory на десять обменов и два инструмента — отдельные сценарии остатков и заказов. Дальше одна отправка.

Мой ассистент — 145 узлов. Голос расшифровывается, команды разводит Switch, история лежит в базе. Свободный текст сначала получает агент-классификатор, затем Switch отправляет его к одному из семи агентов по темам, и у каждого своя модель и свой инструмент-исполнитель — отдельный сценарий. Ошибки уходят в отдельный сценарий на семь рабочих узлов с ограничением частоты. Подробный разбор — в кейсе ассистента.

Мой бот питания — 137 узлов. Голос проходит расшифровку раньше всего остального, перед долгим ответом стоит «печатает…». Три агента: еда, готовка и знакомство с новым пользователем. Фото уходит в модель отдельным HTTP-запросом, мимо агента. Отказ и запасной ответ — отдельные узлы отправки. Напоминания — отдельный сценарий на семь узлов, по расписанию каждые 15 минут.

Модели по моим записям: у консультанта и ассистента — gpt-5-mini (июнь 2026), у бота питания — DeepSeek (сентябрь 2026). Голос в обоих больших ботах расшифровывает Whisper от OpenAI.

Чтобы не споткнуться

Текст пропал по дороге.

Узел сохранения в базу отдаёт дальше свою запись, и $json после него — уже строка базы, а не сообщение. У меня классификатор читал пустой текст и всё отправлял в одну тему. Берите текст из триггера по имени: $('Telegram Trigger').first().json.message.text.

«check your credentials» при живом токене.

Так n8n показывает ответ Telegram 403 Forbidden: bot was blocked by the user: человек заблокировал бота. Отключайте рассылку такому пользователю по тексту ошибки (blocked by the user, user is deactivated, bot was kicked, chat not found), а не по любому 403. Иначе при настоящей проблеме с токеном рассылка выключится у всех разом.

«query is too old» на нажатии кнопки.

Ответ на кнопку опоздал: по моим наблюдениям Telegram ждёт его около 15 секунд. Причины встречал три — старая кнопка, медленная цепочка до ответа и задержка доставки апдейта самим Telegram. Это не поломка: на узле ответа кнопке ставьте On Error — continue. Исключение — ответ на pre-checkout платежа, там сбой должен прийти вам.

Удалить сообщение бота можно только 48 часов.

Это ограничение Bot API. Для старых сообщений запасной путь — снять с них кнопки.

Подпись n8n в каждом сообщении.

Append n8n Attribution включена по умолчанию на каждом узле отправки. Выключать нужно на всех, а не на одном.

Тестовый запуск сломал боевого бота.

У бота один вебхук. Нажали тест в n8n — Telegram шлёт сообщения на тестовый адрес, и боевой сценарий их больше не получает. Документация n8n советует отдельного бота для тестов.

Проверить бота запросом со своей машины.

n8n подписывает вебхук секретом, и чужой запрос получает 403. Подделать сообщение снаружи не выйдет — пишите боту сами, с телефона.

Реплики бота одной фразой и в мужском роде.

«Выполнено?» вместо «Сделал?», а на повторяющиеся уведомления — несколько вариантов вперемешку. И тестируйте теми фразами, какими пишут живые люди, а не «тест 1».

Перед включением

Чек-лист · перед включением бота
[ ] второй бот для тестов заведён
[ ] ключ модели лежит в credentials n8n, не в поле узла
[ ] Timeout у модели больше минуты
[ ] Append n8n Attribution выключен на всех узлах отправки
[ ] у списков потолок, общий текст не длиннее 4096 символов
[ ] On Error: continue на отправке и на ответе кнопкам
[ ] сценарии-инструменты опубликованы
[ ] память: Session Key = id пользователя Telegram
[ ] системный промпт говорит, когда отвечать «не знаю»
[ ] обработчик ошибок назначен, включён и прислал тестовую ошибку
[ ] тест реальными фразами людей, не «тест 1»

Частые вопросы

Какую модель брать?
У меня в разных ботах разные, перечислил выше. Принцип — недорогая модель на рутину: классифицировать и ответить по данным. Подробнее — какой ИИ под какую задачу.
Обязательно ли голос?
Нет. Это отдельный подшаг в разборе сообщения. В двух ботах из трёх он есть, у консультанта нет.
Можно без памяти?
Можно, но тогда каждое сообщение для бота первое. Уточняющие вопросы из двух слов, которые опираются на прошлую реплику, перестанут работать.
Что такое агент, память и инструмент, если коротко?
По строке на каждое слово — в словаре из 24 слов про ИИ.
Сколько это стоит?
Из чего складываются расходы на ИИ-продукт — в отдельной статье. А что бот не возьмёт на себя при любом бюджете — здесь.

Источники

  1. docs.n8n.io — Telegram TriggerСобытия, опции Restrict to User IDs и Download Images/Files. Сверено 14.10.2026
  2. docs.n8n.io — Telegram Trigger, common issuesОдин вебхук на бота, отдельный бот для тестов. Сверено 14.10.2026
  3. docs.n8n.io — Telegram credentialsBotFather, /newbot, правила username, поле Access Token. Сверено 14.10.2026
  4. docs.n8n.io — Telegram node, message operationsSend Message: 4096, Append n8n Attribution, Parse Mode; Send Chat Action. Сверено 14.10.2026
  5. docs.n8n.io — AI AgentМодель и хотя бы один инструмент. Сверено 14.10.2026
  6. docs.n8n.io — Sub-nodesОсновной узел и подузлы, иллюстрация в тексте. Сверено 14.10.2026
  7. docs.n8n.io — Simple MemorySession Key, Context Window Length, ограничение queue mode. Сверено 14.10.2026
  8. docs.n8n.io — How memory worksSimple Memory и память во внешних сервисах. Сверено 14.10.2026
  9. docs.n8n.io — OpenAI Chat ModelОпции Timeout и Max Retries. Сверено 14.10.2026
  10. docs.n8n.io — Call n8n Workflow ToolDescription инструмента, подсценарий должен быть опубликован. Сверено 14.10.2026
  11. docs.n8n.io — SwitchРежимы Rules и Expression. Сверено 14.10.2026
  12. docs.n8n.io — Error TriggerНазначение обработчика, ручной прогон его не вызывает. Сверено 14.10.2026
  13. docs.n8n.io — Handle errors gracefullyОдин обработчик на несколько сценариев, Stop And Error. Сверено 14.10.2026
  14. Telegram Bot APIsendMessage, sendChatAction, deleteMessage, setWebhook и secret_token. Сверено 14.10.2026

Пишу об этом в канале

Короткие разборы и то, что не дотянуло до отдельного материала.