1use crate::llm::{Provider, load_presets};
2use crate::system::{load_config, save_config};
3use anyhow::Result;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct ProviderModelOption {
7 pub provider: String,
8 pub model_id: String,
9 pub display_name: String,
10 pub description: String,
11}
12
13pub fn get_all_options() -> Vec<ProviderModelOption> {
15 let providers = Provider::all();
16 let mut options = Vec::new();
17
18 for provider in providers {
19 let models = load_presets(&provider);
20 for model in models {
21 options.push(ProviderModelOption {
22 provider: provider.as_str().to_string(),
23 model_id: model.id.clone(),
24 display_name: format!("{} - {}", provider.as_str().to_uppercase(), model.name),
25 description: model.description.clone(),
26 });
27 }
28
29 options.push(ProviderModelOption {
31 provider: provider.as_str().to_string(),
32 model_id: "custom".to_string(),
33 display_name: format!("{} - Custom", provider.as_str().to_uppercase()),
34 description: "Enter model name manually".to_string(),
35 });
36 }
37
38 options
39}
40
41pub fn switch_to(provider: &Provider, model: &str) -> Result<()> {
43 let mut config = load_config()?;
44 config.llm.provider = provider.as_str().to_string();
45 config.llm.model = model.to_string();
46 save_config(&config)?;
47
48 Ok(())
49}