diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index bda3684a8a8..9104aef1a8c 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -71,5 +71,16 @@ "param_mappings": { "max_completion_tokens": "max_tokens" } + }, + "sarvam": { + "base_url": "https://api.sarvam.ai/v1", + "api_key_env": "SARVAM_API_KEY", + "base_class": "openai_gpt", + "param_mappings": { + "max_completion_tokens": "max_tokens" + }, + "headers": { + "api-subscription-key": "{api_key}" + } } } diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 0a6f6271739..a74b80e7373 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -34062,5 +34062,18 @@ "output_cost_per_token": 0, "litellm_provider": "llamagate", "mode": "embedding" + }, + "sarvam/sarvam-m": { + "cache_creation_input_token_cost": 0, + "cache_creation_input_token_cost_above_1hr": 0, + "cache_read_input_token_cost": 0, + "input_cost_per_token": 0, + "litellm_provider": "sarvam", + "max_input_tokens": 8192, + "max_output_tokens": 32000, + "max_tokens": 32000, + "mode": "chat", + "output_cost_per_token": 0, + "supports_reasoning": true } } diff --git a/litellm/router.py b/litellm/router.py index 3e312c154b4..62070d23755 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -63,6 +63,7 @@ from litellm.litellm_core_utils.credential_accessor import CredentialAccessor from litellm.litellm_core_utils.dd_tracing import tracer from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLogging from litellm.litellm_core_utils.sensitive_data_masker import SensitiveDataMasker +from litellm.llms.openai_like.json_loader import JSONProviderRegistry from litellm.router_strategy.budget_limiter import RouterBudgetLimiting from litellm.router_strategy.least_busy import LeastBusyLoggingHandler from litellm.router_strategy.lowest_cost import LowestCostLoggingHandler @@ -5877,7 +5878,8 @@ class Router: ), ) # done reading model["litellm_params"] - if custom_llm_provider not in litellm.provider_list: + # Check if provider is supported: either in enum or JSON-configured + if custom_llm_provider not in litellm.provider_list and not JSONProviderRegistry.exists(custom_llm_provider): raise Exception(f"Unsupported provider - {custom_llm_provider}") #### DEPLOYMENT NAMES INIT ######## diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 0a6f6271739..a74b80e7373 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -34062,5 +34062,18 @@ "output_cost_per_token": 0, "litellm_provider": "llamagate", "mode": "embedding" + }, + "sarvam/sarvam-m": { + "cache_creation_input_token_cost": 0, + "cache_creation_input_token_cost_above_1hr": 0, + "cache_read_input_token_cost": 0, + "input_cost_per_token": 0, + "litellm_provider": "sarvam", + "max_input_tokens": 8192, + "max_output_tokens": 32000, + "max_tokens": 32000, + "mode": "chat", + "output_cost_per_token": 0, + "supports_reasoning": true } } diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index b7892a67a17..3af5f4f36f3 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -2358,6 +2358,15 @@ "a2a": true, "interactions": true } + }, + "sarvam": { + "display_name": "Sarvam (`sarvam`)", + "url": "https://docs.litellm.ai/docs/providers/sarvam", + "endpoints": { + "chat_completions": true, + "messages": true, + "responses": true + } } }, "endpoints": { diff --git a/tests/litellm_utils_tests/test_utils.py b/tests/litellm_utils_tests/test_utils.py index a679fa4e4cb..e1751c8e2f8 100644 --- a/tests/litellm_utils_tests/test_utils.py +++ b/tests/litellm_utils_tests/test_utils.py @@ -37,6 +37,7 @@ from litellm.utils import ( trim_messages, validate_environment, ) +from litellm.llms.openai_like.json_loader import JSONProviderRegistry from unittest.mock import AsyncMock, MagicMock, patch @@ -1383,7 +1384,7 @@ def test_models_by_provider(): providers.add(v["litellm_provider"]) for provider in providers: - assert provider in models_by_provider.keys() + assert provider in models_by_provider.keys() or JSONProviderRegistry.exists(provider) @pytest.mark.parametrize(