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 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 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 pub fn switch_to(provider: &str, model: &str) -> Result<()> {
46 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 pub fn list_providers() -> Vec<String> {
64 vec!["openai".to_string(), "anthropic".to_string()]
65 }
66}