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}