feat(cost): support OpenAI regional/data-residency 10% uplift via service_tier="regional"

OpenAI now charges a 10% premium when using regional/data-residency
processing on the latest GPT models
(https://developers.openai.com/api/docs/pricing). Cost tracking is
incorrect for requests that opt into regional processing today.

Add a "regional" value to the ServiceTier enum and `*_regional` cost
keys to ModelInfoBase / CustomPricingLiteLLMParams / get_model_info().
Add 10% uplifted regional pricing entries to every OpenAI model in
model_prices_and_context_window.json that already has priority-tier
pricing (gpt-5 family, gpt-5.x family, gpt-4.1 family, gpt-4o family,
o3, o4-mini), including above-272k-tokens variants on gpt-5.4/5.5.

Generalize _get_service_tier_cost_key to iterate ServiceTier rather
than hardcoding flex/priority, so future tiers slot in automatically.

The existing service_tier resolution logic (optional_params, response
attribute, usage attribute) already covers the customer-facing API
surface — passing service_tier="regional" anywhere now produces the
correct cost.
This commit is contained in:
mateo-berri 2026-05-17 06:05:06 +00:00
parent a72414a061
commit cd10c06811
No known key found for this signature in database
8 changed files with 478 additions and 3 deletions

View file

@ -143,7 +143,7 @@ def _get_service_tier_cost_key(base_key: str, service_tier: Optional[str]) -> st
Args:
base_key: The base cost key (e.g., "input_cost_per_token")
service_tier: The service tier ("flex", "priority", or None for standard)
service_tier: The service tier ("flex", "priority", "regional", or None for standard)
Returns:
str: The cost key to use (e.g., "input_cost_per_token_flex" or "input_cost_per_token")
@ -151,8 +151,9 @@ def _get_service_tier_cost_key(base_key: str, service_tier: Optional[str]) -> st
if service_tier is None:
return base_key
# Only use service tier specific keys for "flex" and "priority"
if service_tier.lower() in [ServiceTier.FLEX.value, ServiceTier.PRIORITY.value]:
# Only use service tier specific keys for known tiers
known_tiers = {tier.value for tier in ServiceTier}
if service_tier.lower() in known_tiers:
return f"{base_key}_{service_tier.lower()}"
# For any other service tier, use standard pricing

View file

@ -18631,8 +18631,10 @@
},
"gpt-4.1": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_priority": 8.75e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_regional": 2.2e-06,
"input_cost_per_token_batches": 1e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
@ -18641,6 +18643,7 @@
"max_tokens": 32768,
"mode": "chat",
"output_cost_per_token": 8e-06,
"output_cost_per_token_regional": 8.8e-06,
"output_cost_per_token_batches": 4e-06,
"output_cost_per_token_priority": 1.4e-05,
"supported_endpoints": [
@ -18704,8 +18707,10 @@
},
"gpt-4.1-mini": {
"cache_read_input_token_cost": 1e-07,
"cache_read_input_token_cost_regional": 1.1e-07,
"cache_read_input_token_cost_priority": 1.75e-07,
"input_cost_per_token": 4e-07,
"input_cost_per_token_regional": 4.4e-07,
"input_cost_per_token_batches": 2e-07,
"input_cost_per_token_priority": 7e-07,
"litellm_provider": "openai",
@ -18714,6 +18719,7 @@
"max_tokens": 32768,
"mode": "chat",
"output_cost_per_token": 1.6e-06,
"output_cost_per_token_regional": 1.76e-06,
"output_cost_per_token_batches": 8e-07,
"output_cost_per_token_priority": 2.8e-06,
"supported_endpoints": [
@ -18777,8 +18783,10 @@
},
"gpt-4.1-nano": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_priority": 5e-08,
"input_cost_per_token": 1e-07,
"input_cost_per_token_regional": 1.1e-07,
"input_cost_per_token_batches": 5e-08,
"input_cost_per_token_priority": 2e-07,
"litellm_provider": "openai",
@ -18787,6 +18795,7 @@
"max_tokens": 32768,
"mode": "chat",
"output_cost_per_token": 4e-07,
"output_cost_per_token_regional": 4.4e-07,
"output_cost_per_token_batches": 2e-07,
"output_cost_per_token_priority": 8e-07,
"supported_endpoints": [
@ -18848,8 +18857,10 @@
},
"gpt-4o": {
"cache_read_input_token_cost": 1.25e-06,
"cache_read_input_token_cost_regional": 1.375e-06,
"cache_read_input_token_cost_priority": 2.125e-06,
"input_cost_per_token": 2.5e-06,
"input_cost_per_token_regional": 2.75e-06,
"input_cost_per_token_batches": 1.25e-06,
"input_cost_per_token_priority": 4.25e-06,
"litellm_provider": "openai",
@ -18858,6 +18869,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_batches": 5e-06,
"output_cost_per_token_priority": 1.7e-05,
"supports_function_calling": true,
@ -18872,6 +18884,7 @@
},
"gpt-4o-2024-05-13": {
"input_cost_per_token": 5e-06,
"input_cost_per_token_regional": 5.5e-06,
"input_cost_per_token_batches": 2.5e-06,
"input_cost_per_token_priority": 8.75e-06,
"litellm_provider": "openai",
@ -18880,6 +18893,7 @@
"max_tokens": 4096,
"mode": "chat",
"output_cost_per_token": 1.5e-05,
"output_cost_per_token_regional": 1.65e-05,
"output_cost_per_token_batches": 7.5e-06,
"output_cost_per_token_priority": 2.625e-05,
"supports_function_calling": true,
@ -19198,8 +19212,10 @@
},
"gpt-4o-mini": {
"cache_read_input_token_cost": 7.5e-08,
"cache_read_input_token_cost_regional": 8.25e-08,
"cache_read_input_token_cost_priority": 1.25e-07,
"input_cost_per_token": 1.5e-07,
"input_cost_per_token_regional": 1.65e-07,
"input_cost_per_token_batches": 7.5e-08,
"input_cost_per_token_priority": 2.5e-07,
"litellm_provider": "openai",
@ -19208,6 +19224,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 6e-07,
"output_cost_per_token_regional": 6.6e-07,
"output_cost_per_token_batches": 3e-07,
"output_cost_per_token_priority": 1e-06,
"supports_function_calling": true,
@ -19900,9 +19917,11 @@
},
"gpt-5": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_flex": 6.25e-08,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_flex": 6.25e-07,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
@ -19911,6 +19930,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_flex": 5e-06,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
@ -19943,8 +19963,10 @@
},
"gpt-5.1": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -19952,6 +19974,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -19983,8 +20006,10 @@
},
"gpt-5.1-2025-11-13": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -19992,6 +20017,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20023,8 +20049,10 @@
},
"gpt-5.1-chat-latest": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 128000,
@ -20032,6 +20060,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20062,8 +20091,10 @@
},
"gpt-5.2": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -20071,6 +20102,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20103,8 +20135,10 @@
},
"gpt-5.2-2025-12-11": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -20112,6 +20146,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20144,8 +20179,10 @@
},
"gpt-5.2-chat-latest": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 128000,
@ -20153,6 +20190,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20182,8 +20220,10 @@
},
"gpt-5.3-chat-latest": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 128000,
@ -20191,6 +20231,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20288,11 +20329,15 @@
},
"gpt-5.5": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_above_272k_tokens": 1e-06,
"cache_read_input_token_cost_above_272k_tokens_regional": 1.1e-06,
"cache_read_input_token_cost_flex": 2.5e-07,
"cache_read_input_token_cost_priority": 1e-06,
"input_cost_per_token": 5e-06,
"input_cost_per_token_regional": 5.5e-06,
"input_cost_per_token_above_272k_tokens": 1e-05,
"input_cost_per_token_above_272k_tokens_regional": 1.1e-05,
"input_cost_per_token_flex": 2.5e-06,
"input_cost_per_token_batches": 2.5e-06,
"input_cost_per_token_priority": 1e-05,
@ -20302,7 +20347,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 3e-05,
"output_cost_per_token_regional": 3.3e-05,
"output_cost_per_token_above_272k_tokens": 4.5e-05,
"output_cost_per_token_above_272k_tokens_regional": 4.95e-05,
"output_cost_per_token_flex": 1.5e-05,
"output_cost_per_token_batches": 1.5e-05,
"output_cost_per_token_priority": 6e-05,
@ -20336,11 +20383,15 @@
},
"gpt-5.5-2026-04-23": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_above_272k_tokens": 1e-06,
"cache_read_input_token_cost_above_272k_tokens_regional": 1.1e-06,
"cache_read_input_token_cost_flex": 2.5e-07,
"cache_read_input_token_cost_priority": 1e-06,
"input_cost_per_token": 5e-06,
"input_cost_per_token_regional": 5.5e-06,
"input_cost_per_token_above_272k_tokens": 1e-05,
"input_cost_per_token_above_272k_tokens_regional": 1.1e-05,
"input_cost_per_token_flex": 2.5e-06,
"input_cost_per_token_batches": 2.5e-06,
"input_cost_per_token_priority": 1e-05,
@ -20350,7 +20401,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 3e-05,
"output_cost_per_token_regional": 3.3e-05,
"output_cost_per_token_above_272k_tokens": 4.5e-05,
"output_cost_per_token_above_272k_tokens_regional": 4.95e-05,
"output_cost_per_token_flex": 1.5e-05,
"output_cost_per_token_batches": 1.5e-05,
"output_cost_per_token_priority": 6e-05,
@ -20472,11 +20525,15 @@
},
"gpt-5.4": {
"cache_read_input_token_cost": 2.5e-07,
"cache_read_input_token_cost_regional": 2.75e-07,
"cache_read_input_token_cost_above_272k_tokens": 5e-07,
"cache_read_input_token_cost_above_272k_tokens_regional": 5.5e-07,
"cache_read_input_token_cost_flex": 1.3e-07,
"cache_read_input_token_cost_priority": 5e-07,
"input_cost_per_token": 2.5e-06,
"input_cost_per_token_regional": 2.75e-06,
"input_cost_per_token_above_272k_tokens": 5e-06,
"input_cost_per_token_above_272k_tokens_regional": 5.5e-06,
"input_cost_per_token_flex": 1.25e-06,
"input_cost_per_token_batches": 1.25e-06,
"input_cost_per_token_priority": 5e-06,
@ -20486,7 +20543,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.5e-05,
"output_cost_per_token_regional": 1.65e-05,
"output_cost_per_token_above_272k_tokens": 2.25e-05,
"output_cost_per_token_above_272k_tokens_regional": 2.475e-05,
"output_cost_per_token_flex": 7.5e-06,
"output_cost_per_token_batches": 7.5e-06,
"output_cost_per_token_priority": 3e-05,
@ -20519,11 +20578,15 @@
},
"gpt-5.4-2026-03-05": {
"cache_read_input_token_cost": 2.5e-07,
"cache_read_input_token_cost_regional": 2.75e-07,
"cache_read_input_token_cost_above_272k_tokens": 5e-07,
"cache_read_input_token_cost_above_272k_tokens_regional": 5.5e-07,
"cache_read_input_token_cost_flex": 1.3e-07,
"cache_read_input_token_cost_priority": 5e-07,
"input_cost_per_token": 2.5e-06,
"input_cost_per_token_regional": 2.75e-06,
"input_cost_per_token_above_272k_tokens": 5e-06,
"input_cost_per_token_above_272k_tokens_regional": 5.5e-06,
"input_cost_per_token_flex": 1.25e-06,
"input_cost_per_token_batches": 1.25e-06,
"input_cost_per_token_priority": 5e-06,
@ -20533,7 +20596,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.5e-05,
"output_cost_per_token_regional": 1.65e-05,
"output_cost_per_token_above_272k_tokens": 2.25e-05,
"output_cost_per_token_above_272k_tokens_regional": 2.475e-05,
"output_cost_per_token_flex": 7.5e-06,
"output_cost_per_token_batches": 7.5e-06,
"output_cost_per_token_priority": 3e-05,
@ -20649,10 +20714,12 @@
},
"gpt-5.4-mini": {
"cache_read_input_token_cost": 7.5e-08,
"cache_read_input_token_cost_regional": 8.25e-08,
"cache_read_input_token_cost_flex": 3.75e-08,
"cache_read_input_token_cost_batches": 3.75e-08,
"cache_read_input_token_cost_priority": 1.5e-07,
"input_cost_per_token": 7.5e-07,
"input_cost_per_token_regional": 8.25e-07,
"input_cost_per_token_flex": 3.75e-07,
"input_cost_per_token_batches": 3.75e-07,
"input_cost_per_token_priority": 1.5e-06,
@ -20662,6 +20729,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 4.5e-06,
"output_cost_per_token_regional": 4.95e-06,
"output_cost_per_token_flex": 2.25e-06,
"output_cost_per_token_batches": 2.25e-06,
"output_cost_per_token_priority": 9e-06,
@ -20695,10 +20763,12 @@
},
"gpt-5.4-mini-2026-03-17": {
"cache_read_input_token_cost": 7.5e-08,
"cache_read_input_token_cost_regional": 8.25e-08,
"cache_read_input_token_cost_flex": 3.75e-08,
"cache_read_input_token_cost_batches": 3.75e-08,
"cache_read_input_token_cost_priority": 1.5e-07,
"input_cost_per_token": 7.5e-07,
"input_cost_per_token_regional": 8.25e-07,
"input_cost_per_token_flex": 3.75e-07,
"input_cost_per_token_batches": 3.75e-07,
"input_cost_per_token_priority": 1.5e-06,
@ -20708,6 +20778,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 4.5e-06,
"output_cost_per_token_regional": 4.95e-06,
"output_cost_per_token_flex": 2.25e-06,
"output_cost_per_token_batches": 2.25e-06,
"output_cost_per_token_priority": 9e-06,
@ -20899,9 +20970,11 @@
},
"gpt-5-2025-08-07": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_flex": 6.25e-08,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_flex": 6.25e-07,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
@ -20910,6 +20983,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_flex": 5e-06,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
@ -21046,8 +21120,10 @@
},
"gpt-5.1-codex": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21055,6 +21131,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/responses"
@ -21117,8 +21194,10 @@
},
"gpt-5.1-codex-mini": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_priority": 4.5e-08,
"input_cost_per_token": 2.5e-07,
"input_cost_per_token_regional": 2.75e-07,
"input_cost_per_token_priority": 4.5e-07,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21126,6 +21205,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 2e-06,
"output_cost_per_token_regional": 2.2e-06,
"output_cost_per_token_priority": 3.6e-06,
"supported_endpoints": [
"/v1/responses"
@ -21154,8 +21234,10 @@
},
"gpt-5.2-codex": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21163,6 +21245,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/responses"
@ -21191,8 +21274,10 @@
},
"gpt-5.3-codex": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21200,6 +21285,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/responses"
@ -21228,9 +21314,11 @@
},
"gpt-5-mini": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_flex": 1.25e-08,
"cache_read_input_token_cost_priority": 4.5e-08,
"input_cost_per_token": 2.5e-07,
"input_cost_per_token_regional": 2.75e-07,
"input_cost_per_token_flex": 1.25e-07,
"input_cost_per_token_priority": 4.5e-07,
"litellm_provider": "openai",
@ -21239,6 +21327,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 2e-06,
"output_cost_per_token_regional": 2.2e-06,
"output_cost_per_token_flex": 1e-06,
"output_cost_per_token_priority": 3.6e-06,
"supported_endpoints": [
@ -21271,9 +21360,11 @@
},
"gpt-5-mini-2025-08-07": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_flex": 1.25e-08,
"cache_read_input_token_cost_priority": 4.5e-08,
"input_cost_per_token": 2.5e-07,
"input_cost_per_token_regional": 2.75e-07,
"input_cost_per_token_flex": 1.25e-07,
"input_cost_per_token_priority": 4.5e-07,
"litellm_provider": "openai",
@ -21282,6 +21373,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 2e-06,
"output_cost_per_token_regional": 2.2e-06,
"output_cost_per_token_flex": 1e-06,
"output_cost_per_token_priority": 3.6e-06,
"supported_endpoints": [
@ -21314,8 +21406,10 @@
},
"gpt-5-nano": {
"cache_read_input_token_cost": 5e-09,
"cache_read_input_token_cost_regional": 5.5e-09,
"cache_read_input_token_cost_flex": 2.5e-09,
"input_cost_per_token": 5e-08,
"input_cost_per_token_regional": 5.5e-08,
"input_cost_per_token_flex": 2.5e-08,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
@ -21324,6 +21418,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 4e-07,
"output_cost_per_token_regional": 4.4e-07,
"output_cost_per_token_flex": 2e-07,
"supported_endpoints": [
"/v1/chat/completions",
@ -25259,9 +25354,11 @@
},
"o3": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_flex": 2.5e-07,
"cache_read_input_token_cost_priority": 8.75e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_regional": 2.2e-06,
"input_cost_per_token_flex": 1e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
@ -25270,6 +25367,7 @@
"max_tokens": 100000,
"mode": "chat",
"output_cost_per_token": 8e-06,
"output_cost_per_token_regional": 8.8e-06,
"output_cost_per_token_flex": 4e-06,
"output_cost_per_token_priority": 1.4e-05,
"supported_endpoints": [
@ -25495,9 +25593,11 @@
},
"o4-mini": {
"cache_read_input_token_cost": 2.75e-07,
"cache_read_input_token_cost_regional": 3.025e-07,
"cache_read_input_token_cost_flex": 1.375e-07,
"cache_read_input_token_cost_priority": 5e-07,
"input_cost_per_token": 1.1e-06,
"input_cost_per_token_regional": 1.21e-06,
"input_cost_per_token_flex": 5.5e-07,
"input_cost_per_token_priority": 2e-06,
"litellm_provider": "openai",
@ -25506,6 +25606,7 @@
"max_tokens": 100000,
"mode": "chat",
"output_cost_per_token": 4.4e-06,
"output_cost_per_token_regional": 4.84e-06,
"output_cost_per_token_flex": 2.2e-06,
"output_cost_per_token_priority": 8e-06,
"supports_function_calling": true,

View file

@ -177,6 +177,9 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False):
input_cost_per_token_priority: Optional[
float
] # OpenAI priority service tier pricing
input_cost_per_token_regional: Optional[
float
] # OpenAI regional/data-residency processing pricing (10% uplift)
cache_creation_input_token_cost: Optional[float]
cache_creation_input_token_cost_above_200k_tokens: Optional[float]
cache_creation_input_token_cost_above_1hr: Optional[float]
@ -187,8 +190,14 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False):
cache_read_input_token_cost_priority: Optional[
float
] # OpenAI priority service tier pricing
cache_read_input_token_cost_regional: Optional[
float
] # OpenAI regional/data-residency processing pricing (10% uplift)
cache_read_input_token_cost_above_200k_tokens: Optional[float]
cache_read_input_token_cost_above_272k_tokens: Optional[float]
cache_read_input_token_cost_above_272k_tokens_regional: Optional[
float
] # OpenAI regional/data-residency processing pricing (10% uplift) for prompts >272K
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
@ -198,6 +207,9 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False):
input_cost_per_token_above_272k_tokens: Optional[
float
] # GPT-5.4/5.4-pro: prompts >272K priced at 2x input
input_cost_per_token_above_272k_tokens_regional: Optional[
float
] # OpenAI regional/data-residency processing pricing (10% uplift) for prompts >272K
input_cost_per_character_above_128k_tokens: Optional[
float
] # only for vertex ai models
@ -214,6 +226,9 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False):
output_cost_per_token_priority: Optional[
float
] # OpenAI priority service tier pricing
output_cost_per_token_regional: Optional[
float
] # OpenAI regional/data-residency processing pricing (10% uplift)
output_cost_per_character: Optional[float] # only for vertex ai models
output_cost_per_audio_token: Optional[float]
output_cost_per_token_above_128k_tokens: Optional[
@ -225,6 +240,9 @@ class ModelInfoBase(ProviderSpecificModelInfo, total=False):
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_token_above_272k_tokens_regional: Optional[
float
] # OpenAI regional/data-residency processing pricing (10% uplift) for prompts >272K
output_cost_per_character_above_128k_tokens: Optional[
float
] # only for vertex ai models
@ -3006,6 +3024,7 @@ class CustomPricingLiteLLMParams(BaseModel):
# This allows any model_info parameter to be set in litellm_params
input_cost_per_token_flex: Optional[float] = None
input_cost_per_token_priority: Optional[float] = None
input_cost_per_token_regional: Optional[float] = None
cache_creation_input_token_cost: Optional[float] = None
cache_creation_input_token_cost_above_1hr: Optional[float] = None
cache_creation_input_token_cost_above_200k_tokens: Optional[float] = None
@ -3013,6 +3032,7 @@ class CustomPricingLiteLLMParams(BaseModel):
cache_read_input_token_cost: Optional[float] = None
cache_read_input_token_cost_flex: Optional[float] = None
cache_read_input_token_cost_priority: Optional[float] = None
cache_read_input_token_cost_regional: Optional[float] = None
cache_read_input_token_cost_above_200k_tokens: Optional[float] = None
cache_read_input_audio_token_cost: Optional[float] = None
input_cost_per_character: Optional[float] = None
@ -3034,6 +3054,7 @@ class CustomPricingLiteLLMParams(BaseModel):
output_cost_per_token_batches: Optional[float] = None
output_cost_per_token_flex: Optional[float] = None
output_cost_per_token_priority: Optional[float] = None
output_cost_per_token_regional: Optional[float] = None
output_cost_per_character: Optional[float] = None
output_cost_per_audio_token: Optional[float] = None
output_cost_per_token_above_128k_tokens: Optional[float] = None
@ -3575,6 +3596,7 @@ class ServiceTier(Enum):
FLEX = "flex"
PRIORITY = "priority"
REGIONAL = "regional" # OpenAI regional/data-residency processing (10% uplift)
LLMResponseTypes = Union[

View file

@ -5827,6 +5827,9 @@ def _get_model_info_helper( # noqa: PLR0915
input_cost_per_token_priority=_model_info.get(
"input_cost_per_token_priority", None
),
input_cost_per_token_regional=_model_info.get(
"input_cost_per_token_regional", None
),
cache_creation_input_token_cost=_model_info.get(
"cache_creation_input_token_cost", None
),
@ -5842,12 +5845,18 @@ def _get_model_info_helper( # noqa: PLR0915
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_above_272k_tokens_regional=_model_info.get(
"cache_read_input_token_cost_above_272k_tokens_regional", None
),
cache_read_input_token_cost_flex=_model_info.get(
"cache_read_input_token_cost_flex", None
),
cache_read_input_token_cost_priority=_model_info.get(
"cache_read_input_token_cost_priority", None
),
cache_read_input_token_cost_regional=_model_info.get(
"cache_read_input_token_cost_regional", None
),
cache_creation_input_token_cost_above_1hr=_model_info.get(
"cache_creation_input_token_cost_above_1hr", None
),
@ -5863,6 +5872,9 @@ def _get_model_info_helper( # noqa: PLR0915
input_cost_per_token_above_272k_tokens=_model_info.get(
"input_cost_per_token_above_272k_tokens", None
),
input_cost_per_token_above_272k_tokens_regional=_model_info.get(
"input_cost_per_token_above_272k_tokens_regional", 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(
@ -5891,6 +5903,9 @@ def _get_model_info_helper( # noqa: PLR0915
output_cost_per_token_priority=_model_info.get(
"output_cost_per_token_priority", None
),
output_cost_per_token_regional=_model_info.get(
"output_cost_per_token_regional", None
),
output_cost_per_audio_token=_model_info.get(
"output_cost_per_audio_token", None
),
@ -5912,6 +5927,9 @@ def _get_model_info_helper( # noqa: PLR0915
output_cost_per_token_above_272k_tokens=_model_info.get(
"output_cost_per_token_above_272k_tokens", None
),
output_cost_per_token_above_272k_tokens_regional=_model_info.get(
"output_cost_per_token_above_272k_tokens_regional", None
),
output_cost_per_second=_model_info.get("output_cost_per_second", None),
output_cost_per_second_1080p=_model_info.get(
"output_cost_per_second_1080p", None

View file

@ -18665,8 +18665,10 @@
},
"gpt-4.1": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_priority": 8.75e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_regional": 2.2e-06,
"input_cost_per_token_batches": 1e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
@ -18675,6 +18677,7 @@
"max_tokens": 32768,
"mode": "chat",
"output_cost_per_token": 8e-06,
"output_cost_per_token_regional": 8.8e-06,
"output_cost_per_token_batches": 4e-06,
"output_cost_per_token_priority": 1.4e-05,
"supported_endpoints": [
@ -18738,8 +18741,10 @@
},
"gpt-4.1-mini": {
"cache_read_input_token_cost": 1e-07,
"cache_read_input_token_cost_regional": 1.1e-07,
"cache_read_input_token_cost_priority": 1.75e-07,
"input_cost_per_token": 4e-07,
"input_cost_per_token_regional": 4.4e-07,
"input_cost_per_token_batches": 2e-07,
"input_cost_per_token_priority": 7e-07,
"litellm_provider": "openai",
@ -18748,6 +18753,7 @@
"max_tokens": 32768,
"mode": "chat",
"output_cost_per_token": 1.6e-06,
"output_cost_per_token_regional": 1.76e-06,
"output_cost_per_token_batches": 8e-07,
"output_cost_per_token_priority": 2.8e-06,
"supported_endpoints": [
@ -18811,8 +18817,10 @@
},
"gpt-4.1-nano": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_priority": 5e-08,
"input_cost_per_token": 1e-07,
"input_cost_per_token_regional": 1.1e-07,
"input_cost_per_token_batches": 5e-08,
"input_cost_per_token_priority": 2e-07,
"litellm_provider": "openai",
@ -18821,6 +18829,7 @@
"max_tokens": 32768,
"mode": "chat",
"output_cost_per_token": 4e-07,
"output_cost_per_token_regional": 4.4e-07,
"output_cost_per_token_batches": 2e-07,
"output_cost_per_token_priority": 8e-07,
"supported_endpoints": [
@ -18882,8 +18891,10 @@
},
"gpt-4o": {
"cache_read_input_token_cost": 1.25e-06,
"cache_read_input_token_cost_regional": 1.375e-06,
"cache_read_input_token_cost_priority": 2.125e-06,
"input_cost_per_token": 2.5e-06,
"input_cost_per_token_regional": 2.75e-06,
"input_cost_per_token_batches": 1.25e-06,
"input_cost_per_token_priority": 4.25e-06,
"litellm_provider": "openai",
@ -18892,6 +18903,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_batches": 5e-06,
"output_cost_per_token_priority": 1.7e-05,
"supports_function_calling": true,
@ -18906,6 +18918,7 @@
},
"gpt-4o-2024-05-13": {
"input_cost_per_token": 5e-06,
"input_cost_per_token_regional": 5.5e-06,
"input_cost_per_token_batches": 2.5e-06,
"input_cost_per_token_priority": 8.75e-06,
"litellm_provider": "openai",
@ -18914,6 +18927,7 @@
"max_tokens": 4096,
"mode": "chat",
"output_cost_per_token": 1.5e-05,
"output_cost_per_token_regional": 1.65e-05,
"output_cost_per_token_batches": 7.5e-06,
"output_cost_per_token_priority": 2.625e-05,
"supports_function_calling": true,
@ -19232,8 +19246,10 @@
},
"gpt-4o-mini": {
"cache_read_input_token_cost": 7.5e-08,
"cache_read_input_token_cost_regional": 8.25e-08,
"cache_read_input_token_cost_priority": 1.25e-07,
"input_cost_per_token": 1.5e-07,
"input_cost_per_token_regional": 1.65e-07,
"input_cost_per_token_batches": 7.5e-08,
"input_cost_per_token_priority": 2.5e-07,
"litellm_provider": "openai",
@ -19242,6 +19258,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 6e-07,
"output_cost_per_token_regional": 6.6e-07,
"output_cost_per_token_batches": 3e-07,
"output_cost_per_token_priority": 1e-06,
"supports_function_calling": true,
@ -19934,9 +19951,11 @@
},
"gpt-5": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_flex": 6.25e-08,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_flex": 6.25e-07,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
@ -19945,6 +19964,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_flex": 5e-06,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
@ -19977,8 +19997,10 @@
},
"gpt-5.1": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -19986,6 +20008,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20017,8 +20040,10 @@
},
"gpt-5.1-2025-11-13": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -20026,6 +20051,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20057,8 +20083,10 @@
},
"gpt-5.1-chat-latest": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 128000,
@ -20066,6 +20094,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20096,8 +20125,10 @@
},
"gpt-5.2": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -20105,6 +20136,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20137,8 +20169,10 @@
},
"gpt-5.2-2025-12-11": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -20146,6 +20180,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20178,8 +20213,10 @@
},
"gpt-5.2-chat-latest": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 128000,
@ -20187,6 +20224,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20216,8 +20254,10 @@
},
"gpt-5.3-chat-latest": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 128000,
@ -20225,6 +20265,7 @@
"max_tokens": 16384,
"mode": "chat",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/chat/completions",
@ -20322,11 +20363,15 @@
},
"gpt-5.5": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_above_272k_tokens": 1e-06,
"cache_read_input_token_cost_above_272k_tokens_regional": 1.1e-06,
"cache_read_input_token_cost_flex": 2.5e-07,
"cache_read_input_token_cost_priority": 1e-06,
"input_cost_per_token": 5e-06,
"input_cost_per_token_regional": 5.5e-06,
"input_cost_per_token_above_272k_tokens": 1e-05,
"input_cost_per_token_above_272k_tokens_regional": 1.1e-05,
"input_cost_per_token_flex": 2.5e-06,
"input_cost_per_token_batches": 2.5e-06,
"input_cost_per_token_priority": 1e-05,
@ -20336,7 +20381,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 3e-05,
"output_cost_per_token_regional": 3.3e-05,
"output_cost_per_token_above_272k_tokens": 4.5e-05,
"output_cost_per_token_above_272k_tokens_regional": 4.95e-05,
"output_cost_per_token_flex": 1.5e-05,
"output_cost_per_token_batches": 1.5e-05,
"output_cost_per_token_priority": 6e-05,
@ -20370,11 +20417,15 @@
},
"gpt-5.5-2026-04-23": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_above_272k_tokens": 1e-06,
"cache_read_input_token_cost_above_272k_tokens_regional": 1.1e-06,
"cache_read_input_token_cost_flex": 2.5e-07,
"cache_read_input_token_cost_priority": 1e-06,
"input_cost_per_token": 5e-06,
"input_cost_per_token_regional": 5.5e-06,
"input_cost_per_token_above_272k_tokens": 1e-05,
"input_cost_per_token_above_272k_tokens_regional": 1.1e-05,
"input_cost_per_token_flex": 2.5e-06,
"input_cost_per_token_batches": 2.5e-06,
"input_cost_per_token_priority": 1e-05,
@ -20384,7 +20435,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 3e-05,
"output_cost_per_token_regional": 3.3e-05,
"output_cost_per_token_above_272k_tokens": 4.5e-05,
"output_cost_per_token_above_272k_tokens_regional": 4.95e-05,
"output_cost_per_token_flex": 1.5e-05,
"output_cost_per_token_batches": 1.5e-05,
"output_cost_per_token_priority": 6e-05,
@ -20506,11 +20559,15 @@
},
"gpt-5.4": {
"cache_read_input_token_cost": 2.5e-07,
"cache_read_input_token_cost_regional": 2.75e-07,
"cache_read_input_token_cost_above_272k_tokens": 5e-07,
"cache_read_input_token_cost_above_272k_tokens_regional": 5.5e-07,
"cache_read_input_token_cost_flex": 1.3e-07,
"cache_read_input_token_cost_priority": 5e-07,
"input_cost_per_token": 2.5e-06,
"input_cost_per_token_regional": 2.75e-06,
"input_cost_per_token_above_272k_tokens": 5e-06,
"input_cost_per_token_above_272k_tokens_regional": 5.5e-06,
"input_cost_per_token_flex": 1.25e-06,
"input_cost_per_token_batches": 1.25e-06,
"input_cost_per_token_priority": 5e-06,
@ -20520,7 +20577,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.5e-05,
"output_cost_per_token_regional": 1.65e-05,
"output_cost_per_token_above_272k_tokens": 2.25e-05,
"output_cost_per_token_above_272k_tokens_regional": 2.475e-05,
"output_cost_per_token_flex": 7.5e-06,
"output_cost_per_token_batches": 7.5e-06,
"output_cost_per_token_priority": 3e-05,
@ -20553,11 +20612,15 @@
},
"gpt-5.4-2026-03-05": {
"cache_read_input_token_cost": 2.5e-07,
"cache_read_input_token_cost_regional": 2.75e-07,
"cache_read_input_token_cost_above_272k_tokens": 5e-07,
"cache_read_input_token_cost_above_272k_tokens_regional": 5.5e-07,
"cache_read_input_token_cost_flex": 1.3e-07,
"cache_read_input_token_cost_priority": 5e-07,
"input_cost_per_token": 2.5e-06,
"input_cost_per_token_regional": 2.75e-06,
"input_cost_per_token_above_272k_tokens": 5e-06,
"input_cost_per_token_above_272k_tokens_regional": 5.5e-06,
"input_cost_per_token_flex": 1.25e-06,
"input_cost_per_token_batches": 1.25e-06,
"input_cost_per_token_priority": 5e-06,
@ -20567,7 +20630,9 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1.5e-05,
"output_cost_per_token_regional": 1.65e-05,
"output_cost_per_token_above_272k_tokens": 2.25e-05,
"output_cost_per_token_above_272k_tokens_regional": 2.475e-05,
"output_cost_per_token_flex": 7.5e-06,
"output_cost_per_token_batches": 7.5e-06,
"output_cost_per_token_priority": 3e-05,
@ -20683,10 +20748,12 @@
},
"gpt-5.4-mini": {
"cache_read_input_token_cost": 7.5e-08,
"cache_read_input_token_cost_regional": 8.25e-08,
"cache_read_input_token_cost_flex": 3.75e-08,
"cache_read_input_token_cost_batches": 3.75e-08,
"cache_read_input_token_cost_priority": 1.5e-07,
"input_cost_per_token": 7.5e-07,
"input_cost_per_token_regional": 8.25e-07,
"input_cost_per_token_flex": 3.75e-07,
"input_cost_per_token_batches": 3.75e-07,
"input_cost_per_token_priority": 1.5e-06,
@ -20696,6 +20763,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 4.5e-06,
"output_cost_per_token_regional": 4.95e-06,
"output_cost_per_token_flex": 2.25e-06,
"output_cost_per_token_batches": 2.25e-06,
"output_cost_per_token_priority": 9e-06,
@ -20729,10 +20797,12 @@
},
"gpt-5.4-mini-2026-03-17": {
"cache_read_input_token_cost": 7.5e-08,
"cache_read_input_token_cost_regional": 8.25e-08,
"cache_read_input_token_cost_flex": 3.75e-08,
"cache_read_input_token_cost_batches": 3.75e-08,
"cache_read_input_token_cost_priority": 1.5e-07,
"input_cost_per_token": 7.5e-07,
"input_cost_per_token_regional": 8.25e-07,
"input_cost_per_token_flex": 3.75e-07,
"input_cost_per_token_batches": 3.75e-07,
"input_cost_per_token_priority": 1.5e-06,
@ -20742,6 +20812,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 4.5e-06,
"output_cost_per_token_regional": 4.95e-06,
"output_cost_per_token_flex": 2.25e-06,
"output_cost_per_token_batches": 2.25e-06,
"output_cost_per_token_priority": 9e-06,
@ -20933,9 +21004,11 @@
},
"gpt-5-2025-08-07": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_flex": 6.25e-08,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_flex": 6.25e-07,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
@ -20944,6 +21017,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_flex": 5e-06,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
@ -21080,8 +21154,10 @@
},
"gpt-5.1-codex": {
"cache_read_input_token_cost": 1.25e-07,
"cache_read_input_token_cost_regional": 1.375e-07,
"cache_read_input_token_cost_priority": 2.5e-07,
"input_cost_per_token": 1.25e-06,
"input_cost_per_token_regional": 1.375e-06,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21089,6 +21165,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 1e-05,
"output_cost_per_token_regional": 1.1e-05,
"output_cost_per_token_priority": 2e-05,
"supported_endpoints": [
"/v1/responses"
@ -21151,8 +21228,10 @@
},
"gpt-5.1-codex-mini": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_priority": 4.5e-08,
"input_cost_per_token": 2.5e-07,
"input_cost_per_token_regional": 2.75e-07,
"input_cost_per_token_priority": 4.5e-07,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21160,6 +21239,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 2e-06,
"output_cost_per_token_regional": 2.2e-06,
"output_cost_per_token_priority": 3.6e-06,
"supported_endpoints": [
"/v1/responses"
@ -21188,8 +21268,10 @@
},
"gpt-5.2-codex": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21197,6 +21279,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/responses"
@ -21225,8 +21308,10 @@
},
"gpt-5.3-codex": {
"cache_read_input_token_cost": 1.75e-07,
"cache_read_input_token_cost_regional": 1.925e-07,
"cache_read_input_token_cost_priority": 3.5e-07,
"input_cost_per_token": 1.75e-06,
"input_cost_per_token_regional": 1.925e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
"max_input_tokens": 272000,
@ -21234,6 +21319,7 @@
"max_tokens": 128000,
"mode": "responses",
"output_cost_per_token": 1.4e-05,
"output_cost_per_token_regional": 1.54e-05,
"output_cost_per_token_priority": 2.8e-05,
"supported_endpoints": [
"/v1/responses"
@ -21262,9 +21348,11 @@
},
"gpt-5-mini": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_flex": 1.25e-08,
"cache_read_input_token_cost_priority": 4.5e-08,
"input_cost_per_token": 2.5e-07,
"input_cost_per_token_regional": 2.75e-07,
"input_cost_per_token_flex": 1.25e-07,
"input_cost_per_token_priority": 4.5e-07,
"litellm_provider": "openai",
@ -21273,6 +21361,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 2e-06,
"output_cost_per_token_regional": 2.2e-06,
"output_cost_per_token_flex": 1e-06,
"output_cost_per_token_priority": 3.6e-06,
"supported_endpoints": [
@ -21305,9 +21394,11 @@
},
"gpt-5-mini-2025-08-07": {
"cache_read_input_token_cost": 2.5e-08,
"cache_read_input_token_cost_regional": 2.75e-08,
"cache_read_input_token_cost_flex": 1.25e-08,
"cache_read_input_token_cost_priority": 4.5e-08,
"input_cost_per_token": 2.5e-07,
"input_cost_per_token_regional": 2.75e-07,
"input_cost_per_token_flex": 1.25e-07,
"input_cost_per_token_priority": 4.5e-07,
"litellm_provider": "openai",
@ -21316,6 +21407,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 2e-06,
"output_cost_per_token_regional": 2.2e-06,
"output_cost_per_token_flex": 1e-06,
"output_cost_per_token_priority": 3.6e-06,
"supported_endpoints": [
@ -21348,8 +21440,10 @@
},
"gpt-5-nano": {
"cache_read_input_token_cost": 5e-09,
"cache_read_input_token_cost_regional": 5.5e-09,
"cache_read_input_token_cost_flex": 2.5e-09,
"input_cost_per_token": 5e-08,
"input_cost_per_token_regional": 5.5e-08,
"input_cost_per_token_flex": 2.5e-08,
"input_cost_per_token_priority": 2.5e-06,
"litellm_provider": "openai",
@ -21358,6 +21452,7 @@
"max_tokens": 128000,
"mode": "chat",
"output_cost_per_token": 4e-07,
"output_cost_per_token_regional": 4.4e-07,
"output_cost_per_token_flex": 2e-07,
"supported_endpoints": [
"/v1/chat/completions",
@ -25293,9 +25388,11 @@
},
"o3": {
"cache_read_input_token_cost": 5e-07,
"cache_read_input_token_cost_regional": 5.5e-07,
"cache_read_input_token_cost_flex": 2.5e-07,
"cache_read_input_token_cost_priority": 8.75e-07,
"input_cost_per_token": 2e-06,
"input_cost_per_token_regional": 2.2e-06,
"input_cost_per_token_flex": 1e-06,
"input_cost_per_token_priority": 3.5e-06,
"litellm_provider": "openai",
@ -25304,6 +25401,7 @@
"max_tokens": 100000,
"mode": "chat",
"output_cost_per_token": 8e-06,
"output_cost_per_token_regional": 8.8e-06,
"output_cost_per_token_flex": 4e-06,
"output_cost_per_token_priority": 1.4e-05,
"supported_endpoints": [
@ -25529,9 +25627,11 @@
},
"o4-mini": {
"cache_read_input_token_cost": 2.75e-07,
"cache_read_input_token_cost_regional": 3.025e-07,
"cache_read_input_token_cost_flex": 1.375e-07,
"cache_read_input_token_cost_priority": 5e-07,
"input_cost_per_token": 1.1e-06,
"input_cost_per_token_regional": 1.21e-06,
"input_cost_per_token_flex": 5.5e-07,
"input_cost_per_token_priority": 2e-06,
"litellm_provider": "openai",
@ -25540,6 +25640,7 @@
"max_tokens": 100000,
"mode": "chat",
"output_cost_per_token": 4.4e-06,
"output_cost_per_token_regional": 4.84e-06,
"output_cost_per_token_flex": 2.2e-06,
"output_cost_per_token_priority": 8e-06,
"supports_function_calling": true,

View file

@ -1091,6 +1091,169 @@ def test_service_tier_fallback_pricing():
), f"Standard completion cost mismatch: {std_cost[1]} vs {expected_standard_completion}"
def test_service_tier_regional_pricing():
"""Regional service tier should apply a 10% uplift over standard pricing.
OpenAI charges a 10% premium when using regional/data-residency processing
on the latest GPT models (see https://developers.openai.com/api/docs/pricing).
"""
os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True"
litellm.model_cost = litellm.get_model_cost_map(url="")
model = "gpt-5"
custom_llm_provider = "openai"
usage = Usage(prompt_tokens=1000, completion_tokens=500, total_tokens=1500)
std_cost = generic_cost_per_token(
model=model,
usage=usage,
custom_llm_provider=custom_llm_provider,
service_tier=None,
)
regional_cost = generic_cost_per_token(
model=model,
usage=usage,
custom_llm_provider=custom_llm_provider,
service_tier="regional",
)
std_total = std_cost[0] + std_cost[1]
regional_total = regional_cost[0] + regional_cost[1]
assert std_total > 0
assert regional_total > 0
ratio = regional_total / std_total
assert (
abs(ratio - 1.10) < 0.001
), f"Regional pricing should be 10% above standard, got ratio {ratio:.4f}"
# gpt-5 standard: input=1.25e-06, output=1e-05
# gpt-5 regional: input=1.375e-06, output=1.1e-05
expected_regional_prompt = 1000 * 1.375e-06
expected_regional_completion = 500 * 1.1e-05
assert abs(regional_cost[0] - expected_regional_prompt) < 1e-10
assert abs(regional_cost[1] - expected_regional_completion) < 1e-10
def test_service_tier_regional_pricing_case_insensitive():
"""Regional service tier should be matched case-insensitively."""
os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True"
litellm.model_cost = litellm.get_model_cost_map(url="")
usage = Usage(prompt_tokens=1000, completion_tokens=500, total_tokens=1500)
lower = generic_cost_per_token(
model="gpt-5",
usage=usage,
custom_llm_provider="openai",
service_tier="regional",
)
upper = generic_cost_per_token(
model="gpt-5",
usage=usage,
custom_llm_provider="openai",
service_tier="REGIONAL",
)
assert abs(lower[0] - upper[0]) < 1e-12
assert abs(lower[1] - upper[1]) < 1e-12
def test_service_tier_regional_pricing_fallback():
"""If a model has no regional pricing keys, regional tier falls back to standard."""
os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True"
litellm.model_cost = litellm.get_model_cost_map(url="")
# gpt-4 has no regional pricing keys
usage = Usage(prompt_tokens=1000, completion_tokens=500, total_tokens=1500)
std_cost = generic_cost_per_token(
model="gpt-4",
usage=usage,
custom_llm_provider="openai",
service_tier=None,
)
regional_cost = generic_cost_per_token(
model="gpt-4",
usage=usage,
custom_llm_provider="openai",
service_tier="regional",
)
assert abs(std_cost[0] - regional_cost[0]) < 1e-10
assert abs(std_cost[1] - regional_cost[1]) < 1e-10
def test_service_tier_regional_pricing_above_threshold():
"""Regional uplift should also apply to above-threshold pricing on models
like gpt-5.4 that price prompts above 272k tokens at a higher rate."""
os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True"
litellm.model_cost = litellm.get_model_cost_map(url="")
# Prompt above the 272k threshold
usage = Usage(prompt_tokens=300_000, completion_tokens=1000, total_tokens=301_000)
std_cost = generic_cost_per_token(
model="gpt-5.4",
usage=usage,
custom_llm_provider="openai",
service_tier=None,
)
regional_cost = generic_cost_per_token(
model="gpt-5.4",
usage=usage,
custom_llm_provider="openai",
service_tier="regional",
)
std_total = std_cost[0] + std_cost[1]
regional_total = regional_cost[0] + regional_cost[1]
assert std_total > 0
ratio = regional_total / std_total
assert (
abs(ratio - 1.10) < 0.001
), f"Regional pricing above threshold should be 10% above standard, got {ratio:.4f}"
def test_service_tier_regional_cost_key_resolution():
"""_get_service_tier_cost_key should produce the regional suffix for known
tiers (including 'regional')."""
from litellm.litellm_core_utils.llm_cost_calc.utils import (
_get_service_tier_cost_key,
)
assert (
_get_service_tier_cost_key("input_cost_per_token", "regional")
== "input_cost_per_token_regional"
)
assert (
_get_service_tier_cost_key("input_cost_per_token", "REGIONAL")
== "input_cost_per_token_regional"
)
# Unknown tier falls back to base key
assert (
_get_service_tier_cost_key("input_cost_per_token", "made-up-tier")
== "input_cost_per_token"
)
# None returns base key
assert (
_get_service_tier_cost_key("input_cost_per_token", None)
== "input_cost_per_token"
)
def test_service_tier_enum_contains_regional():
"""ServiceTier enum should expose REGIONAL alongside FLEX and PRIORITY."""
from litellm.types.utils import ServiceTier
assert ServiceTier.REGIONAL.value == "regional"
values = {t.value for t in ServiceTier}
assert {"flex", "priority", "regional"}.issubset(values)
@pytest.mark.parametrize(
"model",
[

View file

@ -1705,6 +1705,67 @@ def test_completion_cost_extracts_service_tier_from_usage():
), f"Flex pricing should be ~50% of standard, got {flex_ratio:.2f}"
def test_completion_cost_extracts_regional_service_tier_from_response():
"""completion_cost should apply OpenAI's regional 10% uplift when the
response carries service_tier='regional'."""
from litellm import completion_cost
os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True"
litellm.model_cost = litellm.get_model_cost_map(url="")
model = "gpt-5"
usage = Usage(prompt_tokens=1000, completion_tokens=500, total_tokens=1500)
response_regional = ModelResponse(usage=usage, model=model)
setattr(response_regional, "service_tier", "regional")
regional_cost = completion_cost(
completion_response=response_regional,
model=model,
custom_llm_provider="openai",
)
response_standard = ModelResponse(usage=usage, model=model)
standard_cost = completion_cost(
completion_response=response_standard,
model=model,
custom_llm_provider="openai",
)
assert regional_cost > standard_cost
ratio = regional_cost / standard_cost
assert (
abs(ratio - 1.10) < 0.001
), f"Regional pricing should be 10% above standard, got {ratio:.4f}"
def test_completion_cost_regional_service_tier_from_optional_params():
"""Regional uplift should also be picked up from optional_params."""
from litellm import completion_cost
os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True"
litellm.model_cost = litellm.get_model_cost_map(url="")
model = "gpt-5"
usage = Usage(prompt_tokens=1000, completion_tokens=500, total_tokens=1500)
response = ModelResponse(usage=usage, model=model)
standard_cost = completion_cost(
completion_response=response,
model=model,
custom_llm_provider="openai",
)
regional_cost = completion_cost(
completion_response=response,
model=model,
custom_llm_provider="openai",
optional_params={"service_tier": "regional"},
)
assert regional_cost > standard_cost
ratio = regional_cost / standard_cost
assert abs(ratio - 1.10) < 0.001
def test_completion_cost_service_tier_priority():
"""Test that service_tier extraction follows priority: optional_params > completion_response > usage."""
from litellm import completion_cost

View file

@ -721,21 +721,29 @@ def test_aaamodel_prices_and_context_window_json_is_valid():
"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_regional": {"type": "number"},
"cache_read_input_token_cost_above_200k_tokens_priority": {
"type": "number"
},
"cache_read_input_token_cost_above_272k_tokens_priority": {
"type": "number"
},
"cache_read_input_token_cost_above_272k_tokens_regional": {
"type": "number"
},
"input_cost_per_token_flex": {"type": "number"},
"input_cost_per_token_priority": {"type": "number"},
"input_cost_per_token_regional": {"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_token_above_272k_tokens_regional": {"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_regional": {"type": "number"},
"output_cost_per_token_above_200k_tokens_priority": {"type": "number"},
"output_cost_per_token_above_272k_tokens_priority": {"type": "number"},
"output_cost_per_token_above_272k_tokens_regional": {"type": "number"},
"input_cost_per_pixel": {"type": "number"},
"input_cost_per_query": {"type": "number"},
"input_cost_per_request": {"type": "number"},