-
Notifications
You must be signed in to change notification settings - Fork 5
Telegram
Управление мультиинстансными Telegram ботами с независимыми настройками AI, TTS, воронкой продаж и платежами.

Система поддерживает несколько Telegram ботов одновременно. Каждый бот:
- Запускается как отдельный субпроцесс Python
- Имеет независимый LLM бэкенд, персону и системный промпт
- Может иметь свою воронку продаж (квиз, сегменты, агентские промпты)
- Поддерживает кнопки действий с переопределением AI-настроек
- Принимает платежи (Telegram Stars, YooKassa, YooMoney)
- Управляется (start/stop/restart) из админ-панели
Левая панель отображает все инстансы:
| Элемент | Описание |
|---|---|
| Индикатор | Зелёный = запущен, серый = остановлен |
| Название | Имя бота |
| Enabled | Включён ли бот |
| Действия | Start / Stop / Restart / Delete |
- Откройте @BotFather в Telegram
- Отправьте
/newbot - Введите имя и username
- Скопируйте токен (формат:
123456:ABC-DEF...)
- Нажмите "Добавить бота" в админ-панели
- Введите название и вставьте токен
- Настройте параметры (см. ниже)
- Нажмите "Сохранить"
Из названия автоматически генерируется slug-ID (например, "Sales Bot" → sales-bot).
Конфигурация организована по вкладкам:
| Параметр | Описание |
|---|---|
| Название | Отображаемое имя инстанса |
| Токен | Bot API токен (маскируется: ***1234) |
| API URL | Опциональный tunnel/proxy URL для Telegram API |
| Описание | Описание бота |
| Enabled | Включить/отключить бот |
| Параметр | Описание |
|---|---|
| Allowed Users | JSON-массив Telegram User IDs (пустой = все допущены) |
| Admin Users | JSON-массив User IDs с правами администратора бота |
| Параметр | Описание |
|---|---|
| Welcome | Приветственное сообщение при /start
|
| Unauthorized | Сообщение при отказе в доступе |
| Error | Сообщение при ошибке |
| Typing | Показывать индикатор "печатает..." |
| Параметр | Описание |
|---|---|
| LLM Backend |
vllm, gemini или cloud:{provider_id}
|
| Персона |
anna или marina
|
| System Prompt | Кастомный системный промпт |
| LLM Params | JSON с параметрами: temperature, max_tokens, top_p
|
| Параметр | Описание |
|---|---|
| Engine |
xtts, piper или openvoice
|
| Voice | ID голоса (anna, marina) |
| Preset | Опциональный пресет TTS |
| Параметр | Описание | По умолчанию |
|---|---|---|
| Rate Limit Count | Максимум сообщений за период | 5 |
| Rate Limit Hours | Период в часах | 5 |
- Список активных пользовательских сессий
- User ID, username, количество сообщений
- Кнопка "Очистить все сессии"
Кнопки действий позволяют переключать режим разговора внутри бота:
| Поле | Описание |
|---|---|
| Label | Текст кнопки |
| Icon | Emoji-иконка |
| LLM Backend | Переопределение бэкенда (опционально) |
| System Prompt | Переопределение промпта (опционально) |
| LLM Params | Переопределение параметров (опционально) |
| Order | Порядок отображения (drag & drop) |
Когда пользователь нажимает кнопку, бот переключает «режим» — все последующие ответы используют настройки кнопки вместо дефолтных.
Многосекционная вкладка для настройки продаж:
Вопросы с вариантами ответа, отображаемые как inline-кнопки:
{
"question_key": "budget_q1",
"text": "Какой ваш бюджет?",
"order": 1,
"options": [
{"label": "До 100k", "value": "low", "icon": "📉"},
{"label": "100k-500k", "value": "medium", "icon": "📊"},
{"label": "500k+", "value": "high", "icon": "📈"}
]
}Правила матчинга по ответам квиза → назначение агентского промпта:
| Поле | Описание |
|---|---|
| Segment Key | Уникальный ключ |
| Path |
diy, basic, custom, qualified, unqualified, needs_analysis
|
| Match Rules | JSON правила: {"budget_q1": "high", "timeline_q2": "immediate"}
|
| Agent Prompt | Ссылка на агентский промпт |
Системные промпты для каждого сегмента с параметрами:
-
system_prompt— промпт для LLM -
temperature,max_tokens— параметры генерации
- Follow-up правила — автоматические сообщения через N часов
- Отзывы — social proof (текст, автор, рейтинг)
- A/B тесты — тестирование вариантов промптов
- Статистика — подписчики, события воронки
| Параметр | Описание |
|---|---|
| Payment Enabled | Включить платежи |
| Telegram Stars | Встроенные Stars-платежи |
| YooKassa Token | Provider Token для YooKassa |
| Products | Массив товаров: title, price_rub, price_stars
|
| Success Message | Сообщение после оплаты |
- Введите
client_idиclient_secret - Нажмите "Подключить кошелёк" → OAuth-авторизация в popup
- После подключения отображается номер кошелька
- Кнопка "Отключить" отзывает токен
| Кнопка | Действие | Эффект на auto_start |
|---|---|---|
| Start | Запустить субпроцесс | auto_start = true |
| Stop | Остановить (SIGTERM → 5с → SIGKILL) | auto_start = false |
| Restart | Stop + Start | Без изменений |
Боты с auto_start = true автоматически запускаются при старте оркестратора. Флаг устанавливается при первом запуске и снимается при остановке.
- Просмотр последних 100 строк лога бота
- Лог-файл:
logs/telegram_bot_{instance_id}.log
POST /admin/telegram/instances/{id}/start
→ MultiBotManager.start_bot(id)
→ Спавнит: python -m telegram_bot
→ ENV: BOT_INSTANCE_ID={id}, BOT_INTERNAL_TOKEN={jwt}
→ Логи: logs/telegram_bot_{id}.log
Внутри субпроцесса:
-
TelegramBotServiceзагружает конфиг через API оркестратора - Регистрирует хендлеры и middleware (включая
UserTrackerMiddleware) - Запускает polling
Middleware telegram_bot/middleware/user_tracker.py автоматически регистрирует пользователей при первом обращении к боту:
- При каждом входящем сообщении проверяется, зарегистрирован ли
user_idкак подписчик - Если нет — отправляет
POST /admin/sales/{instance_id}/register-userв оркестратор - Сохраняет
telegram_user_id,username,first_nameв таблицуbot_subscribers - Кэширует известных пользователей в памяти, чтобы не делать лишних запросов
- Работает прозрачно — не блокирует обработку сообщений при ошибках
При ответе на сообщение, конфиг LLM определяется по приоритету:
- Action Button — если пользователь нажал кнопку действия
- Сегмент воронки — если пользователь прошёл квиз и попал в сегмент
-
Дефолт бота —
system_prompt+llm_backendинстанса
| Команда | Описание |
|---|---|
/start |
Приветствие + квиз (если настроен) |
/help |
Список команд |
/new |
Сбросить контекст (новая сессия) |
/status |
Статистика бота (только для админов) |
/pay |
Меню товаров для оплаты |
| Метод | Валюта | Описание |
|---|---|---|
| Telegram Stars | XTR | Встроенные платежи Telegram |
| YooKassa | RUB | Invoice через Telegram Payments API |
| YooMoney | RUB | Inline-кнопка → Quickpay URL → webhook |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /admin/telegram/instances |
Список всех инстансов |
| POST | /admin/telegram/instances |
Создать инстанс |
| GET | /admin/telegram/instances/{id} |
Конфиг инстанса |
| PUT | /admin/telegram/instances/{id} |
Обновить инстанс |
| DELETE | /admin/telegram/instances/{id} |
Удалить инстанс |
| POST | /admin/telegram/instances/{id}/start |
Запустить бота |
| POST | /admin/telegram/instances/{id}/stop |
Остановить бота |
| POST | /admin/telegram/instances/{id}/restart |
Перезапустить бота |
| GET | /admin/telegram/instances/{id}/status |
Статус + счётчик сессий |
| GET | /admin/telegram/instances/{id}/sessions |
Список сессий |
| DELETE | /admin/telegram/instances/{id}/sessions |
Очистить сессии |
| GET | /admin/telegram/instances/{id}/logs |
Последние N строк лога |
| GET | /admin/telegram/instances/{id}/payments |
История платежей |
| GET | /admin/telegram/instances/{id}/payments/stats |
Статистика выручки |
| Метод | Endpoint | Описание |
|---|---|---|
| GET/POST/PUT/DELETE | .../prompts |
Агентские промпты |
| GET/POST/PUT/DELETE | .../quiz |
Квиз-вопросы |
| GET/POST/PUT/DELETE | .../segments |
Сегменты |
| GET/POST/PUT/DELETE | .../followups |
Follow-up правила |
| GET/POST/PUT/DELETE | .../testimonials |
Отзывы |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | .../yoomoney/auth-url |
URL для OAuth |
| GET | .../yoomoney/callback |
OAuth callback |
| GET | .../yoomoney/status |
Статус кошелька |
| POST | .../yoomoney/disconnect |
Отключить кошелёк |
- Admin — видит и управляет всеми ботами в workspace
-
User/Web — только свои боты (
owner_id) - Guest — только чтение
Все CRUD-эндпоинты и action-эндпоинты (start/stop/restart/logs/sessions) фильтруются по workspace_id из JWT. Системные методы (get_auto_start_instances, get_instance_with_token) и публичные эндпоинты (payments, bot session registration, YooMoney callback) не фильтруются — работают без JWT-контекста.