 {"id":521255,"date":"2026-06-26T08:47:35","date_gmt":"2026-06-26T15:47:35","guid":{"rendered":"https:\/\/jorgep.com\/blog\/?page_id=521255"},"modified":"2026-06-26T17:19:12","modified_gmt":"2026-06-27T00:19:12","slug":"latest-token-prices","status":"publish","type":"page","link":"https:\/\/jorgep.com\/blog\/latest-token-prices\/","title":{"rendered":"Latest Token Prices"},"content":{"rendered":"<style>.kb-row-layout-id521303_9f8b01-eb > .kt-row-column-wrap{align-content:start;}:where(.kb-row-layout-id521303_9f8b01-eb > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}.kb-row-layout-id521303_9f8b01-eb > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);grid-template-columns:minmax(0, calc(60% - ((var(--global-kb-gap-md, 2rem) * 1 )\/2)))minmax(0, calc(40% - ((var(--global-kb-gap-md, 2rem) * 1 )\/2)));}.kb-row-layout-id521303_9f8b01-eb > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){.kb-row-layout-id521303_9f8b01-eb > .kt-row-column-wrap{grid-template-columns:minmax(0, 2fr) minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id521303_9f8b01-eb > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id521303_9f8b01-eb alignnone wp-block-kadence-rowlayout\"><div class=\"kt-row-column-wrap kt-has-2-columns kt-row-layout-left-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top\">\n<style>.kadence-column521303_495eef-f2 > .kt-inside-inner-col{display:flex;}.kadence-column521303_495eef-f2 > .kt-inside-inner-col,.kadence-column521303_495eef-f2 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column521303_495eef-f2 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column521303_495eef-f2 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}.kadence-column521303_495eef-f2 > .kt-inside-inner-col > .aligncenter{width:100%;}.kt-row-column-wrap > .kadence-column521303_495eef-f2{align-self:center;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_495eef-f2{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_495eef-f2 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}.kadence-column521303_495eef-f2 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column521303_495eef-f2{position:relative;}@media all and (max-width: 1024px){.kt-row-column-wrap > .kadence-column521303_495eef-f2{align-self:center;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_495eef-f2{align-self:auto;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_495eef-f2 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 1024px){.kadence-column521303_495eef-f2 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kt-row-column-wrap > .kadence-column521303_495eef-f2{align-self:center;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_495eef-f2{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_495eef-f2 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}.kadence-column521303_495eef-f2 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column521303_495eef-f2\"><div class=\"kt-inside-inner-col\"><style>.wp-block-kadence-advancedheading.kt-adv-heading521303_7d0a79-b0, .wp-block-kadence-advancedheading.kt-adv-heading521303_7d0a79-b0[data-kb-block=\"kb-adv-heading521303_7d0a79-b0\"]{padding-top:var(--global-kb-spacing-xs, 1rem);padding-right:var(--global-kb-spacing-xs, 1rem);padding-bottom:var(--global-kb-spacing-xs, 1rem);padding-left:var(--global-kb-spacing-xs, 1rem);text-align:left;font-size:var(--global-kb-font-size-sm, 0.9rem);font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading521303_7d0a79-b0 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading521303_7d0a79-b0[data-kb-block=\"kb-adv-heading521303_7d0a79-b0\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading521303_7d0a79-b0 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading521303_7d0a79-b0[data-kb-block=\"kb-adv-heading521303_7d0a79-b0\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<p class=\"kt-adv-heading521303_7d0a79-b0 wp-block-kadence-advancedheading has-theme-palette-7-background-color has-background\" data-kb-block=\"kb-adv-heading521303_7d0a79-b0\">ChatGPT, Claude, Gemini&#8230; where was that conversation \/ image again?  Stop digging through tabs. <strong>Unified AI Chat Hub<\/strong> brings all your favorite models, chats, and AI-generated images into one searchable home. Compare responses, organize projects, and secure your ideas in one place.  <br>Your ideas \/chats and images deserve one discoverable home:     <br><strong>Learn more:<\/strong> <a href=\"https:\/\/35sites.com\/unifiedchathub\">https:\/\/35sites.com\/unifiedchathub<\/a><\/p>\n<\/div><\/div>\n\n\n<style>.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{display:flex;}.kadence-column521303_d12ef6-8b > .kt-inside-inner-col,.kadence-column521303_d12ef6-8b > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column521303_d12ef6-8b > .kt-inside-inner-col > .aligncenter{width:100%;}.kt-row-column-wrap > .kadence-column521303_d12ef6-8b{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_d12ef6-8b{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column521303_d12ef6-8b > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column521303_d12ef6-8b{position:relative;}@media all and (max-width: 1024px){.kt-row-column-wrap > .kadence-column521303_d12ef6-8b{align-self:flex-start;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_d12ef6-8b{align-self:auto;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 1024px){.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 767px){.kt-row-column-wrap > .kadence-column521303_d12ef6-8b{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_d12ef6-8b{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column521303_d12ef6-8b > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column521303_d12ef6-8b\"><div class=\"kt-inside-inner-col\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/35sites.com\/unifiedchathub\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"409\" src=\"https:\/\/jorgep.com\/blog\/wp-content\/uploads\/UnifiedChatHub-Banner-20260626125045-1024x409.png\" alt=\"\" class=\"wp-image-521289\" srcset=\"https:\/\/jorgep.com\/blog\/wp-content\/uploads\/UnifiedChatHub-Banner-20260626125045-1024x409.png 1024w, https:\/\/jorgep.com\/blog\/wp-content\/uploads\/UnifiedChatHub-Banner-20260626125045-300x120.png 300w, https:\/\/jorgep.com\/blog\/wp-content\/uploads\/UnifiedChatHub-Banner-20260626125045-768x307.png 768w, https:\/\/jorgep.com\/blog\/wp-content\/uploads\/UnifiedChatHub-Banner-20260626125045-1536x614.png 1536w, https:\/\/jorgep.com\/blog\/wp-content\/uploads\/UnifiedChatHub-Banner-20260626125045.png 1983w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div><\/div><\/div>\n\n<\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">Understanding AI Model Pricing Through OpenRouter<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">One of the biggest advantages of using OpenRouter.ai is that it provides a single API for accessing hundreds of AI models from leading providers including OpenAI, Anthropic, Google, xAI, Qwen, DeepSeek, Mistral, and many others. Rather than maintaining separate accounts and integrations for each AI vendor, developers can compare models, switch between them with minimal code changes, and choose the best model for each specific task. OpenRouter generally passes through the model provider&#8217;s published token pricing while providing a unified billing and management experience. <a href=\"https:\/\/openrouter.ai\/pricing?utm_source=jorgep.com\" target=\"_blank\" rel=\"noreferrer noopener\">OpenRouter Pricing<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The pricing information below is intended to provide a convenient comparison of many of today&#8217;s most popular frontier language models. Costs are typically shown per one million input and output tokens, making it easier to estimate application expenses across different providers. Since AI models vary significantly in capability, speed, reasoning ability, and cost, selecting the lowest-priced model is not always the most economical choice. In many cases, a faster or more capable model can complete a task using fewer prompts or less developer effort, resulting in a lower overall cost.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more information on Tokens please see my <a href=\"https:\/\/jorgep.com\/blog\/tag\/tokens\/\" data-type=\"post\" data-id=\"518307\" target=\"_blank\" rel=\"noreferrer noopener\">tokens <\/a>or my <a href=\"https:\/\/jorgep.com\/blog\/tag\/local-ai\/\" data-type=\"post_tag\" data-id=\"986\">Local AI<\/a> blog post<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-small-font-size is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Disclaimer<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AI model pricing changes frequently as providers introduce new models, adjust pricing, or offer promotional rates. Always verify current pricing before making purchasing or architectural decisions. The official OpenRouter model catalog remains the authoritative source for current pricing and availability. <a href=\"https:\/\/openrouter.ai\/pricing?utm_source=jorgep.com\" target=\"_blank\" rel=\"noreferrer noopener\">OpenRouter Model Catalog &amp; Pricing<\/a><\/li>\n\n\n\n<li>Most production AI applications <strong>do not rely on a single model<\/strong>. Instead, they route different requests to the model best suited for each task. For example, an application might use an inexpensive, high-speed model for summarization, a premium reasoning model for complex analysis, and a specialized coding model for software development. This multi-model approach often delivers the best balance of cost, performance, and quality.<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">This is a list of the latest Token prices based on the provider:<\/p>\n\n\n\n<meta charset=\"UTF-8\">\n<title>OpenRouter Pricing Explorer<\/title>\n\n<style>\nbody {\n    font-family: Arial, sans-serif;\n    margin: 20px;\n    background: #f6f7fb;\n}\n\nh1 { margin-bottom: 5px; }\n\n.card {\n    background: white;\n    padding: 12px;\n    margin-bottom: 12px;\n    border: 1px solid #eee;\n}\n\n.btn {\n    background: #007bff;\n    color: white;\n    border: none;\n    padding: 10px 16px;\n    font-size: 14px;\n    cursor: pointer;\n    border-radius: 4px;\n}\n\n.btn:hover {\n    background: #0056b3;\n}\n\n.btn-secondary {\n    background: #6c757d;\n    color: white;\n    border: none;\n    padding: 10px 16px;\n    font-size: 14px;\n    cursor: pointer;\n    border-radius: 4px;\n}\n\n.btn-secondary:hover {\n    background: #5a6268;\n}\n\ninput, select {\n    padding: 8px;\n    font-size: 14px;\n    margin-right: 8px;\n    margin-bottom: 8px;\n}\n\n\/* FILTER BAR UTILITIES *\/\n.filter-container {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 12px;\n    margin-top: 10px;\n    margin-bottom: 5px;\n    align-items: center;\n}\n\n.search-input {\n    flex: 1;\n    min-width: 250px;\n    max-width: 400px;\n    box-sizing: border-box;\n    padding: 10px;\n    font-size: 15px;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    margin: 0;\n}\n\n.filter-select {\n    min-width: 220px;\n    padding: 10px;\n    font-size: 15px;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    margin: 0;\n}\n\ntable {\n    width: 100%;\n    border-collapse: collapse;\n    background: white;\n    margin-top: 15px;\n}\n\nth {\n    background: #111;\n    color: white;\n    padding: 10px;\n    text-align: left;\n}\n\n\/* INTERACTIVE SORTING STYLES *\/\n.sortable-header {\n    cursor: pointer;\n    user-select: none;\n    position: relative;\n}\n\n.sortable-header:hover {\n    background: #222;\n}\n\n.sort-indicator {\n    margin-left: 5px;\n    font-size: 12px;\n    color: #aaa;\n}\n\ntd {\n    padding: 8px;\n    border-bottom: 1px solid #eee;\n}\n\ntr:hover {\n    background: #f2f2f2;\n}\n\nsmall {\n    color: #666;\n}\n\n\/* MODAL STYLES *\/\n.modal-backdrop {\n    display: none; \n    position: fixed;\n    top: 0; left: 0; width: 100%; height: 100%;\n    background: rgba(0, 0, 0, 0.5);\n    z-index: 1000;\n    justify-content: center;\n    align-items: center;\n}\n\n.modal-content {\n    background: white;\n    padding: 24px;\n    border-radius: 8px;\n    max-width: 850px;\n    width: 100%;\n    box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n}\n\n.modal-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 15px;\n}\n\n.modal-header h2 { margin: 0; }\n\n.close-btn {\n    background: none;\n    border: none;\n    font-size: 24px;\n    cursor: pointer;\n}\n\n.flex-container {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n    margin-bottom: 15px;\n}\n\n.flex-item {\n    display: flex;\n    flex-direction: column;\n}\n\n\/* CACHE BAR LAYOUT *\/\n.cache-controls {\n    display: inline-flex;\n    gap: 10px;\n    align-items: center;\n    margin-left: 15px;\n    background: #eef0f5;\n    padding: 4px 10px;\n    border-radius: 4px;\n}\n.cache-controls label {\n    font-size: 12px;\n    cursor: pointer;\n    font-weight: bold;\n}\n.btn-mini {\n    padding: 2px 6px;\n    font-size: 11px;\n}\n\n.copy-btn {\n    background: none;\n    border: none;\n    cursor: pointer;\n    padding: 2px 4px;\n    margin-left: 6px;\n    color: #888;\n    transition: color 0.2s;\n    vertical-align: middle;\n    line-height: 1;\n}\n\n.copy-btn:hover {\n    color: #333;\n}\n\n.copy-btn.copied {\n    color: #28a745;\n}\n\n.copy-btn svg {\n    width: 14px;\n    height: 14px;\n    vertical-align: middle;\n}\n<\/style>\n\n\n\n\n<h1>OpenRouter Pricing Explorer<\/h1>\n\n<div class=\"card\">\n<small>\nLast Updated: <span id=\"updated\">Never<\/span> |\nModels: <span id=\"count\">0<\/span> |\nStatus: <span id=\"status\">Starting&#8230;<\/span>\n\n<span class=\"cache-controls\">\n    <input type=\"radio\" id=\"modeLive\" name=\"dataMode\" value=\"live\">\n    <label for=\"modeLive\">Live Data<\/label>\n    \n    <!-- CHANGED: Default checked state switched to Cached Data -->\n    <input type=\"radio\" id=\"modeCache\" name=\"dataMode\" value=\"cache\" checked=\"\">\n    <label for=\"modeCache\">Cached Data<\/label>\n\n    <button class=\"btn-secondary btn-mini\" id=\"updateCacheBtn\">Update Cached Data<\/button>\n<\/span>\n<\/small>\n<\/div>\n\n<div class=\"card\">\n    <button class=\"btn\" id=\"openModalBtn\">Open Token Cost Calculator<\/button>\n<\/div>\n\n<div class=\"modal-backdrop\" id=\"calcModal\">\n    <div class=\"modal-content\">\n        <div class=\"modal-header\">\n            <h2>Token Cost Calculator<\/h2>\n            <button class=\"close-btn\" id=\"closeModalBtn\">\u00d7<\/button>\n        <\/div>\n\n        <div class=\"flex-container\">\n            <div class=\"flex-item\">\n                <label><b>Workload Scenario<\/b><\/label>\n                <select id=\"scenarioSelect\">\n                    <option value=\"chat\">Website Support Chat<\/option>\n                    <option value=\"docSummary\">Document Summary (30 page)<\/option>\n                    <option value=\"codeReview\">Code Review (Lower Preset)<\/option>\n                    <option value=\"blogGen\">Blog Post Gen w\/ Image (4 rev)<\/option>\n                    <option value=\"custom\">Custom<\/option>\n                <\/select>\n            <\/div>\n\n            <div class=\"flex-item\">\n                <label><b>Input Tokens<\/b><\/label>\n                <input id=\"inTok\" type=\"number\" value=\"10000\">\n            <\/div>\n            <div class=\"flex-item\">\n                <label><b>Output Tokens<\/b><\/label>\n                <input id=\"outTok\" type=\"number\" value=\"2000\">\n            <\/div>\n\n            <div class=\"flex-item\">\n                <label><b>Model Filter<\/b><\/label>\n                <select id=\"categoryFilter\">\n                    <option value=\"common\" selected=\"\">Commonly Used<\/option>\n                    <option value=\"opensource\">Open Source<\/option>\n                    <option value=\"frontier\">Frontier Models<\/option>\n                    <option value=\"jorge\">&#8220;Jorge Uses&#8221;<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <h3 id=\"calculatorTableTitle\">Cost-Effective Models<\/h3>\n        <table>\n            <thead>\n                <tr>\n                    <th>Model<\/th>\n                    <th>Input Cost<\/th>\n                    <th>Output Cost<\/th>\n                    <th>Total Cost<\/th>\n                <\/tr>\n            <\/thead>\n            <tbody id=\"calcRows\"><\/tbody>\n        <\/table>\n    <\/div>\n<\/div>\n\n<div class=\"card\">\n<h3>All Available OpenRouter Models<\/h3>\n\n<div class=\"filter-container\">\n    <input type=\"text\" id=\"searchInput\" class=\"search-input\" placeholder=\"Search by model ID...\">\n    <select id=\"contextFilter\" class=\"filter-select\">\n        <option value=\"all\">All Context Windows<\/option>\n        <option value=\"standard\">0 &#8211; 128,000 tokens<\/option>\n        <option value=\"long\">128,001 &#8211; 999,999 tokens<\/option>\n        <option value=\"ultra\">1,000,000+ tokens<\/option>\n    <\/select>\n    <select id=\"modelCategoryFilter\" class=\"filter-select\">\n        <option value=\"all\">All Models<\/option>\n        <option value=\"frontier\">Frontier<\/option>\n        <option value=\"proprietary\">Closed\/Proprietary<\/option>\n        <option value=\"opensource\">Open Source<\/option>\n        <option value=\"unknown\">Unknown<\/option>\n    <\/select>\n    <button class=\"btn-secondary\" id=\"clearFiltersBtn\">Clear Filters<\/button>\n<\/div>\n\n<table>\n<thead>\n<tr>\n    <th class=\"sortable-header\" data-column=\"id\">Model <span id=\"sort_id\" class=\"sort-indicator\">\u25b2<\/span><\/th>\n    <th class=\"sortable-header\" data-column=\"context\">Context Window <span id=\"sort_context\" class=\"sort-indicator\"><\/span><\/th>\n    <th class=\"sortable-header\" data-column=\"input\">Input ($\/1M) <span id=\"sort_input\" class=\"sort-indicator\"><\/span><\/th>\n    <th class=\"sortable-header\" data-column=\"output\">Output ($\/1M) <span id=\"sort_output\" class=\"sort-indicator\"><\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"rows\"><\/tbody>\n<\/table>\n<\/div>\n\n<script>\n\n\/\/ HARDCODED WORKLOAD SCENARIOS\nconst WORKLOAD_SCENARIOS = {\n    chat: { input: 12000, output: 1500 },\n    docSummary: { input: 45000, output: 1800 },\n    codeReview: { input: 25000, output: 3000 },\n    blogGen: { input: 12000, output: 16000 },\n    custom: { input: 2500, output: 15000 }\n};\n\nconst OPEN_SOURCE_PROVIDERS = [\n    \"meta-llama\/\",\n    \"mistralai\/\",\n    \"qwen\/\",\n    \"deepseek\/\",\n    \"nvidia\/\",\n    \"google\/gemma\",\n    \"microsoft\/phi\",\n    \"microsoft\/wizardlm\",\n    \"huggingfaceh4\/\",\n    \"teknium\/\",\n    \"openchat\/\",\n    \"cognitivecomputations\/\",\n    \"xwin-lm\/\",\n    \"allenai\/\",\n    \"togethercomputer\/\",\n    \"wizardlm\/\",\n    \"lizongzen\/\",\n    \"nousresearch\/\",\n    \"phind\/\",\n    \"internlm\/\",\n    \"01-ai\/\",\n    \"yi-\",\n    \"baichuan\/\",\n    \"codestral\/\",\n    \"mathstral\/\",\n    \"opencoder\/\",\n    \"openrouter\/auto\",\n    \"thedrummer\/\",\n    \"sao10k\/\",\n    \"sophosympatheia\/\",\n    \"neversleep\/\",\n    \"gryphe\/\",\n    \"alpindale\/\",\n    \"sao10k\/\",\n    \"l3cube\/\",\n    \"inflection\/\",\n    \"reka\/\",\n    \"ai21labs\/\",\n    \"cohere\/\",\n    \"jinaai\/\",\n    \"lightonai\/\",\n    \"arcee-ai\/\",\n    \"raifle\/\",\n    \"miqu\/\",\n    \"open-orca\/\"\n];\n\nfunction isOpenSource(modelId) {\n    const lowerId = modelId.replace(\/^~\/, \"\").toLowerCase();\n    return OPEN_SOURCE_PROVIDERS.some(provider => lowerId.includes(provider.toLowerCase()));\n}\n\nconst MANUAL_CATEGORIES = {\n    \"moonshotai\/kimi-latest\": \"proprietary\",\n    \"openai\/gpt-latest\": \"frontier\",\n    \"openai\/gpt-mini-latest\": \"proprietary\",\n    \"ai21\/jamba-large-1.7\": \"proprietary\",\n    \"aion-labs\/aion-1.0\": \"unknown\",\n    \"aion-labs\/aion-1.0-mini\": \"unknown\",\n    \"aion-labs\/aion-2.0\": \"unknown\",\n    \"aion-labs\/aion-rp-llama-3.1-8b\": \"opensource\",\n    \"anthracite-org\/magnum-v4-72b\": \"unknown\",\n    \"baidu\/ernie-4.5-vl-424b-a47b\": \"proprietary\",\n    \"bytedance-seed\/seed-1.6\": \"proprietary\",\n    \"bytedance-seed\/seed-1.6-flash\": \"proprietary\",\n    \"bytedance-seed\/seed-2.0-lite\": \"proprietary\",\n    \"bytedance-seed\/seed-2.0-mini\": \"proprietary\",\n    \"bytedance\/ui-tars-1.5-7b\": \"proprietary\",\n    \"deepcogito\/cogito-v2.1-671b\": \"unknown\",\n    \"google\/lyria-3-clip-preview\": \"proprietary\",\n    \"google\/lyria-3-pro-preview\": \"proprietary\",\n    \"ibm-granite\/granite-4.0-h-micro\": \"opensource\",\n    \"ibm-granite\/granite-4.1-8b\": \"opensource\",\n    \"inception\/mercury-2\": \"unknown\",\n    \"inclusionai\/ling-2.6-1t\": \"unknown\",\n    \"inclusionai\/ling-2.6-flash\": \"unknown\",\n    \"inclusionai\/ring-2.6-1t\": \"unknown\",\n    \"kwaipilot\/kat-coder-pro-v2\": \"proprietary\",\n    \"liquid\/lfm-2-24b-a2b\": \"opensource\",\n    \"liquid\/lfm-2.5-1.2b-instruct:free\": \"opensource\",\n    \"liquid\/lfm-2.5-1.2b-thinking:free\": \"opensource\",\n    \"mancer\/weaver\": \"unknown\",\n    \"minimax\/minimax-01\": \"proprietary\",\n    \"minimax\/minimax-m1\": \"proprietary\",\n    \"minimax\/minimax-m2\": \"proprietary\",\n    \"minimax\/minimax-m2-her\": \"proprietary\",\n    \"minimax\/minimax-m2.1\": \"proprietary\",\n    \"minimax\/minimax-m2.5\": \"proprietary\",\n    \"minimax\/minimax-m2.7\": \"proprietary\",\n    \"minimax\/minimax-m3\": \"proprietary\",\n    \"moonshotai\/kimi-k2\": \"proprietary\",\n    \"moonshotai\/kimi-k2-0905\": \"proprietary\",\n    \"moonshotai\/kimi-k2-thinking\": \"proprietary\",\n    \"moonshotai\/kimi-k2.5\": \"proprietary\",\n    \"moonshotai\/kimi-k2.6\": \"proprietary\",\n    \"moonshotai\/kimi-k2.7-code\": \"proprietary\",\n    \"morph\/morph-v3-fast\": \"proprietary\",\n    \"morph\/morph-v3-large\": \"proprietary\",\n    \"nex-agi\/nex-n2-pro\": \"unknown\",\n    \"openai\/gpt-3.5-turbo\": \"proprietary\",\n    \"openai\/gpt-3.5-turbo-0613\": \"proprietary\",\n    \"openai\/gpt-3.5-turbo-16k\": \"proprietary\",\n    \"openai\/gpt-3.5-turbo-instruct\": \"proprietary\",\n    \"openai\/gpt-5\": \"frontier\",\n    \"openai\/gpt-5-chat\": \"frontier\",\n    \"openai\/gpt-5-codex\": \"frontier\",\n    \"openai\/gpt-5-image\": \"frontier\",\n    \"openai\/gpt-5-image-mini\": \"frontier\",\n    \"openai\/gpt-5-mini\": \"frontier\",\n    \"openai\/gpt-5-nano\": \"frontier\",\n    \"openai\/gpt-5-pro\": \"frontier\",\n    \"openai\/gpt-5.1\": \"frontier\",\n    \"openai\/gpt-5.1-chat\": \"frontier\",\n    \"openai\/gpt-5.1-codex\": \"frontier\",\n    \"openai\/gpt-5.1-codex-max\": \"frontier\",\n    \"openai\/gpt-5.1-codex-mini\": \"frontier\",\n    \"openai\/gpt-5.2\": \"frontier\",\n    \"openai\/gpt-5.2-chat\": \"frontier\",\n    \"openai\/gpt-5.2-codex\": \"frontier\",\n    \"openai\/gpt-5.2-pro\": \"frontier\",\n    \"openai\/gpt-5.3-chat\": \"frontier\",\n    \"openai\/gpt-5.3-codex\": \"frontier\",\n    \"openai\/gpt-5.4\": \"frontier\",\n    \"openai\/gpt-5.4-image-2\": \"frontier\",\n    \"openai\/gpt-5.4-mini\": \"frontier\",\n    \"openai\/gpt-5.4-nano\": \"frontier\",\n    \"openai\/gpt-5.4-pro\": \"frontier\",\n    \"openai\/gpt-5.5\": \"frontier\",\n    \"openai\/gpt-5.5-pro\": \"frontier\",\n    \"openai\/gpt-audio\": \"frontier\",\n    \"openai\/gpt-audio-mini\": \"frontier\",\n    \"openai\/gpt-chat-latest\": \"frontier\",\n    \"openai\/gpt-oss-120b\": \"opensource\",\n    \"openai\/gpt-oss-120b:free\": \"opensource\",\n    \"openai\/gpt-oss-20b\": \"opensource\",\n    \"openai\/gpt-oss-20b:free\": \"opensource\",\n    \"openai\/gpt-oss-safeguard-20b\": \"opensource\",\n    \"openrouter\/bodybuilder\": \"unknown\",\n    \"openrouter\/free\": \"unknown\",\n    \"openrouter\/fusion\": \"unknown\",\n    \"openrouter\/owl-alpha\": \"unknown\",\n    \"openrouter\/pareto-code\": \"unknown\",\n    \"perceptron\/perceptron-mk1\": \"unknown\",\n    \"perplexity\/sonar\": \"proprietary\",\n    \"perplexity\/sonar-deep-research\": \"proprietary\",\n    \"perplexity\/sonar-pro\": \"proprietary\",\n    \"perplexity\/sonar-pro-search\": \"proprietary\",\n    \"perplexity\/sonar-reasoning-pro\": \"proprietary\",\n    \"poolside\/laguna-m.1\": \"opensource\",\n    \"poolside\/laguna-m.1:free\": \"opensource\",\n    \"poolside\/laguna-xs.2\": \"opensource\",\n    \"poolside\/laguna-xs.2:free\": \"opensource\",\n    \"rekaai\/reka-edge\": \"proprietary\",\n    \"rekaai\/reka-flash-3\": \"proprietary\",\n    \"relace\/relace-apply-3\": \"proprietary\",\n    \"relace\/relace-search\": \"proprietary\",\n    \"sakana\/fugu-ultra\": \"unknown\",\n    \"stepfun\/step-3.5-flash\": \"proprietary\",\n    \"stepfun\/step-3.7-flash\": \"proprietary\",\n    \"switchpoint\/router\": \"unknown\",\n    \"tencent\/hunyuan-a13b-instruct\": \"proprietary\",\n    \"tencent\/hy3-preview\": \"proprietary\",\n    \"undi95\/remm-slerp-l2-13b\": \"opensource\",\n    \"upstage\/solar-pro-3\": \"proprietary\",\n    \"writer\/palmyra-x5\": \"proprietary\",\n    \"x-ai\/grok-4.20\": \"frontier\",\n    \"x-ai\/grok-4.20-multi-agent\": \"frontier\",\n    \"x-ai\/grok-4.3\": \"frontier\",\n    \"x-ai\/grok-build-0.1\": \"frontier\",\n    \"xiaomi\/mimo-v2.5\": \"proprietary\",\n    \"xiaomi\/mimo-v2.5-pro\": \"proprietary\",\n    \"z-ai\/glm-4.5\": \"proprietary\",\n    \"z-ai\/glm-4.5-air\": \"proprietary\",\n    \"z-ai\/glm-4.5v\": \"proprietary\",\n    \"z-ai\/glm-4.6\": \"proprietary\",\n    \"z-ai\/glm-4.6v\": \"proprietary\",\n    \"z-ai\/glm-4.7\": \"proprietary\",\n    \"z-ai\/glm-4.7-flash\": \"proprietary\",\n    \"z-ai\/glm-5\": \"proprietary\",\n    \"z-ai\/glm-5-turbo\": \"proprietary\",\n    \"z-ai\/glm-5.1\": \"proprietary\",\n    \"z-ai\/glm-5.2\": \"proprietary\",\n    \"z-ai\/glm-5v-turbo\": \"proprietary\"\n};\n\nfunction isFrontier(modelId) {\n    const lowerId = modelId.replace(\/^~\/, \"\").toLowerCase();\n    return lowerId.includes(\"o1-pro\") ||\n           lowerId.includes(\"o1-preview\") ||\n           lowerId.includes(\"claude-3-opus\") ||\n           lowerId.includes(\"claude-3.5-sonnet\") ||\n           lowerId.includes(\"gemini-1.5-pro\") ||\n           lowerId.includes(\"llama-3.1-405b\") ||\n           lowerId.includes(\"grok-2\") ||\n           lowerId.includes(\"openai\/gpt-5\") ||\n           lowerId.includes(\"x-ai\/grok-4\");\n}\n\nfunction isProprietary(modelId) {\n    const lowerId = modelId.replace(\/^~\/, \"\").toLowerCase();\n    return lowerId.includes(\"anthropic\/claude\") ||\n           lowerId.includes(\"google\/gemini\") ||\n           lowerId.includes(\"openai\/gpt-4\") ||\n           lowerId.includes(\"openai\/o1\") ||\n           lowerId.includes(\"openai\/o3\") ||\n           lowerId.includes(\"openai\/o4\") ||\n           lowerId.includes(\"amazon\/nova\") ||\n           lowerId.includes(\"amazon\/\") ||\n           lowerId.includes(\"xai\/grok\") ||\n           lowerId.includes(\"cohere\/command\") ||\n           lowerId.includes(\"moonshotai\/\") ||\n           lowerId.includes(\"minimax\/\") ||\n           lowerId.includes(\"z-ai\/\") ||\n           lowerId.includes(\"perplexity\/\") ||\n           lowerId.includes(\"bytedance\") ||\n           lowerId.includes(\"tencent\/\") ||\n           lowerId.includes(\"baidu\/\") ||\n           lowerId.includes(\"stepfun\/\") ||\n           lowerId.includes(\"morph\/\") ||\n           lowerId.includes(\"kwaipilot\/\") ||\n           lowerId.includes(\"rekaai\/\") ||\n           lowerId.includes(\"writer\/\") ||\n           lowerId.includes(\"upstage\/\") ||\n           lowerId.includes(\"xiaomi\/\") ||\n           lowerId.includes(\"ai21\/\") ||\n           lowerId.includes(\"relace\/\");\n}\n\nfunction categorizeModel(modelId) {\n    const cleanId = modelId.replace(\/^~\/, \"\");\n    if (MANUAL_CATEGORIES[cleanId]) return MANUAL_CATEGORIES[cleanId];\n    if (isFrontier(cleanId)) return \"frontier\";\n    if (isProprietary(cleanId)) return \"proprietary\";\n    if (isOpenSource(cleanId)) return \"opensource\";\n    return \"unknown\";\n}\n\nconst PRESET_CATEGORIES = {\n    common: [\n        \"openai\/gpt-4o-mini\",\n        \"openai\/gpt-5\",\n        \"google\/gemini-3.5-flash\",\n        \"qwen\/qwen3-max\",\n        \"deepseek\/deepseek-chat-v3.1\",\n        \"~anthropic\/claude-sonnet-latest\"\n    ].map(s => s.trim()),\n    opensource: [\n        \"qwen\/qwen3-max\",\n        \"deepseek\/deepseek-chat\",\n        \"meta-llama\/llama-4-maverick\",\n        \"z-ai\/glm-5\",\n        \"~moonshotai\/kimi-latest\",\n        \"mistralai\/mixtral-8x22b-instruct\"\n    ].map(s => s.trim()),\n    frontier: [\n        \"openai\/gpt-4o\",\n        \"~anthropic\/claude-haiku-latest\",\n        \"~google\/gemini-flash-latest\",\n        \"x-ai\/grok-4.3\",\n        \"~anthropic\/claude-opus-latest\"\n    ].map(s => s.trim()),\n    jorge: [\n        \"minimax\/minimax-m3\",\n        \"~openai\/gpt-mini-latest\",\n        \"deepseek\/deepseek-chat\",\n        \"~moonshotai\/kimi-latest\",\n        \"~google\/gemini-flash-latest\"\n    ].map(s => s.trim())\n};\n\nlet data = [];\nconst CACHE_KEY = \"or_cache_raw_native\";\n\nlet currentSortColumn = 'id';\nlet isAscending = true;\n\nfunction clean(v) {\n    const n = parseFloat(v);\n    return isNaN(n) ? 0 : n;\n}\n\nfunction escapeHtml(text) {\n    const div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n}\n\nfunction dollars(v) {\n    if (v == null || isNaN(v)) return \"\u2014\";\n    const perMillion = v * 1_000_000;\n    return \"$\" + perMillion.toFixed(4);\n}\n\nfunction copyModelId(modelId, button) {\n    navigator.clipboard.writeText(modelId).then(() => {\n        button.classList.add(\"copied\");\n        button.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg>';\n        setTimeout(() => {\n            button.classList.remove(\"copied\");\n            button.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg>';\n        }, 1500);\n    });\n}\n\n\/* ---------------- FETCH DATA ---------------- *\/\nasync function fetchData(saveToCache = false) {\n    document.getElementById(\"status\").innerText = \"Fetching OpenRouter API...\";\n\n    try {\n        const res = await fetch(\"https:\/\/openrouter.ai\/api\/v1\/models\");\n        if (!res.ok) {\n            throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n        }\n        const json = await res.json();\n\n        data = json.data.map(m => ({\n            id: m.id ? m.id.trim() : \"\",\n            context: m.context_length || 0,\n            input: m.pricing?.prompt ? Math.max(0, clean(m.pricing.prompt)) : 0,\n            output: m.pricing?.completion ? Math.max(0, clean(m.pricing.completion)) : 0\n        }));\n\n        if (saveToCache) {\n            localStorage.setItem(CACHE_KEY, JSON.stringify({\n                updated: new Date().toISOString(),\n                data\n            }));\n            updateTimeDisplay(new Date().toISOString());\n        }\n        \n        document.getElementById(\"status\").innerText = \"Live Synchronized\";\n    } catch(e) {\n        document.getElementById(\"status\").innerText = \"Error Fetching Live Endpoint\";\n    }\n\n    render();\n}\n\n\/* ---------------- LOAD CACHE ---------------- *\/\nfunction loadCache() {\n    const raw = localStorage.getItem(CACHE_KEY);\n    if (!raw) {\n        document.getElementById(\"status\").innerText = \"No cache found. Loading live...\";\n        return false;\n    }\n\n    const cache = JSON.parse(raw);\n    data = cache.data;\n    updateTimeDisplay(cache.updated);\n    document.getElementById(\"status\").innerText = \"Loaded via local cache storage\";\n    render();\n    return true;\n}\n\nfunction updateTimeDisplay(isoString) {\n    document.getElementById(\"updated\").innerText = new Date(isoString).toLocaleString();\n}\n\n\/* ---------------- RENDERING MATRIX ---------------- *\/\nfunction render() {\n    document.getElementById(\"count\").innerText = data.length;\n    renderRawTable();\n    renderCostTable();\n}\n\nfunction renderRawTable() {\n    const searchQuery = document.getElementById(\"searchInput\").value.toLowerCase().trim();\n    const contextRange = document.getElementById(\"contextFilter\").value;\n    const modelCategory = document.getElementById(\"modelCategoryFilter\").value;\n    \n    const filteredData = data.filter(m => {\n        const matchesSearch = m.id.toLowerCase().includes(searchQuery);\n        \n        let matchesContext = true;\n        if (contextRange === \"standard\") {\n            matchesContext = (m.context >= 0 && m.context <= 128000);\n        } else if (contextRange === \"long\") {\n            matchesContext = (m.context >= 128001 && m.context <= 999999);\n        } else if (contextRange === \"ultra\") {\n            matchesContext = (m.context >= 1000000);\n        }\n        \n        let matchesCategory = true;\n        if (modelCategory !== \"all\") {\n            matchesCategory = categorizeModel(m.id) === modelCategory;\n        }\n        \n        return matchesSearch && matchesContext && matchesCategory;\n    });\n\n    filteredData.sort((a, b) => {\n        let valA = a[currentSortColumn];\n        let valB = b[currentSortColumn];\n\n        if (valA == null) return 1;\n        if (valB == null) return -1;\n\n        if (typeof valA === 'string') {\n            return isAscending ? valA.localeCompare(valB) : valB.localeCompare(valA);\n        } else {\n            return isAscending ? valA - valB : valB - valA;\n        }\n    });\n\n    const columns = ['id', 'context', 'input', 'output'];\n    columns.forEach(col => {\n        const indicator = document.getElementById(`sort_${col}`);\n        if (col === currentSortColumn) {\n            indicator.innerText = isAscending ? \" \u25b2\" : \" \u25bc\";\n        } else {\n            indicator.innerText = \"\";\n        }\n    });\n\n    document.getElementById(\"rows\").innerHTML = filteredData.length ? \n        filteredData.map(m => `\n        <tr>\n            <td>${escapeHtml(m.id)} <button class=\"copy-btn\" onclick=\"copyModelId('${m.id}', this)\" title=\"Copy model ID\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><\/button><\/td>\n            <td>${m.context.toLocaleString()}<\/td>\n            <td>${dollars(m.input)}<\/td>\n            <td>${dollars(m.output)}<\/td>\n        <\/tr>\n    `).join(\"\") : `<tr><td colspan=\"4\" style=\"text-align: center; color: #666;\">No models match your filter criteria.<\/td><\/tr>`;\n}\n\nfunction renderCostTable() {\n    const inTok = Number(document.getElementById(\"inTok\").value);\n    const outTok = Number(document.getElementById(\"outTok\").value);\n    const selectedCategory = document.getElementById(\"categoryFilter\").value;\n\n    let processedDataset = data;\n    if (PRESET_CATEGORIES[selectedCategory]) {\n        processedDataset = data.filter(m => PRESET_CATEGORIES[selectedCategory].includes(m.id));\n    }\n\n    const pricedModels = processedDataset\n        .map(m => {\n            const inputCost = inTok * m.input;\n            const outputCost = outTok * m.output;\n            const total = inputCost + outputCost;\n            return { id: m.id, inputCost, outputCost, total };\n        });\n\n    pricedModels.sort((a, b) => a.total - b.total);\n\n    const titleMap = {\n        common: \"Commonly Used Models\",\n        opensource: \"Open Source Models\",\n        frontier: \"Frontier Models\",\n        jorge: \"\\\"Jorge Uses\\\" Models\"\n    };\n    document.getElementById(\"calculatorTableTitle\").innerText = titleMap[selectedCategory] || titleMap.common;\n\n    document.getElementById(\"calcRows\").innerHTML = pricedModels.length ? pricedModels.map(m => `\n        <tr>\n            <td>${escapeHtml(m.id)} <button class=\"copy-btn\" onclick=\"copyModelId('${m.id}', this)\" title=\"Copy model ID\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><\/button><\/td>\n            <td>$${m.inputCost.toFixed(6)}<\/td>\n            <td>$${m.outputCost.toFixed(6)}<\/td>\n            <td><b>$${m.total.toFixed(6)}<\/b><\/td>\n        <\/tr>\n    `).join(\"\") : `<tr><td colspan=\"4\">No cost profiles match this range selection.<\/td><\/tr>`;\n}\n\n\/* ---------------- EVENTS & LIFECYCLE ROUTERS ---------------- *\/\ndocument.getElementsByName(\"dataMode\").forEach(radio => {\n    radio.addEventListener(\"change\", (e) => {\n        if (e.target.value === \"live\") {\n            fetchData(false);\n        } else if (e.target.value === \"cache\") {\n            const loaded = loadCache();\n            if (!loaded) {\n                document.getElementById(\"modeLive\").checked = true;\n                fetchData(false);\n            }\n        }\n    });\n});\n\ndocument.getElementById(\"updateCacheBtn\").addEventListener(\"click\", () => {\n    fetchData(true);\n});\n\ndocument.querySelectorAll(\".sortable-header\").forEach(header => {\n    header.addEventListener(\"click\", () => {\n        const targetColumn = header.getAttribute(\"data-column\");\n        if (currentSortColumn === targetColumn) {\n            isAscending = !isAscending; \n        } else {\n            currentSortColumn = targetColumn; \n            isAscending = true;               \n        }\n        renderRawTable();\n    });\n});\n\ndocument.getElementById(\"scenarioSelect\").addEventListener(\"change\", function(e) {\n    const selection = e.target.value;\n    if (WORKLOAD_SCENARIOS[selection]) {\n        document.getElementById(\"inTok\").value = WORKLOAD_SCENARIOS[selection].input;\n        document.getElementById(\"outTok\").value = WORKLOAD_SCENARIOS[selection].output;\n        renderCostTable();\n    }\n});\n\ndocument.getElementById(\"inTok\").addEventListener(\"input\", () => {\n    document.getElementById(\"scenarioSelect\").value = \"custom\";\n    renderCostTable();\n});\ndocument.getElementById(\"outTok\").addEventListener(\"input\", () => {\n    document.getElementById(\"scenarioSelect\").value = \"custom\";\n    renderCostTable();\n});\n\ndocument.getElementById(\"categoryFilter\").addEventListener(\"change\", renderCostTable);\ndocument.getElementById(\"searchInput\").addEventListener(\"input\", renderRawTable);\ndocument.getElementById(\"contextFilter\").addEventListener(\"change\", renderRawTable);\ndocument.getElementById(\"modelCategoryFilter\").addEventListener(\"change\", renderRawTable);\n\ndocument.getElementById(\"clearFiltersBtn\").addEventListener(\"click\", () => {\n    document.getElementById(\"searchInput\").value = \"\";\n    document.getElementById(\"contextFilter\").value = \"all\";\n    document.getElementById(\"modelCategoryFilter\").value = \"all\";\n    renderRawTable();\n});\n\nconst modal = document.getElementById(\"calcModal\");\ndocument.getElementById(\"openModalBtn\").addEventListener(\"click\", () => modal.style.display = \"flex\");\ndocument.getElementById(\"closeModalBtn\").addEventListener(\"click\", () => modal.style.display = \"none\");\nwindow.addEventListener(\"click\", (e) => { if (e.target === modal) modal.style.display = \"none\"; });\n\n\/* ---------------- INITIALIZATION ---------------- *\/\n(async function init() {\n    const raw = localStorage.getItem(CACHE_KEY);\n    \n    \/\/ CHANGED: Prioritize the cache load on boot to match the UI checkbox default\n    if (raw) {\n        const loaded = loadCache();\n        if (!loaded) {\n            \/\/ Fallback to Live if cache parsing failed structural integrity checks\n            document.getElementById(\"modeLive\").checked = true;\n            await fetchData(false);\n        }\n    } else {\n        \/\/ Automatically switch layout selectors if local database is missing entirely\n        document.getElementById(\"modeLive\").checked = true;\n        await fetchData(false);\n    }\n\n    \/\/ Initialize with first scenario choice defaults\n    document.getElementById(\"scenarioSelect\").value = \"chat\";\n    document.getElementById(\"inTok\").value = WORKLOAD_SCENARIOS.chat.input;\n    document.getElementById(\"outTok\").value = WORKLOAD_SCENARIOS.chat.output;\n    renderCostTable();\n})();\n\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Understanding AI Model Pricing Through OpenRouter One of the biggest advantages of using OpenRouter.ai is that it provides a single API for accessing hundreds of AI models from leading providers including OpenAI, Anthropic, Google, xAI, Qwen, DeepSeek, Mistral, and many others. Rather than maintaining separate accounts and integrations for each AI vendor, developers can compare&#8230;<\/p>\n","protected":false},"author":2,"featured_media":521103,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","ngg_post_thumbnail":0,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-521255","page","type-page","status-publish","has-post-thumbnail","hentry"],"taxonomy_info":[],"featured_image_src_large":["https:\/\/jorgep.com\/blog\/wp-content\/uploads\/FeaturedImage-TokenEcomonics.jpg",1000,375,false],"author_info":{"display_name":"Jorge Pereira","author_link":"https:\/\/jorgep.com\/blog\/author\/jorge\/"},"comment_info":0,"_links":{"self":[{"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/pages\/521255","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/comments?post=521255"}],"version-history":[{"count":43,"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/pages\/521255\/revisions"}],"predecessor-version":[{"id":521320,"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/pages\/521255\/revisions\/521320"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/media\/521103"}],"wp:attachment":[{"href":"https:\/\/jorgep.com\/blog\/wp-json\/wp\/v2\/media?parent=521255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}