Интеграции

Telegram-бот с GPT на Python (aiogram) через AI Gateway

Развёрнутый пример Telegram-бота с AI на Python: aiogram и OpenAI SDK с base_url AI Gateway, память диалога, системный промпт и защита от перерасхода через лимиты ключа.

2 минуты чтения

Соберём Telegram-бота на aiogram, который помнит контекст диалога и держит расход под контролем. Это развёрнутая версия базового рецепта со страницы инструмента Telegram-бот: добавим память по каждому пользователю, системный промпт и лимиты. Модель зовём через OpenAI SDK, направленный на AI Gateway.

Подготовка

Нужны два секрета: токен бота от @BotFather (/newbot) и ключ AI Gateway sk-aigate-… из кабинета. Для бота заведите отдельный ключ со своей месячной квотой и RPM-лимитом. Базовый URL — https://ai-gatewey.ru/v1. Оба секрета читаем из окружения.

pip install aiogram openai

Реализация

  1. Клиент и хранилище диалогов

    Настраиваем AsyncOpenAI на AI Gateway и заводим на каждого пользователя короткую историю сообщений (deque с ограничением длины — так контекст не растёт бесконечно):

    import os
    from collections import defaultdict, deque
    from openai import AsyncOpenAI
    
    ai = AsyncOpenAI(
        base_url="https://ai-gatewey.ru/v1",
        api_key=os.environ["AIGATE_API_KEY"],
    )
    
    SYSTEM = {"role": "system", "content": "Ты дружелюбный ассистент. Отвечай кратко и по делу."}
    # по 10 последних реплик на пользователя
    history: dict[int, deque] = defaultdict(lambda: deque(maxlen=10))
  2. Обработчик с памятью диалога

    Перед запросом добавляем реплику пользователя в его историю и передаём модели системный промпт плюс контекст; ответ тоже кладём в историю:

    from aiogram.types import Message
    
    async def on_message(msg: Message):
        hist = history[msg.from_user.id]
        hist.append({"role": "user", "content": msg.text})
    
        resp = await ai.chat.completions.create(
            model="deepseek/deepseek-chat",
            messages=[SYSTEM, *hist],
        )
        answer = resp.choices[0].message.content
        hist.append({"role": "assistant", "content": answer})
        await msg.answer(answer)
  3. Команда сброса контекста

    Дадим пользователю способ начать диалог заново — команду /reset, которая чистит его историю:

    from aiogram.filters import Command
    
    async def on_reset(msg: Message):
        history.pop(msg.from_user.id, None)
        await msg.answer("Контекст очищен.")
  4. Сборка и запуск

    Регистрируем хендлеры и запускаем polling. Расход по токенам виден в кабинете AI Gateway в реальном времени:

    import asyncio
    from aiogram import Bot, Dispatcher
    
    bot = Bot(os.environ["TELEGRAM_TOKEN"])
    dp = Dispatcher()
    dp.message.register(on_reset, Command("reset"))
    dp.message.register(on_message)
    
    asyncio.run(dp.start_polling(bot))
Токен бота и ключ AI Gateway держите в переменных окружения, не в коде. В публичном боте поток сообщений большой: заведите ключу месячную квоту и RPM-лимит, добавьте простой rate-limit на пользователя и обрезайте историю — иначе пиковая нагрузка приведёт к сюрпризам по расходу.

Какие модели подойдут

В ботах много коротких запросов, поэтому важнее скорость и цена за обращение, чем максимальный интеллект:

МодельВвод, ₽/1МВывод, ₽/1МКонтекст
DeepSeek: DeepSeek V331125128K
OpenAI: GPT-5.4 Mini118705400K
Anthropic Claude Haiku Latest157784200K
Актуальные цены каталога AI Gateway за 1 млн токенов. Все модели →

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

Почему история хранится в deque, а не в базе?

deque(maxlen=…) в памяти — простейший вариант для старта: он сам вытесняет старые реплики. Для продакшена контекст лучше держать в Redis или БД, иначе после перезапуска бота диалоги обнулятся.

Как ограничить число запросов на пользователя?

Добавьте middleware aiogram с проверкой частоты (например, не чаще N сообщений в минуту на from_user.id). Это защищает и от спама, и от неожиданного расхода на публичном боте.

Можно ли включить стриминг ответа?

Да, но в Telegram нет «печатающегося» текста: обычно копят чанки и раз в несколько токенов редактируют сообщение через edit_text. Для большинства ботов проще отдавать готовый ответ целиком.

Telegram-бот с AI на Python — начните с ключа

Получить ключ