diff --git a/crates/extension_api/src/extension_api.rs b/crates/extension_api/src/extension_api.rs index 555ba6dcc260b6c4e9f9952589c080e87820f10b..8680ecbd886b379d686825968a1d8a43425920a6 100644 --- a/crates/extension_api/src/extension_api.rs +++ b/crates/extension_api/src/extension_api.rs @@ -302,13 +302,6 @@ pub trait Extension: Send + Sync { false } - /// Attempt to authenticate the provider. - /// This is called for background credential checks - it should check for - /// existing credentials and return Ok if found, or an error if not. - fn llm_provider_authenticate(&mut self, _provider_id: &str) -> Result<(), String> { - Err("`llm_provider_authenticate` not implemented".to_string()) - } - /// Start an OAuth device flow sign-in. /// This is called when the user explicitly clicks "Sign in with GitHub" or similar. /// Opens the browser to the verification URL and returns the user code that should @@ -651,10 +644,6 @@ impl wit::Guest for Component { extension().llm_provider_is_authenticated(&provider_id) } - fn llm_provider_authenticate(provider_id: String) -> Result<(), String> { - extension().llm_provider_authenticate(&provider_id) - } - fn llm_provider_start_device_flow_sign_in(provider_id: String) -> Result { extension().llm_provider_start_device_flow_sign_in(&provider_id) } diff --git a/crates/extension_api/wit/since_v0.8.0/extension.wit b/crates/extension_api/wit/since_v0.8.0/extension.wit index ef9f464d29d8021a2dc14ac2b6c08c6df006c2e0..4f1146c2604559c0adafe8a2fe76af233dada3fc 100644 --- a/crates/extension_api/wit/since_v0.8.0/extension.wit +++ b/crates/extension_api/wit/since_v0.8.0/extension.wit @@ -183,12 +183,6 @@ world extension { /// Check if the provider is authenticated. export llm-provider-is-authenticated: func(provider-id: string) -> bool; - /// Attempt to authenticate the provider. - /// This is called for background credential checks - it should check for - /// existing credentials and return Ok if found, or an error if not. - /// For interactive OAuth flows, use the device flow functions instead. - export llm-provider-authenticate: func(provider-id: string) -> result<_, string>; - /// Start an OAuth device flow sign-in. /// This is called when the user explicitly clicks "Sign in with GitHub" or similar. /// diff --git a/crates/extension_host/src/wasm_host/llm_provider.rs b/crates/extension_host/src/wasm_host/llm_provider.rs index ad9d6c68a6c5c5f20d9b3db1d864ed1ef24e9c29..c1fed7bde87faefd483d479360f4614974fe2551 100644 --- a/crates/extension_host/src/wasm_host/llm_provider.rs +++ b/crates/extension_host/src/wasm_host/llm_provider.rs @@ -206,59 +206,13 @@ impl LanguageModelProvider for ExtensionLanguageModelProvider { } fn authenticate(&self, cx: &mut App) -> Task> { - let extension = self.extension.clone(); - let provider_id = self.provider_info.id.clone(); - let state = self.state.clone(); - - cx.spawn(async move |cx| { - let result = extension - .call({ - let provider_id = provider_id.clone(); - |extension, store| { - async move { - extension - .call_llm_provider_authenticate(store, &provider_id) - .await - } - .boxed() - } - }) - .await; - - match result { - Ok(Ok(Ok(()))) => { - // After successful auth, refresh the models list - let models_result = extension - .call({ - let provider_id = provider_id.clone(); - |ext, store| { - async move { - ext.call_llm_provider_models(store, &provider_id).await - } - .boxed() - } - }) - .await; - - let new_models: Vec = match models_result { - Ok(Ok(Ok(models))) => models, - _ => Vec::new(), - }; + // Check if already authenticated via is_authenticated + if self.is_authenticated(cx) { + return Task::ready(Ok(())); + } - cx.update(|cx| { - state.update(cx, |state, cx| { - state.is_authenticated = true; - state.available_models = new_models; - cx.notify(); - }); - })?; - Ok(()) - } - Ok(Ok(Err(e))) => Err(AuthenticateError::Other(anyhow!("{}", e))), - Ok(Err(e)) => Err(AuthenticateError::Other(e)), - Err(e) => Err(AuthenticateError::Other(e)), - } - }) + // Not authenticated - return error indicating credentials not found + Task::ready(Err(AuthenticateError::CredentialsNotFound)) } fn configuration_view( diff --git a/crates/extension_host/src/wasm_host/wit.rs b/crates/extension_host/src/wasm_host/wit.rs index c2b22d2ad0227830a424f482696cb85b6e88e708..9d0f7f0d231b8980ba4d5f005ccbedc464c3ab1c 100644 --- a/crates/extension_host/src/wasm_host/wit.rs +++ b/crates/extension_host/src/wasm_host/wit.rs @@ -1230,17 +1230,6 @@ impl Extension { } } - pub async fn call_llm_provider_authenticate( - &self, - store: &mut Store, - provider_id: &str, - ) -> Result> { - match self { - Extension::V0_8_0(ext) => ext.call_llm_provider_authenticate(store, provider_id).await, - _ => anyhow::bail!("`llm_provider_authenticate` not available prior to v0.8.0"), - } - } - pub async fn call_llm_provider_start_device_flow_sign_in( &self, store: &mut Store, diff --git a/extensions/anthropic/src/anthropic.rs b/extensions/anthropic/src/anthropic.rs index dc71c72b4e305f378163dde88a500f071b013eef..253821f83dfff55e0f59b0ea96f1a159d13fa920 100644 --- a/extensions/anthropic/src/anthropic.rs +++ b/extensions/anthropic/src/anthropic.rs @@ -521,14 +521,6 @@ impl zed::Extension for AnthropicProvider { llm_get_credential("anthropic").is_some() } - fn llm_provider_authenticate(&mut self, _provider_id: &str) -> Result<(), String> { - if llm_get_credential("anthropic").is_some() { - Ok(()) - } else { - Err("No API key configured".to_string()) - } - } - fn llm_provider_settings_markdown(&self, _provider_id: &str) -> Option { Some( "To use Anthropic, you need an API key. You can create one [here](https://console.anthropic.com/settings/keys).".to_string(), diff --git a/extensions/copilot-chat/src/copilot_chat.rs b/extensions/copilot-chat/src/copilot_chat.rs index 156e9497ca24f14328e4fd97898b457e7ec69d0f..f0198213a0e523788cb9185957a836b19a8a3827 100644 --- a/extensions/copilot-chat/src/copilot_chat.rs +++ b/extensions/copilot-chat/src/copilot_chat.rs @@ -451,18 +451,6 @@ impl zed::Extension for CopilotChatProvider { ) } - fn llm_provider_authenticate(&mut self, _provider_id: &str) -> Result<(), String> { - // Check if we have existing credentials - if llm_get_credential("copilot-chat").is_some() { - return Ok(()); - } - - // No credentials found - return error for background auth checks. - // The device flow will be triggered by the host when the user clicks - // the "Sign in with GitHub" button, which calls llm_provider_start_device_flow_sign_in. - Err("CredentialsNotFound".to_string()) - } - fn llm_provider_start_device_flow_sign_in( &mut self, _provider_id: &str, diff --git a/extensions/google-ai/src/google_ai.rs b/extensions/google-ai/src/google_ai.rs index 10d8c9fe2d1383bf55c66b1405d8c9d0d7032a45..259b4a8da856cf3109b9b935eff1006f6bcd6be3 100644 --- a/extensions/google-ai/src/google_ai.rs +++ b/extensions/google-ai/src/google_ai.rs @@ -598,14 +598,6 @@ impl zed::Extension for GoogleAiProvider { llm_get_credential("google-ai").is_some() } - fn llm_provider_authenticate(&mut self, _provider_id: &str) -> Result<(), String> { - if llm_get_credential("google-ai").is_some() { - Ok(()) - } else { - Err("No API key configured".to_string()) - } - } - fn llm_provider_settings_markdown(&self, _provider_id: &str) -> Option { Some( "To use Google AI, you need an API key. You can create one [here](https://aistudio.google.com/apikey).".to_string(), diff --git a/extensions/open-router/src/open_router.rs b/extensions/open-router/src/open_router.rs index 61c32022adbde691ffaa594d9f4d965c61137b72..69c53f16f7b1938ef4e1a2b061d651c39df7c259 100644 --- a/extensions/open-router/src/open_router.rs +++ b/extensions/open-router/src/open_router.rs @@ -566,14 +566,6 @@ impl zed::Extension for OpenRouterProvider { llm_get_credential("open_router").is_some() } - fn llm_provider_authenticate(&mut self, _provider_id: &str) -> Result<(), String> { - if llm_get_credential("open_router").is_some() { - Ok(()) - } else { - Err("No API key configured".to_string()) - } - } - fn llm_provider_settings_markdown(&self, _provider_id: &str) -> Option { Some( "To use OpenRouter, you need an API key. You can create one [here](https://openrouter.ai/keys).".to_string(), diff --git a/extensions/openai/src/openai.rs b/extensions/openai/src/openai.rs index a8896e8a81606abcddf9eab0fa0c70c0121649e8..dea953a50c1c551e46866575c1e41a892537bdf6 100644 --- a/extensions/openai/src/openai.rs +++ b/extensions/openai/src/openai.rs @@ -476,14 +476,6 @@ impl zed::Extension for OpenAiProvider { llm_get_credential("openai").is_some() } - fn llm_provider_authenticate(&mut self, _provider_id: &str) -> Result<(), String> { - if llm_get_credential("openai").is_some() { - Ok(()) - } else { - Err("No API key configured".to_string()) - } - } - fn llm_provider_settings_markdown(&self, _provider_id: &str) -> Option { Some( "To use OpenAI, you need an API key. You can create one [here](https://platform.openai.com/api-keys).".to_string(),