From 3140d205cc65a27b8bb7baf29d831d4954f18b9d Mon Sep 17 00:00:00 2001 From: lzt404 <2596933790@qq.com> Date: Mon, 27 Jul 2026 16:00:44 +0800 Subject: [PATCH] fix: fetch agent config only on page load and refresh --- src-tauri/src/main.rs | 16 ++++++++-------- src/pages/AgentsPage.tsx | 21 +++++++++++++++------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 23ea007..e47c869 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -573,7 +573,7 @@ struct AgentConfigActionResult { conflict_files: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize)] +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(rename_all = "camelCase")] struct AgentModelOption { name: String, @@ -1594,6 +1594,7 @@ async fn apply_agent_config( gui_config_state: tauri::State<'_, GuiConfigState>, client: String, model: String, + models: Vec, oauth_configuration: bool, ) -> Result { let client = AgentClient::parse(&client)?; @@ -1604,10 +1605,9 @@ async fn apply_agent_config( let config = gui_config_state.snapshot()?; let api_key = effective_agent_api_key(&config); validate_agent_can_enable(client, &home, config.port, api_key)?; - let available_models = fetch_agent_models(config.port, api_key).await?; - let model = resolve_available_agent_model(&available_models, &validate_agent_model(&model)?)?; + let model = resolve_available_agent_model(&models, &validate_agent_model(&model)?)?; let codex_models = if client == AgentClient::Codex { - Some(fetch_codex_model_catalog_specs(&config, &available_models).await) + Some(fetch_codex_model_catalog_specs(&config, &models).await) } else { None }; @@ -1621,7 +1621,7 @@ async fn apply_agent_config( api_key, &model, AgentConfigurationOptions { - models: &available_models, + models: &models, codex_models: codex_models.as_deref(), oauth_configuration, }, @@ -1634,6 +1634,7 @@ async fn reset_agent_config_to_default( gui_config_state: tauri::State<'_, GuiConfigState>, client: String, model: String, + models: Vec, oauth_configuration: bool, ) -> Result { let client = AgentClient::parse(&client)?; @@ -1644,10 +1645,9 @@ async fn reset_agent_config_to_default( let config = gui_config_state.snapshot()?; let api_key = effective_agent_api_key(&config); validate_agent_can_enable(client, &home, config.port, api_key)?; - let available_models = fetch_agent_models(config.port, api_key).await?; - let model = resolve_available_agent_model(&available_models, &validate_agent_model(&model)?)?; + let model = resolve_available_agent_model(&models, &validate_agent_model(&model)?)?; let codex_models = if client == AgentClient::Codex { - Some(fetch_codex_model_catalog_specs(&config, &available_models).await) + Some(fetch_codex_model_catalog_specs(&config, &models).await) } else { None }; diff --git a/src/pages/AgentsPage.tsx b/src/pages/AgentsPage.tsx index 10244df..d9d58bd 100644 --- a/src/pages/AgentsPage.tsx +++ b/src/pages/AgentsPage.tsx @@ -511,6 +511,7 @@ export function AgentsPage() { const [closeAppNotice, setCloseAppNotice] = useState(''); const [closeAppConfirmOpen, setCloseAppConfirmOpen] = useState(false); const [oauthConfiguration, setOauthConfiguration] = useState(false); + const autoLoadedModelClientRef = useRef(null); const loadStatuses = useCallback(async (forceRefresh = false) => { const command = forceRefresh @@ -543,21 +544,27 @@ export function AgentsPage() { setLoading(true); setDetectionError(''); try { - await Promise.all([loadStatuses(true), loadModels()]); + await loadStatuses(true); } catch (requestError) { setDetectionError(String(requestError)); } finally { setLoading(false); } - }, [loadModels, loadStatuses]); + }, [loadStatuses]); useEffect(() => { setLoading(true); setDetectionError(''); - void Promise.all([loadStatuses(), loadModels()]) + void loadStatuses() .catch((requestError) => setDetectionError(String(requestError))) .finally(() => setLoading(false)); - }, [loadModels, loadStatuses]); + }, [loadStatuses]); + + useEffect(() => { + if (autoLoadedModelClientRef.current === selected) return; + autoLoadedModelClientRef.current = selected; + void loadModels(); + }, [loadModels, selected]); useEffect(() => { let disposed = false; @@ -565,7 +572,7 @@ export function AgentsPage() { void listen('config-files-changed', () => { if (disposed) return; setDetectionError(''); - void Promise.all([loadStatuses(true), loadModels()]).catch((requestError) => { + void loadStatuses(true).catch((requestError) => { if (!disposed) setDetectionError(String(requestError)); }); }).then((unlisten) => { @@ -576,7 +583,7 @@ export function AgentsPage() { disposed = true; stop?.(); }; - }, [loadModels, loadStatuses]); + }, [loadStatuses]); useEffect(() => { writeSelectedAgentClient(selected); @@ -724,6 +731,7 @@ export function AgentsPage() { await invoke('apply_agent_config', { client: selected, model, + models, oauthConfiguration, }); await reloadStatusesAfterAction(); @@ -743,6 +751,7 @@ export function AgentsPage() { await invoke('reset_agent_config_to_default', { client: selected, model, + models, oauthConfiguration, }); setDefaultConfirmOpen(false);