修复 AGC 模型选择入口、交互与默认模型回退 #299
Reference in New Issue
Block a user
Delete Branch "fix/agc-model-selector"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
AGC 后台已支持维护 LLM 模型目录(
agc_model_catalog),客户端此前只在项目右侧对话浮出模型选择,且存在几个体验问题:改动内容(完整变更集)
ConversationModelSelect;上传按钮在左,模型选择器与发送按钮在右(同一组,模型选择器紧挨发送按钮)。busy)或对话进行中(controlBusy)被禁用;切换模型只写回客户端配置并作用于后续轮次,发送仍由controlBusy/modelReady把关。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通过影响范围与注意事项
apps/ai-game-creator-shell),不涉及 SpacetimeDB schema / 后端接口 / 契约。GET /api/llm/models语义不变(仍只返回启用项 + 默认项),本次不改后端。关联
请求修改:模型选择的保存尚未结束时可以再次切换,前一次保存完成会提前放开发送,最后一次选择仍未落盘。
已核对当前提交。现有 ConversationModelSelect 与 AppSurface 共 393 项测试通过,远端 4 项 CI 通过;另用延迟回包的独立用例复现了行内问题:两次选择均待保存时,只完成第一条,onReady 的最后一次调用已经变为 true。
请串行化模型保存,或确保只有最新选择完成后才能恢复 ready,并补充重叠保存的回归覆盖。
@@ -89,3 +131,3 @@aria-haspopup="listbox"aria-expanded={open}disabled={disabled || busy}disabled={disabled}[P2] 保持模型保存期间的并发保护
这里移除 busy 限制后,用户在一次 select_game_creator_model 尚未返回时可以重新打开菜单并再选一次,选项本身也没有禁用。连续选择“快速”再选择“高质量”,挂起两条 invoke 并只完成第一条,就会触发 select() 中的 onReady(true) 和 setBusy(false);此时第二条仍未保存,项目发送按钮却已解锁,显示/配置仍对应前一个模型。已用当前组件和延迟 Promise 复现。可以允许查看菜单,但应在保存期间禁用新的选项操作,或串行处理选择并仅在最新选择落盘后恢复 ready。
已处理上述 P2 review:模型选择保存(select_game_creator_model)期间禁用下拉选项,菜单仍可查看但不能再次选择,避免两条 invoke 并发导致的「完成第一条即解锁」竞态;保存完成后恢复启用,并在最新选择落盘后才恢复 ready。已补充并发回归测试(conversationModelSelect 8/8、appSurface 386/386、typecheck 通过)。提交:2e5dc57e9。
审查结论:通过当前代码审查。模型保存期间选项已禁用,避免并发保存提前恢复 ready;停用模型回退、失焦/Esc 收起和默认模型标识也有对应测试。当前四项 CI 尚未完成,合并前请等待 CI 结果。