google_ai_api_key.rs

 1use anyhow::Result;
 2use credentials_provider::CredentialsProvider;
 3use gpui::{App, Task};
 4
 5const GEMINI_API_KEY_VAR_NAME: &str = "GEMINI_API_KEY";
 6const GOOGLE_AI_API_KEY_VAR_NAME: &str = "GOOGLE_AI_API_KEY";
 7const GOOGLE_AI_EXTENSION_CREDENTIAL_KEY: &str = "extension-llm-google-ai:google-ai";
 8
 9/// Returns the Google AI API key for use by the Gemini CLI.
10///
11/// This function checks the following sources in order:
12/// 1. `GEMINI_API_KEY` environment variable
13/// 2. `GOOGLE_AI_API_KEY` environment variable
14/// 3. Extension credential store (`extension-llm-google-ai:google-ai`)
15pub fn api_key_for_gemini_cli(cx: &mut App) -> Task<Result<String>> {
16    if let Ok(key) = std::env::var(GEMINI_API_KEY_VAR_NAME) {
17        if !key.is_empty() {
18            return Task::ready(Ok(key));
19        }
20    }
21
22    if let Ok(key) = std::env::var(GOOGLE_AI_API_KEY_VAR_NAME) {
23        if !key.is_empty() {
24            return Task::ready(Ok(key));
25        }
26    }
27
28    let credentials_provider = <dyn CredentialsProvider>::global(cx);
29
30    cx.spawn(async move |cx| {
31        let credential = credentials_provider
32            .read_credentials(GOOGLE_AI_EXTENSION_CREDENTIAL_KEY, &cx)
33            .await?;
34
35        match credential {
36            Some((_, key_bytes)) => {
37                let key = String::from_utf8(key_bytes)?;
38                Ok(key)
39            }
40            None => Err(anyhow::anyhow!("No Google AI API key found")),
41        }
42    })
43}