From 5866671ba3c43f6d2cdd1a07bcc2a35ffb89fa7c Mon Sep 17 00:00:00 2001 From: "zed-zippy[bot]" <234243425+zed-zippy[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 10:58:09 +0000 Subject: [PATCH] Fix agent default model not picking up after authentication resolve (#54397) (cherry-pick to preview) (#54399) Cherry-pick of #54397 to preview ---- Regression in https://github.com/zed-industries/zed/pull/54125 Release Notes: - agent: Fixed an issue where the default Zed model would not get selected after sign-in completed --------- Co-authored-by: Bennet Bo Fenner Co-authored-by: Ben Brandt Co-authored-by: Smit Barmase Co-authored-by: Bennet Bo Fenner Co-authored-by: Ben Brandt --- crates/agent/src/agent.rs | 7 +++---- crates/language_models/src/language_models.rs | 13 ------------- crates/language_models/src/provider/cloud.rs | 17 ++++++++++++++--- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/crates/agent/src/agent.rs b/crates/agent/src/agent.rs index 160172c5c49d3af5548ccd76af1e441662fadfbb..6765b45daec799fa7df9608065d165296119f6e6 100644 --- a/crates/agent/src/agent.rs +++ b/crates/agent/src/agent.rs @@ -755,10 +755,9 @@ impl NativeAgent { for session in self.sessions.values_mut() { session.thread.update(cx, |thread, cx| { - let should_update_model = thread.model().is_none() - || (thread.is_empty() - && matches!(event, language_model::Event::DefaultModelChanged)); - if should_update_model && let Some(model) = default_model.clone() { + if thread.model().is_none() + && let Some(model) = default_model.clone() + { thread.set_model(model, cx); cx.notify(); } diff --git a/crates/language_models/src/language_models.rs b/crates/language_models/src/language_models.rs index bd29dbe08dbd16af25be4bd55b44067f47fa2a8a..d604ee432e487cdf2d917b0ae01980ba9fb39f24 100644 --- a/crates/language_models/src/language_models.rs +++ b/crates/language_models/src/language_models.rs @@ -119,19 +119,6 @@ pub fn init(user_store: Entity, client: Arc, cx: &mut App) { ); }); - cx.subscribe( - ®istry, - |_registry, event: &language_model::Event, cx| match event { - language_model::Event::ProviderStateChanged(_) - | language_model::Event::AddedProvider(_) - | language_model::Event::RemovedProvider(_) => { - update_environment_fallback_model(cx); - } - _ => {} - }, - ) - .detach(); - let registry = registry.downgrade(); cx.observe_global::(move |cx| { let Some(registry) = registry.upgrade() else { diff --git a/crates/language_models/src/provider/cloud.rs b/crates/language_models/src/provider/cloud.rs index 9fef05e7555bc55a0ea6a3081280ea85e201dca9..ffa4bcb9863da958ac76c272dcd667649ef4bb6a 100644 --- a/crates/language_models/src/provider/cloud.rs +++ b/crates/language_models/src/provider/cloud.rs @@ -1,5 +1,6 @@ use ai_onboarding::YoungAccountBanner; use anyhow::Result; +use client::Status; use client::{Client, RefreshLlmTokenListener, UserStore, global_llm_token, zed_urls}; use cloud_api_client::LlmApiToken; use cloud_api_types::OrganizationId; @@ -249,11 +250,21 @@ impl LanguageModelProvider for CloudLanguageModelProvider { fn is_authenticated(&self, cx: &App) -> bool { let state = self.state.read(cx); - !state.is_signed_out(cx) + let status = *state.client.status().borrow(); + matches!(status, Status::Authenticated | Status::Connected { .. }) } - fn authenticate(&self, _cx: &mut App) -> Task> { - Task::ready(Ok(())) + fn authenticate(&self, cx: &mut App) -> Task> { + let mut status = self.state.read(cx).client.status(); + if !status.borrow().is_signing_in() { + return Task::ready(Ok(())); + } + cx.background_spawn(async move { + while status.borrow().is_signing_in() { + status.next().await; + } + Ok(()) + }) } fn configuration_view(