Асинхронный Telegram-бот на Python и aiogram 3, который отправляет сообщения пользователей в языковую модель через OpenAI-совместимый API.
Проект поддерживает локальный запуск моделей через Ollama, а также подключение внешних LLM-провайдеров, например OpenAI и OpenRouter.
Проект работает в stateless-режиме: каждое сообщение обрабатывается независимо, без сохранения истории диалога.
- обработка команд
/startи/help; - асинхронное взаимодействие с Telegram Bot API;
- подключение к OpenAI-совместимым LLM API;
- переключение между локальными и внешними моделями через
.env; - настройка модели, API endpoint и таймаута без изменения кода;
- обработка таймаутов, сетевых ошибок и ошибок LLM-провайдера;
- отображение статуса
typingво время генерации ответа; - автоматическое разбиение длинных ответов на несколько сообщений;
- запуск локально или в Docker;
- хранение конфигурации и секретов в переменных окружения.
flowchart LR
User[Пользователь Telegram]
Bot[Telegram-бот<br/>aiogram]
Service[LLMService]
Provider[OpenAI-compatible API<br/>Ollama / OpenAI / OpenRouter]
User -->|Сообщение| Bot
Bot -->|Prompt| Service
Service -->|Chat Completions API| Provider
Provider -->|Ответ модели| Service
Service -->|Текст ответа| Bot
Bot -->|Сообщение| User
Каждый запрос проходит следующий путь:
- Пользователь отправляет текстовое сообщение боту.
- Обработчик
aiogramпередаёт текст вLLMService. LLMServiceотправляет запрос в выбранную языковую модель.- Полученный ответ возвращается пользователю.
- История предыдущих сообщений не сохраняется.
| Компонент | Технология |
|---|---|
| Язык | Python 3.11+ |
| Telegram-фреймворк | aiogram 3 |
| LLM-клиент | openai-python (AsyncOpenAI) |
| Конфигурация | pydantic-settings |
| Локальный LLM backend | Ollama |
| Контейнеризация | Docker, Docker Compose |
| Взаимодействие с LLM | OpenAI-compatible Chat Completions API |
llm_integration/
├── bot/
│ ├── __init__.py
│ ├── config.py # Загрузка и валидация переменных окружения
│ ├── handlers.py # Telegram-команды и обработка сообщений
│ └── llm_client.py # Асинхронный клиент для взаимодействия с LLM
├── .env.example # Пример конфигурации
├── .gitignore
├── Dockerfile # Сборка контейнера Telegram-бота
├── docker-compose.yml # Запуск бота и локальной Ollama
├── main.py # Точка входа
├── requirements.txt # Python-зависимости
└── README.md
Для запуска без Docker:
- Python 3.11 или новее;
- Telegram-бот и его токен;
- доступ к OpenAI-совместимому LLM API;
- Ollama — если используется локальная модель.
Для запуска в контейнерах:
- Docker;
- Docker Compose.
- Откройте Telegram.
- Найдите официального бота
@BotFather. - Выполните команду
/newbot. - Укажите имя и username нового бота.
- Скопируйте полученный токен.
- Добавьте токен в переменную
TELEGRAM_BOT_TOKENфайла.env.
Не публикуйте настоящий Telegram-токен и API-ключи в репозитории.
Скопируйте пример конфигурации:
cp .env.example .envДля Windows PowerShell:
Copy-Item .env.example .envОсновные переменные окружения:
| Переменная | Обязательная | Описание |
|---|---|---|
TELEGRAM_BOT_TOKEN |
да | Токен Telegram-бота |
LLM_BASE_URL |
да | URL OpenAI-совместимого API |
LLM_API_KEY |
да | API-ключ провайдера; для локальной Ollama может быть произвольным |
LLM_MODEL |
да | Название используемой модели |
LLM_TIMEOUT |
нет | Таймаут запроса к LLM в секундах; по умолчанию 60 |
TELEGRAM_BOT_TOKEN=your-telegram-bot-token
LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=tinyllama
LLM_TIMEOUT=60TELEGRAM_BOT_TOKEN=your-telegram-bot-token
LLM_BASE_URL=https://openrouter.ai/api/v1
LLM_API_KEY=your-openrouter-api-key
LLM_MODEL=qwen/qwen-2.5-7b-instruct
LLM_TIMEOUT=60TELEGRAM_BOT_TOKEN=your-telegram-bot-token
LLM_BASE_URL=https://api.openai.com/v1
LLM_API_KEY=your-openai-api-key
LLM_MODEL=gpt-4o-mini
LLM_TIMEOUT=60Названия и доступность облачных моделей зависят от выбранного провайдера.
git clone https://github.com/BulatKSMNT/llm_integration.git
cd llm_integrationLinux/macOS:
python3 -m venv .venv
source .venv/bin/activateWindows PowerShell:
python -m venv .venv
.venv\Scripts\Activate.ps1python -m pip install --upgrade pip
pip install -r requirements.txtLinux/macOS:
cp .env.example .envWindows PowerShell:
Copy-Item .env.example .envОткройте .env и укажите Telegram-токен и параметры LLM-провайдера.
python main.pyПосле успешного запуска откройте Telegram и отправьте боту команду:
/start
Установите Ollama и загрузите модель:
ollama pull tinyllamaУбедитесь, что Ollama запущена:
ollama serveНастройте .env:
TELEGRAM_BOT_TOKEN=your-telegram-bot-token
LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=tinyllama
LLM_TIMEOUT=60Запустите Telegram-бота:
python main.pyМожно использовать другую установленную в Ollama модель, указав её название
в переменной LLM_MODEL.
Текущий docker-compose.yml предназначен для запуска Telegram-бота вместе
с локальной Ollama.
cp .env.example .envУкажите настоящий токен:
TELEGRAM_BOT_TOKEN=your-telegram-bot-token
LLM_API_KEY=ollama
LLM_MODEL=tinyllama
LLM_TIMEOUT=60Внутри Docker Compose адрес Ollama автоматически устанавливается в:
http://ollama:11434/v1
docker compose up -d ollamadocker compose exec ollama ollama pull tinyllamaНазвание загруженной модели должно совпадать со значением LLM_MODEL
в файле .env.
docker compose up -d --build botdocker compose logs -f botdocker compose downЧтобы также удалить volume с загруженными моделями:
docker compose down -vВ текущем docker-compose.yml адрес LLM переопределяется адресом контейнера
Ollama. Для запуска бота с OpenAI, OpenRouter или другим внешним провайдером
можно собрать и запустить только контейнер бота:
docker build -t telegram-llm-bot .
docker run --rm --env-file .env telegram-llm-botВ этом случае значения LLM_BASE_URL, LLM_API_KEY и LLM_MODEL
будут загружены из файла .env.
| Команда | Описание |
|---|---|
/start |
Показывает приветствие и краткое описание бота |
/help |
Показывает справку по использованию |
| Любое текстовое сообщение | Отправляется в выбранную LLM |
Нетекстовые сообщения не отправляются в языковую модель.
Приложение обрабатывает основные ошибки при работе с LLM:
- превышение времени ожидания;
- отсутствие соединения с LLM API;
- ошибки внешнего провайдера;
- непредвиденные ошибки приложения;
- пустой ответ модели;
- ответы, превышающие ограничение одного сообщения Telegram.
Технические ошибки записываются в стандартный поток вывода через модуль
logging, а пользователю возвращается понятное сообщение без остановки бота.
История диалога не сохраняется. Каждый пользовательский запрос отправляется в модель независимо.
Преимущества:
- простая архитектура;
- отсутствие отдельного хранилища диалогов;
- предсказуемое потребление памяти;
- снижение количества отправляемых токенов;
- отсутствие сохранения пользовательских сообщений приложением.
Ограничение: модель не учитывает предыдущие сообщения пользователя.
Взаимодействие с моделью реализовано через AsyncOpenAI и
OpenAI-совместимый API. Для переключения провайдера достаточно изменить:
LLM_BASE_URL=...
LLM_API_KEY=...
LLM_MODEL=...Основную бизнес-логику Telegram-бота изменять не требуется.
- история диалога не сохраняется;
- бот обрабатывает только текстовые сообщения;
- отсутствует потоковая отправка ответа пользователю;
- отсутствует ограничение частоты запросов;
- отсутствует база данных;
- отсутствуют роли пользователей и административная панель;
- системный промпт и параметры генерации пока задаются в коде;
- тесты и CI/CD пока не добавлены;
- Docker Compose в текущей конфигурации ориентирован на локальную Ollama.
- Не добавляйте
.envв Git. - Не публикуйте Telegram Bot Token и API-ключи.
- Используйте
.env.exampleтолько как шаблон. - При компрометации Telegram-токена перевыпустите его через
@BotFather. - В production-окружении передавайте секреты через переменные окружения или систему управления секретами.
Файл .env уже добавлен в .gitignore.
Булат Хатыпов
- GitHub: BulatKSMNT
- Telegram: @khat911
Проект разработан как демонстрация интеграции Telegram-бота с локальными и облачными языковыми моделями через единый OpenAI-совместимый интерфейс. Проект разработан как демонстрация интеграции Telegram-бота с локальными и облачными языковыми моделями через единый OpenAI-совместимый интерфейс.