issue: autocompletion throws an uncaught RangeError when the input shrinks during its debounce window

这个报错发生在 Open WebUI 聊天输入框启用 Prompt Autocompletion 后,你在自动补全的防抖等待窗口内(约 1 秒)清空或发送了多段落消息,导致插件拿着旧的绝对光标位置去访问已被清空的编辑器文档,从而抛出 RangeError: Position N outside of

快速结论:这个报错发生在 Open WebUI 聊天输入框启用 Prompt Autocompletion 后,你在自动补全的防抖等待窗口内(约 1 秒)清空或发送了多段落消息,导致插件拿着旧的绝对光标位置去访问已被清空的编辑器文档,从而抛出 RangeError: Position N outside of fragment (<paragraph>)。优先排查你输入框的 Autocomplete 设置以及输入内容是否同时包含多个段落。

适用环境:Issue 已确认为 Open WebUI dev 分支(commit 8a42aa53e),通过 Git Clone 方式安装,Linux 操作系统;Firefox 首现,Chromium 系浏览器亦可复现。未涉及 Ollama(Not applicable),未提供 Python、CUDA、显卡等环境信息。

最快修复方案:暂无确认的一步修复方案。该 Issue 状态为已关闭,但评论与讨论链中未给出官方验证过的补丁或 workaround;需等待上游代码修复,或临时关闭 Prompt Autocompletion 功能规避。

注意事项:报错本身被认定为“cosmetic”(仅控制台报错,不影响用户界面和消息发送),且错误发生在自动补全请求发出之前,服务端未受影响;关闭自动补全会同时失去该功能,属于权衡取舍。

问题场景

在 Open WebUI 聊天输入框中开启 Prompt Autocompletion(用户 Settings > Interface)且管理员已启用 Autocomplete Generation 时,用户输入多段落文本后,在最后一次按键后的 1 秒内执行“全选删除”或直接发送消息(发送也会清空编辑器),控制台随即抛出未捕获的 RangeError。该错误在普通日常操作(如写完多行消息后立即回车发送)中即可触发。

报错原文

Uncaught RangeError: Position 7 outside of fragment (<paragraph>)
    findIndex index.js:281
    nodeAt index.js:1340
    debounceTimer AutoCompletion.js:89
    setTimeout handler*handleAICompletion AutoCompletion.js:84
    handleKeyDown AutoCompletion.js:191
    keydown index.js:3169

说明:报错中的位置数字随内容变化(Issue 中观察到 7、62、77),文档位于 src/lib/components/common/RichTextInput/AutoCompletion.js 第 82 行和第 89 行附近。

原因分析

根据 Issue 中的代码定位与分析,根本原因已经明确:

自动补全插件在用户按下按键时(handleKeyDown)捕获了当前文档中的一个绝对位置(absolute document position),随后设置一个约 1 秒的防抖定时器(handleAICompletion)。当定时器到期时,代码(第 89 行的 debounceTimer 回调)用当时保存的旧位置去访问“现在”的编辑器文档(nodeAt)。如果在防抖窗口内用户清空了输入框(全选删除或发送消息导致编辑器重置),文档结构发生变化,旧位置超出新文档的有效范围,于是抛出 RangeError: Position N outside of fragment

Issue 作者还提供了一个确定性的复现:一个大小为 106 的两段文档,光标置于末尾时捕获位置 62,在定时器触发前将文档清空为 2,随即抛出形状完全一致的 RangeError: Position 62 outside of fragment (<paragraph>)

环境排查

  • 确认 Open WebUI 版本:dev 分支,commit 8a42aa53e(报错文件路径位于该 commit 下)。
  • 确认安装方式:Git Clone(非 Docker,但 Issue 未排除 Docker 环境下的影响)。
  • 确认浏览器:Firefox(首现),Chromium 系浏览器也可复现;两类浏览器均有问题,说明与浏览器内核无关。
  • 确认服务端:POST /api/v1/tasks/auto/completions 在错误发生前后的调用均返回 200,说明服务端逻辑未参与此异常。
  • 无需关注 Ollama:该场景为未使用状态(Not applicable)。

解决步骤

  1. 临时规避(可优先尝试):在用户 Settings > Interface 中关闭 Prompt Autocompletion。这能直接消除控制台报错,但会失去自动补全提示功能。
  2. 跟踪上游修复:关注 dev 分支的后续提交,检查 AutoCompletion.js 文件(尤其是 handleAICompletionhandleKeyDown 附近的代码)是否有针对“防抖期间文档被清空”的保护逻辑(例如在 dereference 前校验位置是否仍在文档范围内)。
  3. 复现确认(可选):若需验证是否已修复,可按照 Issue 中的复现步骤操作:先在输入框粘贴多段落文本,在末尾输入一个字符,随后 1 秒内全选删除或发送消息,观察控制台是否仍出现 RangeError

验证方法

在输入框中粘贴多段落文本,在末尾任意输入一个字符,然后在 1 秒内全选删除(或直接发送消息),打开浏览器开发者工具控制台,观察是否还有未捕获的 RangeError: Position N outside of fragment。若控制台无此错误(或仅剩其他无关警告),则说明问题已解决。若关闭 Prompt Autocompletion 后不再出现错误,也可佐证问题定位准确。

注意事项补充

该报错被 Issue 作者描述为“cosmetic”(仅影响控制台输出,不干扰用户界面与消息发送流程)。错误抛出时机在自动补全请求发出之前,因此不会产生无效的服务端请求。但若你有自动化测试或脚本依赖控制台无错误输出,该问题仍需修复后才能通过。

参考来源

open-webui/open-webui #28823

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19757

发表回复

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