doum_cli/core/
switch.rs

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
13/// Get all available provider/model combinations
14pub 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        // Add custom option
30        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
41/// Switch to a specific provider and model
42pub 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}