@@ -1,5 +1,6 @@
use anyhow::{Context as _, Result, anyhow};
use collections::BTreeMap;
+use credentials_provider::CredentialsProvider;
use futures::{FutureExt, Stream, StreamExt, future, future::BoxFuture};
use google_ai::{
FunctionDeclaration, GenerateContentResponse, GoogleModelMode, Part, SystemInstruction,
@@ -31,7 +32,7 @@ use ui::{ButtonLink, ConfiguredApiCard, List, ListBulletItem, prelude::*};
use ui_input::InputField;
use util::ResultExt;
-use language_model::ApiKeyState;
+use language_model::{ApiKey, ApiKeyState};
const PROVIDER_ID: LanguageModelProviderId = language_model::GOOGLE_PROVIDER_ID;
const PROVIDER_NAME: LanguageModelProviderName = language_model::GOOGLE_PROVIDER_NAME;
@@ -116,6 +117,22 @@ impl GoogleLanguageModelProvider {
})
}
+ pub fn api_key_for_gemini_cli(cx: &mut App) -> Task<Result<String>> {
+ if let Some(key) = API_KEY_ENV_VAR.value.clone() {
+ return Task::ready(Ok(key));
+ }
+ let credentials_provider = <dyn CredentialsProvider>::global(cx);
+ let api_url = Self::api_url(cx).to_string();
+ cx.spawn(async move |cx| {
+ Ok(
+ ApiKey::load_from_system_keychain(&api_url, credentials_provider.as_ref(), cx)
+ .await?
+ .key()
+ .to_string(),
+ )
+ })
+ }
+
fn settings(cx: &App) -> &GoogleSettings {
&crate::AllLanguageModelSettings::get_global(cx).google
}
@@ -841,7 +858,6 @@ impl Render for ConfigurationView {
.on_action(cx.listener(Self::save_api_key))
.child(Label::new(format!("To use {}, you need to add an API key. Follow these steps:", match &self.target_agent {
ConfigurationViewTargetAgent::ZedAgent => "Zed's agent with Google AI".into(),
- ConfigurationViewTargetAgent::EditPrediction => "Google AI for edit predictions".into(),
ConfigurationViewTargetAgent::Other(agent) => agent.clone(),
})))
.child(