use serde::{Deserialize, Serialize};
use std::sync::LazyLock;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BuiltinProvider {
pub id: String,
pub display_name: String,
pub base_url: String,
pub mode: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct BuiltinProvidersConfig {
providers: Vec<BuiltinProvider>,
}
impl BuiltinProvider {
pub fn auth_mode(&self) -> &str {
self.mode.as_deref().unwrap_or("openai")
}
pub fn is_anthropic_mode(&self) -> bool {
self.auth_mode() == "anthropic"
}
}
const CONFIG_CONTENT: &str = include_str!("../builtins/models.toml");
static BUILTIN_PROVIDERS: LazyLock<Vec<BuiltinProvider>> = LazyLock::new(|| {
let config: BuiltinProvidersConfig =
toml::from_str(CONFIG_CONTENT).expect("Failed to parse builtins/models.toml");
config.providers
});
fn builtin_providers() -> &'static [BuiltinProvider] {
BUILTIN_PROVIDERS.as_slice()
}
pub fn load_builtin_providers() -> Vec<BuiltinProvider> {
builtin_providers().to_vec()
}
pub fn find_builtin_provider(id: &str) -> Option<BuiltinProvider> {
builtin_providers()
.iter()
.find(|p| p.id.eq_ignore_ascii_case(id))
.cloned()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_load_builtin_providers() {
let providers = load_builtin_providers();
assert!(!providers.is_empty());
let provider_ids: Vec<&str> = providers.iter().map(|p| p.id.as_str()).collect();
assert!(provider_ids.contains(&"openai"));
assert!(provider_ids.contains(&"anthropic"));
assert!(provider_ids.contains(&"openrouter"));
assert!(provider_ids.contains(&"poe"));
}
#[test]
fn test_builtin_providers_cached_slice() {
let first_ptr = builtin_providers() as *const [BuiltinProvider];
let second_ptr = builtin_providers() as *const [BuiltinProvider];
assert_eq!(first_ptr, second_ptr);
}
#[test]
fn test_find_builtin_provider() {
let provider = find_builtin_provider("OpenAI");
assert!(provider.is_some());
assert_eq!(provider.unwrap().id, "openai");
let provider = find_builtin_provider("anthropic");
assert!(provider.is_some());
assert_eq!(provider.unwrap().display_name, "Anthropic");
let provider = find_builtin_provider("nonexistent");
assert!(provider.is_none());
}
#[test]
fn test_anthropic_mode() {
let anthropic = find_builtin_provider("anthropic").unwrap();
assert!(anthropic.is_anthropic_mode());
assert_eq!(anthropic.auth_mode(), "anthropic");
let openai = find_builtin_provider("openai").unwrap();
assert!(!openai.is_anthropic_mode());
assert_eq!(openai.auth_mode(), "openai");
}
#[test]
fn test_provider_properties() {
let providers = load_builtin_providers();
for provider in providers {
assert!(!provider.id.is_empty());
assert!(!provider.display_name.is_empty());
assert!(!provider.base_url.is_empty());
assert!(provider.base_url.starts_with("https://"));
}
}
}