@shop-os/modelkit 0.1.6 → 0.1.8

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/dist/index.js CHANGED
@@ -35,6 +35,23 @@ var Catalog = class _Catalog {
35
35
  for (const model of models) this.add(model);
36
36
  }
37
37
  add(model) {
38
+ if (this.byId.has(model.id)) {
39
+ throw new Error(`Duplicate model id "${model.id}"`);
40
+ }
41
+ if (this.byAlias.has(model.id)) {
42
+ throw new Error(
43
+ `Model id "${model.id}" collides with an alias of "${this.byAlias.get(model.id)}"`
44
+ );
45
+ }
46
+ for (const alias of model.aliases) {
47
+ if (alias === model.id) {
48
+ throw new Error(`Alias "${alias}" collides with its own model id "${model.id}"`);
49
+ }
50
+ const existing = this.byAlias.get(alias);
51
+ if (existing !== void 0) {
52
+ throw new Error(`Duplicate alias "${alias}" (already maps to "${existing}")`);
53
+ }
54
+ }
38
55
  this.byId.set(model.id, model);
39
56
  this.byAlias.set(model.id, model.id);
40
57
  for (const alias of model.aliases) this.byAlias.set(alias, model.id);
@@ -83,6 +100,7 @@ var Catalog = class _Catalog {
83
100
 
84
101
  // src/catalog/image.ts
85
102
  var IMAGE_USAGE = { unit: "images", modality: "IMAGE" };
103
+ var IMAGE_GENERATE_EDIT = { imageGenerate: true, imageEdit: true };
86
104
  var GEMINI_RATIOS = [
87
105
  "1:1",
88
106
  "2:3",
@@ -96,7 +114,7 @@ var GEMINI_RATIOS = [
96
114
  "5:4",
97
115
  "adaptive"
98
116
  ];
99
- function geminiImage(id, label, aliases, sizes) {
117
+ function geminiImage(id, label, aliases, sizes, display, exposure) {
100
118
  const model = {
101
119
  id,
102
120
  aliases,
@@ -105,6 +123,7 @@ function geminiImage(id, label, aliases, sizes) {
105
123
  adapter: "google-image",
106
124
  providerModelId: id,
107
125
  lifecycle: "active",
126
+ exposure,
108
127
  constraints: {
109
128
  aspectRatios: [...GEMINI_RATIOS],
110
129
  sizes,
@@ -112,40 +131,88 @@ function geminiImage(id, label, aliases, sizes) {
112
131
  },
113
132
  defaults: { size: "1K", aspectRatio: "1:1" },
114
133
  usage: { ...IMAGE_USAGE },
115
- pricingKind: "image_size"
134
+ pricingKind: "image_size",
135
+ display,
136
+ capabilities: { ...IMAGE_GENERATE_EDIT }
116
137
  };
117
138
  return model;
118
139
  }
119
140
  var IMAGE_MODELS = [
120
- geminiImage("gemini-3-pro-image-preview", "Nano Banana Pro", ["nb-pro"], ["1K", "2K", "4K"]),
141
+ geminiImage(
142
+ "gemini-3-pro-image-preview",
143
+ "Nano Banana Pro",
144
+ ["nb-pro"],
145
+ ["1K", "2K", "4K"],
146
+ {
147
+ provider: "google",
148
+ description: "Create stunning, production-quality visuals with exceptional realism, detail, and typography. Best for campaigns, e-commerce, product photography, and hero creatives.",
149
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
150
+ },
151
+ "catalog"
152
+ ),
121
153
  geminiImage(
122
154
  "gemini-3.1-flash-image-preview",
123
- "Nano Banana Flash",
155
+ "Nano Banana 2",
124
156
  ["nb-2"],
125
157
  // Flash 3.1 is the only Gemini image model with the 512 tier.
126
- ["512", "1K", "2K", "4K"]
158
+ ["512", "1K", "2K", "4K"],
159
+ {
160
+ provider: "google",
161
+ description: "Generate high-quality images at speed. Perfect for brainstorming, moodboards, concept testing, creative exploration, and large batch workflows.",
162
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
163
+ },
164
+ "catalog"
165
+ ),
166
+ geminiImage(
167
+ "gemini-3.1-flash-lite-image",
168
+ "Nano Banana Lite",
169
+ ["nb-lite"],
170
+ ["1K"],
171
+ {
172
+ provider: "google",
173
+ description: "The fastest and most affordable image model. Ideal for rapid drafts, bulk exploration, and iterative concept testing at 1K resolution.",
174
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
175
+ },
176
+ "catalog"
127
177
  ),
128
- geminiImage("gemini-3.1-flash-lite-image", "Nano Banana Lite", ["nb-lite"], ["1K"]),
129
178
  // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.
130
- geminiImage("gemini-2.5-flash-image", "Gemini 2.5 Flash Image", [], ["1K", "2K", "4K"]),
179
+ geminiImage(
180
+ "gemini-2.5-flash-image",
181
+ "Gemini 2.5 Flash Image",
182
+ [],
183
+ ["1K", "2K", "4K"],
184
+ {
185
+ provider: "google",
186
+ description: "Nano Banana (legacy Gemini 2.5 Flash Image) native image generation and editing model for high-volume, low-latency creative workflows."
187
+ },
188
+ "internal"
189
+ ),
131
190
  {
132
191
  // Cowork "auto" lets OpenAI pick the size; the canonical equivalent is adaptive.
133
192
  id: "gpt-image-2",
134
193
  aliases: [],
135
- label: "GPT Image 2",
194
+ label: "GPT-image-2",
136
195
  type: "image",
137
196
  adapter: "openai-image",
138
197
  providerModelId: "gpt-image-2",
139
198
  lifecycle: "active",
199
+ exposure: "catalog",
140
200
  constraints: {
141
201
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
142
202
  sizes: ["1K", "2K", "4K"],
203
+ qualityOptions: ["auto", "low", "medium", "high"],
143
204
  references: { images: 16 },
144
205
  supports: ["quality", "count"]
145
206
  },
146
207
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
147
208
  usage: { ...IMAGE_USAGE },
148
- pricingKind: "image_size"
209
+ pricingKind: "image_size",
210
+ display: {
211
+ provider: "openai",
212
+ description: "The most capable model for image editing and complex creative instructions. Excels at text rendering, visual consistency, design generation, and iterative refinement.",
213
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/1204b494-8962-4f7f-af5e-699a8bdc98e3_compressed.png"
214
+ },
215
+ capabilities: { ...IMAGE_GENERATE_EDIT }
149
216
  },
150
217
  {
151
218
  // Same Images API surface as gpt-image-2 plus the "xhigh" and "max" quality tiers.
@@ -156,15 +223,22 @@ var IMAGE_MODELS = [
156
223
  adapter: "openai-image",
157
224
  providerModelId: "gpt-image-2.5-sunburst",
158
225
  lifecycle: "active",
226
+ exposure: "internal",
159
227
  constraints: {
160
228
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
161
229
  sizes: ["1K", "2K", "4K"],
230
+ qualityOptions: ["auto", "low", "medium", "high"],
162
231
  references: { images: 16 },
163
232
  supports: ["quality", "count"]
164
233
  },
165
234
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
166
235
  usage: { ...IMAGE_USAGE },
167
- pricingKind: "image_size"
236
+ pricingKind: "image_size",
237
+ display: {
238
+ provider: "openai",
239
+ description: "OpenAI's most capable GPT Image 2.5 tier, built for editing precision; takes text and image input and outputs images in low, medium, high, xhigh, or max quality."
240
+ },
241
+ capabilities: { ...IMAGE_GENERATE_EDIT }
168
242
  },
169
243
  {
170
244
  // Same Images API surface as gpt-image-2 plus the "xhigh" and "max" quality tiers.
@@ -175,25 +249,33 @@ var IMAGE_MODELS = [
175
249
  adapter: "openai-image",
176
250
  providerModelId: "gpt-image-2.5-flare",
177
251
  lifecycle: "active",
252
+ exposure: "internal",
178
253
  constraints: {
179
254
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
180
255
  sizes: ["1K", "2K", "4K"],
256
+ qualityOptions: ["auto", "low", "medium", "high"],
181
257
  references: { images: 16 },
182
258
  supports: ["quality", "count"]
183
259
  },
184
260
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
185
261
  usage: { ...IMAGE_USAGE },
186
- pricingKind: "image_size"
262
+ pricingKind: "image_size",
263
+ display: {
264
+ provider: "openai",
265
+ description: "OpenAI's fastest GPT Image 2.5 tier for high-quality everyday image generation and editing; takes text and image input and outputs images."
266
+ },
267
+ capabilities: { ...IMAGE_GENERATE_EDIT }
187
268
  },
188
269
  {
189
270
  // Cowork allows 7 ratios; trigger-workflows allows 9 (adds 3:2, 9:21, drops 4:5/5:4).
190
271
  id: "muse-image-1.0",
191
- aliases: [],
272
+ aliases: ["meta-muse"],
192
273
  label: "Meta Muse",
193
274
  type: "image",
194
275
  adapter: "fal",
195
276
  providerModelId: "muse-image-1.0",
196
277
  lifecycle: "active",
278
+ exposure: "catalog",
197
279
  constraints: {
198
280
  aspectRatios: [
199
281
  "21:9",
@@ -215,7 +297,13 @@ var IMAGE_MODELS = [
215
297
  },
216
298
  defaults: { size: "1K", aspectRatio: "1:1", outputFormat: "png", count: 1 },
217
299
  usage: { ...IMAGE_USAGE },
218
- pricingKind: "image_size"
300
+ pricingKind: "image_size",
301
+ display: {
302
+ provider: "meta",
303
+ description: "Meta's image model with built-in world knowledge and strong prompt adherence. Great for concept-rich scenes, realistic compositions, and reference-guided edits.",
304
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png"
305
+ },
306
+ capabilities: { ...IMAGE_GENERATE_EDIT }
219
307
  },
220
308
  {
221
309
  id: "seedream-5-0-pro",
@@ -225,6 +313,7 @@ var IMAGE_MODELS = [
225
313
  adapter: "ark",
226
314
  providerModelId: "dola-seedream-5-0-pro-260628",
227
315
  lifecycle: "active",
316
+ exposure: "catalog",
228
317
  constraints: {
229
318
  aspectRatios: ["1:1", "4:3", "3:4", "16:9", "9:16", "3:2", "2:3", "21:9", "4:5", "5:4"],
230
319
  sizes: ["1K", "2K"],
@@ -235,7 +324,12 @@ var IMAGE_MODELS = [
235
324
  },
236
325
  defaults: { size: "1K", aspectRatio: "1:1" },
237
326
  usage: { ...IMAGE_USAGE },
238
- pricingKind: "image_size"
327
+ pricingKind: "image_size",
328
+ display: {
329
+ provider: "bytedance",
330
+ description: "ByteDance Seedream 5.0 Pro text-to-image and multi-reference image-to-image (up to 10 inputs) with region editing; outputs 1K, 1.5K, or 2K."
331
+ },
332
+ capabilities: { ...IMAGE_GENERATE_EDIT }
239
333
  },
240
334
  {
241
335
  id: "seedream-4.5",
@@ -245,6 +339,7 @@ var IMAGE_MODELS = [
245
339
  adapter: "ark",
246
340
  providerModelId: "seedream-4-5-251128",
247
341
  lifecycle: "active",
342
+ exposure: "internal",
248
343
  constraints: {
249
344
  // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and
250
345
  // omits the ratio instead. Advertise only sizes the adapter can send.
@@ -267,7 +362,12 @@ var IMAGE_MODELS = [
267
362
  },
268
363
  defaults: { size: "1K", aspectRatio: "1:1" },
269
364
  usage: { ...IMAGE_USAGE },
270
- pricingKind: "image_size"
365
+ pricingKind: "image_size",
366
+ display: {
367
+ provider: "bytedance",
368
+ description: "ByteDance Seedream 4.5 text-to-image and image-to-image with up to 14 reference images and batch image-set generation; outputs 2K or 4K."
369
+ },
370
+ capabilities: { ...IMAGE_GENERATE_EDIT }
271
371
  },
272
372
  {
273
373
  id: "flux-2-pro",
@@ -277,6 +377,7 @@ var IMAGE_MODELS = [
277
377
  adapter: "prodia",
278
378
  providerModelId: "flux-2-pro",
279
379
  lifecycle: "active",
380
+ exposure: "catalog",
280
381
  constraints: {
281
382
  aspectRatios: ["1:1", "2:3", "3:2", "16:9", "9:16", "4:3", "3:4", "4:5", "5:4", "21:9"],
282
383
  sizes: ["1K"],
@@ -285,7 +386,12 @@ var IMAGE_MODELS = [
285
386
  },
286
387
  defaults: { size: "1K", aspectRatio: "1:1" },
287
388
  usage: { ...IMAGE_USAGE },
288
- pricingKind: "image_size"
389
+ pricingKind: "image_size",
390
+ display: {
391
+ provider: "black-forest-labs",
392
+ description: "Black Forest Labs FLUX.2 [pro] text-to-image and multi-reference editing model served via Prodia; takes a prompt and up to 8 input images and outputs up to 4096x4096."
393
+ },
394
+ capabilities: { ...IMAGE_GENERATE_EDIT }
289
395
  },
290
396
  {
291
397
  // Prodia's gemini-3-pro jobs take aspect_ratio + resolution (1K/2K/4K), not
@@ -298,6 +404,7 @@ var IMAGE_MODELS = [
298
404
  adapter: "prodia",
299
405
  providerModelId: "inference.gemini-3-pro.img2img.v1",
300
406
  lifecycle: "active",
407
+ exposure: "internal",
301
408
  constraints: {
302
409
  aspectRatios: ["1:1", "2:3", "3:2", "4:3", "3:4", "4:5", "5:4", "9:16", "16:9", "21:9"],
303
410
  sizes: ["1K", "2K", "4K"],
@@ -306,7 +413,12 @@ var IMAGE_MODELS = [
306
413
  },
307
414
  defaults: { size: "1K", aspectRatio: "1:1" },
308
415
  usage: { ...IMAGE_USAGE },
309
- pricingKind: "image_size"
416
+ pricingKind: "image_size",
417
+ display: {
418
+ provider: "google",
419
+ description: "Google Gemini 3 Pro image generation and editing served via Prodia; takes a prompt plus up to 3 reference images and outputs 1K, 2K, or 4K."
420
+ },
421
+ capabilities: { ...IMAGE_GENERATE_EDIT }
310
422
  },
311
423
  {
312
424
  // Nano Banana (img2img.v2) is flat-rate with aspect_ratio only; 3:2, 4:5,
@@ -318,6 +430,7 @@ var IMAGE_MODELS = [
318
430
  adapter: "prodia",
319
431
  providerModelId: "inference.nano-banana.img2img.v2",
320
432
  lifecycle: "active",
433
+ exposure: "internal",
321
434
  constraints: {
322
435
  aspectRatios: ["1:1", "2:3", "3:4", "4:3", "9:16", "16:9", "21:9"],
323
436
  sizes: ["1K"],
@@ -326,7 +439,12 @@ var IMAGE_MODELS = [
326
439
  },
327
440
  defaults: { size: "1K", aspectRatio: "1:1" },
328
441
  usage: { ...IMAGE_USAGE },
329
- pricingKind: "image_size"
442
+ pricingKind: "image_size",
443
+ display: {
444
+ provider: "google",
445
+ description: "Google Nano Banana image generation and editing served via Prodia; takes a prompt plus 1-3 input images and matches the first input's aspect ratio in roughly 8 seconds."
446
+ },
447
+ capabilities: { ...IMAGE_GENERATE_EDIT }
330
448
  },
331
449
  {
332
450
  // WAN 2.7 takes `images` (up to 9) and a `size` enum whose exact values
@@ -339,6 +457,7 @@ var IMAGE_MODELS = [
339
457
  adapter: "replicate",
340
458
  providerModelId: "wan-video/wan-2.7-image-pro",
341
459
  lifecycle: "active",
460
+ exposure: "internal",
342
461
  constraints: {
343
462
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4"],
344
463
  sizes: ["1K", "2K", "4K"],
@@ -347,7 +466,12 @@ var IMAGE_MODELS = [
347
466
  },
348
467
  defaults: { size: "1K", aspectRatio: "1:1" },
349
468
  usage: { unit: "compute_seconds", modality: "IMAGE" },
350
- pricingKind: "image_size"
469
+ pricingKind: "image_size",
470
+ display: {
471
+ provider: "alibaba",
472
+ description: "Alibaba Wan 2.7 Image Pro text-to-image and image-editing model; takes a prompt plus up to 9 reference images and generates up to 4K (4096x4096)."
473
+ },
474
+ capabilities: { ...IMAGE_GENERATE_EDIT }
351
475
  },
352
476
  {
353
477
  // Qwen Image 2 Pro has aspect_ratio but no size input; resolution follows
@@ -360,6 +484,7 @@ var IMAGE_MODELS = [
360
484
  adapter: "replicate",
361
485
  providerModelId: "qwen/qwen-image-2-pro",
362
486
  lifecycle: "active",
487
+ exposure: "internal",
363
488
  constraints: {
364
489
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"],
365
490
  sizes: [],
@@ -369,7 +494,12 @@ var IMAGE_MODELS = [
369
494
  },
370
495
  defaults: { aspectRatio: "1:1" },
371
496
  usage: { unit: "compute_seconds", modality: "IMAGE" },
372
- pricingKind: "image_size"
497
+ pricingKind: "image_size",
498
+ display: {
499
+ provider: "alibaba",
500
+ description: "Alibaba Qwen Image 2 Pro unified text-to-image and editing model; takes a prompt plus an optional single reference image and generates native 2K output."
501
+ },
502
+ capabilities: { ...IMAGE_GENERATE_EDIT }
373
503
  },
374
504
  {
375
505
  // Qwen Image Edit Plus takes aspect_ratio (or match_input_image) and
@@ -382,6 +512,7 @@ var IMAGE_MODELS = [
382
512
  adapter: "replicate",
383
513
  providerModelId: "qwen-edit-apps/qwen-image-edit-plus-lora-skin",
384
514
  lifecycle: "active",
515
+ exposure: "internal",
385
516
  constraints: {
386
517
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4"],
387
518
  sizes: [],
@@ -391,7 +522,12 @@ var IMAGE_MODELS = [
391
522
  },
392
523
  defaults: { outputFormat: "png" },
393
524
  usage: { unit: "compute_seconds", modality: "IMAGE" },
394
- pricingKind: "image_size"
525
+ pricingKind: "image_size",
526
+ display: {
527
+ provider: "alibaba",
528
+ description: "Alibaba Qwen Image Edit Plus with Lightning and a skin-retouching LoRA; takes one or more reference images plus an edit prompt and outputs webp, jpg, or png."
529
+ },
530
+ capabilities: { ...IMAGE_GENERATE_EDIT }
395
531
  }
396
532
  ];
397
533
 
@@ -405,6 +541,7 @@ var OTHER_MODELS = [
405
541
  adapter: "google-genai",
406
542
  providerModelId: "lyria-3-clip-preview",
407
543
  lifecycle: "active",
544
+ exposure: "catalog",
408
545
  constraints: {
409
546
  durations: [30],
410
547
  references: { images: 10 },
@@ -412,7 +549,12 @@ var OTHER_MODELS = [
412
549
  },
413
550
  defaults: {},
414
551
  usage: { unit: "images", modality: "AUDIO" },
415
- pricingKind: "flat"
552
+ pricingKind: "flat",
553
+ display: {
554
+ provider: "google",
555
+ description: "Google Lyria 3 Clip short music clips, loops, and previews; takes text and up to 10 image prompts and returns a fixed 30-second MP3 plus lyrics."
556
+ },
557
+ capabilities: {}
416
558
  },
417
559
  {
418
560
  id: "lyria-3-pro-preview",
@@ -422,13 +564,19 @@ var OTHER_MODELS = [
422
564
  adapter: "google-genai",
423
565
  providerModelId: "lyria-3-pro-preview",
424
566
  lifecycle: "active",
567
+ exposure: "catalog",
425
568
  constraints: {
426
569
  references: { images: 10 },
427
570
  supports: []
428
571
  },
429
572
  defaults: {},
430
573
  usage: { unit: "images", modality: "AUDIO" },
431
- pricingKind: "flat"
574
+ pricingKind: "flat",
575
+ display: {
576
+ provider: "google",
577
+ description: "Google Lyria 3 Pro flagship music model for full-length songs with verses, choruses, and bridges; takes text and up to 10 image prompts and returns MP3 plus lyrics."
578
+ },
579
+ capabilities: {}
432
580
  },
433
581
  {
434
582
  id: "google/lyria-2",
@@ -438,13 +586,19 @@ var OTHER_MODELS = [
438
586
  adapter: "replicate",
439
587
  providerModelId: "google/lyria-2",
440
588
  lifecycle: "active",
589
+ exposure: "internal",
441
590
  constraints: {
442
591
  durations: [30],
443
592
  supports: ["seed", "negativePrompt"]
444
593
  },
445
594
  defaults: {},
446
595
  usage: { unit: "compute_seconds", modality: "AUDIO" },
447
- pricingKind: "flat"
596
+ pricingKind: "flat",
597
+ display: {
598
+ provider: "google",
599
+ description: "Lyria 2 music generation on Replicate; produces 30 seconds of 48 kHz stereo audio from a text prompt."
600
+ },
601
+ capabilities: {}
448
602
  },
449
603
  {
450
604
  id: "mmaudio",
@@ -454,6 +608,7 @@ var OTHER_MODELS = [
454
608
  adapter: "replicate",
455
609
  providerModelId: "zsxkib/mmaudio:62871fb59889b2d7c13777f08deb3b36bdff88f7e1d53a50ad7694548a41b484",
456
610
  lifecycle: "active",
611
+ exposure: "catalog",
457
612
  constraints: {
458
613
  durations: { min: 1, max: 30 },
459
614
  requires: ["sourceVideo"],
@@ -461,7 +616,12 @@ var OTHER_MODELS = [
461
616
  },
462
617
  defaults: { durationSeconds: 8 },
463
618
  usage: { unit: "compute_seconds", modality: "AUDIO" },
464
- pricingKind: "flat"
619
+ pricingKind: "flat",
620
+ display: {
621
+ provider: "mmaudio",
622
+ description: "MMAudio V2 video-to-audio model on Replicate; takes a source video and prompt and synthesizes synchronized environmental, action, and speech-like audio."
623
+ },
624
+ capabilities: {}
465
625
  },
466
626
  {
467
627
  id: "elevenlabs-music",
@@ -471,6 +631,7 @@ var OTHER_MODELS = [
471
631
  adapter: "replicate",
472
632
  providerModelId: "elevenlabs/music",
473
633
  lifecycle: "active",
634
+ exposure: "internal",
474
635
  constraints: {
475
636
  durations: { min: 5, max: 300 },
476
637
  supports: ["instrumental"]
@@ -478,7 +639,12 @@ var OTHER_MODELS = [
478
639
  defaults: { durationSeconds: 15, instrumental: true },
479
640
  // Replicate's run() does not report predict_time; billed by generated length.
480
641
  usage: { unit: "seconds", modality: "AUDIO" },
481
- pricingKind: "flat"
642
+ pricingKind: "flat",
643
+ display: {
644
+ provider: "elevenlabs",
645
+ description: "ElevenLabs Music text-to-music on Replicate; generates full songs, instrumental or with vocals, up to 5 minutes long at up to 44.1 kHz."
646
+ },
647
+ capabilities: {}
482
648
  },
483
649
  {
484
650
  id: "topaz",
@@ -488,6 +654,7 @@ var OTHER_MODELS = [
488
654
  adapter: "replicate",
489
655
  providerModelId: "topazlabs/image-upscale",
490
656
  lifecycle: "active",
657
+ exposure: "catalog",
491
658
  constraints: {
492
659
  references: { images: 1 },
493
660
  requires: ["references"],
@@ -495,7 +662,12 @@ var OTHER_MODELS = [
495
662
  },
496
663
  defaults: { scaleFactor: 2, outputFormat: "png" },
497
664
  usage: { unit: "compute_seconds", modality: "IMAGE" },
498
- pricingKind: "flat"
665
+ pricingKind: "flat",
666
+ display: {
667
+ provider: "topaz",
668
+ description: "Topaz Labs AI image upscaling on Replicate; takes one input image and upscales up to 6x with selectable enhancement models and optional face enhancement."
669
+ },
670
+ capabilities: { imageEdit: true }
499
671
  },
500
672
  {
501
673
  id: "bg-remove",
@@ -505,6 +677,7 @@ var OTHER_MODELS = [
505
677
  adapter: "prodia",
506
678
  providerModelId: "inference.remove-background.v1",
507
679
  lifecycle: "active",
680
+ exposure: "catalog",
508
681
  constraints: {
509
682
  references: { images: 1 },
510
683
  requires: ["references"],
@@ -512,7 +685,12 @@ var OTHER_MODELS = [
512
685
  },
513
686
  defaults: {},
514
687
  usage: { unit: "images", modality: "IMAGE" },
515
- pricingKind: "flat"
688
+ pricingKind: "flat",
689
+ display: {
690
+ provider: "prodia",
691
+ description: "Prodia background removal; takes one input image and returns a PNG cut-out of the subject plus an optional black-and-white mask."
692
+ },
693
+ capabilities: { imageEdit: true }
516
694
  }
517
695
  ];
518
696
 
@@ -527,6 +705,7 @@ function text(id, label, providerModelId, extra) {
527
705
  adapter: "ai-sdk-text",
528
706
  providerModelId,
529
707
  lifecycle: "active",
708
+ exposure: "internal",
530
709
  constraints: { supports: [] },
531
710
  defaults: {},
532
711
  usage: { ...TEXT_USAGE },
@@ -535,66 +714,465 @@ function text(id, label, providerModelId, extra) {
535
714
  };
536
715
  }
537
716
  var TEXT_MODELS = [
538
- text("gpt-4o", "GPT-4o", "gpt-4o"),
539
- text("gpt-4o-mini", "GPT-4o mini", "gpt-4o-mini"),
540
- text("gpt-5.1", "GPT-5.1", "gpt-5.1"),
541
- text("gpt-5.2", "GPT-5.2", "gpt-5.2"),
542
- text("gpt-5.4", "GPT-5.4", "gpt-5.4"),
717
+ text("gpt-4o", "GPT-4o", "gpt-4o", {
718
+ exposure: "internal",
719
+ display: {
720
+ provider: "openai",
721
+ costTier: 2,
722
+ description: "OpenAI GPT-4o flagship multimodal model; text and image input, 128K-token context."
723
+ },
724
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128e3 }
725
+ }),
726
+ text("gpt-4o-mini", "GPT-4o mini", "gpt-4o-mini", {
727
+ exposure: "internal",
728
+ display: {
729
+ provider: "openai",
730
+ costTier: 1,
731
+ description: "OpenAI GPT-4o mini fast, low-cost multimodal model; text and image input, 128K-token context."
732
+ },
733
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128e3 }
734
+ }),
735
+ text("gpt-5.1", "GPT-5.1", "gpt-5.1", {
736
+ exposure: "catalog",
737
+ display: {
738
+ provider: "openai",
739
+ costTier: 3,
740
+ description: "OpenAI GPT-5.1 reasoning model for coding and agentic tasks; text and image input, 400K-token context."
741
+ },
742
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
743
+ }),
744
+ text("gpt-5.2", "GPT-5.2", "gpt-5.2", {
745
+ exposure: "catalog",
746
+ display: {
747
+ provider: "openai",
748
+ costTier: 3,
749
+ description: "OpenAI GPT-5.2 reasoning model for complex professional work; text and image input, 400K-token context."
750
+ },
751
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
752
+ }),
753
+ // 1.05M-token context: https://platform.openai.com/docs/models/gpt-5.4
754
+ text("gpt-5.4", "GPT-5.4", "gpt-5.4", {
755
+ exposure: "internal",
756
+ display: {
757
+ provider: "openai",
758
+ costTier: 3,
759
+ description: "OpenAI GPT-5.4 flagship reasoning model; text and image input, 1.05M-token context."
760
+ },
761
+ capabilities: {
762
+ vision: true,
763
+ tools: true,
764
+ structuredOutput: true,
765
+ contextWindow: 105e4
766
+ }
767
+ }),
543
768
  // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.
544
769
  text("gpt-5.4-mini", "GPT-5.4 mini", "gpt-5.4-mini", {
545
- aliases: ["gpt-5.1-mini", "gpt-5.2-mini"]
770
+ exposure: "catalog",
771
+ aliases: ["gpt-5.1-mini", "gpt-5.2-mini"],
772
+ display: {
773
+ provider: "openai",
774
+ costTier: 1,
775
+ description: "OpenAI GPT-5.4 mini efficient reasoning model for high-volume workloads; text and image input, 400K-token context."
776
+ },
777
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
778
+ }),
779
+ text("gpt-5.5", "GPT-5.5", "gpt-5.5", {
780
+ exposure: "catalog",
781
+ display: {
782
+ provider: "openai",
783
+ costTier: 3,
784
+ description: "OpenAI GPT-5.5 flagship reasoning model for the most complex professional and coding work; text and image input, 1.05M-token context."
785
+ },
786
+ capabilities: {
787
+ vision: true,
788
+ tools: true,
789
+ structuredOutput: true,
790
+ contextWindow: 105e4
791
+ }
792
+ }),
793
+ text("gpt-5.6-luna", "GPT-5.6 Luna", "gpt-5.6-luna", {
794
+ exposure: "catalog",
795
+ display: {
796
+ provider: "openai",
797
+ costTier: 1,
798
+ description: "OpenAI GPT-5.6 Luna cost-optimized tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
799
+ },
800
+ capabilities: {
801
+ vision: true,
802
+ tools: true,
803
+ structuredOutput: true,
804
+ contextWindow: 105e4
805
+ }
806
+ }),
807
+ text("gpt-5.6-terra", "GPT-5.6 Terra", "gpt-5.6-terra", {
808
+ exposure: "catalog",
809
+ display: {
810
+ provider: "openai",
811
+ costTier: 2,
812
+ description: "OpenAI GPT-5.6 Terra balanced tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
813
+ },
814
+ capabilities: {
815
+ vision: true,
816
+ tools: true,
817
+ structuredOutput: true,
818
+ contextWindow: 105e4
819
+ }
820
+ }),
821
+ text("gpt-5.6-sol", "GPT-5.6 Sol", "gpt-5.6-sol", {
822
+ exposure: "catalog",
823
+ display: {
824
+ provider: "openai",
825
+ costTier: 3,
826
+ description: "OpenAI GPT-5.6 Sol flagship tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
827
+ },
828
+ capabilities: {
829
+ vision: true,
830
+ tools: true,
831
+ structuredOutput: true,
832
+ contextWindow: 105e4
833
+ }
546
834
  }),
547
- text("gpt-5.5", "GPT-5.5", "gpt-5.5"),
548
- text("gpt-5.6-luna", "GPT-5.6 Luna", "gpt-5.6-luna"),
549
- text("gpt-5.6-terra", "GPT-5.6 Terra", "gpt-5.6-terra"),
550
- text("gpt-5.6-sol", "GPT-5.6 Sol", "gpt-5.6-sol"),
551
835
  // Library key "claude-sonnet-4.5" maps to the SDK id "claude-sonnet-4-5".
552
836
  text("claude-sonnet-4-5", "Claude Sonnet 4.5", "claude-sonnet-4-5", {
553
- aliases: ["claude-sonnet-4.5", "claude-sonnet-4-5-20250929"]
837
+ exposure: "internal",
838
+ aliases: ["claude-sonnet-4.5", "claude-sonnet-4-5-20250929"],
839
+ display: {
840
+ provider: "anthropic",
841
+ costTier: 2,
842
+ description: "Anthropic Claude Sonnet 4.5 (legacy) balanced model; text and image input, 200K-token context."
843
+ },
844
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 2e5 }
554
845
  }),
555
846
  // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.
556
847
  text("claude-sonnet-4-6", "Claude Sonnet 4.6", "claude-sonnet-4-6", {
848
+ exposure: "catalog",
557
849
  aliases: [
558
850
  "claude-sonnet-4.6",
559
851
  "claude-sonnet-4",
560
852
  "claude-sonnet-4.0",
561
853
  "claude-sonnet-4-20250514"
562
- ]
854
+ ],
855
+ display: {
856
+ provider: "anthropic",
857
+ costTier: 2,
858
+ description: "Anthropic Claude Sonnet 4.6 (legacy) balanced model; text and image input, 1M-token context."
859
+ },
860
+ capabilities: {
861
+ vision: true,
862
+ tools: true,
863
+ structuredOutput: true,
864
+ contextWindow: 1e6
865
+ }
866
+ }),
867
+ text("claude-sonnet-5", "Claude Sonnet 5", "claude-sonnet-5", {
868
+ exposure: "catalog",
869
+ display: {
870
+ provider: "anthropic",
871
+ costTier: 3,
872
+ description: "Anthropic Claude Sonnet 5 current balanced model; text and image input, 1M-token context."
873
+ },
874
+ capabilities: {
875
+ vision: true,
876
+ tools: true,
877
+ structuredOutput: true,
878
+ contextWindow: 1e6
879
+ }
563
880
  }),
564
- text("claude-sonnet-5", "Claude Sonnet 5", "claude-sonnet-5"),
565
881
  text("claude-opus-4-8", "Claude Opus 4.8", "claude-opus-4-8", {
566
- aliases: ["claude-opus-4.8", "claude-opus-4", "claude-opus-4.0", "claude-opus-4-20250514"]
882
+ exposure: "catalog",
883
+ aliases: ["claude-opus-4.8", "claude-opus-4", "claude-opus-4.0", "claude-opus-4-20250514"],
884
+ display: {
885
+ provider: "anthropic",
886
+ costTier: 3,
887
+ description: "Anthropic Claude Opus 4.8 (legacy) frontier model; text and image input, 1M-token context."
888
+ },
889
+ capabilities: {
890
+ vision: true,
891
+ tools: true,
892
+ structuredOutput: true,
893
+ contextWindow: 1e6
894
+ }
567
895
  }),
568
896
  text("claude-haiku-4-5", "Claude Haiku 4.5", "claude-haiku-4-5", {
569
- aliases: ["claude-haiku-4.5", "claude-haiku-4-5-20251001", "claude-haiku-4"]
897
+ exposure: "catalog",
898
+ aliases: ["claude-haiku-4.5", "claude-haiku-4-5-20251001", "claude-haiku-4"],
899
+ display: {
900
+ provider: "anthropic",
901
+ costTier: 1,
902
+ description: "Anthropic Claude Haiku 4.5 fast model with near-frontier intelligence; text and image input, 200K-token context."
903
+ },
904
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 2e5 }
570
905
  }),
571
906
  text("claude-opus-5", "Claude Opus 5", "claude-opus-5", {
572
- aliases: ["claude-opus-5.0"]
907
+ exposure: "internal",
908
+ aliases: ["claude-opus-5.0"],
909
+ display: {
910
+ provider: "anthropic",
911
+ costTier: 3,
912
+ description: "Anthropic Claude Opus 5 current frontier model for agentic coding and enterprise work; text and image input, 1M-token context."
913
+ },
914
+ capabilities: {
915
+ vision: true,
916
+ tools: true,
917
+ structuredOutput: true,
918
+ contextWindow: 1e6
919
+ }
920
+ }),
921
+ text("claude-fable-5", "Claude Fable 5", "claude-fable-5", {
922
+ exposure: "internal",
923
+ display: {
924
+ provider: "anthropic",
925
+ costTier: 3,
926
+ description: "Anthropic Claude Fable 5 (legacy) model for demanding reasoning and long-horizon agentic work; text and image input, 1M-token context."
927
+ },
928
+ capabilities: {
929
+ vision: true,
930
+ tools: true,
931
+ structuredOutput: true,
932
+ contextWindow: 1e6
933
+ }
934
+ }),
935
+ text("gemini-2.5-flash", "Gemini 2.5 Flash", "gemini-2.5-flash", {
936
+ exposure: "internal",
937
+ display: {
938
+ provider: "google",
939
+ costTier: 1,
940
+ description: "Google Gemini 2.5 Flash low-latency multimodal model for high-volume reasoning over text, images, video, and audio; 1M-token context."
941
+ },
942
+ capabilities: {
943
+ vision: true,
944
+ tools: true,
945
+ structuredOutput: true,
946
+ contextWindow: 1048576
947
+ }
948
+ }),
949
+ text("gemini-2.5-pro", "Gemini 2.5 Pro", "gemini-2.5-pro", {
950
+ exposure: "internal",
951
+ display: {
952
+ provider: "google",
953
+ costTier: 2,
954
+ description: "Google Gemini 2.5 Pro thinking model for complex reasoning over code, math, and documents; text, image, video, audio, and PDF input, 1M-token context."
955
+ },
956
+ capabilities: {
957
+ vision: true,
958
+ tools: true,
959
+ structuredOutput: true,
960
+ contextWindow: 1048576
961
+ }
962
+ }),
963
+ text("gemini-3.1-pro-preview", "Gemini 3.1 Pro (preview)", "gemini-3.1-pro-preview", {
964
+ exposure: "catalog",
965
+ display: {
966
+ provider: "google",
967
+ costTier: 2,
968
+ description: "Google Gemini 3.1 Pro preview reasoning model for software engineering, tool use, and reliable agentic workflows; 1M-token context."
969
+ },
970
+ capabilities: {
971
+ vision: true,
972
+ tools: true,
973
+ structuredOutput: true,
974
+ contextWindow: 1048576
975
+ }
976
+ }),
977
+ text("gemini-3.5-flash", "Gemini 3.5 Flash", "gemini-3.5-flash", {
978
+ exposure: "catalog",
979
+ display: {
980
+ provider: "google",
981
+ costTier: 1,
982
+ description: "Google Gemini 3.5 Flash high-throughput model for frontier-level agentic tasks; text, image, video, audio, and PDF input, 1M-token context."
983
+ },
984
+ capabilities: {
985
+ vision: true,
986
+ tools: true,
987
+ structuredOutput: true,
988
+ contextWindow: 1048576
989
+ }
990
+ }),
991
+ text("gemini-3.6-flash", "Gemini 3.6 Flash", "gemini-3.6-flash", {
992
+ exposure: "catalog",
993
+ display: {
994
+ provider: "google",
995
+ costTier: 1,
996
+ description: "Google Gemini 3.6 Flash general-purpose multimodal agentic model balancing speed and capability; 1M-token context."
997
+ },
998
+ capabilities: {
999
+ vision: true,
1000
+ tools: true,
1001
+ structuredOutput: true,
1002
+ contextWindow: 1048576
1003
+ }
1004
+ }),
1005
+ text("gemini-3.7-flash", "Gemini 3.7 Flash", "gemini-3.7-flash", {
1006
+ exposure: "catalog",
1007
+ display: {
1008
+ provider: "google",
1009
+ costTier: 1,
1010
+ recommended: true,
1011
+ description: "Google Gemini 3.7 Flash natively multimodal reasoning model for coding, agentic workflows, and multi-step execution; 1M-token context."
1012
+ },
1013
+ capabilities: {
1014
+ vision: true,
1015
+ tools: true,
1016
+ structuredOutput: true,
1017
+ contextWindow: 1048576
1018
+ }
1019
+ }),
1020
+ text("gemini-3.8-flash", "Gemini 3.8 Flash", "gemini-3.8-flash", {
1021
+ exposure: "internal",
1022
+ display: {
1023
+ provider: "google",
1024
+ costTier: 1,
1025
+ description: "Google Gemini 3.8 Flash frontier model for long-horizon software engineering, autonomous agents, and enterprise workflows; 1M-token context."
1026
+ },
1027
+ capabilities: {
1028
+ vision: true,
1029
+ tools: true,
1030
+ structuredOutput: true,
1031
+ contextWindow: 1048576
1032
+ }
573
1033
  }),
574
- text("claude-fable-5", "Claude Fable 5", "claude-fable-5"),
575
- text("gemini-2.5-flash", "Gemini 2.5 Flash", "gemini-2.5-flash"),
576
- text("gemini-2.5-pro", "Gemini 2.5 Pro", "gemini-2.5-pro"),
577
- text("gemini-3.1-pro-preview", "Gemini 3.1 Pro (preview)", "gemini-3.1-pro-preview"),
578
- text("gemini-3.5-flash", "Gemini 3.5 Flash", "gemini-3.5-flash"),
579
- text("gemini-3.6-flash", "Gemini 3.6 Flash", "gemini-3.6-flash"),
580
- text("gemini-3.7-flash", "Gemini 3.7 Flash", "gemini-3.7-flash"),
581
- text("gemini-3.8-flash", "Gemini 3.8 Flash", "gemini-3.8-flash"),
582
1034
  // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.
583
1035
  text("gemini-3-flash-preview", "Gemini 3 Flash (preview)", "gemini-3-flash-preview", {
1036
+ exposure: "internal",
584
1037
  lifecycle: "deprecated",
585
1038
  replacedBy: "gemini-3.6-flash"
586
1039
  }),
587
- text("gemini-3.1-flash-lite", "Gemini 3.1 Flash Lite", "gemini-3.1-flash-lite"),
588
- text("sonar", "Sonar", "sonar"),
589
- text("sonar-pro", "Sonar Pro", "sonar-pro"),
590
- text("sonar-reasoning-pro", "Sonar Reasoning Pro", "sonar-reasoning-pro"),
591
- text("deepseek-v4-flash", "DeepSeek V4 Flash", "deepseek-v4-flash"),
592
- text("deepseek-v4-pro", "DeepSeek V4 Pro", "deepseek-v4-pro"),
593
- text("grok-4.3", "Grok 4.3", "grok-4.3"),
594
- text("kimi-k2.5", "Kimi K2.5", "kimi-k2.5"),
595
- text("kimi-k3", "Kimi K3", "kimi-k3"),
1040
+ text("gemini-3.1-flash-lite", "Gemini 3.1 Flash Lite", "gemini-3.1-flash-lite", {
1041
+ exposure: "internal",
1042
+ display: {
1043
+ provider: "google",
1044
+ costTier: 1,
1045
+ description: "Google Gemini 3.1 Flash-Lite low-latency multimodal model for high-volume agentic, translation, and data-extraction tasks; 1M-token context."
1046
+ },
1047
+ capabilities: {
1048
+ vision: true,
1049
+ tools: true,
1050
+ structuredOutput: true,
1051
+ contextWindow: 1048576
1052
+ }
1053
+ }),
1054
+ text("sonar", "Sonar", "sonar", {
1055
+ exposure: "internal",
1056
+ display: {
1057
+ provider: "perplexity",
1058
+ costTier: 1,
1059
+ description: "Perplexity Sonar lightweight web-grounded search model returning cited answers; 128K-token context."
1060
+ },
1061
+ capabilities: {
1062
+ vision: true,
1063
+ tools: false,
1064
+ structuredOutput: true,
1065
+ contextWindow: 128e3
1066
+ }
1067
+ }),
1068
+ text("sonar-pro", "Sonar Pro", "sonar-pro", {
1069
+ exposure: "internal",
1070
+ display: {
1071
+ provider: "perplexity",
1072
+ costTier: 2,
1073
+ description: "Perplexity Sonar Pro advanced web-grounded search model for complex multi-step queries; 200K-token context."
1074
+ },
1075
+ capabilities: {
1076
+ vision: true,
1077
+ tools: false,
1078
+ structuredOutput: true,
1079
+ contextWindow: 2e5
1080
+ }
1081
+ }),
1082
+ text("sonar-reasoning-pro", "Sonar Reasoning Pro", "sonar-reasoning-pro", {
1083
+ exposure: "internal",
1084
+ display: {
1085
+ provider: "perplexity",
1086
+ costTier: 2,
1087
+ description: "Perplexity Sonar Reasoning Pro chain-of-thought web-grounded search model for complex problem-solving; 128K-token context."
1088
+ },
1089
+ capabilities: {
1090
+ vision: true,
1091
+ tools: false,
1092
+ structuredOutput: true,
1093
+ contextWindow: 128e3
1094
+ }
1095
+ }),
1096
+ text("deepseek-v4-flash", "DeepSeek V4 Flash", "deepseek-v4-flash", {
1097
+ exposure: "catalog",
1098
+ display: {
1099
+ provider: "deepseek",
1100
+ costTier: 1,
1101
+ recommended: true,
1102
+ description: "DeepSeek V4 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens."
1103
+ },
1104
+ capabilities: {
1105
+ vision: true,
1106
+ tools: true,
1107
+ structuredOutput: true,
1108
+ contextWindow: 1e6
1109
+ }
1110
+ }),
1111
+ text("deepseek-v4-pro", "DeepSeek V4 Pro", "deepseek-v4-pro", {
1112
+ exposure: "catalog",
1113
+ display: {
1114
+ provider: "deepseek",
1115
+ costTier: 2,
1116
+ description: "DeepSeek V4 Pro thinking/non-thinking text model with tool calls and JSON output (no vision); 1M-token context and up to 384K output tokens."
1117
+ },
1118
+ capabilities: {
1119
+ vision: false,
1120
+ tools: true,
1121
+ structuredOutput: true,
1122
+ contextWindow: 1e6
1123
+ }
1124
+ }),
1125
+ // 1M-token context: https://docs.x.ai/docs/models/grok-4.3
1126
+ text("grok-4.3", "Grok 4.3", "grok-4.3", {
1127
+ exposure: "catalog",
1128
+ display: {
1129
+ provider: "xai",
1130
+ costTier: 2,
1131
+ description: "xAI Grok 4.3 reasoning model with tool calling and structured outputs; text and image input, 1M-token context."
1132
+ },
1133
+ capabilities: {
1134
+ vision: true,
1135
+ tools: true,
1136
+ structuredOutput: true,
1137
+ contextWindow: 1e6
1138
+ }
1139
+ }),
1140
+ // Moonshot retired kimi-k2.5 on 2026-08-31 and no longer publishes its specs.
1141
+ text("kimi-k2.5", "Kimi K2.5", "kimi-k2.5", {
1142
+ exposure: "catalog",
1143
+ display: {
1144
+ provider: "moonshot",
1145
+ costTier: 2,
1146
+ description: "Moonshot Kimi K2.5; the provider retired the model on 2026-08-31 and calls now return a model-not-found error."
1147
+ },
1148
+ capabilities: {}
1149
+ }),
1150
+ text("kimi-k3", "Kimi K3", "kimi-k3", {
1151
+ exposure: "catalog",
1152
+ display: {
1153
+ provider: "moonshot",
1154
+ costTier: 2,
1155
+ description: "Moonshot Kimi K3 flagship model with native visual understanding and always-on thinking; text, image, and video input, 1M-token context."
1156
+ },
1157
+ capabilities: {
1158
+ vision: true,
1159
+ tools: true,
1160
+ structuredOutput: true,
1161
+ contextWindow: 1e6
1162
+ }
1163
+ }),
596
1164
  // Cowork calls the provider "MiniMax-M3"; the pricing key is lowercase.
597
- text("minimax-m3", "MiniMax M3", "MiniMax-M3", { aliases: ["MiniMax-M3"] })
1165
+ // 1M-token context: https://platform.minimax.io/docs/api-reference/text-openai-api
1166
+ text("minimax-m3", "MiniMax M3", "MiniMax-M3", {
1167
+ exposure: "catalog",
1168
+ aliases: ["MiniMax-M3"],
1169
+ display: {
1170
+ provider: "minimax",
1171
+ costTier: 2,
1172
+ description: "MiniMax M3 frontier multimodal model for agentic reasoning, tool use, and coding; text, image, and video input, 1M-token context."
1173
+ },
1174
+ capabilities: { vision: true, tools: true, contextWindow: 1e6 }
1175
+ })
598
1176
  ];
599
1177
 
600
1178
  // src/catalog/video.ts
@@ -606,6 +1184,8 @@ var GROK_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"];
606
1184
  var H3_RATIOS = ["21:9", "16:9", "4:3", "1:1", "3:4", "9:16"];
607
1185
  var H3_REFERENCE_RATIOS = ["adaptive", ...H3_RATIOS];
608
1186
  var NEGATIVE_PROMPT = "blur, distort, and low quality";
1187
+ var FRAMES_EXCLUDE_REFERENCES = { framesExcludeReferences: true };
1188
+ var GOOGLE_LOGO = "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png";
609
1189
  var VIDEO_MODELS = [
610
1190
  {
611
1191
  id: "veo-3.1",
@@ -620,6 +1200,7 @@ var VIDEO_MODELS = [
620
1200
  adapter: "google-genai",
621
1201
  providerModelId: "veo-3.1-generate-preview",
622
1202
  lifecycle: "active",
1203
+ exposure: "catalog",
623
1204
  constraints: {
624
1205
  aspectRatios: [...OMNI_RATIOS],
625
1206
  resolutions: ["720p", "1080p", "4k"],
@@ -629,7 +1210,13 @@ var VIDEO_MODELS = [
629
1210
  },
630
1211
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
631
1212
  usage: { ...VIDEO_USAGE },
632
- pricingKind: "video_per_second"
1213
+ pricingKind: "video_per_second",
1214
+ display: {
1215
+ provider: "google",
1216
+ description: "Google's highest-quality video generation model. Supports up to 4K resolution and 8-second clips with reference image conditioning.",
1217
+ logo: GOOGLE_LOGO
1218
+ },
1219
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
633
1220
  },
634
1221
  {
635
1222
  id: "veo-3.1-fast",
@@ -643,6 +1230,7 @@ var VIDEO_MODELS = [
643
1230
  adapter: "google-genai",
644
1231
  providerModelId: "veo-3.1-fast-generate-preview",
645
1232
  lifecycle: "active",
1233
+ exposure: "internal",
646
1234
  constraints: {
647
1235
  aspectRatios: [...OMNI_RATIOS],
648
1236
  resolutions: ["720p", "1080p", "4k"],
@@ -652,7 +1240,12 @@ var VIDEO_MODELS = [
652
1240
  },
653
1241
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
654
1242
  usage: { ...VIDEO_USAGE },
655
- pricingKind: "video_per_second"
1243
+ pricingKind: "video_per_second",
1244
+ display: {
1245
+ provider: "google",
1246
+ description: "Faster variant of Google Veo 3.1; text- and image-to-video with natively generated audio at 4 or 8 seconds."
1247
+ },
1248
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
656
1249
  },
657
1250
  {
658
1251
  id: "veo-3.1-lite",
@@ -666,16 +1259,22 @@ var VIDEO_MODELS = [
666
1259
  adapter: "google-genai",
667
1260
  providerModelId: "veo-3.1-lite-generate-preview",
668
1261
  lifecycle: "active",
1262
+ exposure: "internal",
669
1263
  constraints: {
670
1264
  aspectRatios: [...OMNI_RATIOS],
671
- resolutions: ["720p", "1080p", "4k"],
1265
+ resolutions: ["720p", "1080p"],
672
1266
  durations: [4, 8],
673
1267
  references: { images: 3 },
674
1268
  supports: ["lastFrame"]
675
1269
  },
676
1270
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
677
1271
  usage: { ...VIDEO_USAGE },
678
- pricingKind: "video_per_second"
1272
+ pricingKind: "video_per_second",
1273
+ display: {
1274
+ provider: "google",
1275
+ description: "Efficiency-focused Google Veo 3.1 Lite for high-volume video generation and editing; text and image input, with no 4K output or video extension."
1276
+ },
1277
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
679
1278
  },
680
1279
  {
681
1280
  id: "gemini-omni-flash",
@@ -691,6 +1290,7 @@ var VIDEO_MODELS = [
691
1290
  adapter: "google-genai",
692
1291
  providerModelId: "gemini-omni-flash-preview",
693
1292
  lifecycle: "active",
1293
+ exposure: "catalog",
694
1294
  constraints: {
695
1295
  // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter
696
1296
  // sends ratio and duration only when the caller set them, so a
@@ -702,7 +1302,13 @@ var VIDEO_MODELS = [
702
1302
  },
703
1303
  defaults: {},
704
1304
  usage: { ...VIDEO_USAGE },
705
- pricingKind: "video_per_second"
1305
+ pricingKind: "video_per_second",
1306
+ display: {
1307
+ provider: "google",
1308
+ description: "Google's conversational video model with native audio, human support, and natural language editing. Aspect ratio only \u2014 resolution and duration are model-determined.",
1309
+ logo: GOOGLE_LOGO
1310
+ },
1311
+ capabilities: { acceptsSourceVideo: true }
706
1312
  },
707
1313
  {
708
1314
  id: "gemini-omni-1.1-flash",
@@ -712,6 +1318,7 @@ var VIDEO_MODELS = [
712
1318
  adapter: "google-genai",
713
1319
  providerModelId: "gemini-omni-1.1-flash",
714
1320
  lifecycle: "active",
1321
+ exposure: "catalog",
715
1322
  constraints: {
716
1323
  aspectRatios: [...OMNI_RATIOS],
717
1324
  resolutions: ["360p", "720p", "1080p", "4k"],
@@ -721,7 +1328,12 @@ var VIDEO_MODELS = [
721
1328
  },
722
1329
  defaults: {},
723
1330
  usage: { ...VIDEO_USAGE },
724
- pricingKind: "video_per_second"
1331
+ pricingKind: "video_per_second",
1332
+ display: {
1333
+ provider: "google",
1334
+ description: "Google Gemini Omni Flash 1.1 conversational video generation and editing; text, image, and up to 10-second video input, 3-10 second output at up to 4K and 24 FPS."
1335
+ },
1336
+ capabilities: { acceptsSourceVideo: true }
725
1337
  },
726
1338
  {
727
1339
  // vibe-triggers and Space Builder drop the ratio when a frame is wired; Cowork always sends it.
@@ -732,10 +1344,12 @@ var VIDEO_MODELS = [
732
1344
  adapter: "ark",
733
1345
  providerModelId: "dreamina-seedance-2-0-260128",
734
1346
  lifecycle: "active",
1347
+ exposure: "catalog",
735
1348
  constraints: {
736
1349
  aspectRatios: [...SEEDANCE_RATIOS],
737
1350
  resolutions: ["480p", "720p", "1080p", "4k"],
738
1351
  durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1352
+ durationPresets: [4, 6, 8, 10, 12, 15],
739
1353
  references: { images: 9, videos: 3, audios: 3, audioOnly: false },
740
1354
  ratioIgnoredWith: ["firstFrame"],
741
1355
  supports: ["generateAudio", "seed", "lastFrame", "watermark"]
@@ -747,7 +1361,13 @@ var VIDEO_MODELS = [
747
1361
  generateAudio: true
748
1362
  },
749
1363
  usage: { ...VIDEO_USAGE },
750
- pricingKind: "video_per_second"
1364
+ pricingKind: "video_per_second",
1365
+ display: {
1366
+ provider: "bytedance",
1367
+ description: "High-quality AI video generation with reference image conditioning. Supports 4-15 second clips with human preprocessing.",
1368
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png"
1369
+ },
1370
+ capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES }
751
1371
  },
752
1372
  {
753
1373
  id: "seedance-2.0-fast",
@@ -757,6 +1377,7 @@ var VIDEO_MODELS = [
757
1377
  adapter: "ark",
758
1378
  providerModelId: "dreamina-seedance-2-0-fast-260128",
759
1379
  lifecycle: "active",
1380
+ exposure: "catalog",
760
1381
  constraints: {
761
1382
  aspectRatios: [...SEEDANCE_RATIOS],
762
1383
  resolutions: ["480p", "720p"],
@@ -772,7 +1393,12 @@ var VIDEO_MODELS = [
772
1393
  generateAudio: true
773
1394
  },
774
1395
  usage: { ...VIDEO_USAGE },
775
- pricingKind: "video_per_second"
1396
+ pricingKind: "video_per_second",
1397
+ display: {
1398
+ provider: "bytedance",
1399
+ description: "Speed- and cost-optimized ByteDance Seedance 2.0 Fast; text plus image, video, and audio references to generate or edit 4-15 second clips."
1400
+ },
1401
+ capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES }
776
1402
  },
777
1403
  {
778
1404
  // generateAudio defaults to false here (trigger-workflows); Space Builder defaults it to true.
@@ -783,6 +1409,7 @@ var VIDEO_MODELS = [
783
1409
  adapter: "ark",
784
1410
  providerModelId: "dreamina-seedance-2-5-260628",
785
1411
  lifecycle: "active",
1412
+ exposure: "catalog",
786
1413
  constraints: {
787
1414
  aspectRatios: [...SEEDANCE_RATIOS],
788
1415
  resolutions: ["480p", "720p", "1080p"],
@@ -798,7 +1425,12 @@ var VIDEO_MODELS = [
798
1425
  generateAudio: false
799
1426
  },
800
1427
  usage: { ...VIDEO_USAGE },
801
- pricingKind: "video_per_second"
1428
+ pricingKind: "video_per_second",
1429
+ display: {
1430
+ provider: "bytedance",
1431
+ description: "ByteDance Seedance 2.5 for long-form storytelling and omni-reference generation/editing; up to 50 reference assets and 4-30 second clips at up to 1080p."
1432
+ },
1433
+ capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES }
802
1434
  },
803
1435
  {
804
1436
  // Cowork allows 7 reference images and durations 4/6/8/10; Space Builder allows 5 and 1-15s.
@@ -809,17 +1441,25 @@ var VIDEO_MODELS = [
809
1441
  adapter: "xai-video",
810
1442
  providerModelId: "grok-imagine-video",
811
1443
  lifecycle: "active",
1444
+ exposure: "catalog",
812
1445
  constraints: {
813
1446
  aspectRatios: [...GROK_RATIOS],
814
1447
  resolutions: ["480p", "720p"],
815
1448
  durations: { min: 1, max: 15 },
1449
+ durationPresets: [4, 6, 8, 10],
816
1450
  references: { images: 7 },
817
1451
  supports: []
818
1452
  },
819
1453
  // No resolution default: xAI picks its own unless the caller asks.
820
1454
  defaults: { durationSeconds: 8, aspectRatio: "16:9" },
821
1455
  usage: { unit: "reported_cost_usd", modality: "VIDEO" },
822
- pricingKind: "video_per_second"
1456
+ pricingKind: "video_per_second",
1457
+ display: {
1458
+ provider: "xai",
1459
+ description: "xAI's reference-to-video model. Generates short clips conditioned on up to 7 reference images with flexible aspect ratios.",
1460
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png"
1461
+ },
1462
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
823
1463
  },
824
1464
  {
825
1465
  id: "kling-2.5",
@@ -829,6 +1469,7 @@ var VIDEO_MODELS = [
829
1469
  adapter: "higgsfield",
830
1470
  providerModelId: "kling-video/v2.5-turbo/pro/image-to-video",
831
1471
  lifecycle: "active",
1472
+ exposure: "catalog",
832
1473
  constraints: {
833
1474
  aspectRatios: [...KLING_RATIOS],
834
1475
  durations: [5, 10],
@@ -842,7 +1483,12 @@ var VIDEO_MODELS = [
842
1483
  negativePrompt: NEGATIVE_PROMPT
843
1484
  },
844
1485
  usage: { ...VIDEO_USAGE },
845
- pricingKind: "video_per_second"
1486
+ pricingKind: "video_per_second",
1487
+ display: {
1488
+ provider: "kuaishou",
1489
+ description: "Kuaishou Kling 2.5 Turbo Pro image-to-video; animates a single input image from a text prompt with an optional end image, 5- or 10-second clips."
1490
+ },
1491
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
846
1492
  },
847
1493
  {
848
1494
  // trigger-workflows validates 5/10 only; Space Builder allows 3-15s (Kling30Input).
@@ -853,6 +1499,7 @@ var VIDEO_MODELS = [
853
1499
  adapter: "higgsfield",
854
1500
  providerModelId: "kling-video/v3.0/pro/image-to-video",
855
1501
  lifecycle: "active",
1502
+ exposure: "catalog",
856
1503
  constraints: {
857
1504
  aspectRatios: [...KLING_RATIOS],
858
1505
  durations: { min: 3, max: 15 },
@@ -866,7 +1513,12 @@ var VIDEO_MODELS = [
866
1513
  negativePrompt: NEGATIVE_PROMPT
867
1514
  },
868
1515
  usage: { ...VIDEO_USAGE },
869
- pricingKind: "video_per_second"
1516
+ pricingKind: "video_per_second",
1517
+ display: {
1518
+ provider: "kuaishou",
1519
+ description: "Kuaishou Kling 3.0 Pro image-to-video; a required start image plus a text prompt (or multi-shot prompts) with optional end image and native audio, 3-15 second clips."
1520
+ },
1521
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
870
1522
  },
871
1523
  {
872
1524
  // mode standard/pro selects 720p/1080p; the endpoint takes no separate resolution.
@@ -877,6 +1529,7 @@ var VIDEO_MODELS = [
877
1529
  adapter: "replicate",
878
1530
  providerModelId: "kwaivgi/kling-v3-omni-video",
879
1531
  lifecycle: "active",
1532
+ exposure: "catalog",
880
1533
  constraints: {
881
1534
  aspectRatios: [
882
1535
  "1:1",
@@ -897,7 +1550,12 @@ var VIDEO_MODELS = [
897
1550
  },
898
1551
  defaults: { durationSeconds: 5, aspectRatio: "16:9", generateAudio: false, mode: "pro" },
899
1552
  usage: { unit: "compute_seconds", modality: "VIDEO" },
900
- pricingKind: "video_per_second"
1553
+ pricingKind: "video_per_second",
1554
+ display: {
1555
+ provider: "kuaishou",
1556
+ description: "Kuaishou Kling Video 3.0 Omni unified generation and editing from text, start/end images, up to 7 reference images, and reference video; up to 15 seconds at up to 1080p."
1557
+ },
1558
+ capabilities: {}
901
1559
  },
902
1560
  {
903
1561
  id: "minimax-h3",
@@ -907,6 +1565,7 @@ var VIDEO_MODELS = [
907
1565
  adapter: "fal",
908
1566
  providerModelId: "minimax/h3",
909
1567
  lifecycle: "active",
1568
+ exposure: "catalog",
910
1569
  constraints: {
911
1570
  aspectRatios: [...H3_RATIOS],
912
1571
  resolutions: ["480p", "768p", "2k", "4k"],
@@ -920,7 +1579,12 @@ var VIDEO_MODELS = [
920
1579
  promptExpansion: "balanced"
921
1580
  },
922
1581
  usage: { ...VIDEO_USAGE },
923
- pricingKind: "video_per_second"
1582
+ pricingKind: "video_per_second",
1583
+ display: {
1584
+ provider: "minimax",
1585
+ description: "MiniMax H3 multimodal video model for text-to-video, image-to-video (first/last frame), and reference-to-video with native audio, up to 2K."
1586
+ },
1587
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
924
1588
  },
925
1589
  {
926
1590
  id: "minimax-h3-max",
@@ -930,6 +1594,7 @@ var VIDEO_MODELS = [
930
1594
  adapter: "fal",
931
1595
  providerModelId: "minimax/h3-max",
932
1596
  lifecycle: "active",
1597
+ exposure: "catalog",
933
1598
  constraints: {
934
1599
  aspectRatios: [...H3_RATIOS],
935
1600
  resolutions: ["480p", "768p"],
@@ -943,7 +1608,12 @@ var VIDEO_MODELS = [
943
1608
  promptExpansion: "balanced"
944
1609
  },
945
1610
  usage: { ...VIDEO_USAGE },
946
- pricingKind: "video_per_second"
1611
+ pricingKind: "video_per_second",
1612
+ display: {
1613
+ provider: "minimax",
1614
+ description: "High-speed MiniMax H3 Max variant for text-to-video and image-to-video (first/last frame) only, up to 768p."
1615
+ },
1616
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
947
1617
  },
948
1618
  {
949
1619
  id: "minimax-h3-reference",
@@ -953,6 +1623,7 @@ var VIDEO_MODELS = [
953
1623
  adapter: "fal",
954
1624
  providerModelId: "minimax/h3/reference-to-video",
955
1625
  lifecycle: "active",
1626
+ exposure: "catalog",
956
1627
  constraints: {
957
1628
  aspectRatios: [...H3_REFERENCE_RATIOS],
958
1629
  resolutions: ["480p", "768p", "2k", "4k"],
@@ -967,7 +1638,12 @@ var VIDEO_MODELS = [
967
1638
  promptExpansion: "balanced"
968
1639
  },
969
1640
  usage: { ...VIDEO_USAGE },
970
- pricingKind: "video_per_second"
1641
+ pricingKind: "video_per_second",
1642
+ display: {
1643
+ provider: "minimax",
1644
+ description: "MiniMax H3 reference-to-video mode guided by up to 9 reference images, 3 reference videos, and 3 audio clips; reference and image-to-video inputs cannot be mixed."
1645
+ },
1646
+ capabilities: {}
971
1647
  },
972
1648
  {
973
1649
  id: "minimax-h3-max-reference",
@@ -977,6 +1653,7 @@ var VIDEO_MODELS = [
977
1653
  adapter: "fal",
978
1654
  providerModelId: "minimax/h3-max/reference-to-video",
979
1655
  lifecycle: "active",
1656
+ exposure: "catalog",
980
1657
  constraints: {
981
1658
  aspectRatios: [...H3_REFERENCE_RATIOS],
982
1659
  resolutions: ["480p", "768p"],
@@ -991,7 +1668,12 @@ var VIDEO_MODELS = [
991
1668
  promptExpansion: "balanced"
992
1669
  },
993
1670
  usage: { ...VIDEO_USAGE },
994
- pricingKind: "video_per_second"
1671
+ pricingKind: "video_per_second",
1672
+ display: {
1673
+ provider: "minimax",
1674
+ description: "MiniMax H3 Max reference-to-video on fal; conditions on reference images, videos, and audio. MiniMax's own docs do not list a reference mode for H3 Max."
1675
+ },
1676
+ capabilities: {}
995
1677
  },
996
1678
  {
997
1679
  // Duration 3-10s per trigger-workflows mapDuration; the endpoint takes no resolution.
@@ -1002,6 +1684,7 @@ var VIDEO_MODELS = [
1002
1684
  adapter: "fal",
1003
1685
  providerModelId: "fal-ai/kling-video/o1/video-to-video/reference",
1004
1686
  lifecycle: "active",
1687
+ exposure: "internal",
1005
1688
  constraints: {
1006
1689
  aspectRatios: [...KLING_RATIOS],
1007
1690
  durations: { min: 3, max: 10 },
@@ -1010,7 +1693,12 @@ var VIDEO_MODELS = [
1010
1693
  },
1011
1694
  defaults: { durationSeconds: 5, aspectRatio: "16:9" },
1012
1695
  usage: { ...VIDEO_USAGE },
1013
- pricingKind: "video_per_second"
1696
+ pricingKind: "video_per_second",
1697
+ display: {
1698
+ provider: "kuaishou",
1699
+ description: "Kuaishou Kling O1 Reference Video-to-Video; a prompt plus a 3-10 second reference video (optional reference images) generates 3-10 second clips preserving motion and camera language."
1700
+ },
1701
+ capabilities: { acceptsSourceVideo: true }
1014
1702
  },
1015
1703
  {
1016
1704
  id: "hailuo-02",
@@ -1020,6 +1708,7 @@ var VIDEO_MODELS = [
1020
1708
  adapter: "replicate",
1021
1709
  providerModelId: "minimax/hailuo-02",
1022
1710
  lifecycle: "active",
1711
+ exposure: "internal",
1023
1712
  constraints: {
1024
1713
  resolutions: ["768p"],
1025
1714
  durations: [6, 10],
@@ -1027,7 +1716,12 @@ var VIDEO_MODELS = [
1027
1716
  },
1028
1717
  defaults: { durationSeconds: 6, resolution: "768p" },
1029
1718
  usage: { unit: "compute_seconds", modality: "VIDEO" },
1030
- pricingKind: "video_per_second"
1719
+ pricingKind: "video_per_second",
1720
+ display: {
1721
+ provider: "minimax",
1722
+ description: "MiniMax Hailuo 02 text-to-video and image-to-video model with realistic physics and strong prompt following; outputs 768p at 6 or 10 seconds."
1723
+ },
1724
+ capabilities: {}
1031
1725
  },
1032
1726
  {
1033
1727
  id: "higgsfield-dop-preview",
@@ -1037,13 +1731,19 @@ var VIDEO_MODELS = [
1037
1731
  adapter: "higgsfield",
1038
1732
  providerModelId: "dop-preview",
1039
1733
  lifecycle: "active",
1734
+ exposure: "internal",
1040
1735
  constraints: {
1041
1736
  requires: ["firstFrame"],
1042
1737
  supports: ["seed", "lastFrame"]
1043
1738
  },
1044
1739
  defaults: {},
1045
1740
  usage: { ...VIDEO_USAGE },
1046
- pricingKind: "video_per_second"
1741
+ pricingKind: "video_per_second",
1742
+ display: {
1743
+ provider: "higgsfield",
1744
+ description: "Higgsfield DOP image-to-video model; animates a required first-frame image from a text prompt with an optional last-frame image and motion controls."
1745
+ },
1746
+ capabilities: {}
1047
1747
  }
1048
1748
  ];
1049
1749
 
@@ -1629,6 +2329,7 @@ function passthroughTextModel(model) {
1629
2329
  adapter: "ai-sdk-text",
1630
2330
  providerModelId: model.modelId,
1631
2331
  lifecycle: "active",
2332
+ exposure: "internal",
1632
2333
  constraints: {},
1633
2334
  defaults: {},
1634
2335
  usage: { unit: "tokens", modality: "TEXT" },