From 9daed96cf29439b43f41a22a6e44d5c4906f6e4c Mon Sep 17 00:00:00 2001 From: Jaber Jaber <103749727+jaberjaber23@users.noreply.github.com> Date: Mon, 19 Oct 2026 16:54:59 -0700 Subject: [PATCH] feat(runinfra): add GLM-5.3 and DeepSeek V4.1 Flash, refresh prices, drop retired models Co-Authored-By: Claude Opus 5.5 --- ...odel_prices_and_context_window_backup.json | 71 ++++++++++--------- model_prices_and_context_window.json | 71 ++++++++++--------- .../llms/openai_like/test_json_providers.py | 41 ++++++----- 3 files changed, 97 insertions(+), 86 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index a9fcfcbb2fc..846a244822a 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -49906,26 +49906,6 @@ "supports_system_messages": true, "supports_tool_choice": true }, - "runinfra/Inferact/Qwen3.8-2.4T-A95B-NVFP4": { - "cache_read_input_token_cost": 2e-07, - "input_cost_per_token": 2e-06, - "litellm_provider": "runinfra", - "max_input_tokens": 262144, - "max_output_tokens": 32768, - "max_tokens": 32768, - "mode": "chat", - "output_cost_per_token": 6e-06, - "source": "https://runinfra.ai/inference-api/qwen3-8-2-4t-a95b", - "supported_endpoints": [ - "/v1/chat/completions" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true - }, "runinfra/Qwen/Qwen3.8-27B": { "cache_read_input_token_cost": 1e-08, "input_cost_per_token": 1e-07, @@ -49947,16 +49927,16 @@ "supports_tool_choice": true, "supports_vision": true }, - "runinfra/deepseek-ai/DeepSeek-V4-Flash-0731": { - "cache_read_input_token_cost": 1e-08, - "input_cost_per_token": 1.3e-07, + "runinfra/deepseek-ai/DeepSeek-V4.1-Flash": { + "cache_read_input_token_cost": 3e-08, + "input_cost_per_token": 1.4e-07, "litellm_provider": "runinfra", "max_input_tokens": 1048576, "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 2.7e-07, - "source": "https://runinfra.ai/inference-api/deepseek-v4-flash", + "output_cost_per_token": 5.8e-07, + "source": "https://runinfra.ai/inference-api/deepseek-v4-1-flash", "supported_endpoints": [ "/v1/chat/completions" ], @@ -49967,16 +49947,16 @@ "supports_response_schema": true, "supports_tool_choice": true }, - "runinfra/deepseek-ai/DeepSeek-V4-Pro-0813": { - "cache_read_input_token_cost": 3e-08, - "input_cost_per_token": 6e-07, + "runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017": { + "cache_read_input_token_cost": 1e-08, + "input_cost_per_token": 1.5e-07, "litellm_provider": "runinfra", "max_input_tokens": 1048576, "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 1.9e-06, - "source": "https://runinfra.ai/inference-api/deepseek-v4-pro", + "output_cost_per_token": 6e-07, + "source": "https://runinfra.ai/inference-api/deepseek-v4-1-flash-1017", "supported_endpoints": [ "/v1/chat/completions" ], @@ -49985,7 +49965,8 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": true }, "runinfra/nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16": { "cache_read_input_token_cost": 1e-08, @@ -50028,15 +50009,35 @@ "supports_tool_choice": true, "supports_vision": true }, - "runinfra/zai-org/GLM-5.3-Flash": { - "cache_read_input_token_cost": 1e-08, - "input_cost_per_token": 1e-07, + "runinfra/zai-org/GLM-5.3": { + "cache_read_input_token_cost": 1.4e-07, + "input_cost_per_token": 1.4e-06, "litellm_provider": "runinfra", "max_input_tokens": 1048576, "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 4e-07, + "output_cost_per_token": 4.4e-06, + "source": "https://runinfra.ai/inference-api/glm-5-3", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true + }, + "runinfra/zai-org/GLM-5.3-Flash": { + "cache_read_input_token_cost": 3e-08, + "input_cost_per_token": 1.1e-07, + "litellm_provider": "runinfra", + "max_input_tokens": 1048576, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 4.5e-07, "source": "https://runinfra.ai/inference-api/glm-5-3-flash", "supported_endpoints": [ "/v1/chat/completions" diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index a9fcfcbb2fc..846a244822a 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -49906,26 +49906,6 @@ "supports_system_messages": true, "supports_tool_choice": true }, - "runinfra/Inferact/Qwen3.8-2.4T-A95B-NVFP4": { - "cache_read_input_token_cost": 2e-07, - "input_cost_per_token": 2e-06, - "litellm_provider": "runinfra", - "max_input_tokens": 262144, - "max_output_tokens": 32768, - "max_tokens": 32768, - "mode": "chat", - "output_cost_per_token": 6e-06, - "source": "https://runinfra.ai/inference-api/qwen3-8-2-4t-a95b", - "supported_endpoints": [ - "/v1/chat/completions" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": true, - "supports_tool_choice": true - }, "runinfra/Qwen/Qwen3.8-27B": { "cache_read_input_token_cost": 1e-08, "input_cost_per_token": 1e-07, @@ -49947,16 +49927,16 @@ "supports_tool_choice": true, "supports_vision": true }, - "runinfra/deepseek-ai/DeepSeek-V4-Flash-0731": { - "cache_read_input_token_cost": 1e-08, - "input_cost_per_token": 1.3e-07, + "runinfra/deepseek-ai/DeepSeek-V4.1-Flash": { + "cache_read_input_token_cost": 3e-08, + "input_cost_per_token": 1.4e-07, "litellm_provider": "runinfra", "max_input_tokens": 1048576, "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 2.7e-07, - "source": "https://runinfra.ai/inference-api/deepseek-v4-flash", + "output_cost_per_token": 5.8e-07, + "source": "https://runinfra.ai/inference-api/deepseek-v4-1-flash", "supported_endpoints": [ "/v1/chat/completions" ], @@ -49967,16 +49947,16 @@ "supports_response_schema": true, "supports_tool_choice": true }, - "runinfra/deepseek-ai/DeepSeek-V4-Pro-0813": { - "cache_read_input_token_cost": 3e-08, - "input_cost_per_token": 6e-07, + "runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017": { + "cache_read_input_token_cost": 1e-08, + "input_cost_per_token": 1.5e-07, "litellm_provider": "runinfra", "max_input_tokens": 1048576, "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 1.9e-06, - "source": "https://runinfra.ai/inference-api/deepseek-v4-pro", + "output_cost_per_token": 6e-07, + "source": "https://runinfra.ai/inference-api/deepseek-v4-1-flash-1017", "supported_endpoints": [ "/v1/chat/completions" ], @@ -49985,7 +49965,8 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": true }, "runinfra/nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16": { "cache_read_input_token_cost": 1e-08, @@ -50028,15 +50009,35 @@ "supports_tool_choice": true, "supports_vision": true }, - "runinfra/zai-org/GLM-5.3-Flash": { - "cache_read_input_token_cost": 1e-08, - "input_cost_per_token": 1e-07, + "runinfra/zai-org/GLM-5.3": { + "cache_read_input_token_cost": 1.4e-07, + "input_cost_per_token": 1.4e-06, "litellm_provider": "runinfra", "max_input_tokens": 1048576, "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 4e-07, + "output_cost_per_token": 4.4e-06, + "source": "https://runinfra.ai/inference-api/glm-5-3", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true + }, + "runinfra/zai-org/GLM-5.3-Flash": { + "cache_read_input_token_cost": 3e-08, + "input_cost_per_token": 1.1e-07, + "litellm_provider": "runinfra", + "max_input_tokens": 1048576, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 4.5e-07, "source": "https://runinfra.ai/inference-api/glm-5-3-flash", "supported_endpoints": [ "/v1/chat/completions" diff --git a/tests/test_litellm/llms/openai_like/test_json_providers.py b/tests/test_litellm/llms/openai_like/test_json_providers.py index a5e2311630f..9552c5d25b3 100644 --- a/tests/test_litellm/llms/openai_like/test_json_providers.py +++ b/tests/test_litellm/llms/openai_like/test_json_providers.py @@ -353,13 +353,13 @@ class TestRuninfra: from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider model, provider, api_key, api_base = get_llm_provider( - model="runinfra/deepseek-ai/DeepSeek-V4-Flash-0731", + model="runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017", custom_llm_provider=None, api_base=None, api_key=None, ) - assert model == "deepseek-ai/DeepSeek-V4-Flash-0731" + assert model == "deepseek-ai/DeepSeek-V4.1-Flash-1017" assert provider == "runinfra" assert api_key is None assert api_base == "https://api.runinfra.ai/v1" @@ -392,7 +392,7 @@ class TestRuninfra: url = config.get_complete_url( api_base="https://api.runinfra.ai/v1", api_key="test-key", - model="runinfra/deepseek-ai/DeepSeek-V4-Flash-0731", + model="runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017", optional_params={}, litellm_params={}, stream=True, @@ -405,7 +405,7 @@ class TestRuninfra: from litellm.utils import ProviderConfigManager config = ProviderConfigManager.get_provider_chat_config( - model="deepseek-ai/DeepSeek-V4-Flash-0731", provider=LlmProviders.RUNINFRA + model="deepseek-ai/DeepSeek-V4.1-Flash-1017", provider=LlmProviders.RUNINFRA ) assert config is not None @@ -418,18 +418,23 @@ class TestRuninfra: model_cost = json.load(f) expected_models = { - "runinfra/deepseek-ai/DeepSeek-V4-Flash-0731": (1.3e-07, 2.7e-07, 1e-08), - "runinfra/deepseek-ai/DeepSeek-V4-Pro-0813": (6e-07, 1.9e-06, 3e-08), + "runinfra/deepseek-ai/DeepSeek-V4.1-Flash": (1.4e-07, 5.8e-07, 3e-08), + "runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017": (1.5e-07, 6e-07, 1e-08), "runinfra/nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16": ( 5e-08, 1.5e-07, 1e-08, ), - "runinfra/Inferact/Qwen3.8-2.4T-A95B-NVFP4": (2e-06, 6e-06, 2e-07), "runinfra/Qwen/Qwen3.8-27B": (1e-07, 4e-07, 1e-08), "runinfra/ornith-ai/Ornith-1.5-35B-A3B": (1e-07, 4e-07, 1e-08), - "runinfra/zai-org/GLM-5.3-Flash": (1e-07, 4e-07, 1e-08), + "runinfra/zai-org/GLM-5.3-Flash": (1.1e-07, 4.5e-07, 3e-08), + "runinfra/zai-org/GLM-5.3": (1.4e-06, 4.4e-06, 1.4e-07), } + # Every RunInfra entry is pinned here, so a retired model left in the + # cost map, or a new one added without its prices, reddens this test. + assert { + k for k, v in model_cost.items() if v.get("litellm_provider") == "runinfra" + } == set(expected_models) for model, (input_cost, output_cost, cache_read_cost) in expected_models.items(): assert model in model_cost assert model_cost[model]["litellm_provider"] == "runinfra" @@ -446,21 +451,25 @@ class TestRuninfra: assert model_cost[model]["cache_read_input_token_cost"] == cache_read_cost assert model_cost[model]["supports_prompt_caching"] is True - assert model_cost["runinfra/deepseek-ai/DeepSeek-V4-Flash-0731"]["max_input_tokens"] == 1048576 - assert model_cost["runinfra/deepseek-ai/DeepSeek-V4-Pro-0813"]["max_input_tokens"] == 1048576 + assert model_cost["runinfra/deepseek-ai/DeepSeek-V4.1-Flash"]["max_input_tokens"] == 1048576 + assert model_cost["runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017"]["max_input_tokens"] == 1048576 + assert model_cost["runinfra/zai-org/GLM-5.3"]["max_input_tokens"] == 1048576 assert model_cost["runinfra/Qwen/Qwen3.8-27B"]["max_input_tokens"] == 262144 - assert model_cost["runinfra/Inferact/Qwen3.8-2.4T-A95B-NVFP4"]["supports_response_schema"] is True + assert model_cost["runinfra/zai-org/GLM-5.3"]["supports_response_schema"] is True assert model_cost["runinfra/Qwen/Qwen3.8-27B"]["supports_response_schema"] is True assert model_cost["runinfra/ornith-ai/Ornith-1.5-35B-A3B"]["max_input_tokens"] == 262144 - # Image input is proven on exactly these two and declared on no other, - # so a copied flag on a text-only model reddens here. + # Image input is declared on exactly the four models that RunInfra's + # provider feed lists with an image input modality (Qwen3.8-27B, + # Ornith-1.5-35B-A3B, GLM-5.3-Flash and DeepSeek-V4.1-Flash-1017) and + # on no other, so a copied flag on a text-only model reddens here. for model, expected_vision in ( ("runinfra/Qwen/Qwen3.8-27B", True), ("runinfra/ornith-ai/Ornith-1.5-35B-A3B", True), - ("runinfra/deepseek-ai/DeepSeek-V4-Flash-0731", False), - ("runinfra/deepseek-ai/DeepSeek-V4-Pro-0813", False), + ("runinfra/zai-org/GLM-5.3-Flash", True), + ("runinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017", True), + ("runinfra/deepseek-ai/DeepSeek-V4.1-Flash", False), ("runinfra/nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", False), - ("runinfra/Inferact/Qwen3.8-2.4T-A95B-NVFP4", False), + ("runinfra/zai-org/GLM-5.3", False), ): assert model_cost[model].get("supports_vision", False) is expected_vision