diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 7ed816f466a..d90d3cd146f 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -69829,6 +69829,18 @@ "supports_tool_choice": true, "supports_vision": true }, + "azure_ai/deepseek-v4.1-flash-1017": { + "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, + "cache_read_input_token_cost": 6e-09, + "litellm_provider": "azure_ai", + "mode": "chat", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "supports_prompt_caching": true, + "supports_vision": false, + "source": "https://ai.azure.com/catalog/models/DeepSeek-V4.1-Flash-1017" + }, "azure_ai/deepseek-v4.1-flash": { "cache_read_input_token_cost": 6e-09, "input_cost_per_token": 3e-07, @@ -71842,6 +71854,14 @@ "cache_read_input_token_cost": 1e-07, "source": "https://docs.perplexity.ai/docs/agent-api/models" }, + "perplexity/google/gemini-4-carbon": { + "litellm_provider": "perplexity", + "mode": "responses", + "input_cost_per_token": 2e-06, + "output_cost_per_token": 1e-05, + "cache_read_input_token_cost": 1e-07, + "source": "https://docs.perplexity.ai/docs/agent-api/models" + }, "perplexity/google/gemini-3.6-flash": { "litellm_provider": "perplexity", "mode": "responses", @@ -77127,6 +77147,14 @@ "cache_read_input_token_cost": 1e-07, "source": "https://docs.perplexity.ai/docs/agent-api/models" }, + "perplexity/anthropic/claude-fable-5-2": { + "litellm_provider": "perplexity", + "mode": "responses", + "input_cost_per_token": 8e-06, + "output_cost_per_token": 4e-05, + "cache_read_input_token_cost": 2e-07, + "source": "https://docs.perplexity.ai/docs/agent-api/models" + }, "perplexity/anthropic/claude-fable-5-1": { "litellm_provider": "perplexity", "mode": "responses", diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 7ed816f466a..d90d3cd146f 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -69829,6 +69829,18 @@ "supports_tool_choice": true, "supports_vision": true }, + "azure_ai/deepseek-v4.1-flash-1017": { + "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, + "cache_read_input_token_cost": 6e-09, + "litellm_provider": "azure_ai", + "mode": "chat", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "supports_prompt_caching": true, + "supports_vision": false, + "source": "https://ai.azure.com/catalog/models/DeepSeek-V4.1-Flash-1017" + }, "azure_ai/deepseek-v4.1-flash": { "cache_read_input_token_cost": 6e-09, "input_cost_per_token": 3e-07, @@ -71842,6 +71854,14 @@ "cache_read_input_token_cost": 1e-07, "source": "https://docs.perplexity.ai/docs/agent-api/models" }, + "perplexity/google/gemini-4-carbon": { + "litellm_provider": "perplexity", + "mode": "responses", + "input_cost_per_token": 2e-06, + "output_cost_per_token": 1e-05, + "cache_read_input_token_cost": 1e-07, + "source": "https://docs.perplexity.ai/docs/agent-api/models" + }, "perplexity/google/gemini-3.6-flash": { "litellm_provider": "perplexity", "mode": "responses", @@ -77127,6 +77147,14 @@ "cache_read_input_token_cost": 1e-07, "source": "https://docs.perplexity.ai/docs/agent-api/models" }, + "perplexity/anthropic/claude-fable-5-2": { + "litellm_provider": "perplexity", + "mode": "responses", + "input_cost_per_token": 8e-06, + "output_cost_per_token": 4e-05, + "cache_read_input_token_cost": 2e-07, + "source": "https://docs.perplexity.ai/docs/agent-api/models" + }, "perplexity/anthropic/claude-fable-5-1": { "litellm_provider": "perplexity", "mode": "responses", diff --git a/tests/unit/llms/azure_ai/chat/test_azure_ai_transformation.py b/tests/unit/llms/azure_ai/chat/test_azure_ai_transformation.py index 6b34589d1ee..4d437f0f994 100644 --- a/tests/unit/llms/azure_ai/chat/test_azure_ai_transformation.py +++ b/tests/unit/llms/azure_ai/chat/test_azure_ai_transformation.py @@ -231,14 +231,15 @@ def test_azure_model_router_stream_chunks_report_selected_model(respx_mock: resp assert [chunk.model for chunk in chunks] == ["gpt-4.1-nano-2025-04-14", "gpt-4.1-nano-2025-04-14"] +@pytest.mark.parametrize("model", ["gpt-4.1-mini", "DeepSeek-V4.1-Flash-1017"]) @pytest.mark.respx(assert_all_called=True) -def test_azure_ai_completion_cost_uses_response_usage(respx_mock: respx.MockRouter) -> None: +def test_azure_ai_completion_cost_uses_response_usage(respx_mock: respx.MockRouter, model: str) -> None: api_url: Final = "https://example-resource.services.ai.azure.com/models/chat/completions" response_body: Final = { "id": "chatcmpl-azure-ai", "object": "chat.completion", "created": 1700000000, - "model": "gpt-4.1-mini", + "model": model, "choices": [ { "index": 0, @@ -251,18 +252,18 @@ def test_azure_ai_completion_cost_uses_response_usage(respx_mock: respx.MockRout route: Final = respx_mock.post(url__startswith=api_url).mock(return_value=Response(200, json=response_body)) messages: Final = [{"role": "user", "content": "hello"}] response: Final = litellm.completion( - model="azure_ai/gpt-4.1-mini", + model=f"azure_ai/{model}", messages=messages, api_base="https://example-resource.services.ai.azure.com/models", api_key="azure-ai-test-key", api_version="2024-05-01-preview", ) request_body: Final = json.loads(route.calls[0].request.content) - model_info: Final = litellm.get_model_info(model="gpt-4.1-mini", custom_llm_provider="azure_ai") + model_info: Final = litellm.get_model_info(model=model, custom_llm_provider="azure_ai") expected_cost: Final = 11 * model_info["input_cost_per_token"] + 3 * model_info["output_cost_per_token"] assert route.call_count == 1 - assert request_body == {"model": "gpt-4.1-mini", "messages": messages} + assert request_body == {"model": model, "messages": messages} assert response.choices[0].message.content == "hello" assert response._hidden_params["response_cost"] == pytest.approx(expected_cost, rel=1e-9) assert litellm.completion_cost(completion_response=response) == pytest.approx(expected_cost, rel=1e-9)