Представьте: у вас есть личный AI-ассистент в Telegram, который отвечает на вопросы, генерирует тексты и помогает с рутиной — и вы собрали его сами за полчаса. Это не фантастика, а реальный проект на Python с OpenAI API. В этом гайде мы пройдём путь от пустого файла до работающего бота с искусственным интеллектом.

Что мы будем строить

Наш бот будет принимать текстовые сообщения от пользователя, отправлять их в OpenAI API (модель GPT-4o-mini) и возвращать ответ прямо в чат Telegram. Дополнительно реализуем хранение контекста диалога — бот будет помнить, о чём вы говорили.


graph LR
    A[Пользователь] -->|Сообщение| B[Telegram API]
    B -->|Webhook / Polling| C[Python-бот]
    C -->|Запрос| D[OpenAI API]
    D -->|Ответ GPT| C
    C -->|Ответ| B
    B -->|Сообщение| A

Telegram-бот с AI — это не просто игрушка. Это полноценный инструмент, который можно адаптировать под поддержку клиентов, личного помощника или корпоративную базу знаний.

Шаг 1. Подготовка — что понадобится

Прежде чем писать код, нужно получить два ключа: токен Telegram-бота и API-ключ OpenAI.

Создание бота в Telegram

  1. Откройте Telegram и найдите @BotFather
  2. Отправьте команду /newbot
  3. Укажите отображаемое имя бота (например, «Мой AI Помощник»)
  4. Укажите username бота (должен заканчиваться на bot, например my_ai_helper_bot)
  5. Скопируйте полученный токен — строку вида 7123456789:AAHx...

Получение OpenAI API Key

  1. Зарегистрируйтесь на platform.openai.com
  2. Перейдите в раздел API KeysCreate new secret key
  3. Скопируйте ключ — он показывается только один раз
⚠ Безопасность ключей
Никогда не вставляйте API-ключи прямо в код. Используйте переменные окружения или .env файл. Если ключ утёк в публичный репозиторий — немедленно отзовите его.

Стоимость OpenAI API

Актуальные цены на апрель 2026:

МодельВвод (за 1M токенов)Вывод (за 1M токенов)Контекст
GPT-4o-mini$0.15$0.60128K токенов
GPT-4o$2.50$10.00128K токенов

Для бота с умеренной нагрузкой (100 сообщений в день) GPT-4o-mini обойдётся в менее $1 в месяц. Это оптимальный выбор для начала.

Шаг 2. Настройка проекта

Создайте папку проекта и установите зависимости.

mkdir ai-telegram-bot && cd ai-telegram-bot
python -m venv venv
source venv/bin/activate  # Linux/macOS
# venv\Scripts\activate   # Windows

pip install aiogram openai python-dotenv

Мы используем aiogram 3.x (актуальная версия — 3.27.0) — это современный асинхронный фреймворк для Telegram Bot API на Python. Альтернатива — python-telegram-bot (v22.7), но aiogram лучше подходит для асинхронной работы с внешними API.

Критерийaiogram 3.xpython-telegram-bot 22.x
АсинхронностьНативная (asyncio)Нативная (с v20+)
РоутингВстроенные роутерыHandlers
MiddlewareДаНет
Документация на русскомХорошая (автор из СНГ)Средняя
ПопулярностьПопулярен в РФ/СНГПопулярен глобально

Создайте файл .env в корне проекта:

TELEGRAM_BOT_TOKEN=7123456789:AAHxВашТокенЗдесь
OPENAI_API_KEY=sk-proj-ВашКлючЗдесь

Шаг 3. Пишем бота — основной код

Создайте файл bot.py:

import asyncio
import os
from dotenv import load_dotenv
from aiogram import Bot, Dispatcher, Router, F
from aiogram.types import Message
from aiogram.filters import CommandStart
from openai import AsyncOpenAI

load_dotenv()

bot = Bot(token=os.getenv("TELEGRAM_BOT_TOKEN"))
dp = Dispatcher()
router = Router()
dp.include_router(router)

# Клиент OpenAI (асинхронный)
client = AsyncOpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# Хранение истории диалогов: {user_id: [messages]}
conversations: dict[int, list[dict]] = {}

SYSTEM_PROMPT = (
    "Ты — полезный AI-ассистент. Отвечай кратко, по делу, на русском языке. "
    "Если не знаешь ответа — честно скажи об этом."
)


@router.message(CommandStart())
async def cmd_start(message: Message):
    user_id = message.from_user.id
    conversations[user_id] = []  # Сброс истории
    await message.answer(
        "Привет! Я AI-ассистент на базе GPT-4o-mini.\n"
        "Задайте мне любой вопрос, и я постараюсь помочь.\n\n"
        "Команды:\n"
        "/start — начать заново\n"
        "/clear — очистить контекст диалога"
    )


@router.message(F.text == "/clear")
async def cmd_clear(message: Message):
    conversations[message.from_user.id] = []
    await message.answer("Контекст очищен. Начнём с чистого листа!")


@router.message(F.text)
async def handle_message(message: Message):
    user_id = message.from_user.id

    # Инициализация истории, если её нет
    if user_id not in conversations:
        conversations[user_id] = []

    # Добавляем сообщение пользователя в историю
    conversations[user_id].append({
        "role": "user",
        "content": message.text
    })

    # Ограничиваем историю последними 20 сообщениями
    if len(conversations[user_id]) > 20:
        conversations[user_id] = conversations[user_id][-20:]

    # Отправляем индикатор "печатает..."
    await bot.send_chat_action(chat_id=message.chat.id, action="typing")

    try:
        response = await client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": SYSTEM_PROMPT},
                *conversations[user_id]
            ],
            max_tokens=1024,
            temperature=0.7,
        )

        assistant_message = response.choices[0].message.content

        # Сохраняем ответ в историю
        conversations[user_id].append({
            "role": "assistant",
            "content": assistant_message
        })

        await message.answer(assistant_message)

    except Exception as e:
        await message.answer(f"Произошла ошибка: {str(e)}")


async def main():
    print("Бот запущен!")
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())
ℹ Как работает контекст
Массив conversations хранит последние 20 сообщений для каждого пользователя. Это позволяет боту помнить контекст диалога, но не раздувать запросы к API. При 20 сообщениях стоимость одного запроса к GPT-4o-mini — доли цента.

Шаг 4. Запускаем и тестируем

python bot.py

Если всё настроено верно, вы увидите Бот запущен! в консоли. Откройте Telegram, найдите вашего бота по username и отправьте /start.


sequenceDiagram
    participant U as Пользователь
    participant T as Telegram
    participant B as bot.py
    participant O as OpenAI API

    U->>T: /start
    T->>B: Update (command)
    B->>T: "Привет! Я AI-ассистент..."
    T->>U: Приветственное сообщение

    U->>T: "Объясни квантовые вычисления"
    T->>B: Update (text)
    B->>B: Сохранить в conversations
    B->>T: typing...
    B->>O: chat.completions.create()
    O->>B: Ответ модели
    B->>B: Сохранить ответ
    B->>T: Текст ответа
    T->>U: Объяснение от GPT

Что проверить

  • Бот отвечает на /start приветствием
  • На текстовые сообщения приходит осмысленный ответ
  • /clear сбрасывает контекст — бот «забывает» предыдущий разговор
  • Бот помнит контекст в рамках диалога (спросите «а подробнее?» после первого вопроса)
💡 Отладка
Если бот не отвечает — проверьте токен Telegram (начинается с цифр), API-ключ OpenAI (начинается с sk-) и наличие средств на балансе OpenAI. Логи ошибок выводятся в консоль.

Шаг 5. Улучшения для продакшена

Базовый бот работает, но для реального использования стоит добавить несколько улучшений.

Rate limiting — защита от спама

from datetime import datetime, timedelta

user_last_message: dict[int, datetime] = {}
RATE_LIMIT_SECONDS = 3

@router.message(F.text)
async def handle_message(message: Message):
    user_id = message.from_user.id
    now = datetime.now()

    # Проверяем rate limit
    if user_id in user_last_message:
        diff = now - user_last_message[user_id]
        if diff < timedelta(seconds=RATE_LIMIT_SECONDS):
            await message.answer("Подождите немного перед следующим сообщением.")
            return

    user_last_message[user_id] = now
    # ... остальная логика

Стриминг ответов

Для длинных ответов полезно отправлять текст по частям, чтобы пользователь не ждал:

response = await client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[...],
    stream=True,
)

chunks = []
async for chunk in response:
    if chunk.choices[0].delta.content:
        chunks.append(chunk.choices[0].delta.content)

full_response = "".join(chunks)
await message.answer(full_response)

Варианты деплоя

ПлатформаБесплатный планПодходит для
Railway$5 кредит/месБыстрый старт
Render750 часов/месХобби-проекты
VPS (Timeweb, Selectel)от 150 ₽/месПолный контроль
Docker + свой серверПродакшен

Для деплоя на VPS достаточно:

# На сервере
git clone <ваш-репозиторий>
cd ai-telegram-bot
pip install -r requirements.txt
# Запуск через systemd или screen
nohup python bot.py &
📝 Идеи для развития
— Добавьте обработку голосовых сообщений через Whisper API
— Подключите генерацию изображений через DALL-E
— Реализуйте систему ролей: «переводчик», «копирайтер», «код-ревьюер»
— Сохраняйте историю в SQLite или Redis вместо словаря в памяти
— Добавьте инлайн-кнопки для выбора модели (GPT-4o-mini / GPT-4o)

Заключение

Мы прошли полный путь от идеи до работающего Telegram-бота с AI: зарегистрировали бота, подключили OpenAI API, написали обработку сообщений с хранением контекста и разобрали улучшения для продакшена.

Ключевые выводы:

  • Порог входа минимален — 50 строк кода на Python для рабочего прототипа
  • Стоимость низкая — GPT-4o-mini стоит $0.15 за миллион входных токенов, для личного бота это копейки
  • aiogram 3.x — лучший выбор для асинхронных ботов, особенно если вы из русскоязычного сообщества
  • Главное — безопасность — храните ключи в .env, ограничивайте rate limit, не давайте боту доступ к чувствительным данным

Лучший способ разобраться в AI — не читать о нём, а построить что-то работающее. Telegram-бот — идеальный первый проект: результат виден сразу, а дальше его можно развивать бесконечно.