{"version":"2.1.206","anchor":"model-pricing-catalog","canonical_anchor":"model-pricing-catalog","heading":"Model Pricing Catalog","tier":null,"area":null,"scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.206\/e\/model-pricing-catalog","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.206","markdown":"### Model Pricing Catalog\n\n**What**\n\nModel pricing is now baked into the model catalog at build time rather than fetched at runtime, with validation that every catalog entry has complete pricing data.\n\n**Details**\n\n- A new pricing-tier resolver (`BVo`) maps model entries to their pricing shapes, supporting both direct pricing objects and shared tier references.\n- Pricing requires `input`, `output`, `cache_write_5m`, `cache_read`, and `web_search` fields; missing fields throw at startup: \"model catalog entry '{id}' has incomplete pricing \u2014 baked entries need the full ModelCosts shape.\"\n- Model IDs must be registered in `CATALOG_MODEL_IDS`; unregistered IDs throw: \"model catalog id '{id}' missing from CATALOG_MODEL_IDS \u2014 regenerate with 'bun run generate:model-catalog'.\"\n- The first-party billing UI uses the catalog pricing to display per-token costs in the model picker.\n- Claude Sonnet 5 can show promotional pricing text when a promo expiry date is set (search for `\"promo through\"`).\n\n**Evidence**\n\nValidation error (search for `\"baked entries need the full ModelCosts shape\"`); catalog check (search for `\"model catalog id missing from CATALOG_MODEL_IDS\"`)"}