Три часа ночи. Я сижу над документацией Telegram Bot API и понимаю, что сделал глупость — пытался прикрутить к боту сразу две модели, и они друг другу мешают. Вместо ассистента получился генератор бессмыслицы. Пришлось всё переделывать с нуля.
На следующий день ассистент заработал нормально. И я решил записать, что узнал, пока не забыл.
Зачем вообще городить своего бота
Большинство людей начинают с ChatGPT или Claude в браузере. Это нормально, но есть задачи, где бот в Telegram удобнее — быстрый вопрос прилетает туда, где ты уже сидишь, не нужно открывать отдельную вкладку. А ещё можно привязать к боту свои данные, базу знаний, внутренние процессы.
Для меня главная фишка — интеграция с заметками. Кидаю боту ссылку — он кратко пересказывает. Кидаю текст — он находит повторы и стилистические косяки. Без переключения контекста, без копирования туда-сюда.
С чего начать
Нужны три вещи: Telegram-бот, API-ключ от языковой модели и сервер, который будет между ними связующим звеном.
Бот в Telegram. Открываешь @BotFather, пишешь /newbot, следуешь инструкции. Получаешь токен вида 123456789:ABCdefGhIJKlmNoPQRstuVWXyz. Токен — как пароль, никому не показывай.
Ключ от модели. Большинство сервисов дают ключи бесплатно или почти бесплатно. OpenAI, Groq, Anthropic через прокси — каждый вариант со своими плюсами. Я использую Groq, потому что у них бесплатный тариф с хорошей скоростью и модели достаточно шустрые для диалога.
Серверная часть. Вот тут было интереснее всего. Можно взять готовые решения вроде CrewStack, Coze или Manybot. А можно написать самому, если умеешь в Python. Я пошёл вторым путём, потому что хотел понять, как оно работает изнутри.
Простая реализация на Python
Не буду грузить кодом целиком — покажу принцип, который оказался важным.
Сначала ставишь библиотеку:
pip install python-telegram-bot openai
Дальше минимальный каркас:
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters
from openai import OpenAI
BOT_TOKEN = "твой_токен"
OPENAI_KEY = "твой_ключ"
client = OpenAI(api_key=OPENAI_KEY)
async def start(update, context):
await update.message.reply_text("Привет. Я твой ассистент.")
async def handle_message(update, context):
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": update.message.text}]
)
await update.message.reply_text(response.choices[0].message.content)
app = Application.builder().token(BOT_TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()
Запускаешь, пишешь боту — он отвечает. Сорок строк, и уже работает. Я был удивлён, насколько быстро это собирается.
Но потом, конечно, начались нюансы.
Где я наступил на грабли
Первая проблема — контекст не сохранялся. Пишу боту «дополни абзац», а он отвечает на пустом месте, потому что каждый запрос — новый. Исправил через хранение истории в памяти приложения:
user_context = {}
async def handle_message(update, context):
user_id = update.effective_user.id
if user_id not in user_context:
user_context[user_id] = []
user_context[user_id].append({"role": "user", "content": update.message.text})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=user_context[user_id]
)
reply = response.choices[0].message.content
user_context[user_id].append({"role": "assistant", "content": reply})
await update.message.reply_text(reply)
Вторая проблема — контекст разрастался. После пятнадцати сообщений модель начинала тупить и повторяться. Поставил лимит:
user_context[user_id] = user_context[user_id][-20:]
Третья — разговоры разных людей перемешивались, потому что я хранил всё в одной переменной. Добавил user_id как ключ, и стало нормально.
Что я в итоге доделал
Чистый бот хорош, но ограничен. Я докрутил несколько вещей, которые реально использую.
Системный промпт. Настроил инструкцию, которая говорит боту, как себя вести. Теперь он знает, что я работаю с текстами, и сразу предлагает альтернативы формулировок, а не просто переписывает.
Загрузка файлов. Кидаю боту PDF или docx — он читает и отвечает на вопросы по документу. Для этого пришлось добавить парсинг файлов и передачу содержимого в контекст. Не rocket science, но возни минут на двадцать.
Команды. Добавил /summarize, /rewrite, /ask — вместо длинных инструкций набираю одну команду и текст.
Хостинг: где это запускать
Локально бот работает, но выключаешь комп — он умирает. Нужен постоянный сервер.
Мне хватает бесплатного тарифа на Render или Railway. Почти любой минимальный сервер справляется — бот не нагружает систему. Единственное — нужно настроить автоматический рестарт, если что-то упадёт.
Для совсем простого варианта есть сервисы-конструкторы. Coze.com позволяет собрать бота с веб-интерфейсом, подключить базу знаний и вывести в Telegram за полчаса. Я пробовал — работает, но кастомный код даёт больше контроля.
Что я понял
Настройка своего ИИ-ассистента в Telegram — это не магия и не rocket science. Это конструктор, где главное — понять, зачем тебе именно свой бот, а не просто ChatGPT в браузере.
Если задача в скорости и удобстве — ставь готовый конструктор, через час будешь пользоваться. Если хочешь что-то кастомное, разобраться в базовом Python и Bot API — хорошая инвестиция. Мне хватило пары вечеров, чтобы довести до рабочего состояния то, чем я теперь пользуюсь каждый день.
Главное — не пытаться сразу запихать всё. Я начинал с мега-проекта на пять экранов и загнал себя в тупик. Простой работающий прототип оказался и быстрее, и полезнее.
