diff --git a/openless-all/app/src/pages/Settings.tsx b/openless-all/app/src/pages/Settings.tsx index a19b19fa..cb3d33d1 100644 --- a/openless-all/app/src/pages/Settings.tsx +++ b/openless-all/app/src/pages/Settings.tsx @@ -353,53 +353,100 @@ type AsrPresetId = typeof ASR_PRESETS[number]['id']; function ProvidersSection() { const { t } = useTranslation(); const { prefs, updatePrefs } = useHotkeySettings(); + // `*Provider` 立即跟随 立刻显示用户的选择(issue #220 P2:codex 指出受控选不应等 await) + // - CredentialField 不要在后端 active 切完前 remount(issue #219:避免读到旧 entry) + // `*SwitchSeq` 是 stale-write 守卫:用户 100ms 内连点两次时,先发的请求晚到不 + // 会覆盖后发的 commit。 const [llmProvider, setLlmProvider] = useState('ark'); const [asrProvider, setAsrProvider] = useState('volcengine'); + const [committedLlmProvider, setCommittedLlmProvider] = useState('ark'); + const [committedAsrProvider, setCommittedAsrProvider] = useState('volcengine'); + const llmSwitchSeqRef = useRef(0); + const asrSwitchSeqRef = useRef(0); const [llmModelRevision, setLlmModelRevision] = useState(0); const [asrModelRevision, setAsrModelRevision] = useState(0); useEffect(() => { if (!prefs) return; const knownLlm = LLM_PRESETS.find(x => x.id === prefs.activeLlmProvider); - setLlmProvider(knownLlm ? knownLlm.id : 'custom'); + const llmId = knownLlm ? knownLlm.id : 'custom'; + setLlmProvider(llmId); + setCommittedLlmProvider(llmId); const knownAsr = ASR_PRESETS.find(x => x.id === prefs.activeAsrProvider); - setAsrProvider(knownAsr ? knownAsr.id : 'volcengine'); + const asrId = knownAsr ? knownAsr.id : 'volcengine'; + setAsrProvider(asrId); + setCommittedAsrProvider(asrId); }, [prefs]); + // issue #219 / #220 P2: + // 1. 立刻 setLlmProvider —— 受控 立刻切到新厂商,但凭据字段还在显示旧 entry,placeholder + // 会先于实际数据切换、视觉上对不上。 + const preset = LLM_PRESETS.find(p => p.id === committedLlmProvider) ?? LLM_PRESETS[LLM_PRESETS.length - 1]; + const asrPreset = ASR_PRESETS.find(p => p.id === committedAsrProvider); return ( <> @@ -421,12 +468,12 @@ function ProvidersSection() { ))} - - + - - setLlmModelRevision(v => v + 1)} /> + setLlmModelRevision(v => v + 1)} /> @@ -445,24 +492,24 @@ function ProvidersSection() { ))} - {asrProvider === 'volcengine' ? ( + {committedAsrProvider === 'volcengine' ? ( <> ) : ( <> - - + - setAsrModelRevision(v => v + 1)} />