fix(pricing): update Gemini aliases and Nova cache tests

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
kerry 2026-09-15 00:05:42 +00:00
parent 344a4c6fb3
commit 9a9a032d9b
4 changed files with 180 additions and 74 deletions

View file

@ -55751,22 +55751,26 @@
"google_maps_grounding_cost_per_query": 0.014
},
"gemini-pro-latest": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_above_200k_tokens": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_above_200k_tokens": 2.5e-06,
"prompt_cache_min_tokens": 4096,
"cache_read_input_token_cost": 2e-07,
"cache_read_input_token_cost_above_200k_tokens": 4e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_above_200k_tokens": 4e-06,
"input_cost_per_token_batches": 1e-06,
"litellm_provider": "gemini",
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_tokens": 65535,
"max_output_tokens": 65536,
"max_tokens": 65536,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_above_200k_tokens": 1.5e-05,
"output_cost_per_token": 1.2e-05,
"output_cost_per_token_above_200k_tokens": 1.8e-05,
"output_cost_per_token_batches": 6e-06,
"rpm": 2000,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing",
"source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview",
"supported_endpoints": [
"/v1/chat/completions",
"/v1/completions"
"/v1/completions",
"/v1/batch"
],
"supported_modalities": [
"text",
@ -55788,31 +55792,44 @@
"supports_video_input": true,
"supports_vision": true,
"supports_web_search": true,
"supports_url_context": true,
"supports_native_streaming": true,
"tpm": 800000,
"input_cost_per_token_priority": 3.6e-06,
"input_cost_per_token_above_200k_tokens_priority": 7.2e-06,
"output_cost_per_token_priority": 2.16e-05,
"output_cost_per_token_above_200k_tokens_priority": 3.24e-05,
"cache_read_input_token_cost_priority": 3.6e-07,
"cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07,
"search_context_cost_per_query": {
"search_context_size_low": 0.035,
"search_context_size_medium": 0.035,
"search_context_size_high": 0.035
"search_context_size_low": 0.014,
"search_context_size_medium": 0.014,
"search_context_size_high": 0.014
},
"google_maps_grounding_cost_per_query": 0.025
"web_search_billing_unit": "per_query",
"google_maps_grounding_cost_per_query": 0.014
},
"gemini/gemini-pro-latest": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_above_200k_tokens": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_above_200k_tokens": 2.5e-06,
"prompt_cache_min_tokens": 4096,
"cache_read_input_token_cost": 2e-07,
"cache_read_input_token_cost_above_200k_tokens": 4e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_above_200k_tokens": 4e-06,
"input_cost_per_token_batches": 1e-06,
"litellm_provider": "gemini",
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_tokens": 65535,
"max_output_tokens": 65536,
"max_tokens": 65536,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_above_200k_tokens": 1.5e-05,
"output_cost_per_token": 1.2e-05,
"output_cost_per_token_above_200k_tokens": 1.8e-05,
"output_cost_per_token_batches": 6e-06,
"rpm": 2000,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing",
"source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview",
"supported_endpoints": [
"/v1/chat/completions",
"/v1/completions"
"/v1/completions",
"/v1/batch"
],
"supported_modalities": [
"text",
@ -55834,13 +55851,22 @@
"supports_video_input": true,
"supports_vision": true,
"supports_web_search": true,
"supports_url_context": true,
"supports_native_streaming": true,
"tpm": 800000,
"input_cost_per_token_priority": 3.6e-06,
"input_cost_per_token_above_200k_tokens_priority": 7.2e-06,
"output_cost_per_token_priority": 2.16e-05,
"output_cost_per_token_above_200k_tokens_priority": 3.24e-05,
"cache_read_input_token_cost_priority": 3.6e-07,
"cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07,
"search_context_cost_per_query": {
"search_context_size_low": 0.035,
"search_context_size_medium": 0.035,
"search_context_size_high": 0.035
"search_context_size_low": 0.014,
"search_context_size_medium": 0.014,
"search_context_size_high": 0.014
},
"google_maps_grounding_cost_per_query": 0.025
"web_search_billing_unit": "per_query",
"google_maps_grounding_cost_per_query": 0.014
},
"gemini-exp-1206": {
"cache_read_input_token_cost": 3e-08,

View file

@ -55751,22 +55751,26 @@
"google_maps_grounding_cost_per_query": 0.014
},
"gemini-pro-latest": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_above_200k_tokens": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_above_200k_tokens": 2.5e-06,
"prompt_cache_min_tokens": 4096,
"cache_read_input_token_cost": 2e-07,
"cache_read_input_token_cost_above_200k_tokens": 4e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_above_200k_tokens": 4e-06,
"input_cost_per_token_batches": 1e-06,
"litellm_provider": "gemini",
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_tokens": 65535,
"max_output_tokens": 65536,
"max_tokens": 65536,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_above_200k_tokens": 1.5e-05,
"output_cost_per_token": 1.2e-05,
"output_cost_per_token_above_200k_tokens": 1.8e-05,
"output_cost_per_token_batches": 6e-06,
"rpm": 2000,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing",
"source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview",
"supported_endpoints": [
"/v1/chat/completions",
"/v1/completions"
"/v1/completions",
"/v1/batch"
],
"supported_modalities": [
"text",
@ -55788,31 +55792,44 @@
"supports_video_input": true,
"supports_vision": true,
"supports_web_search": true,
"supports_url_context": true,
"supports_native_streaming": true,
"tpm": 800000,
"input_cost_per_token_priority": 3.6e-06,
"input_cost_per_token_above_200k_tokens_priority": 7.2e-06,
"output_cost_per_token_priority": 2.16e-05,
"output_cost_per_token_above_200k_tokens_priority": 3.24e-05,
"cache_read_input_token_cost_priority": 3.6e-07,
"cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07,
"search_context_cost_per_query": {
"search_context_size_low": 0.035,
"search_context_size_medium": 0.035,
"search_context_size_high": 0.035
"search_context_size_low": 0.014,
"search_context_size_medium": 0.014,
"search_context_size_high": 0.014
},
"google_maps_grounding_cost_per_query": 0.025
"web_search_billing_unit": "per_query",
"google_maps_grounding_cost_per_query": 0.014
},
"gemini/gemini-pro-latest": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_above_200k_tokens": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_above_200k_tokens": 2.5e-06,
"prompt_cache_min_tokens": 4096,
"cache_read_input_token_cost": 2e-07,
"cache_read_input_token_cost_above_200k_tokens": 4e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_above_200k_tokens": 4e-06,
"input_cost_per_token_batches": 1e-06,
"litellm_provider": "gemini",
"max_input_tokens": 1048576,
"max_output_tokens": 65535,
"max_tokens": 65535,
"max_output_tokens": 65536,
"max_tokens": 65536,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_above_200k_tokens": 1.5e-05,
"output_cost_per_token": 1.2e-05,
"output_cost_per_token_above_200k_tokens": 1.8e-05,
"output_cost_per_token_batches": 6e-06,
"rpm": 2000,
"source": "https://cloud.google.com/vertex-ai/generative-ai/pricing",
"source": "https://ai.google.dev/gemini-api/docs/models#gemini-3.1-pro-preview",
"supported_endpoints": [
"/v1/chat/completions",
"/v1/completions"
"/v1/completions",
"/v1/batch"
],
"supported_modalities": [
"text",
@ -55834,13 +55851,22 @@
"supports_video_input": true,
"supports_vision": true,
"supports_web_search": true,
"supports_url_context": true,
"supports_native_streaming": true,
"tpm": 800000,
"input_cost_per_token_priority": 3.6e-06,
"input_cost_per_token_above_200k_tokens_priority": 7.2e-06,
"output_cost_per_token_priority": 2.16e-05,
"output_cost_per_token_above_200k_tokens_priority": 3.24e-05,
"cache_read_input_token_cost_priority": 3.6e-07,
"cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07,
"search_context_cost_per_query": {
"search_context_size_low": 0.035,
"search_context_size_medium": 0.035,
"search_context_size_high": 0.035
"search_context_size_low": 0.014,
"search_context_size_medium": 0.014,
"search_context_size_high": 0.014
},
"google_maps_grounding_cost_per_query": 0.025
"web_search_billing_unit": "per_query",
"google_maps_grounding_cost_per_query": 0.014
},
"gemini-exp-1206": {
"cache_read_input_token_cost": 3e-08,

View file

@ -241,10 +241,38 @@ def test_bedrock_gpt_5_6_offers_tools_and_reasoning_effort_but_not_thinking(prof
("us.amazon.nova-premier-v1:0", 6.25e-7),
],
)
def test_bedrock_nova_cache_read_prices(model, expected_cache_read, local_model_cost_map):
def test_bedrock_nova_cache_read_prices(
model, expected_cache_read, local_model_cost_map
):
model_info = litellm.model_cost[model]
assert model_info["cache_read_input_token_cost"] == expected_cache_read
assert model_info["cache_read_input_token_cost"] == pytest.approx(
0.25 * model_info["input_cost_per_token"]
usage = Usage(
prompt_tokens=1_000,
completion_tokens=100,
total_tokens=1_100,
prompt_tokens_details=PromptTokensDetailsWrapper(cached_tokens=400),
)
response = _bedrock_response(model, usage)
cost = completion_cost(
completion_response=response,
model=model,
custom_llm_provider="bedrock",
)
expected_cost = (
600 * model_info["input_cost_per_token"]
+ 400 * expected_cache_read
+ 100 * model_info["output_cost_per_token"]
)
assert cost == pytest.approx(expected_cost)
uncached_usage = Usage(
prompt_tokens=1_000,
completion_tokens=100,
total_tokens=1_100,
)
uncached_cost = completion_cost(
completion_response=_bedrock_response(model, uncached_usage),
model=model,
custom_llm_provider="bedrock",
)
assert cost < uncached_cost

View file

@ -1,6 +1,7 @@
import pytest
import litellm
from litellm.cost_calculator import completion_cost
from litellm.llms.gemini.cost_calculator import (
cost_per_google_maps_grounding_request,
cost_per_web_search_request,
@ -16,6 +17,7 @@ from litellm.types.utils import (
ImageResponse,
ImageUsage,
ImageUsageInputTokensDetails,
ModelResponse,
PromptTokensDetailsWrapper,
Usage,
)
@ -478,26 +480,50 @@ def test_flash_alias_cache_read_is_ten_percent_of_input(
@pytest.mark.parametrize(
"alias,target",
"alias,target,expected_cost",
[
("gemini/gemini-flash-latest", "gemini/gemini-3.8-flash"),
("gemini/gemini-flash-lite-latest", "gemini/gemini-3.5-flash-lite"),
(
"gemini/gemini-flash-latest",
"gemini/gemini-3.8-flash",
600 * 7.5e-7 + 400 * 7.5e-8 + 500 * 3.75e-6,
),
(
"gemini/gemini-flash-lite-latest",
"gemini/gemini-3.5-flash-lite",
600 * 3e-7 + 400 * 3e-8 + 500 * 2.5e-6,
),
(
"gemini/gemini-pro-latest",
"gemini/gemini-3.1-pro-preview",
600 * 2e-6 + 400 * 2e-7 + 500 * 1.2e-5,
),
],
)
def test_flash_latest_aliases_price_as_their_current_target(monkeypatch, alias, target):
def test_latest_aliases_cost_the_same_as_their_current_target(
monkeypatch, alias, target, expected_cost
):
monkeypatch.setenv("LITELLM_LOCAL_MODEL_COST_MAP", "True")
monkeypatch.setattr(litellm, "model_cost", litellm.get_model_cost_map(url=""))
alias_entry = litellm.model_cost[alias]
target_entry = litellm.model_cost[target]
usage = Usage(
prompt_tokens=1_000,
completion_tokens=500,
total_tokens=1_500,
prompt_tokens_details=PromptTokensDetailsWrapper(cached_tokens=400),
)
for cost_key in (
"input_cost_per_token",
"output_cost_per_token",
"cache_read_input_token_cost",
"max_output_tokens",
):
assert alias_entry[cost_key] == target_entry[cost_key]
def cost_of(model: str) -> float:
return completion_cost(
completion_response=ModelResponse(model=model, usage=usage),
model=model,
custom_llm_provider="gemini",
)
alias_cost = cost_of(alias)
target_cost = cost_of(target)
assert alias_cost == pytest.approx(target_cost)
assert alias_cost == pytest.approx(expected_cost)
assert alias_cost > 0
@pytest.mark.parametrize(