频道
频道把团队对话带入 Libre WebUI:公共和私有房间以及私信,支持话题串、回应、
置顶、未读跟踪、文件附件和 @model 回复,并与聊天使用同样持久、加密的基础设施。
频道类型与成员身份
| 类型 | 谁能查看 | 谁可加入 |
|---|---|---|
public | 所有人都能浏览 | 任何人可自行加入 |
private | 仅成员 | 所有者邀请成员 |
dm | 仅两位参与者 | 自动打开;始终恰好两人 |
成员身份是频道内容的唯一授权依据:每次读写(包括附件下载和实时事件交付)都会先检查 调用者是否为成员。非成员收到不会暴露资源存在的 404。全局管理员角色明确不授予频道 内容访问权。
公共或私有频道的创建者是所有者。所有者可重命名、归档、邀请(私有)、移除成员、 审核消息和删除频道;所有者只能通过删除频道离开,不能放弃。私信按参与者对去重: 与同一人打开 DM 总会进入同一会话。
时间线
消息构成持久、有序时间线,通过键集游标(created_at 加消息 ID)双向读取,因此
分页不会漏掉或重复条目。
- **幂等发布。**客户端提供消息身份;重试请求只会落到同一条目一次。
- **墓碑删除。**删除会清空内容但保留时间线条目,因此话题串不会悬空、顺序不会 改变。作者可删自己的消息,频道所有者可审核任何消息。
- 编辑仅限作者,并带
editedAt标记。 - **话题串只有一层。**任何根消息都可承载话题串;回复的回复会被拒绝。根消息实时 显示回复数。
- 回应按用户和表情符号记录,计数不重复。
- 置顶消息由成员维护,按频道列出。
频道名称、说明和消息内容与聊天消息采用相同边界进行静态加密。
未读状态
每个成员身份带单调递增的阅读游标。服务器按频道计算未读数(自己的消息永远不算
未读),POST /api/channels/:channelId/read 只推进游标;旧客户端无法让已读消息
重新变成未读。
实时交付
每次时间线变更都追加到持久事件流 channel:<id>,并通过
GET /api/channels/:channelId/events(SSE)分发。每次交付前都会重查成员身份,
因此移除成员会安全关闭其实时流。SQL 时间线仍是权威来源:错过事件的订阅者重新
读取时间线即可;账本用于交付,不代表事实本身。
附件
文件先上传(POST /api/channels/:channelId/attachments),短暂存放在共享声明缓存,
发布消息时再附加。上传声明只能使用一次,未使用时 15 分钟后过期。blob 字节归
上传者所有(计入其配额),每次下载都会重新检查频道成员身份。
@model 回复
编辑器可把消息发送给模型。回复会立即以模型作者的待处理消息出现,并由持久任务 完成;任务严格以调用成员的身份运行:使用其模型访问权、提供商凭据和路由, 绝不使用频道所有者或其他成员的数据。排队期间被移除的成员无法维持提及:任务会在 生成前重查身份并记录可见失败。模型故障显示在回复本身,不会消失在队列中。
模型回复使用频道最近对话(最多 30 条消息)作为上下文,并以一次性补全运行。 聊天工具、知识检索和网页搜索尚未接入频道提及。
限制
| 限制 | 值 |
|---|---|
| 每用户创建频道数 | 50 |
| 每频道成员数 | 200 |
| 每频道消息数 | 50,000 |
| 消息长度 | 8,000 个字符 |
| 每消息附件 | 5 × 10 MB |
| 每消息回应 | 200 |
边界
- 尚未实现在线状态和正在输入状态。
- 频道内容导出和保留策略遵循实例备份机制;尚无单频道导出。
- 提及通过应用内通知服务发送;除离开频道外,尚无单频道通知偏好。