修复 AGC 模型选择入口、交互与默认模型回退 #299

Merged
kdletters merged 8 commits from fix/agc-model-selector into master 2026-09-08 22:05:15 +08:00
Member

背景

AGC 后台已支持维护 LLM 模型目录(agc_model_catalog),客户端此前只在项目右侧对话浮出模型选择,且存在几个体验问题:

  1. 首页聊天框架缺少模型选择入口;
  2. 首次进入项目时,右侧模型选择器「点不动」(被 disabled);
  3. 模型选择下拉失去焦点不自动收起;
  4. 默认模型缺少可视标识;
  5. 已保存的选择被后台停用/移除后,客户端显示「请选择模型」,未自动回退默认模型;首页因懒加载在打开前也一直显示「选择模型」。

改动内容(完整变更集)

  • 首页聊天框架新增模型选择入口,复用项目右侧对话的 ConversationModelSelect;上传按钮在左,模型选择器与发送按钮在右(同一组,模型选择器紧挨发送按钮)。
  • 修复首次进入项目时右侧模型选择器点不动:选择器不再因目录加载(busy)或对话进行中(controlBusy)被禁用;切换模型只写回客户端配置并作用于后续轮次,发送仍由 controlBusy / modelReady 把关。
  • 模型下拉支持点击外部 / Esc 自动收起:给组件容器挂 ref,监听 documentmousedownkeydown,点击容器外或按 Esc 即收起(仅在展开时挂监听)。
  • 默认模型增加「默认」标识:组件记录 defaultModelId,在下拉选项中给默认模型显示小标签;亮暗主题自适应。
  • 模型选择始终回退默认模型:已保存选择仍可用时沿用;被停用/移除或从未选择时回退到后台默认模型并写回配置;只有默认模型本身不可用才走错误分流。首页由「懒加载」改为「挂载即加载」,触发按钮直接落在默认模型上,不再出现「选择模型」空态。
  • 清理:移除组件中已无调用方的 lazy 加载路径。
  • 文档:同步更新 【技术方案】AGC后台模型别名与对话选择-2026-09-05.md(首页入口、对话进行中可切换模型、失焦收起等行为)。

关键交互/行为说明

  • 触发按钮永远显示模型名(默认或当前选择),不再出现「选择模型」占位,除非默认模型不可用。
  • 模型下拉的加载中、刷新、选中态沿用原有交互;默认模型有「默认」标签,便于识别。
  • 首页模型选择器不改动「开启创作」门控:目录不可用时仍可创建项目并走后台默认项。

验证

  • npm run test -- apps/ai-game-creator-shell/tests/conversationModelSelect.test.tsx -> 7/7 通过
  • npm run test -- apps/ai-game-creator-shell/tests/appSurface.test.ts -> 386/386 通过
  • npm run ai-game-creator-shell:typecheck 通过
  • npm run check:encoding(4309 文件)通过
  • git diff --check 通过

影响范围与注意事项

  • 变更集中在 AGC 客户端(apps/ai-game-creator-shell),不涉及 SpacetimeDB schema / 后端接口 / 契约。
  • GET /api/llm/models 语义不变(仍只返回启用项 + 默认项),本次不改后端。
  • 模型下拉在窄屏的换行/遮挡,以及「默认」标签对比度,建议在真机确认一下观感(单测只覆盖逻辑)。

关联

  • 无关联 Issue;本 PR 独立提交。
### 背景 AGC 后台已支持维护 LLM 模型目录(`agc_model_catalog`),客户端此前只在项目右侧对话浮出模型选择,且存在几个体验问题: 1. 首页聊天框架缺少模型选择入口; 2. 首次进入项目时,右侧模型选择器「点不动」(被 disabled); 3. 模型选择下拉失去焦点不自动收起; 4. 默认模型缺少可视标识; 5. 已保存的选择被后台停用/移除后,客户端显示「请选择模型」,未自动回退默认模型;首页因懒加载在打开前也一直显示「选择模型」。 ### 改动内容(完整变更集) - **首页聊天框架新增模型选择入口**,复用项目右侧对话的 `ConversationModelSelect`;上传按钮在左,模型选择器与发送按钮在右(同一组,模型选择器紧挨发送按钮)。 - **修复首次进入项目时右侧模型选择器点不动**:选择器不再因目录加载(`busy`)或对话进行中(`controlBusy`)被禁用;切换模型只写回客户端配置并作用于后续轮次,发送仍由 `controlBusy` / `modelReady` 把关。 - **模型下拉支持点击外部 / Esc 自动收起**:给组件容器挂 ref,监听 `document` 的 `mousedown` 与 `keydown`,点击容器外或按 Esc 即收起(仅在展开时挂监听)。 - **默认模型增加「默认」标识**:组件记录 `defaultModelId`,在下拉选项中给默认模型显示小标签;亮暗主题自适应。 - **模型选择始终回退默认模型**:已保存选择仍可用时沿用;被停用/移除或从未选择时回退到后台默认模型并写回配置;只有默认模型本身不可用才走错误分流。首页由「懒加载」改为「挂载即加载」,触发按钮直接落在默认模型上,不再出现「选择模型」空态。 - **清理**:移除组件中已无调用方的 `lazy` 加载路径。 - **文档**:同步更新 `【技术方案】AGC后台模型别名与对话选择-2026-09-05.md`(首页入口、对话进行中可切换模型、失焦收起等行为)。 ### 关键交互/行为说明 - 触发按钮永远显示模型名(默认或当前选择),不再出现「选择模型」占位,除非默认模型不可用。 - 模型下拉的加载中、刷新、选中态沿用原有交互;默认模型有「默认」标签,便于识别。 - 首页模型选择器不改动「开启创作」门控:目录不可用时仍可创建项目并走后台默认项。 ### 验证 - `npm run test -- apps/ai-game-creator-shell/tests/conversationModelSelect.test.tsx` -> 7/7 通过 - `npm run test -- apps/ai-game-creator-shell/tests/appSurface.test.ts` -> 386/386 通过 - `npm run ai-game-creator-shell:typecheck` 通过 - `npm run check:encoding`(4309 文件)通过 - `git diff --check` 通过 ### 影响范围与注意事项 - 变更集中在 AGC 客户端(`apps/ai-game-creator-shell`),不涉及 SpacetimeDB schema / 后端接口 / 契约。 - `GET /api/llm/models` 语义不变(仍只返回启用项 + 默认项),本次不改后端。 - 模型下拉在窄屏的换行/遮挡,以及「默认」标签对比度,建议在真机确认一下观感(单测只覆盖逻辑)。 ### 关联 - 无关联 Issue;本 PR 独立提交。
suzmii added 5 commits 2026-09-07 14:57:29 +08:00
首页聊天框架右下角新增模型选择入口,复用项目右侧对话的模型选择器,目录按需加载且不阻塞开启创作

修复首次进入项目时右侧模型选择器点不动的问题:选择器不再因目录加载或对话进行中被禁用,切换模型只影响后续轮次

为模型选择器菜单增加加载占位与统一弹层定位,首页组件使用相对定位容器

同步更新 AGC 后台模型别名与对话选择技术方案文档

补充首页模型选择与首次进入项目可交互的回归测试
将首页模型选择入口从左侧移到发送按钮右边(同一行居右),与项目右侧对话的模型选择布局保持一致

上传按钮仍留在左侧,模型选择器与发送按钮组成右侧操作区
为 ConversationModelSelect 增加点击外部关闭和 Esc 关闭,首页与项目右侧对话共用生效

补充点击外部与 Esc 收起的回归测试
ConversationModelSelect 记录 defaultModelId,在下拉选项中对默认模型显示「默认」小标签

首页与项目右侧对话共用同一组件,默认模型标识两处同时生效

补充默认模型标识的回归测试
模型选择始终回退默认模型,不再出现请选择模型
Project CI / Frontend tests (pull_request) Successful in 1h17m16s
Project CI / Repository checks (pull_request) Successful in 1h17m52s
Project CI / Backend tests (pull_request) Successful in 21m51s
Project CI / Native shell tests (pull_request) Successful in 30m8s
2703acda84
ConversationModelSelect 在已保存选择失效时回退到后台默认模型,只要默认模型可用就不会出现「选择模型」空态

首页模型选择器改为挂载即加载目录,触发按钮直接落在默认模型上(移除懒加载)

首页不再需要 lazy 路径,清理组件中已无调用方的懒加载逻辑

同步更新模型选择相关回归测试与首页/运行时配置用例
suzmii self-assigned this 2026-09-07 15:13:08 +08:00
suzmii requested review from kdletters 2026-09-07 15:48:47 +08:00
kdletters requested changes 2026-09-07 17:00:38 +08:00
Dismissed
kdletters left a comment
Member

请求修改:模型选择的保存尚未结束时可以再次切换,前一次保存完成会提前放开发送,最后一次选择仍未落盘。

已核对当前提交。现有 ConversationModelSelect 与 AppSurface 共 393 项测试通过,远端 4 项 CI 通过;另用延迟回包的独立用例复现了行内问题:两次选择均待保存时,只完成第一条,onReady 的最后一次调用已经变为 true。

请串行化模型保存,或确保只有最新选择完成后才能恢复 ready,并补充重叠保存的回归覆盖。

请求修改:模型选择的保存尚未结束时可以再次切换,前一次保存完成会提前放开发送,最后一次选择仍未落盘。 已核对当前提交。现有 ConversationModelSelect 与 AppSurface 共 393 项测试通过,远端 4 项 CI 通过;另用延迟回包的独立用例复现了行内问题:两次选择均待保存时,只完成第一条,onReady 的最后一次调用已经变为 true。 请串行化模型保存,或确保只有最新选择完成后才能恢复 ready,并补充重叠保存的回归覆盖。
@@ -89,3 +131,3 @@
aria-haspopup="listbox"
aria-expanded={open}
disabled={disabled || busy}
disabled={disabled}
Member

[P2] 保持模型保存期间的并发保护

这里移除 busy 限制后,用户在一次 select_game_creator_model 尚未返回时可以重新打开菜单并再选一次,选项本身也没有禁用。连续选择“快速”再选择“高质量”,挂起两条 invoke 并只完成第一条,就会触发 select() 中的 onReady(true) 和 setBusy(false);此时第二条仍未保存,项目发送按钮却已解锁,显示/配置仍对应前一个模型。已用当前组件和延迟 Promise 复现。可以允许查看菜单,但应在保存期间禁用新的选项操作,或串行处理选择并仅在最新选择落盘后恢复 ready。

[P2] 保持模型保存期间的并发保护 这里移除 busy 限制后,用户在一次 select_game_creator_model 尚未返回时可以重新打开菜单并再选一次,选项本身也没有禁用。连续选择“快速”再选择“高质量”,挂起两条 invoke 并只完成第一条,就会触发 select() 中的 onReady(true) 和 setBusy(false);此时第二条仍未保存,项目发送按钮却已解锁,显示/配置仍对应前一个模型。已用当前组件和延迟 Promise 复现。可以允许查看菜单,但应在保存期间禁用新的选项操作,或串行处理选择并仅在最新选择落盘后恢复 ready。
suzmii marked this conversation as resolved
suzmii added 1 commit 2026-09-07 17:28:18 +08:00
模型选择保存期间禁用选项,避免并发选择竞态
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Frontend tests (pull_request) Successful in 3m25s
Project CI / Backend tests (pull_request) Failing after 9s
Project CI / Native shell tests (pull_request) Successful in 18m11s
2e5dc57e9d
针对 review 提出的 P2:保存 select_game_creator_model 期间重新打开菜单再选一次会挂起两条 invoke,完成第一条即解锁发送导致显示/配置错乱

保存期间禁用下拉选项(可查看菜单,不可再选),保存完成后恢复;补充并发回归测试
Author
Member

已处理上述 P2 review:模型选择保存(select_game_creator_model)期间禁用下拉选项,菜单仍可查看但不能再次选择,避免两条 invoke 并发导致的「完成第一条即解锁」竞态;保存完成后恢复启用,并在最新选择落盘后才恢复 ready。已补充并发回归测试(conversationModelSelect 8/8、appSurface 386/386、typecheck 通过)。提交:2e5dc57e9。

已处理上述 P2 review:模型选择保存(select_game_creator_model)期间禁用下拉选项,菜单仍可查看但不能再次选择,避免两条 invoke 并发导致的「完成第一条即解锁」竞态;保存完成后恢复启用,并在最新选择落盘后才恢复 ready。已补充并发回归测试(conversationModelSelect 8/8、appSurface 386/386、typecheck 通过)。提交:2e5dc57e9。
kdletters approved these changes 2026-09-07 18:06:46 +08:00
kdletters left a comment
Member

This was generated by AI during triage.

审查结论:通过当前代码审查。模型保存期间选项已禁用,避免并发保存提前恢复 ready;停用模型回退、失焦/Esc 收起和默认模型标识也有对应测试。当前四项 CI 尚未完成,合并前请等待 CI 结果。

> *This was generated by AI during triage.* 审查结论:通过当前代码审查。模型保存期间选项已禁用,避免并发保存提前恢复 ready;停用模型回退、失焦/Esc 收起和默认模型标识也有对应测试。当前四项 CI 尚未完成,合并前请等待 CI 结果。
suzmii added 1 commit 2026-09-07 18:28:53 +08:00
Merge branch 'master' into fix/agc-model-selector
Project CI / Repository checks (pull_request) Successful in 2m49s
Project CI / Frontend tests (pull_request) Successful in 3m41s
Project CI / Backend tests (pull_request) Successful in 7m0s
Project CI / Native shell tests (pull_request) Successful in 18m33s
3da0460ea3
suzmii requested review from kdletters 2026-09-08 16:23:10 +08:00
kdletters added 1 commit 2026-09-08 22:05:08 +08:00
Merge branch 'master' into fix/agc-model-selector
Project CI / Repository checks (pull_request) Successful in 2m3s
Project CI / Frontend tests (pull_request) Successful in 2m29s
Project CI / Native shell tests (pull_request) Failing after 3m54s
Project CI / Backend tests (pull_request) Failing after 5m13s
d553b7eaeb
kdletters merged commit a0e6a83691 into master 2026-09-08 22:05:15 +08:00
kdletters deleted branch fix/agc-model-selector 2026-09-08 22:05:15 +08:00
Sign in to join this conversation.