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

Система поддерживает несколько WhatsApp ботов одновременно. Каждый бот:
- Запускается как отдельный субпроцесс Python (аналогично Telegram ботам)
- Использует WhatsApp Cloud API (Meta Business Platform)
- Имеет независимый LLM бэкенд, персону и системный промпт
- Может иметь свою воронку продаж (квиз, сегменты, агентские промпты)
- Поддерживает интерактивные сообщения (quick reply, list messages)
- Управляется (start/stop/restart) из админ-панели
- Зарегистрируйтесь на Meta for Developers
- Создайте Business App → добавьте продукт WhatsApp
- Получите Phone Number ID и WhatsApp Business Account ID (WABA ID)
- Сгенерируйте Permanent Access Token (System User → Generate Token)
- Задайте Verify Token (произвольная строка для верификации webhook)
- Скопируйте App Secret из настроек приложения
WhatsApp требует публичный HTTPS URL для вебхука:
- Используйте ngrok или Cloudflare Tunnel:
ngrok http 8003 # порт webhook бота - В Meta Developer Portal → WhatsApp → Configuration:
- Callback URL:
https://your-tunnel.ngrok.io/webhook - Verify Token: тот же, что в настройках бота
- Подписка на:
messages
- Callback URL:
Левая панель отображает все инстансы:
| Элемент | Описание |
|---|---|
| Индикатор | Зелёный = запущен, серый = остановлен |
| Название | Имя бота |
| Enabled | Включён ли бот |
| Действия | Start / Stop / Restart / Delete |
- Нажмите "Добавить бота" в админ-панели
- Введите название
- Заполните данные WhatsApp Cloud API (см. выше)
- Настройте AI параметры
- Нажмите "Сохранить"
Из названия автоматически генерируется slug-ID (например, "Support Bot" → support-bot).
Конфигурация организована по вкладкам:
| Параметр | Описание |
|---|---|
| Название | Отображаемое имя инстанса |
| Phone Number ID | ID номера телефона из Meta Business |
| WABA ID | WhatsApp Business Account ID |
| Access Token | Постоянный токен доступа (маскируется) |
| Verify Token | Токен верификации вебхука |
| App Secret | Секрет приложения для проверки подписи вебхука |
| Webhook Port | Порт для приёма вебхуков (по умолчанию: 8003) |
| Enabled | Включить/отключить бот |
| Параметр | Описание |
|---|---|
| LLM Backend |
vllm, gemini или cloud:{provider_id}
|
| System Prompt | Кастомный системный промпт |
| LLM Params | JSON с параметрами: temperature, max_tokens, top_p
|
| Параметр | Описание |
|---|---|
| TTS Enabled | Включить голосовые ответы |
| Engine |
xtts, piper или openvoice
|
| Voice | ID голоса (anna, marina) |
| Preset | Опциональный пресет TTS |
При включённом TTS бот отправляет аудио-сообщения вместе с текстовыми ответами.
| Параметр | Описание |
|---|---|
| Allowed Phones | Список разрешённых номеров телефонов (пустой = все допущены) |
| Blocked Phones | Список заблокированных номеров |
| Параметр | Описание | По умолчанию |
|---|---|---|
| Rate Limit Count | Максимум сообщений за период | 5 |
| Rate Limit Hours | Период в часах | 5 |
WhatsApp бот поддерживает полную воронку продаж, аналогичную Telegram:
WhatsApp использует два типа интерактивных элементов:
| Тип | Ограничения | Использование |
|---|---|---|
| Quick Reply | ≤3 кнопки, заголовок ≤20 символов | Простые ответы да/нет, навигация |
| List Message | ≤10 секций, ≤10 строк | Квиз-вопросы, каталоги, FAQ-разделы |
- Вопросы квиза отображаются как list messages
- Сегментация (DIY/Basic/Custom) импортируется из модуля Telegram (
telegram_bot.sales.segments) - Логика
determine_segment(),GPU_AUDIT,calculate_quote()— общая, без дублирования
| Сегмент | Описание |
|---|---|
| DIY | GPU-аудит, ссылка на GitHub |
| Basic | Презентация ценности, демо, оформление заказа |
| Custom | 5-шаговый discovery, расчёт стоимости, альтернативы |
WhatsApp не поддерживает встроенные платежи (как Telegram Stars), поэтому:
- YooMoney: ссылка на оплату в тексте сообщения
- Контактная информация для связи с менеджером
FAQ-разделы идентичны Telegram:
-
Продукт (5 вопросов):
what_is,offline,security,vs_cloud,cloud_models -
Установка (3 вопроса):
hardware,install,integrations -
Цены и поддержка (3 вопроса):
price,support,free_trial
Навигация: faq:cat_* → раздел, faq:{key} → ответ, faq:back_* → назад к разделу.
| Ограничение | Решение |
|---|---|
| Нет URL-кнопок | Ссылки в тексте сообщения |
| Нет редактирования сообщений | Новое сообщение на каждое взаимодействие |
| List = single-select | Последовательный выбор с кнопками "Ещё"/"Готово" |
*bold* вместо **bold**
|
Адаптированные шаблоны текстов |
| Кнопка | Действие | Эффект на auto_start |
|---|---|---|
| Start | Запустить субпроцесс | auto_start = true |
| Stop | Остановить (SIGTERM → 5с → SIGKILL) | auto_start = false |
| Restart | Stop + Start | Без изменений |
Боты с auto_start = true автоматически запускаются при старте оркестратора. Флаг устанавливается при первом запуске и снимается при остановке.
Периодический task bot-process-watcher (каждые 30с) обнаруживает завершённые бот-процессы и через EventBus:
-
Логирует — событие
process_diedв Audit (канал, exit_code, uptime) -
Перезапускает — автоматически при crash (exit_code ≠ 0) с экспоненциальным backoff:
- 3 попытки: 10с → 20с → 30с
- Счётчик рестартов сбрасывается после стабильной работы >60с
- После исчерпания попыток — только аудит, статус "failed"
- Пропускает — graceful stop (exit_code = 0) не перезапускается
Подробнее о событиях: Audit#process_died
- Просмотр последних 100 строк лога бота
- Лог-файл:
logs/whatsapp_bot_{instance_id}.log
POST /admin/whatsapp/instances/{id}/start
→ WhatsAppManager.start_bot(id)
→ Спавнит: python -m whatsapp_bot
→ ENV: WA_INSTANCE_ID={id}, WA_INTERNAL_TOKEN={jwt}
→ Логи: logs/whatsapp_bot_{id}.log
Внутри субпроцесса:
- Бот загружает конфиг через API оркестратора (используя
WA_INTERNAL_TOKEN) - Запускает webhook-сервер на указанном порту
- Принимает входящие сообщения от WhatsApp Cloud API
- Маршрутизирует: приветствия → воронка, FAQ → ответы, остальное → LLM
Incoming webhook → Signature verification (X-Hub-Signature-256)
→ Text message:
1. Проверка приветствия (9 триггерных слов) → Welcome buttons
2. Проверка funnel_state (свободный ввод: custom_step_1, diy_gpu_custom)
3. Fallback → LLM через orchestrator API
→ Interactive reply:
→ Routing по prefix:action формату:
sales:* → handlers/sales/router.py
faq:* → FAQ навигация
tz:* → TZ генератор
nav:* → Общая навигация
Каждый WhatsApp бот хранит данные воронки в отдельной SQLite БД:
- Файл:
data/wa_sales_{instance_id}.db - Таблицы:
users,events,custom_discovery - Ключ пользователя: номер телефона (TEXT)
- Колонка
funnel_stateдля отслеживания состояния свободного ввода
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /admin/whatsapp/instances |
Список всех инстансов |
| POST | /admin/whatsapp/instances |
Создать инстанс |
| GET | /admin/whatsapp/instances/{id} |
Конфиг инстанса |
| PUT | /admin/whatsapp/instances/{id} |
Обновить инстанс |
| DELETE | /admin/whatsapp/instances/{id} |
Удалить инстанс |
| POST | /admin/whatsapp/instances/{id}/start |
Запустить бота |
| POST | /admin/whatsapp/instances/{id}/stop |
Остановить бота |
| POST | /admin/whatsapp/instances/{id}/restart |
Перезапустить бота |
| GET | /admin/whatsapp/instances/{id}/status |
Статус бота |
| GET | /admin/whatsapp/instances/{id}/logs |
Последние N строк лога |
| Метод | Endpoint | Описание |
|---|---|---|
| GET |
/webhook (на порту webhook_port) |
Верификация вебхука (challenge) |
| POST |
/webhook (на порту webhook_port) |
Приём входящих сообщений |
- Admin — видит и управляет всеми ботами в workspace
-
User/Web — только свои боты (
owner_id) - Guest — только чтение
Все CRUD-эндпоинты и action-эндпоинты (start/stop/restart/status/logs) фильтруются по workspace_id из JWT. Системные методы (get_auto_start_instances, get_instance_with_token) не фильтруются — работают без JWT-контекста.
python scripts/migrate_whatsapp.pyСоздаёт таблицу whatsapp_instances со всеми полями конфигурации.