issue: A standard channel’s member list omits its owner, and lists nobody when a user and a group are both granted

该报错发生在 Open WebUI 标准频道的成员列表中,表现为频道所有者不会出现在列表中;当同时向一个用户和一个用户组授予读取权限时,成员列表为空但成员计数显示为 2。优先排查频道成员列表的派生逻辑,确认是否使用了统一的成员查询接口。

快速结论:该报错发生在 Open WebUI 标准频道的成员列表中,表现为频道所有者不会出现在列表中;当同时向一个用户和一个用户组授予读取权限时,成员列表为空但成员计数显示为 2。优先排查频道成员列表的派生逻辑,确认是否使用了统一的成员查询接口。

适用环境:Open WebUI v0.11.0(dev 分支),源码安装(uvicorn + vite),Debian 系 Linux 主机。Issue 中未提及具体 Python、CUDA、显卡型号或依赖版本。

最快修复方案:升级到包含修复提交 e3e82b147 的 dev 版本。该提交通过新增的 get_channel_member_user_ids() 辅助函数,将频道的用户组授权展开为用户 ID,并加入频道所有者,成员列表和成员计数均通过该函数生成。

注意事项:此修复仅针对标准频道(standard channel),群组频道和私聊(DM)行为保持不变;频道通知的接收者判定逻辑未受影响。如果无法升级,可先手动为频道添加所有者作为显式成员或用户组来绕行,但这种方式未在 Issue 中验证。

问题场景

在 Open WebUI 中创建标准频道时触发。两种具体场景:

  • 管理员创建一个保持 Private 且未添加任何用户或用户组的频道,打开成员列表显示 0 个成员且列表为空,但频道编辑弹窗显示“No access grants. Private to you.”(无授权,仅你私有)。
  • 管理员创建一个标准频道,分别向一个用户和一个该用户不属于的用户组授予读取权限,成员列表为空,但频道头部显示的成员计数为 2。

报错原文

issue: A standard channel's member list omits its owner, and lists nobody when a user and a group are both granted

| Standard channel | `GET /{id}/members` | `user_count` from `GET /{id}` |
|---|---|---|
| Private, nothing granted | `total=0`, `users=[]` | 0 |
| Read granted to one user and one group | `total=0`, `users=[]` | 2 |
| Group channel, private, nobody added | `total=1`, `users=["G30"]` | 1 |

原因分析

可能原因是标准频道的成员列表派生逻辑存在两个缺陷:

  • 所有者未纳入成员列表:标准频道不维护单独的成员行(membership rows)。insert_new_channel 只对群组和私聊频道创建 ChannelMember 行,标准频道则通过访问授权(access grant)来筛选成员。当频道未授予任何用户或用户组权限时,派生集合为空,频道所有者的所有权并未贡献到成员列表中。
  • 用户授权与用户组授权互相抵消:标准频道的成员列表通过 get_channel_permitted_group_and_user_ids() 获取有权限的用户和用户组,然后分别过滤。当只授予一个用户和一个用户组时,查询条件同时要求满足两个条件(交集而非并集),导致结果为空,而成员计数则使用不同的逻辑计算为 2。

环境排查

  • 确认 Open WebUI 版本是否为 v0.11.0(dev)或更早版本。
  • 确认安装方式为源码安装(uvicorn + vite),而非 Docker 或打包版本。
  • 检查 backend/open_webui/models/channels.pyinsert_new_channel 函数(约第 360 行)是否为频道创建成员行。
  • 检查 backend/open_webui/routers/channels.pyGET /{id}/members 路由(约第 488 行)的成员筛选逻辑。

解决步骤

  1. 备份当前 Open WebUI 配置和数据。
  2. 将 Open WebUI 升级到包含提交 e3e82b147 的 dev 版本,或拉取最新 dev 分支代码后重新构建前端并重启后端服务。
  3. 若无法升级,可优先尝试手动为标准频道添加所有者作为显式成员或创建一个只包含所有者的用户组并授予读取权限。此方法为绕行方案,未经 Issue 验证。
  4. 升级后,重新创建一个标准频道(Private、不添加用户或用户组),检查成员列表是否包含创建者。
  5. 再创建一个标准频道,分别向一个用户和一个用户组(该用户不属于该组)授予读取权限,检查成员列表是否正确显示两人。

验证方法

通过 HTTP API 或前端界面验证:

  • 对于 Private 且无任何授权的标准频道,GET /{id}/members 应返回包含频道所有者的列表,且 total 为 1。
  • 对于同时授予一个用户和一个用户组读取权限的频道,成员列表应同时包含该用户和该用户组展开后的所有成员,且 total 与频道头部的成员计数一致。
  • 确认群组频道和私聊频道的成员列表行为未发生回归变化。

参考来源

open-webui/open-webui #28288

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20090

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注