From 2369fc91b4dc84fb22b59a5aea006ffc37f07150 Mon Sep 17 00:00:00 2001 From: Oleksiy Syvokon Date: Thu, 18 Dec 2025 21:45:18 +0200 Subject: [PATCH] Settings UI --- .../src/edit_prediction_button.rs | 2 +- .../pages/edit_prediction_provider_setup.rs | 105 ++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/crates/edit_prediction_ui/src/edit_prediction_button.rs b/crates/edit_prediction_ui/src/edit_prediction_button.rs index ff267dbff71cc2d9c821bb6e998396929c23b5bd..6e2f9386927ede9927f3367bbf8e2d62aa2a790d 100644 --- a/crates/edit_prediction_ui/src/edit_prediction_button.rs +++ b/crates/edit_prediction_ui/src/edit_prediction_button.rs @@ -314,7 +314,7 @@ impl Render for EditPredictionButton { }) .anchor(Corner::BottomRight) .trigger_with_tooltip( - IconButton::new("ollama-icon", IconName::ZedPredict) + IconButton::new("ollama-icon", IconName::AiOllama) .shape(IconButtonShape::Square) .when(!enabled, |this| { this.indicator(Indicator::dot().color(Color::Ignored)) diff --git a/crates/settings_ui/src/pages/edit_prediction_provider_setup.rs b/crates/settings_ui/src/pages/edit_prediction_provider_setup.rs index fb8f967613fa195080f62c5ab2ce76a43f3d1e22..09a5aabdecbcf7df288a3b2bb3ed79d2e76f26ae 100644 --- a/crates/settings_ui/src/pages/edit_prediction_provider_setup.rs +++ b/crates/settings_ui/src/pages/edit_prediction_provider_setup.rs @@ -8,6 +8,9 @@ use gpui::{Entity, ScrollHandle, prelude::*}; use language_models::provider::mistral::{CODESTRAL_API_URL, codestral_api_key}; use ui::{ButtonLink, ConfiguredApiCard, WithScrollbar, prelude::*}; +const OLLAMA_API_URL_PLACEHOLDER: &str = "http://localhost:11434"; +const OLLAMA_MODEL_PLACEHOLDER: &str = "qwen2.5-coder:3b-base"; + use crate::{ SettingField, SettingItem, SettingsFieldMetadata, SettingsPageItem, SettingsWindow, USER, components::{SettingsInputField, SettingsSectionHeader}, @@ -82,6 +85,7 @@ impl Render for EditPredictionSetupPage { ) .into_any_element(), ), + Some(render_ollama_provider(settings_window.clone(), window, cx).into_any_element()), ]; div() @@ -236,6 +240,107 @@ fn render_api_key_provider( }) } +fn render_ollama_provider( + settings_window: Entity, + window: &mut Window, + cx: &mut Context, +) -> impl IntoElement { + let ollama_settings = ollama_settings(); + let additional_fields = settings_window.update(cx, |settings_window, cx| { + settings_window + .render_sub_page_items_section(ollama_settings.iter().enumerate(), None, window, cx) + .into_any_element() + }); + + v_flex() + .id("ollama") + .min_w_0() + .pt_8() + .gap_1p5() + .child( + SettingsSectionHeader::new("Ollama") + .icon(IconName::ZedPredict) + .no_padding(true), + ) + .child( + Label::new("Configure the local Ollama server and model used for edit predictions.") + .size(LabelSize::Small) + .color(Color::Muted), + ) + .child(additional_fields) +} + +fn ollama_settings() -> Box<[SettingsPageItem]> { + Box::new([ + SettingsPageItem::SettingItem(SettingItem { + title: "API URL", + description: "The base URL of your Ollama server.", + field: Box::new(SettingField { + pick: |settings| { + settings + .project + .all_languages + .edit_predictions + .as_ref()? + .ollama + .as_ref()? + .api_url + .as_ref() + }, + write: |settings, value| { + settings + .project + .all_languages + .edit_predictions + .get_or_insert_default() + .ollama + .get_or_insert_default() + .api_url = value; + }, + json_path: Some("edit_predictions.ollama.api_url"), + }), + metadata: Some(Box::new(SettingsFieldMetadata { + placeholder: Some(OLLAMA_API_URL_PLACEHOLDER), + ..Default::default() + })), + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Model", + description: "The Ollama model to use for edit predictions.", + field: Box::new(SettingField { + pick: |settings| { + settings + .project + .all_languages + .edit_predictions + .as_ref()? + .ollama + .as_ref()? + .model + .as_ref() + }, + write: |settings, value| { + settings + .project + .all_languages + .edit_predictions + .get_or_insert_default() + .ollama + .get_or_insert_default() + .model = value; + }, + json_path: Some("edit_predictions.ollama.model"), + }), + metadata: Some(Box::new(SettingsFieldMetadata { + placeholder: Some(OLLAMA_MODEL_PLACEHOLDER), + ..Default::default() + })), + files: USER, + }), + ]) +} + fn codestral_settings() -> Box<[SettingsPageItem]> { Box::new([ SettingsPageItem::SettingItem(SettingItem {