Skip to content

fix(settings): 统一模型路由连通性检查状态管理,消除重复探针 - #142

Open
hllshiro wants to merge 2 commits into
ExplosiveCoderflome:mainfrom
hllshiro:ops/deploy-fixes
Open

fix(settings): 统一模型路由连通性检查状态管理,消除重复探针#142
hllshiro wants to merge 2 commits into
ExplosiveCoderflome:mainfrom
hllshiro:ops/deploy-fixes

Conversation

@hllshiro

@hllshiro hllshiro commented Aug 19, 2026

Copy link
Copy Markdown

摘要

修复模型路由连通性检查(model route connectivity check)在页面挂载时被过度触发的问题。引入统一状态管理:后端 single-flight 状态机 + 配置指纹缓存,前端统一 Hook,消除对本地推理服务的"探针风暴"。

问题背景

进入 /settings/settings/models 页面时,连通性检查被重复触发,对本地推理服务(如 LM Studio)产生大量探针请求:

  1. 前端无缓存ModelRoutesPage.tsx 的 React Query 查询未设置 staleTime(默认 0),每次组件挂载都会全量重取;
  2. 后端无去重、无缓存testModelRoutes() 每次请求都执行全部路由 ×(普通 + 结构化)探针,单次全量检查受推理模型响应速度影响,耗时可达 100 秒以上。

方案设计

统一状态管理,满足三条约束:

  • 检查任务全局唯一,重复触发仅返回任务状态,不重复执行(single-flight);
  • 路由配置未变更时复用上次结果(配置指纹缓存);
  • 始终支持手动强制刷新(force 参数);完全失败的结果不写入缓存。

改动内容

后端(server)

文件 改动
src/llm/checkController.ts(新增) 单例状态机(idle → running → done);single-flight 并发去重;配置指纹缓存(force 可绕过,全部失败不更新指纹);进程重启状态重置
src/llm/connectivity.ts 抽取并导出 runModelRoutesProbetestModelRoutes 保留为兼容薄封装
src/routes/llm.ts POST /model-routes/connectivity 接受 { force };新增 GET /model-routes/connectivity/status

前端(client)

文件 改动
src/hooks/useModelRouteCheck.ts(新增) 统一 Hook:进入页面零探针(仅读取状态),running 时 2s 轮询
src/api/settings.ts 新增 testModelRouteConnectivity({ force })getModelRouteConnectivityStatus()
src/pages/settings/ModelRoutesPage.tsx 接入统一 Hook,移除挂载自动触发
src/pages/settings/views/SettingsOverviewPage.tsx 接入统一 Hook
src/pages/settings/components/SettingsReadinessCard.tsx 增加「未检测」(idle)状态展示

行为变化

场景 修改前 修改后
进入 /settings/settings/models 每次触发全量探测 不触发探测,显示缓存结果或「未检测」
重复触发检测 每次全量执行 返回同一 taskId,不重复执行
配置未变更 重新探测 返回缓存结果(cached: true
点击「重新检测」 强制触发新检查(force
全部探测失败 无缓存 不更新指纹,下次仍可重试

验证

  • 静态检查:前端 tsc --noEmit + vite build 通过;后端 tsc --noEmit 零新增错误(仅剩上游基线自带 4 处 pre-existing 类型错误);
  • 运行时验证(Docker 部署):初始状态 idle(零探针);触发返回 running + taskId;并发 / force 重复触发返回同一 taskId;11 条路由检测完成(全部成功)后再次触发返回 cached: true 复用结果。

关联文档

  • 设计文档:docs/plans/model-route-connectivity-check-unified-state-plan.md

…ntroller 统一状态机(idle/running/done),single-flight 并发去重, 配置指纹缓存(force 可绕过),全失败不更新指纹 - connectivity.ts:抽取导出 runModelRoutesProbe,testModelRoutes 保留为兼容薄封装 - 路由:POST /model-routes/connectivity 接受 { force },新增 GET .../status - 前端:useModelRouteCheck 统一 Hook(进入页面零探针,running 轮询 2s); ModelRoutesPage / SettingsOverviewPage 接入;ReadinessCard 增加未检测状态
@hllshiro hllshiro changed the title fix(settings): 模型路由连通性检查统一状态管理(single-flight + 指纹缓存) fix(settings): 统一模型路由连通性检查状态管理,消除重复探针 Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant