llm/
provider_connection.rs1use std::collections::BTreeMap;
2
3#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
4#[serde(rename_all = "kebab-case")]
5pub enum ProviderAuthMode {
6 #[default]
7 Default,
8 None,
9}
10
11#[derive(Clone, Debug, Default, PartialEq, Eq)]
12pub struct ProviderConnectionConfig {
13 pub base_url: Option<String>,
14 pub auth_mode: ProviderAuthMode,
15}
16
17#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
18#[serde(rename_all = "camelCase", deny_unknown_fields)]
19pub struct ProviderConnectionOverride {
20 #[serde(default, rename = "url", skip_serializing_if = "Option::is_none")]
21 pub base_url: Option<String>,
22 #[serde(default, rename = "auth", skip_serializing_if = "Option::is_none")]
23 pub auth_mode: Option<ProviderAuthMode>,
24}
25
26#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
27#[serde(transparent)]
28pub struct ProviderConnectionOverrides {
29 providers: BTreeMap<String, ProviderConnectionOverride>,
30}
31
32impl ProviderConnectionConfig {
33 pub fn from_override(value: ProviderConnectionOverride) -> Self {
34 Self { base_url: value.base_url, auth_mode: value.auth_mode.unwrap_or_default() }
35 }
36}
37
38impl ProviderConnectionOverride {
39 pub fn url(url: impl Into<String>) -> Self {
40 Self { base_url: Some(url.into()), auth_mode: None }
41 }
42
43 pub fn auth(auth_mode: ProviderAuthMode) -> Self {
44 Self { base_url: None, auth_mode: Some(auth_mode) }
45 }
46
47 pub fn merge(&mut self, override_value: Self) {
48 if override_value.base_url.is_some() {
49 self.base_url = override_value.base_url;
50 }
51 if override_value.auth_mode.is_some() {
52 self.auth_mode = override_value.auth_mode;
53 }
54 }
55}
56
57impl ProviderConnectionOverrides {
58 pub fn new(providers: BTreeMap<String, ProviderConnectionOverride>) -> Self {
59 Self { providers }
60 }
61
62 pub fn is_empty(&self) -> bool {
63 self.providers.is_empty()
64 }
65
66 pub fn merge(&mut self, overrides: ProviderConnectionOverrides) {
67 for (provider, override_value) in overrides.providers {
68 self.providers
69 .entry(provider)
70 .and_modify(|existing| existing.merge(override_value.clone()))
71 .or_insert(override_value);
72 }
73 }
74
75 pub fn config_for(&self, provider: &str) -> ProviderConnectionConfig {
76 self.providers.get(provider).cloned().map(ProviderConnectionConfig::from_override).unwrap_or_default()
77 }
78
79 pub fn into_inner(self) -> BTreeMap<String, ProviderConnectionOverride> {
80 self.providers
81 }
82}