Skip to content

Mobile: TG/WhatsApp/Widget/Share buttons per assistant #776

@ShaerWare

Description

@ShaerWare

Что хотим

В мобильном приложении в меню списка ассистентов (раскрывающийся switcher над чатом) напротив каждого ассистента добавить 4 кнопки:

  1. Telegram — клик открывает поле ввода bot token. После сохранения ассистент становится TG-ботом: в личке отвечает на все сообщения, в группах — когда упомянули (@mention / reply), по аналогии с TG-ботом DigiTax.
  2. WhatsApp — то же, но для WA Cloud API. Поле для access token + phone_number_id.
  3. Виджет — выбор цвета кнопки (primary_color) + сгенерированный embed-снippet для вставки на сайт.
  4. Поделиться — поиск пользователей секретаря, multi-select. Выбранные юзеры видят этот чат у себя в мобильном приложении и в админке (web).

«Ассистент» в мобилке = ChatSession (см. mobile/src/views/ChatView.vue:179 loadAvailableAssistants).

Что уже есть в бэкенде

  • BotInstance (modules/channels/telegram/models.py) — конфиг бота: token, system_prompt, RAG, LLM, persona, TTS, allowed_users, payments, sales_funnel
  • WhatsAppInstance (modules/channels/whatsapp/models.py) — phone_number_id, access_token, system_prompt, RAG, LLM
  • WidgetInstance (modules/channels/widget/models.py) — title, greeting, primary_color, position, system_prompt, RAG, LLM
  • ChatSessionShare (modules/chat/models.py:274) — шаринг чат-сессий
  • GET /admin/chat/shareable-users — поиск пользователей для шаринга
  • TG/WA боты создают per-user ChatSession через LLMRouter (telegram_bot/services/llm_router.py:73)
  • CRUD + start/stop для всех инстансов есть
  • Public widget: GET /widget.js?instance={id} (modules/channels/widget/router_public.py:40)

Главный архитектурный вопрос

Как связать ассистента (сессию) с инстансом TG/WA/виджета?

Вариант A — клонировать конфиг сессии в новый инстанс

При создании TG-бота из ассистента: создаём BotInstance с system_prompt/RAG/LLM скопированными из ChatSession.

  • ➕ без миграций схемы
  • ➖ при правке system_prompt у ассистента — не подхватится ботом, нужна кнопка «sync»
  • Привязка идентифицируется по name/тегу (например assistant-{session_id})

Вариант B — добавить FK chat_session_id в инстансы (рекомендуется)

В BotInstance/WhatsAppInstance/WidgetInstance — nullable FK на chat_sessions.id. Раннеры читают system_prompt/RAG/LLM live из сессии.

  • ➕ единый источник правды, изменения подхватываются автоматически
  • ➕ чистый список привязок в мобилке (фильтр по FK)
  • ➖ миграция в 3 таблицах + правки в telegram_bot//whatsapp_bot//widget runner для чтения конфига из linked-сессии
A (clone) B (FK)
Миграций 0 1 (3 таблицы)
Изменения в ботах нет читать конфиг из сессии
Sync system_prompt вручную автоматом

Скорее всего идём по B.

Открытые вопросы по скоупу

  1. 1:1 или 1:N? — один ассистент = один TG-бот / одна WA-инстанция / один виджет, или несколько?
  2. Виджет: какие поля настраиваются в мобилке? Только primary_color, или сразу title/greeting/position/button_size?
  3. TG бот в группах — поведение «отвечать только на @mention / reply» уже реализовано в telegram_bot/? Если нет — это часть скоупа.
  4. WA в группах — Cloud API не поддерживает группы (только 1:1). Только личка?
  5. Шаринг чата с другим юзером — копия или live? Если live: оба видят одну историю (как Google Docs); если копия: каждый получает свою. Текущий ChatSessionShare, судя по всему, делает live-доступ.
  6. Перевод TG-бота в режим «привязан к ассистенту» не должен сломать существующие 1+ боты в проде (DigiTax, новостной). Миграция должна выставить chat_session_id=NULL для них и оставить как есть.

Предлагаемое разбиение на PR-ы

Делать одной волной слишком крупно. Разбиваю по возрастанию сложности:

  • PR 1: Поделиться — кнопка + модал поиска юзеров + multi-share через существующий ChatSessionShare. Минимум бэкенда, в основном UI.
  • PR 2: Виджет — модал с color picker + сниппет. Создаёт WidgetInstance (вариант A) или линкуется (вариант B). Здесь же — миграция для FK, если идём по B.
  • PR 3: Telegram — модал с токеном, валидация через getMe, создание BotInstance с auto_start, проверка group-mention поведения.
  • PR 4: WhatsApp — модал с access_token + phone_number_id, создание WhatsAppInstance.

UI-эскиз (мобилка)

В mobile/src/views/ChatView.vue panel showAssistantSwitcher — рендерим строки ассистентов. Под каждым именем — ряд из 4 иконок (TG / WA / виджет / share). Клик открывает bottom-sheet с формой.

Иконки: lucide-vue-nextSend (TG), MessageCircle (WA), Code2 (виджет), Share2 (share). Активное состояние (привязка существует) — амбер; неактивное — стоун-400.

Связанные файлы

  • mobile/src/views/ChatView.vue — switcher (~line 1100, 1580)
  • mobile/src/api/chat.ts, admin.ts — добавить новые методы
  • modules/channels/telegram/router.py, models.py
  • modules/channels/whatsapp/router.py, models.py
  • modules/channels/widget/router.py, router_public.py, models.py
  • modules/chat/router.py — share endpoints
  • alembic/versions/ — новая миграция (если B)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions