From 6d17f8bff5dd43dced619b17df318408bb4f224e Mon Sep 17 00:00:00 2001 From: Kerry Lu Date: Thu, 12 Nov 2026 07:59:03 -0800 Subject: [PATCH] feat(model-catalog): read output_cost_per_billable_unit in the rust registry check (#51365) * feat(model-catalog): read output_cost_per_billable_unit in the rust registry check * fix(model-catalog): add billable_unit to the flat key schema pattern --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/rust/crates/cost/src/price/meter.rs | 1 + litellm/rust/crates/model-catalog/src/model_info.rs | 1 + litellm/rust/crates/model-catalog/src/schema.rs | 4 +++- litellm/rust/crates/model-catalog/src/wire/flat_key.rs | 5 +++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/litellm/rust/crates/cost/src/price/meter.rs b/litellm/rust/crates/cost/src/price/meter.rs index 09fd23e42ed..705ac97894c 100644 --- a/litellm/rust/crates/cost/src/price/meter.rs +++ b/litellm/rust/crates/cost/src/price/meter.rs @@ -50,6 +50,7 @@ pub enum OutputUnit { Pixel, Second(Option), VideoSecond, + BillableUnit, } /// `Explicit` is a cache the caller created ahead of time, spelled `explicit_cache_read_*`. `Implicit` is every other read diff --git a/litellm/rust/crates/model-catalog/src/model_info.rs b/litellm/rust/crates/model-catalog/src/model_info.rs index fcd0c027323..cee4ebbf9bd 100644 --- a/litellm/rust/crates/model-catalog/src/model_info.rs +++ b/litellm/rust/crates/model-catalog/src/model_info.rs @@ -122,6 +122,7 @@ pub struct ModelInfoFields { pub output_cost_per_second_4k: Option, pub output_cost_per_video_per_second: Option, pub output_cost_per_image: Option, + pub output_cost_per_billable_unit: Option, pub output_cost_per_pixel: Option, pub output_cost_per_image_token: Option, pub output_cost_per_image_token_batches: Option, diff --git a/litellm/rust/crates/model-catalog/src/schema.rs b/litellm/rust/crates/model-catalog/src/schema.rs index 60c755fe94f..2fc0aa70184 100644 --- a/litellm/rust/crates/model-catalog/src/schema.rs +++ b/litellm/rust/crates/model-catalog/src/schema.rs @@ -64,7 +64,7 @@ struct RegistryDocument { pub(crate) const FLAT_KEY_PATTERN: &str = concat!( r"^(", r"input_cost_per_((audio_|image_|video_)?token|character|image|pixel|query|request|second|text_message|audio_per_second|video_per_second(_above_\d+s_interval)?)", - r"|output_cost_per_((audio_|image_|video_|reasoning_)?token|character|image(_\d+(\.\d+)?K?)?|pixel|second(_\d+[pk])?|video_per_second)", + r"|output_cost_per_((audio_|image_|video_|reasoning_)?token|character|image(_\d+(\.\d+)?K?)?|pixel|second(_\d+[pk])?|video_per_second|billable_unit)", r"|cache_read_input_(audio_|image_|video_)?token_cost", r"|explicit_cache_read_input_token_cost", r"|cache_creation_input_(audio_|image_|video_)?token_cost(_above_1hr|_above_12hr)?", @@ -202,6 +202,8 @@ mod tests { #[case::feature_batch("annotation_cost_per_page_batches")] #[case::video_interval("input_cost_per_video_per_second_above_8s_interval")] #[case::explicit_cache_read("explicit_cache_read_input_token_cost")] + #[case::billable_unit("output_cost_per_billable_unit")] + #[case::billable_unit_is_output_only("input_cost_per_billable_unit")] #[case::wall_clock("cost_per_second")] #[case::unused_meter("cost_per_token")] #[case::other_currency("input_dbu_cost_per_token")] diff --git a/litellm/rust/crates/model-catalog/src/wire/flat_key.rs b/litellm/rust/crates/model-catalog/src/wire/flat_key.rs index 906d917b487..638a5349f05 100644 --- a/litellm/rust/crates/model-catalog/src/wire/flat_key.rs +++ b/litellm/rust/crates/model-catalog/src/wire/flat_key.rs @@ -210,6 +210,7 @@ fn output_unit(unit: &str) -> Option { "pixel" => Some(OutputUnit::Pixel), "second" => Some(OutputUnit::Second(None)), "video_per_second" => Some(OutputUnit::VideoSecond), + "billable_unit" => Some(OutputUnit::BillableUnit), _ => None, } } @@ -285,6 +286,10 @@ mod tests { None ) )] + #[case::billable_unit( + "output_cost_per_billable_unit", + key(Meter::Output(OutputUnit::BillableUnit), Band::Base, None) + )] #[case::image_token_is_a_token( "output_cost_per_image_token", key(Meter::Output(OutputUnit::Token(TokenKind::Image)), Band::Base, None)