agentic_huge_data_base / wiki
页面 Open WebUI · 10 频道与消息·DeepWiki 中文全文译文

10 · 频道与消息(Channels and Messaging)

多模型对话工作台与知识应用入口 · 本章是 Open WebUI DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目Open WebUI 章节10 状态全文译文 模块界面与交互、接口与服务契约、频道、笔记与协作、系统架构
源码线索
  • backend/open_webui/models/channels.py
  • backend/open_webui/models/messages.py
  • backend/open_webui/routers/channels.py
  • src/lib/apis/channels/index.ts
  • src/lib/components/channel/Channel.svelte
  • src/lib/components/channel/MessageInput.svelte
  • src/lib/components/channel/MessageInput/InputMenu.svelte
  • src/lib/components/channel/Messages.svelte
  • src/lib/components/channel/Messages/Message.svelte
  • src/lib/components/channel/Thread.svelte
模块标签
  • 界面与交互
  • 接口与服务契约
  • 频道、笔记与协作
  • 系统架构
  • 工具、记忆与模型调用

中文译文

频道与消息(中文译文)

原始 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.py
  • backend/open_webui/models/messages.py
  • backend/open_webui/routers/channels.py
  • src/lib/apis/channels/index.ts
  • src/lib/components/channel/Channel.svelte
  • src/lib/components/channel/MessageInput.svelte
  • src/lib/components/channel/MessageInput/InputMenu.svelte
  • src/lib/components/channel/Messages.svelte
  • src/lib/components/channel/Messages/Message.svelte
  • src/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-130
  • backend/open_webui/models/channels.py:36-63
  • backend/open_webui/models/messages.py:43-65
  • src/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-121
  • backend/open_webui/routers/channels.py:75-110
  • backend/open_webui/routers/channels.py:192-202
访问控制实现

标准频道使用 AccessGrants 系统。channel_has_access 函数 backend/open_webui/routers/channels.py:75-94 检查用户是否拥有特定频道所需的权限。对于私信和群组频道,访问权限通过 ChannelMemberbackend/open_webui/models/channels.py:93-121 进行验证。

---

数据模型

频道模型

Channelbackend/open_webui/models/channels.py:36-63 存储元数据,包括 typenameis_privateChannelModel backend/open_webui/models/channels.py:64-91 是用于 API 验证和响应的 Pydantic 表示。

频道成员模型

ChannelMemberbackend/open_webui/models/channels.py:93-121 跟踪用户参与情况、角色和 last_read_at 时间戳 backend/open_webui/models/channels.py:117,用于未读消息计数。

消息模型

Messagebackend/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 交互以触发表情反应。这些操作通过 addReactionremoveReaction API 调用 src/lib/apis/channels/index.ts:600-630 进行管理,这些调用会更新 MessageReactionbackend/open_webui/models/messages.py:24-31

---

线程系统

线程允许子对话。当消息包含 parent_id 时,它被视为线程回复 backend/open_webui/models/messages.py:74

  • 前端Thread.svelte src/lib/components/channel/Thread.svelte:1-245 渲染特定线程的侧面板视图。
  • 后端get_channel_thread_messages backend/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
  • 未读跟踪:当用户查看频道时,调用 updateLastReadAt src/lib/components/channel/Channel.svelte:57-77,触发 Socket.IO 事件以跨设备同步阅读状态。

---

子页面

如需更深入的技术细节,请参考以下子页面:

  • 频道架构 — 数据模型、类型特定逻辑和访问控制授权。
  • 消息管理 — 线程逻辑、表情反应处理和消息持久化。
  • 实时频道事件 — 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-1898
  • backend/open_webui/models/channels.py:182-215