@@ -7,7 +7,9 @@ export interface OfficialPriceEntry {
77 released : string ;
88 /** Exact alternate IDs used by supported gateways or manufacturer aliases. */
99 aliases ?: readonly string [ ] ;
10- /** Standard, synchronous API token rates in USD per million tokens. */
10+ /** Provider IDs where this rate is available, when it is not a general model rate. */
11+ providers ?: readonly string [ ] ;
12+ /** Published API token rates in USD per million tokens. */
1113 prices : readonly Price [ ] ;
1214 /** Manufacturer pricing page used to verify the rates. */
1315 source : string ;
@@ -17,7 +19,7 @@ export const OFFICIAL_PRICE_SNAPSHOT = {
1719 verified : "2026-09-23" ,
1820 newModelCutoff : "2026-03-22" ,
1921 entries : [
20- // OpenAI standard processing . Tier sizes are exclusive thresholds, so
22+ // OpenAI API rates . Tier sizes are exclusive thresholds, so
2123 // 272,000 implements the official ">272K input tokens" boundary.
2224 {
2325 id : "gpt-5.5" , released : "2026-04-23" , source : "https://developers.openai.com/api/docs/pricing" ,
@@ -26,6 +28,14 @@ export const OFFICIAL_PRICE_SNAPSHOT = {
2628 { tier : { type : "context" , size : 272_000 } , input : 10 , output : 45 , cache : { read : 1 } } ,
2729 ] ,
2830 } ,
31+ {
32+ id : "gpt-5.5-fast" , providers : [ "openai" ] , released : "2026-04-23" , source : "https://developers.openai.com/api/docs/pricing" ,
33+ prices : [
34+ { input : 12.5 , output : 75 , cache : { read : 1.25 } } ,
35+ // OpenAI publishes no Fast rate for GPT-5.5 above 272K input tokens.
36+ { tier : { type : "context" , size : 272_000 } } ,
37+ ] ,
38+ } ,
2939 {
3040 id : "gpt-5.5-pro" , released : "2026-04-23" , source : "https://developers.openai.com/api/docs/pricing" ,
3141 prices : [
@@ -75,6 +85,50 @@ export const OFFICIAL_PRICE_SNAPSHOT = {
7585 { tier : { type : "context" , size : 272_000 } , input : 0.2 , output : 0.75 , cache : { read : 0.02 , write : 0.25 } } ,
7686 ] ,
7787 } ,
88+ {
89+ // OpenAI Fast processing is a separate exact ID and restricted to the
90+ // first-party provider so ordinary or gateway model IDs keep standard rates.
91+ id : "gpt-6-luna-fast" , providers : [ "openai" ] , released : "2026-09-22" , source : "https://developers.openai.com/api/docs/pricing" ,
92+ prices : [
93+ { input : 0.2 , output : 1 , cache : { read : 0.02 , write : 0.25 } } ,
94+ { tier : { type : "context" , size : 272_000 } , input : 0.4 , output : 1.5 , cache : { read : 0.04 , write : 0.5 } } ,
95+ ] ,
96+ } ,
97+ {
98+ id : "gpt-5.6-sol-fast" , providers : [ "openai" ] , released : "2026-07-09" , source : "https://developers.openai.com/api/docs/pricing" ,
99+ prices : [
100+ { input : 8 , output : 40 , cache : { read : 0.8 , write : 10 } } ,
101+ { tier : { type : "context" , size : 272_000 } , input : 16 , output : 60 , cache : { read : 1.6 , write : 20 } } ,
102+ ] ,
103+ } ,
104+ {
105+ id : "gpt-5.6-terra-fast" , providers : [ "openai" ] , released : "2026-07-09" , source : "https://developers.openai.com/api/docs/pricing" ,
106+ prices : [
107+ { input : 4 , output : 24 , cache : { read : 0.4 , write : 5 } } ,
108+ { tier : { type : "context" , size : 272_000 } , input : 8 , output : 36 , cache : { read : 0.8 , write : 10 } } ,
109+ ] ,
110+ } ,
111+ {
112+ id : "gpt-5.6-luna-fast" , providers : [ "openai" ] , released : "2026-07-09" , source : "https://developers.openai.com/api/docs/pricing" ,
113+ prices : [
114+ { input : 0.4 , output : 2.4 , cache : { read : 0.04 , write : 0.5 } } ,
115+ { tier : { type : "context" , size : 272_000 } , input : 0.8 , output : 3.6 , cache : { read : 0.08 , write : 1 } } ,
116+ ] ,
117+ } ,
118+ {
119+ id : "gpt-6-astra-fast" , providers : [ "openai" ] , released : "2026-09-04" , source : "https://developers.openai.com/api/docs/pricing" ,
120+ prices : [
121+ { input : 20 , output : 100 , cache : { read : 2 , write : 25 } } ,
122+ { tier : { type : "context" , size : 272_000 } , input : 40 , output : 150 , cache : { read : 4 , write : 50 } } ,
123+ ] ,
124+ } ,
125+ {
126+ id : "gpt-6-sol-fast" , providers : [ "openai" ] , released : "2026-09-22" , source : "https://developers.openai.com/api/docs/pricing" ,
127+ prices : [
128+ { input : 4 , output : 20 , cache : { read : 0.4 , write : 5 } } ,
129+ { tier : { type : "context" , size : 272_000 } , input : 8 , output : 30 , cache : { read : 0.8 , write : 10 } } ,
130+ ] ,
131+ } ,
78132 // The official ChatGPT SKU `chat-latest`. OpenRouter serves it under the
79133 // slug `openai/gpt-chat-latest`, which is registered as an exact alias.
80134 {
@@ -105,6 +159,20 @@ export const OFFICIAL_PRICE_SNAPSHOT = {
105159 id : "claude-opus-5" , released : "2026-07-24" , source : "https://platform.claude.com/docs/en/about-claude/pricing" ,
106160 prices : [ { input : 5 , output : 25 , cache : { read : 0.5 , write : 6.25 } } ] ,
107161 } ,
162+ {
163+ // Fast mode is first-party Claude API only. Cache multipliers apply to
164+ // the Fast input price; aggregate cache writes use the 5-minute rate.
165+ id : "claude-opus-5-fast" , providers : [ "anthropic" ] , released : "2026-07-24" , source : "https://platform.claude.com/docs/en/about-claude/pricing" ,
166+ prices : [ { input : 10 , output : 50 , cache : { read : 1 , write : 12.5 } } ] ,
167+ } ,
168+ {
169+ id : "claude-opus-4-8-fast" , providers : [ "anthropic" ] , released : "2026-05-28" , source : "https://platform.claude.com/docs/en/about-claude/pricing" ,
170+ prices : [ { input : 10 , output : 50 , cache : { read : 1 , write : 12.5 } } ] ,
171+ } ,
172+ {
173+ id : "claude-opus-5-5-fast" , providers : [ "anthropic" ] , released : "2026-09-22" , source : "https://platform.claude.com/docs/en/about-claude/pricing" ,
174+ prices : [ { input : 8 , output : 40 , cache : { read : 0.4 , write : 10 } } ] ,
175+ } ,
108176 {
109177 id : "claude-fable-5-1" , aliases : [ "claude-fable-5.1" ] , released : "2026-09-01" ,
110178 source : "https://platform.claude.com/docs/en/about-claude/pricing" ,
@@ -536,14 +604,20 @@ export function officialPrice(model: ModelRef): OfficialPriceEntry | undefined {
536604 if ( slash >= 0 ) candidates . push ( id . slice ( slash + 1 ) ) ;
537605 const dot = id . lastIndexOf ( "." ) ;
538606 if ( dot >= 0 ) candidates . push ( id . slice ( dot + 1 ) ) ;
539- for ( const candidate of candidates ) {
607+ const available = ( candidate : string ) => {
540608 const entry = index . get ( candidate ) ;
609+ return entry && ( ! entry . providers || entry . providers . some ( provider => provider . toLowerCase ( ) === model . providerID . toLowerCase ( ) ) )
610+ ? entry
611+ : undefined ;
612+ } ;
613+ for ( const candidate of candidates ) {
614+ const entry = available ( candidate ) ;
541615 if ( entry ) return entry ;
542616 }
543617 for ( const candidate of candidates ) {
544618 for ( const suffix of [ "-free" , ":free" ] ) {
545619 if ( ! candidate . endsWith ( suffix ) ) continue ;
546- const entry = index . get ( candidate . slice ( 0 , - suffix . length ) ) ;
620+ const entry = available ( candidate . slice ( 0 , - suffix . length ) ) ;
547621 if ( entry ) return entry ;
548622 }
549623 }
0 commit comments