From 31ef925ffef789a1f938e460ff5720d61148236d Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 24 Jun 2026 16:41:53 -0700 Subject: [PATCH] chore: source rust providers from endpoint registry --- litellm-rust/ADDING_A_PROVIDER.md | 2 +- litellm-rust/crates/core/build.rs | 156 ++-- .../crates/core/src/providers/README.md | 25 +- .../core/src/providers/provider_registry.json | 878 ------------------ .../provider_endpoints_support_backup.json | 11 + provider_endpoints_support.json | 11 + 6 files changed, 123 insertions(+), 960 deletions(-) delete mode 100644 litellm-rust/crates/core/src/providers/provider_registry.json diff --git a/litellm-rust/ADDING_A_PROVIDER.md b/litellm-rust/ADDING_A_PROVIDER.md index 48f8f75dceb..9555a0c53a3 100644 --- a/litellm-rust/ADDING_A_PROVIDER.md +++ b/litellm-rust/ADDING_A_PROVIDER.md @@ -1,7 +1,7 @@ # Adding a provider / route to litellm-rust - Keep the route contract pure in `crates/core/src//`: 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///transformation.rs`, mirroring the Python provider tree and exposing a `const __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. diff --git a/litellm-rust/crates/core/build.rs b/litellm-rust/crates/core/build.rs index dfc415345a1..07be1279a0a 100644 --- a/litellm-rust/crates/core/build.rs +++ b/litellm-rust/crates/core/build.rs @@ -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, + #[serde(default)] + default_creds: BTreeMap, +} + +#[derive(Debug, Deserialize)] +struct ProviderInput { + display_name: String, + url: String, +} + +#[derive(Debug, Deserialize)] +struct ProviderDefaultCredsInput { + default_api_base: Option, + api_key_env_var: Option, +} + +#[derive(Debug)] struct ProviderMetadataInput { routing_name: String, display_name: String, + docs_url: String, default_api_base: Option, api_key_env_var: Option, } @@ -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 { + 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 {{ + fn endpoint_support_provider_values() -> Vec {{ let raw = include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/src/providers/provider_registry.json" + "/../../../provider_endpoints_support.json" )); - serde_json::from_str::>(raw) - .expect("provider_registry.json parses") - .into_iter() - .map(|provider| provider.routing_name) - .collect() - }} - - fn python_provider_values() -> Vec {{ - 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::(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::>(); + 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 = 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()); diff --git a/litellm-rust/crates/core/src/providers/README.md b/litellm-rust/crates/core/src/providers/README.md index c8e2b8a2526..84ef3731f3f 100644 --- a/litellm-rust/crates/core/src/providers/README.md +++ b/litellm-rust/crates/core/src/providers/README.md @@ -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///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`. diff --git a/litellm-rust/crates/core/src/providers/provider_registry.json b/litellm-rust/crates/core/src/providers/provider_registry.json deleted file mode 100644 index 60e2c3e8bc4..00000000000 --- a/litellm-rust/crates/core/src/providers/provider_registry.json +++ /dev/null @@ -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 - } -] diff --git a/litellm/provider_endpoints_support_backup.json b/litellm/provider_endpoints_support_backup.json index dd7712aabca..bd539102000 100644 --- a/litellm/provider_endpoints_support_backup.json +++ b/litellm/provider_endpoints_support_backup.json @@ -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, diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index b137ec59a1f..27124b5634d 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -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,