This PR dedupes the `AssistantSettings` so we can use the same settings for both Assistant1 and Assistant2. We originally forked them so we could change the Assistant2 settings freely, but given our rollout strategy for the new Assistant, I don't think that makes sense. This also fixes the issue where the JSON language server would show a "Matches multiple schemas when only one must validate" warning in `settings.json`. Closes #23171. Release Notes: - Fixed the "Matches multiple schemas when only one must validate" warning for the `assistant` setting.
89 lines
3.3 KiB
Rust
89 lines
3.3 KiB
Rust
use assistant_settings::AssistantSettings;
|
|
use fs::Fs;
|
|
use gpui::{FocusHandle, View};
|
|
use language_model::LanguageModelRegistry;
|
|
use language_model_selector::{LanguageModelSelector, LanguageModelSelectorPopoverMenu};
|
|
use settings::update_settings_file;
|
|
use std::sync::Arc;
|
|
use ui::{prelude::*, ButtonLike, PopoverMenuHandle, Tooltip};
|
|
|
|
use crate::ToggleModelSelector;
|
|
|
|
pub struct AssistantModelSelector {
|
|
selector: View<LanguageModelSelector>,
|
|
menu_handle: PopoverMenuHandle<LanguageModelSelector>,
|
|
focus_handle: FocusHandle,
|
|
}
|
|
|
|
impl AssistantModelSelector {
|
|
pub(crate) fn new(
|
|
fs: Arc<dyn Fs>,
|
|
menu_handle: PopoverMenuHandle<LanguageModelSelector>,
|
|
focus_handle: FocusHandle,
|
|
cx: &mut WindowContext,
|
|
) -> Self {
|
|
Self {
|
|
selector: cx.new_view(|cx| {
|
|
let fs = fs.clone();
|
|
LanguageModelSelector::new(
|
|
move |model, cx| {
|
|
update_settings_file::<AssistantSettings>(
|
|
fs.clone(),
|
|
cx,
|
|
move |settings, _cx| settings.set_model(model.clone()),
|
|
);
|
|
},
|
|
cx,
|
|
)
|
|
}),
|
|
menu_handle,
|
|
focus_handle,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Render for AssistantModelSelector {
|
|
fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
|
|
let active_model = LanguageModelRegistry::read_global(cx).active_model();
|
|
let focus_handle = self.focus_handle.clone();
|
|
|
|
LanguageModelSelectorPopoverMenu::new(
|
|
self.selector.clone(),
|
|
ButtonLike::new("active-model")
|
|
.style(ButtonStyle::Subtle)
|
|
.child(
|
|
h_flex()
|
|
.gap_0p5()
|
|
.child(
|
|
div()
|
|
.overflow_x_hidden()
|
|
.flex_grow()
|
|
.whitespace_nowrap()
|
|
.child(match active_model {
|
|
Some(model) => h_flex()
|
|
.child(
|
|
Label::new(model.name().0)
|
|
.size(LabelSize::Small)
|
|
.color(Color::Muted),
|
|
)
|
|
.into_any_element(),
|
|
_ => Label::new("No model selected")
|
|
.size(LabelSize::Small)
|
|
.color(Color::Muted)
|
|
.into_any_element(),
|
|
}),
|
|
)
|
|
.child(
|
|
Icon::new(IconName::ChevronDown)
|
|
.color(Color::Muted)
|
|
.size(IconSize::XSmall),
|
|
),
|
|
)
|
|
.tooltip(move |cx| {
|
|
Tooltip::for_action_in("Change Model", &ToggleModelSelector, &focus_handle, cx)
|
|
}),
|
|
)
|
|
.with_handle(self.menu_handle.clone())
|
|
}
|
|
}
|