inline assistant: Fix model picker (#29136)

Release Notes:

- inline assistant: Fixed a bug where the default model would be used
even when a specific inline assistant model was configured
This commit is contained in:
Agus Zubiaga 2025-04-20 22:12:57 -03:00 committed by GitHub
parent ceeae790b7
commit 4473b45c3d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 61 additions and 31 deletions

View file

@ -7,7 +7,8 @@ use gpui::{
Focusable, Subscription, Task, WeakEntity, action_with_deprecated_aliases,
};
use language_model::{
AuthenticateError, LanguageModel, LanguageModelProviderId, LanguageModelRegistry,
AuthenticateError, ConfiguredModel, LanguageModel, LanguageModelProviderId,
LanguageModelRegistry,
};
use picker::{Picker, PickerDelegate};
use proto::Plan;
@ -29,9 +30,16 @@ pub struct LanguageModelSelector {
_subscriptions: Vec<Subscription>,
}
#[derive(Clone, Copy)]
pub enum ModelType {
Default,
InlineAssistant,
}
impl LanguageModelSelector {
pub fn new(
on_model_changed: impl Fn(Arc<dyn LanguageModel>, &App) + 'static,
model_type: ModelType,
window: &mut Window,
cx: &mut Context<Self>,
) -> Self {
@ -44,8 +52,9 @@ impl LanguageModelSelector {
language_model_selector: cx.entity().downgrade(),
on_model_changed: on_model_changed.clone(),
all_models: Arc::new(all_models),
selected_index: Self::get_active_model_index(&entries, cx),
selected_index: Self::get_active_model_index(&entries, model_type, cx),
filtered_entries: entries,
model_type,
};
let picker = cx.new(|cx| {
@ -194,8 +203,27 @@ impl LanguageModelSelector {
}
}
fn get_active_model_index(entries: &[LanguageModelPickerEntry], cx: &App) -> usize {
let active_model = LanguageModelRegistry::read_global(cx).default_model();
pub fn active_model(&self, cx: &App) -> Option<ConfiguredModel> {
let model_type = self.picker.read(cx).delegate.model_type;
Self::active_model_by_type(model_type, cx)
}
fn active_model_by_type(model_type: ModelType, cx: &App) -> Option<ConfiguredModel> {
match model_type {
ModelType::Default => LanguageModelRegistry::read_global(cx).default_model(),
ModelType::InlineAssistant => {
LanguageModelRegistry::read_global(cx).inline_assistant_model()
}
}
}
fn get_active_model_index(
entries: &[LanguageModelPickerEntry],
model_type: ModelType,
cx: &App,
) -> usize {
let active_model = Self::active_model_by_type(model_type, cx);
entries
.iter()
.position(|entry| {
@ -300,6 +328,7 @@ pub struct LanguageModelPickerDelegate {
all_models: Arc<GroupedModels>,
filtered_entries: Vec<LanguageModelPickerEntry>,
selected_index: usize,
model_type: ModelType,
}
struct GroupedModels {
@ -493,7 +522,7 @@ impl PickerDelegate for LanguageModelPickerDelegate {
.into_any_element(),
),
LanguageModelPickerEntry::Model(model_info) => {
let active_model = LanguageModelRegistry::read_global(cx).default_model();
let active_model = LanguageModelSelector::active_model_by_type(self.model_type, cx);
let active_provider_id = active_model.as_ref().map(|m| m.provider.id());
let active_model_id = active_model.map(|m| m.model.id());