diff --git a/Cargo.lock b/Cargo.lock index c6504ae59826e9c4e70220f49d1bd6ae92425d62..091bc1b4173020b80bcb532abcc637d35d6e34a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5344,11 +5344,13 @@ dependencies = [ "gpui", "indoc", "language", + "language_model", "log", "lsp", "markdown", "menu", "multi_buffer", + "ollama", "paths", "project", "regex", @@ -10886,6 +10888,7 @@ dependencies = [ "gpui", "http_client", "language", + "language_model", "log", "schemars", "serde", diff --git a/crates/edit_prediction_ui/Cargo.toml b/crates/edit_prediction_ui/Cargo.toml index b406a450601bef908c27a48be14fe9b1f2204c08..a0888ab0572d105fede93269aa485cae98545e16 100644 --- a/crates/edit_prediction_ui/Cargo.toml +++ b/crates/edit_prediction_ui/Cargo.toml @@ -32,9 +32,11 @@ futures.workspace = true gpui.workspace = true indoc.workspace = true language.workspace = true +language_model.workspace = true markdown.workspace = true menu.workspace = true multi_buffer.workspace = true +ollama.workspace = true paths.workspace = true project.workspace = true regex.workspace = true diff --git a/crates/edit_prediction_ui/src/edit_prediction_button.rs b/crates/edit_prediction_ui/src/edit_prediction_button.rs index ad3d0d93fdd882c35ae565b4a9474e75bd75e07d..dc27afac817ffbf53804dadbe400097948b42e9b 100644 --- a/crates/edit_prediction_ui/src/edit_prediction_button.rs +++ b/crates/edit_prediction_ui/src/edit_prediction_button.rs @@ -22,6 +22,7 @@ use language::{ EditPredictionsMode, File, Language, language_settings::{self, AllLanguageSettings, EditPredictionProvider, all_language_settings}, }; +use ollama::OllamaEditPredictionDelegate; use project::DisableAiSettings; use regex::Regex; use settings::{ @@ -581,8 +582,9 @@ impl EditPredictionButton { providers.push(EditPredictionProvider::Codestral); } - // Ollama is always available as it runs locally - providers.push(EditPredictionProvider::Ollama); + if OllamaEditPredictionDelegate::is_available(cx) { + providers.push(EditPredictionProvider::Ollama); + } if cx.has_flag::() && edit_prediction::sweep_ai::sweep_api_token(cx) diff --git a/crates/ollama/Cargo.toml b/crates/ollama/Cargo.toml index a44d5df916973e68c9e73b82cd774a95d0264f53..74fdd6c1d5016e7da527e8d993a8772eb709dd52 100644 --- a/crates/ollama/Cargo.toml +++ b/crates/ollama/Cargo.toml @@ -23,6 +23,7 @@ futures.workspace = true gpui.workspace = true http_client.workspace = true language.workspace = true +language_model.workspace = true log.workspace = true schemars = { workspace = true, optional = true } serde.workspace = true diff --git a/crates/ollama/src/ollama_edit_prediction_delegate.rs b/crates/ollama/src/ollama_edit_prediction_delegate.rs index 7ada59098f77cf0d9ecd6c074e189c9bd6abb2f9..2c4e4f38f86c1dfa0b557b432526b42b0ba9e24c 100644 --- a/crates/ollama/src/ollama_edit_prediction_delegate.rs +++ b/crates/ollama/src/ollama_edit_prediction_delegate.rs @@ -7,6 +7,7 @@ use http_client::HttpClient; use language::{ Anchor, Buffer, BufferSnapshot, EditPreview, ToPoint, language_settings::all_language_settings, }; +use language_model::{LanguageModelProviderId, LanguageModelRegistry}; use serde::{Deserialize, Serialize}; use std::{ ops::Range, @@ -53,6 +54,13 @@ impl OllamaEditPredictionDelegate { } } + pub fn is_available(cx: &App) -> bool { + let ollama_provider_id = LanguageModelProviderId::new("ollama"); + LanguageModelRegistry::read_global(cx) + .provider(&ollama_provider_id) + .is_some_and(|provider| provider.is_authenticated(cx)) + } + async fn fetch_completion( http_client: Arc, prompt: String, @@ -130,8 +138,8 @@ impl EditPredictionDelegate for OllamaEditPredictionDelegate { true } - fn is_enabled(&self, _buffer: &Entity, _cursor_position: Anchor, _cx: &App) -> bool { - true + fn is_enabled(&self, _buffer: &Entity, _cursor_position: Anchor, cx: &App) -> bool { + Self::is_available(cx) } fn is_refreshing(&self, _cx: &App) -> bool {