@stll/ai-catalog 0.8.2 → 0.9.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
@@ -39,8 +39,10 @@ one refresh pull request for both snapshots.
39
39
  `gen:capabilities --refresh` rejects before fetching or writing: rates owns the
40
40
  shared upstream refresh, and capabilities reads those refreshed inputs.
41
41
  The snapshot covers text input/output, cache reads/writes, and context tiers.
42
- Audio pricing is deliberately excluded because Stella does not route audio
43
- model input; an unknown models.dev cost field fails generation.
42
+ The text-model snapshot excludes audio rates; an unknown models.dev cost field
43
+ fails generation. `@stll/ai-catalog/transcription` owns the separately curated
44
+ transcription catalog, with dated public sources, rational duration rates, and
45
+ explicit capability and regional-availability evidence.
44
46
 
45
47
  ## Install
46
48
 
@@ -1,5 +1,5 @@
1
- import { w as OfferedBYOKModelId } from "./index-COmyIxMN.js";
2
1
  import { ModelBenchmarkMeasurement } from "./benchmark-frontier.js";
2
+ import { w as OfferedBYOKModelId } from "./index-COmyIxMN.js";
3
3
  //#region src/benchmark-sources.d.ts
4
4
  export declare const MODEL_BENCHMARK_NAME = "Text Arena";
5
5
  export declare const MODEL_BENCHMARK_LICENCE = "CC BY 4.0";
@@ -0,0 +1,374 @@
1
+ //#region src/transcription.d.ts
2
+ type TranscriptionDurationPrice = {
3
+ kind: "audio-second";
4
+ usdNumerator: number;
5
+ secondsDenominator: number;
6
+ };
7
+ type TranscriptionRegionalAvailability = {
8
+ status: "available";
9
+ price: TranscriptionDurationPrice;
10
+ } | {
11
+ status: "unavailable" | "unknown";
12
+ };
13
+ type TranscriptionModelMetadata = {
14
+ displayName: string;
15
+ price: TranscriptionDurationPrice;
16
+ languageClaim: string;
17
+ /** Granularities supported by the cited evidence; word includes segments. */
18
+ timestamps: "none" | "segment" | "word";
19
+ vocabularyMechanism: "none" | "groq-prompt" | "azure-phrase-list" | "context-hint";
20
+ diarization: "supported" | "unconfirmed";
21
+ residency: Record<"eu" | "us", TranscriptionRegionalAvailability>;
22
+ source: {
23
+ url: string;
24
+ checkedAt: string;
25
+ };
26
+ };
27
+ export declare const TRANSCRIPTION_MODELS: {
28
+ readonly "openai/whisper-large-v3-turbo": {
29
+ readonly displayName: "Whisper Large V3 Turbo";
30
+ readonly price: {
31
+ readonly kind: "audio-second";
32
+ readonly usdNumerator: 3;
33
+ readonly secondsDenominator: 1000000;
34
+ };
35
+ readonly languageClaim: "99+ languages";
36
+ readonly timestamps: "none";
37
+ readonly vocabularyMechanism: "groq-prompt";
38
+ readonly diarization: "unconfirmed";
39
+ readonly residency: {
40
+ readonly eu: {
41
+ readonly status: "unavailable";
42
+ };
43
+ readonly us: {
44
+ readonly status: "unknown";
45
+ };
46
+ };
47
+ readonly source: {
48
+ readonly url: "https://openrouter.ai/openai/whisper-large-v3-turbo";
49
+ readonly checkedAt: "2026-10-29";
50
+ };
51
+ };
52
+ readonly "openai/whisper-large-v3": {
53
+ readonly displayName: "Whisper Large V3";
54
+ readonly price: {
55
+ readonly kind: "audio-second";
56
+ readonly usdNumerator: 8;
57
+ readonly secondsDenominator: 1000000;
58
+ };
59
+ readonly languageClaim: "99+ languages";
60
+ readonly timestamps: "word";
61
+ readonly vocabularyMechanism: "groq-prompt";
62
+ readonly diarization: "unconfirmed";
63
+ readonly residency: {
64
+ readonly eu: {
65
+ readonly status: "unavailable";
66
+ };
67
+ readonly us: {
68
+ readonly status: "unknown";
69
+ };
70
+ };
71
+ readonly source: {
72
+ readonly url: "https://openrouter.ai/openai/whisper-large-v3";
73
+ readonly checkedAt: "2026-10-29";
74
+ };
75
+ };
76
+ readonly "nvidia/parakeet-tdt-0.6b-v3": {
77
+ readonly displayName: "Parakeet TDT 0.6B v3";
78
+ readonly price: {
79
+ readonly kind: "audio-second";
80
+ readonly usdNumerator: 25;
81
+ readonly secondsDenominator: 1000000;
82
+ };
83
+ readonly languageClaim: "All official EU languages";
84
+ readonly timestamps: "segment";
85
+ readonly vocabularyMechanism: "none";
86
+ readonly diarization: "unconfirmed";
87
+ readonly residency: {
88
+ readonly eu: {
89
+ readonly status: "unavailable";
90
+ };
91
+ readonly us: {
92
+ readonly status: "unknown";
93
+ };
94
+ };
95
+ readonly source: {
96
+ readonly url: "https://openrouter.ai/nvidia/parakeet-tdt-0.6b-v3";
97
+ readonly checkedAt: "2026-10-29";
98
+ };
99
+ };
100
+ readonly "microsoft/mai-transcribe-2": {
101
+ readonly displayName: "MAI-Transcribe 2";
102
+ readonly price: {
103
+ readonly kind: "audio-second";
104
+ readonly usdNumerator: 1;
105
+ readonly secondsDenominator: 36000;
106
+ };
107
+ readonly languageClaim: "60 languages";
108
+ readonly timestamps: "word";
109
+ readonly vocabularyMechanism: "azure-phrase-list";
110
+ readonly diarization: "supported";
111
+ readonly residency: {
112
+ readonly eu: {
113
+ readonly status: "unavailable";
114
+ };
115
+ readonly us: {
116
+ readonly status: "unknown";
117
+ };
118
+ };
119
+ readonly source: {
120
+ readonly url: "https://openrouter.ai/microsoft/mai-transcribe-2";
121
+ readonly checkedAt: "2026-10-29";
122
+ };
123
+ };
124
+ readonly "elevenlabs/scribe-v2": {
125
+ readonly displayName: "Scribe v2";
126
+ readonly price: {
127
+ readonly kind: "audio-second";
128
+ readonly usdNumerator: 61;
129
+ readonly secondsDenominator: 1000000;
130
+ };
131
+ readonly languageClaim: "90+ languages";
132
+ readonly timestamps: "word";
133
+ readonly vocabularyMechanism: "none";
134
+ readonly diarization: "supported";
135
+ readonly residency: {
136
+ readonly eu: {
137
+ readonly status: "unavailable";
138
+ };
139
+ readonly us: {
140
+ readonly status: "unknown";
141
+ };
142
+ };
143
+ readonly source: {
144
+ readonly url: "https://openrouter.ai/elevenlabs/scribe-v2";
145
+ readonly checkedAt: "2026-10-29";
146
+ };
147
+ };
148
+ readonly "mistralai/voxtral-mini-transcribe": {
149
+ readonly displayName: "Voxtral Mini Transcribe";
150
+ readonly price: {
151
+ readonly kind: "audio-second";
152
+ readonly usdNumerator: 50;
153
+ readonly secondsDenominator: 1000000;
154
+ };
155
+ readonly languageClaim: "Not specified";
156
+ readonly timestamps: "none";
157
+ readonly vocabularyMechanism: "none";
158
+ readonly diarization: "unconfirmed";
159
+ readonly residency: {
160
+ readonly eu: {
161
+ readonly status: "available";
162
+ readonly price: {
163
+ readonly kind: "audio-second";
164
+ readonly usdNumerator: 55;
165
+ readonly secondsDenominator: 1000000;
166
+ };
167
+ };
168
+ readonly us: {
169
+ readonly status: "unknown";
170
+ };
171
+ };
172
+ readonly source: {
173
+ readonly url: "https://openrouter.ai/mistralai/voxtral-mini-transcribe";
174
+ readonly checkedAt: "2026-10-29";
175
+ };
176
+ };
177
+ readonly "openai/gpt-transcribe": {
178
+ readonly displayName: "GPT Transcribe";
179
+ readonly price: {
180
+ readonly kind: "audio-second";
181
+ readonly usdNumerator: 75;
182
+ readonly secondsDenominator: 1000000;
183
+ };
184
+ readonly languageClaim: "Multilingual; language count not specified";
185
+ readonly timestamps: "none";
186
+ readonly vocabularyMechanism: "context-hint";
187
+ readonly diarization: "unconfirmed";
188
+ readonly residency: {
189
+ readonly eu: {
190
+ readonly status: "unavailable";
191
+ };
192
+ readonly us: {
193
+ readonly status: "unknown";
194
+ };
195
+ };
196
+ readonly source: {
197
+ readonly url: "https://openrouter.ai/openai/gpt-transcribe";
198
+ readonly checkedAt: "2026-10-29";
199
+ };
200
+ };
201
+ };
202
+ export type TranscriptionModelId = keyof typeof TRANSCRIPTION_MODELS;
203
+ export type TranscriptionModel = (typeof TRANSCRIPTION_MODELS)[TranscriptionModelId];
204
+ export type TranscriptionVocabularyMechanism = TranscriptionModelMetadata["vocabularyMechanism"];
205
+ export declare const isTranscriptionModelId: (modelId: string) => modelId is TranscriptionModelId;
206
+ export declare const getTranscriptionModel: (modelId: string) => {
207
+ readonly displayName: "Whisper Large V3 Turbo";
208
+ readonly price: {
209
+ readonly kind: "audio-second";
210
+ readonly usdNumerator: 3;
211
+ readonly secondsDenominator: 1000000;
212
+ };
213
+ readonly languageClaim: "99+ languages";
214
+ readonly timestamps: "none";
215
+ readonly vocabularyMechanism: "groq-prompt";
216
+ readonly diarization: "unconfirmed";
217
+ readonly residency: {
218
+ readonly eu: {
219
+ readonly status: "unavailable";
220
+ };
221
+ readonly us: {
222
+ readonly status: "unknown";
223
+ };
224
+ };
225
+ readonly source: {
226
+ readonly url: "https://openrouter.ai/openai/whisper-large-v3-turbo";
227
+ readonly checkedAt: "2026-10-29";
228
+ };
229
+ } | {
230
+ readonly displayName: "Whisper Large V3";
231
+ readonly price: {
232
+ readonly kind: "audio-second";
233
+ readonly usdNumerator: 8;
234
+ readonly secondsDenominator: 1000000;
235
+ };
236
+ readonly languageClaim: "99+ languages";
237
+ readonly timestamps: "word";
238
+ readonly vocabularyMechanism: "groq-prompt";
239
+ readonly diarization: "unconfirmed";
240
+ readonly residency: {
241
+ readonly eu: {
242
+ readonly status: "unavailable";
243
+ };
244
+ readonly us: {
245
+ readonly status: "unknown";
246
+ };
247
+ };
248
+ readonly source: {
249
+ readonly url: "https://openrouter.ai/openai/whisper-large-v3";
250
+ readonly checkedAt: "2026-10-29";
251
+ };
252
+ } | {
253
+ readonly displayName: "Parakeet TDT 0.6B v3";
254
+ readonly price: {
255
+ readonly kind: "audio-second";
256
+ readonly usdNumerator: 25;
257
+ readonly secondsDenominator: 1000000;
258
+ };
259
+ readonly languageClaim: "All official EU languages";
260
+ readonly timestamps: "segment";
261
+ readonly vocabularyMechanism: "none";
262
+ readonly diarization: "unconfirmed";
263
+ readonly residency: {
264
+ readonly eu: {
265
+ readonly status: "unavailable";
266
+ };
267
+ readonly us: {
268
+ readonly status: "unknown";
269
+ };
270
+ };
271
+ readonly source: {
272
+ readonly url: "https://openrouter.ai/nvidia/parakeet-tdt-0.6b-v3";
273
+ readonly checkedAt: "2026-10-29";
274
+ };
275
+ } | {
276
+ readonly displayName: "MAI-Transcribe 2";
277
+ readonly price: {
278
+ readonly kind: "audio-second";
279
+ readonly usdNumerator: 1;
280
+ readonly secondsDenominator: 36000;
281
+ };
282
+ readonly languageClaim: "60 languages";
283
+ readonly timestamps: "word";
284
+ readonly vocabularyMechanism: "azure-phrase-list";
285
+ readonly diarization: "supported";
286
+ readonly residency: {
287
+ readonly eu: {
288
+ readonly status: "unavailable";
289
+ };
290
+ readonly us: {
291
+ readonly status: "unknown";
292
+ };
293
+ };
294
+ readonly source: {
295
+ readonly url: "https://openrouter.ai/microsoft/mai-transcribe-2";
296
+ readonly checkedAt: "2026-10-29";
297
+ };
298
+ } | {
299
+ readonly displayName: "Scribe v2";
300
+ readonly price: {
301
+ readonly kind: "audio-second";
302
+ readonly usdNumerator: 61;
303
+ readonly secondsDenominator: 1000000;
304
+ };
305
+ readonly languageClaim: "90+ languages";
306
+ readonly timestamps: "word";
307
+ readonly vocabularyMechanism: "none";
308
+ readonly diarization: "supported";
309
+ readonly residency: {
310
+ readonly eu: {
311
+ readonly status: "unavailable";
312
+ };
313
+ readonly us: {
314
+ readonly status: "unknown";
315
+ };
316
+ };
317
+ readonly source: {
318
+ readonly url: "https://openrouter.ai/elevenlabs/scribe-v2";
319
+ readonly checkedAt: "2026-10-29";
320
+ };
321
+ } | {
322
+ readonly displayName: "Voxtral Mini Transcribe";
323
+ readonly price: {
324
+ readonly kind: "audio-second";
325
+ readonly usdNumerator: 50;
326
+ readonly secondsDenominator: 1000000;
327
+ };
328
+ readonly languageClaim: "Not specified";
329
+ readonly timestamps: "none";
330
+ readonly vocabularyMechanism: "none";
331
+ readonly diarization: "unconfirmed";
332
+ readonly residency: {
333
+ readonly eu: {
334
+ readonly status: "available";
335
+ readonly price: {
336
+ readonly kind: "audio-second";
337
+ readonly usdNumerator: 55;
338
+ readonly secondsDenominator: 1000000;
339
+ };
340
+ };
341
+ readonly us: {
342
+ readonly status: "unknown";
343
+ };
344
+ };
345
+ readonly source: {
346
+ readonly url: "https://openrouter.ai/mistralai/voxtral-mini-transcribe";
347
+ readonly checkedAt: "2026-10-29";
348
+ };
349
+ } | {
350
+ readonly displayName: "GPT Transcribe";
351
+ readonly price: {
352
+ readonly kind: "audio-second";
353
+ readonly usdNumerator: 75;
354
+ readonly secondsDenominator: 1000000;
355
+ };
356
+ readonly languageClaim: "Multilingual; language count not specified";
357
+ readonly timestamps: "none";
358
+ readonly vocabularyMechanism: "context-hint";
359
+ readonly diarization: "unconfirmed";
360
+ readonly residency: {
361
+ readonly eu: {
362
+ readonly status: "unavailable";
363
+ };
364
+ readonly us: {
365
+ readonly status: "unknown";
366
+ };
367
+ };
368
+ readonly source: {
369
+ readonly url: "https://openrouter.ai/openai/gpt-transcribe";
370
+ readonly checkedAt: "2026-10-29";
371
+ };
372
+ } | undefined;
373
+ //#endregion
374
+ export {};
@@ -0,0 +1,154 @@
1
+ //#region src/transcription.ts
2
+ const TRANSCRIPTION_MODELS = {
3
+ "openai/whisper-large-v3-turbo": {
4
+ displayName: "Whisper Large V3 Turbo",
5
+ price: {
6
+ kind: "audio-second",
7
+ usdNumerator: 3,
8
+ secondsDenominator: 1e6
9
+ },
10
+ languageClaim: "99+ languages",
11
+ timestamps: "none",
12
+ vocabularyMechanism: "groq-prompt",
13
+ diarization: "unconfirmed",
14
+ residency: {
15
+ eu: { status: "unavailable" },
16
+ us: { status: "unknown" }
17
+ },
18
+ source: {
19
+ url: "https://openrouter.ai/openai/whisper-large-v3-turbo",
20
+ checkedAt: "2026-10-29"
21
+ }
22
+ },
23
+ "openai/whisper-large-v3": {
24
+ displayName: "Whisper Large V3",
25
+ price: {
26
+ kind: "audio-second",
27
+ usdNumerator: 8,
28
+ secondsDenominator: 1e6
29
+ },
30
+ languageClaim: "99+ languages",
31
+ timestamps: "word",
32
+ vocabularyMechanism: "groq-prompt",
33
+ diarization: "unconfirmed",
34
+ residency: {
35
+ eu: { status: "unavailable" },
36
+ us: { status: "unknown" }
37
+ },
38
+ source: {
39
+ url: "https://openrouter.ai/openai/whisper-large-v3",
40
+ checkedAt: "2026-10-29"
41
+ }
42
+ },
43
+ "nvidia/parakeet-tdt-0.6b-v3": {
44
+ displayName: "Parakeet TDT 0.6B v3",
45
+ price: {
46
+ kind: "audio-second",
47
+ usdNumerator: 25,
48
+ secondsDenominator: 1e6
49
+ },
50
+ languageClaim: "All official EU languages",
51
+ timestamps: "segment",
52
+ vocabularyMechanism: "none",
53
+ diarization: "unconfirmed",
54
+ residency: {
55
+ eu: { status: "unavailable" },
56
+ us: { status: "unknown" }
57
+ },
58
+ source: {
59
+ url: "https://openrouter.ai/nvidia/parakeet-tdt-0.6b-v3",
60
+ checkedAt: "2026-10-29"
61
+ }
62
+ },
63
+ "microsoft/mai-transcribe-2": {
64
+ displayName: "MAI-Transcribe 2",
65
+ price: {
66
+ kind: "audio-second",
67
+ usdNumerator: 1,
68
+ secondsDenominator: 36e3
69
+ },
70
+ languageClaim: "60 languages",
71
+ timestamps: "word",
72
+ vocabularyMechanism: "azure-phrase-list",
73
+ diarization: "supported",
74
+ residency: {
75
+ eu: { status: "unavailable" },
76
+ us: { status: "unknown" }
77
+ },
78
+ source: {
79
+ url: "https://openrouter.ai/microsoft/mai-transcribe-2",
80
+ checkedAt: "2026-10-29"
81
+ }
82
+ },
83
+ "elevenlabs/scribe-v2": {
84
+ displayName: "Scribe v2",
85
+ price: {
86
+ kind: "audio-second",
87
+ usdNumerator: 61,
88
+ secondsDenominator: 1e6
89
+ },
90
+ languageClaim: "90+ languages",
91
+ timestamps: "word",
92
+ vocabularyMechanism: "none",
93
+ diarization: "supported",
94
+ residency: {
95
+ eu: { status: "unavailable" },
96
+ us: { status: "unknown" }
97
+ },
98
+ source: {
99
+ url: "https://openrouter.ai/elevenlabs/scribe-v2",
100
+ checkedAt: "2026-10-29"
101
+ }
102
+ },
103
+ "mistralai/voxtral-mini-transcribe": {
104
+ displayName: "Voxtral Mini Transcribe",
105
+ price: {
106
+ kind: "audio-second",
107
+ usdNumerator: 50,
108
+ secondsDenominator: 1e6
109
+ },
110
+ languageClaim: "Not specified",
111
+ timestamps: "none",
112
+ vocabularyMechanism: "none",
113
+ diarization: "unconfirmed",
114
+ residency: {
115
+ eu: {
116
+ status: "available",
117
+ price: {
118
+ kind: "audio-second",
119
+ usdNumerator: 55,
120
+ secondsDenominator: 1e6
121
+ }
122
+ },
123
+ us: { status: "unknown" }
124
+ },
125
+ source: {
126
+ url: "https://openrouter.ai/mistralai/voxtral-mini-transcribe",
127
+ checkedAt: "2026-10-29"
128
+ }
129
+ },
130
+ "openai/gpt-transcribe": {
131
+ displayName: "GPT Transcribe",
132
+ price: {
133
+ kind: "audio-second",
134
+ usdNumerator: 75,
135
+ secondsDenominator: 1e6
136
+ },
137
+ languageClaim: "Multilingual; language count not specified",
138
+ timestamps: "none",
139
+ vocabularyMechanism: "context-hint",
140
+ diarization: "unconfirmed",
141
+ residency: {
142
+ eu: { status: "unavailable" },
143
+ us: { status: "unknown" }
144
+ },
145
+ source: {
146
+ url: "https://openrouter.ai/openai/gpt-transcribe",
147
+ checkedAt: "2026-10-29"
148
+ }
149
+ }
150
+ };
151
+ const isTranscriptionModelId = (modelId) => Object.hasOwn(TRANSCRIPTION_MODELS, modelId);
152
+ const getTranscriptionModel = (modelId) => Object.hasOwn(TRANSCRIPTION_MODELS, modelId) && isTranscriptionModelId(modelId) ? TRANSCRIPTION_MODELS[modelId] : void 0;
153
+ //#endregion
154
+ export { TRANSCRIPTION_MODELS, getTranscriptionModel, isTranscriptionModelId };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/ai-catalog",
3
- "version": "0.8.2",
3
+ "version": "0.9.0",
4
4
  "description": "Provider-neutral AI model roles, capabilities, and curated model metadata.",
5
5
  "keywords": [
6
6
  "ai",
@@ -40,6 +40,10 @@
40
40
  "./model-defaults-ledger": {
41
41
  "types": "./dist/model-defaults-ledger.d.ts",
42
42
  "import": "./dist/model-defaults-ledger.js"
43
+ },
44
+ "./transcription": {
45
+ "types": "./dist/transcription.d.ts",
46
+ "import": "./dist/transcription.js"
43
47
  }
44
48
  },
45
49
  "publishConfig": {
@@ -75,7 +79,8 @@
75
79
  "@tanstack/ai-openrouter": "0.21.1",
76
80
  "bun-types": "1.4.4",
77
81
  "fast-check": "^4.10.2",
78
- "tsdown": "0.23.0"
82
+ "tsdown": "0.23.1",
83
+ "tsrs": "0.18.0-ts7.1.0-dev.20260929"
79
84
  },
80
85
  "main": "./dist/index.js",
81
86
  "types": "./dist/index.d.ts"