From 94a29e07085dd9d8f2269ee93e899ef0e374cdc7 Mon Sep 17 00:00:00 2001 From: mateo Date: Mon, 17 Aug 2026 18:42:57 +0000 Subject: [PATCH] fix(gemini): price gemini 3.6 flash at Google's introductory rates on every service tier Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- ...odel_prices_and_context_window_backup.json | 72 +++++++++---------- model_prices_and_context_window.json | 72 +++++++++---------- .../llm_cost_calc/test_llm_cost_calc_utils.py | 55 ++++++++++++-- 3 files changed, 122 insertions(+), 77 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index e6c6cab0631..78b53cefc53 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -19424,20 +19424,20 @@ "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-3.6-flash": { - "cache_read_input_token_cost": 1.5e-07, - "cache_read_input_token_cost_flex": 7.5e-08, - "input_cost_per_token": 1.5e-06, - "input_cost_per_token_batches": 7.5e-07, - "input_cost_per_token_flex": 7.5e-07, + "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_flex": 3.75e-08, + "input_cost_per_token": 7.5e-07, + "input_cost_per_token_batches": 3.75e-07, + "input_cost_per_token_flex": 3.75e-07, "litellm_provider": "vertex_ai", "max_input_tokens": 1048576, "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 7.5e-06, - "output_cost_per_token": 7.5e-06, - "output_cost_per_token_batches": 3.75e-06, - "output_cost_per_token_flex": 3.75e-06, + "output_cost_per_reasoning_token": 3.75e-06, + "output_cost_per_token": 3.75e-06, + "output_cost_per_token_batches": 1.875e-06, + "output_cost_per_token_flex": 1.875e-06, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -19467,9 +19467,9 @@ "supports_vision": true, "supports_web_search": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 2.7e-06, - "output_cost_per_token_priority": 1.35e-05, - "cache_read_input_token_cost_priority": 2.7e-07, + "input_cost_per_token_priority": 1.35e-06, + "output_cost_per_token_priority": 6.75e-06, + "cache_read_input_token_cost_priority": 1.35e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -21150,20 +21150,20 @@ "web_search_billing_unit": "per_query" }, "gemini/gemini-3.6-flash": { - "cache_read_input_token_cost": 1.5e-07, - "cache_read_input_token_cost_flex": 7.5e-08, - "input_cost_per_token": 1.5e-06, - "input_cost_per_token_batches": 7.5e-07, - "input_cost_per_token_flex": 7.5e-07, + "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_flex": 3.75e-08, + "input_cost_per_token": 7.5e-07, + "input_cost_per_token_batches": 3.75e-07, + "input_cost_per_token_flex": 3.75e-07, "litellm_provider": "gemini", "max_input_tokens": 1048576, "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 7.5e-06, - "output_cost_per_token": 7.5e-06, - "output_cost_per_token_batches": 3.75e-06, - "output_cost_per_token_flex": 3.75e-06, + "output_cost_per_reasoning_token": 3.75e-06, + "output_cost_per_token": 3.75e-06, + "output_cost_per_token_batches": 1.875e-06, + "output_cost_per_token_flex": 1.875e-06, "rpm": 2000, "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ @@ -21196,9 +21196,9 @@ "supports_web_search": true, "supports_native_streaming": true, "tpm": 800000, - "input_cost_per_token_priority": 2.7e-06, - "output_cost_per_token_priority": 1.35e-05, - "cache_read_input_token_cost_priority": 2.7e-07, + "input_cost_per_token_priority": 1.35e-06, + "output_cost_per_token_priority": 6.75e-06, + "cache_read_input_token_cost_priority": 1.35e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -21544,20 +21544,20 @@ "web_search_billing_unit": "per_query" }, "gemini-3.6-flash": { - "cache_read_input_token_cost": 1.5e-07, - "cache_read_input_token_cost_flex": 7.5e-08, - "input_cost_per_token": 1.5e-06, - "input_cost_per_token_batches": 7.5e-07, - "input_cost_per_token_flex": 7.5e-07, + "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_flex": 3.75e-08, + "input_cost_per_token": 7.5e-07, + "input_cost_per_token_batches": 3.75e-07, + "input_cost_per_token_flex": 3.75e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 7.5e-06, - "output_cost_per_token": 7.5e-06, - "output_cost_per_token_batches": 3.75e-06, - "output_cost_per_token_flex": 3.75e-06, + "output_cost_per_reasoning_token": 3.75e-06, + "output_cost_per_token": 3.75e-06, + "output_cost_per_token_batches": 1.875e-06, + "output_cost_per_token_flex": 1.875e-06, "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ "/v1/chat/completions", @@ -21588,9 +21588,9 @@ "supports_vision": true, "supports_web_search": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 2.7e-06, - "output_cost_per_token_priority": 1.35e-05, - "cache_read_input_token_cost_priority": 2.7e-07, + "input_cost_per_token_priority": 1.35e-06, + "output_cost_per_token_priority": 6.75e-06, + "cache_read_input_token_cost_priority": 1.35e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index e6c6cab0631..78b53cefc53 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -19424,20 +19424,20 @@ "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-3.6-flash": { - "cache_read_input_token_cost": 1.5e-07, - "cache_read_input_token_cost_flex": 7.5e-08, - "input_cost_per_token": 1.5e-06, - "input_cost_per_token_batches": 7.5e-07, - "input_cost_per_token_flex": 7.5e-07, + "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_flex": 3.75e-08, + "input_cost_per_token": 7.5e-07, + "input_cost_per_token_batches": 3.75e-07, + "input_cost_per_token_flex": 3.75e-07, "litellm_provider": "vertex_ai", "max_input_tokens": 1048576, "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 7.5e-06, - "output_cost_per_token": 7.5e-06, - "output_cost_per_token_batches": 3.75e-06, - "output_cost_per_token_flex": 3.75e-06, + "output_cost_per_reasoning_token": 3.75e-06, + "output_cost_per_token": 3.75e-06, + "output_cost_per_token_batches": 1.875e-06, + "output_cost_per_token_flex": 1.875e-06, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -19467,9 +19467,9 @@ "supports_vision": true, "supports_web_search": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 2.7e-06, - "output_cost_per_token_priority": 1.35e-05, - "cache_read_input_token_cost_priority": 2.7e-07, + "input_cost_per_token_priority": 1.35e-06, + "output_cost_per_token_priority": 6.75e-06, + "cache_read_input_token_cost_priority": 1.35e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -21150,20 +21150,20 @@ "web_search_billing_unit": "per_query" }, "gemini/gemini-3.6-flash": { - "cache_read_input_token_cost": 1.5e-07, - "cache_read_input_token_cost_flex": 7.5e-08, - "input_cost_per_token": 1.5e-06, - "input_cost_per_token_batches": 7.5e-07, - "input_cost_per_token_flex": 7.5e-07, + "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_flex": 3.75e-08, + "input_cost_per_token": 7.5e-07, + "input_cost_per_token_batches": 3.75e-07, + "input_cost_per_token_flex": 3.75e-07, "litellm_provider": "gemini", "max_input_tokens": 1048576, "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 7.5e-06, - "output_cost_per_token": 7.5e-06, - "output_cost_per_token_batches": 3.75e-06, - "output_cost_per_token_flex": 3.75e-06, + "output_cost_per_reasoning_token": 3.75e-06, + "output_cost_per_token": 3.75e-06, + "output_cost_per_token_batches": 1.875e-06, + "output_cost_per_token_flex": 1.875e-06, "rpm": 2000, "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ @@ -21196,9 +21196,9 @@ "supports_web_search": true, "supports_native_streaming": true, "tpm": 800000, - "input_cost_per_token_priority": 2.7e-06, - "output_cost_per_token_priority": 1.35e-05, - "cache_read_input_token_cost_priority": 2.7e-07, + "input_cost_per_token_priority": 1.35e-06, + "output_cost_per_token_priority": 6.75e-06, + "cache_read_input_token_cost_priority": 1.35e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -21544,20 +21544,20 @@ "web_search_billing_unit": "per_query" }, "gemini-3.6-flash": { - "cache_read_input_token_cost": 1.5e-07, - "cache_read_input_token_cost_flex": 7.5e-08, - "input_cost_per_token": 1.5e-06, - "input_cost_per_token_batches": 7.5e-07, - "input_cost_per_token_flex": 7.5e-07, + "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_flex": 3.75e-08, + "input_cost_per_token": 7.5e-07, + "input_cost_per_token_batches": 3.75e-07, + "input_cost_per_token_flex": 3.75e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 7.5e-06, - "output_cost_per_token": 7.5e-06, - "output_cost_per_token_batches": 3.75e-06, - "output_cost_per_token_flex": 3.75e-06, + "output_cost_per_reasoning_token": 3.75e-06, + "output_cost_per_token": 3.75e-06, + "output_cost_per_token_batches": 1.875e-06, + "output_cost_per_token_flex": 1.875e-06, "source": "https://ai.google.dev/pricing/gemini-3", "supported_endpoints": [ "/v1/chat/completions", @@ -21588,9 +21588,9 @@ "supports_vision": true, "supports_web_search": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 2.7e-06, - "output_cost_per_token_priority": 1.35e-05, - "cache_read_input_token_cost_priority": 2.7e-07, + "input_cost_per_token_priority": 1.35e-06, + "output_cost_per_token_priority": 6.75e-06, + "cache_read_input_token_cost_priority": 1.35e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, 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 4d157e74482..1402e056b72 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 @@ -2922,9 +2922,9 @@ def test_image_response_input_image_tokens_priced_at_image_rate(details_as_dict) assert cost is not None assert round(cost, 12) == round(expected, 12) GEMINI_DAY0_LAUNCH_PRICING = [ - ("gemini-3.6-flash", 1.5e-06, 7.5e-06, 1.5e-07), - ("gemini/gemini-3.6-flash", 1.5e-06, 7.5e-06, 1.5e-07), - ("vertex_ai/gemini-3.6-flash", 1.5e-06, 7.5e-06, 1.5e-07), + ("gemini-3.6-flash", 7.5e-07, 3.75e-06, 7.5e-08), + ("gemini/gemini-3.6-flash", 7.5e-07, 3.75e-06, 7.5e-08), + ("vertex_ai/gemini-3.6-flash", 7.5e-07, 3.75e-06, 7.5e-08), ("gemini-3.5-flash-lite", 3e-07, 2.5e-06, 3e-08), ("gemini/gemini-3.5-flash-lite", 3e-07, 2.5e-06, 3e-08), ("vertex_ai/gemini-3.5-flash-lite", 3e-07, 2.5e-06, 3e-08), @@ -2966,8 +2966,53 @@ def test_generic_cost_per_token_gemini_36_flash(): usage=usage, custom_llm_provider="gemini", ) - assert prompt_cost == pytest.approx(0.0015) - assert completion_cost == pytest.approx(0.00375) + assert prompt_cost == pytest.approx(0.00075) + assert completion_cost == pytest.approx(0.001875) + + +GEMINI_36_FLASH_SERVICE_TIER_PRICING = [ + (None, 7.5e-07, 3.75e-06, 7.5e-08), + ("flex", 3.75e-07, 1.875e-06, 3.75e-08), + ("priority", 1.35e-06, 6.75e-06, 1.35e-07), +] + + +@pytest.mark.parametrize( + "service_tier,input_rate,output_rate,cache_read_rate", GEMINI_36_FLASH_SERVICE_TIER_PRICING +) +@pytest.mark.parametrize( + "model", ["gemini-3.6-flash", "gemini/gemini-3.6-flash", "vertex_ai/gemini-3.6-flash"] +) +def test_gemini_36_flash_service_tier_introductory_pricing( + model, service_tier, input_rate, output_rate, cache_read_rate, _local_model_cost_map +): + """Regression: every 3.6 Flash tier is on Google's introductory rates through 2026-12-31, + so flex and priority requests must not be billed at the post-introductory rates.""" + usage = Usage( + prompt_tokens=1_000, + completion_tokens=500, + total_tokens=1_500, + prompt_tokens_details=PromptTokensDetailsWrapper(cached_tokens=200, text_tokens=800), + ) + + prompt_cost, completion_cost = generic_cost_per_token( + model=model.split("/")[-1], + usage=usage, + custom_llm_provider=model.split("/")[0] if "/" in model else "gemini", + service_tier=service_tier, + ) + + assert prompt_cost == pytest.approx(800 * input_rate + 200 * cache_read_rate, rel=1e-9) + assert completion_cost == pytest.approx(500 * output_rate, rel=1e-9) + + +@pytest.mark.parametrize( + "model", ["gemini-3.6-flash", "gemini/gemini-3.6-flash", "vertex_ai/gemini-3.6-flash"] +) +def test_gemini_36_flash_batch_introductory_pricing(model, _local_model_cost_map): + model_cost_map = litellm.model_cost[model] + assert model_cost_map["input_cost_per_token_batches"] == 3.75e-07 + assert model_cost_map["output_cost_per_token_batches"] == 1.875e-06 def test_generic_cost_per_token_gemini_35_flash_lite():