1use std::sync::Arc;
  2
  3use collections::HashMap;
  4use gpui::App;
  5use settings::Settings;
  6
  7use crate::provider::{
  8    anthropic::AnthropicSettings, bedrock::AmazonBedrockSettings, cloud::ZedDotDevSettings,
  9    deepseek::DeepSeekSettings, google::GoogleSettings, lmstudio::LmStudioSettings,
 10    mistral::MistralSettings, ollama::OllamaSettings, open_ai::OpenAiSettings,
 11    open_ai_compatible::OpenAiCompatibleSettings, open_router::OpenRouterSettings,
 12    vercel::VercelSettings, x_ai::XAiSettings,
 13};
 14
 15/// Initializes the language model settings.
 16pub fn init_settings(cx: &mut App) {
 17    AllLanguageModelSettings::register(cx);
 18}
 19
 20pub struct AllLanguageModelSettings {
 21    pub anthropic: AnthropicSettings,
 22    pub bedrock: AmazonBedrockSettings,
 23    pub deepseek: DeepSeekSettings,
 24    pub google: GoogleSettings,
 25    pub lmstudio: LmStudioSettings,
 26    pub mistral: MistralSettings,
 27    pub ollama: OllamaSettings,
 28    pub open_router: OpenRouterSettings,
 29    pub openai: OpenAiSettings,
 30    pub openai_compatible: HashMap<Arc<str>, OpenAiCompatibleSettings>,
 31    pub vercel: VercelSettings,
 32    pub x_ai: XAiSettings,
 33    pub zed_dot_dev: ZedDotDevSettings,
 34}
 35
 36impl settings::Settings for AllLanguageModelSettings {
 37    const PRESERVED_KEYS: Option<&'static [&'static str]> = Some(&["version"]);
 38
 39    fn from_settings(content: &settings::SettingsContent) -> Self {
 40        let language_models = content.language_models.clone().unwrap();
 41        let anthropic = language_models.anthropic.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            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            },
 67            deepseek: DeepSeekSettings {
 68                api_url: deepseek.api_url.unwrap(),
 69                available_models: deepseek.available_models.unwrap_or_default(),
 70            },
 71            google: GoogleSettings {
 72                api_url: google.api_url.unwrap(),
 73                available_models: google.available_models.unwrap_or_default(),
 74            },
 75            lmstudio: LmStudioSettings {
 76                api_url: lmstudio.api_url.unwrap(),
 77                available_models: lmstudio.available_models.unwrap_or_default(),
 78            },
 79            mistral: MistralSettings {
 80                api_url: mistral.api_url.unwrap(),
 81                available_models: mistral.available_models.unwrap_or_default(),
 82            },
 83            ollama: OllamaSettings {
 84                api_url: ollama.api_url.unwrap(),
 85                available_models: ollama.available_models.unwrap_or_default(),
 86            },
 87            open_router: OpenRouterSettings {
 88                api_url: open_router.api_url.unwrap(),
 89                available_models: open_router.available_models.unwrap_or_default(),
 90            },
 91            openai: OpenAiSettings {
 92                api_url: openai.api_url.unwrap(),
 93                available_models: openai.available_models.unwrap_or_default(),
 94            },
 95            openai_compatible: openai_compatible
 96                .into_iter()
 97                .map(|(key, value)| {
 98                    (
 99                        key,
100                        OpenAiCompatibleSettings {
101                            api_url: value.api_url,
102                            available_models: value.available_models,
103                        },
104                    )
105                })
106                .collect(),
107            vercel: VercelSettings {
108                api_url: vercel.api_url.unwrap(),
109                available_models: vercel.available_models.unwrap_or_default(),
110            },
111            x_ai: XAiSettings {
112                api_url: x_ai.api_url.unwrap(),
113                available_models: x_ai.available_models.unwrap_or_default(),
114            },
115            zed_dot_dev: ZedDotDevSettings {
116                available_models: zed_dot_dev.available_models.unwrap_or_default(),
117            },
118        }
119    }
120}