快速结论:该报错发生在 Open WebUI 使用 Redis Cluster 作为消息中间件时,调用 POST /api/tasks/stop/{task_id} 停止任务,底层 RedisCluster 客户端对象没有直接的 publish 方法。优先排查 Redis 客户端版本,并确认当前使用的是标准 Redis 连接还是 Redis Cluster 连接。
适用环境:Open WebUI v0.6.40(Docker 安装)、Debian GNU/Linux 12、Redis Cluster 模式、redis-py 客户端库 7.1.0。
最快修复方案:暂无确认的一步修复方案。Issue 中提出的两个补丁方案(遍历 master 节点调用 publish、使用 spublish)均因 RedisCluster 客户端缺少对应属性而失败;通过 execute_command('PUBLISH', ...) 可执行但功能未生效。
注意事项:方案仍在验证阶段。即使补丁能让代码执行,Redis Cluster 架构下 PUBLISH 是否广播到所有节点、任务停止信号能否可靠送达仍需进一步验证。
问题场景
用户在 Docker 中运行 Open WebUI v0.6.40,并将 Redis 配置为 Cluster 模式。当用户通过 API 调用 POST /api/tasks/stop/{task_id} 停止任务时,后端执行 /backend/open_webui/tasks.py 中的 redis_send_command 函数,尝试调用 redis.publish(...) 发布停止信号,但 RedisCluster 客户端对象没有 publish 方法,触发致命 AttributeError,任务无法停止。
报错原文
AttributeError: 'RedisCluster' object has no attribute 'publish'
原因分析
可能原因:Open WebUI 的 redis_send_command 函数假设 Redis 客户端是标准连接(有 publish 方法),但实际连接的是 redis.cluster.RedisCluster 实例。即使通过补丁绕过了 publish 方法缺失的问题,标准 Redis Cluster 架构中 PUBLISH 命令是节点本地的,不会自动广播到集群所有节点,因此需要额外逻辑将消息发布到所有 master 节点。
环境排查
- 确认 Open WebUI 版本是否为 v0.6.40 或更高。
- 确认 Redis 连接方式:标准 Redis 连接还是 Redis Cluster(通过
redis.cluster.RedisCluster.from_url(...)创建)。 - 确认 redis-py 客户端库版本(Issue 中用户使用 7.1.0,不同版本 API 可能有差异)。
- 确认 Redis 集群中 master 节点数量及订阅关系。
- 检查 Docker 容器日志中是否出现
AttributeError及具体堆栈信息。
解决步骤
- 在
redis_send_command函数中检测 Redis 客户端类型,可使用hasattr(redis, 'nodes_manager')判断是否为 RedisCluster,但需先确认当前 redis-py 版本支持该属性。 - 如果判断为 RedisCluster,可优先尝试遍历所有 master 节点,对每个节点调用
publish方法(需先获取节点的客户端对象)。可优先尝试此方案,但请注意 Issue 中用户尝试的补丁因get_master_nodes()方法不存在而失败,需查找当前 redis-py 版本提供的集群节点遍历 API。 - 另一种可优先尝试的方案是使用
redis.spublish(Redis 7.0+ 的 sharded Pub/Sub),但 Issue 中用户测试时发现当前 redis-py 7.1.0 的 RedisCluster 对象没有该属性。 - 使用
redis.execute_command('PUBLISH', channel, message)可以执行成功,但 Issue 中验证该方案未能真正停止任务,可能原因包括 PUBLISH 只到达了随机某个节点、订阅者不在该节点上等。 - 在 Issue 中并未给出最终验证通过的修复代码;建议关注上游 Open WebUI 仓库的修复 PR,或在本地自行实现集群广播逻辑并充分测试。
验证方法
修改代码后,重新启动 Open WebUI 服务,再次调用 POST /api/tasks/stop/{task_id},观察 Docker 容器日志中不再出现 AttributeError,并确认任务确实停止(不再生成新的响应内容)。同时可在 Redis 集群各节点上确认 PUBLISH 消息是否被所有订阅者接收。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[bug]: InvokeAI v6.14.0-RC1 Crashed while generating Krea-2 Image](https://www.chat-gpts.plus/wp-content/uploads/2026/09/9444-d6bdc60c-768x403.jpg)
![[Question]: Shared embedded chat URL fails to access documents after logout or when accessed by other users](https://www.chat-gpts.plus/wp-content/uploads/2026/09/15895-cf3f7033-768x403.jpg)
