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