ValueError: Unsupported Redis URL schema: rediss)**

该报错发生在 Open WebUI 使用 Redis Cluster 作为消息中间件时,调用 POST /api/tasks/stop/{task_id} 停止任务,底层 RedisCluster 客户端对象没有直接的 publish 方法。优先排查 Redis 客户端版本,并确认当前使用的是标准

快速结论:该报错发生在 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 及具体堆栈信息。

解决步骤

  1. redis_send_command 函数中检测 Redis 客户端类型,可使用 hasattr(redis, 'nodes_manager') 判断是否为 RedisCluster,但需先确认当前 redis-py 版本支持该属性。
  2. 如果判断为 RedisCluster,可优先尝试遍历所有 master 节点,对每个节点调用 publish 方法(需先获取节点的客户端对象)。可优先尝试此方案,但请注意 Issue 中用户尝试的补丁因 get_master_nodes() 方法不存在而失败,需查找当前 redis-py 版本提供的集群节点遍历 API。
  3. 另一种可优先尝试的方案是使用 redis.spublish(Redis 7.0+ 的 sharded Pub/Sub),但 Issue 中用户测试时发现当前 redis-py 7.1.0 的 RedisCluster 对象没有该属性。
  4. 使用 redis.execute_command('PUBLISH', channel, message) 可以执行成功,但 Issue 中验证该方案未能真正停止任务,可能原因包括 PUBLISH 只到达了随机某个节点、订阅者不在该节点上等。
  5. 在 Issue 中并未给出最终验证通过的修复代码;建议关注上游 Open WebUI 仓库的修复 PR,或在本地自行实现集群广播逻辑并充分测试。

验证方法

修改代码后,重新启动 Open WebUI 服务,再次调用 POST /api/tasks/stop/{task_id},观察 Docker 容器日志中不再出现 AttributeError,并确认任务确实停止(不再生成新的响应内容)。同时可在 Redis 集群各节点上确认 PUBLISH 消息是否被所有订阅者接收。

参考来源

open-webui/open-webui #19840

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21241

发表回复

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