#[derive(Debug, Clone)]
pub struct ProviderConfig {
pub name: &'static str,
pub feature_flag: &'static str,
pub env_var: &'static str,
pub model_init_code: &'static str,
pub default_model: &'static str,
pub requires_api_key: bool,
}
static PROVIDERS: &[ProviderConfig] = &[
ProviderConfig {
name: "gemini",
feature_flag: "gemini",
env_var: "GOOGLE_API_KEY",
model_init_code: "adk_rust::model::GeminiModel::new(&api_key, \"gemini-3.5-flash\")?",
default_model: "gemini-3.5-flash",
requires_api_key: true,
},
ProviderConfig {
name: "openai",
feature_flag: "openai",
env_var: "OPENAI_API_KEY",
model_init_code: "adk_rust::model::openai::OpenAIClient::new(\n adk_rust::model::openai::OpenAIConfig::new(&api_key, \"gpt-5.5\"),\n )?",
default_model: "gpt-5.5",
requires_api_key: true,
},
ProviderConfig {
name: "anthropic",
feature_flag: "anthropic",
env_var: "ANTHROPIC_API_KEY",
model_init_code: "adk_rust::model::anthropic::AnthropicClient::new(\n adk_rust::model::anthropic::AnthropicConfig::new(&api_key, \"claude-sonnet-4-6\"),\n )?",
default_model: "claude-sonnet-4-6",
requires_api_key: true,
},
ProviderConfig {
name: "deepseek",
feature_flag: "deepseek",
env_var: "DEEPSEEK_API_KEY",
model_init_code: "adk_rust::model::deepseek::DeepSeekClient::new(\n adk_rust::model::deepseek::DeepSeekConfig::new(&api_key, \"deepseek-v4-flash\"),\n )?",
default_model: "deepseek-v4-flash",
requires_api_key: true,
},
ProviderConfig {
name: "ollama",
feature_flag: "ollama",
env_var: "",
model_init_code: "adk_rust::model::ollama::OllamaModel::new(\n adk_rust::model::ollama::OllamaConfig::new(\"gemma4\"),\n )?",
default_model: "gemma4",
requires_api_key: false,
},
ProviderConfig {
name: "groq",
feature_flag: "groq",
env_var: "GROQ_API_KEY",
model_init_code: "adk_rust::model::groq::GroqClient::new(\n adk_rust::model::groq::GroqConfig::new(&api_key, \"llama-3.3-70b-versatile\"),\n )?",
default_model: "llama-3.3-70b-versatile",
requires_api_key: true,
},
ProviderConfig {
name: "openrouter",
feature_flag: "openrouter",
env_var: "OPENROUTER_API_KEY",
model_init_code: "adk_rust::model::openrouter::OpenRouterClient::new(\n adk_rust::model::openrouter::OpenRouterConfig::new(&api_key, \"qwen/qwen3.7-max\"),\n )?",
default_model: "qwen/qwen3.7-max",
requires_api_key: true,
},
ProviderConfig {
name: "bedrock",
feature_flag: "bedrock",
env_var: "AWS_REGION",
model_init_code: "adk_rust::model::bedrock::BedrockClient::new(\n adk_rust::model::bedrock::BedrockConfig::new(\n std::env::var(\"AWS_REGION\").unwrap_or_else(|_| \"us-east-1\".to_string()),\n \"anthropic.claude-opus-4-6-v1\",\n ),\n ).await?",
default_model: "anthropic.claude-opus-4-6-v1",
requires_api_key: false,
},
ProviderConfig {
name: "azure-ai",
feature_flag: "azure-ai",
env_var: "AZURE_AI_KEY",
model_init_code: "adk_rust::model::azure_ai::AzureAIClient::new(\n adk_rust::model::azure_ai::AzureAIConfig::new(\n std::env::var(\"AZURE_AI_ENDPOINT\").expect(\"AZURE_AI_ENDPOINT must be set\"),\n &api_key,\n \"gpt-5.5\",\n ),\n )?",
default_model: "gpt-5.5",
requires_api_key: true,
},
ProviderConfig {
name: "xai",
feature_flag: "openai",
env_var: "XAI_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::xai(&api_key, \"grok-4.3\"),\n )?",
default_model: "grok-4.3",
requires_api_key: true,
},
ProviderConfig {
name: "mistral",
feature_flag: "openai",
env_var: "MISTRAL_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::mistral(&api_key, \"mistral-large-latest\"),\n )?",
default_model: "mistral-large-latest",
requires_api_key: true,
},
ProviderConfig {
name: "perplexity",
feature_flag: "openai",
env_var: "PERPLEXITY_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::perplexity(&api_key, \"sonar-pro\"),\n )?",
default_model: "sonar-pro",
requires_api_key: true,
},
ProviderConfig {
name: "minimax",
feature_flag: "openai",
env_var: "MINIMAX_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::minimax(&api_key, \"minimax-m2.7\"),\n )?",
default_model: "minimax-m2.7",
requires_api_key: true,
},
ProviderConfig {
name: "bytedance",
feature_flag: "openai",
env_var: "ARK_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::bytedance(&api_key, \"doubao-1-5-pro-256k\"),\n )?",
default_model: "doubao-1-5-pro-256k",
requires_api_key: true,
},
ProviderConfig {
name: "zhipu",
feature_flag: "openai",
env_var: "ZHIPU_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::zhipu(&api_key, \"glm-5.1\"),\n )?",
default_model: "glm-5.1",
requires_api_key: true,
},
ProviderConfig {
name: "baidu",
feature_flag: "openai",
env_var: "QIANFAN_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::baidu(&api_key, \"ernie-5\"),\n )?",
default_model: "ernie-5",
requires_api_key: true,
},
ProviderConfig {
name: "cohere",
feature_flag: "openai",
env_var: "COHERE_API_KEY",
model_init_code: "adk_rust::model::OpenAICompatible::new(\n adk_rust::model::OpenAICompatibleConfig::cohere(&api_key, \"command-a-plus-05-2026\"),\n )?",
default_model: "command-a-plus-05-2026",
requires_api_key: true,
},
];
pub fn get_provider_config(provider: &str) -> Result<&'static ProviderConfig, String> {
PROVIDERS.iter().find(|p| p.name == provider).ok_or_else(|| {
let supported: Vec<&str> = PROVIDERS.iter().map(|p| p.name).collect();
format!("unknown provider '{provider}'. Supported: {}", supported.join(", "))
})
}
pub fn all_providers() -> &'static [ProviderConfig] {
PROVIDERS
}