Appearance
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 напрямую |
| Модератор из основного UI | platform JWT (admin / секции concierge) | Gateway → concierge |
| Локальный модератор concierge | concierge-JWT с ролью moderator | concierge :8106 |
Внешний пользователь: статусы invited → active / 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_branding | Singleton внешнего 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-token | JWT для 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/status | active / 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 |
Конфигурация
| Переменная | По умолчанию | Описание |
|---|---|---|
PORT | 8106 | HTTP |
DB_NAME | concierge_db | БД |
JWT_SECRET | — (обяз.) | Подпись concierge-JWT и проверка platform-JWT |
SERVICE_TOKEN | — (обяз.) | Вызовы AI Router и Notifications |
AI_ROUTER_SERVICE_URL | http://localhost:8101 | AI Router |
NOTIFICATIONS_SERVICE_URL | http://localhost:8103 | Notifications |
CONCIERGE_WEB_URL | http://localhost:4201 | Внешний UI (ссылки в письмах) |
CONCIERGE_CORS_ORIGINS | http://localhost:4201 | CORS, через запятую |
CONCIERGE_EMAIL_FROM | concierge@unishift.ru | From в письмах |
AI_ROUTER_PROVIDER_ID | — | Провайдер для provisioning чата |
CONCIERGE_RAG_SCOPE | concierge | RAG-scope базы знаний портала |
RATE_LIMIT_LOGIN | 5 | Логинов в минуту |
RATE_LIMIT_CHAT_MESSAGES | 20 | Сообщений в час |
CENTRIFUGO_URL | http://localhost:8100 | HTTP API Centrifugo |
CENTRIFUGO_API_KEY | — | Ключ HTTP API |
CENTRIFUGO_CLIENT_TOKEN_HMAC_SECRET_KEY | JWT_SECRET | Подпись connection-токена |
CENTRIFUGO_WS_URL | ws://localhost:8100/connection/websocket | URL для браузера внешнего UI |