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