diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 76dcfc55c10..a3b8499d8a5 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -9924,6 +9924,48 @@ "supports_system_messages": true, "supports_tool_choice": false }, + "deepseek-v4-flash": { + "cache_read_input_token_cost": 1.4e-08, + "input_cost_per_token": 1.4e-07, + "litellm_provider": "deepseek", + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 2.8e-07, + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "deepseek-v4-pro": { + "cache_read_input_token_cost": 1.74e-07, + "input_cost_per_token": 1.74e-06, + "litellm_provider": "deepseek", + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 3.48e-06, + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "dashscope/qwen-coder": { "input_cost_per_token": 3e-07, "litellm_provider": "dashscope", @@ -12459,6 +12501,54 @@ "supports_reasoning": true, "supports_tool_choice": true }, + "deepseek/deepseek-v4-flash": { + "cache_creation_input_token_cost": 0.0, + "cache_read_input_token_cost": 1.4e-08, + "input_cost_per_token": 1.4e-07, + "input_cost_per_token_cache_hit": 1.4e-08, + "litellm_provider": "deepseek", + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 2.8e-07, + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "deepseek/deepseek-v4-pro": { + "cache_creation_input_token_cost": 0.0, + "cache_read_input_token_cost": 1.74e-07, + "input_cost_per_token": 1.74e-06, + "input_cost_per_token_cache_hit": 1.74e-07, + "litellm_provider": "deepseek", + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 3.48e-06, + "source": "https://api-docs.deepseek.com/quick_start/pricing", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "deepseek/deepseek-reasoner": { "cache_read_input_token_cost": 2.8e-08, "input_cost_per_token": 2.8e-07, diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index f28fe3ed258..1ace3e3d9d3 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -3983,3 +3983,55 @@ class TestValidateAndFixThinkingParam: validate_and_fix_thinking_param(thinking=thinking) assert "budgetTokens" in thinking assert "budget_tokens" not in thinking + + +def test_deepseek_v4_models_in_cost_map(): + """ + Test that deepseek-v4-flash and deepseek-v4-pro entries are correctly + configured in model_prices_and_context_window.json. + + Prices sourced from https://api-docs.deepseek.com/quick_start/pricing: + - deepseek-v4-flash: $0.14/M input, $0.28/M output + - deepseek-v4-pro: $1.74/M input, $3.48/M output + + Closes https://github.com/BerriAI/litellm/issues/26709 + """ + import json + from pathlib import Path + + json_path = Path(__file__).parents[2] / "model_prices_and_context_window.json" + with open(json_path) as f: + model_cost = json.load(f) + + # --- bare model names --- + for key, expected_input, expected_output, expected_cache in [ + ("deepseek-v4-flash", 1.4e-07, 2.8e-07, 1.4e-08), + ("deepseek-v4-pro", 1.74e-06, 3.48e-06, 1.74e-07), + ]: + info = model_cost.get(key) + assert info is not None, f"{key} missing from model_prices_and_context_window.json" + assert info["litellm_provider"] == "deepseek" + assert info["mode"] == "chat" + assert info["input_cost_per_token"] == expected_input + assert info["output_cost_per_token"] == expected_output + assert info["cache_read_input_token_cost"] == expected_cache + assert info["max_input_tokens"] == 1_000_000 + assert info["supports_function_calling"] is True + assert info["supports_tool_choice"] is True + + # --- provider-prefixed names --- + for key, expected_input, expected_output, expected_cache in [ + ("deepseek/deepseek-v4-flash", 1.4e-07, 2.8e-07, 1.4e-08), + ("deepseek/deepseek-v4-pro", 1.74e-06, 3.48e-06, 1.74e-07), + ]: + info = model_cost.get(key) + assert info is not None, f"{key} missing from model_prices_and_context_window.json" + assert info["litellm_provider"] == "deepseek" + assert info["mode"] == "chat" + assert info["input_cost_per_token"] == expected_input + assert info["output_cost_per_token"] == expected_output + assert info["cache_read_input_token_cost"] == expected_cache + assert info["supports_function_calling"] is True + assert info["supports_tool_choice"] is True + + print("✅ deepseek-v4-flash and deepseek-v4-pro cost map entries verified")