From 10323380cf3d9377733ed9a1154535aede90d3fc Mon Sep 17 00:00:00 2001 From: Shreshth Kharbanda Date: Wed, 23 Sep 2026 13:50:30 -0700 Subject: [PATCH] feat(pricing): add input_cost_per_reference_pixel cost key Azure meters FLUX.2 image edits twice: once for the generated pixels and once for every pixel of the reference images sent with the edit. input_cost_per_pixel already means the generated image's pixels in default_image_cost_calculator, so the reference meter gets its own key. The Flex row carries it at the same 0.05 per 1024x1024 megapixel as its output rate, per the Azure retail prices API rows for 'Azure BFL Flux Models' (Flex Megapixel and Flex Ref Megapixel, checked 2026-09-23). Declared everywhere a deployment can set a price: the cost map and its regenerated schema, CustomPricingLiteLLMParams, the Rust catalog, the Terraform provider, and the dashboard's OpenAPI types --- ci_cd/generate_model_prices_schema.py | 1 + litellm-rust/crates/model-catalog/src/model_info.rs | 2 ++ litellm/model_prices_and_context_window_backup.json | 1 + litellm/types/utils.py | 1 + model_prices_and_context_window.json | 1 + model_prices_and_context_window.schema.json | 5 +++++ terraform/provider/docs/resources/model.md | 2 ++ terraform/provider/litellm/resource_model.go | 4 ++++ terraform/provider/litellm/resource_model_crud.go | 3 +++ terraform/provider/litellm/types.go | 1 + tests/test_litellm/test_utils.py | 2 ++ ui/litellm-dashboard/src/lib/http/schema.d.ts | 4 ++++ 12 files changed, 27 insertions(+) diff --git a/ci_cd/generate_model_prices_schema.py b/ci_cd/generate_model_prices_schema.py index 8eec07dadda..6cef9d7ab68 100644 --- a/ci_cd/generate_model_prices_schema.py +++ b/ci_cd/generate_model_prices_schema.py @@ -222,6 +222,7 @@ COST_DESCRIPTIONS: dict[str, str] = { "cache_read_input_token_cost": "USD per prompt token served from the provider's prompt cache.", "input_cost_per_token_batches": "USD per prompt token via the provider's batch API.", "output_cost_per_token_batches": "USD per generated token via the provider's batch API.", + "input_cost_per_reference_pixel": "USD per pixel of each reference image sent with an image edit.", } diff --git a/litellm-rust/crates/model-catalog/src/model_info.rs b/litellm-rust/crates/model-catalog/src/model_info.rs index 77a8b768e38..bf01db55c27 100644 --- a/litellm-rust/crates/model-catalog/src/model_info.rs +++ b/litellm-rust/crates/model-catalog/src/model_info.rs @@ -345,6 +345,8 @@ pub struct ModelInfo { #[serde(default, skip_serializing_if = "Option::is_none")] pub input_cost_per_pixel: Option, #[serde(default, skip_serializing_if = "Option::is_none")] + pub input_cost_per_reference_pixel: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] pub input_cost_per_query: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub input_cost_per_request: Option, diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 74f52a488de..b33162465ec 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -10964,6 +10964,7 @@ }, "azure_ai/FLUX.2-flex": { "input_cost_per_pixel": 4.76837158203125e-08, + "input_cost_per_reference_pixel": 4.76837158203125e-08, "litellm_provider": "azure_ai", "max_input_tokens": 32000, "max_tokens": 32000, diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 3f8471cbde1..3e7682583a5 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -3702,6 +3702,7 @@ class CustomPricingLiteLLMParams(MirroredPricingParams): output_cost_per_image_1024: float | None = None output_cost_per_image_1536: float | None = None input_cost_per_pixel: float | None = None + input_cost_per_reference_pixel: float | None = None output_cost_per_pixel: float | None = None # Include all ModelInfoBase fields as optional diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 74f52a488de..b33162465ec 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -10964,6 +10964,7 @@ }, "azure_ai/FLUX.2-flex": { "input_cost_per_pixel": 4.76837158203125e-08, + "input_cost_per_reference_pixel": 4.76837158203125e-08, "litellm_provider": "azure_ai", "max_input_tokens": 32000, "max_tokens": 32000, diff --git a/model_prices_and_context_window.schema.json b/model_prices_and_context_window.schema.json index 737a9b7fa60..8afbdf077fd 100644 --- a/model_prices_and_context_window.schema.json +++ b/model_prices_and_context_window.schema.json @@ -318,6 +318,11 @@ "type": "number", "minimum": 0 }, + "input_cost_per_reference_pixel": { + "type": "number", + "minimum": 0, + "description": "USD per pixel of each reference image sent with an image edit." + }, "input_cost_per_request": { "type": "number", "minimum": 0 diff --git a/terraform/provider/docs/resources/model.md b/terraform/provider/docs/resources/model.md index 0409b48b391..834ed05d5bb 100644 --- a/terraform/provider/docs/resources/model.md +++ b/terraform/provider/docs/resources/model.md @@ -157,6 +157,8 @@ The following arguments are supported: * `input_cost_per_pixel` - (Optional) float. Cost applied per input pixel for models that charge by image size. +* `input_cost_per_reference_pixel` - (Optional) float. Cost applied per pixel of each reference image sent with an image edit, for models that meter reference images separately. + * `output_cost_per_pixel` - (Optional) float. Cost applied per output pixel for image-generation models. * `input_cost_per_second` - (Optional) float. Cost applied per input second for audio/transcription models. diff --git a/terraform/provider/litellm/resource_model.go b/terraform/provider/litellm/resource_model.go index b0a7304718b..88f4bbe36f3 100644 --- a/terraform/provider/litellm/resource_model.go +++ b/terraform/provider/litellm/resource_model.go @@ -119,6 +119,10 @@ func resourceLiteLLMModel() *schema.Resource { Type: schema.TypeFloat, Optional: true, }, + "input_cost_per_reference_pixel": { + Type: schema.TypeFloat, + Optional: true, + }, "output_cost_per_pixel": { Type: schema.TypeFloat, Optional: true, diff --git a/terraform/provider/litellm/resource_model_crud.go b/terraform/provider/litellm/resource_model_crud.go index fc5d5b09dd5..d97a6e7c4a9 100644 --- a/terraform/provider/litellm/resource_model_crud.go +++ b/terraform/provider/litellm/resource_model_crud.go @@ -124,6 +124,9 @@ func createOrUpdateModel(d *schema.ResourceData, m interface{}, isUpdate bool) e if inputCostPerPixel := d.Get("input_cost_per_pixel").(float64); inputCostPerPixel > 0 { litellmParams["input_cost_per_pixel"] = inputCostPerPixel } + if inputCostPerReferencePixel := d.Get("input_cost_per_reference_pixel").(float64); inputCostPerReferencePixel > 0 { + litellmParams["input_cost_per_reference_pixel"] = inputCostPerReferencePixel + } if outputCostPerPixel := d.Get("output_cost_per_pixel").(float64); outputCostPerPixel > 0 { litellmParams["output_cost_per_pixel"] = outputCostPerPixel } diff --git a/terraform/provider/litellm/types.go b/terraform/provider/litellm/types.go index 8bcf7dc4fe3..33797dddf99 100644 --- a/terraform/provider/litellm/types.go +++ b/terraform/provider/litellm/types.go @@ -93,6 +93,7 @@ type LiteLLMParams struct { InputCostPerToken float64 `json:"input_cost_per_token,omitempty"` OutputCostPerToken float64 `json:"output_cost_per_token,omitempty"` InputCostPerPixel float64 `json:"input_cost_per_pixel,omitempty"` + InputCostPerReferencePixel float64 `json:"input_cost_per_reference_pixel,omitempty"` OutputCostPerPixel float64 `json:"output_cost_per_pixel,omitempty"` InputCostPerSecond float64 `json:"input_cost_per_second,omitempty"` OutputCostPerSecond float64 `json:"output_cost_per_second,omitempty"` diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 2a8b31c12cc..6a0af3fd099 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -643,6 +643,7 @@ def validate_model_cost_values(model_data, exceptions=None): "output_cost_per_image_1024", "output_cost_per_image_1536", "input_cost_per_pixel", + "input_cost_per_reference_pixel", "output_cost_per_pixel", "input_cost_per_second", "output_cost_per_second", @@ -814,6 +815,7 @@ def test_aaamodel_prices_and_context_window_json_is_valid(): "regional_processing_uplift_multiplier_eu": {"type": "number"}, "regional_processing_uplift_multiplier_us": {"type": "number"}, "input_cost_per_pixel": {"type": "number"}, + "input_cost_per_reference_pixel": {"type": "number"}, "input_cost_per_query": {"type": "number"}, "input_cost_per_request": {"type": "number"}, "input_cost_per_second": {"type": "number"}, diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index bdfd4aec316..c42a66925c5 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -31409,6 +31409,8 @@ export interface components { input_cost_per_pixel?: number | null; /** Input Cost Per Query */ input_cost_per_query?: number | null; + /** Input Cost Per Reference Pixel */ + input_cost_per_reference_pixel?: number | null; /** Input Cost Per Second */ input_cost_per_second?: number | null; /** Input Cost Per Token */ @@ -42304,6 +42306,8 @@ export interface components { input_cost_per_pixel?: number | null; /** Input Cost Per Query */ input_cost_per_query?: number | null; + /** Input Cost Per Reference Pixel */ + input_cost_per_reference_pixel?: number | null; /** Input Cost Per Second */ input_cost_per_second?: number | null; /** Input Cost Per Token */