diff --git a/litellm/constants.py b/litellm/constants.py index 4bb99cfa532..5d0001ca89e 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -822,7 +822,7 @@ openai_compatible_providers: Final[list] = [ "pinstripes", # Pinstripes - JSON-configured provider "darkbloom", "meta", # Meta Model API (Muse Spark) - JSON-configured provider - "bitdeer", # Bitdeer AI - JSON-configured provider + "bitdeer-ai", # Bitdeer AI - JSON-configured provider ] openai_text_completion_compatible_providers: Final[list] = [ # providers that support `/v1/completions` "together_ai", diff --git a/litellm/litellm_core_utils/get_llm_provider_logic.py b/litellm/litellm_core_utils/get_llm_provider_logic.py index e25c62d0f9f..c0986148b75 100644 --- a/litellm/litellm_core_utils/get_llm_provider_logic.py +++ b/litellm/litellm_core_utils/get_llm_provider_logic.py @@ -326,7 +326,7 @@ def get_llm_provider( custom_llm_provider = "chutes" dynamic_api_key = get_secret_str("CHUTES_API_KEY") elif endpoint == "https://api-inference.bitdeer.ai/v1": - custom_llm_provider = "bitdeer" + custom_llm_provider = "bitdeer-ai" dynamic_api_key = get_secret_str("BITDEER_API_KEY") elif endpoint == "https://api.v0.dev/v1": custom_llm_provider = "v0" diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index 6fd7926ad63..62ebd86afec 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -184,7 +184,7 @@ }, "supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/embeddings"] }, - "bitdeer": { + "bitdeer-ai": { "base_url": "https://api-inference.bitdeer.ai/v1", "api_key_env": "BITDEER_API_KEY", "param_mappings": { diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 8418a3431d0..45636969a31 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -3710,7 +3710,7 @@ class LlmProviders(str, Enum): XIAOMI_MIMO = "xiaomi_mimo" TENSORMESH = "tensormesh" LIBERTAI = "libertai" - BITDEER = "bitdeer" + BITDEER_AI = "bitdeer-ai" PINSTRIPES = "pinstripes" DARKBLOOM = "darkbloom" META = "meta" diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index aebf37fbeb6..e6dfb472aad 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -47176,14 +47176,14 @@ ], "supports_audio_output": true }, - "bitdeer/moonshotai/Kimi-K3": { + "bitdeer-ai/moonshotai/Kimi-K3": { "max_tokens": 1048576, "max_input_tokens": 1048576, "max_output_tokens": 131072, "input_cost_per_token": 3e-06, "output_cost_per_token": 1.5e-05, "cache_read_input_token_cost": 3e-07, - "litellm_provider": "bitdeer", + "litellm_provider": "bitdeer-ai", "mode": "chat", "supports_function_calling": true, "supports_tool_choice": true, @@ -47192,14 +47192,14 @@ "supports_prompt_caching": true, "source": "https://www.bitdeer.ai/en/pricing/ai-models" }, - "bitdeer/zai-org/GLM-5.2": { + "bitdeer-ai/zai-org/GLM-5.2": { "max_tokens": 1000000, "max_input_tokens": 1000000, "max_output_tokens": 131072, "input_cost_per_token": 1.4e-06, "output_cost_per_token": 4.4e-06, "cache_read_input_token_cost": 2.6e-07, - "litellm_provider": "bitdeer", + "litellm_provider": "bitdeer-ai", "mode": "chat", "supports_function_calling": true, "supports_tool_choice": true, @@ -47207,61 +47207,18 @@ "supports_prompt_caching": true, "source": "https://www.bitdeer.ai/en/pricing/ai-models" }, - "bitdeer/moonshotai/Kimi-K2.6": { - "max_tokens": 262144, - "max_input_tokens": 262144, - "max_output_tokens": 262144, - "input_cost_per_token": 9.5e-07, - "output_cost_per_token": 4e-06, - "cache_read_input_token_cost": 2e-07, - "litellm_provider": "bitdeer", - "mode": "chat", - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_reasoning": true, - "supports_vision": true, + "bitdeer-ai/deepseek-ai/DeepSeek-V4-Flash": { "supports_prompt_caching": true, "source": "https://www.bitdeer.ai/en/pricing/ai-models" }, - "bitdeer/Qwen/Qwen3.5-397B-A17B": { - "max_tokens": 262144, - "max_input_tokens": 262144, - "max_output_tokens": 65536, - "input_cost_per_token": 6e-07, - "output_cost_per_token": 3.55e-06, - "cache_read_input_token_cost": 2e-07, - "litellm_provider": "bitdeer", - "mode": "chat", - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_reasoning": true, - "supports_vision": true, - "supports_prompt_caching": true, - "source": "https://www.bitdeer.ai/en/pricing/ai-models" - }, - "bitdeer/deepseek-ai/DeepSeek-V4-Pro": { - "max_tokens": 1000000, - "max_input_tokens": 1000000, - "max_output_tokens": 384000, - "input_cost_per_token": 1.168e-06, - "output_cost_per_token": 2.336e-06, - "cache_read_input_token_cost": 1e-07, - "litellm_provider": "bitdeer", - "mode": "chat", - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_reasoning": true, - "supports_prompt_caching": true, - "source": "https://www.bitdeer.ai/en/pricing/ai-models" - }, - "bitdeer/deepseek-ai/DeepSeek-V4-Flash": { + "bitdeer-ai/deepseek-ai/DeepSeek-V4-Flash": { "max_tokens": 1000000, "max_input_tokens": 1000000, "max_output_tokens": 384000, "input_cost_per_token": 4e-08, "output_cost_per_token": 8e-08, "cache_read_input_token_cost": 1e-08, - "litellm_provider": "bitdeer", + "litellm_provider": "bitdeer-ai", "mode": "chat", "supports_function_calling": true, "supports_tool_choice": true, diff --git a/tests/test_litellm/llms/openai_like/test_bitdeer_provider.py b/tests/test_litellm/llms/openai_like/test_bitdeer_provider.py index b861c6048bb..949c47336d0 100644 --- a/tests/test_litellm/llms/openai_like/test_bitdeer_provider.py +++ b/tests/test_litellm/llms/openai_like/test_bitdeer_provider.py @@ -17,41 +17,41 @@ class TestBitdeerProviderConfig: """Test that bitdeer is in the provider list""" from litellm import LlmProviders - assert hasattr(LlmProviders, "BITDEER") - assert LlmProviders.BITDEER.value == "bitdeer" - assert "bitdeer" in litellm.provider_list + assert hasattr(LlmProviders, "BITDEER_AI") + assert LlmProviders.BITDEER_AI.value == "bitdeer-ai" + assert "bitdeer-ai" in litellm.provider_list def test_bitdeer_json_config_exists(self): """Test that bitdeer is configured in providers.json""" from litellm.llms.openai_like.json_loader import JSONProviderRegistry - assert JSONProviderRegistry.exists("bitdeer") + assert JSONProviderRegistry.exists("bitdeer-ai") - bitdeer = JSONProviderRegistry.get("bitdeer") - assert bitdeer is not None - assert bitdeer.base_url == "https://api-inference.bitdeer.ai/v1" - assert bitdeer.api_key_env == "BITDEER_API_KEY" - assert bitdeer.param_mappings.get("max_completion_tokens") == "max_tokens" + bitdeer_ai = JSONProviderRegistry.get("bitdeer-ai") + assert bitdeer_ai is not None + assert bitdeer_ai.base_url == "https://api-inference.bitdeer.ai/v1" + assert bitdeer_ai.api_key_env == "BITDEER_API_KEY" + assert bitdeer_ai.param_mappings.get("max_completion_tokens") == "max_tokens" def test_bitdeer_in_openai_compatible_providers(self): """Test that bitdeer is in the openai_compatible_providers list""" from litellm.constants import openai_compatible_providers - assert "bitdeer" in openai_compatible_providers + assert "bitdeer-ai" in openai_compatible_providers def test_bitdeer_provider_resolution(self): """Test that provider resolution finds bitdeer and returns the default base URL""" from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider model, provider, api_key, api_base = get_llm_provider( - model="bitdeer/moonshotai/Kimi-K3", + model="bitdeer-ai/moonshotai/Kimi-K3", custom_llm_provider=None, api_base=None, api_key=None, ) assert model == "moonshotai/Kimi-K3" - assert provider == "bitdeer" + assert provider == "bitdeer-ai" assert api_base == "https://api-inference.bitdeer.ai/v1" def test_bitdeer_api_base_override(self): @@ -59,13 +59,13 @@ class TestBitdeerProviderConfig: from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider model, provider, api_key, api_base = get_llm_provider( - model="bitdeer/moonshotai/Kimi-K3", + model="bitdeer-ai/moonshotai/Kimi-K3", custom_llm_provider=None, api_base="https://custom.bitdeer.ai/v1", api_key="sk-test", ) - assert provider == "bitdeer" + assert provider == "bitdeer-ai" assert api_base == "https://custom.bitdeer.ai/v1" assert api_key == "sk-test" @@ -79,7 +79,7 @@ class TestBitdeerProviderConfig: api_base="https://api-inference.bitdeer.ai/v1", api_key=None, ) - assert provider == "bitdeer" + assert provider == "bitdeer-ai" assert api_base == "https://api-inference.bitdeer.ai/v1" def test_bitdeer_router_config(self): @@ -89,9 +89,9 @@ class TestBitdeerProviderConfig: router = Router( model_list=[ { - "model_name": "bitdeer-kimi-k3", + "model_name": "bitdeer-ai-kimi-k3", "litellm_params": { - "model": "bitdeer/moonshotai/Kimi-K3", + "model": "bitdeer-ai/moonshotai/Kimi-K3", "api_key": "test-key", }, } @@ -99,7 +99,7 @@ class TestBitdeerProviderConfig: ) assert len(router.model_list) == 1 - assert router.model_list[0]["model_name"] == "bitdeer-kimi-k3" + assert router.model_list[0]["model_name"] == "bitdeer-ai-kimi-k3" def test_bitdeer_model_cost_map(self): """Test that bitdeer model pricing is registered correctly""" @@ -109,15 +109,12 @@ class TestBitdeerProviderConfig: model_cost = json.load(f) expected_models = { - "bitdeer/moonshotai/Kimi-K3": (3e-06, 1.5e-05), - "bitdeer/zai-org/GLM-5.2": (1.4e-06, 4.4e-06), - "bitdeer/moonshotai/Kimi-K2.6": (9.5e-07, 4e-06), - "bitdeer/Qwen/Qwen3.5-397B-A17B": (6e-07, 3.55e-06), - "bitdeer/deepseek-ai/DeepSeek-V4-Pro": (1.168e-06, 2.336e-06), - "bitdeer/deepseek-ai/DeepSeek-V4-Flash": (4e-08, 8e-08), + "bitdeer-ai/moonshotai/Kimi-K3": (3e-06, 1.5e-05), + "bitdeer-ai/zai-org/GLM-5.2": (1.4e-06, 4.4e-06), + "bitdeer-ai/deepseek-ai/DeepSeek-V4-Flash": (4e-08, 8e-08), } for model, (input_cost, output_cost) in expected_models.items(): assert model in model_cost - assert model_cost[model]["litellm_provider"] == "bitdeer" + assert model_cost[model]["litellm_provider"] == "bitdeer-ai" assert model_cost[model]["input_cost_per_token"] == input_cost assert model_cost[model]["output_cost_per_token"] == output_cost