создание AI-агента для Telegram на n8n
Цель: Создать собственного AI-бота (агента) в Telegram, который умеет вести канал (публиковать в нём сообщения), отвечать на сообщения в групповых чатах и проводить личные консультации (диалоги) с пользователями. Мы будем использовать платформу автоматизации n8n в сочетании с AI-моделью (например, OpenAI GPT через API, либо Google Gemini для экономии). Ниже представлен пошаговый гайд на основе практического опыта (более 10 лет разработки ботов), с упором на простоту и надежность.
Инструменты и требования
- Telegram Bot – зарегистрируйте нового бота через @BotFather и получите токен API. BotFather проведёт вас через простые шаги:
/newbot(имя бота) и задание уникального юзернейма (оканчивается на “bot”), после чего BotFather выдаст токен вашего бота. Сохраните этот токен – он потребуется n8n для подключения к Telegram. - Учётная запись OpenAI – понадобится API-ключ OpenAI для доступа к модели GPT (например, GPT-3.5/4). Зарегистрируйтесь на платформе OpenAI и сгенерируйте новый секретный ключ API.
- Платформа n8n – среда, где будет реализована логика бота. Вы можете использовать облачную версию n8n (n8n Cloud) либо развернуть n8n самостоятельно. Например, n8n можно установить на VPS (виртуальном сервере) или даже воспользоваться хостингом Beget, где доступна готовая сборка n8n, устанавливаемая «в несколько кликов». В n8n мы создадим workflow (сценарий), управляющий ботом.
- Google AI (опционально) – для альтернативы OpenAI можно получить ключ API Google AI Studio (Gemini). Модель Gemini 2.0 Flash сейчас доступна бесплатно, что позволит использовать AI без затрат – достаточно создать проект в Google Cloud и включить API Google AI. Этот шаг не обязателен, но мы опишем его использование ниже.
Примечание: Если вы само-хостите n8n (на своём сервере/VPS), для мгновенной реакции бота установите переменную окружения EXECUTIONS_PROCESS=main. Это заставит выполнять задачи в основном процессе без задержки, что особенно важно для быстрого ответа Telegram-бота (иначе при стандартных настройках может быть задержка несколько секунд на запуск подпроцесса для каждого запроса).
Шаг 1: Настройка подключения Telegram в n8n
- Запуск n8n и подключение Telegram: После развёртывания n8n (в облаке или на сервере), зайдите в интерфейс n8n. Создайте новый workflow. Добавьте в него узел Telegram Trigger (триггер Telegram). В настройках Telegram Trigger укажите полученный ранее токен бота. Этот узел будет срабатывать при каждом новом сообщении, полученном вашим ботом (по умолчанию триггер ловит все типы сообщений).
- Режим работы бота в чатах: Решите, как бот будет получать сообщения в группах:
- Если бот добавлен в группу как администратор, он автоматически получает все сообщения из группы (privacy mode не действует).
- Если бот не админ и privacy mode включён (это стоит по умолчанию), то он будет видеть только сообщения, адресованные ему – то есть команды
/<команда>или упоминания @username_bot. Для более свободного общения в группе вы можете отключить privacy mode через BotFather командой/setprivacy= Disable, затем удалить и заново добавить бота в группу. После этого бот будет получать все групповые сообщения как обычный участник (будьте осторожны: не отключайте приватность без необходимости, чтобы бот не перегружался лишними сообщениями). - Рекомендация: На первом этапе целесообразно оставить privacy mode включённым и взаимодействовать с ботом в группе через команды (или ответы на его сообщения). Это предотвращает хаотичные ответы на каждое сообщение в активной группе.
- Добавление бота в канал: Чтобы бот мог постить в канал, добавьте его в администраторы вашего Telegram-канала. Узел триггера Telegram не ловит сообщения из канала (канал – односторонний формат), зато мы сможем посылать сообщения в канал с помощью действия Telegram Send Message. Для этого нам понадобится ID канала. Если канал публичный – можно использовать формат
@channel_username. Если приватный – потребуется numeric ID. Обычно ID канала имеет вид-100xxxxxxxxxx. Узнать его можно, например, через API запрос getUpdates или с помощью бота @username_to_id_bot (он вернёт ID, если отправить ему приглашение в канал). Сохраните идентификатор канала для использования в workflow.
Шаг 2: Предварительная обработка входящих сообщений
Когда Telegram Trigger срабатывает, он выдаёт JSON с данными обновления (сообщения). Нам нужно подготовить эти данные перед отправкой в AI-модель, чтобы избежать ошибок:
- Приведение структуры данных: Убедитесь, что поле текста сообщения всегда присутствует. Например, если пользователь отправил стикер или изображение без подписи,
message.textможет отсутствовать, что вызовет ошибку при попытке обработать текст. Введите узел Function или Set (можно назвать его "PreProcessing"), который проверит наличиеmessage.text. Проще всего присвоить новый ключ, скажем,msg_textвыражению:{{$json["message"]["text"] || ""}}. Это гарантирует, что даже если текст отсутствует, ключ будет создан с пустой строкой. В дальнейшем будем использоватьmsg_textдля унифицированного доступа к тексту запроса.
Пример фрагмента workflow в n8n: узел-триггер Telegram получает входящее сообщение, далее узел PreProcessing гарантирует наличие поля текста, чтобы избежать ошибок на пустых значениях.
- Фильтрация системных событий: По умолчанию Telegram Trigger может получать не только тексты от пользователей, но и сервисные сообщения (например, добавление участника в чат). Желательно отфильтровать такие случаи. Можно добавить условие (IF) сразу после PreProcessing: если
msg_textпустой и нет других значимых данных, то прекращать выполнение (или идти в ветку, где бот ничего не отвечает). Это обезопасит от попытки отправить пустой запрос в AI.
Шаг 3: Настройка промпта и параметров AI
Чтобы управлять поведением AI-агента, зададим системный промпт – инструкцию, описывающую роль бота и стиль ответов. Это делается через узел Set (или Function), куда мы поместим переменные конфигурации:
- system_prompt (или system_command): Здесь опишите роль бота. Например: “Ты – дружелюбный и полезный ассистент. Отвечай пользователю на его языке, обращайся по имени, добавляй эмодзи в конец ответов для эмоциональности.” Также можно включить контекст: имя пользователя и язык интерфейса Telegram. Эти данные доступны в
$json["message"]["from"]– например,first_nameиlanguage_code. Добавляя их в систему, мы позволяем боту персонализировать ответ и учесть язык пользователя. Таким образом, бот будет приветствовать по имени и отвечать на том же языке, на котором его спросили (что улучшает опыт пользователя). - Пример:
system_prompt = "Ты – дружелюбный чат-бот, помогай пользователям. Имя пользователя: {{$json["message"]["from"]["first_name"]}}, язык: {{$json["message"]["from"]["language_code"]}}. Всегда отвечай на языке пользователя и добавляй в конце ответа смайлик."– этот промпт будет отправляться в модель как системное сообщение перед сообщением пользователя. - Дополнительные параметры модели: Вы можете настроить “температуру” ответа (параметр креативности) и максимальную длину ответа. В том же узле Set можно завести, например,
model_temperature = 0.7(средняя креативность), иmax_tokens = 1000(лимит токенов на ответ). Эти переменные потом подставляются в настройки AI-запроса. Также, если планируете поддерживать голосовые или изображения, можно добавить вспомогательные флаги. В нашем простом тексте это не понадобится. - Индикатор “печатает...” (опционально): Чтобы бот выглядел естественно, Telegram позволяет отправлять статус “typing” – имитацию набора текста. В n8n есть операция Send Chat Action (в Telegram node), где можно указать действие:
typingили, например,upload_photo. Мы можем перед вызовом AI-модели послатьtypingв чат, чтобы пользователи видели, что бот думает. В сложных сценариях тип действия можно менять (например, если запрос на генерацию изображения – посылатьupload_photo), для чего в промпте ввели переменнуюbot_typing. В простейшем случае достаточно всегда посылатьtyping. Добавьте узел Telegram -> Send Chat Action после настроек промпта, чтобы сразу после получения сообщения бот начал "набирать ответ". Не забудьте соединить этот узел так, чтобы основной поток подождал окончания действия (в n8n можно использовать узел Merge в режиме Wait/Combine, как сделано в официальном примере, чтобы дальнейшие шаги не опередили индикатор).
Шаг 4: Обработка запроса и вызов AI-модели
Теперь переходим к основному интеллекту бота – интеграция с AI. Мы настроим логику так, чтобы бот мог отвечать текстом на любые вопросы, а при необходимости – генерировать изображения по команде. Для этого пригодится узел Switch (Переключатель) либо несколько узлов IF:
- Определяем тип запроса: В Telegram принято использовать слэш-команды для особых действий. Например, будем считать, что запрос, начинающийся с
/imageили/img, означает просьбу сгенерировать изображение по описанию. Другие сообщения (обычный текст или команда/start, и т.д.) будут трактоваться как запрос на текстовый ответ. Добавьте узел Switch после этапа “PreProcessing”/настроек: - Case 1:
msg_textначинается с/image– отправим эту ветку на генерацию изображения. - Case 2: (необязательно)
msg_textравно/start– можно выделить отдельную ветвь для приветствия. В простом случае мы можем обрабатывать/startкак обычный запрос, либо вернуть заранее заготовленное приветственное сообщение. - Case 3: (по умолчанию) – любая другая строка текста, считаем обычным вопросом для чат-бота (GPT).
Фрагмент логики ветвления в n8n: узел Switch (CheckCommand) направляет запрос либо на текстовую модель GPT (ветка 0 и 1), либо на генерацию изображения DALL·E (ветка 2), либо на обработку неизвестной команды (ветка 3).
На схеме выше показан пример: простые сообщения и /start идут в модель чата, команда /image – в модель генерации картинок, а последняя ветка – обработка ошибок (неподдерживаемых команд).
- Вызов OpenAI (текст): Для текстовых запросов добавьте узел OpenAI (доступен из коробки в n8n). Настройте его в режиме Chat (чат-комплитшн) и выберите модель (например,
gpt-3.5-turboилиgpt-4, если доступно). В поле System Message подставьте переменнуюsystem_prompt(наш заранее сформированный промпт с инструкцией). В User Message передайте текст запроса пользователя (msg_text, но можно убрать префикс/startесли это приветствие – т.е. подставлять не саму команду, а например “приветствие” – или вообще игнорировать/start). Также укажите параметры: температуру ={{ $json["model_temperature"] }}(если настраивали), максимальные токены ={{ $json["max_tokens"] }}. Узел OpenAI вернёт ответ модели в виде текста. Назовём этот узел, например, "AI Chat Reply". - Вызов OpenAI (изображение, опционально): Для ветки с
/imageиспользуйте узел OpenAI, но выберите операцию Create Image (DALL·E). В поле Prompt передайте строку запроса без команды, например, убрав первое слово/image. Можно сделать это с помощью функции или выражения:{{$json["msg_text"].replace('/image', '').trim()}}– чтобы получить описание для картинки. Модель DALL·E создаст изображение и вернёт URL (ссылку) на сгенерированное изображение. Этот URL мы далее используем, чтобы отправить картинку в Telegram. Назовём узел, например, "AI Image Generation". - Обработка неизвестных команд: Если ни одно условие не сработало (ветка Default в Switch), мы не вызываем AI, а сразу готовим ответ вида “Извините, я пока не умею выполнять эту команду.” Это позволит не тратить ресурсы API на непредусмотренные вводы и сразу дать понятный ответ. Реализовать можно узлом Telegram Send Message с текстом-ошибкой. Либо сперва узлом Function сформировать текст ошибки, потом отправить. В нашем примере Switch последняя Routing Rule – fallback для неподдерживаемых команд, и мы просто отправим заранее заданное сообщение.
Совет: На этапе настройки AI-запросов протестируйте их прямо в n8n, подставив примерные данные. Убедитесь, что OpenAI узлы корректно возвращают ответы. В случае GPT-чат-модели ответ будет в JSON (обычно json.data.choices[0].message.content). Можно сразу внутри узла OpenAI включить опцию Return Full Response = false, тогда выходной JSON будет компактнее (сразу text с ответом).
Шаг 5: Отправка ответа пользователю
После получения ответа от AI осталось вернуть его в Telegram соответствующим образом:
- Ответ в личку или группу (текст): Добавьте узел Telegram -> Send Message (или Telegram -> Reply). В него нужно подставить Chat ID чата, откуда пришло сообщение, и текст ответа. В n8n выход Trigger предоставляет chat ID в
$json["message"]["chat"]["id"]. Подставьте его (например, через Expression Editor) в поле Chat ID у узла отправки. Текст для отправки возьмите из результата узла AI Chat Reply – как упоминалось, это может быть доступно через выражение, например:{{$node["AI Chat Reply"].json["data"]["choices"][0]["message"]["content"]}}(или проще, если нода OpenAI настроена выдавать короткий результат). В итоге этот узел отправит ответное сообщение тому же чату, откуда пришёл вопрос. Важно: Если бот отвечает в группе, лучше настроить Send Message как ответ на конкретное сообщение (Reply) – для этого укажите Reply To Message ID ={{$json["message"]["message_id"]}}. Тогда в группе ответ будет threaded (в виде ответа конкретному пользователю), что улучшит читаемость. - Отправка изображения: После генерации картинки у нас есть URL. Telegram умеет отправлять фото по URL. Используйте узел Telegram -> Send Photo. В поле Photo укажите переменную с URL, например
{{$node["AI Image Generation"].json["data"][0]["url"]}}(в OpenAI node URL обычно приходит в таком поле). Chat ID ставим тот же (из исходного сообщения). В итоге бот отправит изображение прямо в чат. Если нужно, добавьте подпись (caption) к фото, например, тот же запрос пользователя или фразу вроде “Готово 😊”. - Ответ на неподдерживаемую команду: Настройте узел Send Message для этой ветки с заранее прописанным текстом (например: “Неизвестная команда. Я могу отвечать на вопросы или сгенерировать изображение по команде /image.”). Подключите его к ветке default Switch. Таким образом, если пользователь ввёл что-то непредусмотренное (не текст и не /image), бот мгновенно отправит эту подсказку, не вызывая AI-модель. Это сделает систему более устойчивой и экономичной.
- Публикация в канале: Для функций ведения канала стоит настроить отдельный поток. Частый сценарий – автопостинг контента. Например, можно создать Cron Trigger (узел Interval/Cron) в том же workflow (или отдельном) – который будет срабатывать раз в день/час/и т.д. После триггера добавить узел OpenAI (или другой источник контента) для генерации сообщения. Это может быть совет дня, анекдот, новость – всё, что угодно. Получив сгенерированный текст, передайте его в узел Telegram -> Send Message, указав Chat ID вашего канала (из Шага 1) и сам текст. Удостоверьтесь, что бот является администратором канала, иначе отправка не выполнится (будет ошибка “Bad Request: chat not found”). Как отмечалось, используйте ID формата
-100XXXXXXXXXXдля приватного канала, либо@usernameдля публичного. Проверить работу легко: запустите выполнение Cron вручную (кнопкой Execute Workflow), и убедитесь, что пост появляется в канале. Таким образом, бот-агент сможет вести канал, публикуя контент автоматически по расписанию.
Шаг 6: Тестирование и запуск бота
Когда основные узлы настроены, протестируйте бота:
- В личных сообщениях: Напишите боту в личку что-нибудь простое, например: “Привет, что ты умеешь?”. Бот должен ответить дружелюбно, на русском (если ваш Telegram на русском), обратиться по имени. Проверьте, что эмодзи добавляются, как задумано, и нет ли ошибок. При первом обращении бот может отвечать чуть дольше (инициализация), но последующие ответы должны приходить быстро (1-2 секунды при правильной настройке переменной EXECUTIONS_PROCESS).
- В группе: Добавьте бота в тестовую группу. Если privacy mode включён – попробуйте написать
/image котик. Бот должен показатьtyping…и через несколько секунд прислать сгенерированную картинку котика. Попробуйте обычный вопрос, например, упомянув бота:@YourBot как попасть на Луну?. Бот либо не увидит (если privacy), либо ответит с разумным текстом. Скорректируйте логику Switch, если нужно – возможно, стоит реагировать на упоминание (вmsg_textTelegram при упоминании содержит юзернейм бота). - В канале: Запустите вручную срабатывание Cron (или дождитесь планового времени) и убедитесь, что бот публикует сообщение в канал. Например, если настроен ежедневный пост, вы можете временно выставить Cron на каждую минуту для теста.
Если всё работает, активируйте workflow (переключатель Active в верхнем правом углу редактора n8n). Теперь сценарий будет работать постоянно в фоновом режиме. Убедитесь, что ваш n8n запущен 24/7 (для n8n Cloud это автоматически, для собственного сервера – настроьте автозапуск Docker/процесса n8n). Бот готов служить!
Использование Google Gemini (альтернатива OpenAI)
Как упоминалось, можно задействовать бесплатную на 2024 год модель Google Gemini через Google AI Studio. В n8n с версии 1.5+ появились встроенные узлы Google AI. Принцип работы схож с OpenAI-узлом: вы указываете модель (например, gemini-2-chat для текста или gemini-2-image для изображения), передаёте промпты. Системный промпт, подготовленный ранее, вполне применим и для Gemini. Вам потребуется получить ключ API в Google Cloud (в проекте включить API Google Generative AI).
Важный плюс – модель Gemini 2 Flash на данный момент не тарифицируется, так что вы можете обрабатывать запросы бесплатно. Настройка узла: добавьте Google AI > PaLM (или он же Gemini) узел, выберите действие “Generate Text” или “Chat Completion”. Укажите модель (список доступен в документации, например models/chat-bison-001 или обновлённые названия Gemini). Передайте System Prompt и User Prompt аналогично. Google-модель вернёт текст ответа. По качеству ответы Gemini могут отличаться от GPT, поэтому протестируйте и при необходимости подкорректируйте промпт (например, добавить конкретики). Также учитывайте ограничения: длина запроса и ответа, поддерживаемые языки (Gemini тоже поддерживает русский и др.).
Подменить OpenAI на Gemini в нашем workflow легко: достаточно в Switch-ветке текстовых вопросов направить не в узел OpenAI, а в узел Gemini. Либо даже параллельно использовать – например, для разных типов запросов. Сообщество n8n отмечает, что модель Gemini 2.0 Flash эффективно работает без затрат, но будьте готовы, что в будущем могут появиться ограничения или тарифы.
Полезные шаблоны и ресурсы
Создаваемый нами бот может быть расширен множеством функций. Рекомендуется изучить готовые решения сообщества, выложенные на n8nworkflows.xyz – это каталог, где доступно тысячи шаблонов workflow. Например, для вдохновения:
- Шаблон “Session-Based Telegram Chatbot” – реализует поддержку сессий диалога. Пользователь может начинать новые темы командой
/new, бот будет помнить контекст беседы, хранить историю в Google Sheets, резюмировать переписку по запросу. Такой подход полезен для личных консультаций, когда нужен длительный разговор с памятью. - Шаблон “Multi-Modal AI Assistant” – показывает, как бот может принимать не только текст, но и голосовые сообщения, изображения и документы, отвечая на них (например, озвучивать голосом ответы или анализировать картинки). Эти примеры демонстрируют, что наш агент можно сделать более продвинутым, хотя это выходит за рамки “самого простого” сценария.
- Официальный блог n8n – содержит пошаговые статьи, в том числе создание AI-бота для Telegram без кода и многоязычного бота-переводчика. Там вы найдёте подробные объяснения и изображения узлов, часть из которых мы использовали в этом гайде.
Если возникают трудности, обратитесь к сообществу n8n – на форуме многие обсуждали интеграцию Telegram и OpenAI. Например, вопрос об отправке сообщений в канал решается указанием правильного chat_id с префиксом -100, а проблема задержки решается установкой EXECUTIONS_PROCESS=main, как мы уже сделали. В целом, взаимодействие OpenAI с Telegram через n8n – задача распространённая, и почти любую проблему можно решить, опираясь на опыт коллег.
Заключение
Мы пошагово создали AI-агента для Telegram: бот регистрируется за пару минут, его логика собирается без кода в n8n, а возможности зависят только от вашей фантазии. В нашем сценарии бот способен отвечать на вопросы пользователей (в личке и группе) и автоматически публиковать записи в канал, работая 24/7. Все компоненты – от обработки сообщений до вызова AI – выполнены так, чтобы избежать ошибок и задержек (что подтверждено настройками и предобработкой данных).
Такой подход экономит ваше время: вместо написания бота с нуля мы используем готовые модули и просто связываем их нужным образом. N8n как платформа низкого кода обеспечивает гибкость: при необходимости вы можете расширить бота (добавить память, интеграцию с БД или внешними сервисами). OpenAI GPT даёт боту “мозг”, а с появлением альтернатив вроде Google Gemini можно снизить издержки на запросы.
Настроив всё один раз, вы получаете персонального AI-помощника, полностью контролируемого вами. Он может модерировать чат, отвечать на часто задаваемые вопросы, давать советы или просто развлекать. Экспериментируйте с промптами, настройками модели – и вы найдете оптимальный стиль работы вашего агента.
Помните, что главное – это полезный опыт для пользователей: старайтесь, чтобы ответы бота были точными и уместными. Регулярно проверяйте логи workflow в n8n на наличие ошибок и сохраняйте резервные копии сценария. При грамотной настройке ваша автоматизация будет работать без сбоев и ошибок, принося пользу вам и вашим подписчикам.
Теперь – вперёд, запускайте своего AI-агента и наблюдайте, как он облегчает вашу работу в Telegram! 🚀