diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index d0eca17272d6..ea195e1bd064 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -4867,6 +4867,38 @@ "supports_tool_choice": true, "supports_vision": false }, + "azure/gpt-audio-mini": { + "deprecation_date": "2027-04-06", + "input_cost_per_audio_token": 1e-05, + "input_cost_per_token": 6e-07, + "litellm_provider": "azure", + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, + "mode": "chat", + "output_cost_per_audio_token": 2e-05, + "output_cost_per_token": 2.4e-06, + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supported_modalities": [ + "text", + "audio" + ], + "supported_output_modalities": [ + "text", + "audio" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": false + }, "azure/gpt-audio-mini-2025-10-06": { "deprecation_date": "2027-04-06", "input_cost_per_audio_token": 1e-05, @@ -5080,6 +5112,38 @@ "supports_system_messages": true, "supports_tool_choice": true }, + "azure/gpt-realtime-mini": { + "cache_creation_input_audio_token_cost": 3e-07, + "cache_read_input_token_cost": 6e-08, + "input_cost_per_audio_token": 1e-05, + "input_cost_per_image": 8e-07, + "input_cost_per_token": 6e-07, + "litellm_provider": "azure", + "max_input_tokens": 32000, + "max_output_tokens": 4096, + "max_tokens": 4096, + "mode": "realtime", + "output_cost_per_audio_token": 2e-05, + "output_cost_per_token": 2.4e-06, + "supported_endpoints": [ + "/v1/realtime" + ], + "supported_modalities": [ + "text", + "image", + "audio" + ], + "supported_output_modalities": [ + "text", + "audio" + ], + "supports_audio_input": true, + "supports_audio_output": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "azure/gpt-realtime-mini-2025-10-06": { "cache_creation_input_audio_token_cost": 3e-07, "cache_read_input_token_cost": 6e-08, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index d0eca17272d6..ea195e1bd064 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -4867,6 +4867,38 @@ "supports_tool_choice": true, "supports_vision": false }, + "azure/gpt-audio-mini": { + "deprecation_date": "2027-04-06", + "input_cost_per_audio_token": 1e-05, + "input_cost_per_token": 6e-07, + "litellm_provider": "azure", + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "max_tokens": 16384, + "mode": "chat", + "output_cost_per_audio_token": 2e-05, + "output_cost_per_token": 2.4e-06, + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supported_modalities": [ + "text", + "audio" + ], + "supported_output_modalities": [ + "text", + "audio" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": false, + "supports_reasoning": false, + "supports_response_schema": false, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": false + }, "azure/gpt-audio-mini-2025-10-06": { "deprecation_date": "2027-04-06", "input_cost_per_audio_token": 1e-05, @@ -5080,6 +5112,38 @@ "supports_system_messages": true, "supports_tool_choice": true }, + "azure/gpt-realtime-mini": { + "cache_creation_input_audio_token_cost": 3e-07, + "cache_read_input_token_cost": 6e-08, + "input_cost_per_audio_token": 1e-05, + "input_cost_per_image": 8e-07, + "input_cost_per_token": 6e-07, + "litellm_provider": "azure", + "max_input_tokens": 32000, + "max_output_tokens": 4096, + "max_tokens": 4096, + "mode": "realtime", + "output_cost_per_audio_token": 2e-05, + "output_cost_per_token": 2.4e-06, + "supported_endpoints": [ + "/v1/realtime" + ], + "supported_modalities": [ + "text", + "image", + "audio" + ], + "supported_output_modalities": [ + "text", + "audio" + ], + "supports_audio_input": true, + "supports_audio_output": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "azure/gpt-realtime-mini-2025-10-06": { "cache_creation_input_audio_token_cost": 3e-07, "cache_read_input_token_cost": 6e-08, diff --git a/tests/test_litellm/test_azure_audio_price_aliases.py b/tests/test_litellm/test_azure_audio_price_aliases.py new file mode 100644 index 000000000000..24cdb47db1f3 --- /dev/null +++ b/tests/test_litellm/test_azure_audio_price_aliases.py @@ -0,0 +1,67 @@ +"""Undated azure aliases for the audio models must exist and match their dated +variants — Azure deployments are commonly created against the undated model +name, and `base_model: azure/gpt-audio-mini` previously resolved to nothing +(text tokens billed at $0). Issue #33170.""" + +import pytest + +import litellm + + +@pytest.fixture(autouse=True) +def _use_local_model_cost_map(monkeypatch): + original_model_cost = litellm.model_cost + monkeypatch.setenv("LITELLM_LOCAL_MODEL_COST_MAP", "True") + litellm.model_cost = litellm.get_model_cost_map(url="") + try: + yield + finally: + litellm.model_cost = original_model_cost + + +COST_FIELDS = ( + "input_cost_per_token", + "output_cost_per_token", + "input_cost_per_audio_token", + "output_cost_per_audio_token", +) + + +@pytest.mark.parametrize( + "undated, dated", + [ + ("azure/gpt-audio-mini", "azure/gpt-audio-mini-2025-10-06"), + ("azure/gpt-realtime-mini", "azure/gpt-realtime-mini-2025-10-06"), + ], +) +def test_undated_azure_audio_alias_matches_dated_entry(undated, dated): + undated_info = litellm.get_model_info(undated) + dated_info = litellm.get_model_info(dated) + + for field in COST_FIELDS: + assert undated_info.get(field) == dated_info.get(field), field + # the production symptom was text tokens billed at $0 — make sure the + # alias carries real, non-zero prices + assert (undated_info.get(field) or 0) > 0, f"{undated}.{field} must be non-zero" + + assert undated_info.get("litellm_provider") == "azure" + assert undated_info.get("mode") == dated_info.get("mode") + + +@pytest.mark.parametrize( + "undated, dated", + [ + ("azure/gpt-audio-mini", "azure/gpt-audio-mini-2025-10-06"), + ("azure/gpt-realtime-mini", "azure/gpt-realtime-mini-2025-10-06"), + ], +) +def test_undated_azure_audio_alias_is_exact_mirror(undated, dated): + """The undated alias must be a byte-for-byte mirror of its dated entry — + covers every field (incl. realtime-specific cache/audio cost keys) so any + future drift between the pair is caught, not just the core COST_FIELDS.""" + model_map = litellm.model_cost + assert undated in model_map, f"{undated} missing from model cost map" + assert model_map[undated] == model_map[dated], ( + f"{undated} must exactly mirror {dated}; " + f"diff keys: {[k for k in set(model_map[undated]) | set(model_map[dated]) if model_map[undated].get(k) != model_map[dated].get(k)]}" + )