Обновлено 11 августа 2026.
ИИ-бот в Телеграмме — это обычный телеграм-бот, который передаёт сообщение пользователя языковой модели и возвращает её ответ. Свой такой бот собирается за вечер: токен у @BotFather, ключ к API модели и меньше сорока строк на Python. Ниже — код на версиях библиотек августа 2026, разбор доступа к OpenAI из России и таблица выбора между готовым ботом, конструктором и собственным кодом.
- Рабочая связка: python-telegram-bot 22.8 (релиз 12 июня 2026, Python 3.10 и новее) и openai 2.53.0 (релиз 3 августа 2026).
- Код из инструкций 2023 года не запустится: из python-telegram-bot удалены
FiltersиDispatcher, аUpdaterостался, но с другой сигнатурой — на старом вызовеUpdater(token=…)код падает сTypeError. У openai модульный вызовopenai.Completion.createне работает с версии 1.0.0. - Актуальный вызов OpenAI —
client.responses.create(), в официальном примере библиотеки указана модель gpt-5.5. - России нет в списке стран, для которых OpenAI разрешает доступ к своему API, поэтому дальше разобран вариант на российской модели.
- Бот без памяти отвечает на каждое сообщение с чистого листа; контекст диалога добавляется четырьмя строками кода.
Как устроен ИИ-бот в Телеграмме
Внутри такого бота нет ничего от нейросети — он посредник между двумя чужими API. Telegram отдаёт вашему коду входящее сообщение, код пересылает текст в API языковой модели, получает ответ и отправляет его обратно в чат. Всё, что вы пишете сами, — это склейка из четырёх действий: принять, передать, дождаться, ответить.
Отсюда два практических следствия. Первое: качество ответов зависит от модели и системного промпта, а не от кода бота — переписывание обработчиков не сделает ответы умнее. Второе: у вас две точки отказа и два счётчика расходов — Telegram Bot API (бесплатный, но с лимитами) и API модели (платный, по токенам).
Получать обновления от Telegram можно двумя способами. Long polling — код сам опрашивает серверы Telegram; подходит для разработки и для бота, который живёт на вашем ноутбуке. Webhook — Telegram сам стучится на ваш URL; нужен домен с HTTPS. Одновременно они не работают: в документации Bot API про метод getUpdates прямо сказано, что он не будет работать, если установлен вебхук.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Готовый ИИ-бот, конструктор или свой код

Прежде чем открывать редактор, стоит честно ответить, нужен ли вам код вообще. ИИ-бот в Телеграмме заводится тремя разными способами, и они решают разные задачи.
| Путь | Время до первого ответа в чате | Своя логика и свои данные | Где упирается |
|---|---|---|---|
| Готовый бот из каталога | Минуты: нашли в поиске Telegram, нажали «Запустить» | Нет: чужой промпт, чужая модель, чужие лимиты | Нельзя подключить свою базу, нельзя гарантировать, что бот не исчезнет |
| Конструктор без программирования | Часы: сценарий собирается мышью | Частично: свои сценарии и кнопки, модель из списка платформы | Абонентская плата, потолок платформы, данные лежат у неё |
| Свой бот на Python | Вечер: токен, ключ, запуск скрипта | Да: любая модель, свои данные, своя логика | Нужен сервер и присмотр за ошибками, платите за токены сами |
Готовые боты имеют смысл, когда задача разовая: перевести текст, обработать фото, набросать пост. У нас есть отдельный разбор такой категории — обзор бесплатных ботов для обработки фото в Telegram. Если же бот должен отвечать по вашим регламентам, вести клиента по воронке или писать в вашу CRM, чужой бот не подойдёт — сценарий придётся описывать самому. Формат и сценарии удобно продумать заранее: как выбрать формат чат-бота и сценарии для проекта.
Дальше — третий путь: собственный бот на Python. Он дороже по времени на старте и дешевле в эксплуатации, потому что вы платите только за токены модели и за сервер.
Шаг 1. Регистрация телеграм-бота: токен у @BotFather

Токен — это пароль вашего бота к Telegram Bot API. Выдаёт его служебный бот @BotFather внутри самого мессенджера.
- Откройте в Telegram чат с @BotFather и нажмите «Запустить».
- Отправьте команду
/newbot. - Введите отображаемое имя бота — его увидят пользователи в заголовке чата.
- Введите username: он должен быть уникальным и заканчиваться на
bot, напримерmy_ai_helper_bot. - Скопируйте выданный токен вида
1234567890:AA…и сохраните его вне кода.
Тем же @BotFather позже задаются описание, аватар и список команд (/setcommands) — это то, что человек видит до первого сообщения. Полное описание методов и лимитов лежит в официальной документации Telegram Bot API; на 14 июля 2026 там актуальна версия Bot API 10.2.
Шаг 2. Получение доступа к модели
Вторая половина бота — доступ к языковой модели. У OpenAI ключ создаётся в личном кабинете разработчика в разделе API keys, оплата идёт по факту израсходованных токенов. Ключ показывается один раз, поэтому сохраняйте его сразу.
Здесь же стоит проверить главное ограничение: Россия отсутствует в перечне поддерживаемых стран и территорий OpenAI. Формулировка на этой странице прямая: доступ к сервисам за пределами перечисленных стран может привести к блокировке или приостановке аккаунта. Что делать в этом случае — разобрано ниже отдельной главой, код там отличается на четыре строки.
Шаг 3. Подготовка окружения
Нужен Python 3.10 или новее — это требование python-telegram-bot 22.8. Виртуальное окружение изолирует зависимости проекта от системных.
python3 -m venv botenv source botenv/bin/activate # Windows: botenv\Scripts\activate pip install "python-telegram-bot==22.8" "openai==2.53.0"
Версии закреплены намеренно: у python-telegram-bot между мажорными версиями менялись имена классов, и большая часть нерабочих примеров в интернете — это код под версию 13, запущенный на версии 22. Если Python вы видите впервые, начните с базы — почему программисты выбирают Python и как написать первый код.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Шаг 4. Разработка бота: код целиком
Создайте файл bot.py. Это законченный бот: он отвечает на любое текстовое сообщение ответом модели и показывает статус «печатает», пока ждёт ответ.
import os
from openai import AsyncOpenAI
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters
client = AsyncOpenAI(api_key=os.environ["OPENAI_API_KEY"])
SYSTEM_PROMPT = "Ты ассистент поддержки. Отвечай коротко и по-русски."
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text("Задайте вопрос — отвечу с помощью нейросети.")
async def reply(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await context.bot.send_chat_action(chat_id=update.effective_chat.id, action="typing")
response = await client.responses.create(
model="gpt-5.5",
instructions=SYSTEM_PROMPT,
input=update.message.text,
)
await update.message.reply_text(response.output_text[:4096])
def main() -> None:
app = Application.builder().token(os.environ["TELEGRAM_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, reply))
app.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()Запуск — с токенами в переменных окружения, чтобы ключи не уехали в репозиторий вместе с кодом:
export TELEGRAM_TOKEN="1234567890:AA..." export OPENAI_API_KEY="sk-..." python bot.py
Что здесь важно построчно. filters.TEXT & ~filters.COMMAND означает «любой текст, кроме команд», иначе бот начнёт отвечать нейросетью на собственный /start. instructions — это системный промпт: он задаёт роль и тон, и именно правкой одной этой строки один и тот же код превращается в переводчика, репетитора или бота поддержки. Срез [:4096] нужен потому, что Telegram принимает текст сообщения длиной 1–4096 символов, а модель легко напишет больше — без среза бот молча упадёт на длинном ответе.
Официальный пример эхо-бота с теми же импортами лежит в документации python-telegram-bot — если что-то не сходится, сверяйтесь с ним, а не с чужими статьями.
Почему код из старых инструкций падает с ошибкой
Большинство русскоязычных руководств про телеграм-бота с ИИ написаны в 2023 году, и обе библиотеки с тех пор сломали обратную совместимость. Ломаются они по-разному, и по тексту ошибки сразу видно, какая из двух.
python-telegram-bot падает на импорте, но не на том имени, которое обычно называют. Из библиотеки убраны Filters и Dispatcher: строка из примеров 2023 года from telegram.ext import Updater, Filters на версии 22.8 обрывается сообщением ImportError: cannot import name 'Filters' from 'telegram.ext' — имени Updater в нём нет. Сам класс на месте: from telegram.ext import Updater проходит без ошибки и даёт <class 'telegram.ext._updater.Updater'>. Изменилась его роль — в документации библиотеки он описан как объект, который забирает обновления у Telegram и складывает их в очередь, создаётся как Updater(bot, update_queue), а точкой входа в приложение стал Application. Поэтому старый конструктор ломается не на импорте, а на вызове: Updater(token="…", use_context=True) даёт TypeError: Updater.__init__() got an unexpected keyword argument 'token'.
openai ломается иначе: на импорте не падает вовсе. import openai проходит, атрибут openai.Completion на месте — это заглушка-прокси, — и исключение прилетает только в момент вызова. openai.Completion.create(...) даёт APIRemovedInV1: You tried to access openai.Completion, but this is no longer supported in openai>=1.0.0, openai.ChatCompletion.create(...) — то же сообщение. Если бот стартовал, принял сообщение и упал уже на запросе к модели, причина здесь. Ниже — построчное соответствие старого и нового.
| Как было в примерах 2023 года | Как работает сейчас |
|---|---|
from telegram.ext import Updater, Filters |
from telegram.ext import Application, filters — Filters удалён, модуль фильтров пишется строчными |
Updater(token=…, use_context=True) |
Application.builder().token(…).build(); Updater в библиотеке остался, но с сигнатурой (bot, update_queue) и в коде бота напрямую не нужен |
dispatcher.add_handler(…) |
app.add_handler(…), класс Dispatcher удалён |
def respond(update, context) |
async def respond(update, context) — обработчики асинхронные |
updater.start_polling() + updater.idle() |
app.run_polling() одной строкой; метод start_polling у Updater сохранился, idle убран |
openai.api_key = "sk-…" |
client = AsyncOpenAI(api_key=…); openai.api_key работает и сейчас — его подхватывает модульный клиент, — но явный клиент держит настройки в одном месте, позволяет завести несколько клиентов с разными ключами и даёт асинхронный AsyncOpenAI |
openai.Completion.create(engine="text-davinci-003") |
client.responses.create(model=…); text-davinci-003 отключена 4 января 2024 |
response.choices[0].text |
response.output_text |
Проверить свою версию можно командой pip show python-telegram-bot openai. Если в поле Version стоит 13.x — это библиотека под старый синтаксис, и половина примеров из статьи не заработает.
Как добавить боту память диалога
Бот из шага 4 отвечает на каждое сообщение с чистого листа: спросите «а подробнее?» — и он не поймёт, о чём речь. Историю переписки нужно хранить самому и передавать модели целиком. В python-telegram-bot для этого есть context.user_data — словарь, живущий отдельно для каждого пользователя.
async def reply(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
history = context.user_data.setdefault("history", [])
history.append({"role": "user", "content": update.message.text})
response = await client.responses.create(
model="gpt-5.5",
instructions=SYSTEM_PROMPT,
input=history[-10:],
)
history.append({"role": "assistant", "content": response.output_text})
await update.message.reply_text(response.output_text[:4096])Срез [-10:] — это про деньги: каждое сообщение истории уходит в модель при каждом запросе, и без ограничения счёт за токены растёт квадратично по длине диалога. По умолчанию user_data хранится в оперативной памяти и обнуляется при перезапуске бота; чтобы память переживала рестарт, в библиотеке есть механизм персистентности, а под нагрузкой историю выносят в базу.
Что делать, если OpenAI недоступен из России

Ни одна инструкция не сделает российскую карту платёжеспособной в OpenAI, а российский IP — разрешённым: страны нет в списке поддерживаемых, и оплата ключа обычно упирается в это раньше, чем код. Практических выхода два, и оба меняют ровно одно место в боте — функцию обращения к модели. Вся телеграмная часть остаётся прежней.
Первый путь — прокси-совместимый шлюз: сторонний сервис принимает запросы в формате OpenAI и передаёт их дальше, вы меняете только base_url у клиента. Второй, более предсказуемый по документам и оплате, — российская языковая модель. У GigaChat есть официальная Python-библиотека и асинхронный клиент, поэтому она встаёт в тот же обработчик.
pip install gigachat
import os
from gigachat import GigaChat
from telegram import Update
from telegram.ext import ContextTypes
CREDENTIALS = os.environ["GIGACHAT_CREDENTIALS"]
async def reply(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
async with GigaChat(credentials=CREDENTIALS, model="GigaChat-2") as giga:
response = await giga.achat.create(update.message.text)
answer = response.messages[0].content[0].text
await update.message.reply_text(answer[:4096])Ключ авторизации берётся в личном кабинете разработчика Сбера, там же выдаётся стартовый пакет токенов. Две вещи, на которых спотыкаются: модель нужно указывать явно (model="GigaChat-2"), иначе библиотека может отказаться выбирать её за вас, а список доступных моделей возвращает метод get_models(). И клиент в примере создаётся на каждое сообщение — для теста нормально, в проде клиент создают один раз при старте приложения, чтобы не переавторизовываться на каждый запрос.
Формат ответа отличается от OpenAI: текст лежит не в output_text, а в response.messages[0].content[0].text. Это единственное место, которое придётся поправить при переезде с одной модели на другую, — ещё одна причина держать обращение к модели в отдельной функции, а не размазывать по обработчикам.
Шаг 5. Тестирование и отладка
Первый запуск проверяется руками: python bot.py, затем в чате с ботом команда /start и любой вопрос. Ответ должен прийти за несколько секунд. Если бот молчит, ответ ищите в терминале: библиотека печатает туда исключения, и по тексту ошибки видно, что случилось: неверный токен или отказ API модели.
Логирование включается двумя строками и с первого дня экономит часы отладки: без него бот, упавший ночью, не оставляет следов.
import logging
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.INFO,
)Когда бот перерастает один файл, подключают автоматизированное тестирование. Обработчик — обычная асинхронная функция, поэтому модульные тесты пишутся на pytest с плагином pytest-asyncio: вы подменяете вызов модели заглушкой и проверяете, что бот отправил в чат ожидаемый текст. Интеграционную проверку удобно делать на втором, «черновом» боте с отдельным токеном — так эксперименты не задевают пользователей рабочего.
Что ломается у ИИ-бота в реальной работе
На своём ноутбуке бот работает у всех. Проблемы начинаются, когда его оставляют включённым на сутки. Таблица ниже — симптомы, которые ловятся чаще всего, и что за ними стоит.
| Симптом | Причина | Что сделать |
|---|---|---|
| Ошибка 409 Conflict в логах | Запущено два экземпляра бота с одним токеном либо polling конфликтует с ранее установленным вебхуком | Оставить один процесс; при переходе на polling снять вебхук методом deleteWebhook |
| Бот молчит на длинных ответах | Модель вернула больше 4096 символов — предела Telegram для текста сообщения | Резать ответ или отправлять частями |
telegram.error.RetryAfter |
Превышена частота отправки сообщений, Telegram включил флуд-контроль | Дождаться указанного в ошибке времени, добавить очередь |
telegram.error.TimedOut |
Сеть или долгий ответ модели | Обернуть вызов модели в try/except и извиниться в чат вместо тишины |
| Счёт за токены больше ожидаемого | В модель уходит вся история диалога на каждом сообщении | Ограничить историю срезом и длиной ответа |
Безопасность
Токен бота и ключ модели — в переменных окружения или в секретах хостинга, никогда в коде и не в репозитории: утёкший токен даёт чужому человеку полный доступ к вашему боту. Если бот отвечает не всем подряд, проверяйте update.effective_user.id по списку разрешённых. И помните, что текст пользователя попадает в промпт: инструкции модели пишите так, чтобы присланная фраза «забудь предыдущие указания» не переопределяла роль.
Масштабирование: вебхук вместо polling
Для постоянной работы бота нужен сервер: виртуальная машина у облачного провайдера, systemd-юнит или контейнер. Под нагрузкой polling меняют на вебхук — в python-telegram-bot это замена одной строки запуска, домен с HTTPS-сертификатом уже должен быть:
app.run_webhook(
listen="0.0.0.0",
port=8443,
url_path="secret-path",
webhook_url="https://example.com/secret-path",
)Вебхук снимает лишние запросы к серверам Telegram и сокращает задержку ответа, но требует публичного адреса — поэтому на этапе разработки остаются на polling.
Куда приспособить своего ИИ-бота
Один и тот же код меняет назначение правкой системного промпта и парой команд. Рабочие сценарии, которые чаще всего доводят до конца:
- Первая линия поддержки: бот отвечает по вашим регламентам и передаёт человеку то, чего не знает.
- Внутренний помощник команды: пересказ длинных писем, черновики ответов, расшифровка задач из голосовых.
- Личный интерфейс к нейросети: свой бот не имеет чужих лимитов и не показывает рекламу; заодно мессенджер превращается в рабочий инструмент — например, как превратить Телеграмм в удобный таск-менеджер.
- Приём заявок: бот собирает данные диалогом и кладёт их в таблицу или CRM.
Практические советы по интерфейсу
Лучшие практики здесь сводятся к одному правилу: человек должен понимать, что бот умеет, до того как напишет первое сообщение. Список команд задаётся через /setcommands у @BotFather и показывается в меню чата. Частые действия выносятся на кнопки клавиатуры, чтобы не заставлять человека угадывать формулировку. На непонятный запрос бот отвечает подсказкой о своих возможностях; молчание пользователи читают как поломку и уходят.
Маркетинг и продвижение бота
У бота есть постоянная ссылка вида t.me/имя_бота — она работает как адрес сайта: её ставят в описание канала, в подпись, в статью. Короткое описание и аватар задаются там же, у @BotFather, и это первое, что видит человек перед запуском. Дальше работают каталоги ботов, тематические чаты и собственные площадки; для внутреннего бота компании продвижение сводится к одному сообщению в рабочем чате.
Чек-лист перед запуском
- Python 3.10+, зафиксированные версии библиотек в
requirements.txt. - Токен и ключ модели — в переменных окружения, репозиторий чистый.
- Системный промпт описывает роль, тон и границы бота.
- Ответ модели режется до 4096 символов.
- История диалога ограничена срезом, расход токенов предсказуем.
- Вызов модели обёрнут в
try/except, ошибки видны в логах. - На сервере работает ровно один экземпляр бота с этим токеном.
Частые вопросы про ИИ-бота в Телеграмме
Сколько стоит собственный ИИ-бот в Телеграмме?
Telegram Bot API бесплатен, платными остаются два пункта: токены языковой модели по факту использования и сервер, на котором бот живёт круглосуточно. Тестовый запуск на своём компьютере не стоит ничего, кроме токенов модели.
Можно ли сделать ИИ-бота в Телеграмме без программирования?
Да, через конструкторы чат-ботов с подключённой нейросетью или готовые боты из каталога. Ограничение в том, что своя логика, свои данные и своя модель доступны только в собственном коде.
Почему код телеграм-бота из старых статей не запускается?
Ломаются обе библиотеки, но по-разному. В python-telegram-bot удалены классы Filters и Dispatcher, поэтому строка from telegram.ext import Updater, Filters даёт ImportError: cannot import name 'Filters' from 'telegram.ext'. Сам Updater из библиотеки не пропал, но теперь создаётся как Updater(bot, update_queue), и старый вызов Updater(token=…) падает с TypeError: Updater.__init__() got an unexpected keyword argument 'token'. Обработчики стали асинхронными, приложение собирают через Application.builder(). В openai импорт проходит без ошибок, а исключение APIRemovedInV1 прилетает уже при вызове openai.Completion.create — этот вызов удалён в версии 1.0.0.
Как сделать ИИ-бота, если OpenAI недоступен из России?
Поменять только функцию обращения к модели: подключить российскую модель вроде GigaChat с её официальной Python-библиотекой или совместимый шлюз с другим base_url. Код телеграм-части не меняется.
Как заставить бота помнить переписку?
Хранить историю сообщений в context.user_data и передавать модели последние несколько реплик вместе с новым вопросом. Без ограничения истории расход токенов растёт с каждым сообщением.
Заключение
ИИ-бот в Телеграмме — это тридцать строк склейки между двумя API. Сложность живёт в двух местах: актуальность версий библиотек и доступ к модели. Возьмите python-telegram-bot 22.8 и openai 2.53.0, держите ключи в переменных окружения, режьте ответ до 4096 символов и ограничивайте историю диалога. Если OpenAI недоступен, меняется одна функция, а не проект. Всё остальное — системный промпт, и именно он определяет, чем ваш бот отличается от чужого.
- Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ