settings.rs

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