doum_cli/core/
switch.rs

1use crate::llm::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 struct SwitchService;
14
15impl SwitchService {
16    /// Get all available provider/model combinations
17    pub fn get_all_options() -> Vec<ProviderModelOption> {
18        let providers = vec!["openai", "anthropic"];
19        let mut options = Vec::new();
20
21        for provider in providers {
22            let models = load_presets(provider);
23            for model in models {
24                options.push(ProviderModelOption {
25                    provider: provider.to_string(),
26                    model_id: model.id.clone(),
27                    display_name: format!("{} - {}", provider.to_uppercase(), model.name),
28                    description: model.description.clone(),
29                });
30            }
31
32            // Add custom option
33            options.push(ProviderModelOption {
34                provider: provider.to_string(),
35                model_id: "custom".to_string(),
36                display_name: format!("{} - Custom", provider.to_uppercase()),
37                description: "Enter model name manually".to_string(),
38            });
39        }
40
41        options
42    }
43
44    /// Switch to a specific provider and model
45    pub fn switch_to(provider: &str, model: &str) -> Result<()> {
46        // Validate provider
47        if provider != "openai" && provider != "anthropic" {
48            anyhow::bail!(
49                "Unknown provider: {}. Available: openai, anthropic",
50                provider
51            );
52        }
53
54        let mut config = load_config()?;
55        config.llm.provider = provider.to_string();
56        config.llm.model = model.to_string();
57        save_config(&config)?;
58
59        Ok(())
60    }
61
62    /// List all available providers
63    pub fn list_providers() -> Vec<String> {
64        vec!["openai".to_string(), "anthropic".to_string()]
65    }
66}