From ae4ecd645dc396ee30a857267994349d38a7fb63 Mon Sep 17 00:00:00 2001 From: ssurui Date: Thu, 3 Sep 2026 21:17:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8B=8D=E7=85=A7=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=8C=89=E5=90=8E=E7=AB=AF=E6=A8=A1=E5=9E=8B=E7=9A=84=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E8=83=BD=E5=8A=9B=E8=87=AA=E5=8A=A8=E5=90=AF=E7=94=A8?= =?UTF-8?q?/=E7=BD=AE=E7=81=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端加载的不是多模态模型时,拍照提问按钮置灰不可点;换回多模态模型后 下一轮状态轮询(5 秒)自动恢复可用,不需要重启应用。 判据放在 ServiceControl 已有的 /api/status 轮询里顺带算出来,写进 store 的 visionAvailable,这样复用现成的轮询节奏,模型切换能被自动感知。 detectVisionCapability 的判据顺序:模型加载时打印的 allow_image 最准确, 但实测发现 er_backend 的日志缓冲只留最近 200 条,服务跑一会儿这行就被 推理日志挤掉了,所以只在还能翻到时采信;翻不到时退回看启动命令里有没有 --mmproj——该字段不随日志滚动,是长期可靠的依据。没有采用 config 里的 modelType 字段:那是配置意图,用户改了配置但没重启服务时会与实际运行的 模型不符。 同时:按钮禁用态样式加强(原来只有 opacity .6,且 hover 规则没排除禁用态, 看着像还能点),补 not-allowed 光标和灰底灰字;sendVisionQuery 入口加一道 校验,防守拍完照到点发送之间后端被切走的空窗。 验证:真机停掉生成服务后拍照按钮图标灰度 80→184、另两个按钮 80→80 纹丝 不动,重启服务后自动回到 80,全程没有重启应用;detectVisionCapability 另用构造数据覆盖 7 个分支(含纯文本模型、allow_image=0、starting、字段 缺失)全部通过。测试用的停服务操作已确认恢复,启动命令与操作前逐字一致。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01QeoAy5KmkHuKWHAktpEsaN --- src/renderer/src/components/ChatPanel.vue | 24 +++++++++++++++---- .../src/components/ServiceControl.vue | 22 ++++++++++++++++- src/renderer/src/stores/rag.ts | 6 +++++ 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/renderer/src/components/ChatPanel.vue b/src/renderer/src/components/ChatPanel.vue index aa22d5d..30676b9 100644 --- a/src/renderer/src/components/ChatPanel.vue +++ b/src/renderer/src/components/ChatPanel.vue @@ -246,6 +246,11 @@ async function sendQuery(): Promise { async function sendVisionQuery(): Promise { if (!pendingImage.value) return if (store.querying) return + // 防守拍完照到点发送之间后端被切成纯文本模型的空窗(按钮此时已置灰,但图片还留在输入区) + if (!store.visionAvailable) { + message.warning('当前生成服务加载的不是多模态模型,无法识别图片') + return + } const q = question.value.trim() const img = pendingImage.value @@ -670,9 +675,14 @@ onUnmounted(() => { 语音输出 - +
-