-
Notifications
You must be signed in to change notification settings - Fork 5
Chat Sharing
Функция совместного доступа позволяет делиться чат-сессиями между пользователями системы. Владелец чата может предоставить другим пользователям доступ на чтение или запись, а получатель может создать собственную копию (форк) расшаренного чата.
В многопользовательской системе часто возникает потребность в совместной работе над диалогами с ИИ. Chat Sharing решает эту задачу:
- Совместная работа — несколько пользователей могут работать с одним чатом
-
Два уровня доступа —
read(только просмотр) иwrite(просмотр + отправка сообщений) -
Привязка к ветке — при расшаривании фиксируется текущая ветка диалога (
branch_message_id), получатель видит только сообщения до этой точки - Форк — получатель может создать глубокую копию чата к себе, чтобы продолжить диалог независимо
-
Только admin-чаты — расшарить можно только сессии с
source=admin(чаты из админ-панели), боты (Telegram, WhatsApp, Widget) не расшариваются
- Откройте нужный чат в разделе Chat
- Нажмите кнопку Share в заголовке чата (или в контекстном меню сессии)
- Откроется модальное окно
ChatShareDialog
В верхней части диалога:
- Поле поиска — начните вводить имя пользователя или отображаемое имя
- Выпадающий список — отфильтрованные пользователи (автоматически исключаются те, кому уже предоставлен доступ, и вы сами)
-
Выбор прав —
read(чтение) илиwrite(запись) через<select> - Кнопка добавления (UserPlus) — добавить выбранного пользователя
Под формой добавления отображается список пользователей, имеющих доступ:
| Элемент | Описание |
|---|---|
| Имя пользователя | display_name или username, с подписью @username |
| Бейдж прав |
read (синий) или write (жёлтый) — клик переключает между уровнями |
| Удалить | Кнопка Trash2 — отзыв доступа |
- Счётчик шаров — у расшаренных чатов отображается количество получателей
-
Метка — чаты, к которым вам предоставлен доступ, помечены как
is_shared_with_me -
Уровень доступа — поле
share_permissionпоказывает ваши права:owner,readилиwrite
| Роль | Может расшаривать | Примечание |
|---|---|---|
| admin | Да, любые сессии | Полный доступ ко всем чатам |
| user | Да, свои сессии | Только чаты с owner_id = user.id
|
| web | Да, свои сессии | Аналогично user |
| guest | Нет | Гости не могут расшаривать |
Список кандидатов (GET /admin/chat/shareable-users) включает:
- Всех активных пользователей (
is_active=True) - С ролями admin, user или web (гости исключены)
- Текущий пользователь исключён из списка (нельзя расшарить себе)
- read — может просматривать сообщения расшаренной ветки, но не может отправлять новые сообщения и удалять сессию
- write — может просматривать сообщения и отправлять новые в расшаренную ветку
- Получатель не может удалить расшаренную сессию — только владелец или admin
- Получатель видит только сообщения в пределах зафиксированной ветки (
branch_message_id)
При расшаривании система автоматически:
- Определяет последнее активное сообщение в текущей ветке
- Записывает его
idв полеbranch_message_idзаписи шара - Получатель видит только сообщения от корня до этой точки ветвления
- Переключение ветки (
switch_branch) для расшаренных пользователей ограничено видимой областью
Любой пользователь с доступом (кроме guest) может создать глубокую копию чата:
- Вызвать
POST /admin/chat/sessions/{id}/forkс опциональнымtitle - Система создаёт полную копию сессии (сообщения, промпт, контекстные файлы)
- Новый чат принадлежит вызвавшему пользователю (
owner_id = user.id) - Дальнейшие изменения в оригинале и форке независимы
| Метод | Путь | Описание |
|---|---|---|
GET |
/admin/chat/sessions/{id}/shares |
Список шаров сессии (owner/admin) |
POST |
/admin/chat/sessions/{id}/shares |
Расшарить сессию пользователю |
PUT |
/admin/chat/sessions/{id}/shares/{user_id} |
Изменить уровень доступа (read/write) |
DELETE |
/admin/chat/sessions/{id}/shares/{user_id} |
Отозвать доступ |
POST |
/admin/chat/sessions/{id}/fork |
Форк (глубокое копирование) сессии |
GET |
/admin/chat/shareable-users |
Список пользователей для расшаривания |
{
"user_id": 2,
"permission": "read"
}permission — "read" (по умолчанию) или "write".
{
"permission": "write"
}{
"title": "Копия чата (необязательно)"
}-
GET .../shares—{ "shares": [{ id, session_id, user_id, permission, shared_by, shared_at, username, display_name }] } -
POST .../shares—{ "share": { ... } } -
PUT .../shares/{user_id}—{ "status": "ok" } -
DELETE .../shares/{user_id}—{ "status": "ok" } -
POST .../fork—{ "session": { id, title, ... } }
| Действие | admin | user | web | guest |
|---|---|---|---|---|
| Расшарить свой чат | Да | Да | Да | Нет |
| Расшарить чужой чат | Да | Нет | Нет | Нет |
| Изменить права шара | Да (любой) | Да (свой) | Да (свой) | Нет |
| Удалить шар | Да (любой) | Да (свой) | Да (свой) | Нет |
| Форк расшаренного чата | Да | Да | Да | Нет |
| Просмотр расшаренного чата | Да | Да | Да | Нет |
| Удаление расшаренной сессии | Да | Только своей | Только своей | Нет |
Таблица chat_session_shares:
| Поле | Тип | Описание |
|---|---|---|
id |
INTEGER PK | Первичный ключ |
session_id |
VARCHAR(50) FK | Ссылка на chat_sessions.id (CASCADE) |
user_id |
INTEGER FK | Ссылка на users.id (CASCADE) — получатель |
permission |
VARCHAR(10) |
"read" или "write"
|
shared_by |
INTEGER FK | Ссылка на users.id — кто расшарил (SET NULL) |
shared_at |
DATETIME | Время расшаривания |
branch_message_id |
VARCHAR(50) | ID последнего сообщения ветки на момент шара |
Уникальный индекс: (session_id, user_id) — один пользователь может иметь только одну запись доступа к сессии.