Trim Bitdeer models to 3 and rename slug to bitdeer-ai

Keeps moonshotai/Kimi-K3, zai-org/GLM-5.2, and deepseek-ai/DeepSeek-V4-Flash;
drops Kimi-K2.6, Qwen3.5-397B-A17B, and DeepSeek-V4-Pro. Renames the provider
slug from bitdeer to bitdeer-ai to match Bitdeer's preferred identifier.
This commit is contained in:
ruijie 2026-08-13 12:19:31 +08:00
parent 192052d2cc
commit e4ab197e70
6 changed files with 33 additions and 79 deletions

View file

@ -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",

View file

@ -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"

View file

@ -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": {

View file

@ -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"

View file

@ -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,

View file

@ -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