Skip to content

Concierge

Назначение

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

Модераторская админка живёт в основном клиенте (: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)
  • Один чат на пользователя, ветки-threads, зеркалирование сообщений в cs_messages
  • Прокси в AI Router: provisioning чата (CreateChat) и SendMessage с agent_id
  • Эскалации: кнопка «вызвать модератора» → cs_escalations(pending) → ответ модератора закрывает escalation
  • Сниппеты: глобальные и per-chat, видны во внешнем UI
  • Брендинг внешнего портала (заголовок, логотипы, плейсхолдер композера)
  • Админка модераторов: чаты, эскалации, сниппеты, инвайты, статус пользователей, агенты, брендинг
  • Доступ в админку: platform-admin JWT или локальный moderator-JWT concierge
  • Права в основном UI: секции concierge_chats / concierge_settings; набор permission может ограничить агентов (concierge_agent_ids)
  • Rate limiting в БД (cs_rate_limits): логин 5/мин, сообщения 20/час (настраивается)
  • Real-time: concierge публикует события напрямую в Centrifugo HTTP API (не через NATS Bridge)

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

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

Внешний пользователь: статусы invitedactive / banned, роли user / moderator.

Real-time

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

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

Формат тот же EventEnvelope, что у остальной платформы (id, type, data, timestamp).

Структура БД

ТаблицаНазначение
cs_usersВнешние аккаунты и модераторы concierge
cs_chatsОдин чат на пользователя; ссылки на ai-router chat/provider и агента
cs_threadsВетки внутри чата (parent_id — вложенность)
cs_messagesСообщения (user / assistant / moderator), ai_router_message_id
cs_agentsЗеркало агентов AI Router (ai_router_agent_id, slug, is_default)
cs_escalationsЭскалации pending / закрытые
cs_snippetsГлобальные и chat-scoped сниппеты
cs_chat_snippetsНазначение глобальных сниппетов чату
cs_brandingSingleton внешнего UI
cs_rate_limitsБакеты лимитов (identifier, action, window_start)

Статус чата: active / paused (paused — агент не отвечает, пока модератор не снимет паузу).

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/chatЧат текущего пользователя
POST/chat/messagesОтправить сообщение (прокси в AI Router)
GET/chat/messagesИстория
POST/chat/typingИндикатор набора
POST · GET/chat/threadsВетки
POST/chat/escalateЭскалация к модератору
GET/snippetsСниппеты, видимые в чате

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

МетодПутьОписание
GET/admin/chats · /admin/chats/:idСписок и карточка чата
POST/admin/chats/:id/messagesСообщение модератора
PUT/admin/chats/:id/agent · /snippet · /status · /escalationАгент, сниппет, пауза, закрытие эскалации
GET · PUT/admin/escalationsОчередь эскалаций
GET · POST · PUT · DELETE/admin/snippetsГлобальные сниппеты
GET · PUT/admin/brandingБрендинг
POST/admin/inviteПригласить внешнего пользователя
GET/admin/usersСписок пользователей
PUT/admin/users/:id/statusactive / banned
GET/admin/agentsАгенты
PUT/admin/agents/:id/defaultАгент по умолчанию

Интеграции

СервисЗачем
AI RouterЧаты и агенты; RAG-scope concierge (CONCIERGE_RAG_SCOPE)
NotificationsПисьма с одноразовым паролем / инвайтом
GatewayПрокси админки из основного UI (CONCIERGE_SERVICE_URL)
AuthСекции concierge_chats / concierge_settings и allow-list агентов на permission set
CentrifugoКаналы concierge:*, origin внешнего UI (:4201) в allowed_origins

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

ПеременнаяПо умолчаниюОписание
PORT8106HTTP
DB_NAMEconcierge_dbБД
JWT_SECRET— (обяз.)Подпись concierge-JWT и проверка platform-JWT
SERVICE_TOKEN— (обяз.)Вызовы AI Router и Notifications
AI_ROUTER_SERVICE_URLhttp://localhost:8101AI Router
NOTIFICATIONS_SERVICE_URLhttp://localhost:8103Notifications
CONCIERGE_WEB_URLhttp://localhost:4201Внешний UI (ссылки в письмах)
CONCIERGE_CORS_ORIGINShttp://localhost:4201CORS, через запятую
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