use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderConfig {
pub provider: String,
pub api_key: Option<String>,
pub base_url: Option<String>,
}
impl ProviderConfig {
pub fn get_api_key(&self) -> Option<String> {
if let Some(key) = &self.api_key {
return Some(key.clone());
}
let env_vars = match self.provider.as_str() {
"anthropic" => vec!["ANTHROPIC_API_KEY", "CLAUDE_API_KEY"],
"openai" => vec!["OPENAI_API_KEY"],
"google" => vec!["GOOGLE_API_KEY", "GEMINI_API_KEY"],
_ => vec![],
};
for var in env_vars {
if let Ok(key) = std::env::var(var) {
return Some(key);
}
}
None
}
pub fn get_base_url(&self) -> String {
if let Some(url) = &self.base_url {
return url.clone();
}
match self.provider.as_str() {
"anthropic" => "https://api.anthropic.com".to_string(),
"openai" => "https://api.openai.com".to_string(),
"google" => "https://generativelanguage.googleapis.com".to_string(),
_ => "".to_string(),
}
}
}
impl Default for ProviderConfig {
fn default() -> Self {
Self {
provider: "anthropic".to_string(),
api_key: None,
base_url: None,
}
}
}