assistant: Cleanup model selector (#15843)

We changed the following for the model selector:
- Fixed displaying checkmarks for selected models when using models with
the same name from different providers
- We now show the icon for the active model instead of displaying the
provider name in the trigger of the model selector
- Only display the footer when the language models feature flag is zed,
so that we don't release the hint for Zed Pro to preview tomorrow

<img width="253" alt="image"
src="https://github.com/user-attachments/assets/f95ccfb6-c0cf-43d4-9637-e2823100a427">


Release Notes:

- N/A

---------

Co-authored-by: Thorsten <thorsten@zed.dev>
This commit is contained in:
Bennet Bo Fenner 2024-08-06 11:59:54 +02:00 committed by GitHub
parent fb1cd7cae2
commit 56abd68d0e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 22 deletions

View file

@ -3014,6 +3014,10 @@ impl Render for ContextEditorToolbarItem {
) )
.child(self.model_summary_editor.clone()) .child(self.model_summary_editor.clone())
}); });
let active_provider = LanguageModelRegistry::read_global(cx).active_provider();
let active_model = LanguageModelRegistry::read_global(cx).active_model();
let right_side = h_flex() let right_side = h_flex()
.gap_2() .gap_2()
.child(ModelSelector::new( .child(ModelSelector::new(
@ -3029,22 +3033,25 @@ impl Render for ContextEditorToolbarItem {
.overflow_x_hidden() .overflow_x_hidden()
.flex_grow() .flex_grow()
.whitespace_nowrap() .whitespace_nowrap()
.child( .child(match (active_provider, active_model) {
Label::new( (Some(provider), Some(model)) => h_flex()
LanguageModelRegistry::read_global(cx) .gap_1()
.active_model() .child(
.map(|model| { Icon::new(provider.icon())
format!( .color(Color::Muted)
"{}: {}", .size(IconSize::XSmall),
model.provider_name().0, )
model.name().0 .child(
) Label::new(model.name().0)
}) .size(LabelSize::Small)
.unwrap_or_else(|| "No model selected".into()), .color(Color::Muted),
) )
.size(LabelSize::Small) .into_any_element(),
.color(Color::Muted), _ => Label::new("No model selected")
), .size(LabelSize::Small)
.color(Color::Muted)
.into_any_element(),
}),
) )
.child( .child(
Icon::new(IconName::ChevronDown) Icon::new(IconName::ChevronDown)

View file

@ -1,3 +1,4 @@
use feature_flags::LanguageModels;
use language_model::{LanguageModel, LanguageModelAvailability, LanguageModelRegistry}; use language_model::{LanguageModel, LanguageModelAvailability, LanguageModelRegistry};
use proto::Plan; use proto::Plan;
@ -34,7 +35,6 @@ pub struct ModelPickerDelegate {
#[derive(Clone)] #[derive(Clone)]
struct ModelInfo { struct ModelInfo {
model: Arc<dyn LanguageModel>, model: Arc<dyn LanguageModel>,
_provider_name: SharedString,
provider_icon: IconName, provider_icon: IconName,
availability: LanguageModelAvailability, availability: LanguageModelAvailability,
is_selected: bool, is_selected: bool,
@ -123,11 +123,14 @@ impl PickerDelegate for ModelPickerDelegate {
// Update the selection status // Update the selection status
let selected_model_id = model_info.model.id(); let selected_model_id = model_info.model.id();
let selected_provider_id = model_info.model.provider_id();
for model in &mut self.all_models { for model in &mut self.all_models {
model.is_selected = model.model.id() == selected_model_id; model.is_selected = model.model.id() == selected_model_id
&& model.model.provider_id() == selected_provider_id;
} }
for model in &mut self.filtered_models { for model in &mut self.filtered_models {
model.is_selected = model.model.id() == selected_model_id; model.is_selected = model.model.id() == selected_model_id
&& model.model.provider_id() == selected_provider_id;
} }
} }
} }
@ -186,6 +189,11 @@ impl PickerDelegate for ModelPickerDelegate {
} }
fn render_footer(&self, cx: &mut ViewContext<Picker<Self>>) -> Option<gpui::AnyElement> { fn render_footer(&self, cx: &mut ViewContext<Picker<Self>>) -> Option<gpui::AnyElement> {
use feature_flags::FeatureFlagAppExt;
if !cx.has_flag::<LanguageModels>() {
return None;
}
let plan = proto::Plan::ZedPro; let plan = proto::Plan::ZedPro;
let is_trial = false; let is_trial = false;
@ -247,9 +255,8 @@ impl<T: PopoverTrigger> RenderOnce for ModelSelector<T> {
.providers() .providers()
.iter() .iter()
.flat_map(|provider| { .flat_map(|provider| {
let provider_name = provider.name().0.clone();
let provider_icon = provider.icon();
let provider_id = provider.id(); let provider_id = provider.id();
let provider_icon = provider.icon();
let selected_model = selected_model.clone(); let selected_model = selected_model.clone();
let selected_provider = selected_provider.clone(); let selected_provider = selected_provider.clone();
@ -258,7 +265,6 @@ impl<T: PopoverTrigger> RenderOnce for ModelSelector<T> {
ModelInfo { ModelInfo {
model: model.clone(), model: model.clone(),
_provider_name: provider_name.clone(),
provider_icon, provider_icon,
availability: model.availability(), availability: model.availability(),
is_selected: selected_model.as_ref() == Some(&model.id()) is_selected: selected_model.as_ref() == Some(&model.id())