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 88ba4836b..eef2a3150 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 @@ -11,21 +11,18 @@ import { export function ConversationModelSelect({ className, disabled, - lazy = false, onReady, }: { className?: string; disabled: boolean; - lazy?: boolean; onReady?: (ready: boolean) => void; }) { const [models, setModels] = useState([]); const [selected, setSelected] = useState(''); const [defaultModelId, setDefaultModelId] = useState(''); - const [busy, setBusy] = useState(!lazy); + const [busy, setBusy] = useState(true); const [error, setError] = useState(''); const [open, setOpen] = useState(false); - const initializedRef = useRef(false); const containerRef = useRef(null); const refresh = useCallback(async () => { setBusy(true); @@ -40,16 +37,25 @@ export function ConversationModelSelect({ ]); setModels(catalog.models); setDefaultModelId(catalog.defaultModelId); - const id = config.config.selectedModelId || catalog.defaultModelId; + const savedSelection = config.config.selectedModelId; + // 优先沿用用户已选且仍可用的模型;已选模型被停用/移除时回退到默认模型, + // 避免下拉出现「请选择模型」的空态。默认模型由后台强制配置,缺失时才走错误提示。 + const savedAvailable = savedSelection + ? catalog.models.some((model) => model.id === savedSelection) + : false; + const id = + savedAvailable && savedSelection + ? savedSelection + : catalog.defaultModelId; setSelected(id); const available = catalog.models.some((model) => model.id === id); - if (available && !config.config.selectedModelId) { + if (available && savedSelection !== id) { const saved = await invoke( 'select_game_creator_model', { modelId: id }, ); if (saved.config.selectedModelId !== id) - throw new Error('Default selection was not saved'); + throw new Error('Model selection was not saved'); } onReady?.(available); if (!available) setError('请选择可用模型'); @@ -62,9 +68,8 @@ export function ConversationModelSelect({ }, [onReady]); useEffect(() => { - if (lazy) return; void refresh(); - }, [refresh, lazy]); + }, [refresh]); useEffect(() => { if (!open) return; @@ -126,13 +131,7 @@ export function ConversationModelSelect({ aria-haspopup="listbox" aria-expanded={open} disabled={disabled} - onClick={() => { - if (lazy && !initializedRef.current) { - initializedRef.current = true; - void refresh(); - } - setOpen((current) => !current); - }} + onClick={() => setOpen((current) => !current)} >