From 68e345708311a42a48b508f44b1ba1a24c3b8d4b Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sun, 6 Sep 2026 22:01:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20AGC=20=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E4=B8=8E=E9=A1=B9=E7=9B=AE=E5=AF=B9=E8=AF=9D=E7=9A=84=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=80=89=E6=8B=A9=E5=85=A5=E5=8F=A3=E5=92=8C=E4=BA=A4?= =?UTF-8?q?=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 首页聊天框架右下角新增模型选择入口,复用项目右侧对话的模型选择器,目录按需加载且不阻塞开启创作 修复首次进入项目时右侧模型选择器点不动的问题:选择器不再因目录加载或对话进行中被禁用,切换模型只影响后续轮次 为模型选择器菜单增加加载占位与统一弹层定位,首页组件使用相对定位容器 同步更新 AGC 后台模型别名与对话选择技术方案文档 补充首页模型选择与首次进入项目可交互的回归测试 --- .../ConversationModelSelect.tsx | 45 ++++++++++++++----- .../ProjectSupervisorView.tsx | 4 +- apps/ai-game-creator-shell/src/styles.css | 18 ++++++-- .../src/view/home/index.tsx | 10 ++++- .../tests/appSurface/home.suite.ts | 40 +++++++++++++++++ .../appSurface/project-development.suite.ts | 44 ++++++++++++++++++ ...方案】AGC后台模型别名与对话选择-2026-09-05.md | 2 + 7 files changed, 147 insertions(+), 16 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx index 92d10d2a2..b4acba71b 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx @@ -1,5 +1,5 @@ import { Check, ChevronDown, RefreshCcw } from 'lucide-react'; -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { resolveTauriInvoke } from '../../app/tauri'; import type { GameCreatorAppConfigView } from '../../app/types'; @@ -9,21 +9,26 @@ import { } from '../../services/clientApi'; export function ConversationModelSelect({ + className, disabled, + lazy = false, onReady, }: { + className?: string; disabled: boolean; - onReady: (ready: boolean) => void; + lazy?: boolean; + onReady?: (ready: boolean) => void; }) { const [models, setModels] = useState([]); const [selected, setSelected] = useState(''); - const [busy, setBusy] = useState(true); + const [busy, setBusy] = useState(!lazy); const [error, setError] = useState(''); const [open, setOpen] = useState(false); + const initializedRef = useRef(false); const refresh = useCallback(async () => { setBusy(true); setError(''); - onReady(false); + onReady?.(false); try { const invoke = resolveTauriInvoke(); if (!invoke) throw new Error('Native host unavailable'); @@ -43,7 +48,7 @@ export function ConversationModelSelect({ if (saved.config.selectedModelId !== id) throw new Error('Default selection was not saved'); } - onReady(available); + onReady?.(available); if (!available) setError('请选择可用模型'); } catch { setModels([]); @@ -54,11 +59,12 @@ export function ConversationModelSelect({ }, [onReady]); useEffect(() => { + if (lazy) return; void refresh(); - }, [refresh]); + }, [refresh, lazy]); async function select(id: string) { - onReady(false); + onReady?.(false); setBusy(true); setError(''); try { @@ -71,7 +77,7 @@ export function ConversationModelSelect({ if (result.config.selectedModelId !== id) throw new Error('Selection was not saved'); setSelected(id); - onReady(true); + onReady?.(true); } catch { setError('模型选择保存失败'); } finally { @@ -80,7 +86,13 @@ export function ConversationModelSelect({ } return ( -
+
{error ? {error} : null}