Telegram-бот с AI — один из самых популярных способов применения больших языковых моделей. В этом руководстве мы создадим полноценного Telegram-бота на Python с использованием aiogram 3 и ModelSwitch API. Бот будет поддерживать контекст диалога, выбор модели и потоковое редактирование сообщений.
Подготовка проекта
Установите необходимые зависимости и создайте структуру проекта:
pip install aiogram openai python-dotenv
Создайте файл .env с токенами:
# .env
TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
MODELSWITCH_API_KEY=msk_ваш_ключ
MODELSWITCH_BASE_URL=https://api.modelswitch.ru/v1
Получите токен бота у @BotFather в Telegram, а API-ключ — в личном кабинете ModelSwitch.
Основной код бота
Создайте файл bot.py с базовой логикой:
# bot.py
import os
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
from openai import AsyncOpenAI
from dotenv import load_dotenv
load_dotenv()
bot = Bot(token=os.environ["TELEGRAM_BOT_TOKEN"])
dp = Dispatcher()
ai_client = AsyncOpenAI(
base_url=os.environ["MODELSWITCH_BASE_URL"],
api_key=os.environ["MODELSWITCH_API_KEY"],
)
# Хранилище контекста диалогов: chat_id -> список сообщений
conversations: dict[int, list[dict]] = {}
MAX_CONTEXT_MESSAGES = 20
@dp.message(Command("start"))
async def cmd_start(message: types.Message):
await message.answer(
"Привет! Я AI-ассистент. Отправьте мне любое сообщение, "
"и я отвечу с помощью GPT-4o.
"
"Команды:
"
"/reset — очистить контекст диалога
"
"/model gpt-4o-mini — сменить модель"
)
@dp.message(Command("reset"))
async def cmd_reset(message: types.Message):
conversations.pop(message.chat.id, None)
await message.answer("Контекст диалога очищен.")
@dp.message()
async def handle_message(message: types.Message):
if not message.text:
return
chat_id = message.chat.id
if chat_id not in conversations:
conversations[chat_id] = []
conversations[chat_id].append({"role": "user", "content": message.text})
conversations[chat_id] = conversations[chat_id][-MAX_CONTEXT_MESSAGES:]
thinking_msg = await message.answer("Думаю...")
try:
response = await ai_client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Ты полезный ассистент в Telegram."},
*conversations[chat_id],
],
max_tokens=2000,
)
answer = response.choices[0].message.content or "Не удалось сгенерировать ответ."
conversations[chat_id].append({"role": "assistant", "content": answer})
await thinking_msg.edit_text(answer)
except Exception as e:
await thinking_msg.edit_text(f"Ошибка: {str(e)}")
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Потоковое редактирование сообщений
Для более приятного UX можно обновлять сообщение по мере генерации. Telegram ограничивает частоту редактирования (не чаще 1 раза в секунду), поэтому используем буферизацию:
import time
async def handle_message_streaming(message: types.Message):
chat_id = message.chat.id
if chat_id not in conversations:
conversations[chat_id] = []
conversations[chat_id].append({"role": "user", "content": message.text})
placeholder = await message.answer("...")
full_text = ""
last_update = 0
stream = await ai_client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Ты полезный ассистент."},
*conversations[chat_id],
],
stream=True,
)
async for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
full_text += delta
now = time.time()
# Обновляем не чаще раза в секунду
if now - last_update > 1.0:
await placeholder.edit_text(full_text + " ...")
last_update = now
await placeholder.edit_text(full_text)
conversations[chat_id].append({"role": "assistant", "content": full_text})
Деплой на сервер
Для запуска бота в продакшене используйте systemd-сервис или Docker:
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "bot.py"]
# docker-compose.yml
services:
telegram-bot:
build: .
env_file: .env
restart: unless-stopped
Запуск: docker compose up -d. Бот будет автоматически перезапускаться при сбоях.
Заключение
Мы создали полноценного Telegram-бота с AI через ModelSwitch: контекст диалога, streaming, обработка ошибок и Docker-деплой. Через ModelSwitch вы можете легко переключать модели (GPT-4o, Claude, Gemini) без изменения кода бота — достаточно поменять параметр model.