Skip to content

Concierge ​

Назначение ​

Внешний AI-портал поддержки Unishift для партнёров и интеграторов. Отдельные аккаунты (cs_users), отдельный UI (:4201 в dev), чат с агентами AI Router, эскалации к модераторам платформы, автоформатеры номеров заявок, интеграционный блок через Flow Manager, авто-создание чатов/партнёров и подсистема фильтров чатов с разделением прав кураторов.

Модераторская админка живёт в основном клиенте (:4200) и ходит в concierge через Gateway. Внешние пользователи ходят в сервис напрямую (CORS + concierge-JWT).

Порты ​

  • HTTP: 8106 (хост в Docker: 18106)
  • БД: concierge_db
  • UI (dev): web/apps/concierge на порту 4201

Ключевые возможности ​

  • Passwordless-логин внешних пользователей: request-login шлёт одноразовый пароль через Notifications, login выдаёт concierge-JWT (HS256, тот же JWT_SECRET)
  • Чаты и ветки: мульти-партнёрские чаты (cs_chat_members), ветки-threads, зеркалирование сообщений в cs_messages
  • Прокси в AI Router: provisioning чата (CreateChat) и SendMessage с agent_id
  • Автоформатеры заявок (cs_formatters): регулярные выражения для автоматического преобразования номеров заявок (например #INC-1024, #TASK-8821) в кликабельные ссылки. Аудитория partner / staff / both — кто видит ссылки: партнёры во внешнем портале, пользователи системы в админке или оба.
  • Интеграция с Flow Manager (Внешние нотификации и форвардинг):
    • Входящие: прием вебхуков внешних систем (банки, CRM, алерты) через inputHttpRequestNode / serviceNode во Flow Manager и сохранение в Concierge через POST /api/v1/external/notifications (sender_type = "external" / "system").
    • Обратный форвардинг: при ответе пользователя или модератора на внешнее сообщение создаётся NATS-событие unishift.concierge.message_replied, которое обрабатывается в пайплайне Flow Manager (inputEventNode) для отправки ответа во внешнюю систему.
  • Provisioning API: POST /api/v1/external/provision-chat для автоматического создания партнёра и чата со стартовым сообщением прямо из API или сценариев Flow Manager
  • Embed-режим (iframe & postMessage):
    • Встраивание внешнего портала через <iframe> (?embed=true, ?token=..., ?chat_id=..., ?theme=dark|light)
    • CSP заголовок Content-Security-Policy: frame-ancestors ...
    • Поддержка postMessage для обмена событиями (CONCIERGE_EVENT, new_message, chat_loaded) и управления (CONCIERGE_SET_TOKEN, CONCIERGE_OPEN_CHAT)
  • Фильтры/группы чатов и разграничение доступа (cs_chat_filters, cs_user_filters):
    • Настройки → Чаты (/concierge/settings/chats): создание/удаление чатов, сниппеты, ассистент, партнёры; кто видит чат через фильтры
    • Настройки → Фильтры (/concierge/settings/filters): группы с сотрудниками и чатами; создание и правка — /concierge/filters/new и /concierge/filters/:id
    • Куратор без назначенного фильтра не видит чаты (deny by default)
    • Администратор и пользователь с правом редактирования Concierge видят все чаты
  • Массовые уведомления (cs_broadcasts):
    • Рассылка одного уведомления сразу в группу чатов с акцентным оформлением (is_notification = true, цветная плашка, левый акцентный бордюр, бейдж)
    • Поддержка ссылок в тексте, прикрепления изображений и файлов (concierge-media)
    • Веб-раздел в настройках Concierge (/concierge/settings/notifications) с фильтрацией чатов, прикреплением файлов и живым предпросмотром
    • Метод в Starlark для Flow Manager: up.concierge.send_notification(...) / broadcast(...) с выборкой чатов по названиям или маске
  • Эскалации: кнопка «вызвать модератора» → cs_escalations(pending) → ответ модератора закрывает эскалацию
  • Сниппеты: глобальные и per-chat, видны во внешнем UI
  • Брендинг: заголовок, логотипы, плейсхолдер композера
  • Rate limiting: логин 5/мин, сообщения 20/час (cs_rate_limits)
  • Real-time: прямая публикация событий в Centrifugo HTTP API

Аутентификация ​

КлиентТокенКуда ходит
Внешний пользовательconcierge-JWT (POST /auth/login)concierge :8106 напрямую
Внешние сервисы / Flow ManagerService-Token (X-Service-Token) или StaffAuthconcierge :8106 (/external/*)
Модератор из основного UIplatform JWT (admin / секции concierge)Gateway → concierge
Локальный модератор conciergeconcierge-JWT с ролью moderatorconcierge :8106

Real-time и NATS события ​

Centrifugo WebSocket ​

Namespace concierge. Токен: GET /api/v1/auth/socket-token.

КаналКто подписанСобытия
concierge:user:{userID}внешний пользовательai_response, moderator_message, user_message, escalation_answered, chat_status, typing
concierge:adminмодераторыuser_message, escalation_created, chat_status, typing

NATS Event Bus (Flow Manager Forwarding) ​

SubjectОписаниеPayload
unishift.concierge.message_repliedОтвет пользователя/модератора на внешнее сообщение{ "chat_id": "...", "message_id": "...", "reply_to_id": "...", "external_source": "bank_tinkoff", "external_id": "evt_123", "reply_content": "...", "sender_type": "user" }

Структура БД ​

ТаблицаНазначение
cs_usersВнешние аккаунты и модераторы concierge
cs_chatsЧат партнёров; title; user_id — первый партнёр; ссылки на ai-router chat/provider и агента
cs_chat_membersСостав чата (партнёр может быть в нескольких чатах)
cs_partnersКарточка пользователя: email, ФИО, компания, телефон, примечание
cs_threadsВетки внутри чата (parent_id — вложенность)
cs_messagesСообщения (external_source, external_id, external_metadata)
cs_agentsЗеркало агентов AI Router (ai_router_agent_id, slug, is_default)
cs_formattersПравила автоформатирования ссылок на заявки (pattern, link_template, is_enabled, audience: partner / staff / both)
cs_chat_filtersГруппы/фильтры чатов (title, description, criteria)
cs_user_filtersНазначенные кураторам фильтры ограничения доступа (user_id, filter_id)
cs_escalationsЭскалации pending / закрытые
cs_snippetsГлобальные и chat-scoped сниппеты
cs_chat_snippetsНазначение глобальных сниппетов чату
cs_brandingSingleton внешнего UI
cs_rate_limitsБакеты лимитов (identifier, action, window_start)

API ​

Базовый путь — /api/v1. Swagger: http://localhost:8106/swagger/index.html.

Публично ​

МетодПутьОписание
POST/auth/request-loginОтправить одноразовый пароль на email
POST/auth/loginОбменять пароль на concierge-JWT
GET/brandingПубличный брендинг логина

Пользователь (concierge-JWT) ​

МетодПутьОписание
GET/auth/meТекущий пользователь
GET/auth/socket-tokenJWT для Centrifugo
GET/chatsСписок чатов пользователя
GET/chatТранскрипт; ?chat_id= выбирает чат
POST/chat/messagesОтправить сообщение (chat_id в теле)
GET/chat/messagesИстория (chat_id, thread_id)
POST/chat/typingИндикатор набора (chat_id)
POST · GET/chat/threadsВетки (chat_id)
POST/chat/escalateЭскалация к модератору (chat_id)
GET/snippetsСниппеты, видимые в чате
GET/formattersАктивные правила для партнёров (audience = partner или both)

Интеграции & Flow Manager (ServiceTokenAuth / StaffAuth) ​

МетодПутьОписание
POST/external/notificationsСоздать внешнее сообщение/нотификацию в чате
POST/external/broadcastМассовая рассылка уведомлений по chat_ids, chat_names или паттерну
GET/external/chatsСписок всех чатов для интеграций
POST/external/provision-chatАвто-создать пользователя, партнера и чат с начальным сообщением

Модератор (/admin, StaffAuth) ​

МетодПутьОписание
GET · POST/admin/chats · /admin/chats/:idСписок (с учётом кураторских фильтров), создание, карточка
POST · DELETE/admin/chats/:id/partnersДобавить / убрать партнёра в чате
POST/admin/chats/:id/messagesСообщение модератора
PUT/admin/chats/:id/title · /agent · /snippet · /status · /escalationУправление чатом
GET · PUT/admin/escalationsОчередь эскалаций
GET · POST · PUT · DELETE/admin/snippetsГлобальные сниппеты
GET · POST · PUT · DELETE/admin/formattersУправление автоформатерами
GET · POST · PUT · DELETE/admin/filters · /admin/filters/:idУправление фильтрами/группами чатов
GET · PUT/admin/filters/:id/usersСотрудники платформы, назначенные на фильтр
GET · PUT/admin/users/:id/filtersПолучить / назначить фильтры пользователю
POST/admin/partners/provisionProvisioning партнёра и чата из админки
GET · PUT/admin/brandingБрендинг
POST/admin/inviteПригласить партнёра
GET · POST/admin/partnersСписок и создание карточек партнёров (chats — все чаты, где партнёр участник)
PUT/admin/partners/:idОбновить контакты партнёра
GET/admin/usersСписок пользователей
PUT/admin/users/:id/statusactive / banned
GET/admin/agentsАгенты
PUT/admin/agents/:id/defaultАгент по умолчанию
POST/admin/broadcastМассовая отправка уведомлений по выбранным чатам
GET/admin/broadcastsИстория массовых рассылок

Интеграции ​

СервисЗачем
Flow ManagerВходящие нотификации в Concierge (/external/notifications) и обработка форвардинга ответов (unishift.concierge.message_replied)
AI RouterЧаты и агенты; RAG-scope concierge (CONCIERGE_RAG_SCOPE)
NotificationsПисьма с одноразовым паролем / инвайтом
GatewayПрокси админки из основного UI (CONCIERGE_SERVICE_URL)
AuthСекция concierge_chats (concierge_settings держится равным ей). Чаты — view/edit; Настройки (/concierge/settings, редактор фильтров) только при edit
CentrifugoКаналы concierge:*, origin внешнего UI (:4201) в allowed_origins

Конфигурация ​

ПеременнаяПо умолчаниюОписание
PORT8106HTTP
DB_NAMEconcierge_dbБД
JWT_SECRET— (обяз.)Подпись concierge-JWT и проверка platform-JWT
SERVICE_TOKEN— (обяз.)Вызовы AI Router, Notifications и вызовы от Flow Manager
MESSAGING_URLnats://localhost:4222URL NATS для публикации событий форвардинга ответов
AI_ROUTER_SERVICE_URLhttp://localhost:8101AI Router
NOTIFICATIONS_SERVICE_URLhttp://localhost:8103Notifications
CONCIERGE_WEB_URLhttp://localhost:4201Внешний UI (ссылки в письмах)
CONCIERGE_CORS_ORIGINShttp://localhost:4201CORS и CSP frame-ancestors, через запятую
CONCIERGE_EMAIL_FROMconcierge@unishift.ruFrom в письмах
AI_ROUTER_PROVIDER_ID—Провайдер для provisioning чата
CONCIERGE_RAG_SCOPEconciergeRAG-scope базы знаний портала
RATE_LIMIT_LOGIN5Логинов в минуту
RATE_LIMIT_CHAT_MESSAGES20Сообщений в час
CENTRIFUGO_URLhttp://localhost:8100HTTP API Centrifugo
CENTRIFUGO_API_KEY—Ключ HTTP API
CENTRIFUGO_CLIENT_TOKEN_HMAC_SECRET_KEYJWT_SECRETПодпись connection-токена
CENTRIFUGO_WS_URLws://localhost:8100/connection/websocketURL для браузера внешнего UI