Misc. bug: SvelteKit WebUI submits the unfinished query on IME word confirmation (macOS Safari)

该问题在 macOS Safari 上使用日文输入法时触发,按下“确定”键(Enter)会提前提交未完成的查询。优先排查 ChatForm.svelte 与 ChatMessage.svelte 中 Enter 键处理逻辑,确认是否在 IME 组合状态下误触发了提交。

快速结论:该问题在 macOS Safari 上使用日文输入法时触发,按下“确定”键(Enter)会提前提交未完成的查询。优先排查 ChatForm.svelte 与 ChatMessage.svelte 中 Enter 键处理逻辑,确认是否在 IME 组合状态下误触发了提交。

适用环境:llama.cpp b6500/b6700、macOS Safari 26.0.1、macOS 内置日文输入法、llama-server WebUI(SvelteKit)。服务端可为任意操作系统,问题位于前端。

最快修复方案:暂无官方确认的一步修复方案。但社区成员提供了一个已验证可用的临时方案:修改 tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelteChatMessage.svelte 中的 Enter 键判断条件,加入 event.keyCode !== 229 检查。

注意事项:KeyboardEvent.keyCode 为已弃用 API,官方建议使用 isComposing 属性,但在 Safari 上 isComposing 无法正确工作。若采用 keyCode 方案需自己构建 WebUI,且不属于长期可持续解决方式。

问题场景

在 macOS Safari 浏览器中通过 llama.cpp 的 SvelteKit WebUI 使用日文输入法(IME)输入文字时,按下“确定”键(Enter)本应仅确认当前候选文字,但 WebUI 会将未完成的句子直接提交。此问题不影响服务端,纯属前端事件处理缺陷。

报错原文

Misc. bug: SvelteKit WebUI submits the unfinished query on IME word confirmation (macOS Safari)

原因分析

可能原因是 WebUI 的 ChatForm.svelte 与 ChatMessage.svelte 两个组件在监听 Enter 键时,未区分“IME 组合中”与“普通输入完成”两种状态。macOS Safari 在 IME 组合阶段按下 Enter 时,event.isComposing 可能返回 false(与 Chrome/Firefox 行为不同),导致 Enter 被误判为提交快捷键。Issue 讨论中确认 Safari 对 isComposing 支持不完整,需通过 event.keyCode === 229 识别 IME 状态。

环境排查

  • 确认浏览器是否为 macOS Safari(已知 26.0.1 受影响)
  • 确认操作系统是否为 macOS(测试环境为 macOS 15.7.1)
  • 确认输入法是否为日文 IME(macOS 内置输入法已复现)
  • 检查 llama.cpp 版本是否为 b6500 至 b6700 区间
  • 本地构建 WebUI 时需安装 Node.js(测试环境为 v22.20.0)

解决步骤

  1. 修改 tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte 第 99-101 行,将 if (event.key === 'Enter' && !event.shiftKey) 改为 if (event.key === 'Enter' && !event.shiftKey && event.keyCode !== 229)
  2. 同步修改 tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte 第 109-111 行的 handleEditKeydown 函数,加入相同条件。
  3. 按照 tools/server/webui/README.md 中的说明重新构建 WebUI,再重新构建 llama.cpp,使修改生效。
  4. 若不想修改代码,可等待官方 #16673 的修复方案(使用 isComposing),但需注意该方案在 Safari 上可能无效,因为 Safari 对 isComposing 支持不完整。

验证方法

重新构建后,在 macOS Safari 中打开 WebUI,使用日文输入法在“Ask anything…”输入框中输入文字,按“确定”键确认 IME 候选词时应不会触发提交;继续输入并正常按 Enter 提交时功能应保持正常。同时测试编辑历史消息时的 Enter 键行为,确认无副作用。

参考来源

ggml-org/llama.cpp #16163

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18424

发表回复

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