diff --git a/model_prices_and_context_window.schema.json b/model_prices_and_context_window.schema.json index 327058d2f93..d4dfeb25429 100644 --- a/model_prices_and_context_window.schema.json +++ b/model_prices_and_context_window.schema.json @@ -83,7 +83,12 @@ "minimum": 0, "description": "USD per token written to the provider's prompt cache." }, - "cache_creation_input_token_cost_above_128k_tokens": { + "cache_creation_input_token_cost_above_100k_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_100k_tokens_batches": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -93,6 +98,11 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, + "cache_creation_input_token_cost_above_1hr_above_100k_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_above_200k_tokens": { "type": "number", "minimum": 0, @@ -103,16 +113,6 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_creation_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." - }, - "cache_creation_input_token_cost_above_256k_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": { "type": "number", "minimum": 0, @@ -123,6 +123,11 @@ "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." + }, "cache_creation_input_token_cost_above_272k_tokens_flex": { "type": "number", "minimum": 0, @@ -138,15 +143,14 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_creation_input_token_cost_above_32k_tokens": { - "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, @@ -174,7 +178,12 @@ "minimum": 0, "description": "USD per prompt token served from the provider's prompt cache." }, - "cache_read_input_token_cost_above_128k_tokens": { + "cache_read_input_token_cost_above_100k_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_100k_tokens_batches": { "type": "number", "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." @@ -194,11 +203,6 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, - "cache_read_input_token_cost_above_256k_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": { "type": "number", "minimum": 0, @@ -209,6 +213,11 @@ "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." + }, "cache_read_input_token_cost_above_272k_tokens_flex": { "type": "number", "minimum": 0, @@ -224,11 +233,6 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "cache_read_input_token_cost_above_32k_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_512k_tokens": { "type": "number", "minimum": 0, @@ -242,6 +246,10 @@ "type": "number", "minimum": 0 }, + "cache_read_input_token_cost_decisions": { + "type": "number", + "minimum": 0 + }, "cache_read_input_token_cost_flex": { "type": "number", "minimum": 0, @@ -289,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" }, @@ -372,11 +384,25 @@ "type": "number", "minimum": 0 }, + "input_cost_per_text_message": { + "type": "number", + "minimum": 0 + }, "input_cost_per_token": { "type": "number", "minimum": 0, "description": "USD per prompt token." }, + "input_cost_per_token_above_100k_tokens": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "input_cost_per_token_above_100k_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_128k_tokens": { "type": "number", "minimum": 0, @@ -397,11 +423,6 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, - "input_cost_per_token_above_256k_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": { "type": "number", "minimum": 0, @@ -412,6 +433,11 @@ "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." + }, "input_cost_per_token_above_272k_tokens_flex": { "type": "number", "minimum": 0, @@ -427,11 +453,6 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "input_cost_per_token_above_32k_tokens": { - "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, @@ -450,6 +471,10 @@ "type": "number", "minimum": 0 }, + "input_cost_per_token_decisions": { + "type": "number", + "minimum": 0 + }, "input_cost_per_token_flex": { "type": "number", "minimum": 0, @@ -528,6 +553,7 @@ "completion", "embedding", "evaluation", + "extraction", "guardrail", "image_edit", "image_generation", @@ -710,6 +736,10 @@ "type": "number", "minimum": 0 }, + "output_cost_per_image_token_batches": { + "type": "number", + "minimum": 0 + }, "output_cost_per_pixel": { "type": "number", "minimum": 0 @@ -752,6 +782,16 @@ "minimum": 0, "description": "USD per generated token." }, + "output_cost_per_token_above_100k_tokens": { + "type": "number", + "minimum": 0, + "description": "Rate applied once the prompt exceeds the token threshold in the field name." + }, + "output_cost_per_token_above_100k_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_128k_tokens": { "type": "number", "minimum": 0, @@ -772,11 +812,6 @@ "minimum": 0, "description": "Priority service-tier rate for the same-named base field." }, - "output_cost_per_token_above_256k_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": { "type": "number", "minimum": 0, @@ -787,6 +822,11 @@ "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." + }, "output_cost_per_token_above_272k_tokens_flex": { "type": "number", "minimum": 0, @@ -802,11 +842,6 @@ "minimum": 0, "description": "Rate applied once the prompt exceeds the token threshold in the field name." }, - "output_cost_per_token_above_32k_tokens": { - "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, @@ -821,6 +856,10 @@ "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, @@ -916,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." @@ -990,15 +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" }, @@ -1071,6 +1146,9 @@ "supports_reasoning": { "type": "boolean" }, + "supports_regex_lookaround": { + "type": "boolean" + }, "supports_response_schema": { "type": "boolean" }, @@ -1169,6 +1247,31 @@ "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": "Tokenizer litellm counts this model's requests with when the provider cannot count them.", diff --git a/tests/unit/test_model_prices_schema.py b/tests/unit/test_model_prices_schema.py index 7723a9f2631..22ec95a935e 100644 --- a/tests/unit/test_model_prices_schema.py +++ b/tests/unit/test_model_prices_schema.py @@ -588,3 +588,11 @@ def test_unregistered_provider_guard_flags_only_labels_nobody_registered(): "unknown_root-new_family_models", "vertex_ai-new_family_models", ] + + +@pytest.mark.parametrize("path", (PRICES_PATH, BACKUP_PRICES_PATH), ids=("main", "backup")) +def test_mirrored_catalog_validates_against_its_schema(path: Path) -> None: + schema: Final = json.loads((REPO_ROOT / "model_prices_and_context_window.schema.json").read_text()) + validator: Final = jsonschema.validators.validator_for(schema)(schema) + errors: Final = tuple(error.message for error in validator.iter_errors(json.loads(path.read_text()))) + assert errors == ()