频道与消息(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/10-channels-and-messaging
翻译时间:2026-06-09T16:10:06.794Z
翻译模型:deepseek-chat
原文字符数:9323
项目:Open WebUI (open-webui)
---
频道与消息系统
相关源文件
以下文件为本 Wiki 页面的生成提供了上下文:
backend/open_webui/models/channels.pybackend/open_webui/models/messages.pybackend/open_webui/routers/channels.pysrc/lib/apis/channels/index.tssrc/lib/components/channel/Channel.sveltesrc/lib/components/channel/MessageInput.sveltesrc/lib/components/channel/MessageInput/InputMenu.sveltesrc/lib/components/channel/Messages.sveltesrc/lib/components/channel/Messages/Message.sveltesrc/lib/components/channel/Thread.svelte
目的与范围
本文档描述了 Open WebUI 中的频道与消息系统,该系统提供类似 Slack 的通信功能,包括频道、私信、线程对话、表情反应和实时更新。系统支持三种频道类型,分别采用不同的访问控制模型,并支持消息线程、文件附件、表情反应和 AI 模型集成。
关于应用中实时 Socket.IO 基础设施的信息,请参见实时通信。关于 AI 聊天系统,请参见聊天系统。
---
系统架构
频道系统采用客户端-服务器架构,通过 Socket.IO 实现实时双向通信。后端提供 REST API 端点用于频道和消息管理,前端组件负责 UI 渲染和用户交互。
高层架构
graph TB
subgraph "前端层 [src/lib/components/channel/]"
ChannelSvelte["Channel.svelte"]
MessagesSvelte["Messages.svelte"]
MessageInputSvelte["MessageInput.svelte"]
ThreadSvelte["Thread.svelte"]
MessageSvelte["Messages/Message.svelte"]
ChannelSvelte --> MessagesSvelte
ChannelSvelte --> MessageInputSvelte
ChannelSvelte --> ThreadSvelte
MessagesSvelte --> MessageSvelte
end
subgraph "API 客户端层 [src/lib/apis/channels/]"
ChannelsApi["index.ts"]
end
subgraph "后端路由 [backend/open_webui/routers/]"
ChannelsRouter["channels.py"]
end
subgraph "数据模型 [backend/open_webui/models/]"
ChannelsModel["channels.py"]
MessagesModel["messages.py"]
ChannelTable[("Channel")]
ChannelMemberTable[("ChannelMember")]
MessageTable[("Message")]
MessageReactionTable[("MessageReaction")]
ChannelsModel --> ChannelTable
ChannelsModel --> ChannelMemberTable
MessagesModel --> MessageTable
MessagesModel --> MessageReactionTable
end
subgraph "实时层 [backend/open_webui/socket/]"
SocketIOServer["main.py (sio)"]
end
ChannelSvelte --> ChannelsApi
ChannelsApi --> ChannelsRouter
ChannelsRouter --> ChannelsModel
ChannelsRouter --> MessagesModel
ChannelSvelte <-->|WebSocket| SocketIOServer
ChannelsRouter --> SocketIOServer
来源:
backend/open_webui/routers/channels.py:72-130backend/open_webui/models/channels.py:36-63backend/open_webui/models/messages.py:43-65src/lib/components/channel/Channel.svelte:1-50
---
频道类型与访问控制
系统支持三种不同的频道类型,分别采用不同的访问控制模型:
| 频道类型 | 数据库值 | 访问控制 | 使用场景 |
|---|---|---|---|
| 标准频道 | "" 或 NULL | 访问授权(组/用户) | 公开/私密讨论 |
| 群组频道 | "group" | 基于成员资格 | 协作工作空间 |
| 私信 | "dm" | 仅限参与者 | 私密对话 |
频道类型架构
graph TB
subgraph "标准频道"
StandardChannel["Channel (type: NULL)"]
StandardAccess["通过 AccessGrants 访问<br/>权限: 'read' 或 'write'"]
StandardChannel --> StandardAccess
end
subgraph "群组频道"
GroupChannel["Channel (type: 'group')"]
GroupMembership["基于成员资格的访问<br/>ChannelMemberTable"]
GroupChannel --> GroupMembership
end
subgraph "私信"
DMChannel["Channel (type: 'dm')"]
DMAccess["仅限参与者访问<br/>ChannelMemberTable"]
DMChannel --> DMAccess
end
subgraph "数据库实体"
ChannelTable[/"Channel 表"/]
ChannelMemberTable[/"ChannelMember 表"/]
AccessGrantsTable[/"AccessGrants 表"/]
end
StandardChannel -.-> ChannelTable
GroupChannel -.-> ChannelTable
DMChannel -.-> ChannelTable
StandardAccess --> AccessGrantsTable
GroupMembership --> ChannelMemberTable
DMAccess --> ChannelMemberTable
来源:
backend/open_webui/models/channels.py:36-121backend/open_webui/routers/channels.py:75-110backend/open_webui/routers/channels.py:192-202
访问控制实现
标准频道使用 AccessGrants 系统。channel_has_access 函数 backend/open_webui/routers/channels.py:75-94 检查用户是否拥有特定频道所需的权限。对于私信和群组频道,访问权限通过 ChannelMember 表 backend/open_webui/models/channels.py:93-121 进行验证。
---
数据模型
频道模型
Channel 表 backend/open_webui/models/channels.py:36-63 存储元数据,包括 type、name 和 is_private。ChannelModel backend/open_webui/models/channels.py:64-91 是用于 API 验证和响应的 Pydantic 表示。
频道成员模型
ChannelMember 表 backend/open_webui/models/channels.py:93-121 跟踪用户参与情况、角色和 last_read_at 时间戳 backend/open_webui/models/channels.py:117,用于未读消息计数。
消息模型
Message 表 backend/open_webui/models/messages.py:43-65 存储内容、元数据和线程信息。它包含 reply_to_id backend/open_webui/models/messages.py:50 用于直接回复,以及 parent_id backend/open_webui/models/messages.py:51 用于将消息分组到线程中。
---
消息操作
发送消息
前端提交由 Channel.svelte 中的 submitHandler src/lib/components/channel/Channel.svelte:190-228 处理,该处理程序调用 sendMessage API src/lib/apis/channels/index.ts:521-551。在后端,insert_new_message backend/open_webui/models/messages.py:141-176 持久化消息并触发 Socket.IO 事件 backend/open_webui/routers/channels.py:1280-1281。
表情反应
用户在 Message.svelte src/lib/components/channel/Messages/Message.svelte:207-213 中与 EmojiPicker 交互以触发表情反应。这些操作通过 addReaction 和 removeReaction API 调用 src/lib/apis/channels/index.ts:600-630 进行管理,这些调用会更新 MessageReaction 表 backend/open_webui/models/messages.py:24-31。
---
线程系统
线程允许子对话。当消息包含 parent_id 时,它被视为线程回复 backend/open_webui/models/messages.py:74。
- 前端:
Thread.sveltesrc/lib/components/channel/Thread.svelte:1-245渲染特定线程的侧面板视图。 - 后端:
get_channel_thread_messagesbackend/open_webui/routers/channels.py:1522-1578检索给定父消息的所有回复。
---
实时通信
实时功能由 Socket.IO 驱动。
- 输入指示器:
MessageInput.svelte触发onChange事件src/lib/components/channel/Channel.svelte:230-243,向后端发送typing状态。后端将该状态广播给房间内的其他用户backend/open_webui/routers/channels.py:1738-1755。 - 未读跟踪:当用户查看频道时,调用
updateLastReadAtsrc/lib/components/channel/Channel.svelte:57-77,触发 Socket.IO 事件以跨设备同步阅读状态。
---
子页面
如需更深入的技术细节,请参考以下子页面:
---
Webhooks
系统通过 ChannelWebhook 模型 backend/open_webui/models/channels.py:182-197 支持传入 webhook。外部服务可以 POST 到 /webhooks/{webhook_id}/{token} backend/open_webui/routers/channels.py:1781-1898 以编程方式向特定频道发送消息。
来源:
backend/open_webui/routers/channels.py:1781-1898backend/open_webui/models/channels.py:182-215