From d8f139fe4dfadb2f60727bf5e8c6ccbf0196917c Mon Sep 17 00:00:00 2001 From: Sameer Kankute Date: Fri, 6 Mar 2026 22:26:14 +0530 Subject: [PATCH] feat(openai): add 272K tier pricing for GPT-5.4/5.4-pro Prompts >272K input tokens priced at 2x input, 1.5x output for full session (standard, batch, flex). Applies to models with 1.05M context window (gpt-5.4, gpt-5.4-pro). - Add input/output_cost_per_token_above_272k_tokens to model_prices - Add above_272k fields to ModelInfoBase and get_model_info extraction - Add test_generic_cost_per_token_gpt54_above_272k_tokens Made-with: Cursor --- ...odel_prices_and_context_window_backup.json | 24 +++++++++++++++++ litellm/types/utils.py | 7 +++++ litellm/utils.py | 9 +++++++ model_prices_and_context_window.json | 24 +++++++++++++++++ .../llm_cost_calc/test_llm_cost_calc_utils.py | 26 +++++++++++++++++++ tests/test_litellm/test_utils.py | 10 +++++++ 6 files changed, 100 insertions(+) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 03e03bf51e..f1ca7cd83b 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -20932,16 +20932,22 @@ }, "gpt-5.4": { "cache_read_input_token_cost": 2.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 5e-07, "cache_read_input_token_cost_priority": 5e-07, + "cache_read_input_token_cost_above_272k_tokens_priority": 1e-06, "input_cost_per_token": 2.5e-06, + "input_cost_per_token_above_272k_tokens": 5e-06, "input_cost_per_token_priority": 5e-06, + "input_cost_per_token_above_272k_tokens_priority": 1e-05, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.5e-05, + "output_cost_per_token_above_272k_tokens": 2.25e-05, "output_cost_per_token_priority": 2.25e-05, + "output_cost_per_token_above_272k_tokens_priority": 3.375e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20970,16 +20976,22 @@ }, "gpt-5.4-2026-03-05": { "cache_read_input_token_cost": 2.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 5e-07, "cache_read_input_token_cost_priority": 5e-07, + "cache_read_input_token_cost_above_272k_tokens_priority": 1e-06, "input_cost_per_token": 2.5e-06, + "input_cost_per_token_above_272k_tokens": 5e-06, "input_cost_per_token_priority": 5e-06, + "input_cost_per_token_above_272k_tokens_priority": 1e-05, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.5e-05, + "output_cost_per_token_above_272k_tokens": 2.25e-05, "output_cost_per_token_priority": 2.25e-05, + "output_cost_per_token_above_272k_tokens_priority": 3.375e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21006,16 +21018,22 @@ }, "gpt-5.4-pro": { "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, "cache_read_input_token_cost_priority": 6e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 1.2e-05, "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, "input_cost_per_token_priority": 6e-05, + "input_cost_per_token_above_272k_tokens_priority": 1.2e-04, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.8e-04, + "output_cost_per_token_above_272k_tokens": 2.7e-04, "output_cost_per_token_priority": 2.7e-04, + "output_cost_per_token_above_272k_tokens_priority": 4.05e-04, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21045,16 +21063,22 @@ }, "gpt-5.4-pro-2026-03-05": { "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, "cache_read_input_token_cost_priority": 6e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 1.2e-05, "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, "input_cost_per_token_priority": 6e-05, + "input_cost_per_token_above_272k_tokens_priority": 1.2e-04, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.8e-04, + "output_cost_per_token_above_272k_tokens": 2.7e-04, "output_cost_per_token_priority": 2.7e-04, + "output_cost_per_token_above_272k_tokens_priority": 4.05e-04, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 4a7be0d677..fb646f7534 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -183,12 +183,16 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): float ] # OpenAI priority service tier pricing cache_read_input_token_cost_above_200k_tokens: Optional[float] + cache_read_input_token_cost_above_272k_tokens: Optional[float] input_cost_per_character: Optional[float] # only for vertex ai models input_cost_per_audio_token: Optional[float] input_cost_per_token_above_128k_tokens: Optional[float] # only for vertex ai models input_cost_per_token_above_200k_tokens: Optional[ float ] # only for vertex ai gemini-2.5-pro models + input_cost_per_token_above_272k_tokens: Optional[ + float + ] # GPT-5.4/5.4-pro: prompts >272K priced at 2x input input_cost_per_character_above_128k_tokens: Optional[ float ] # only for vertex ai models @@ -213,6 +217,9 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False): output_cost_per_token_above_200k_tokens: Optional[ float ] # only for vertex ai gemini-2.5-pro models + output_cost_per_token_above_272k_tokens: Optional[ + float + ] # GPT-5.4/5.4-pro: prompts >272K priced at 1.5x output output_cost_per_character_above_128k_tokens: Optional[ float ] # only for vertex ai models diff --git a/litellm/utils.py b/litellm/utils.py index d764cc81e7..72423f8483 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5639,6 +5639,9 @@ def _get_model_info_helper( # noqa: PLR0915 cache_read_input_token_cost_above_200k_tokens=_model_info.get( "cache_read_input_token_cost_above_200k_tokens", None ), + cache_read_input_token_cost_above_272k_tokens=_model_info.get( + "cache_read_input_token_cost_above_272k_tokens", None + ), cache_read_input_token_cost_flex=_model_info.get( "cache_read_input_token_cost_flex", None ), @@ -5657,6 +5660,9 @@ def _get_model_info_helper( # noqa: PLR0915 input_cost_per_token_above_200k_tokens=_model_info.get( "input_cost_per_token_above_200k_tokens", None ), + input_cost_per_token_above_272k_tokens=_model_info.get( + "input_cost_per_token_above_272k_tokens", None + ), input_cost_per_query=_model_info.get("input_cost_per_query", None), input_cost_per_second=_model_info.get("input_cost_per_second", None), input_cost_per_audio_token=_model_info.get( @@ -5703,6 +5709,9 @@ def _get_model_info_helper( # noqa: PLR0915 output_cost_per_token_above_200k_tokens=_model_info.get( "output_cost_per_token_above_200k_tokens", None ), + output_cost_per_token_above_272k_tokens=_model_info.get( + "output_cost_per_token_above_272k_tokens", None + ), output_cost_per_second=_model_info.get("output_cost_per_second", None), output_cost_per_video_per_second=_model_info.get( "output_cost_per_video_per_second", None diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 03e03bf51e..f1ca7cd83b 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -20932,16 +20932,22 @@ }, "gpt-5.4": { "cache_read_input_token_cost": 2.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 5e-07, "cache_read_input_token_cost_priority": 5e-07, + "cache_read_input_token_cost_above_272k_tokens_priority": 1e-06, "input_cost_per_token": 2.5e-06, + "input_cost_per_token_above_272k_tokens": 5e-06, "input_cost_per_token_priority": 5e-06, + "input_cost_per_token_above_272k_tokens_priority": 1e-05, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.5e-05, + "output_cost_per_token_above_272k_tokens": 2.25e-05, "output_cost_per_token_priority": 2.25e-05, + "output_cost_per_token_above_272k_tokens_priority": 3.375e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -20970,16 +20976,22 @@ }, "gpt-5.4-2026-03-05": { "cache_read_input_token_cost": 2.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 5e-07, "cache_read_input_token_cost_priority": 5e-07, + "cache_read_input_token_cost_above_272k_tokens_priority": 1e-06, "input_cost_per_token": 2.5e-06, + "input_cost_per_token_above_272k_tokens": 5e-06, "input_cost_per_token_priority": 5e-06, + "input_cost_per_token_above_272k_tokens_priority": 1e-05, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.5e-05, + "output_cost_per_token_above_272k_tokens": 2.25e-05, "output_cost_per_token_priority": 2.25e-05, + "output_cost_per_token_above_272k_tokens_priority": 3.375e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21006,16 +21018,22 @@ }, "gpt-5.4-pro": { "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, "cache_read_input_token_cost_priority": 6e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 1.2e-05, "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, "input_cost_per_token_priority": 6e-05, + "input_cost_per_token_above_272k_tokens_priority": 1.2e-04, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.8e-04, + "output_cost_per_token_above_272k_tokens": 2.7e-04, "output_cost_per_token_priority": 2.7e-04, + "output_cost_per_token_above_272k_tokens_priority": 4.05e-04, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21045,16 +21063,22 @@ }, "gpt-5.4-pro-2026-03-05": { "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, "cache_read_input_token_cost_priority": 6e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 1.2e-05, "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, "input_cost_per_token_priority": 6e-05, + "input_cost_per_token_above_272k_tokens_priority": 1.2e-04, "litellm_provider": "openai", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 1.8e-04, + "output_cost_per_token_above_272k_tokens": 2.7e-04, "output_cost_per_token_priority": 2.7e-04, + "output_cost_per_token_above_272k_tokens_priority": 4.05e-04, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", 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 2e033b6f06..91e8da886d 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 @@ -295,6 +295,32 @@ def test_generic_cost_per_token_above_200k_tokens(): ) +def test_generic_cost_per_token_gpt54_above_272k_tokens(): + """GPT-5.4/5.4-pro: prompts >272K input tokens priced at 2x input, 1.5x output.""" + model = "gpt-5.4" + custom_llm_provider = "openai" + os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" + litellm.model_cost = litellm.get_model_cost_map(url="") + + model_cost_map = litellm.model_cost[model] + prompt_tokens = 273000 # Above 272K threshold + completion_tokens = 1000 + usage = Usage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=prompt_tokens + completion_tokens, + ) + prompt_cost, completion_cost = generic_cost_per_token( + model=model, + usage=usage, + custom_llm_provider=custom_llm_provider, + ) + expected_prompt = model_cost_map["input_cost_per_token_above_272k_tokens"] * prompt_tokens + expected_completion = model_cost_map["output_cost_per_token_above_272k_tokens"] * completion_tokens + assert round(prompt_cost, 10) == round(expected_prompt, 10) + assert round(completion_cost, 10) == round(expected_completion, 10) + + def test_generic_cost_per_token_anthropic_prompt_caching(): model = "claude-sonnet-4@20250514" usage = Usage( diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 952cf5ed70..70818af547 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -513,6 +513,8 @@ def validate_model_cost_values(model_data, exceptions=None): "output_cost_per_token_above_128k_tokens", "input_cost_per_token_above_200k_tokens", "output_cost_per_token_above_200k_tokens", + "input_cost_per_token_above_272k_tokens", + "output_cost_per_token_above_272k_tokens", "input_cost_per_character_above_128k_tokens", "output_cost_per_character_above_128k_tokens", "input_cost_per_image_above_128k_tokens", @@ -603,6 +605,7 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): "cache_creation_input_token_cost_above_200k_tokens": {"type": "number"}, "cache_read_input_token_cost": {"type": "number"}, "cache_read_input_token_cost_above_200k_tokens": {"type": "number"}, + "cache_read_input_token_cost_above_272k_tokens": {"type": "number"}, "cache_creation_input_token_cost_above_1hr_above_200k_tokens": {"type": "number"}, "cache_read_input_audio_token_cost": {"type": "number"}, "cache_read_input_token_cost_per_audio_token": {"type": "number"}, @@ -618,16 +621,20 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): "input_cost_per_image_above_128k_tokens": {"type": "number"}, "input_cost_per_image_token": {"type": "number"}, "input_cost_per_token_above_200k_tokens": {"type": "number"}, + "input_cost_per_token_above_272k_tokens": {"type": "number"}, "cache_read_input_token_cost_flex": {"type": "number"}, "cache_read_input_token_cost_priority": {"type": "number"}, "cache_read_input_token_cost_above_200k_tokens_priority": {"type": "number"}, + "cache_read_input_token_cost_above_272k_tokens_priority": {"type": "number"}, "input_cost_per_token_flex": {"type": "number"}, "input_cost_per_token_priority": {"type": "number"}, "input_cost_per_token_above_200k_tokens_priority": {"type": "number"}, + "input_cost_per_token_above_272k_tokens_priority": {"type": "number"}, "input_cost_per_audio_token_priority": {"type": "number"}, "output_cost_per_token_flex": {"type": "number"}, "output_cost_per_token_priority": {"type": "number"}, "output_cost_per_token_above_200k_tokens_priority": {"type": "number"}, + "output_cost_per_token_above_272k_tokens_priority": {"type": "number"}, "input_cost_per_pixel": {"type": "number"}, "input_cost_per_query": {"type": "number"}, "input_cost_per_request": {"type": "number"}, @@ -694,6 +701,7 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): "output_cost_per_token": {"type": "number"}, "output_cost_per_token_above_128k_tokens": {"type": "number"}, "output_cost_per_token_above_200k_tokens": {"type": "number"}, + "output_cost_per_token_above_272k_tokens": {"type": "number"}, "output_cost_per_image_above_1024_and_1024_pixels": {"type": "number"}, "output_cost_per_image_above_1024_and_1024_pixels_and_premium_image": { "type": "number" @@ -732,6 +740,8 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): "supports_web_search": {"type": "boolean"}, "supports_url_context": {"type": "boolean"}, "supports_reasoning": {"type": "boolean"}, + "supports_none_reasoning_effort": {"type": "boolean"}, + "supports_xhigh_reasoning_effort": {"type": "boolean"}, "supports_service_tier": {"type": "boolean"}, "supports_preset": {"type": "boolean"}, "tool_use_system_prompt_tokens": {"type": "number"},