From e524ff6ad2fc9182e86a7226b947015240372e51 Mon Sep 17 00:00:00 2001 From: Dylan Shade <63427984+dpshade@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:21:52 -0400 Subject: [PATCH] fix(ui): sync provider when selecting cross-provider model Ensure :model cannot persist an invalid provider/model pair when the selected model belongs to a different provider. This keeps session routing consistent with the chosen model and avoids misleading upstream errors. --- crates/forge_main/src/ui.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/crates/forge_main/src/ui.rs b/crates/forge_main/src/ui.rs index 3d6b946bac..cf7e6d4727 100644 --- a/crates/forge_main/src/ui.rs +++ b/crates/forge_main/src/ui.rs @@ -2746,6 +2746,33 @@ impl A + Send + Sync> UI { None => return Ok(None), }; + let selected_provider_id = match provider_filter { + Some(provider_id) => provider_id, + None => self + .api + .get_all_provider_models() + .await? + .into_iter() + .find_map(|provider_models| { + provider_models + .models + .iter() + .any(|candidate| candidate.id == model) + .then_some(provider_models.provider_id) + }) + .ok_or_else(|| anyhow::anyhow!("No provider found for selected model: {model}"))?, + }; + + let current_provider_id = self.api.get_default_provider().await.ok().map(|p| p.id); + + if current_provider_id.as_ref() != Some(&selected_provider_id) { + let provider = self.api.get_provider(&selected_provider_id).await?; + self.finalize_provider_activation(provider, Some(model.clone())) + .await?; + self.update_model(Some(model.clone())); + return Ok(Some(model)); + } + // Update the operating model via API self.api.set_default_model(model.clone()).await?;