favorite_models.rs

 1use std::sync::Arc;
 2
 3use agent_client_protocol::ModelId;
 4use fs::Fs;
 5use language_model::LanguageModel;
 6use settings::{LanguageModelSelection, update_settings_file};
 7use ui::App;
 8
 9fn language_model_to_selection(model: &Arc<dyn LanguageModel>) -> LanguageModelSelection {
10    LanguageModelSelection {
11        provider: model.provider_id().to_string().into(),
12        model: model.id().0.to_string(),
13    }
14}
15
16fn model_id_to_selection(model_id: &ModelId) -> LanguageModelSelection {
17    let id = model_id.0.as_ref();
18    let (provider, model) = id.split_once('/').unwrap_or(("", id));
19    LanguageModelSelection {
20        provider: provider.to_owned().into(),
21        model: model.to_owned(),
22    }
23}
24
25pub fn toggle_in_settings(
26    model: Arc<dyn LanguageModel>,
27    should_be_favorite: bool,
28    fs: Arc<dyn Fs>,
29    cx: &App,
30) {
31    let selection = language_model_to_selection(&model);
32    update_settings_file(fs, cx, move |settings, _| {
33        let agent = settings.agent.get_or_insert_default();
34        if should_be_favorite {
35            agent.add_favorite_model(selection.clone());
36        } else {
37            agent.remove_favorite_model(&selection);
38        }
39    });
40}
41
42pub fn toggle_model_id_in_settings(
43    model_id: ModelId,
44    should_be_favorite: bool,
45    fs: Arc<dyn Fs>,
46    cx: &App,
47) {
48    let selection = model_id_to_selection(&model_id);
49    update_settings_file(fs, cx, move |settings, _| {
50        let agent = settings.agent.get_or_insert_default();
51        if should_be_favorite {
52            agent.add_favorite_model(selection.clone());
53        } else {
54            agent.remove_favorite_model(&selection);
55        }
56    });
57}