agent: Introduce ModelUsageContext (#32076)

This PR is a refactor of the existing `ModelType` in
`agent_model_selector`.

In #31848 we also need to know which context we are operating in, to
check if the configured model has image support.
In order to deduplicate the logic needed, I introduced a new type called
`ModelUsageContext` which can be used throughout the agent crate


Release Notes:

- N/A
This commit is contained in:
Bennet Bo Fenner 2025-06-04 17:35:50 +02:00 committed by GitHub
parent c9aadadc4b
commit beb0d49dc4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 36 additions and 28 deletions

View file

@ -33,9 +33,11 @@ use assistant_slash_command::SlashCommandRegistry;
use client::Client; use client::Client;
use feature_flags::FeatureFlagAppExt as _; use feature_flags::FeatureFlagAppExt as _;
use fs::Fs; use fs::Fs;
use gpui::{App, actions, impl_actions}; use gpui::{App, Entity, actions, impl_actions};
use language::LanguageRegistry; use language::LanguageRegistry;
use language_model::{LanguageModelId, LanguageModelProviderId, LanguageModelRegistry}; use language_model::{
ConfiguredModel, LanguageModelId, LanguageModelProviderId, LanguageModelRegistry,
};
use prompt_store::PromptBuilder; use prompt_store::PromptBuilder;
use schemars::JsonSchema; use schemars::JsonSchema;
use serde::Deserialize; use serde::Deserialize;
@ -115,6 +117,23 @@ impl ManageProfiles {
impl_actions!(agent, [NewThread, ManageProfiles]); impl_actions!(agent, [NewThread, ManageProfiles]);
#[derive(Clone)]
pub(crate) enum ModelUsageContext {
Thread(Entity<Thread>),
InlineAssistant,
}
impl ModelUsageContext {
pub fn configured_model(&self, cx: &App) -> Option<ConfiguredModel> {
match self {
Self::Thread(thread) => thread.read(cx).configured_model(),
Self::InlineAssistant => {
LanguageModelRegistry::read_global(cx).inline_assistant_model()
}
}
}
}
/// Initializes the `agent` crate. /// Initializes the `agent` crate.
pub fn init( pub fn init(
fs: Arc<dyn Fs>, fs: Arc<dyn Fs>,

View file

@ -3,7 +3,7 @@ use fs::Fs;
use gpui::{Entity, FocusHandle, SharedString}; use gpui::{Entity, FocusHandle, SharedString};
use picker::popover_menu::PickerPopoverMenu; use picker::popover_menu::PickerPopoverMenu;
use crate::Thread; use crate::ModelUsageContext;
use assistant_context_editor::language_model_selector::{ use assistant_context_editor::language_model_selector::{
LanguageModelSelector, ToggleModelSelector, language_model_selector, LanguageModelSelector, ToggleModelSelector, language_model_selector,
}; };
@ -12,12 +12,6 @@ use settings::update_settings_file;
use std::sync::Arc; use std::sync::Arc;
use ui::{PopoverMenuHandle, Tooltip, prelude::*}; use ui::{PopoverMenuHandle, Tooltip, prelude::*};
#[derive(Clone)]
pub enum ModelType {
Default(Entity<Thread>),
InlineAssistant,
}
pub struct AgentModelSelector { pub struct AgentModelSelector {
selector: Entity<LanguageModelSelector>, selector: Entity<LanguageModelSelector>,
menu_handle: PopoverMenuHandle<LanguageModelSelector>, menu_handle: PopoverMenuHandle<LanguageModelSelector>,
@ -29,7 +23,7 @@ impl AgentModelSelector {
fs: Arc<dyn Fs>, fs: Arc<dyn Fs>,
menu_handle: PopoverMenuHandle<LanguageModelSelector>, menu_handle: PopoverMenuHandle<LanguageModelSelector>,
focus_handle: FocusHandle, focus_handle: FocusHandle,
model_type: ModelType, model_usage_context: ModelUsageContext,
window: &mut Window, window: &mut Window,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) -> Self { ) -> Self {
@ -38,19 +32,14 @@ impl AgentModelSelector {
let fs = fs.clone(); let fs = fs.clone();
language_model_selector( language_model_selector(
{ {
let model_type = model_type.clone(); let model_context = model_usage_context.clone();
move |cx| match &model_type { move |cx| model_context.configured_model(cx)
ModelType::Default(thread) => thread.read(cx).configured_model(),
ModelType::InlineAssistant => {
LanguageModelRegistry::read_global(cx).inline_assistant_model()
}
}
}, },
move |model, cx| { move |model, cx| {
let provider = model.provider_id().0.to_string(); let provider = model.provider_id().0.to_string();
let model_id = model.id().0.to_string(); let model_id = model.id().0.to_string();
match &model_type { match &model_usage_context {
ModelType::Default(thread) => { ModelUsageContext::Thread(thread) => {
thread.update(cx, |thread, cx| { thread.update(cx, |thread, cx| {
let registry = LanguageModelRegistry::read_global(cx); let registry = LanguageModelRegistry::read_global(cx);
if let Some(provider) = registry.provider(&model.provider_id()) if let Some(provider) = registry.provider(&model.provider_id())
@ -72,7 +61,7 @@ impl AgentModelSelector {
}, },
); );
} }
ModelType::InlineAssistant => { ModelUsageContext::InlineAssistant => {
update_settings_file::<AgentSettings>( update_settings_file::<AgentSettings>(
fs.clone(), fs.clone(),
cx, cx,

View file

@ -1,4 +1,4 @@
use crate::agent_model_selector::{AgentModelSelector, ModelType}; use crate::agent_model_selector::AgentModelSelector;
use crate::buffer_codegen::BufferCodegen; use crate::buffer_codegen::BufferCodegen;
use crate::context::ContextCreasesAddon; use crate::context::ContextCreasesAddon;
use crate::context_picker::{ContextPicker, ContextPickerCompletionProvider}; use crate::context_picker::{ContextPicker, ContextPickerCompletionProvider};
@ -7,7 +7,7 @@ use crate::context_strip::{ContextStrip, ContextStripEvent, SuggestContextKind};
use crate::message_editor::{extract_message_creases, insert_message_creases}; use crate::message_editor::{extract_message_creases, insert_message_creases};
use crate::terminal_codegen::TerminalCodegen; use crate::terminal_codegen::TerminalCodegen;
use crate::thread_store::{TextThreadStore, ThreadStore}; use crate::thread_store::{TextThreadStore, ThreadStore};
use crate::{CycleNextInlineAssist, CyclePreviousInlineAssist}; use crate::{CycleNextInlineAssist, CyclePreviousInlineAssist, ModelUsageContext};
use crate::{RemoveAllContext, ToggleContextPicker}; use crate::{RemoveAllContext, ToggleContextPicker};
use assistant_context_editor::language_model_selector::ToggleModelSelector; use assistant_context_editor::language_model_selector::ToggleModelSelector;
use client::ErrorExt; use client::ErrorExt;
@ -930,7 +930,7 @@ impl PromptEditor<BufferCodegen> {
fs, fs,
model_selector_menu_handle, model_selector_menu_handle,
prompt_editor.focus_handle(cx), prompt_editor.focus_handle(cx),
ModelType::InlineAssistant, ModelUsageContext::InlineAssistant,
window, window,
cx, cx,
) )
@ -1101,7 +1101,7 @@ impl PromptEditor<TerminalCodegen> {
fs, fs,
model_selector_menu_handle.clone(), model_selector_menu_handle.clone(),
prompt_editor.focus_handle(cx), prompt_editor.focus_handle(cx),
ModelType::InlineAssistant, ModelUsageContext::InlineAssistant,
window, window,
cx, cx,
) )

View file

@ -2,7 +2,7 @@ use std::collections::BTreeMap;
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;
use crate::agent_model_selector::{AgentModelSelector, ModelType}; use crate::agent_model_selector::AgentModelSelector;
use crate::context::{AgentContextKey, ContextCreasesAddon, ContextLoadResult, load_context}; use crate::context::{AgentContextKey, ContextCreasesAddon, ContextLoadResult, load_context};
use crate::tool_compatibility::{IncompatibleToolsState, IncompatibleToolsTooltip}; use crate::tool_compatibility::{IncompatibleToolsState, IncompatibleToolsTooltip};
use crate::ui::{ use crate::ui::{
@ -52,8 +52,8 @@ use crate::thread::{MessageCrease, Thread, TokenUsageRatio};
use crate::thread_store::{TextThreadStore, ThreadStore}; use crate::thread_store::{TextThreadStore, ThreadStore};
use crate::{ use crate::{
ActiveThread, AgentDiffPane, Chat, ChatWithFollow, ExpandMessageEditor, Follow, KeepAll, ActiveThread, AgentDiffPane, Chat, ChatWithFollow, ExpandMessageEditor, Follow, KeepAll,
NewThread, OpenAgentDiff, RejectAll, RemoveAllContext, ToggleBurnMode, ToggleContextPicker, ModelUsageContext, NewThread, OpenAgentDiff, RejectAll, RemoveAllContext, ToggleBurnMode,
ToggleProfileSelector, register_agent_preview, ToggleContextPicker, ToggleProfileSelector, register_agent_preview,
}; };
#[derive(RegisterComponent)] #[derive(RegisterComponent)]
@ -197,7 +197,7 @@ impl MessageEditor {
fs.clone(), fs.clone(),
model_selector_menu_handle, model_selector_menu_handle,
editor.focus_handle(cx), editor.focus_handle(cx),
ModelType::Default(thread.clone()), ModelUsageContext::Thread(thread.clone()),
window, window,
cx, cx,
) )