1use std::sync::Arc;
2
3use collections::HashMap;
4use settings::RegisterSetting;
5
6use crate::provider::{
7 anthropic::AnthropicSettings, bedrock::AmazonBedrockSettings, cloud::ZedDotDevSettings,
8 deepseek::DeepSeekSettings, google::GoogleSettings, lmstudio::LmStudioSettings,
9 mistral::MistralSettings, ollama::OllamaSettings, open_ai::OpenAiSettings,
10 open_ai_compatible::OpenAiCompatibleSettings, open_router::OpenRouterSettings,
11 vercel::VercelSettings, x_ai::XAiSettings,
12};
13
14#[derive(Debug, RegisterSetting)]
15pub struct AllLanguageModelSettings {
16 pub anthropic: AnthropicSettings,
17 pub bedrock: AmazonBedrockSettings,
18 pub deepseek: DeepSeekSettings,
19 pub google: GoogleSettings,
20 pub lmstudio: LmStudioSettings,
21 pub mistral: MistralSettings,
22 pub ollama: OllamaSettings,
23 pub open_router: OpenRouterSettings,
24 pub openai: OpenAiSettings,
25 pub openai_compatible: HashMap<Arc<str>, OpenAiCompatibleSettings>,
26 pub vercel: VercelSettings,
27 pub x_ai: XAiSettings,
28 pub zed_dot_dev: ZedDotDevSettings,
29}
30
31impl settings::Settings for AllLanguageModelSettings {
32 const PRESERVED_KEYS: Option<&'static [&'static str]> = Some(&["version"]);
33
34 fn from_settings(content: &settings::SettingsContent) -> Self {
35 let language_models = content.language_models.clone().unwrap();
36 let anthropic = language_models.anthropic.unwrap();
37 let bedrock = language_models.bedrock.unwrap();
38 let deepseek = language_models.deepseek.unwrap();
39 let google = language_models.google.unwrap();
40 let lmstudio = language_models.lmstudio.unwrap();
41 let mistral = language_models.mistral.unwrap();
42 let ollama = language_models.ollama.unwrap();
43 let open_router = language_models.open_router.unwrap();
44 let openai = language_models.openai.unwrap();
45 let openai_compatible = language_models.openai_compatible.unwrap();
46 let vercel = language_models.vercel.unwrap();
47 let x_ai = language_models.x_ai.unwrap();
48 let zed_dot_dev = language_models.zed_dot_dev.unwrap();
49 Self {
50 anthropic: AnthropicSettings {
51 api_url: anthropic.api_url.unwrap(),
52 available_models: anthropic.available_models.unwrap_or_default(),
53 },
54 bedrock: AmazonBedrockSettings {
55 available_models: bedrock.available_models.unwrap_or_default(),
56 region: bedrock.region,
57 endpoint: bedrock.endpoint_url, // todo(should be api_url)
58 profile_name: bedrock.profile,
59 role_arn: None, // todo(was never a setting for this...)
60 authentication_method: bedrock.authentication_method.map(Into::into),
61 },
62 deepseek: DeepSeekSettings {
63 api_url: deepseek.api_url.unwrap(),
64 available_models: deepseek.available_models.unwrap_or_default(),
65 },
66 google: GoogleSettings {
67 api_url: google.api_url.unwrap(),
68 available_models: google.available_models.unwrap_or_default(),
69 },
70 lmstudio: LmStudioSettings {
71 api_url: lmstudio.api_url.unwrap(),
72 available_models: lmstudio.available_models.unwrap_or_default(),
73 },
74 mistral: MistralSettings {
75 api_url: mistral.api_url.unwrap(),
76 available_models: mistral.available_models.unwrap_or_default(),
77 },
78 ollama: OllamaSettings {
79 api_url: ollama.api_url.unwrap(),
80 available_models: ollama.available_models.unwrap_or_default(),
81 },
82 open_router: OpenRouterSettings {
83 api_url: open_router.api_url.unwrap(),
84 available_models: open_router.available_models.unwrap_or_default(),
85 },
86 openai: OpenAiSettings {
87 api_url: openai.api_url.unwrap(),
88 available_models: openai.available_models.unwrap_or_default(),
89 },
90 openai_compatible: openai_compatible
91 .into_iter()
92 .map(|(key, value)| {
93 (
94 key,
95 OpenAiCompatibleSettings {
96 api_url: value.api_url,
97 available_models: value.available_models,
98 },
99 )
100 })
101 .collect(),
102 vercel: VercelSettings {
103 api_url: vercel.api_url.unwrap(),
104 available_models: vercel.available_models.unwrap_or_default(),
105 },
106 x_ai: XAiSettings {
107 api_url: x_ai.api_url.unwrap(),
108 available_models: x_ai.available_models.unwrap_or_default(),
109 },
110 zed_dot_dev: ZedDotDevSettings {
111 available_models: zed_dot_dev.available_models.unwrap_or_default(),
112 },
113 }
114 }
115}