Skip to content

修复:模型管理「自定义 · 全部」聚合视图三处失效(列表恒空 / 获取模型无反应 / 添加模型锁定) - #292

Closed
windfsy wants to merge 1 commit into
aimod-cc:betafrom
windfsy:fix/custom-all-aggregate-view
Closed

windfsy wants to merge 1 commit into
aimod-cc:betafrom
windfsy:fix/custom-all-aggregate-view

Conversation

@windfsy

@windfsy windfsy commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

问题(v3.0.4 ~ v3.0.6 发布版实测)

自定义供应商的「全部」聚合视图入口与计数正常,但:

  1. 模型列表恒为空(已有添加模型的单家供应商、左栏计数也正确)
  2. 点「获取模型」完全没反应
  3. 点「+ 添加模型」无法选择供应商(下拉锁定为不存在的 custom-all)

根因

聚合视图的哨兵 id 是 'custom-all',它以 custom- 开头,被 isCustom()(startsWith('custom-'),与后端 is_custom_provider_id 同判据)误中成「一家 id 叫 custom-all 的自定义家」——而目录里没有这条记录。四条代码路径因此失效:

# 位置 失效方式
1 viewData() isCustom(provider) 分支排在 ALL_CUSTOM 之前,哨兵走单家路径 → record() 为 null → 返回空视图(左栏计数读目录缓存不经 viewData,所以入口/计数正常)
2 refreshModels() 哨兵下 custom 误判为 true、providerId 传空串,被 models-fetch-modal.tsx 入口的 if (!options?.providerId) return 静默吞掉 → 按钮点了没反应
3 openCustomModel() 哨兵下 locked=true 且 preselect='custom-all' → 供应商下拉锁死;保存会提交到不存在的记录
4 matches() 无聚合守卫:行上的 provider 是各家真实 id,与哨兵精确匹配全不成立 → 即使数据回来也会被筛光

修复(最小 diff,4 处)

  • models-panel-state.ts viewData():聚合分支提到 isCustom 之前(附根因注释)
  • models-panel-state.ts refreshModels():哨兵豁免 custom 判定;providerId 改传 'all'(真值过弹窗守卫;内置分支的刷新请求体只含 {accounts, providers},不会把该值发给后端,仅作标题回落而 name 已显式传入)
  • models-panel-state.ts openCustomModel():哨兵豁免 → 不锁定、不预选,交给弹窗自选(与内置「全部」同一行为)
  • models-page.tsx matches():补 provider !== 'custom-all' 豁免

不改动 isCustom() 本身(保留纯前缀语义),沿用现有「哨兵在各调用点单独分流」的风格。

验证(headless 二进制 + 独立数据目录 + 3066 端口隔离实例,浏览器实测)

  • 聚合视图:标题「自定义 · 全部」、5 行模型、两组分组带、统计「5 个模型 · 已启用 4 · 有映射 1」、倍率/来源列按自定义口径隐藏
  • 「获取模型」:弹窗正常打开(内置多家范围模式,标题「获取模型 — 内置提供商」)
  • 「+ 添加模型」:下拉不锁定、25 个选项无 custom-all;选中自定义家保存 → 后端该家记录正确新增(toast「已登记模型」),聚合视图实时出现新行
  • 聚合视图内切换映射开关 → 后端对应家记录正确变更、统计同步
  • 三连刷筛选记忆稳定恢复 custom-all;单家视图 / 内置「全部」回归正常(列显隐、分组带、家名标题)
  • tsc --noEmit + vite build 通过,ui/islands/ui.js 构建产物随提交更新

🤖 本条回复由 AI Agent 生成

哨兵 id 'custom-all' 以 custom- 开头,被 isCustom 的前缀判定误中成一家不存在的记录:
1. viewData 的聚合分支排在 isCustom 之后永远走不到 → 聚合列表恒为空(左栏计数读目录缓存所以正常,页面却空表)
2. refreshModels 对聚合视图传空 providerId,被弹窗入口 if (!providerId) return 静默吞掉 → 获取模型点了没反应;同时 custom 布尔误真、name 顶成哨兵原文。改为豁免哨兵 + providerId 传 'all'(内置分支请求体不含它,仅标题回落用)
3. openCustomModel 同源误判 → locked=true 且预选哨兵,添加模型下拉锁死、保存必报「提供商已不存在」。改为豁免哨兵:不锁定、不预选
4. matches 无聚合守卫,行上真实 provider 对不上哨兵 → 即使数据回来也会被筛光。补聚合豁免

验证:3066 隔离实例 + 独立数据目录,浏览器实测聚合列表/分组/统计、获取模型弹窗、添加模型选自定义家保存落真实家、聚合视图内开关写路由、三连刷记忆恢复、单家与内置全部回归;tsc + vite 通过,ui/islands/ui.js 已随提交重建
@windfsy windfsy closed this by deleting the head repository Oct 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