issue: Chat stuck after Filter function blocks request in inlet()

用户运行 Open WebUI v0.9.6,安装方式为 Other(非 Docker 标准流程),操作系统为 Ubuntu 22.04。在 Admin Panel → Functions 中添加了一个自定义 Filter 函数,用于限制输入 token 数。当输入的 token 数超过阀值(默认

issue: Chat stuck after Filter function blocks request in inlet()

issue: Chat stuck after Filter function blocks request in inlet()

快速结论:当自定义 Filter 函数的 inlet() 方法通过 raise Exception 阻断请求时,虽然错误通知显示正确,但聊天界面会陷入卡死状态,无法发送新消息。优先排查 Filter 函数中是否使用了 raise Exception 来阻断请求,以及 Open WebUI 版本是否为 v0.9.6。

问题场景

用户运行 Open WebUI v0.9.6,安装方式为 Other(非 Docker 标准流程),操作系统为 Ubuntu 22.04。在 Admin Panel → Functions 中添加了一个自定义 Filter 函数,用于限制输入 token 数。当输入的 token 数超过阀值(默认 1000)时,inlet() 方法通过 raise Exception 抛出异常并发送错误通知。随后聊天界面卡住,无法发送新消息,只能通过打开新聊天来恢复。

报错原文

# Filter 函数中阻断请求的关键代码
if tokens > self.valves.token_limit:
    await __event_emitter__(
        {
            "type": "notification",
            "data": {
                "type": "error",
                "content": f"Input exceeds maximum length: {tokens} tokens (limit: {self.valves.token_limit}). Please shorten your input.",
            },
        }
    )
    raise Exception(
        # 异常内容在 Issue 正文中被截断,未完整显示
    )

# 实际出现的错误通知:
# "Input exceeds maximum length: {tokens} tokens (limit: {self.valves.token_limit}). Please shorten your input."
# 通知显示后,聊天界面卡死,无法继续操作。

原因分析

可能原因:当 Filter 函数的 inlet() 方法抛出异常时,Open WebUI 的请求处理流程可能没有正确将聊天状态重置为空闲(idle)状态。错误通知虽然显示成功,但底层的状态机仍停留在“等待响应”或“处理中”状态,导致输入框被锁定,无法发送新消息。这与 Issue #26892 和 #15189 等已知问题症状相似,说明该问题可能是 Open WebUI 在异常处理流程中的一个通用缺陷。

环境排查

  • Open WebUI 版本:确认为 v0.9.6(用户报告问题时的版本)
  • 操作系统:Ubuntu 22.04
  • 安装方式:Other(非标准 Docker 部署)
  • Python 依赖:Filter 函数中使用了 tiktoken 库,需要确认 tiktoken 版本兼容性
  • 模型配置:自托管模型,通过 OpenAI 兼容端点连接
  • 浏览器控制台日志:Issue 中未提供具体日志,但用户已确认包含控制台日志(未在 Issue 正文中贴出)

解决步骤

  1. 确认问题是否在最新版本中已修复:用户报告时使用的是 v0.9.6,该问题在 Issue 关闭(2026-07-09)时可能已在新版本中修复。建议升级到 Open WebUI 的最新稳定版,检查是否仍存在。
  2. 可优先尝试:修改 Filter 函数,避免使用 raise Exception:目前 Issue 中没有提供明确解决方案,但根据代码逻辑,可以考虑将 raise Exception 替换为仅发送错误通知并返回空或阻断的响应,例如:
    if tokens > self.valves.token_limit:
        await __event_emitter__(
            {
                "type": "notification",
                "data": {
                    "type": "error",
                    "content": f"Input exceeds maximum length: {tokens} tokens (limit: {self.valves.token_limit}). Please shorten your input.",
                },
            }
        )
        # 代替 raise Exception,返回一个空或阻断的 body
        return {"error": "Input too long"}  # 或根据 API 规范返回适当响应
  3. 临时恢复方法:如果问题已发生,可以尝试编辑那条触发错误的用户消息,重新发送,或点击错误消息下的“重新生成”(Regenerate)按钮。Issue 正文中提到在卡死后,唯一恢复的方法是打开一个新聊天,但评论中也指出可以尝试编辑消息或重新生成(推测性建议,请以实际测试为准)。
  4. 检查相关 Issue 的修复状态:参考 Issue #26892(API 错误消息持续存在并阻止后续聊天)和 #15189(前端死锁),检查这些 Issue 中是否提供了补丁或 workaround。

验证方法

修改 Filter 函数或升级 Open WebUI 后,按照复现步骤操作:发送一条超过 token 限制的消息,确认错误通知正常显示,然后尝试发送一条新的符合 token 限制的消息。如果发送框恢复正常、可以正常交互,则问题已解决。反之,如果仍然卡死,需要进一步排查。

参考来源

open-webui/open-webui #26941:Chat stuck after Filter function blocks request in inlet()

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 12327

发表回复

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