mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-12 23:01:41 +00:00
chore: source rust providers from endpoint registry
This commit is contained in:
parent
3ecd1202f2
commit
31ef925ffe
6 changed files with 123 additions and 960 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue