@velum-labs/routekit-registry 1.3.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,3 +3,7 @@
3
3
  Product-neutral generated provider, subscription, catalog, capability, pricing,
4
4
  and local model metadata from `spec/registry`. RouteKit packages consume this
5
5
  neutral registry surface only.
6
+
7
+ `CostService` is the shared pricing, pre-run estimation, and observed-actuals
8
+ capability. Unknown pricing, billing modes, reasoning-token multipliers, and
9
+ missing usage remain explicit instead of becoming zero.
@@ -19,6 +19,12 @@ export declare const REGISTRY: {
19
19
  auth: string;
20
20
  responseShape: string;
21
21
  };
22
+ module: {
23
+ protocol: string;
24
+ accountClass: string;
25
+ billingMode: string;
26
+ firstLaunch: boolean;
27
+ };
22
28
  };
23
29
  anthropic: {
24
30
  baseUrl: string;
@@ -46,6 +52,12 @@ export declare const REGISTRY: {
46
52
  };
47
53
  responseShape: string;
48
54
  };
55
+ module: {
56
+ protocol: string;
57
+ accountClass: string;
58
+ billingMode: string;
59
+ firstLaunch: boolean;
60
+ };
49
61
  };
50
62
  bedrock: {
51
63
  $comment: string;
@@ -59,6 +71,12 @@ export declare const REGISTRY: {
59
71
  auth: string;
60
72
  responseShape: string;
61
73
  };
74
+ module: {
75
+ protocol: string;
76
+ accountClass: string;
77
+ billingMode: string;
78
+ firstLaunch: boolean;
79
+ };
62
80
  };
63
81
  google: {
64
82
  baseUrl: string;
@@ -78,6 +96,12 @@ export declare const REGISTRY: {
78
96
  auth: string;
79
97
  responseShape: string;
80
98
  };
99
+ module: {
100
+ protocol: string;
101
+ accountClass: string;
102
+ billingMode: string;
103
+ firstLaunch: boolean;
104
+ };
81
105
  };
82
106
  openrouter: {
83
107
  baseUrl: string;
@@ -106,6 +130,12 @@ export declare const REGISTRY: {
106
130
  responseShape: string;
107
131
  pickerDefaultSource: string;
108
132
  };
133
+ module: {
134
+ protocol: string;
135
+ accountClass: string;
136
+ billingMode: string;
137
+ firstLaunch: boolean;
138
+ };
109
139
  };
110
140
  cliproxy: {
111
141
  $comment: string;
@@ -127,6 +157,12 @@ export declare const REGISTRY: {
127
157
  auth: string;
128
158
  responseShape: string;
129
159
  };
160
+ module: {
161
+ protocol: string;
162
+ accountClass: string;
163
+ billingMode: string;
164
+ firstLaunch: boolean;
165
+ };
130
166
  };
131
167
  codex: {
132
168
  baseUrl: string;
@@ -141,15 +177,48 @@ export declare const REGISTRY: {
141
177
  auth: string;
142
178
  responseShape: string;
143
179
  };
180
+ module: {
181
+ protocol: string;
182
+ accountClass: string;
183
+ billingMode: string;
184
+ firstLaunch: boolean;
185
+ };
144
186
  };
145
187
  "ai-gateway": {
146
188
  baseUrl: string;
147
189
  keyEnv: string;
148
190
  baseUrlEnv: string;
191
+ apiCompatibility: string;
192
+ wire: {
193
+ protocol: string;
194
+ basePath: string;
195
+ };
196
+ discovery: {
197
+ path: string;
198
+ auth: string;
199
+ responseShape: string;
200
+ };
201
+ module: {
202
+ protocol: string;
203
+ accountClass: string;
204
+ billingMode: string;
205
+ firstLaunch: boolean;
206
+ };
207
+ keyProbe: {
208
+ path: string;
209
+ auth: string;
210
+ invalidStatuses: number[];
211
+ };
149
212
  };
150
213
  "openai-compatible": {
151
214
  baseUrl: string;
152
215
  apiCompatibility: string;
216
+ module: {
217
+ protocol: string;
218
+ accountClass: string;
219
+ billingMode: string;
220
+ firstLaunch: boolean;
221
+ };
153
222
  };
154
223
  "mlx-lm": {
155
224
  apiCompatibility: string;
@@ -157,6 +226,52 @@ export declare const REGISTRY: {
157
226
  mlx: {};
158
227
  custom: {
159
228
  apiCompatibility: string;
229
+ module: {
230
+ protocol: string;
231
+ accountClass: string;
232
+ billingMode: string;
233
+ firstLaunch: boolean;
234
+ };
235
+ };
236
+ "claude-code": {
237
+ $comment: string;
238
+ apiCompatibility: string;
239
+ module: {
240
+ protocol: string;
241
+ accountClass: string;
242
+ billingMode: string;
243
+ firstLaunch: boolean;
244
+ };
245
+ };
246
+ "openai-azure": {
247
+ $comment: string;
248
+ apiCompatibility: string;
249
+ module: {
250
+ protocol: string;
251
+ accountClass: string;
252
+ billingMode: string;
253
+ firstLaunch: boolean;
254
+ };
255
+ };
256
+ "google-vertex": {
257
+ $comment: string;
258
+ apiCompatibility: string;
259
+ module: {
260
+ protocol: string;
261
+ accountClass: string;
262
+ billingMode: string;
263
+ firstLaunch: boolean;
264
+ };
265
+ };
266
+ "fake-openai": {
267
+ $comment: string;
268
+ apiCompatibility: string;
269
+ module: {
270
+ protocol: string;
271
+ accountClass: string;
272
+ billingMode: string;
273
+ firstLaunch: boolean;
274
+ };
160
275
  };
161
276
  };
162
277
  subscriptions: {
@@ -183,6 +298,15 @@ export declare const REGISTRY: {
183
298
  oauth: {
184
299
  tokenEndpoint: string;
185
300
  clientId: string;
301
+ authorizeUrl: string;
302
+ redirectUri: string;
303
+ manualRedirectUri: string;
304
+ scopes: string;
305
+ codeChallengeMethod: string;
306
+ tokenRequestFormat: string;
307
+ authorizeExtraParams: {
308
+ code: string;
309
+ };
186
310
  usageEndpoint: string;
187
311
  profileEndpoint: string;
188
312
  };
@@ -234,8 +358,23 @@ export declare const REGISTRY: {
234
358
  omitSampling: boolean;
235
359
  };
236
360
  oauth: {
361
+ issuer: string;
237
362
  tokenEndpoint: string;
238
363
  clientId: string;
364
+ authorizeUrl: string;
365
+ redirectUri: string;
366
+ scopes: string;
367
+ codeChallengeMethod: string;
368
+ tokenRequestFormat: string;
369
+ authorizeExtraParams: {
370
+ id_token_add_organizations: string;
371
+ codex_cli_simplified_flow: string;
372
+ originator: string;
373
+ };
374
+ deviceVerificationUrl: string;
375
+ deviceUserCodeEndpoint: string;
376
+ deviceTokenPollEndpoint: string;
377
+ deviceRedirectUri: string;
239
378
  usageEndpoint: string;
240
379
  usagePathFallback: string;
241
380
  resetCreditsEndpoint: string;
@@ -370,18 +509,22 @@ export declare const REGISTRY: {
370
509
  models: {
371
510
  "claude-haiku": {
372
511
  inputPer1mTokens: number;
512
+ cachedInputPer1mTokens: number;
373
513
  outputPer1mTokens: number;
374
514
  };
375
515
  "claude-opus": {
376
516
  inputPer1mTokens: number;
517
+ cachedInputPer1mTokens: number;
377
518
  outputPer1mTokens: number;
378
519
  };
379
520
  "claude-sonnet": {
380
521
  inputPer1mTokens: number;
522
+ cachedInputPer1mTokens: number;
381
523
  outputPer1mTokens: number;
382
524
  };
383
525
  "claude-sonnet-4-6": {
384
526
  inputPer1mTokens: number;
527
+ cachedInputPer1mTokens: number;
385
528
  outputPer1mTokens: number;
386
529
  };
387
530
  "gemini-2.5-flash": {
@@ -394,22 +537,47 @@ export declare const REGISTRY: {
394
537
  };
395
538
  "gpt-4.1": {
396
539
  inputPer1mTokens: number;
540
+ cachedInputPer1mTokens: number;
397
541
  outputPer1mTokens: number;
398
542
  };
399
543
  "gpt-4o": {
400
544
  inputPer1mTokens: number;
545
+ cachedInputPer1mTokens: number;
401
546
  outputPer1mTokens: number;
402
547
  };
403
548
  "gpt-5": {
404
549
  inputPer1mTokens: number;
550
+ cachedInputPer1mTokens: number;
405
551
  outputPer1mTokens: number;
406
552
  };
407
553
  "gpt-5.5": {
408
554
  inputPer1mTokens: number;
555
+ cachedInputPer1mTokens: number;
556
+ outputPer1mTokens: number;
557
+ };
558
+ "gpt-5.6-luna": {
559
+ inputPer1mTokens: number;
560
+ cachedInputPer1mTokens: number;
561
+ outputPer1mTokens: number;
562
+ };
563
+ "gpt-5.6-sol": {
564
+ inputPer1mTokens: number;
565
+ cachedInputPer1mTokens: number;
566
+ outputPer1mTokens: number;
567
+ };
568
+ "gpt-5.6-terra": {
569
+ inputPer1mTokens: number;
570
+ cachedInputPer1mTokens: number;
571
+ outputPer1mTokens: number;
572
+ };
573
+ "gpt-6-astra": {
574
+ inputPer1mTokens: number;
575
+ cachedInputPer1mTokens: number;
409
576
  outputPer1mTokens: number;
410
577
  };
411
578
  o3: {
412
579
  inputPer1mTokens: number;
580
+ cachedInputPer1mTokens: number;
413
581
  outputPer1mTokens: number;
414
582
  };
415
583
  };
@@ -418,6 +586,7 @@ export declare const REGISTRY: {
418
586
  "claude-haiku-4-5": string;
419
587
  "claude-opus-4-8": string;
420
588
  "claude-sonnet-4-5": string;
589
+ "codex/gpt-6-astra": string;
421
590
  "gpt-4.1-mini": string;
422
591
  "gpt-5.1": string;
423
592
  "gpt-5.1-codex": string;
@@ -425,6 +594,7 @@ export declare const REGISTRY: {
425
594
  "gpt-5.5-2026-05": string;
426
595
  "gpt-5.5-codex": string;
427
596
  "openai/gpt-5.5": string;
597
+ "openai/gpt-6-astra": string;
428
598
  };
429
599
  manualOverrides: {};
430
600
  };
@@ -22,6 +22,12 @@ export const REGISTRY = {
22
22
  "path": "/v1/models",
23
23
  "auth": "bearer",
24
24
  "responseShape": "openai"
25
+ },
26
+ "module": {
27
+ "protocol": "openai",
28
+ "accountClass": "api-key",
29
+ "billingMode": "metered-api",
30
+ "firstLaunch": true
25
31
  }
26
32
  },
27
33
  "anthropic": {
@@ -52,6 +58,12 @@ export const REGISTRY = {
52
58
  "anthropic-version": "2023-06-01"
53
59
  },
54
60
  "responseShape": "anthropic"
61
+ },
62
+ "module": {
63
+ "protocol": "anthropic",
64
+ "accountClass": "api-key",
65
+ "billingMode": "metered-api",
66
+ "firstLaunch": true
55
67
  }
56
68
  },
57
69
  "bedrock": {
@@ -65,6 +77,12 @@ export const REGISTRY = {
65
77
  "path": "ListFoundationModels+ListInferenceProfiles",
66
78
  "auth": "aws-sdk",
67
79
  "responseShape": "bedrock"
80
+ },
81
+ "module": {
82
+ "protocol": "bedrock",
83
+ "accountClass": "api-key",
84
+ "billingMode": "metered-api",
85
+ "firstLaunch": true
68
86
  }
69
87
  },
70
88
  "google": {
@@ -88,6 +106,12 @@ export const REGISTRY = {
88
106
  "path": "/v1beta/models",
89
107
  "auth": "x-goog-api-key",
90
108
  "responseShape": "google"
109
+ },
110
+ "module": {
111
+ "protocol": "google",
112
+ "accountClass": "api-key",
113
+ "billingMode": "metered-api",
114
+ "firstLaunch": false
91
115
  }
92
116
  },
93
117
  "openrouter": {
@@ -119,6 +143,12 @@ export const REGISTRY = {
119
143
  },
120
144
  "responseShape": "openai",
121
145
  "pickerDefaultSource": "curated"
146
+ },
147
+ "module": {
148
+ "protocol": "openai",
149
+ "accountClass": "api-key",
150
+ "billingMode": "metered-api",
151
+ "firstLaunch": true
122
152
  }
123
153
  },
124
154
  "cliproxy": {
@@ -143,6 +173,12 @@ export const REGISTRY = {
143
173
  "path": "/v1/models",
144
174
  "auth": "bearer",
145
175
  "responseShape": "openai"
176
+ },
177
+ "module": {
178
+ "protocol": "openai",
179
+ "accountClass": "proxy",
180
+ "billingMode": "upstream-managed",
181
+ "firstLaunch": false
146
182
  }
147
183
  },
148
184
  "codex": {
@@ -160,23 +196,105 @@ export const REGISTRY = {
160
196
  "path": "/models",
161
197
  "auth": "bearer",
162
198
  "responseShape": "codex"
199
+ },
200
+ "module": {
201
+ "protocol": "codex",
202
+ "accountClass": "subscription",
203
+ "billingMode": "subscription",
204
+ "firstLaunch": true
163
205
  }
164
206
  },
165
207
  "ai-gateway": {
166
208
  "baseUrl": "https://ai-gateway.vercel.sh",
167
209
  "keyEnv": "AI_GATEWAY_API_KEY",
168
- "baseUrlEnv": "AI_GATEWAY_BASE_URL"
210
+ "baseUrlEnv": "AI_GATEWAY_BASE_URL",
211
+ "apiCompatibility": "openai-chat-completions",
212
+ "wire": {
213
+ "protocol": "openai",
214
+ "basePath": "/v1"
215
+ },
216
+ "discovery": {
217
+ "path": "/v1/models",
218
+ "auth": "bearer",
219
+ "responseShape": "openai"
220
+ },
221
+ "module": {
222
+ "protocol": "openai",
223
+ "accountClass": "api-key",
224
+ "billingMode": "metered-api",
225
+ "firstLaunch": false
226
+ },
227
+ "keyProbe": {
228
+ "path": "/v1/credits",
229
+ "auth": "bearer",
230
+ "invalidStatuses": [
231
+ 401,
232
+ 403
233
+ ]
234
+ }
169
235
  },
170
236
  "openai-compatible": {
171
237
  "baseUrl": "http://127.0.0.1",
172
- "apiCompatibility": "openai-chat-completions"
238
+ "apiCompatibility": "openai-chat-completions",
239
+ "module": {
240
+ "protocol": "openai",
241
+ "accountClass": "api-key",
242
+ "billingMode": "metered-api",
243
+ "firstLaunch": false
244
+ }
173
245
  },
174
246
  "mlx-lm": {
175
247
  "apiCompatibility": "mlx-lm-server"
176
248
  },
177
249
  "mlx": {},
178
250
  "custom": {
179
- "apiCompatibility": "custom"
251
+ "apiCompatibility": "custom",
252
+ "module": {
253
+ "protocol": "openai",
254
+ "accountClass": "api-key",
255
+ "billingMode": "metered-api",
256
+ "firstLaunch": false
257
+ }
258
+ },
259
+ "claude-code": {
260
+ "$comment": "Claude Code OAuth subscription module; operational metadata lives in subscriptions.json.",
261
+ "apiCompatibility": "anthropic-messages",
262
+ "module": {
263
+ "protocol": "anthropic",
264
+ "accountClass": "subscription",
265
+ "billingMode": "subscription",
266
+ "firstLaunch": true
267
+ }
268
+ },
269
+ "openai-azure": {
270
+ "$comment": "Azure OpenAI deployment-scoped REST source.",
271
+ "apiCompatibility": "openai-chat-completions",
272
+ "module": {
273
+ "protocol": "openai",
274
+ "accountClass": "api-key",
275
+ "billingMode": "metered-api",
276
+ "firstLaunch": false
277
+ }
278
+ },
279
+ "google-vertex": {
280
+ "$comment": "Vertex AI publisher models authenticated with Application Default Credentials.",
281
+ "apiCompatibility": "google-generate-content",
282
+ "module": {
283
+ "protocol": "google",
284
+ "accountClass": "iam",
285
+ "billingMode": "metered-api",
286
+ "firstLaunch": false
287
+ }
288
+ },
289
+ "fake-openai": {
290
+ "$comment": "Private test fixture proving catalog-backed provider extensibility.",
291
+ "apiCompatibility": "openai-chat-completions",
292
+ "module": {
293
+ "protocol": "openai",
294
+ "accountClass": "api-key",
295
+ "billingMode": "metered-api",
296
+ "firstLaunch": false
297
+ }
180
298
  }
181
299
  },
182
300
  "subscriptions": {
@@ -201,8 +319,17 @@ export const REGISTRY = {
201
319
  }
202
320
  },
203
321
  "oauth": {
204
- "tokenEndpoint": "https://console.anthropic.com/v1/oauth/token",
322
+ "tokenEndpoint": "https://platform.claude.com/v1/oauth/token",
205
323
  "clientId": "9d1c250a-e61b-44d9-88ed-5944d1962f5e",
324
+ "authorizeUrl": "https://claude.com/cai/oauth/authorize",
325
+ "redirectUri": "http://localhost:54545/callback",
326
+ "manualRedirectUri": "https://platform.claude.com/oauth/code/callback",
327
+ "scopes": "org:create_api_key user:profile user:inference",
328
+ "codeChallengeMethod": "S256",
329
+ "tokenRequestFormat": "json",
330
+ "authorizeExtraParams": {
331
+ "code": "true"
332
+ },
206
333
  "usageEndpoint": "https://api.anthropic.com/api/oauth/usage",
207
334
  "profileEndpoint": "https://api.anthropic.com/api/oauth/profile"
208
335
  },
@@ -243,7 +370,7 @@ export const REGISTRY = {
243
370
  "discovery": {
244
371
  "path": "/models",
245
372
  "responseShape": "codex",
246
- "clientVersion": "0.145.0",
373
+ "clientVersion": "0.153.0",
247
374
  "cacheFallback": true,
248
375
  "extraHeaders": {
249
376
  "OpenAI-Beta": "responses=v1",
@@ -260,8 +387,23 @@ export const REGISTRY = {
260
387
  "omitSampling": true
261
388
  },
262
389
  "oauth": {
390
+ "issuer": "https://auth.openai.com",
263
391
  "tokenEndpoint": "https://auth.openai.com/oauth/token",
264
392
  "clientId": "app_EMoamEEZ73f0CkXaXp7hrann",
393
+ "authorizeUrl": "https://auth.openai.com/oauth/authorize",
394
+ "redirectUri": "http://localhost:1455/auth/callback",
395
+ "scopes": "openid profile email offline_access api.connectors.read api.connectors.invoke",
396
+ "codeChallengeMethod": "S256",
397
+ "tokenRequestFormat": "form",
398
+ "authorizeExtraParams": {
399
+ "id_token_add_organizations": "true",
400
+ "codex_cli_simplified_flow": "true",
401
+ "originator": "routekit"
402
+ },
403
+ "deviceVerificationUrl": "https://auth.openai.com/codex/device",
404
+ "deviceUserCodeEndpoint": "https://auth.openai.com/api/accounts/deviceauth/usercode",
405
+ "deviceTokenPollEndpoint": "https://auth.openai.com/api/accounts/deviceauth/token",
406
+ "deviceRedirectUri": "https://auth.openai.com/deviceauth/callback",
265
407
  "usageEndpoint": "https://chatgpt.com/backend-api/wham/usage",
266
408
  "usagePathFallback": "/api/codex/usage",
267
409
  "resetCreditsEndpoint": "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits"
@@ -484,18 +626,22 @@ export const REGISTRY = {
484
626
  "models": {
485
627
  "claude-haiku": {
486
628
  "inputPer1mTokens": 1,
629
+ "cachedInputPer1mTokens": 0.1,
487
630
  "outputPer1mTokens": 5
488
631
  },
489
632
  "claude-opus": {
490
633
  "inputPer1mTokens": 15,
634
+ "cachedInputPer1mTokens": 1.5,
491
635
  "outputPer1mTokens": 75
492
636
  },
493
637
  "claude-sonnet": {
494
638
  "inputPer1mTokens": 3,
639
+ "cachedInputPer1mTokens": 0.3,
495
640
  "outputPer1mTokens": 15
496
641
  },
497
642
  "claude-sonnet-4-6": {
498
643
  "inputPer1mTokens": 3,
644
+ "cachedInputPer1mTokens": 0.3,
499
645
  "outputPer1mTokens": 15
500
646
  },
501
647
  "gemini-2.5-flash": {
@@ -508,22 +654,47 @@ export const REGISTRY = {
508
654
  },
509
655
  "gpt-4.1": {
510
656
  "inputPer1mTokens": 2,
657
+ "cachedInputPer1mTokens": 0.5,
511
658
  "outputPer1mTokens": 8
512
659
  },
513
660
  "gpt-4o": {
514
661
  "inputPer1mTokens": 2.5,
662
+ "cachedInputPer1mTokens": 1.25,
515
663
  "outputPer1mTokens": 10
516
664
  },
517
665
  "gpt-5": {
518
666
  "inputPer1mTokens": 1.25,
667
+ "cachedInputPer1mTokens": 0.125,
519
668
  "outputPer1mTokens": 10
520
669
  },
521
670
  "gpt-5.5": {
522
671
  "inputPer1mTokens": 1.25,
672
+ "cachedInputPer1mTokens": 0.125,
523
673
  "outputPer1mTokens": 10
524
674
  },
675
+ "gpt-5.6-luna": {
676
+ "inputPer1mTokens": 0.2,
677
+ "cachedInputPer1mTokens": 0.02,
678
+ "outputPer1mTokens": 1.2
679
+ },
680
+ "gpt-5.6-sol": {
681
+ "inputPer1mTokens": 4,
682
+ "cachedInputPer1mTokens": 0.4,
683
+ "outputPer1mTokens": 20
684
+ },
685
+ "gpt-5.6-terra": {
686
+ "inputPer1mTokens": 2,
687
+ "cachedInputPer1mTokens": 0.2,
688
+ "outputPer1mTokens": 12
689
+ },
690
+ "gpt-6-astra": {
691
+ "inputPer1mTokens": 10,
692
+ "cachedInputPer1mTokens": 1,
693
+ "outputPer1mTokens": 50
694
+ },
525
695
  "o3": {
526
696
  "inputPer1mTokens": 2,
697
+ "cachedInputPer1mTokens": 0.5,
527
698
  "outputPer1mTokens": 8
528
699
  }
529
700
  },
@@ -532,13 +703,15 @@ export const REGISTRY = {
532
703
  "claude-haiku-4-5": "claude-haiku",
533
704
  "claude-opus-4-8": "claude-opus",
534
705
  "claude-sonnet-4-5": "claude-sonnet",
706
+ "codex/gpt-6-astra": "gpt-6-astra",
535
707
  "gpt-4.1-mini": "gpt-4.1",
536
708
  "gpt-5.1": "gpt-5",
537
709
  "gpt-5.1-codex": "gpt-5",
538
710
  "gpt-5.3-codex": "gpt-5",
539
711
  "gpt-5.5-2026-05": "gpt-5.5",
540
712
  "gpt-5.5-codex": "gpt-5.5",
541
- "openai/gpt-5.5": "gpt-5.5"
713
+ "openai/gpt-5.5": "gpt-5.5",
714
+ "openai/gpt-6-astra": "gpt-6-astra"
542
715
  },
543
716
  "manualOverrides": {}
544
717
  },