diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index ee996198b28..062589f06b6 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -2973,7 +2973,7 @@ "supports_xhigh_reasoning_effort": true, "supports_minimal_reasoning_effort": false }, - "azure_ai/gpt-5.5-2026-04-23": { + "azure_ai/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5e-07, "cache_read_input_token_cost_above_272k_tokens": 1e-06, "cache_read_input_token_cost_priority": 1e-06, @@ -6752,7 +6752,7 @@ "supports_xhigh_reasoning_effort": true, "supports_minimal_reasoning_effort": false }, - "azure/gpt-5.5-2026-04-23": { + "azure/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5e-07, "cache_read_input_token_cost_above_272k_tokens": 1e-06, "cache_read_input_token_cost_priority": 1e-06, @@ -6792,9 +6792,12 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/us/gpt-5.5-2026-04-23": { + "azure/us/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5.5e-07, "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, "cache_read_input_token_cost_priority": 1.38e-06, @@ -6831,9 +6834,12 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/eu/gpt-5.5-2026-04-23": { + "azure/eu/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5.5e-07, "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, "cache_read_input_token_cost_priority": 1.38e-06, @@ -6870,7 +6876,10 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, "azure/gpt-5.5-pro": { "cache_read_input_token_cost": 3e-06, @@ -6911,7 +6920,7 @@ "supports_minimal_reasoning_effort": false, "supports_low_reasoning_effort": false }, - "azure/gpt-5.5-pro-2026-04-23": { + "azure/gpt-5.5-pro-2026-04-24": { "cache_read_input_token_cost": 3e-06, "cache_read_input_token_cost_above_272k_tokens": 6e-06, "input_cost_per_token": 3e-05, @@ -6944,7 +6953,11 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": false, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false, + "supports_low_reasoning_effort": false }, "azure/gpt-5.4-mini": { "cache_read_input_token_cost": 7.5e-08, @@ -17381,6 +17394,46 @@ "tpm": 8000000, "supports_image_size": false }, + "gemini-3-pro-image": { + "input_cost_per_image": 0.0011, + "input_cost_per_token": 2e-06, + "input_cost_per_token_batches": 1e-06, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.134, + "output_cost_per_image_token": 0.00012, + "output_cost_per_token": 1.2e-05, + "output_cost_per_token_batches": 6e-06, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, "gemini-3-pro-image-preview": { "input_cost_per_image": 0.0011, "input_cost_per_token": 2e-06, @@ -17421,6 +17474,44 @@ }, "web_search_billing_unit": "per_query" }, + "gemini-3.1-flash-image": { + "input_cost_per_image": 0.00056, + "input_cost_per_token": 5e-07, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.0672, + "output_cost_per_image_token": 6e-05, + "output_cost_per_token": 3e-06, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, "gemini-3.1-flash-image-preview": { "input_cost_per_image": 0.00056, "input_cost_per_token": 5e-07, @@ -18866,7 +18957,6 @@ ], "supports_function_calling": false, "supports_prompt_caching": true, - "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_vision": true, @@ -18876,7 +18966,8 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query" + "web_search_billing_unit": "per_query", + "supports_reasoning": false }, "gemini/gemini-3-pro-image-preview": { "input_cost_per_image": 0.0011, @@ -20312,8 +20403,7 @@ "max_tokens": 16000, "mode": "chat", "supported_endpoints": [ - "/v1/chat/completions", - "/v1/messages" + "/v1/chat/completions" ], "supports_function_calling": true, "supports_parallel_function_calling": true, @@ -20326,8 +20416,7 @@ "max_tokens": 16000, "mode": "chat", "supported_endpoints": [ - "/v1/chat/completions", - "/v1/messages" + "/v1/chat/completions" ], "supports_function_calling": true, "supports_parallel_function_calling": true, @@ -20379,8 +20468,7 @@ "max_tokens": 16000, "mode": "chat", "supported_endpoints": [ - "/v1/chat/completions", - "/v1/messages" + "/v1/chat/completions" ], "supports_function_calling": true, "supports_parallel_function_calling": true, @@ -23672,7 +23760,7 @@ "input_cost_per_token_batches": 3.75e-07, "input_cost_per_token_priority": 1.5e-06, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -23718,7 +23806,7 @@ "input_cost_per_token_batches": 3.75e-07, "input_cost_per_token_priority": 1.5e-06, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -23762,7 +23850,7 @@ "input_cost_per_token_flex": 1e-07, "input_cost_per_token_batches": 1e-07, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -23805,7 +23893,7 @@ "input_cost_per_token_flex": 1e-07, "input_cost_per_token_batches": 1e-07, "litellm_provider": "openai", - "max_input_tokens": 272000, + "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -23845,9 +23933,9 @@ "input_cost_per_token": 1.5e-05, "input_cost_per_token_batches": 7.5e-06, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 272000, - "max_tokens": 272000, + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 0.00012, "output_cost_per_token_batches": 6e-05, @@ -23881,9 +23969,9 @@ "input_cost_per_token": 1.5e-05, "input_cost_per_token_batches": 7.5e-06, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 272000, - "max_tokens": 272000, + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 0.00012, "output_cost_per_token_batches": 6e-05, @@ -31246,6 +31334,22 @@ "supports_reasoning": true, "supports_tool_choice": true }, + "openrouter/z-ai/glm-5.1": { + "input_cost_per_token": 1.05e-06, + "output_cost_per_token": 3.5e-06, + "cache_read_input_token_cost": 5.25e-07, + "cache_creation_input_token_cost": 0.0, + "litellm_provider": "openrouter", + "max_input_tokens": 202752, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "source": "https://openrouter.ai/z-ai/glm-5.1", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, "openrouter/minimax/minimax-m2.1": { "input_cost_per_token": 2.7e-07, "output_cost_per_token": 1.2e-06, @@ -39395,6 +39499,21 @@ "supports_tool_choice": true, "source": "https://docs.z.ai/guides/overview/pricing" }, + "zai/glm-5.1": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 2.6e-07, + "input_cost_per_token": 1.4e-06, + "output_cost_per_token": 4.4e-06, + "litellm_provider": "zai", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "mode": "chat", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true, + "source": "https://docs.z.ai/guides/overview/pricing" + }, "zai/glm-5-code": { "cache_creation_input_token_cost": 0, "cache_read_input_token_cost": 3e-07, @@ -39425,6 +39544,21 @@ "supports_tool_choice": true, "source": "https://docs.z.ai/guides/overview/pricing" }, + "zai/glm-4.7-flash": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 0, + "input_cost_per_token": 0, + "output_cost_per_token": 0, + "litellm_provider": "zai", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "mode": "chat", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true, + "source": "https://docs.z.ai/guides/overview/pricing" + }, "zai/glm-4.6": { "cache_creation_input_token_cost": 0, "cache_read_input_token_cost": 1.1e-07, @@ -44835,6 +44969,7 @@ "supports_response_schema": true }, "snowflake/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "max_tokens": 16384, "max_input_tokens": 200000, "max_output_tokens": 16384, @@ -45253,40 +45388,6 @@ "supports_tool_choice": true, "supports_vision": false }, - "darkbloom/gemma-4-26b": { - "input_cost_per_token": 3e-08, - "litellm_provider": "darkbloom", - "max_input_tokens": 131072, - "max_output_tokens": 32768, - "max_tokens": 32768, - "mode": "chat", - "output_cost_per_token": 1.65e-07, - "source": "https://www.darkbloom.dev/", - "supported_endpoints": [ - "/v1/chat/completions" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_system_messages": true, - "supports_tool_choice": true - }, - "darkbloom/gpt-oss-20b": { - "input_cost_per_token": 1.45e-08, - "litellm_provider": "darkbloom", - "max_input_tokens": 131072, - "max_output_tokens": 32768, - "max_tokens": 32768, - "mode": "chat", - "output_cost_per_token": 7e-08, - "source": "https://www.darkbloom.dev/", - "supported_endpoints": [ - "/v1/chat/completions" - ], - "supports_function_calling": true, - "supports_native_streaming": 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": 3.625e-09, @@ -45442,6 +45543,40 @@ "supports_reasoning": false, "source": "https://pinstripes.io/pricing" }, + "darkbloom/gemma-4-26b": { + "input_cost_per_token": 3e-08, + "litellm_provider": "darkbloom", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 1.65e-07, + "source": "https://www.darkbloom.dev/", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "darkbloom/gpt-oss-20b": { + "input_cost_per_token": 1.45e-08, + "litellm_provider": "darkbloom", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 7e-08, + "source": "https://www.darkbloom.dev/", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "fallback_generalizations": { "rules": [ { diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index b1a87c444c8..062589f06b6 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -2973,7 +2973,7 @@ "supports_xhigh_reasoning_effort": true, "supports_minimal_reasoning_effort": false }, - "azure_ai/gpt-5.5-2026-04-23": { + "azure_ai/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5e-07, "cache_read_input_token_cost_above_272k_tokens": 1e-06, "cache_read_input_token_cost_priority": 1e-06, @@ -6752,7 +6752,7 @@ "supports_xhigh_reasoning_effort": true, "supports_minimal_reasoning_effort": false }, - "azure/gpt-5.5-2026-04-23": { + "azure/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5e-07, "cache_read_input_token_cost_above_272k_tokens": 1e-06, "cache_read_input_token_cost_priority": 1e-06, @@ -6792,9 +6792,12 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/us/gpt-5.5-2026-04-23": { + "azure/us/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5.5e-07, "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, "cache_read_input_token_cost_priority": 1.38e-06, @@ -6831,9 +6834,12 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, - "azure/eu/gpt-5.5-2026-04-23": { + "azure/eu/gpt-5.5-2026-04-24": { "cache_read_input_token_cost": 5.5e-07, "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, "cache_read_input_token_cost_priority": 1.38e-06, @@ -6870,7 +6876,10 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false }, "azure/gpt-5.5-pro": { "cache_read_input_token_cost": 3e-06, @@ -6911,7 +6920,7 @@ "supports_minimal_reasoning_effort": false, "supports_low_reasoning_effort": false }, - "azure/gpt-5.5-pro-2026-04-23": { + "azure/gpt-5.5-pro-2026-04-24": { "cache_read_input_token_cost": 3e-06, "cache_read_input_token_cost_above_272k_tokens": 6e-06, "input_cost_per_token": 3e-05, @@ -6944,7 +6953,11 @@ "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "supports_none_reasoning_effort": false, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false, + "supports_low_reasoning_effort": false }, "azure/gpt-5.4-mini": { "cache_read_input_token_cost": 7.5e-08, diff --git a/tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py b/tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py index b156faf3ea6..5eb8e37159d 100644 --- a/tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py +++ b/tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py @@ -786,9 +786,11 @@ def test_gpt55_dated_variants_match_base_reasoning_effort_capabilities( "model,expected_mode,expected_input,expected_output,expected_cache_read", [ ("azure/gpt-5.5", "chat", 5e-6, 3e-5, 5e-7), - ("azure/gpt-5.5-2026-04-23", "chat", 5e-6, 3e-5, 5e-7), + # Azure's GPT-5.5 snapshot is 2026-04-24 (OpenAI's is 2026-04-23); the + # Azure dated deployment string must use Azure's version, not OpenAI's. + ("azure/gpt-5.5-2026-04-24", "chat", 5e-6, 3e-5, 5e-7), ("azure/gpt-5.5-pro", "responses", 3e-5, 1.8e-4, 3e-6), - ("azure/gpt-5.5-pro-2026-04-23", "responses", 3e-5, 1.8e-4, 3e-6), + ("azure/gpt-5.5-pro-2026-04-24", "responses", 3e-5, 1.8e-4, 3e-6), ], ) def test_azure_gpt55_entries_present_with_correct_pricing( @@ -839,6 +841,51 @@ def test_azure_gpt55_reasoning_effort_flags_match_live_openai_api( assert m.get("supports_xhigh_reasoning_effort") is expected_xhigh +@pytest.mark.parametrize( + "base_model,dated_model", + [ + ("azure/gpt-5.5", "azure/gpt-5.5-2026-04-24"), + ("azure/us/gpt-5.5", "azure/us/gpt-5.5-2026-04-24"), + ("azure/eu/gpt-5.5", "azure/eu/gpt-5.5-2026-04-24"), + ("azure_ai/gpt-5.5", "azure_ai/gpt-5.5-2026-04-24"), + ("azure/gpt-5.5-pro", "azure/gpt-5.5-pro-2026-04-24"), + ], +) +def test_azure_gpt55_dated_variant_uses_azure_snapshot_and_matches_base( + base_model, dated_model +): + """Azure GPT-5.5 dated deployments use Azure's 2026-04-24 snapshot. + + The Azure GPT-5.5 family ships as version 2026-04-24 (OpenAI's snapshot is + 2026-04-23); the day-0 entries wrongly copied OpenAI's date. Guard that the + OpenAI-dated Azure keys never come back, that the Azure-dated keys exist, + and that pinning a dated Azure variant keeps the exact reasoning_effort + capability profile of its floating alias. + """ + os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" + litellm.model_cost = litellm.get_model_cost_map(url="") + + wrong_dated = dated_model.replace("2026-04-24", "2026-04-23") + assert ( + wrong_dated not in litellm.model_cost + ), f"{wrong_dated} uses OpenAI's snapshot date; Azure ships 2026-04-24" + assert dated_model in litellm.model_cost, f"{dated_model} missing from cost map" + + base = litellm.model_cost[base_model] + dated = litellm.model_cost[dated_model] + for flag in ( + "supports_none_reasoning_effort", + "supports_minimal_reasoning_effort", + "supports_xhigh_reasoning_effort", + "supports_low_reasoning_effort", + ): + assert dated.get(flag) == base.get(flag), ( + f"{dated_model} has {flag}={dated.get(flag)!r}, but {base_model} " + f"has {flag}={base.get(flag)!r}. Dated Azure snapshots must inherit " + f"the base model's reasoning_effort capability profile." + ) + + def test_generic_cost_per_token_anthropic_prompt_caching(): model = "claude-sonnet-4@20250514" usage = Usage( diff --git a/tests/test_litellm/test_gpt_5_5_model_metadata.py b/tests/test_litellm/test_gpt_5_5_model_metadata.py index 1c12a48ed9d..e3af2faba5a 100644 --- a/tests/test_litellm/test_gpt_5_5_model_metadata.py +++ b/tests/test_litellm/test_gpt_5_5_model_metadata.py @@ -6,8 +6,18 @@ import pytest from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider -@pytest.mark.parametrize("model", ["azure_ai/gpt-5.5", "azure_ai/gpt-5.5-2026-04-23"]) -def test_azure_ai_gpt_5_5_model_info(model): +@pytest.mark.parametrize( + "model,expected_provider", + [ + # gpt-5.5 is a known OpenAI model name, so azure_ai/gpt-5.5 is routed + # through the Azure OpenAI path (custom_llm_provider="azure"). + ("azure_ai/gpt-5.5", "azure"), + # 2026-04-24 is Azure's own GPT-5.5 snapshot (OpenAI's is 2026-04-23), + # so it is not an OpenAI model name and stays on the azure_ai path. + ("azure_ai/gpt-5.5-2026-04-24", "azure_ai"), + ], +) +def test_azure_ai_gpt_5_5_model_info(model, expected_provider): json_path = Path(__file__).parents[2] / "model_prices_and_context_window.json" with open(json_path) as f: model_cost = json.load(f) @@ -47,8 +57,7 @@ def test_azure_ai_gpt_5_5_model_info(model): routed_model, provider, _, _ = get_llm_provider(model=model) assert routed_model == model.split("/", 1)[1] - # azure_ai/* models resolve under the azure provider in get_llm_provider - assert provider == "azure" + assert provider == expected_provider def test_azure_ai_gpt_5_5_backup_matches_main(): @@ -62,7 +71,7 @@ def test_azure_ai_gpt_5_5_backup_matches_main(): with open(backup_path) as f: backup_cost = json.load(f) - for model in ("azure_ai/gpt-5.5", "azure_ai/gpt-5.5-2026-04-23"): + for model in ("azure_ai/gpt-5.5", "azure_ai/gpt-5.5-2026-04-24"): assert backup_cost.get(model) == main_cost.get( model ), f"{model} differs between main and backup model cost maps"