diff --git a/litellm/cost_calculator.py b/litellm/cost_calculator.py index 27a954f5f85..d007e555521 100644 --- a/litellm/cost_calculator.py +++ b/litellm/cost_calculator.py @@ -49,6 +49,8 @@ from litellm.litellm_core_utils.llm_cost_calc.utils import ( generic_cost_per_token, get_batch_cost_rates, get_billable_input_tokens, + get_cost_per_unit, + get_modality_token_cost_key, get_regional_uplift_multiplier, get_service_tier_cost_key, get_token_type_cost_breakdown, @@ -3186,8 +3188,12 @@ def _batch_rate( "input_cost_per_video_token_batches", ], fallback: float, + *, + prompt_tokens: int = 0, ) -> float: - rate: Final = model_info.get(key) + context_key: Final = get_modality_token_cost_key(model_info, key, prompt_tokens) + context_rate: Final = get_cost_per_unit(model_info, context_key, None) + rate: Final = model_info.get(key) if context_rate is None else context_rate return fallback if rate is None else rate @@ -3337,7 +3343,8 @@ def _batch_prompt_cost( ) return ( text_tokens * input_rate - + audio_tokens * _batch_rate(model_info, "input_cost_per_audio_token_batches", input_rate) + + audio_tokens + * _batch_rate(model_info, "input_cost_per_audio_token_batches", input_rate, prompt_tokens=usage.prompt_tokens) + image_tokens * _batch_rate(model_info, "input_cost_per_image_token_batches", input_rate) + video_tokens * _batch_rate(model_info, "input_cost_per_video_token_batches", input_rate) + (cached_tokens - cached_audio_tokens) * (cache_read_rate or 0.0) diff --git a/litellm/litellm_core_utils/llm_cost_calc/utils.py b/litellm/litellm_core_utils/llm_cost_calc/utils.py index c553bfeaad8..d8f9a909e18 100644 --- a/litellm/litellm_core_utils/llm_cost_calc/utils.py +++ b/litellm/litellm_core_utils/llm_cost_calc/utils.py @@ -1203,21 +1203,55 @@ def parse_completion_tokens_details(usage: Usage) -> CompletionTokensDetailsResu ) +def get_modality_token_cost_key( + model_info: ModelInfo, + cost_key: str, + prompt_tokens: int, + *, + threshold_is_inclusive: bool = False, +) -> str: + suffix: Final = next((suffix for suffix in _NON_STANDARD_THRESHOLD_SUFFIXES if cost_key.endswith(suffix)), "") + base_key: Final = cost_key.removesuffix(suffix) + threshold_key: Final = max( + ( + key + for key in model_info + if key.startswith(f"{base_key}_above_") + and key.endswith(("_tokens", f"_tokens{suffix}")) + and model_info.get(key) is not None + and _prompt_exceeds_threshold(prompt_tokens, _parse_above_token_threshold(key), threshold_is_inclusive) + ), + key=_parse_above_token_threshold, + default=None, + ) + if threshold_key is None: + return cost_key + return f"{threshold_key.removesuffix(suffix)}{suffix}" + + def _modality_token_cost( model_info: ModelInfo, modality_cost_key: str, tokens: int, prompt_base_cost: float, service_tier: str | None, + *, + prompt_tokens: int = 0, + threshold_is_inclusive: bool = False, ) -> float: """ Audio, image and video prompt tokens bill at their modality rate when the model has one. Without one they are ordinary prompt tokens, so they bill at `prompt_base_cost`, which `_get_token_base_cost` has already resolved for the service tier and long-context tier. """ - tiered_key: Final = get_service_tier_cost_key(modality_cost_key, service_tier) - cost_key: Final = tiered_key if model_info.get(tiered_key) is not None else modality_cost_key - if model_info.get(cost_key) is None: + cost_key: Final = get_modality_token_cost_key( + model_info, + get_service_tier_cost_key(modality_cost_key, service_tier), + prompt_tokens, + threshold_is_inclusive=threshold_is_inclusive, + ) + standard_key: Final = cost_key.removesuffix(get_service_tier_cost_key("", service_tier)) + if model_info.get(cost_key) is None and model_info.get(standard_key) is None: return float(tokens) * prompt_base_cost return calculate_cost_component(model_info, cost_key, tokens) @@ -1230,6 +1264,9 @@ def _calculate_input_cost( cache_creation_cost: float, cache_creation_cost_by_ttl: Mapping[str, float], service_tier: str | None = None, + *, + prompt_tokens: int = 0, + threshold_is_inclusive: bool = False, ) -> float: """ Calculates the input cost for a given model, prompt tokens, and completion tokens. @@ -1260,6 +1297,8 @@ def _calculate_input_cost( prompt_tokens_details["audio_tokens"], prompt_base_cost, service_tier, + prompt_tokens=prompt_tokens, + threshold_is_inclusive=threshold_is_inclusive, ) ### IMAGE TOKEN COST @@ -1618,6 +1657,8 @@ def generic_cost_per_token( cache_creation_cost=base_costs.cache_creation_rate, cache_creation_cost_by_ttl=base_costs.cache_creation_rates_by_ttl, service_tier=service_tier, + prompt_tokens=usage.prompt_tokens, + threshold_is_inclusive=_uses_inclusive_token_thresholds(custom_llm_provider), ) ## CALCULATE OUTPUT COST @@ -1675,11 +1716,9 @@ def generic_cost_per_token( ## IMAGE COST if not is_text_tokens_total and image_tokens and image_tokens > 0: - _output_cost_per_image_token = get_cost_per_unit(resolved_model_info, "output_cost_per_image_token", None) - _output_cost_per_image_token = ( - _output_cost_per_image_token if _output_cost_per_image_token is not None else completion_base_cost - ) - completion_cost += float(image_tokens) * _output_cost_per_image_token + image_cost_key: Final = get_service_tier_cost_key("output_cost_per_image_token", service_tier) + image_rate: Final = get_cost_per_unit(resolved_model_info, image_cost_key, None) + completion_cost += float(image_tokens) * (completion_base_cost if image_rate is None else image_rate) ## VIDEO COST if not is_text_tokens_total and video_tokens and video_tokens > 0: diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index e1dd6eb4a9a..85bcb8f5411 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -29951,21 +29951,38 @@ }, "gemini-2.5-flash": { "cache_read_input_audio_token_cost": 1e-07, - "deprecation_date": "2026-10-20", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "gemini-3.8-flash", + "cache_read_input_audio_token_cost_priority": 1.8e-07, "cache_read_input_token_cost": 3e-08, "cache_read_input_token_cost_flex": 3e-08, "cache_read_input_token_cost_priority": 5.4e-08, + "deprecation_date": "2026-10-20", + "google_maps_grounding_cost_per_query": 0.025, "input_cost_per_audio_token": 1e-06, + "input_cost_per_audio_token_above_200k_tokens": 3e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 1.8e-06, + "input_cost_per_audio_token_batches": 5e-07, + "input_cost_per_audio_token_flex": 5e-07, + "input_cost_per_audio_token_priority": 1.8e-06, "input_cost_per_token": 3e-07, + "input_cost_per_token_batches": 1.5e-07, + "input_cost_per_token_flex": 1.5e-07, + "input_cost_per_token_priority": 5.4e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65535, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, + "output_cost_per_token_batches": 1.25e-06, + "output_cost_per_token_flex": 1.25e-06, + "output_cost_per_token_priority": 4.5e-06, + "search_context_cost_per_query": {"search_context_size_low":0.035,"search_context_size_medium":0.035,"search_context_size_high":0.035}, + "search_free_requests": {"count":1500,"period":"day","shared_group":"gemini-2-flash"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "gemini-3.8-flash", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -29982,6 +29999,7 @@ ], "supports_audio_output": false, "supports_function_calling": true, + "supports_image_size": false, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -29991,23 +30009,7 @@ "supports_tool_choice": true, "supports_url_context": true, "supports_vision": true, - "supports_web_search": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.035, - "search_context_size_medium": 0.035, - "search_context_size_high": 0.035 - }, - "search_free_requests": {"count": 1500, "period": "day", "shared_group": "gemini-2-flash"}, - "google_maps_grounding_cost_per_query": 0.025, - "input_cost_per_audio_token_batches": 5e-07, - "input_cost_per_token_batches": 1.5e-07, - "input_cost_per_token_flex": 1.5e-07, - "input_cost_per_token_priority": 5.4e-07, - "input_cost_per_audio_token_priority": 1.8e-06, - "output_cost_per_token_batches": 1.25e-06, - "output_cost_per_token_flex": 1.25e-06, - "output_cost_per_token_priority": 4.5e-06, - "supports_image_size": false + "supports_web_search": true }, "gemini-2.5-flash-image": { "deprecation_date": "2027-03-15", @@ -30083,6 +30085,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, @@ -30137,6 +30140,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_priority": 2.16e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -30190,6 +30194,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "output_cost_per_token_flex": 1.5e-06, @@ -30236,6 +30241,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", @@ -30268,8 +30274,6 @@ "web_search_billing_unit": "per_query" }, "gemini-3.1-flash-lite-image": { - "deprecation_date": "2027-06-28", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, @@ -30286,6 +30290,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 1.5e-06, "output_cost_per_token_batches": 7.5e-07, "output_cost_per_token_flex": 7.5e-07, @@ -30366,19 +30371,28 @@ }, "gemini-3.1-flash-lite": { "cache_read_input_audio_token_cost": 5e-08, - "deprecation_date": "2027-05-07", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "gemini-3.5-flash-lite", + "cache_read_input_audio_token_cost_batches": 2.5e-08, + "cache_read_input_audio_token_cost_flex": 2.5e-08, + "cache_read_input_audio_token_cost_priority": 9e-08, "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, "cache_read_input_token_cost_priority": 4.5e-08, + "deprecation_date": "2027-05-07", + "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 5e-07, + "input_cost_per_audio_token_above_200k_tokens": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 9e-07, + "input_cost_per_audio_token_batches": 2.5e-07, + "input_cost_per_audio_token_flex": 2.5e-07, + "input_cost_per_audio_token_priority": 9e-07, "input_cost_per_token": 2.5e-07, "input_cost_per_token_batches": 1.25e-07, "input_cost_per_token_flex": 1.25e-07, "input_cost_per_token_priority": 4.5e-07, - "input_cost_per_audio_token_priority": 9e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -30388,7 +30402,10 @@ "output_cost_per_token_batches": 7.5e-07, "output_cost_per_token_flex": 7.5e-07, "output_cost_per_token_priority": 2.7e-06, + "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "gemini-3.5-flash-lite", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -30406,6 +30423,7 @@ "supports_audio_input": true, "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -30417,16 +30435,7 @@ "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "supports_native_streaming": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.014, - "search_context_size_medium": 0.014, - "search_context_size_high": 0.014 - }, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, - "web_search_billing_unit": "per_query", - "google_maps_grounding_cost_per_query": 0.014, - "input_cost_per_audio_token_batches": 2.5e-07 + "web_search_billing_unit": "per_query" }, "gemini-3.5-flash-lite": { "deprecation_date": "2027-07-21", @@ -30526,21 +30535,38 @@ }, "gemini-2.5-flash-lite": { "cache_read_input_audio_token_cost": 3e-08, - "deprecation_date": "2026-10-20", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "gemini-3.8-flash", + "cache_read_input_audio_token_cost_priority": 5.4e-08, "cache_read_input_token_cost": 1e-08, "cache_read_input_token_cost_flex": 1e-08, "cache_read_input_token_cost_priority": 1.8e-08, + "deprecation_date": "2026-10-20", + "google_maps_grounding_cost_per_query": 0.025, "input_cost_per_audio_token": 3e-07, + "input_cost_per_audio_token_above_200k_tokens": 3e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-08, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-08, + "input_cost_per_audio_token_above_200k_tokens_priority": 5.4e-07, + "input_cost_per_audio_token_batches": 5e-08, + "input_cost_per_audio_token_flex": 5e-08, + "input_cost_per_audio_token_priority": 5.4e-07, "input_cost_per_token": 1e-07, + "input_cost_per_token_batches": 5e-08, + "input_cost_per_token_flex": 5e-08, + "input_cost_per_token_priority": 1.8e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65535, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, + "output_cost_per_token_batches": 2e-07, + "output_cost_per_token_flex": 2e-07, + "output_cost_per_token_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_free_requests": {"count":1500,"period":"day","shared_group":"gemini-2-flash"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "gemini-3.8-flash", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -30557,6 +30583,7 @@ ], "supports_audio_output": false, "supports_function_calling": true, + "supports_image_size": false, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -30566,23 +30593,7 @@ "supports_tool_choice": true, "supports_url_context": true, "supports_vision": true, - "supports_web_search": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.035, - "search_context_size_medium": 0.035, - "search_context_size_high": 0.035 - }, - "search_free_requests": {"count": 1500, "period": "day", "shared_group": "gemini-2-flash"}, - "google_maps_grounding_cost_per_query": 0.025, - "input_cost_per_audio_token_batches": 5e-08, - "input_cost_per_token_batches": 5e-08, - "input_cost_per_token_flex": 5e-08, - "input_cost_per_token_priority": 1.8e-07, - "input_cost_per_audio_token_priority": 5.4e-07, - "output_cost_per_token_batches": 2e-07, - "output_cost_per_token_flex": 2e-07, - "output_cost_per_token_priority": 7.2e-07, - "supports_image_size": false + "supports_web_search": true }, "gemini-2.5-flash-lite-preview-09-2025": { "cache_read_input_token_cost": 1e-08, @@ -30863,11 +30874,13 @@ "search_free_requests": {"count": 10000, "period": "day", "shared_group": "gemini-2.5-pro"}, "google_maps_grounding_cost_per_query": 0.025, "input_cost_per_token_above_200k_tokens_batches": 1.25e-06, + "input_cost_per_token_above_200k_tokens_flex": 1.25e-06, "input_cost_per_token_above_200k_tokens_priority": 4.5e-06, "input_cost_per_token_batches": 6.25e-07, "input_cost_per_token_flex": 6.25e-07, "input_cost_per_token_priority": 2.25e-06, "output_cost_per_token_above_200k_tokens_batches": 7.5e-06, + "output_cost_per_token_above_200k_tokens_flex": 7.5e-06, "output_cost_per_token_above_200k_tokens_priority": 2.7e-05, "output_cost_per_token_batches": 5e-06, "output_cost_per_token_flex": 5e-06, @@ -30883,6 +30896,7 @@ "input_cost_per_token": 2e-06, "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_above_200k_tokens_batches": 2e-06, + "input_cost_per_token_above_200k_tokens_flex": 2e-06, "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, "input_cost_per_token_batches": 1e-06, "input_cost_per_token_flex": 1e-06, @@ -30895,6 +30909,7 @@ "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_batches": 9e-06, + "output_cost_per_token_above_200k_tokens_flex": 9e-06, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "output_cost_per_token_batches": 6e-06, "output_cost_per_token_flex": 6e-06, @@ -31042,11 +31057,17 @@ }, "vertex_ai/gemini-3-flash-preview": { "cache_read_input_audio_token_cost": 1e-07, + "cache_read_input_audio_token_cost_priority": 1.8e-07, "cache_read_input_token_cost": 5e-08, "cache_read_input_token_cost_priority": 9e-08, "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 1e-06, + "input_cost_per_audio_token_above_200k_tokens": 1e-06, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 1.8e-06, "input_cost_per_audio_token_batches": 5e-07, + "input_cost_per_audio_token_flex": 5e-07, "input_cost_per_audio_token_priority": 1.8e-06, "input_cost_per_token": 5e-07, "input_cost_per_token_batches": 2.5e-07, @@ -31061,7 +31082,7 @@ "output_cost_per_token_flex": 1.5e-06, "output_cost_per_token_priority": 5.4e-06, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -31284,8 +31305,6 @@ "google_maps_grounding_cost_per_query": 0.014 }, "vertex_ai/gemini-3.8-flash": { - "deprecation_date": "2027-09-02", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 7.5e-08, "cache_read_input_token_cost_batches": 3.75e-08, "cache_read_input_token_cost_flex": 3.75e-08, @@ -31307,7 +31326,7 @@ "prompt_cache_min_tokens": 4096.0, "regional_endpoint_uplift_multiplier": 1.1, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -31392,8 +31411,6 @@ "supports_native_streaming": true }, "vertex_ai/gemini-3.8-live": { - "deprecation_date": "2027-09-25", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "gemini_audio_only_live": true, "input_cost_per_audio_token": 3e-06, "input_cost_per_image_token": 1e-06, @@ -31439,6 +31456,7 @@ "input_cost_per_token": 2e-06, "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_above_200k_tokens_batches": 2e-06, + "input_cost_per_token_above_200k_tokens_flex": 2e-06, "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, "input_cost_per_token_batches": 1e-06, "input_cost_per_token_flex": 1e-06, @@ -31451,6 +31469,7 @@ "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_batches": 9e-06, + "output_cost_per_token_above_200k_tokens_flex": 9e-06, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "output_cost_per_token_batches": 6e-06, "output_cost_per_token_flex": 6e-06, @@ -33332,11 +33351,17 @@ }, "gemini-3-flash-preview": { "cache_read_input_audio_token_cost": 1e-07, + "cache_read_input_audio_token_cost_priority": 1.8e-07, "cache_read_input_token_cost": 5e-08, "cache_read_input_token_cost_priority": 9e-08, "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 1e-06, + "input_cost_per_audio_token_above_200k_tokens": 1e-06, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 1.8e-06, "input_cost_per_audio_token_batches": 5e-07, + "input_cost_per_audio_token_flex": 5e-07, "input_cost_per_audio_token_priority": 1.8e-06, "input_cost_per_token": 5e-07, "input_cost_per_token_batches": 2.5e-07, @@ -33352,7 +33377,7 @@ "output_cost_per_token_flex": 1.5e-06, "output_cost_per_token_priority": 5.4e-06, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -33607,8 +33632,6 @@ "google_maps_grounding_cost_per_query": 0.014 }, "gemini-3.8-flash": { - "deprecation_date": "2027-09-02", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 7.5e-08, "cache_read_input_token_cost_batches": 3.75e-08, "cache_read_input_token_cost_flex": 3.75e-08, @@ -33629,7 +33652,7 @@ "output_cost_per_token_priority": 6.75e-06, "prompt_cache_min_tokens": 4096.0, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -53876,6 +53899,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, @@ -53911,6 +53935,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_priority": 2.16e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -53945,6 +53970,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "output_cost_per_token_flex": 1.5e-06, @@ -53973,6 +53999,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "supports_reasoning": false, @@ -53986,8 +54013,6 @@ }, "vertex_ai/gemini-3.1-flash-lite-image": { - "deprecation_date": "2027-06-28", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, @@ -54004,6 +54029,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 1.5e-06, "output_cost_per_token_batches": 7.5e-07, "output_cost_per_token_flex": 7.5e-07, @@ -54084,19 +54110,28 @@ }, "vertex_ai/gemini-3.1-flash-lite": { "cache_read_input_audio_token_cost": 5e-08, - "deprecation_date": "2027-05-07", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "vertex_ai/gemini-3.5-flash-lite", + "cache_read_input_audio_token_cost_batches": 2.5e-08, + "cache_read_input_audio_token_cost_flex": 2.5e-08, + "cache_read_input_audio_token_cost_priority": 9e-08, "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, "cache_read_input_token_cost_priority": 4.5e-08, + "deprecation_date": "2027-05-07", + "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 5e-07, + "input_cost_per_audio_token_above_200k_tokens": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 9e-07, + "input_cost_per_audio_token_batches": 2.5e-07, + "input_cost_per_audio_token_flex": 2.5e-07, + "input_cost_per_audio_token_priority": 9e-07, "input_cost_per_token": 2.5e-07, "input_cost_per_token_batches": 1.25e-07, "input_cost_per_token_flex": 1.25e-07, "input_cost_per_token_priority": 4.5e-07, - "input_cost_per_audio_token_priority": 9e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -54107,7 +54142,10 @@ "output_cost_per_token_flex": 7.5e-07, "output_cost_per_token_priority": 2.7e-06, "regional_endpoint_uplift_multiplier": 1.1, + "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "vertex_ai/gemini-3.5-flash-lite", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -54125,6 +54163,7 @@ "supports_audio_input": true, "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -54136,16 +54175,7 @@ "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "supports_native_streaming": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.014, - "search_context_size_medium": 0.014, - "search_context_size_high": 0.014 - }, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, - "web_search_billing_unit": "per_query", - "google_maps_grounding_cost_per_query": 0.014, - "input_cost_per_audio_token_batches": 2.5e-07 + "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-3.5-flash-lite": { "deprecation_date": "2027-07-21", @@ -77226,6 +77256,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 7.5e-06, "output_cost_per_token_batches": 3.75e-06, "output_cost_per_token_priority": 1.35e-05, @@ -77272,6 +77303,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 7.5e-06, "output_cost_per_token_batches": 3.75e-06, "output_cost_per_token_priority": 1.35e-05, @@ -78395,8 +78427,6 @@ "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-4-argon": { - "deprecation_date": "2027-10-13", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 1e-07, "cache_read_input_token_cost_batches": 5e-08, "cache_read_input_token_cost_flex": 5e-08, diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 57f4d971eb3..5e50f3efb65 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -383,6 +383,10 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): input_cost_per_character: float | None # only for vertex ai models input_cost_per_audio_token: float | None input_cost_per_audio_token_flex: ReadOnly[float | None] + input_cost_per_audio_token_above_200k_tokens: ReadOnly[float | None] + input_cost_per_audio_token_above_200k_tokens_flex: ReadOnly[float | None] + input_cost_per_audio_token_above_200k_tokens_priority: ReadOnly[float | None] + input_cost_per_audio_token_above_200k_tokens_batches: ReadOnly[float | None] input_cost_per_audio_token_priority: ReadOnly[float | None] input_cost_per_token_above_128k_tokens: float | None # only for vertex ai models input_cost_per_token_above_200k_tokens: float | None # only for vertex ai gemini-2.5-pro models @@ -408,10 +412,12 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): input_cost_per_token_batches: float | None input_cost_per_video_token_batches: ReadOnly[float | None] input_cost_per_token_above_200k_tokens_batches: ReadOnly[float | None] + input_cost_per_token_above_200k_tokens_flex: ReadOnly[float | None] input_cost_per_token_above_100k_tokens_batches: ReadOnly[float | None] input_cost_per_token_above_272k_tokens_batches: ReadOnly[float | None] output_cost_per_token_batches: float | None output_cost_per_token_above_200k_tokens_batches: ReadOnly[float | None] + output_cost_per_token_above_200k_tokens_flex: ReadOnly[float | None] output_cost_per_token_above_100k_tokens_batches: ReadOnly[float | None] output_cost_per_token_above_272k_tokens_batches: ReadOnly[float | None] output_cost_per_token: Required[float | None] @@ -444,6 +450,7 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): output_cost_per_pixel: ReadOnly[float | None] output_cost_per_image_token: float | None output_cost_per_image_token_batches: ReadOnly[float | None] + output_cost_per_image_token_priority: ReadOnly[float | None] output_cost_per_video_token: float | None # for gemini omni models with video output output_vector_size: int | None output_cost_per_reasoning_token: float | None @@ -4173,6 +4180,10 @@ class CustomPricingLiteLLMParams(MirroredPricingParams): input_cost_per_character_above_128k_tokens: float | None = None input_cost_per_audio_token: float | None = None input_cost_per_audio_token_flex: float | None = None + input_cost_per_audio_token_above_200k_tokens: float | None = None + input_cost_per_audio_token_above_200k_tokens_flex: float | None = None + input_cost_per_audio_token_above_200k_tokens_priority: float | None = None + input_cost_per_audio_token_above_200k_tokens_batches: float | None = None input_cost_per_audio_token_priority: float | None = None input_cost_per_token_cache_hit: float | None = None input_cost_per_token_above_128k_tokens: float | None = None @@ -4183,6 +4194,7 @@ class CustomPricingLiteLLMParams(MirroredPricingParams): input_cost_per_token_above_272k_tokens_flex: float | None = None input_cost_per_token_above_272k_tokens_ultrafast: float | None = None input_cost_per_token_above_200k_tokens_batches: float | None = None + input_cost_per_token_above_200k_tokens_flex: float | None = None input_cost_per_token_above_100k_tokens_batches: float | None = None input_cost_per_token_above_272k_tokens_batches: float | None = None input_cost_per_query: float | None = None @@ -4212,12 +4224,14 @@ class CustomPricingLiteLLMParams(MirroredPricingParams): output_cost_per_token_above_272k_tokens_flex: float | None = None output_cost_per_token_above_272k_tokens_ultrafast: float | None = None output_cost_per_token_above_200k_tokens_batches: float | None = None + output_cost_per_token_above_200k_tokens_flex: float | None = None output_cost_per_token_above_100k_tokens_batches: float | None = None output_cost_per_token_above_272k_tokens_batches: float | None = None output_cost_per_character_above_128k_tokens: float | None = None output_cost_per_image: float | None = None output_cost_per_image_token: float | None = None output_cost_per_image_token_batches: float | None = None + output_cost_per_image_token_priority: float | None = None output_cost_per_video_token: float | None = None output_cost_per_reasoning_token: float | None = None output_cost_per_reasoning_token_flex: float | None = None diff --git a/litellm/utils.py b/litellm/utils.py index e003f0a3987..9f49e632395 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -7445,6 +7445,18 @@ def get_model_info_helper( input_cost_per_text_message=_model_info.get("input_cost_per_text_message", None), input_cost_per_audio_token=_model_info.get("input_cost_per_audio_token", None), input_cost_per_audio_token_flex=_model_info.get("input_cost_per_audio_token_flex", None), + input_cost_per_audio_token_above_200k_tokens=_model_info.get( + "input_cost_per_audio_token_above_200k_tokens", None + ), + input_cost_per_audio_token_above_200k_tokens_flex=_model_info.get( + "input_cost_per_audio_token_above_200k_tokens_flex", None + ), + input_cost_per_audio_token_above_200k_tokens_priority=_model_info.get( + "input_cost_per_audio_token_above_200k_tokens_priority", None + ), + input_cost_per_audio_token_above_200k_tokens_batches=_model_info.get( + "input_cost_per_audio_token_above_200k_tokens_batches", None + ), input_cost_per_audio_token_priority=_model_info.get("input_cost_per_audio_token_priority", None), input_cost_per_image_token=_model_info.get("input_cost_per_image_token", None), input_cost_per_video_token=_model_info.get("input_cost_per_video_token", None), @@ -7458,6 +7470,9 @@ def get_model_info_helper( input_cost_per_token_above_200k_tokens_batches=_model_info.get( "input_cost_per_token_above_200k_tokens_batches" ), + input_cost_per_token_above_200k_tokens_flex=_model_info.get( + "input_cost_per_token_above_200k_tokens_flex", None + ), input_cost_per_token_above_272k_tokens_batches=_model_info.get( "input_cost_per_token_above_272k_tokens_batches" ), @@ -7465,6 +7480,9 @@ def get_model_info_helper( output_cost_per_token_above_200k_tokens_batches=_model_info.get( "output_cost_per_token_above_200k_tokens_batches" ), + output_cost_per_token_above_200k_tokens_flex=_model_info.get( + "output_cost_per_token_above_200k_tokens_flex", None + ), output_cost_per_token_above_272k_tokens_batches=_model_info.get( "output_cost_per_token_above_272k_tokens_batches" ), @@ -7526,6 +7544,7 @@ def get_model_info_helper( output_cost_per_pixel=_model_info.get("output_cost_per_pixel", None), output_cost_per_image_token=_model_info.get("output_cost_per_image_token", None), output_cost_per_image_token_batches=_model_info.get("output_cost_per_image_token_batches", None), + output_cost_per_image_token_priority=_model_info.get("output_cost_per_image_token_priority", None), output_cost_per_video_token=_model_info.get("output_cost_per_video_token", None), output_vector_size=_model_info.get("output_vector_size", None), citation_cost_per_token=_model_info.get("citation_cost_per_token", None), diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index e1dd6eb4a9a..85bcb8f5411 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -29951,21 +29951,38 @@ }, "gemini-2.5-flash": { "cache_read_input_audio_token_cost": 1e-07, - "deprecation_date": "2026-10-20", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "gemini-3.8-flash", + "cache_read_input_audio_token_cost_priority": 1.8e-07, "cache_read_input_token_cost": 3e-08, "cache_read_input_token_cost_flex": 3e-08, "cache_read_input_token_cost_priority": 5.4e-08, + "deprecation_date": "2026-10-20", + "google_maps_grounding_cost_per_query": 0.025, "input_cost_per_audio_token": 1e-06, + "input_cost_per_audio_token_above_200k_tokens": 3e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 1.8e-06, + "input_cost_per_audio_token_batches": 5e-07, + "input_cost_per_audio_token_flex": 5e-07, + "input_cost_per_audio_token_priority": 1.8e-06, "input_cost_per_token": 3e-07, + "input_cost_per_token_batches": 1.5e-07, + "input_cost_per_token_flex": 1.5e-07, + "input_cost_per_token_priority": 5.4e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65535, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, + "output_cost_per_token_batches": 1.25e-06, + "output_cost_per_token_flex": 1.25e-06, + "output_cost_per_token_priority": 4.5e-06, + "search_context_cost_per_query": {"search_context_size_low":0.035,"search_context_size_medium":0.035,"search_context_size_high":0.035}, + "search_free_requests": {"count":1500,"period":"day","shared_group":"gemini-2-flash"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "gemini-3.8-flash", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -29982,6 +29999,7 @@ ], "supports_audio_output": false, "supports_function_calling": true, + "supports_image_size": false, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -29991,23 +30009,7 @@ "supports_tool_choice": true, "supports_url_context": true, "supports_vision": true, - "supports_web_search": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.035, - "search_context_size_medium": 0.035, - "search_context_size_high": 0.035 - }, - "search_free_requests": {"count": 1500, "period": "day", "shared_group": "gemini-2-flash"}, - "google_maps_grounding_cost_per_query": 0.025, - "input_cost_per_audio_token_batches": 5e-07, - "input_cost_per_token_batches": 1.5e-07, - "input_cost_per_token_flex": 1.5e-07, - "input_cost_per_token_priority": 5.4e-07, - "input_cost_per_audio_token_priority": 1.8e-06, - "output_cost_per_token_batches": 1.25e-06, - "output_cost_per_token_flex": 1.25e-06, - "output_cost_per_token_priority": 4.5e-06, - "supports_image_size": false + "supports_web_search": true }, "gemini-2.5-flash-image": { "deprecation_date": "2027-03-15", @@ -30083,6 +30085,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, @@ -30137,6 +30140,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_priority": 2.16e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -30190,6 +30194,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "output_cost_per_token_flex": 1.5e-06, @@ -30236,6 +30241,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", @@ -30268,8 +30274,6 @@ "web_search_billing_unit": "per_query" }, "gemini-3.1-flash-lite-image": { - "deprecation_date": "2027-06-28", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, @@ -30286,6 +30290,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 1.5e-06, "output_cost_per_token_batches": 7.5e-07, "output_cost_per_token_flex": 7.5e-07, @@ -30366,19 +30371,28 @@ }, "gemini-3.1-flash-lite": { "cache_read_input_audio_token_cost": 5e-08, - "deprecation_date": "2027-05-07", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "gemini-3.5-flash-lite", + "cache_read_input_audio_token_cost_batches": 2.5e-08, + "cache_read_input_audio_token_cost_flex": 2.5e-08, + "cache_read_input_audio_token_cost_priority": 9e-08, "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, "cache_read_input_token_cost_priority": 4.5e-08, + "deprecation_date": "2027-05-07", + "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 5e-07, + "input_cost_per_audio_token_above_200k_tokens": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 9e-07, + "input_cost_per_audio_token_batches": 2.5e-07, + "input_cost_per_audio_token_flex": 2.5e-07, + "input_cost_per_audio_token_priority": 9e-07, "input_cost_per_token": 2.5e-07, "input_cost_per_token_batches": 1.25e-07, "input_cost_per_token_flex": 1.25e-07, "input_cost_per_token_priority": 4.5e-07, - "input_cost_per_audio_token_priority": 9e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -30388,7 +30402,10 @@ "output_cost_per_token_batches": 7.5e-07, "output_cost_per_token_flex": 7.5e-07, "output_cost_per_token_priority": 2.7e-06, + "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "gemini-3.5-flash-lite", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -30406,6 +30423,7 @@ "supports_audio_input": true, "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -30417,16 +30435,7 @@ "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "supports_native_streaming": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.014, - "search_context_size_medium": 0.014, - "search_context_size_high": 0.014 - }, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, - "web_search_billing_unit": "per_query", - "google_maps_grounding_cost_per_query": 0.014, - "input_cost_per_audio_token_batches": 2.5e-07 + "web_search_billing_unit": "per_query" }, "gemini-3.5-flash-lite": { "deprecation_date": "2027-07-21", @@ -30526,21 +30535,38 @@ }, "gemini-2.5-flash-lite": { "cache_read_input_audio_token_cost": 3e-08, - "deprecation_date": "2026-10-20", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "gemini-3.8-flash", + "cache_read_input_audio_token_cost_priority": 5.4e-08, "cache_read_input_token_cost": 1e-08, "cache_read_input_token_cost_flex": 1e-08, "cache_read_input_token_cost_priority": 1.8e-08, + "deprecation_date": "2026-10-20", + "google_maps_grounding_cost_per_query": 0.025, "input_cost_per_audio_token": 3e-07, + "input_cost_per_audio_token_above_200k_tokens": 3e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-08, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-08, + "input_cost_per_audio_token_above_200k_tokens_priority": 5.4e-07, + "input_cost_per_audio_token_batches": 5e-08, + "input_cost_per_audio_token_flex": 5e-08, + "input_cost_per_audio_token_priority": 5.4e-07, "input_cost_per_token": 1e-07, + "input_cost_per_token_batches": 5e-08, + "input_cost_per_token_flex": 5e-08, + "input_cost_per_token_priority": 1.8e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65535, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, + "output_cost_per_token_batches": 2e-07, + "output_cost_per_token_flex": 2e-07, + "output_cost_per_token_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_free_requests": {"count":1500,"period":"day","shared_group":"gemini-2-flash"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "gemini-3.8-flash", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -30557,6 +30583,7 @@ ], "supports_audio_output": false, "supports_function_calling": true, + "supports_image_size": false, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -30566,23 +30593,7 @@ "supports_tool_choice": true, "supports_url_context": true, "supports_vision": true, - "supports_web_search": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.035, - "search_context_size_medium": 0.035, - "search_context_size_high": 0.035 - }, - "search_free_requests": {"count": 1500, "period": "day", "shared_group": "gemini-2-flash"}, - "google_maps_grounding_cost_per_query": 0.025, - "input_cost_per_audio_token_batches": 5e-08, - "input_cost_per_token_batches": 5e-08, - "input_cost_per_token_flex": 5e-08, - "input_cost_per_token_priority": 1.8e-07, - "input_cost_per_audio_token_priority": 5.4e-07, - "output_cost_per_token_batches": 2e-07, - "output_cost_per_token_flex": 2e-07, - "output_cost_per_token_priority": 7.2e-07, - "supports_image_size": false + "supports_web_search": true }, "gemini-2.5-flash-lite-preview-09-2025": { "cache_read_input_token_cost": 1e-08, @@ -30863,11 +30874,13 @@ "search_free_requests": {"count": 10000, "period": "day", "shared_group": "gemini-2.5-pro"}, "google_maps_grounding_cost_per_query": 0.025, "input_cost_per_token_above_200k_tokens_batches": 1.25e-06, + "input_cost_per_token_above_200k_tokens_flex": 1.25e-06, "input_cost_per_token_above_200k_tokens_priority": 4.5e-06, "input_cost_per_token_batches": 6.25e-07, "input_cost_per_token_flex": 6.25e-07, "input_cost_per_token_priority": 2.25e-06, "output_cost_per_token_above_200k_tokens_batches": 7.5e-06, + "output_cost_per_token_above_200k_tokens_flex": 7.5e-06, "output_cost_per_token_above_200k_tokens_priority": 2.7e-05, "output_cost_per_token_batches": 5e-06, "output_cost_per_token_flex": 5e-06, @@ -30883,6 +30896,7 @@ "input_cost_per_token": 2e-06, "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_above_200k_tokens_batches": 2e-06, + "input_cost_per_token_above_200k_tokens_flex": 2e-06, "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, "input_cost_per_token_batches": 1e-06, "input_cost_per_token_flex": 1e-06, @@ -30895,6 +30909,7 @@ "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_batches": 9e-06, + "output_cost_per_token_above_200k_tokens_flex": 9e-06, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "output_cost_per_token_batches": 6e-06, "output_cost_per_token_flex": 6e-06, @@ -31042,11 +31057,17 @@ }, "vertex_ai/gemini-3-flash-preview": { "cache_read_input_audio_token_cost": 1e-07, + "cache_read_input_audio_token_cost_priority": 1.8e-07, "cache_read_input_token_cost": 5e-08, "cache_read_input_token_cost_priority": 9e-08, "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 1e-06, + "input_cost_per_audio_token_above_200k_tokens": 1e-06, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 1.8e-06, "input_cost_per_audio_token_batches": 5e-07, + "input_cost_per_audio_token_flex": 5e-07, "input_cost_per_audio_token_priority": 1.8e-06, "input_cost_per_token": 5e-07, "input_cost_per_token_batches": 2.5e-07, @@ -31061,7 +31082,7 @@ "output_cost_per_token_flex": 1.5e-06, "output_cost_per_token_priority": 5.4e-06, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -31284,8 +31305,6 @@ "google_maps_grounding_cost_per_query": 0.014 }, "vertex_ai/gemini-3.8-flash": { - "deprecation_date": "2027-09-02", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 7.5e-08, "cache_read_input_token_cost_batches": 3.75e-08, "cache_read_input_token_cost_flex": 3.75e-08, @@ -31307,7 +31326,7 @@ "prompt_cache_min_tokens": 4096.0, "regional_endpoint_uplift_multiplier": 1.1, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -31392,8 +31411,6 @@ "supports_native_streaming": true }, "vertex_ai/gemini-3.8-live": { - "deprecation_date": "2027-09-25", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "gemini_audio_only_live": true, "input_cost_per_audio_token": 3e-06, "input_cost_per_image_token": 1e-06, @@ -31439,6 +31456,7 @@ "input_cost_per_token": 2e-06, "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_above_200k_tokens_batches": 2e-06, + "input_cost_per_token_above_200k_tokens_flex": 2e-06, "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, "input_cost_per_token_batches": 1e-06, "input_cost_per_token_flex": 1e-06, @@ -31451,6 +31469,7 @@ "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_batches": 9e-06, + "output_cost_per_token_above_200k_tokens_flex": 9e-06, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "output_cost_per_token_batches": 6e-06, "output_cost_per_token_flex": 6e-06, @@ -33332,11 +33351,17 @@ }, "gemini-3-flash-preview": { "cache_read_input_audio_token_cost": 1e-07, + "cache_read_input_audio_token_cost_priority": 1.8e-07, "cache_read_input_token_cost": 5e-08, "cache_read_input_token_cost_priority": 9e-08, "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 1e-06, + "input_cost_per_audio_token_above_200k_tokens": 1e-06, + "input_cost_per_audio_token_above_200k_tokens_batches": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 1.8e-06, "input_cost_per_audio_token_batches": 5e-07, + "input_cost_per_audio_token_flex": 5e-07, "input_cost_per_audio_token_priority": 1.8e-06, "input_cost_per_token": 5e-07, "input_cost_per_token_batches": 2.5e-07, @@ -33352,7 +33377,7 @@ "output_cost_per_token_flex": 1.5e-06, "output_cost_per_token_priority": 5.4e-06, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -33607,8 +33632,6 @@ "google_maps_grounding_cost_per_query": 0.014 }, "gemini-3.8-flash": { - "deprecation_date": "2027-09-02", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 7.5e-08, "cache_read_input_token_cost_batches": 3.75e-08, "cache_read_input_token_cost_flex": 3.75e-08, @@ -33629,7 +33652,7 @@ "output_cost_per_token_priority": 6.75e-06, "prompt_cache_min_tokens": 4096.0, "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -53876,6 +53899,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, @@ -53911,6 +53935,7 @@ "output_cost_per_image": 0.134, "output_cost_per_image_token": 0.00012, "output_cost_per_image_token_batches": 6e-05, + "output_cost_per_image_token_priority": 0.000216, "output_cost_per_token": 1.2e-05, "output_cost_per_token_priority": 2.16e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -53945,6 +53970,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "output_cost_per_token_flex": 1.5e-06, @@ -53973,6 +53999,7 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_image_token_batches": 3e-05, + "output_cost_per_image_token_priority": 0.000108, "output_cost_per_token": 3e-06, "output_cost_per_token_batches": 1.5e-06, "supports_reasoning": false, @@ -53986,8 +54013,6 @@ }, "vertex_ai/gemini-3.1-flash-lite-image": { - "deprecation_date": "2027-06-28", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, @@ -54004,6 +54029,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 1.5e-06, "output_cost_per_token_batches": 7.5e-07, "output_cost_per_token_flex": 7.5e-07, @@ -54084,19 +54110,28 @@ }, "vertex_ai/gemini-3.1-flash-lite": { "cache_read_input_audio_token_cost": 5e-08, - "deprecation_date": "2027-05-07", "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", - "successor_model": "vertex_ai/gemini-3.5-flash-lite", + "cache_read_input_audio_token_cost_batches": 2.5e-08, + "cache_read_input_audio_token_cost_flex": 2.5e-08, + "cache_read_input_audio_token_cost_priority": 9e-08, "cache_read_input_token_cost": 2.5e-08, "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, "cache_read_input_token_cost_priority": 4.5e-08, + "deprecation_date": "2027-05-07", + "google_maps_grounding_cost_per_query": 0.014, "input_cost_per_audio_token": 5e-07, + "input_cost_per_audio_token_above_200k_tokens": 5e-07, + "input_cost_per_audio_token_above_200k_tokens_batches": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_flex": 2.5e-07, + "input_cost_per_audio_token_above_200k_tokens_priority": 9e-07, + "input_cost_per_audio_token_batches": 2.5e-07, + "input_cost_per_audio_token_flex": 2.5e-07, + "input_cost_per_audio_token_priority": 9e-07, "input_cost_per_token": 2.5e-07, "input_cost_per_token_batches": 1.25e-07, "input_cost_per_token_flex": 1.25e-07, "input_cost_per_token_priority": 4.5e-07, - "input_cost_per_audio_token_priority": 9e-07, "litellm_provider": "vertex_ai-language-models", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -54107,7 +54142,10 @@ "output_cost_per_token_flex": 7.5e-07, "output_cost_per_token_priority": 2.7e-06, "regional_endpoint_uplift_multiplier": 1.1, + "search_context_cost_per_query": {"search_context_size_low":0.014,"search_context_size_medium":0.014,"search_context_size_high":0.014}, + "search_free_requests": {"count":5000,"period":"month","shared_group":"gemini-3"}, "source": "https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing", + "successor_model": "vertex_ai/gemini-3.5-flash-lite", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -54125,6 +54163,7 @@ "supports_audio_input": true, "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, @@ -54136,16 +54175,7 @@ "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "supports_native_streaming": true, - "search_context_cost_per_query": { - "search_context_size_low": 0.014, - "search_context_size_medium": 0.014, - "search_context_size_high": 0.014 - }, - "search_free_requests": {"count": 5000, "period": "month", "shared_group": "gemini-3"}, - "web_search_billing_unit": "per_query", - "google_maps_grounding_cost_per_query": 0.014, - "input_cost_per_audio_token_batches": 2.5e-07 + "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-3.5-flash-lite": { "deprecation_date": "2027-07-21", @@ -77226,6 +77256,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 7.5e-06, "output_cost_per_token_batches": 3.75e-06, "output_cost_per_token_priority": 1.35e-05, @@ -77272,6 +77303,7 @@ "output_cost_per_image": 0.0336, "output_cost_per_image_token": 3e-05, "output_cost_per_image_token_batches": 1.5e-05, + "output_cost_per_image_token_priority": 5.4e-05, "output_cost_per_token": 7.5e-06, "output_cost_per_token_batches": 3.75e-06, "output_cost_per_token_priority": 1.35e-05, @@ -78395,8 +78427,6 @@ "web_search_billing_unit": "per_query" }, "vertex_ai/gemini-4-argon": { - "deprecation_date": "2027-10-13", - "deprecation_source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versions", "cache_read_input_token_cost": 1e-07, "cache_read_input_token_cost_batches": 5e-08, "cache_read_input_token_cost_flex": 5e-08, diff --git a/tests/unit/litellm_core_utils/llm_cost_calc/test_utils.py b/tests/unit/litellm_core_utils/llm_cost_calc/test_utils.py index b6c18e0da86..1d2a5e4cc9b 100644 --- a/tests/unit/litellm_core_utils/llm_cost_calc/test_utils.py +++ b/tests/unit/litellm_core_utils/llm_cost_calc/test_utils.py @@ -12,7 +12,7 @@ import litellm from litellm.integrations.custom_logger import CustomLogger from litellm.litellm_core_utils.logging_worker import GLOBAL_LOGGING_WORKER from litellm.types.llms.base import CachedTokensDetails -from litellm.types.utils import ModelResponse, PromptTokensDetailsWrapper, Usage +from litellm.types.utils import CompletionTokensDetailsWrapper, ModelResponse, PromptTokensDetailsWrapper, Usage TIER_MODEL: Final = "tier-priced-test-model" TIER_ROW: Final[Mapping[str, float]] = MappingProxyType( @@ -48,6 +48,190 @@ AUDIO_TIER_ROW: Final[Mapping[str, float]] = MappingProxyType( ) +@pytest.mark.parametrize("image_tokens", (60, 100)) +@pytest.mark.parametrize( + ("service_tier", "priority_rate", "image_rate"), + ((None, 11e-06, 7e-06), ("priority", 11e-06, 11e-06), ("flex", 11e-06, 7e-06), ("priority", 0.0, 0.0)), +) +def test_completion_cost_uses_priority_image_output_rate( + local_model_cost_map: None, service_tier: str | None, priority_rate: float, image_rate: float, image_tokens: int +) -> None: + model: Final = "gemini-synthetic-image-priority" + litellm.register_model( + { + model: { + "litellm_provider": "vertex_ai", + "mode": "chat", + "input_cost_per_token": 3e-06, + "output_cost_per_token": 5e-06, + "output_cost_per_image_token": 7e-06, + "output_cost_per_image_token_priority": priority_rate, + } + } + ) + response: Final = ModelResponse( + model=model, + usage=Usage( + prompt_tokens=20, + completion_tokens=100, + total_tokens=120, + completion_tokens_details=CompletionTokensDetailsWrapper(image_tokens=image_tokens), + ), + ) + cost: Final = litellm.completion_cost( + completion_response=response, model=model, custom_llm_provider="vertex_ai", service_tier=service_tier + ) + assert cost == pytest.approx(20 * 3e-06 + (100 - image_tokens) * 5e-06 + image_tokens * image_rate) + + +@pytest.mark.parametrize("prompt_tokens", (199_999, 200_000, 200_001)) +@pytest.mark.parametrize( + ("service_tier", "flat_rate", "context_rate"), + ((None, 7e-06, 11e-06), ("priority", 13e-06, 17e-06), ("flex", 19e-06, 23e-06)), +) +def test_completion_cost_uses_total_prompt_for_audio_context_tiers( + local_model_cost_map: None, prompt_tokens: int, service_tier: str | None, flat_rate: float, context_rate: float +) -> None: + model: Final = "gemini-synthetic-audio-context" + litellm.register_model( + { + model: { + "litellm_provider": "vertex_ai", + "mode": "chat", + "input_cost_per_token": 3e-06, + "output_cost_per_token": 5e-06, + "input_cost_per_audio_token": 7e-06, + "input_cost_per_audio_token_above_200k_tokens": 11e-06, + "input_cost_per_audio_token_priority": 13e-06, + "input_cost_per_audio_token_above_200k_tokens_priority": 17e-06, + "input_cost_per_audio_token_flex": 19e-06, + "input_cost_per_audio_token_above_200k_tokens_flex": 23e-06, + } + } + ) + response: Final = ModelResponse( + model=model, + usage=Usage( + prompt_tokens=prompt_tokens, + completion_tokens=10, + total_tokens=prompt_tokens + 10, + prompt_tokens_details=PromptTokensDetailsWrapper(audio_tokens=100), + ), + ) + cost: Final = litellm.completion_cost( + completion_response=response, model=model, custom_llm_provider="vertex_ai", service_tier=service_tier + ) + audio_rate: Final = context_rate if prompt_tokens > 200_000 else flat_rate + assert cost == pytest.approx((prompt_tokens - 100) * 3e-06 + 100 * audio_rate + 10 * 5e-06) + + +@pytest.mark.parametrize("prompt_tokens", (200_000, 200_001)) +def test_batch_cost_uses_audio_context_and_image_output_tiers(local_model_cost_map: None, prompt_tokens: int) -> None: + from litellm.cost_calculator import batch_cost_calculator + + model: Final = "gemini-synthetic-batch-audio-context" + litellm.register_model( + { + model: { + "litellm_provider": "vertex_ai", + "mode": "chat", + "input_cost_per_token": 6e-06, + "output_cost_per_token": 10e-06, + "input_cost_per_token_batches": 3e-06, + "output_cost_per_token_batches": 5e-06, + "input_cost_per_token_above_200k_tokens_batches": 13e-06, + "output_cost_per_token_above_200k_tokens_batches": 17e-06, + "output_cost_per_image_token_batches": 19e-06, + "input_cost_per_audio_token_batches": 7e-06, + "input_cost_per_audio_token_above_200k_tokens_batches": 11e-06, + } + } + ) + usage: Final = Usage( + prompt_tokens=prompt_tokens, + completion_tokens=20, + total_tokens=prompt_tokens + 20, + prompt_tokens_details=PromptTokensDetailsWrapper(audio_tokens=100), + completion_tokens_details=CompletionTokensDetailsWrapper(image_tokens=10), + ) + cost: Final = batch_cost_calculator(model=model, custom_llm_provider="vertex_ai", usage=usage) + audio_rate: Final = 11e-06 if prompt_tokens > 200_000 else 7e-06 + input_rate: Final = 13e-06 if prompt_tokens > 200_000 else 3e-06 + output_rate: Final = 17e-06 if prompt_tokens > 200_000 else 5e-06 + assert sum(cost) == pytest.approx( + (prompt_tokens - 100) * input_rate + 100 * audio_rate + 10 * output_rate + 10 * 19e-06 + ) + + +@pytest.mark.parametrize("prompt_tokens", (200_000, 200_001)) +def test_completion_cost_uses_flex_context_input_and_output_rates( + local_model_cost_map: None, prompt_tokens: int +) -> None: + model: Final = "gemini-synthetic-flex-context" + litellm.register_model( + { + model: { + "litellm_provider": "vertex_ai", + "mode": "chat", + "input_cost_per_token": 6e-06, + "output_cost_per_token": 10e-06, + "input_cost_per_token_flex": 3e-06, + "output_cost_per_token_flex": 5e-06, + "input_cost_per_token_above_200k_tokens_flex": 7e-06, + "output_cost_per_token_above_200k_tokens_flex": 11e-06, + } + } + ) + response: Final = ModelResponse( + model=model, usage=Usage(prompt_tokens=prompt_tokens, completion_tokens=10, total_tokens=prompt_tokens + 10) + ) + cost: Final = litellm.completion_cost( + completion_response=response, model=model, custom_llm_provider="vertex_ai", service_tier="flex" + ) + input_rate: Final = 7e-06 if prompt_tokens > 200_000 else 3e-06 + output_rate: Final = 11e-06 if prompt_tokens > 200_000 else 5e-06 + assert cost == pytest.approx(prompt_tokens * input_rate + 10 * output_rate) + + +@pytest.mark.parametrize( + ("audio_fields", "audio_rate"), + ( + ({}, 3e-06), + ({"input_cost_per_audio_token": 7e-06}, 7e-06), + ({"input_cost_per_audio_token_above_200k_tokens": 11e-06}, 11e-06), + ({"input_cost_per_audio_token_above_200k_tokens_priority": 0.0}, 0.0), + ), +) +def test_audio_context_rates_preserve_fallbacks_and_explicit_zero( + local_model_cost_map: None, audio_fields: Mapping[str, float], audio_rate: float +) -> None: + model: Final = "gemini-synthetic-audio-fallback" + litellm.register_model( + { + model: { + "litellm_provider": "vertex_ai", + "mode": "chat", + "input_cost_per_token": 3e-06, + "output_cost_per_token": 5e-06, + **audio_fields, + } + } + ) + response: Final = ModelResponse( + model=model, + usage=Usage( + prompt_tokens=200_001, + completion_tokens=10, + total_tokens=200_011, + prompt_tokens_details=PromptTokensDetailsWrapper(audio_tokens=100), + ), + ) + cost: Final = litellm.completion_cost( + completion_response=response, model=model, custom_llm_provider="vertex_ai", service_tier="priority" + ) + assert cost == pytest.approx(199_901 * 3e-06 + 100 * audio_rate + 10 * 5e-06) + + def _cost_at(prices: Mapping[str, float], column_suffix: str) -> float: return ( (PROMPT_TOKENS - CACHED_TOKENS) * prices[f"input_cost_per_token{column_suffix}"] diff --git a/tests/unit/test_model_prices_and_context_window.py b/tests/unit/test_model_prices_and_context_window.py index e9e7f17f80d..e195b970fd5 100644 --- a/tests/unit/test_model_prices_and_context_window.py +++ b/tests/unit/test_model_prices_and_context_window.py @@ -279,6 +279,10 @@ def test_azure_rows_price_web_search_when_their_openai_model_does(prices: dict): PRIORITY_SUFFIX: Final = "_priority" MIN_PRIORITY_MARKUP: Final = 1.0 MAX_PRIORITY_MARKUP: Final = 5.0 +# Vertex pricing, verified 2026-11-03: https://cloud.google.com/gemini-enterprise-agent-platform/generative-ai/pricing +VERIFIED_PRIORITY_MARKUP_MAXIMA: Final = MappingProxyType( + {("gemini-2.5-flash", "input_cost_per_audio_token_above_200k_tokens_priority"): 6.0} +) def _rate(value: JsonValue | None) -> float | None: @@ -312,7 +316,7 @@ def test_priority_rates_stay_within_a_premium_of_their_standard_rate(path: Path) overpriced: Final = tuple( f"{name}.{key} is {markup:.1f}x its standard rate" for name, key, markup in markups - if not MIN_PRIORITY_MARKUP <= markup <= MAX_PRIORITY_MARKUP + if not MIN_PRIORITY_MARKUP <= markup <= VERIFIED_PRIORITY_MARKUP_MAXIMA.get((name, key), MAX_PRIORITY_MARKUP) ) assert overpriced == (), ( "a priority rate is a premium on the standard rate, so one below it or far above it was likely copied from " diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 7ab82422c5d..65dfddfd492 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -1033,6 +1033,10 @@ _COST_MAP_ROW_SCHEMA: Final = { "google_maps_grounding_cost_per_query": {"type": "number"}, "input_cost_per_audio_token": {"type": "number"}, "input_cost_per_audio_token_flex": {"type": "number"}, + "input_cost_per_audio_token_above_200k_tokens": {"type": "number"}, + "input_cost_per_audio_token_above_200k_tokens_flex": {"type": "number"}, + "input_cost_per_audio_token_above_200k_tokens_priority": {"type": "number"}, + "input_cost_per_audio_token_above_200k_tokens_batches": {"type": "number"}, "input_cost_per_image_token": {"type": "number"}, "input_cost_per_character": {"type": "number"}, "input_cost_per_character_above_128k_tokens": {"type": "number"}, @@ -1044,6 +1048,7 @@ _COST_MAP_ROW_SCHEMA: Final = { "input_cost_per_token_above_100k_tokens_batches": {"type": "number"}, "input_cost_per_token_above_200k_tokens": {"type": "number"}, "input_cost_per_token_above_200k_tokens_batches": {"type": "number"}, + "input_cost_per_token_above_200k_tokens_flex": {"type": "number"}, "input_cost_per_token_above_256k_tokens": {"type": "number"}, "input_cost_per_token_above_272k_tokens": {"type": "number"}, "input_cost_per_token_above_512k_tokens": {"type": "number"}, @@ -1143,6 +1148,7 @@ _COST_MAP_ROW_SCHEMA: Final = { "output_cost_per_image_4K": {"type": "number"}, "output_cost_per_image_token": {"type": "number"}, "output_cost_per_image_token_batches": {"type": "number"}, + "output_cost_per_image_token_priority": {"type": "number"}, "output_cost_per_video_token": {"type": "number"}, "output_cost_per_pixel": {"type": "number"}, "output_cost_per_second": {"type": "number"}, @@ -1159,6 +1165,7 @@ _COST_MAP_ROW_SCHEMA: Final = { "output_cost_per_token_above_128k_tokens": {"type": "number"}, "output_cost_per_token_above_200k_tokens": {"type": "number"}, "output_cost_per_token_above_200k_tokens_batches": {"type": "number"}, + "output_cost_per_token_above_200k_tokens_flex": {"type": "number"}, "output_cost_per_token_above_256k_tokens": {"type": "number"}, "output_cost_per_token_above_272k_tokens": {"type": "number"}, "output_cost_per_token_above_512k_tokens": {"type": "number"}, @@ -1447,6 +1454,27 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): raise AssertionError(error_message) +def test_cost_map_schema_accepts_vertex_modality_and_context_tiers() -> None: + row: Final = { + "litellm_provider": "vertex_ai", + "mode": "chat", + "input_cost_per_token": 1e-6, + "output_cost_per_token": 2e-6, + "input_cost_per_token_above_200k_tokens_flex": 3e-6, + "output_cost_per_token_above_200k_tokens_flex": 4e-6, + "input_cost_per_token_above_200k_tokens_batches": 3e-6, + "output_cost_per_token_above_200k_tokens_batches": 4e-6, + "input_cost_per_audio_token_above_200k_tokens": 5e-6, + "input_cost_per_audio_token_above_200k_tokens_flex": 6e-6, + "input_cost_per_audio_token_above_200k_tokens_priority": 7e-6, + "input_cost_per_audio_token_above_200k_tokens_batches": 8e-6, + "output_cost_per_image_token_priority": 9e-6, + "output_cost_per_image_token_batches": 10e-6, + } + + assert Draft7Validator(_COST_MAP_ROW_SCHEMA).is_valid({"synthetic-vertex-tier-model": row}) + + def test_cost_map_schema_accepts_12hr_cache_write_rates_for_batch_and_ultrafast_tiers() -> None: row: Final = { "litellm_provider": "openai", @@ -11102,7 +11130,6 @@ def test_get_provider_audio_transcription_config_resolves_for_every_provider() - assert isinstance(configs[LlmProviders.OPENAI], litellm.OpenAIWhisperAudioTranscriptionConfig) - @pytest.mark.parametrize( ("custom_llm_provider", "model"), [ diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 5336035041b..e2e1210bc2a 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -35935,6 +35935,14 @@ export interface components { input_cost_per_audio_per_second_above_128k_tokens?: number | null; /** Input Cost Per Audio Token */ input_cost_per_audio_token?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens */ + input_cost_per_audio_token_above_200k_tokens?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens Batches */ + input_cost_per_audio_token_above_200k_tokens_batches?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens Flex */ + input_cost_per_audio_token_above_200k_tokens_flex?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens Priority */ + input_cost_per_audio_token_above_200k_tokens_priority?: number | null; /** Input Cost Per Audio Token Batches */ input_cost_per_audio_token_batches?: number | null; /** Input Cost Per Audio Token Flex */ @@ -35973,6 +35981,8 @@ export interface components { input_cost_per_token_above_200k_tokens?: number | null; /** Input Cost Per Token Above 200K Tokens Batches */ input_cost_per_token_above_200k_tokens_batches?: number | null; + /** Input Cost Per Token Above 200K Tokens Flex */ + input_cost_per_token_above_200k_tokens_flex?: number | null; /** Input Cost Per Token Above 200K Tokens Priority */ input_cost_per_token_above_200k_tokens_priority?: number | null; /** Input Cost Per Token Above 272K Tokens */ @@ -36080,6 +36090,8 @@ export interface components { output_cost_per_image_token?: number | null; /** Output Cost Per Image Token Batches */ output_cost_per_image_token_batches?: number | null; + /** Output Cost Per Image Token Priority */ + output_cost_per_image_token_priority?: number | null; /** Output Cost Per Pixel */ output_cost_per_pixel?: number | null; /** Output Cost Per Reasoning Token */ @@ -36114,6 +36126,8 @@ export interface components { output_cost_per_token_above_200k_tokens?: number | null; /** Output Cost Per Token Above 200K Tokens Batches */ output_cost_per_token_above_200k_tokens_batches?: number | null; + /** Output Cost Per Token Above 200K Tokens Flex */ + output_cost_per_token_above_200k_tokens_flex?: number | null; /** Output Cost Per Token Above 200K Tokens Priority */ output_cost_per_token_above_200k_tokens_priority?: number | null; /** Output Cost Per Token Above 272K Tokens */ @@ -51574,6 +51588,14 @@ export interface components { input_cost_per_audio_per_second_above_128k_tokens?: number | null; /** Input Cost Per Audio Token */ input_cost_per_audio_token?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens */ + input_cost_per_audio_token_above_200k_tokens?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens Batches */ + input_cost_per_audio_token_above_200k_tokens_batches?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens Flex */ + input_cost_per_audio_token_above_200k_tokens_flex?: number | null; + /** Input Cost Per Audio Token Above 200K Tokens Priority */ + input_cost_per_audio_token_above_200k_tokens_priority?: number | null; /** Input Cost Per Audio Token Batches */ input_cost_per_audio_token_batches?: number | null; /** Input Cost Per Audio Token Flex */ @@ -51612,6 +51634,8 @@ export interface components { input_cost_per_token_above_200k_tokens?: number | null; /** Input Cost Per Token Above 200K Tokens Batches */ input_cost_per_token_above_200k_tokens_batches?: number | null; + /** Input Cost Per Token Above 200K Tokens Flex */ + input_cost_per_token_above_200k_tokens_flex?: number | null; /** Input Cost Per Token Above 200K Tokens Priority */ input_cost_per_token_above_200k_tokens_priority?: number | null; /** Input Cost Per Token Above 272K Tokens */ @@ -51719,6 +51743,8 @@ export interface components { output_cost_per_image_token?: number | null; /** Output Cost Per Image Token Batches */ output_cost_per_image_token_batches?: number | null; + /** Output Cost Per Image Token Priority */ + output_cost_per_image_token_priority?: number | null; /** Output Cost Per Pixel */ output_cost_per_pixel?: number | null; /** Output Cost Per Reasoning Token */ @@ -51753,6 +51779,8 @@ export interface components { output_cost_per_token_above_200k_tokens?: number | null; /** Output Cost Per Token Above 200K Tokens Batches */ output_cost_per_token_above_200k_tokens_batches?: number | null; + /** Output Cost Per Token Above 200K Tokens Flex */ + output_cost_per_token_above_200k_tokens_flex?: number | null; /** Output Cost Per Token Above 200K Tokens Priority */ output_cost_per_token_above_200k_tokens_priority?: number | null; /** Output Cost Per Token Above 272K Tokens */