diff --git a/ci_cd/generate_model_prices_schema.py b/ci_cd/generate_model_prices_schema.py index 8eec07dadda..fedbbb52780 100644 --- a/ci_cd/generate_model_prices_schema.py +++ b/ci_cd/generate_model_prices_schema.py @@ -19,6 +19,7 @@ NONNEG_NUMBER: JsonSchema = {"type": "number", "minimum": 0} NONNEG_INTEGER: JsonSchema = {"type": "integer", "minimum": 0} BOOLEAN: JsonSchema = {"type": "boolean"} STRING: JsonSchema = {"type": "string"} +NON_BLANK_STRING: Final[JsonSchema] = {"type": "string", "pattern": r"\S"} TIME_WINDOW: Final[JsonSchema] = {"type": "string", "pattern": r"^([01]\d|2[0-3]):[0-5]\d-([01]\d|2[0-3]):[0-5]\d$"} WEEKDAY_PATTERN: Final = ( r"(?i)^(mon|monday|tue|tues|tuesday|wed|wednesday|thu|thur|thurs|thursday|fri|friday|sat|saturday|sun|sunday)$" @@ -61,6 +62,28 @@ OFF_PEAK_WINDOW: Final[JsonSchema] = { } OBJECT_KEYS: dict[str, JsonSchema] = { + "search_free_requests": { + "type": "object", + "description": "Free Google Search grounding requests per period, shared across models in the same shared_group.", + "required": ["count", "period", "shared_group"], + "additionalProperties": False, + "properties": { + "count": {"type": "integer", "minimum": 0}, + "period": {"type": "string", "enum": ["day", "month"]}, + "shared_group": {"type": "string", "pattern": "\\S"}, + }, + }, + "token_count_model": { + "type": "object", + "required": ["model"], + "additionalProperties": False, + "properties": { + "model": NON_BLANK_STRING, + "region": NON_BLANK_STRING, + "litellm_provider": {"type": "string", "enum": ["bedrock", "bedrock_mantle"]}, + }, + "description": "Model that counts tokens for this one, its counting provider, and the AWS region its count API runs in.", + }, "off_peak_pricing": { "type": "object", "description": "Rates that replace the same-named base fields while the request falls inside the stated UTC windows.", @@ -169,6 +192,10 @@ ARRAY_KEYS: dict[str, JsonSchema] = { } INTEGER_KEYS: dict[str, JsonSchema] = { + "token_count_framing": { + **NONNEG_INTEGER, + "description": "Tokens added once per request to a local count estimate, for the provider's chat framing.", + }, "max_tokens": { **NONNEG_INTEGER, "description": "Legacy field: max output tokens if the provider specifies it, else max input tokens.", @@ -263,6 +290,11 @@ def string_key_schemas(modes: tuple) -> dict[str, JsonSchema]: "format": "date", "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", }, + "token_count_tokenizer": { + "type": "string", + "description": "Local tokenizer used to count tokens for this model.", + "enum": ["kimi_k3"], + }, "web_search_billing_unit": { "type": "string", "description": "Whether web search is billed per query or per prompt.", diff --git a/model_prices_and_context_window.schema.json b/model_prices_and_context_window.schema.json index 18870ced268..8a288f0bfcd 100644 --- a/model_prices_and_context_window.schema.json +++ b/model_prices_and_context_window.schema.json @@ -83,10 +83,6 @@ "minimum": 0, "description": "USD per token written to the provider's prompt cache." }, - "cache_creation_input_token_cost_batches": { - "type": "number", - "minimum": 0 - }, "cache_creation_input_token_cost_above_100k_tokens": { "type": "number", "minimum": 0, @@ -97,11 +93,6 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_creation_input_token_cost_above_128k_tokens": { - "type": "number", - "minimum": 0, - "description": "Rate applied once the prompt exceeds the token threshold in the field name." - }, "cache_creation_input_token_cost_above_1hr": { "type": "number", "minimum": 0, @@ -122,12 +113,17 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_creation_input_token_cost_above_256k_tokens": { + "cache_creation_input_token_cost_above_272k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_creation_input_token_cost_above_272k_tokens": { + "cache_creation_input_token_cost_above_272k_tokens_batches": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "cache_creation_input_token_cost_above_272k_tokens_decisions": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -142,6 +138,19 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "cache_creation_input_token_cost_above_272k_tokens_ultrafast": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "cache_creation_input_token_cost_batches": { + "type": "number", + "minimum": 0 + }, + "cache_creation_input_token_cost_decisions": { + "type": "number", + "minimum": 0 + }, "cache_creation_input_token_cost_flex": { "type": "number", "minimum": 0, @@ -152,19 +161,23 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "cache_creation_input_token_cost_ultrafast": { + "type": "number", + "minimum": 0 + }, "cache_read_input_audio_token_cost": { "type": "number", "minimum": 0 }, + "cache_read_input_image_token_cost": { + "type": "number", + "minimum": 0 + }, "cache_read_input_token_cost": { "type": "number", "minimum": 0, "description": "USD per prompt token served from the provider's prompt cache." }, - "cache_read_input_token_cost_batches": { - "type": "number", - "minimum": 0 - }, "cache_read_input_token_cost_above_100k_tokens": { "type": "number", "minimum": 0, @@ -175,12 +188,12 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_read_input_token_cost_above_128k_tokens": { + "cache_read_input_token_cost_above_200k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_read_input_token_cost_above_200k_tokens": { + "cache_read_input_token_cost_above_200k_tokens_batches": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -190,12 +203,17 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, - "cache_read_input_token_cost_above_256k_tokens": { + "cache_read_input_token_cost_above_272k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_read_input_token_cost_above_272k_tokens": { + "cache_read_input_token_cost_above_272k_tokens_batches": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "cache_read_input_token_cost_above_272k_tokens_decisions": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -210,11 +228,28 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "cache_read_input_token_cost_above_272k_tokens_ultrafast": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, "cache_read_input_token_cost_above_512k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, + "cache_read_input_token_cost_balanced": { + "type": "number", + "minimum": 0 + }, + "cache_read_input_token_cost_batches": { + "type": "number", + "minimum": 0 + }, + "cache_read_input_token_cost_decisions": { + "type": "number", + "minimum": 0 + }, "cache_read_input_token_cost_flex": { "type": "number", "minimum": 0, @@ -225,6 +260,10 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "cache_read_input_token_cost_ultrafast": { + "type": "number", + "minimum": 0 + }, "citation_cost_per_token": { "type": "number", "minimum": 0 @@ -236,6 +275,10 @@ "comment": { "type": "string" }, + "cost_per_second": { + "type": "number", + "minimum": 0 + }, "default_reasoning_effort": { "type": "string", "description": "Reasoning effort the provider applies when the request omits reasoning_effort. Gates whether a non-default temperature or the top_p/logprobs sampling params are accepted, which hold only when the effort resolves to 'none'.", @@ -254,6 +297,10 @@ "format": "date", "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" }, + "explicit_cache_read_input_token_cost": { + "type": "number", + "minimum": 0 + }, "gemini_audio_only_live": { "type": "boolean" }, @@ -337,6 +384,10 @@ "type": "number", "minimum": 0 }, + "input_cost_per_text_message": { + "type": "number", + "minimum": 0 + }, "input_cost_per_token": { "type": "number", "minimum": 0, @@ -362,17 +413,27 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, + "input_cost_per_token_above_200k_tokens_batches": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, "input_cost_per_token_above_200k_tokens_priority": { "type": "number", "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, - "input_cost_per_token_above_256k_tokens": { + "input_cost_per_token_above_272k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "input_cost_per_token_above_272k_tokens": { + "input_cost_per_token_above_272k_tokens_batches": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "input_cost_per_token_above_272k_tokens_decisions": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -387,36 +448,33 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "input_cost_per_token_above_272k_tokens_ultrafast": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, "input_cost_per_token_above_512k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, + "input_cost_per_token_balanced": { + "type": "number", + "minimum": 0 + }, "input_cost_per_token_batches": { "type": "number", "minimum": 0, "description": "USD per prompt token via the provider's batch API." }, - "cache_creation_input_token_cost_above_272k_tokens_batches": { - "type": "number", - "minimum": 0 - }, - "cache_read_input_token_cost_above_272k_tokens_batches": { - "type": "number", - "minimum": 0 - }, - "input_cost_per_token_above_272k_tokens_batches": { - "type": "number", - "minimum": 0 - }, - "output_cost_per_token_above_272k_tokens_batches": { - "type": "number", - "minimum": 0 - }, "input_cost_per_token_cache_hit": { "type": "number", "minimum": 0 }, + "input_cost_per_token_decisions": { + "type": "number", + "minimum": 0 + }, "input_cost_per_token_flex": { "type": "number", "minimum": 0, @@ -427,6 +485,10 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "input_cost_per_token_ultrafast": { + "type": "number", + "minimum": 0 + }, "input_cost_per_video_per_second": { "type": "number", "minimum": 0 @@ -491,6 +553,7 @@ "completion", "embedding", "evaluation", + "extraction", "guardrail", "image_edit", "image_generation", @@ -641,10 +704,42 @@ "type": "number", "minimum": 0 }, + "output_cost_per_image_0.5K": { + "type": "number", + "minimum": 0 + }, + "output_cost_per_image_1024": { + "type": "number", + "minimum": 0 + }, + "output_cost_per_image_1536": { + "type": "number", + "minimum": 0 + }, + "output_cost_per_image_1K": { + "type": "number", + "minimum": 0 + }, + "output_cost_per_image_2K": { + "type": "number", + "minimum": 0 + }, + "output_cost_per_image_4K": { + "type": "number", + "minimum": 0 + }, + "output_cost_per_image_512": { + "type": "number", + "minimum": 0 + }, "output_cost_per_image_token": { "type": "number", "minimum": 0 }, + "output_cost_per_image_token_batches": { + "type": "number", + "minimum": 0 + }, "output_cost_per_pixel": { "type": "number", "minimum": 0 @@ -662,6 +757,10 @@ "type": "number", "minimum": 0 }, + "output_cost_per_second_2k": { + "type": "number", + "minimum": 0 + }, "output_cost_per_second_480p": { "type": "number", "minimum": 0 @@ -674,6 +773,10 @@ "type": "number", "minimum": 0 }, + "output_cost_per_second_768p": { + "type": "number", + "minimum": 0 + }, "output_cost_per_token": { "type": "number", "minimum": 0, @@ -699,17 +802,27 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, + "output_cost_per_token_above_200k_tokens_batches": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, "output_cost_per_token_above_200k_tokens_priority": { "type": "number", "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, - "output_cost_per_token_above_256k_tokens": { + "output_cost_per_token_above_272k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "output_cost_per_token_above_272k_tokens": { + "output_cost_per_token_above_272k_tokens_batches": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "output_cost_per_token_above_272k_tokens_decisions": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -724,16 +837,29 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "output_cost_per_token_above_272k_tokens_ultrafast": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, "output_cost_per_token_above_512k_tokens": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, + "output_cost_per_token_balanced": { + "type": "number", + "minimum": 0 + }, "output_cost_per_token_batches": { "type": "number", "minimum": 0, "description": "USD per generated token via the provider's batch API." }, + "output_cost_per_token_decisions": { + "type": "number", + "minimum": 0 + }, "output_cost_per_token_flex": { "type": "number", "minimum": 0, @@ -744,6 +870,10 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, + "output_cost_per_token_ultrafast": { + "type": "number", + "minimum": 0 + }, "output_cost_per_video_per_second": { "type": "number", "minimum": 0 @@ -825,6 +955,33 @@ }, "additionalProperties": false }, + "search_free_requests": { + "type": "object", + "description": "Free Google Search grounding requests per period, shared across models in the same shared_group.", + "required": [ + "count", + "period", + "shared_group" + ], + "additionalProperties": false, + "properties": { + "count": { + "type": "integer", + "minimum": 0 + }, + "period": { + "type": "string", + "enum": [ + "day", + "month" + ] + }, + "shared_group": { + "type": "string", + "pattern": "\\S" + } + } + }, "source": { "type": "string", "description": "URL of the provider pricing/model page this entry was taken from." @@ -899,6 +1056,24 @@ "supports_audio_output": { "type": "boolean" }, + "supports_bedrock_converse_tool_result_images": { + "type": "boolean" + }, + "supports_bedrock_native_structured_output": { + "type": "boolean" + }, + "supports_bedrock_runtime_chat_completions_inline_reasoning": { + "type": "boolean" + }, + "supports_bedrock_runtime_chat_completions_response_format": { + "type": "boolean" + }, + "supports_bedrock_runtime_chat_completions_tools_with_reasoning": { + "type": "boolean" + }, + "supports_box_questions": { + "type": "boolean" + }, "supports_computer_use": { "type": "boolean" }, @@ -971,6 +1146,9 @@ "supports_reasoning": { "type": "boolean" }, + "supports_regex_lookaround": { + "type": "boolean" + }, "supports_response_schema": { "type": "boolean" }, @@ -1064,6 +1242,43 @@ "additionalProperties": false } }, + "token_count_framing": { + "type": "integer", + "minimum": 0, + "description": "Tokens added once per request to a local count estimate, for the provider's chat framing." + }, + "token_count_model": { + "type": "object", + "required": [ + "model" + ], + "additionalProperties": false, + "properties": { + "model": { + "type": "string", + "pattern": "\\S" + }, + "region": { + "type": "string", + "pattern": "\\S" + }, + "litellm_provider": { + "type": "string", + "enum": [ + "bedrock", + "bedrock_mantle" + ] + } + }, + "description": "Model that counts tokens for this one, its counting provider, and the AWS region its count API runs in." + }, + "token_count_tokenizer": { + "type": "string", + "description": "Local tokenizer used to count tokens for this model.", + "enum": [ + "kimi_k3" + ] + }, "tpm": { "type": "integer", "minimum": 0,