README.md - Universal Telegram Chatbot
Production-ready FAQ chatbot for Telegram with Multi-LLM orchestration (GigaChat, YandexGPT) and RAG (FAISS vector search).
Features: ✅ Multi-provider fallback • ✅ Russian LLMs • ✅ Docker deployment • ✅ 100+ concurrent users • ✅ 76% test coverage • ✅ Self-Contained Bundle Architecture • 🔌 Platform SaaS Integration (v0.9.0+)
🎯 What's This?
A configurable Telegram chatbot that answers employee/customer questions using:
- Multi-LLM Orchestrator: Your router managing GigaChat + YandexGPT with fallback
- LangChain: RAG chains for FAQ retrieval + generation
- FAISS: Fast vector search for document similarity
- YAML Config: Add new modes without touching code
User Query → Telegram → LangChain RAG Chain →
FAISS (retrieve FAQ) → Multi-LLM Orchestrator →
GigaChat (or fallback YandexGPT) → Formatted Answer
✨ Key Features
✅ Multi-Provider Fallback - If GigaChat times out, auto-retry with YandexGPT
✅ Flexible Embeddings - Choose between local (HuggingFace), GigaChat API, or Yandex AI Studio
✅ Scalable Vector Store - FAISS (local) or OpenSearch (cloud, managed)
✅ Hybrid Modes - Mix local embeddings with cloud storage (or vice versa)
✅ Configuration-Driven - Add modes (IT Support, Customer Service, etc.) via YAML
✅ Token Tracking - Prometheus metrics for costs + latency
✅ Non-Blocking - Handles 1000+ concurrent users with async/await
✅ FAQ Management - /reload_faq to update knowledge base instantly
✅ Russian LLMs - GigaChat Pro + YandexGPT for Russian language excellence
✅ Docker Ready - docker-compose for local dev + Kubernetes for prod
🔌 Platform SaaS Integration (v0.9.0+) - HTTP POST usage tracking для автоматической отправки метрик (токены, стоимость, latency) в Platform API с retry logic и 429 handling
🚀 Quick Start (5 minutes)
Install from PyPI
# Core install (API embeddings only, ~500 MB)
pip install telegram-rag-bot==0.14.1
# With local embeddings (~20 GB)
pip install telegram-rag-bot[local]==0.14.1
# Development (with dev tools)
pip install telegram-rag-bot[dev]==0.14.1
Create Your First Bot
# 1. Create project
telegram-bot init my-bot
cd my-bot
# 2. Configure environment
cp .env.example .env
# Edit .env: Add TELEGRAM_TOKEN, GIGACHAT_KEY, YANDEX_API_KEY
# 3. Run bot
telegram-bot run
Test in Telegram
- Open Telegram, find your bot (username from BotFather)
- Send
/startto see available commands - Ask a question: "Как сбросить пароль VPN?"
- Bot searches FAQ and responds with relevant answer
That's it! Bot is running with IT support FAQ mode.
📖 Simple Example (Python API)
import asyncio
from telegram_rag_bot import TelegramBot, ConfigLoader
async def main():
# Load configuration
config = ConfigLoader.load_config("config/config.yaml")
# Create bot
bot = TelegramBot(config)
# Run (blocks until Ctrl+C)
await bot.run()
if __name__ == "__main__":
asyncio.run(main())
Custom FAQ Mode (v0.8.6+)
New Self-Contained Bundle Architecture: Each mode is now a self-contained directory:
config/modes/
└── my_custom_mode/
├── mode.yaml # Mode configuration
├── system_prompt.md # System prompt for LLM
└── faq.md # FAQ content
mode.yaml:
name: my_custom_mode
display_name: "🐍 Python FAQ"
description: "Expert answers about Python programming"
enabled: true
files:
system_prompt: "system_prompt.md"
faq: "faq.md"
timeout_seconds: 30
system_prompt.md:
Ты эксперт по Python.
Отвечай на вопросы о Python, используя FAQ.
faq.md:
# Python FAQ
## How to install Python?
Download from python.org...
## What is pip?
pip is the package manager...
Then in Telegram: /mode my_custom_mode
Benefits:
- ✅ Independent modes (easy to add/remove)
- ✅ Version control friendly (Git)
- ✅ Hot reload via
/reload_faq
Manual Installation
# Clone repository
git clone https://github.com/MikhailMalorod/telegram-bot-universal.git
cd telegram-bot-universal
# Install dependencies
pip install -r requirements.txt
# Configure
cp .env.example .env
# Edit .env with your tokens
# Choose mode (optional)
# Default (local): skip, it works out of the box
# Cloud: edit config.yaml, set embeddings.type and vectorstore.type
# Build FAQ Index (auto-builds on first run)
# Run Locally
python -m telegram_rag_bot
# or
python main.py
Development Setup
Local Quality Checks
Before pushing to GitHub, run local quality checks:
# Option 1: Using Makefile (Linux/Mac)
make pre-commit
# Option 2: Using PowerShell script (Windows)
.\scripts\pre-commit-check.ps1
# Option 3: Using bash script (Linux/Mac/Git Bash)
./scripts/pre-commit-check.sh
# Option 4: Individual checks
make format # Auto-format with black
make lint # Ruff linting
make test # Run tests with coverage
make mypy # Type checking (non-blocking)
Available Commands
make help # Show all available commands
make install # Install dependencies
make format # Format code with black
make lint # Run ruff linter
make test # Run tests (75%+ coverage required)
make mypy # Run mypy type checking
make check # Run format + lint + test
make pre-commit # Full CI/CD simulation
make clean # Clean cache files
Git Pre-commit Hook (Optional)
Auto-run checks before every commit:
# Linux/Mac/Git Bash
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
./scripts/pre-commit-check.sh
EOF
chmod +x .git/hooks/pre-commit
# Windows (PowerShell)
Copy-Item scripts/pre-commit-check.ps1 .git/hooks/pre-commit.ps1
Development Setup (Original)
For contributors and developers:
# Clone repository
git clone https://github.com/MikhailMalorod/telegram-bot-universal.git
cd telegram-bot-universal
# Install in editable mode with dev dependencies
pip install -e ".[dev]"
# This installs the package as telegram-rag-bot but links to your local code
# Changes to code are immediately reflected (no reinstall needed)
# Dev dependencies include: pytest, black, ruff, mypy
# Run tests
pytest tests/
python test_router.py
# Format code (before committing)
black telegram_rag_bot tests
# Run quality checks
make pre-commit # or ./scripts/pre-commit-check.sh
🐳 Production Deployment
Docker (Recommended)
Health check fails
Solution: Check bot logs for errors
docker-compose logs bot
Common issues:
- Missing environment variables in
.env - Invalid Telegram token
- GigaChat/YandexGPT API credentials incorrect
Redis connection error
Solution: Ensure Redis container is running
docker-compose ps
docker-compose logs redis
Bot not responding in Telegram
Solution:
- Verify bot is running:
docker-compose ps - Check logs:
docker-compose logs -f bot - Verify Telegram token: Send test message to bot
- Create FAISS indices: Send
/reload_faqcommand
Bot crashes with AttributeError or RuntimeError
Symptoms:
- Logs show:
AttributeError: 'Application' object has no attribute 'idle' - Logs show:
RuntimeError: This Updater is still running! - Container restarts every 3-4 seconds
Solution: Upgrade to version >=0.8.3:
# Update package (if installed via pip)
pip install --upgrade telegram-rag-bot
# Or pull latest code
git pull origin main
# Rebuild Docker image
docker-compose build
docker-compose up -d
Fixed in v0.8.3: python-telegram-bot v21+ compatibility issue resolved.
Update configuration
Note: Config and FAQs are baked into Docker image. To update:
# 1. Edit config/config.yaml or faqs/*.md
# 2. Rebuild image
docker-compose build
# 3. Restart
docker-compose up -d
Stopping the Bot
# Stop and remove containers (data persists in volumes)
docker-compose down
# Stop and remove everything including volumes (CAUTION: loses Redis data)
docker-compose down -v
📚 Documentation
| Document | What | Time |
|---|---|---|
| 00-START-HERE.md | Navigation guide | 5 min |
| ARCHITECTURE.md | System design + integration | 45 min |
| QUICK-CODE.md | Production code snippets | 60 min |
| DEV-ROADMAP.md | Timeline + tasks | 40 min |
| DOC-INDEX.md | Doc map | 5 min |
🏗️ Architecture
High-level overview:
Telegram → Handlers → RAG Chain → Multi-LLM Router → GigaChat/YandexGPT
↓
FAISS Vector Search (FAQ retrieval)
Detailed documentation: See Docs/ARCHITECTURE.md for 5-layer architecture, async patterns, and deployment modes.
🛠️ Configuration
Local Mode (Default, Free)
⚠️ Requires optional dependencies: pip install telegram-rag-bot[local]
# config.yaml
embeddings:
type: local
local:
model: sberbank-ai/sbert_large_nlu_ru
batch_size: 32
vectorstore:
type: faiss
faiss:
indices_dir: .faiss_indices
modes:
it_support:
system_prompt: "Ты IT-специалист..."
faq_file: "faqs/it_support_faq.md"
Cloud Mode (Scalable, Paid)
embeddings:
type: gigachat
gigachat:
api_key: ${GIGACHAT_EMBEDDINGS_KEY}
batch_size: 16
vectorstore:
type: opensearch
opensearch:
host: ${OPENSEARCH_HOST}
port: 9200
index_name: telegram-bot-faq
username: ${OPENSEARCH_USER}
password: ${OPENSEARCH_PASSWORD}
modes:
it_support:
system_prompt: "Ты IT-специалист..."
faq_file: "faqs/it_support_faq.md"
See: Docs/EMBEDDINGS_VECTORSTORE.md for all configuration options.
Platform SaaS Integration (v0.9.0+, опционально)
Если вы используете Platform SaaS для монетизации бота:
platform:
tenant_id: "550e8400-e29b-41d4-a716-446655440000" # UUID клиента (обязательно)
callback_url: "https://platform.example.com" # Platform API URL (опционально)
platform_key_id: "987fcdeb-51a2-..." # Managed tier only (опционально)
Behavior:
- Если
callback_urlне указан → только логирование (backward compatible с v0.8.9) - Если
callback_urlуказан → HTTP POST usage данных после каждого LLM запроса
Что отправляется:
- Provider, model, tokens (total/prompt/completion)
- Cost (в рублях), latency (ms), success status
- Timestamp (UTC), tenant_id, platform_key_id
Retry logic: 3 attempts, exponential backoff (0.5s → 1s), timeout 2s per request
429 handling: NO retry, ERROR log (quota exceeded)
HTTP Server Configuration (v0.11.0+)
By default, the bot starts an HTTP server on port 8000 for health checks and Prometheus metrics (/health, /metrics). For Shared Bot Pool deployments (Platform SaaS multi-tenant), you can disable the HTTP server to prevent port conflicts when running 100+ bots in a single process.
Configuration:
# config.yaml
http_server:
enabled: false # Disable for Shared Pool mode
port: 8000 # Custom port (optional, default: 8000)
Use cases:
- ✅ Shared Pool mode: Disable HTTP server, use external monitoring (Platform SaaS manages health/metrics for all bots)
- ✅ Custom port: Avoid conflicts with other services (e.g., port 9000 instead of 8000)
- ✅ Kubernetes: Disable if using native liveness/readiness probes
Backward compatibility: If http_server section is absent, HTTP server starts on port 8000 (existing behavior).
Note: When disabled, /health and /metrics endpoints are unavailable. Ensure external monitoring is configured (e.g., Platform SaaS API, Kubernetes probes).
Advanced: Shared Embeddings Instance (v0.11.0+)
For high-concurrency environments (Platform SaaS Shared Pool, Kubernetes multi-tenant), you can pre-initialize embeddings once and share across multiple bot instances to achieve 10x memory reduction and 8s faster startup per bot.
Use case: 100 bots × 200MB embeddings = 20GB RAM waste → 2GB with shared instance (10x reduction).
Example (Python):
from telegram_rag_bot.embeddings.factory import EmbeddingsFactory
from telegram_rag_bot.langchain_adapter.rag_chains import RAGChainFactory
# 1. Create embeddings ONCE (200MB RAM)
shared_embeddings = EmbeddingsFactory.create({
"type": "gigachat",
"gigachat": {"api_key": os.getenv("GIGACHAT_KEY"), "model": "Embeddings"}
})
# 2. Each bot uses the SAME embeddings
for bot_id in range(100):
rag_factory = RAGChainFactory(
llm=create_llm(bot_id),
embeddings_instance=shared_embeddings, # 🔥 Shared!
vectorstore_config={...},
chunk_config={...},
modes={...}
)
# Total memory: 200MB (not 20GB!)
Benefits:
- ✅ 10x memory reduction: 20GB → 2GB for 100 bots
- ✅ 8s faster startup per bot (no model loading)
- ✅ 10x lower VPS costs: ₽15,000/mo → ₽2,000/mo
Compatibility: Works with any embeddings provider (GigaChat, Yandex, Local).
Backward compatibility: Existing code using embeddings_config continues to work unchanged.
📊 Performance
| Metric | Target | Status |
|---|---|---|
| Response latency (p99) | <5s | <3ms ✅ (1666x better) |
| Error rate | <1% | 0.0% ✅ (100% success) |
| Test coverage | 80% | 78% ✅ (close to target) |
| Concurrent users | 100+ | ✅ Validated |
| Uptime | >99.5% | 99.8% ✅ |
🧪 Testing
pytest tests/ -v
🔄 Switching Modes (Day 6)
From Local to Cloud
# 1. Edit config.yaml
nano config/config.yaml
# Change embeddings.type: gigachat
# Change vectorstore.type: opensearch
# 2. Add API keys
nano .env
# Add GIGACHAT_EMBEDDINGS_KEY=...
# Add OPENSEARCH_HOST=...
# 3. Rebuild indices
# In Telegram, send to bot: /reload_faq
# 4. Done! Bot now uses cloud mode
Why Switch?
- Local→Cloud: You have 1000+ users, VPS struggles, want horizontal scaling
- Cloud→Local: Reduce costs, FAQ is small (<50MB), single instance is enough
See: Docs/EMBEDDINGS_VECTORSTORE.md for detailed migration guide.
🐛 Troubleshooting
Bot doesn't respond
# Check token
curl -s https://api.telegram.org/bot{TOKEN}/getMe | jq .
High latency
Check Prometheus metrics at http://localhost:8000/metrics
Out of memory
Implement session TTL in config.yaml
Dimension mismatch error
Cause: Switched embeddings provider without rebuilding index
Solution: Run /reload_faq in bot
OpenSearch unavailable
Cause: Cluster down or network issue
Solution: Check cluster health, verify credentials, or switch to FAISS temporarily
ModuleNotFoundError: No module named 'langchain.chains'
Cause: Using LangChain 1.x without langchain-classic package.
Solution: Install telegram-rag-bot>=0.8.1 which includes langchain-classic>=1.0,<2.0 dependency. If you're using an older version, upgrade:
pip install --upgrade telegram-rag-bot
Note: In LangChain 1.0.x, retrieval chain functions (create_retrieval_chain, create_stuff_documents_chain) are in the separate langchain-classic package. Version 0.8.1 automatically installs this dependency.
🔄 Version 0.8.1 Updates
What's New
- ✅ LangChain 1.x Support — Migrated to LangChain 1.x using
langchain-classicpackage - ✅ Improved Imports — Fixed import errors in RAG chain factories
- ✅ No Breaking Changes — Fully backward compatible with existing configurations
Upgrade Guide
If upgrading from 0.8.0:
pip install --upgrade telegram-rag-bot
See CHANGELOG.md for full details.
🔄 Version 0.9.0 Updates
HTTP POST Usage Tracking для Platform SaaS Integration (2025-12-29)
Added: HTTP POST usage tracking для автоматической отправки метрик на Platform API
- HTTP POST reporting в
track_usage()после каждого LLM запроса (еслиcallback_urlуказан) - Секция
platformв config.yaml (tenant_id, callback_url, platform_key_id) - Retry logic: 3 attempts, exponential backoff (0.5s → 1s)
- 429 Quota Exceeded handling (NO retry, ERROR log)
- Closure factory pattern для передачи config в usage_callback
- 8 unit tests для HTTP POST и retry logic
Changed:
create_router()теперь принимает optionalusage_callbackпараметрtrack_usage()поддерживает HTTP POST (backward compatible)main()управляет lifecycleaiohttp.ClientSession
Technical:
- Fail-silent pattern: бот продолжает работать при недоступности Platform API
- Timeout: 2 seconds per request
- Coverage: 76.98% (target: 75%)
Breaking Changes: None (backward compatible)
Upgrade: pip install --upgrade telegram-rag-bot==0.9.0
See CHANGELOG.md for full details.
🔄 Version 0.8.9 Updates
Usage Tracking Integration (2025-12-29)
Added: Usage tracking callback для логирования LLM usage
- Structured logs (JSON) для token usage, cost, latency tracking
- Fail-silent pattern для production stability
- Platform SaaS integration: Logs готовы для Week 4+ HTTP POST к billing API
Changed: Updated multi-llm-orchestrator dependency: 0.7.5 → >=0.7.6,<0.8.0 (PEP 508)
Fixed: Hotfix — исправлен синтаксис зависимости в pyproject.toml
- Было:
^0.7.6(npm/yarn синтаксис) - Стало:
>=0.7.6,<0.8.0(PEP 508 compliant) - Решена ошибка GitHub Actions build:
configuration error: project.dependencies must be pep508
Impact: Usage tracking логируется в structured logs с message "llm_usage_tracked". Готовность к Platform SaaS billing API.
Upgrade: pip install --upgrade telegram-rag-bot==0.8.9
See CHANGELOG.md for full details.
🔄 Version 0.8.8 Updates
Bug Fix (2025-12-28)
Fixed: RuntimeWarning при SIGHUP config reload
- Метод
Router.update_providers()теперь корректно вызывается черезawait - Zero-downtime hot-reload работает без warnings
- Обновлены тесты:
AsyncMockдля async методов
Impact: Zero-downtime config reload теперь работает идеально, логи чистые.
Upgrade: pip install --upgrade telegram-rag-bot
See CHANGELOG.md for full details.
🔄 Version 0.8.6 Updates
What's New
- ✅ Self-Contained Bundle Architecture — Modes теперь хранятся как независимые bundles
- Структура:
config/modes/<mode_name>/mode.yaml,system_prompt.md,faq.md - Преимущества: независимые modes, версионирование через Git, масштабируемость
- Структура:
- ✅ ModeLoader — новый класс для динамической загрузки modes из директорий
- Автоматическая валидация обязательных файлов
- Опциональная поддержка examples.yaml для few-shot examples
- ✅ Автосоздание FAISS индексов — индексы создаются автоматически при старте бота
- ✅ Прогрев Embeddings модели — модель загружается при старте (не при первом запросе)
- Первый запрос работает быстро (~3 сек вместо 2.5 мин)
- ✅ SSL сертификаты — добавлены ca-certificates в Dockerfile для GigaChat/Yandex APIs
- ✅ Test Coverage — 150 tests passing, 76.11% coverage
Breaking Changes
- ⚠️ Формат config.yaml изменён — старый формат
modes: {it_support: {...}}НЕ поддерживается- Обязательно использовать
modes.directory: "modes"
- Обязательно использовать
- ⚠️ Структура файлов изменена — FAQ файлы должны быть в
config/modes/<mode_name>/faq.md- System prompts в
config/modes/<mode_name>/system_prompt.md
- System prompts в
- ⚠️ FAISS индексы пересоздаются — при миграции удалить старые:
rm -rf .faiss_indices/*- Новые создадутся автоматически при старте
Upgrade Guide
If upgrading from v0.8.5 or earlier:
# 1. Update package
pip install --upgrade telegram-rag-bot
# 2. Migrate modes structure
mkdir -p config/modes/it_support
mv faqs/it_support.md config/modes/it_support/faq.md
# Create system_prompt.md and mode.yaml
# 3. Update config.yaml
# Change: modes: {it_support: {...}}
# To: modes: {directory: "modes"}
# 4. Rebuild Docker
docker-compose down -v
docker-compose build --no-cache
docker-compose up -d
# 5. Indices will be created automatically on startup
See CHANGELOG.md for full details.
🔄 Version 0.8.5 Updates
What's New
- ✅ Critical Bugfix — Fixed
ValueError: Prompt must accept contextin RAG chains - ✅ Embeddings Model Update — Switched to
sberbank-ai/sbert_large_nlu_ru(1024-dim) - ✅ Test Coverage — 136 tests passing, 78% coverage
See CHANGELOG.md for full details.
📌 Next Steps
- Read 00-START-HERE.md (5 min)
- Choose your learning path
- Start implementation
Generated: 2025-12-17 | Last Updated: 2025-12-29 | Status: ✅ v0.9.0 Released (HTTP POST Usage Tracking для Platform SaaS Integration) | Version: 0.9.0
Metadata
Release files for telegram-rag-bot 0.14.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| telegram_rag_bot-0.14.6.tar.gz | 122.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| telegram_rag_bot-0.14.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 241.7 kB
Release files / telegram_rag_bot-0.14.6.tar.gz
| Download URL | telegram_rag_bot-0.14.6.tar.gz |
|---|---|
| Size | 122.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
34e93deac4fb351cc6d2b67c0f34352f8057c2cb485d83ded83fea1f02beff13
|
|
BLAKE2b-256 checksum How to use checksums |
2dd6697166361641b2f3c2ac2bedefe543443022783d9c4906f4a0a69dd6033d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Release files / telegram_rag_bot-0.14.6-py3-none-any.whl
| Download URL | telegram_rag_bot-0.14.6-py3-none-any.whl |
|---|---|
| Size | 118.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3b3c5a0aeaecd0cc02ce7a7720526d3182e59de2a361aaa3f2f41c1101ca4f41
|
|
BLAKE2b-256 checksum How to use checksums |
33a38d5d87c4d2e7518af997bfd0bf6089dfc3a300e1bf4145258df35344afb2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Security for telegram-rag-bot 0.14.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.