chore: source rust providers from endpoint registry

This commit is contained in:
Ishaan Jaff 2026-06-24 16:41:53 -07:00
parent 3ecd1202f2
commit 31ef925ffe
No known key found for this signature in database
6 changed files with 123 additions and 960 deletions

View file

@ -1,7 +1,7 @@
# Adding a provider / route to litellm-rust
- Keep the route contract pure in `crates/core/src/<route>/`: define the typed request/response structs and a provider config trait with no network, env, auth, or logging.
- Add provider identity to `crates/core/src/providers/provider_registry.json`: `routing_name` must match Python `LlmProviders.value`; `display_name` is human-facing; `default_api_base` and `api_key_env_var` are optional provider defaults.
- Add provider identity to the repo-root `provider_endpoints_support.json`: use the LiteLLM provider slug, display name, docs URL, and endpoint support flags. Put optional stable base URL / API key env var defaults under the top-level `default_creds` map.
- Put provider-specific transforms in `crates/providers/src/<provider>/<route>/transformation.rs`, mirroring the Python provider tree and exposing a `const <PROVIDER>_<ROUTE>_CONFIG`.
- The provider config owns three pure steps: map LiteLLM params, transform the LiteLLM request into the provider request, and transform the provider response back into the LiteLLM response.
- If the provider has a reverse or normalization step, keep it pure and explicit next to the transforms; do not hide reverse mapping inside the HTTP transport.

View file

@ -1,4 +1,4 @@
use std::collections::HashSet;
use std::collections::{BTreeMap, HashSet};
use std::env;
use std::fs;
use std::path::PathBuf;
@ -6,9 +6,29 @@ use std::path::PathBuf;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct ProviderEndpointSupportInput {
providers: BTreeMap<String, ProviderInput>,
#[serde(default)]
default_creds: BTreeMap<String, ProviderDefaultCredsInput>,
}
#[derive(Debug, Deserialize)]
struct ProviderInput {
display_name: String,
url: String,
}
#[derive(Debug, Deserialize)]
struct ProviderDefaultCredsInput {
default_api_base: Option<String>,
api_key_env_var: Option<String>,
}
#[derive(Debug)]
struct ProviderMetadataInput {
routing_name: String,
display_name: String,
docs_url: String,
default_api_base: Option<String>,
api_key_env_var: Option<String>,
}
@ -25,7 +45,7 @@ fn rust_option(value: Option<&str>) -> String {
fn variant_name(routing_name: &str) -> String {
routing_name
.split(['_', '-', '.'])
.split(['_', '-', '.', '/'])
.filter(|part| !part.is_empty())
.map(|part| {
let mut chars = part.chars();
@ -42,6 +62,29 @@ fn variant_name(routing_name: &str) -> String {
.collect()
}
fn provider_metadata_from_endpoint_support(
registry: ProviderEndpointSupportInput,
) -> Vec<ProviderMetadataInput> {
let ProviderEndpointSupportInput {
providers,
default_creds,
} = registry;
providers
.into_iter()
.map(|(routing_name, provider)| {
let default_creds = default_creds.get(&routing_name);
ProviderMetadataInput {
routing_name,
display_name: provider.display_name,
docs_url: provider.url,
default_api_base: default_creds.and_then(|creds| creds.default_api_base.clone()),
api_key_env_var: default_creds.and_then(|creds| creds.api_key_env_var.clone()),
}
})
.collect()
}
fn validate_providers(providers: &[ProviderMetadataInput]) {
let mut routing_names = HashSet::new();
let mut variants = HashSet::new();
@ -56,6 +99,9 @@ fn validate_providers(providers: &[ProviderMetadataInput]) {
provider.routing_name
);
}
if provider.docs_url.trim().is_empty() {
panic!("provider {} has an empty docs_url", provider.routing_name);
}
if !routing_names.insert(provider.routing_name.as_str()) {
panic!("duplicate provider routing_name: {}", provider.routing_name);
}
@ -67,6 +113,12 @@ fn validate_providers(providers: &[ProviderMetadataInput]) {
provider.routing_name
);
}
if variant.chars().next().is_some_and(|ch| ch.is_ascii_digit()) {
panic!(
"provider {} generated Rust variant {variant} starting with a digit",
provider.routing_name
);
}
if !variants.insert(variant.clone()) {
panic!(
"provider {} generated duplicate Rust variant {variant}",
@ -99,9 +151,10 @@ fn generate_provider_code(providers: &[ProviderMetadataInput]) -> String {
.zip(variants.iter())
.map(|(provider, variant)| {
format!(
" ProviderMetadata {{ provider: LlmProvider::{variant}, routing_name: {}, display_name: {}, default_api_base: {}, api_key_env_var: {} }},",
" ProviderMetadata {{ provider: LlmProvider::{variant}, routing_name: {}, display_name: {}, docs_url: {}, default_api_base: {}, api_key_env_var: {} }},",
rust_string(&provider.routing_name),
rust_string(&provider.display_name),
rust_string(&provider.docs_url),
rust_option(provider.default_api_base.as_deref()),
rust_option(provider.api_key_env_var.as_deref()),
)
@ -119,7 +172,7 @@ fn generate_provider_code(providers: &[ProviderMetadataInput]) -> String {
.join("\n");
format!(
r#"// @generated by crates/core/build.rs from litellm-rust/crates/core/src/providers/provider_registry.json.
r#"// @generated by crates/core/build.rs from provider_endpoints_support.json.
// Do not edit this file by hand.
use std::fmt;
@ -132,6 +185,7 @@ pub struct ProviderMetadata {{
pub provider: LlmProvider,
pub routing_name: &'static str,
pub display_name: &'static str,
pub docs_url: &'static str,
pub default_api_base: Option<&'static str>,
pub api_key_env_var: Option<&'static str>,
}}
@ -165,6 +219,10 @@ impl LlmProvider {{
self.metadata().display_name
}}
pub fn docs_url(self) -> &'static str {{
self.metadata().docs_url
}}
pub fn default_api_base(self) -> Option<&'static str> {{
self.metadata().default_api_base
}}
@ -196,67 +254,27 @@ impl FromStr for LlmProvider {{
mod tests {{
use super::*;
#[derive(serde::Deserialize)]
struct RegistryProvider {{
routing_name: String,
}}
fn registry_provider_values() -> Vec<String> {{
fn endpoint_support_provider_values() -> Vec<String> {{
let raw = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/src/providers/provider_registry.json"
"/../../../provider_endpoints_support.json"
));
serde_json::from_str::<Vec<RegistryProvider>>(raw)
.expect("provider_registry.json parses")
.into_iter()
.map(|provider| provider.routing_name)
.collect()
}}
fn python_provider_values() -> Vec<String> {{
let source = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/../../../litellm/types/utils.py"
));
let mut values = Vec::new();
let mut in_llm_providers = false;
for line in source.lines() {{
if line.starts_with("class LlmProviders(") {{
in_llm_providers = true;
continue;
}}
if in_llm_providers && line.starts_with("class ") {{
break;
}}
if !in_llm_providers {{
continue;
}}
let trimmed = line.trim();
let Some((name, value_expr)) = trimmed.split_once('=') else {{
continue;
}};
if !name
.trim()
.chars()
.all(|ch| ch.is_ascii_uppercase() || ch.is_ascii_digit() || ch == '_')
{{
continue;
}}
let Some(value) = value_expr.split('"').nth(1) else {{
continue;
}};
values.push(value.to_string());
}}
assert!(!values.is_empty(), "parsed Python LlmProviders values");
let registry = serde_json::from_str::<serde_json::Value>(raw)
.expect("provider_endpoints_support.json parses");
let mut values = registry
.get("providers")
.and_then(|providers| providers.as_object())
.expect("provider_endpoints_support.json has providers object")
.keys()
.cloned()
.collect::<Vec<_>>();
values.sort();
values
}}
#[test]
fn provider_values_match_registry_order() {{
let registry_values = registry_provider_values();
fn provider_values_match_endpoint_support_registry() {{
let registry_values = endpoint_support_provider_values();
assert_eq!(LlmProvider::ALL.len(), registry_values.len());
assert_eq!(
LlmProvider::ALL
@ -267,16 +285,12 @@ mod tests {{
);
}}
#[test]
fn provider_registry_matches_python_llm_providers() {{
assert_eq!(registry_provider_values(), python_provider_values());
}}
#[test]
fn from_str_round_trips_all_providers() {{
for provider in LlmProvider::ALL {{
assert_eq!(LlmProvider::from_str(provider.as_str()), Ok(provider));
assert_eq!(provider.to_string(), provider.as_str());
assert!(!provider.docs_url().is_empty());
}}
}}
@ -290,7 +304,14 @@ mod tests {{
#[test]
fn provider_metadata_exposes_optional_defaults() {{
assert_eq!(LlmProvider::Mistral.display_name(), "Mistral");
assert_eq!(
LlmProvider::Mistral.display_name(),
"Mistral AI API (`mistral`)"
);
assert_eq!(
LlmProvider::Mistral.docs_url(),
"https://docs.litellm.ai/docs/providers/mistral"
);
assert_eq!(
LlmProvider::Mistral.default_api_base(),
Some("https://api.mistral.ai/v1")
@ -309,7 +330,7 @@ mod tests {{
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let providers_path = manifest_dir.join("src/providers/provider_registry.json");
let providers_path = manifest_dir.join("../../../provider_endpoints_support.json");
println!("cargo:rerun-if-changed={}", providers_path.display());
println!(
"cargo:rerun-if-changed={}",
@ -318,12 +339,13 @@ fn main() {
let raw = fs::read_to_string(&providers_path).unwrap_or_else(|err| {
panic!(
"failed to read provider registry {}: {err}",
"failed to read provider endpoint support registry {}: {err}",
providers_path.display()
)
});
let providers: Vec<ProviderMetadataInput> = serde_json::from_str(&raw)
let registry: ProviderEndpointSupportInput = serde_json::from_str(&raw)
.unwrap_or_else(|err| panic!("failed to parse {}: {err}", providers_path.display()));
let providers = provider_metadata_from_endpoint_support(registry);
validate_providers(&providers);
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());

View file

@ -1,21 +1,18 @@
# Rust Provider Registry
# Rust Provider Metadata
`provider_registry.json` is the source of truth for provider identity in `litellm-rust`.
`crates/core/build.rs` reads it at compile time and generates the typed
`LlmProvider` enum plus static provider metadata. Runtime code does not parse
this JSON.
The repo-root `provider_endpoints_support.json` is the shared source of truth
for provider identity and docs metadata in `litellm-rust`. `crates/core/build.rs`
reads it at compile time and generates the typed `LlmProvider` enum plus static
provider metadata. Runtime code does not parse this JSON.
To add a provider:
- Add a `provider_registry.json` entry with `routing_name` matching Python
`LlmProviders.value` in `litellm/types/utils.py`.
- Set `display_name` to the human-readable provider name for docs/errors.
- Set `default_api_base` to a stable provider-level default base URL, or `null`
when it is unknown, dynamic, or route-specific.
- Set `api_key_env_var` to the canonical LiteLLM env var, or `null` when there
is no single provider-level key.
- Add a `provider_endpoints_support.json` provider entry using the LiteLLM
provider slug, display name, docs URL, and endpoint support flags.
- Add optional defaults under the top-level `default_creds` map only when there
is a stable provider-level base URL or canonical API key environment variable.
- Put request/response logic under
`crates/providers/src/<provider>/<route>/transformation.rs`; do not put
transforms, signing logic, or secrets in this registry.
transforms, signing logic, or secrets in provider metadata.
- Run `cargo test -p litellm-core --locked`; it verifies the Rust registry stays
in parity with Python `LlmProviders`.
in parity with `provider_endpoints_support.json`.

View file

@ -1,878 +0,0 @@
[
{
"routing_name": "openai",
"display_name": "OpenAI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "chatgpt",
"display_name": "ChatGPT",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "openai_like",
"display_name": "OpenAI Like",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "jina_ai",
"display_name": "Jina AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "xai",
"display_name": "xAI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "zai",
"display_name": "Z.ai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "custom_openai",
"display_name": "Custom OpenAI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "text-completion-openai",
"display_name": "Text Completion OpenAI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "cohere",
"display_name": "Cohere",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "cohere_chat",
"display_name": "Cohere Chat",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "clarifai",
"display_name": "Clarifai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "anthropic",
"display_name": "Anthropic",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "anthropic_text",
"display_name": "Anthropic Text",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "bytez",
"display_name": "Bytez",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "replicate",
"display_name": "Replicate",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "reducto",
"display_name": "Reducto",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "runwayml",
"display_name": "Runwayml",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "aws_polly",
"display_name": "AWS Polly",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "huggingface",
"display_name": "Hugging Face",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "together_ai",
"display_name": "Together AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "openrouter",
"display_name": "Openrouter",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "datarobot",
"display_name": "Datarobot",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "vertex_ai",
"display_name": "Vertex AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "vertex_ai_beta",
"display_name": "Vertex AI Beta",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "gemini",
"display_name": "Gemini",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "ai21",
"display_name": "AI21",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "baseten",
"display_name": "Baseten",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "black_forest_labs",
"display_name": "Black Forest Labs",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "azure",
"display_name": "Azure",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "azure_text",
"display_name": "Azure Text",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "azure_ai",
"display_name": "Azure AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "sagemaker",
"display_name": "Sagemaker",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "sagemaker_chat",
"display_name": "Sagemaker Chat",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "sagemaker_nova",
"display_name": "Sagemaker Nova",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "bedrock",
"display_name": "Bedrock",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "vllm",
"display_name": "vLLM",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "nlp_cloud",
"display_name": "NLP Cloud",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "petals",
"display_name": "Petals",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "oobabooga",
"display_name": "Oobabooga",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "ollama",
"display_name": "Ollama",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "ollama_chat",
"display_name": "Ollama Chat",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "deepinfra",
"display_name": "Deepinfra",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "perplexity",
"display_name": "Perplexity",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "mistral",
"display_name": "Mistral",
"default_api_base": "https://api.mistral.ai/v1",
"api_key_env_var": "MISTRAL_API_KEY"
},
{
"routing_name": "milvus",
"display_name": "Milvus",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "groq",
"display_name": "Groq",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "a2a",
"display_name": "A2A",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "gigachat",
"display_name": "Gigachat",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "nvidia_nim",
"display_name": "NVIDIA NIM",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "nvidia_riva",
"display_name": "NVIDIA Riva",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "soniox",
"display_name": "Soniox",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "cerebras",
"display_name": "Cerebras",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "ai21_chat",
"display_name": "AI21 Chat",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "volcengine",
"display_name": "Volcengine",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "codestral",
"display_name": "Codestral",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "text-completion-codestral",
"display_name": "Text Completion Codestral",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "dashscope",
"display_name": "Dashscope",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "modelscope",
"display_name": "Modelscope",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "moonshot",
"display_name": "Moonshot",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "publicai",
"display_name": "Publicai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "v0",
"display_name": "v0",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "morph",
"display_name": "Morph",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "lambda_ai",
"display_name": "Lambda AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "inception",
"display_name": "Inception",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "text-completion-inception",
"display_name": "Text Completion Inception",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "deepseek",
"display_name": "Deepseek",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "sambanova",
"display_name": "Sambanova",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "maritalk",
"display_name": "Maritalk",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "voyage",
"display_name": "Voyage",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "cloudflare",
"display_name": "Cloudflare",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "xinference",
"display_name": "Xinference",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "fireworks_ai",
"display_name": "Fireworks AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "friendliai",
"display_name": "Friendliai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "featherless_ai",
"display_name": "Featherless AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "watsonx",
"display_name": "Watsonx",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "watsonx_text",
"display_name": "Watsonx Text",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "triton",
"display_name": "Triton",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "predibase",
"display_name": "Predibase",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "databricks",
"display_name": "Databricks",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "empower",
"display_name": "Empower",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "github",
"display_name": "GitHub",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "ragflow",
"display_name": "Ragflow",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "compactifai",
"display_name": "Compactifai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "docker_model_runner",
"display_name": "Docker Model Runner",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "custom",
"display_name": "Custom",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "litellm_proxy",
"display_name": "LiteLLM Proxy",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "hosted_vllm",
"display_name": "Hosted vLLM",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "llamafile",
"display_name": "Llamafile",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "lm_studio",
"display_name": "LM Studio",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "galadriel",
"display_name": "Galadriel",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "nebius",
"display_name": "Nebius",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "infinity",
"display_name": "Infinity",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "deepgram",
"display_name": "Deepgram",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "elevenlabs",
"display_name": "Elevenlabs",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "novita",
"display_name": "Novita",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "aiohttp_openai",
"display_name": "AIOHTTP OpenAI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "langfuse",
"display_name": "Langfuse",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "humanloop",
"display_name": "Humanloop",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "topaz",
"display_name": "Topaz",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "sap",
"display_name": "Sap Generative AI Hub",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "assemblyai",
"display_name": "Assemblyai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "charity_engine",
"display_name": "Charity Engine",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "github_copilot",
"display_name": "GitHub Copilot",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "snowflake",
"display_name": "Snowflake",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "gradient_ai",
"display_name": "Gradient AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "meta_llama",
"display_name": "Llama",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "nscale",
"display_name": "Nscale",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "pg_vector",
"display_name": "Pg Vector",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "s3_vectors",
"display_name": "S3 Vectors",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "helicone",
"display_name": "Helicone",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "hyperbolic",
"display_name": "Hyperbolic",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "recraft",
"display_name": "Recraft",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "fal_ai",
"display_name": "Fal AI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "stability",
"display_name": "Stability",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "heroku",
"display_name": "Heroku",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "aiml",
"display_name": "Aiml",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "cometapi",
"display_name": "Cometapi",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "oci",
"display_name": "OCI",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "auto_router",
"display_name": "Auto Router",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "vercel_ai_gateway",
"display_name": "Vercel AI Gateway",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "dotprompt",
"display_name": "Dotprompt",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "manus",
"display_name": "Manus",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "wandb",
"display_name": "Wandb",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "ovhcloud",
"display_name": "OVHcloud",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "scaleway",
"display_name": "Scaleway",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "lemonade",
"display_name": "Lemonade",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "amazon_nova",
"display_name": "Amazon Nova",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "a2a_agent",
"display_name": "A2A Agent",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "langgraph",
"display_name": "Langgraph",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "langflow",
"display_name": "Langflow",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "minimax",
"display_name": "Minimax",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "synthetic",
"display_name": "Synthetic",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "apertis",
"display_name": "Apertis",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "nano-gpt",
"display_name": "NanoGPT",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "poe",
"display_name": "Poe",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "chutes",
"display_name": "Chutes",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "neosantara",
"display_name": "Neosantara",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "parasail",
"display_name": "Parasail",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "xiaomi_mimo",
"display_name": "Xiaomi MiMo",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "tensormesh",
"display_name": "Tensormesh",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "libertai",
"display_name": "Libertai",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "pinstripes",
"display_name": "Pinstripes",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "darkbloom",
"display_name": "Darkbloom",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "litellm_agent",
"display_name": "LiteLLM Agent",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "cursor",
"display_name": "Cursor",
"default_api_base": null,
"api_key_env_var": null
},
{
"routing_name": "bedrock_mantle",
"display_name": "Bedrock Mantle",
"default_api_base": null,
"api_key_env_var": null
}
]

View file

@ -31,6 +31,12 @@
}
}
},
"default_creds": {
"mistral": {
"default_api_base": "https://api.mistral.ai/v1",
"api_key_env_var": "MISTRAL_API_KEY"
}
},
"providers": {
"a2a": {
"display_name": "A2A (Agent-to-Agent) (`a2a`)",
@ -179,6 +185,7 @@
},
"apertis": {
"display_name": "Apertis (`apertis`)",
"url": "https://docs.litellm.ai/docs/providers/apertis",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -460,6 +467,7 @@
},
"chutes": {
"display_name": "Chutes (`chutes`)",
"url": "https://docs.litellm.ai/docs/providers/chutes",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -1470,6 +1478,7 @@
},
"nanogpt": {
"display_name": "NanoGPT (`nanogpt`)",
"url": "https://docs.litellm.ai/docs/providers/nanogpt",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -1803,6 +1812,7 @@
},
"poe": {
"display_name": "Poe (`poe`)",
"url": "https://docs.litellm.ai/docs/providers/poe",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -2030,6 +2040,7 @@
},
"synthetic": {
"display_name": "Synthetic (`synthetic`)",
"url": "https://docs.litellm.ai/docs/providers/synthetic",
"endpoints": {
"chat_completions": true,
"messages": true,

View file

@ -31,6 +31,12 @@
}
}
},
"default_creds": {
"mistral": {
"default_api_base": "https://api.mistral.ai/v1",
"api_key_env_var": "MISTRAL_API_KEY"
}
},
"providers": {
"a2a": {
"display_name": "A2A (Agent-to-Agent) (`a2a`)",
@ -179,6 +185,7 @@
},
"apertis": {
"display_name": "Apertis (`apertis`)",
"url": "https://docs.litellm.ai/docs/providers/apertis",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -495,6 +502,7 @@
},
"chutes": {
"display_name": "Chutes (`chutes`)",
"url": "https://docs.litellm.ai/docs/providers/chutes",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -1593,6 +1601,7 @@
},
"nanogpt": {
"display_name": "NanoGPT (`nanogpt`)",
"url": "https://docs.litellm.ai/docs/providers/nanogpt",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -1993,6 +2002,7 @@
},
"poe": {
"display_name": "Poe (`poe`)",
"url": "https://docs.litellm.ai/docs/providers/poe",
"endpoints": {
"chat_completions": true,
"messages": false,
@ -2253,6 +2263,7 @@
},
"synthetic": {
"display_name": "Synthetic (`synthetic`)",
"url": "https://docs.litellm.ai/docs/providers/synthetic",
"endpoints": {
"chat_completions": true,
"messages": true,