快速结论:在 Open WebUI 里,当消息队列还在顺序处理时切换到其他会话再切回来,队列上下文会丢失,剩余消息会被一次性批量发出;此外点击 “Send Now” 也可能触发同样的一次性批量发送。优先怀疑会话切换时的前端队列状态(race condition)问题。
适用环境:Open WebUI v0.8.12(Git Clone 安装),操作系统为 Mac;Issue 中未提供 Ollama、Python、CUDA、显卡版本,因此不做补写。
最快修复方案:暂无确认的一步修复方案。Issue 关闭时,维护者尚未合并修复;评论中有人针对当前 dev(a096961a3)准备了依赖免费的修复补丁,但未以 PR 形式提交,属于可优先尝试的方向而非已验证方案。
注意事项:相关问题可能不止一种表现:有用户在开启基于 pyodide 的代码执行后,切换会话或浏览器标签页会导致响应永远卡在思考/排队中、代码不会在 pyodide 里执行;该用户后来确认不切换标签页、仅在同一个 OWUI 标签内切换到新旧会话也能稳定复现。该现象是否与主 Issue 完全同源尚未有明确结论。
问题场景
在 Open WebUI 中使用消息队列功能(一次排入多条消息并顺序发送)时触发问题:
- 排入 5 条以上消息并开始顺序处理,处理过程中切换到侧边栏中的其他会话,再切回原会话,剩余排队消息会被一次性全部发出,而不是继续逐条发送。
- 在队列处理过程中点击 “Send Now”,有时也会把所有剩余排队消息同时发出。
- 另一种相关表现:在开启代码执行(pyodide based)时发送 prompt,在思考、代码执行、代码解释完成之前切走会话,响应会永久卡在转圈/排队状态,代码始终不会在 pyodide 中执行。
报错原文
issue: Switching conversations while message queue is processing causes messages to be sent in bulk and race condition issues
When the user switches away from the conversation and switches back, the queue processing loop loses its proper state. Instead of resuming sequential processing, it dumps all remaining messages at once.
The stop/completion path can call processNextInQueue() after B has been removed from the queue but before submitPrompt(B) runs.
Expected persisted order: interrupted response -> B -> B response -> A -> A response.
原因分析
根据 Issue 中的复现步骤与评论分析,根因很可能出在前端(Chat.svelte)的消息队列调度逻辑:
- 消息队列的处理循环没有按会话隔离,会话切换会让旧的执行上下文与新上下文发生竞争,从而破坏队列状态。
- 具体到 “Send Now” 场景:
sendQueuedMessageNow()会先把消息 B 从队列移除,然后await stopResponse(false);而取消/完成路径可能在 B 已被移出但submitPrompt(B)尚未执行时调用processNextInQueue(),导致 A 先被提交、B 后提交,顺序被打乱,甚至出现批量发送。 - 关于 pyodide 代码执行时切换会话导致永久卡住的现象,是否与上述 race condition 完全同源尚无明确结论,可能原因包括会话切换中断了流式响应/执行链,具体机制未在 Issue 中确认。
环境排查
- 确认 Open WebUI 版本:Issue 报告时为 v0.8.12;如使用
dev分支,评论中提到的验证点为a096961a3。 - 确认安装方式为 Git Clone 还是 Docker,便于复现与升级验证。
- 确认是否启用了消息队列功能,以及是否开启代码执行(pyodide based)。
- Issue 未提供 Ollama 版本、Python/CUDA/PyTorch/显卡信息,遇到该问题时无需先怀疑这些依赖。
- 观察报错是否只在“切换会话/切换标签页”后出现;若只在代码执行场景出现,应单独记录复现步骤。
解决步骤
- 先固定复现路径:排入多条消息 → 开始处理 → 在处理中途切换会话再切回,记录是否出现批量发送。
- 若使用
dev分支,可优先同步到评论中验证过的a096961a3附近版本,确认 “Send now” race 是否仍然存在;评论者确认该问题在该版本上仍可复现。 - 可优先尝试评论中提出的修复方向:引入按会话(per-chat)的小型调度器,让 “Send now” 在取消开始前先取得该会话的所有权,避免普通队列完成路径抢先处理;在优先级所有权释放后再唤醒保留的消息。该补丁触达
Chat.svelte及一个回调注入的小型 TypeScript 工具及其测试,但未提交 PR,属于未验证方案。 - 在修复合并前,临时规避:不要在队列处理期间切换会话;不要点击 “Send Now”;如使用代码执行,等待响应完全结束再切换会话。
- 若代码执行卡住的现象与队列问题独立复现,按 Issue 评论建议单独开 Issue 并附上视频,避免与队列 race 混淆。
验证方法
按 Issue 中的预期行为逐项核对:切换会话再切回后,队列应保留剩余消息并继续逐条处理,而不是一次性全部发送;点击 “Send Now” 后只发送当前待发消息,随后恢复顺序处理,不再批量发送剩余消息;若采用评论中的调度器修复,评论者报告其聚焦测试 5/5 通过、ESLint 通过、git diff --check 干净、生产前端构建成功,可参考这些验证点。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug] Console dataset list performs N+1 queries during response serialization](https://www.chat-gpts.plus/wp-content/uploads/2026/09/42275-9eb6f388-768x403.jpg)
