@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.cjs CHANGED
@@ -118,6 +118,23 @@ var Catalog = class _Catalog {
118
118
  for (const model of models) this.add(model);
119
119
  }
120
120
  add(model) {
121
+ if (this.byId.has(model.id)) {
122
+ throw new Error(`Duplicate model id "${model.id}"`);
123
+ }
124
+ if (this.byAlias.has(model.id)) {
125
+ throw new Error(
126
+ `Model id "${model.id}" collides with an alias of "${this.byAlias.get(model.id)}"`
127
+ );
128
+ }
129
+ for (const alias of model.aliases) {
130
+ if (alias === model.id) {
131
+ throw new Error(`Alias "${alias}" collides with its own model id "${model.id}"`);
132
+ }
133
+ const existing = this.byAlias.get(alias);
134
+ if (existing !== void 0) {
135
+ throw new Error(`Duplicate alias "${alias}" (already maps to "${existing}")`);
136
+ }
137
+ }
121
138
  this.byId.set(model.id, model);
122
139
  this.byAlias.set(model.id, model.id);
123
140
  for (const alias of model.aliases) this.byAlias.set(alias, model.id);
@@ -166,6 +183,7 @@ var Catalog = class _Catalog {
166
183
 
167
184
  // src/catalog/image.ts
168
185
  var IMAGE_USAGE = { unit: "images", modality: "IMAGE" };
186
+ var IMAGE_GENERATE_EDIT = { imageGenerate: true, imageEdit: true };
169
187
  var GEMINI_RATIOS = [
170
188
  "1:1",
171
189
  "2:3",
@@ -179,7 +197,7 @@ var GEMINI_RATIOS = [
179
197
  "5:4",
180
198
  "adaptive"
181
199
  ];
182
- function geminiImage(id, label, aliases, sizes) {
200
+ function geminiImage(id, label, aliases, sizes, display, exposure) {
183
201
  const model = {
184
202
  id,
185
203
  aliases,
@@ -188,6 +206,7 @@ function geminiImage(id, label, aliases, sizes) {
188
206
  adapter: "google-image",
189
207
  providerModelId: id,
190
208
  lifecycle: "active",
209
+ exposure,
191
210
  constraints: {
192
211
  aspectRatios: [...GEMINI_RATIOS],
193
212
  sizes,
@@ -195,40 +214,88 @@ function geminiImage(id, label, aliases, sizes) {
195
214
  },
196
215
  defaults: { size: "1K", aspectRatio: "1:1" },
197
216
  usage: { ...IMAGE_USAGE },
198
- pricingKind: "image_size"
217
+ pricingKind: "image_size",
218
+ display,
219
+ capabilities: { ...IMAGE_GENERATE_EDIT }
199
220
  };
200
221
  return model;
201
222
  }
202
223
  var IMAGE_MODELS = [
203
- geminiImage("gemini-3-pro-image-preview", "Nano Banana Pro", ["nb-pro"], ["1K", "2K", "4K"]),
224
+ geminiImage(
225
+ "gemini-3-pro-image-preview",
226
+ "Nano Banana Pro",
227
+ ["nb-pro"],
228
+ ["1K", "2K", "4K"],
229
+ {
230
+ provider: "google",
231
+ description: "Create stunning, production-quality visuals with exceptional realism, detail, and typography. Best for campaigns, e-commerce, product photography, and hero creatives.",
232
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
233
+ },
234
+ "catalog"
235
+ ),
204
236
  geminiImage(
205
237
  "gemini-3.1-flash-image-preview",
206
- "Nano Banana Flash",
238
+ "Nano Banana 2",
207
239
  ["nb-2"],
208
240
  // Flash 3.1 is the only Gemini image model with the 512 tier.
209
- ["512", "1K", "2K", "4K"]
241
+ ["512", "1K", "2K", "4K"],
242
+ {
243
+ provider: "google",
244
+ description: "Generate high-quality images at speed. Perfect for brainstorming, moodboards, concept testing, creative exploration, and large batch workflows.",
245
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
246
+ },
247
+ "catalog"
248
+ ),
249
+ geminiImage(
250
+ "gemini-3.1-flash-lite-image",
251
+ "Nano Banana Lite",
252
+ ["nb-lite"],
253
+ ["1K"],
254
+ {
255
+ provider: "google",
256
+ description: "The fastest and most affordable image model. Ideal for rapid drafts, bulk exploration, and iterative concept testing at 1K resolution.",
257
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
258
+ },
259
+ "catalog"
210
260
  ),
211
- geminiImage("gemini-3.1-flash-lite-image", "Nano Banana Lite", ["nb-lite"], ["1K"]),
212
261
  // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.
213
- geminiImage("gemini-2.5-flash-image", "Gemini 2.5 Flash Image", [], ["1K", "2K", "4K"]),
262
+ geminiImage(
263
+ "gemini-2.5-flash-image",
264
+ "Gemini 2.5 Flash Image",
265
+ [],
266
+ ["1K", "2K", "4K"],
267
+ {
268
+ provider: "google",
269
+ description: "Nano Banana (legacy Gemini 2.5 Flash Image) native image generation and editing model for high-volume, low-latency creative workflows."
270
+ },
271
+ "internal"
272
+ ),
214
273
  {
215
274
  // Cowork "auto" lets OpenAI pick the size; the canonical equivalent is adaptive.
216
275
  id: "gpt-image-2",
217
276
  aliases: [],
218
- label: "GPT Image 2",
277
+ label: "GPT-image-2",
219
278
  type: "image",
220
279
  adapter: "openai-image",
221
280
  providerModelId: "gpt-image-2",
222
281
  lifecycle: "active",
282
+ exposure: "catalog",
223
283
  constraints: {
224
284
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
225
285
  sizes: ["1K", "2K", "4K"],
286
+ qualityOptions: ["auto", "low", "medium", "high"],
226
287
  references: { images: 16 },
227
288
  supports: ["quality", "count"]
228
289
  },
229
290
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
230
291
  usage: { ...IMAGE_USAGE },
231
- pricingKind: "image_size"
292
+ pricingKind: "image_size",
293
+ display: {
294
+ provider: "openai",
295
+ description: "The most capable model for image editing and complex creative instructions. Excels at text rendering, visual consistency, design generation, and iterative refinement.",
296
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/1204b494-8962-4f7f-af5e-699a8bdc98e3_compressed.png"
297
+ },
298
+ capabilities: { ...IMAGE_GENERATE_EDIT }
232
299
  },
233
300
  {
234
301
  // Same Images API surface as gpt-image-2 plus the "xhigh" and "max" quality tiers.
@@ -239,15 +306,22 @@ var IMAGE_MODELS = [
239
306
  adapter: "openai-image",
240
307
  providerModelId: "gpt-image-2.5-sunburst",
241
308
  lifecycle: "active",
309
+ exposure: "internal",
242
310
  constraints: {
243
311
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
244
312
  sizes: ["1K", "2K", "4K"],
313
+ qualityOptions: ["auto", "low", "medium", "high"],
245
314
  references: { images: 16 },
246
315
  supports: ["quality", "count"]
247
316
  },
248
317
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
249
318
  usage: { ...IMAGE_USAGE },
250
- pricingKind: "image_size"
319
+ pricingKind: "image_size",
320
+ display: {
321
+ provider: "openai",
322
+ 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."
323
+ },
324
+ capabilities: { ...IMAGE_GENERATE_EDIT }
251
325
  },
252
326
  {
253
327
  // Same Images API surface as gpt-image-2 plus the "xhigh" and "max" quality tiers.
@@ -258,25 +332,33 @@ var IMAGE_MODELS = [
258
332
  adapter: "openai-image",
259
333
  providerModelId: "gpt-image-2.5-flare",
260
334
  lifecycle: "active",
335
+ exposure: "internal",
261
336
  constraints: {
262
337
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
263
338
  sizes: ["1K", "2K", "4K"],
339
+ qualityOptions: ["auto", "low", "medium", "high"],
264
340
  references: { images: 16 },
265
341
  supports: ["quality", "count"]
266
342
  },
267
343
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
268
344
  usage: { ...IMAGE_USAGE },
269
- pricingKind: "image_size"
345
+ pricingKind: "image_size",
346
+ display: {
347
+ provider: "openai",
348
+ 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."
349
+ },
350
+ capabilities: { ...IMAGE_GENERATE_EDIT }
270
351
  },
271
352
  {
272
353
  // Cowork allows 7 ratios; trigger-workflows allows 9 (adds 3:2, 9:21, drops 4:5/5:4).
273
354
  id: "muse-image-1.0",
274
- aliases: [],
355
+ aliases: ["meta-muse"],
275
356
  label: "Meta Muse",
276
357
  type: "image",
277
358
  adapter: "fal",
278
359
  providerModelId: "muse-image-1.0",
279
360
  lifecycle: "active",
361
+ exposure: "catalog",
280
362
  constraints: {
281
363
  aspectRatios: [
282
364
  "21:9",
@@ -298,7 +380,13 @@ var IMAGE_MODELS = [
298
380
  },
299
381
  defaults: { size: "1K", aspectRatio: "1:1", outputFormat: "png", count: 1 },
300
382
  usage: { ...IMAGE_USAGE },
301
- pricingKind: "image_size"
383
+ pricingKind: "image_size",
384
+ display: {
385
+ provider: "meta",
386
+ 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.",
387
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png"
388
+ },
389
+ capabilities: { ...IMAGE_GENERATE_EDIT }
302
390
  },
303
391
  {
304
392
  id: "seedream-5-0-pro",
@@ -308,6 +396,7 @@ var IMAGE_MODELS = [
308
396
  adapter: "ark",
309
397
  providerModelId: "dola-seedream-5-0-pro-260628",
310
398
  lifecycle: "active",
399
+ exposure: "catalog",
311
400
  constraints: {
312
401
  aspectRatios: ["1:1", "4:3", "3:4", "16:9", "9:16", "3:2", "2:3", "21:9", "4:5", "5:4"],
313
402
  sizes: ["1K", "2K"],
@@ -318,7 +407,12 @@ var IMAGE_MODELS = [
318
407
  },
319
408
  defaults: { size: "1K", aspectRatio: "1:1" },
320
409
  usage: { ...IMAGE_USAGE },
321
- pricingKind: "image_size"
410
+ pricingKind: "image_size",
411
+ display: {
412
+ provider: "bytedance",
413
+ 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."
414
+ },
415
+ capabilities: { ...IMAGE_GENERATE_EDIT }
322
416
  },
323
417
  {
324
418
  id: "seedream-4.5",
@@ -328,6 +422,7 @@ var IMAGE_MODELS = [
328
422
  adapter: "ark",
329
423
  providerModelId: "seedream-4-5-251128",
330
424
  lifecycle: "active",
425
+ exposure: "internal",
331
426
  constraints: {
332
427
  // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and
333
428
  // omits the ratio instead. Advertise only sizes the adapter can send.
@@ -350,7 +445,12 @@ var IMAGE_MODELS = [
350
445
  },
351
446
  defaults: { size: "1K", aspectRatio: "1:1" },
352
447
  usage: { ...IMAGE_USAGE },
353
- pricingKind: "image_size"
448
+ pricingKind: "image_size",
449
+ display: {
450
+ provider: "bytedance",
451
+ 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."
452
+ },
453
+ capabilities: { ...IMAGE_GENERATE_EDIT }
354
454
  },
355
455
  {
356
456
  id: "flux-2-pro",
@@ -360,6 +460,7 @@ var IMAGE_MODELS = [
360
460
  adapter: "prodia",
361
461
  providerModelId: "flux-2-pro",
362
462
  lifecycle: "active",
463
+ exposure: "catalog",
363
464
  constraints: {
364
465
  aspectRatios: ["1:1", "2:3", "3:2", "16:9", "9:16", "4:3", "3:4", "4:5", "5:4", "21:9"],
365
466
  sizes: ["1K"],
@@ -368,7 +469,12 @@ var IMAGE_MODELS = [
368
469
  },
369
470
  defaults: { size: "1K", aspectRatio: "1:1" },
370
471
  usage: { ...IMAGE_USAGE },
371
- pricingKind: "image_size"
472
+ pricingKind: "image_size",
473
+ display: {
474
+ provider: "black-forest-labs",
475
+ 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."
476
+ },
477
+ capabilities: { ...IMAGE_GENERATE_EDIT }
372
478
  },
373
479
  {
374
480
  // Prodia's gemini-3-pro jobs take aspect_ratio + resolution (1K/2K/4K), not
@@ -381,6 +487,7 @@ var IMAGE_MODELS = [
381
487
  adapter: "prodia",
382
488
  providerModelId: "inference.gemini-3-pro.img2img.v1",
383
489
  lifecycle: "active",
490
+ exposure: "internal",
384
491
  constraints: {
385
492
  aspectRatios: ["1:1", "2:3", "3:2", "4:3", "3:4", "4:5", "5:4", "9:16", "16:9", "21:9"],
386
493
  sizes: ["1K", "2K", "4K"],
@@ -389,7 +496,12 @@ var IMAGE_MODELS = [
389
496
  },
390
497
  defaults: { size: "1K", aspectRatio: "1:1" },
391
498
  usage: { ...IMAGE_USAGE },
392
- pricingKind: "image_size"
499
+ pricingKind: "image_size",
500
+ display: {
501
+ provider: "google",
502
+ 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."
503
+ },
504
+ capabilities: { ...IMAGE_GENERATE_EDIT }
393
505
  },
394
506
  {
395
507
  // Nano Banana (img2img.v2) is flat-rate with aspect_ratio only; 3:2, 4:5,
@@ -401,6 +513,7 @@ var IMAGE_MODELS = [
401
513
  adapter: "prodia",
402
514
  providerModelId: "inference.nano-banana.img2img.v2",
403
515
  lifecycle: "active",
516
+ exposure: "internal",
404
517
  constraints: {
405
518
  aspectRatios: ["1:1", "2:3", "3:4", "4:3", "9:16", "16:9", "21:9"],
406
519
  sizes: ["1K"],
@@ -409,7 +522,12 @@ var IMAGE_MODELS = [
409
522
  },
410
523
  defaults: { size: "1K", aspectRatio: "1:1" },
411
524
  usage: { ...IMAGE_USAGE },
412
- pricingKind: "image_size"
525
+ pricingKind: "image_size",
526
+ display: {
527
+ provider: "google",
528
+ 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."
529
+ },
530
+ capabilities: { ...IMAGE_GENERATE_EDIT }
413
531
  },
414
532
  {
415
533
  // WAN 2.7 takes `images` (up to 9) and a `size` enum whose exact values
@@ -422,6 +540,7 @@ var IMAGE_MODELS = [
422
540
  adapter: "replicate",
423
541
  providerModelId: "wan-video/wan-2.7-image-pro",
424
542
  lifecycle: "active",
543
+ exposure: "internal",
425
544
  constraints: {
426
545
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4"],
427
546
  sizes: ["1K", "2K", "4K"],
@@ -430,7 +549,12 @@ var IMAGE_MODELS = [
430
549
  },
431
550
  defaults: { size: "1K", aspectRatio: "1:1" },
432
551
  usage: { unit: "compute_seconds", modality: "IMAGE" },
433
- pricingKind: "image_size"
552
+ pricingKind: "image_size",
553
+ display: {
554
+ provider: "alibaba",
555
+ 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)."
556
+ },
557
+ capabilities: { ...IMAGE_GENERATE_EDIT }
434
558
  },
435
559
  {
436
560
  // Qwen Image 2 Pro has aspect_ratio but no size input; resolution follows
@@ -443,6 +567,7 @@ var IMAGE_MODELS = [
443
567
  adapter: "replicate",
444
568
  providerModelId: "qwen/qwen-image-2-pro",
445
569
  lifecycle: "active",
570
+ exposure: "internal",
446
571
  constraints: {
447
572
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"],
448
573
  sizes: [],
@@ -452,7 +577,12 @@ var IMAGE_MODELS = [
452
577
  },
453
578
  defaults: { aspectRatio: "1:1" },
454
579
  usage: { unit: "compute_seconds", modality: "IMAGE" },
455
- pricingKind: "image_size"
580
+ pricingKind: "image_size",
581
+ display: {
582
+ provider: "alibaba",
583
+ 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."
584
+ },
585
+ capabilities: { ...IMAGE_GENERATE_EDIT }
456
586
  },
457
587
  {
458
588
  // Qwen Image Edit Plus takes aspect_ratio (or match_input_image) and
@@ -465,6 +595,7 @@ var IMAGE_MODELS = [
465
595
  adapter: "replicate",
466
596
  providerModelId: "qwen-edit-apps/qwen-image-edit-plus-lora-skin",
467
597
  lifecycle: "active",
598
+ exposure: "internal",
468
599
  constraints: {
469
600
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4"],
470
601
  sizes: [],
@@ -474,7 +605,12 @@ var IMAGE_MODELS = [
474
605
  },
475
606
  defaults: { outputFormat: "png" },
476
607
  usage: { unit: "compute_seconds", modality: "IMAGE" },
477
- pricingKind: "image_size"
608
+ pricingKind: "image_size",
609
+ display: {
610
+ provider: "alibaba",
611
+ 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."
612
+ },
613
+ capabilities: { ...IMAGE_GENERATE_EDIT }
478
614
  }
479
615
  ];
480
616
 
@@ -488,6 +624,7 @@ var OTHER_MODELS = [
488
624
  adapter: "google-genai",
489
625
  providerModelId: "lyria-3-clip-preview",
490
626
  lifecycle: "active",
627
+ exposure: "catalog",
491
628
  constraints: {
492
629
  durations: [30],
493
630
  references: { images: 10 },
@@ -495,7 +632,12 @@ var OTHER_MODELS = [
495
632
  },
496
633
  defaults: {},
497
634
  usage: { unit: "images", modality: "AUDIO" },
498
- pricingKind: "flat"
635
+ pricingKind: "flat",
636
+ display: {
637
+ provider: "google",
638
+ 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."
639
+ },
640
+ capabilities: {}
499
641
  },
500
642
  {
501
643
  id: "lyria-3-pro-preview",
@@ -505,13 +647,19 @@ var OTHER_MODELS = [
505
647
  adapter: "google-genai",
506
648
  providerModelId: "lyria-3-pro-preview",
507
649
  lifecycle: "active",
650
+ exposure: "catalog",
508
651
  constraints: {
509
652
  references: { images: 10 },
510
653
  supports: []
511
654
  },
512
655
  defaults: {},
513
656
  usage: { unit: "images", modality: "AUDIO" },
514
- pricingKind: "flat"
657
+ pricingKind: "flat",
658
+ display: {
659
+ provider: "google",
660
+ 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."
661
+ },
662
+ capabilities: {}
515
663
  },
516
664
  {
517
665
  id: "google/lyria-2",
@@ -521,13 +669,19 @@ var OTHER_MODELS = [
521
669
  adapter: "replicate",
522
670
  providerModelId: "google/lyria-2",
523
671
  lifecycle: "active",
672
+ exposure: "internal",
524
673
  constraints: {
525
674
  durations: [30],
526
675
  supports: ["seed", "negativePrompt"]
527
676
  },
528
677
  defaults: {},
529
678
  usage: { unit: "compute_seconds", modality: "AUDIO" },
530
- pricingKind: "flat"
679
+ pricingKind: "flat",
680
+ display: {
681
+ provider: "google",
682
+ description: "Lyria 2 music generation on Replicate; produces 30 seconds of 48 kHz stereo audio from a text prompt."
683
+ },
684
+ capabilities: {}
531
685
  },
532
686
  {
533
687
  id: "mmaudio",
@@ -537,6 +691,7 @@ var OTHER_MODELS = [
537
691
  adapter: "replicate",
538
692
  providerModelId: "zsxkib/mmaudio:62871fb59889b2d7c13777f08deb3b36bdff88f7e1d53a50ad7694548a41b484",
539
693
  lifecycle: "active",
694
+ exposure: "catalog",
540
695
  constraints: {
541
696
  durations: { min: 1, max: 30 },
542
697
  requires: ["sourceVideo"],
@@ -544,7 +699,12 @@ var OTHER_MODELS = [
544
699
  },
545
700
  defaults: { durationSeconds: 8 },
546
701
  usage: { unit: "compute_seconds", modality: "AUDIO" },
547
- pricingKind: "flat"
702
+ pricingKind: "flat",
703
+ display: {
704
+ provider: "mmaudio",
705
+ description: "MMAudio V2 video-to-audio model on Replicate; takes a source video and prompt and synthesizes synchronized environmental, action, and speech-like audio."
706
+ },
707
+ capabilities: {}
548
708
  },
549
709
  {
550
710
  id: "elevenlabs-music",
@@ -554,6 +714,7 @@ var OTHER_MODELS = [
554
714
  adapter: "replicate",
555
715
  providerModelId: "elevenlabs/music",
556
716
  lifecycle: "active",
717
+ exposure: "internal",
557
718
  constraints: {
558
719
  durations: { min: 5, max: 300 },
559
720
  supports: ["instrumental"]
@@ -561,7 +722,12 @@ var OTHER_MODELS = [
561
722
  defaults: { durationSeconds: 15, instrumental: true },
562
723
  // Replicate's run() does not report predict_time; billed by generated length.
563
724
  usage: { unit: "seconds", modality: "AUDIO" },
564
- pricingKind: "flat"
725
+ pricingKind: "flat",
726
+ display: {
727
+ provider: "elevenlabs",
728
+ 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."
729
+ },
730
+ capabilities: {}
565
731
  },
566
732
  {
567
733
  id: "topaz",
@@ -571,6 +737,7 @@ var OTHER_MODELS = [
571
737
  adapter: "replicate",
572
738
  providerModelId: "topazlabs/image-upscale",
573
739
  lifecycle: "active",
740
+ exposure: "catalog",
574
741
  constraints: {
575
742
  references: { images: 1 },
576
743
  requires: ["references"],
@@ -578,7 +745,12 @@ var OTHER_MODELS = [
578
745
  },
579
746
  defaults: { scaleFactor: 2, outputFormat: "png" },
580
747
  usage: { unit: "compute_seconds", modality: "IMAGE" },
581
- pricingKind: "flat"
748
+ pricingKind: "flat",
749
+ display: {
750
+ provider: "topaz",
751
+ 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."
752
+ },
753
+ capabilities: { imageEdit: true }
582
754
  },
583
755
  {
584
756
  id: "bg-remove",
@@ -588,6 +760,7 @@ var OTHER_MODELS = [
588
760
  adapter: "prodia",
589
761
  providerModelId: "inference.remove-background.v1",
590
762
  lifecycle: "active",
763
+ exposure: "catalog",
591
764
  constraints: {
592
765
  references: { images: 1 },
593
766
  requires: ["references"],
@@ -595,7 +768,12 @@ var OTHER_MODELS = [
595
768
  },
596
769
  defaults: {},
597
770
  usage: { unit: "images", modality: "IMAGE" },
598
- pricingKind: "flat"
771
+ pricingKind: "flat",
772
+ display: {
773
+ provider: "prodia",
774
+ description: "Prodia background removal; takes one input image and returns a PNG cut-out of the subject plus an optional black-and-white mask."
775
+ },
776
+ capabilities: { imageEdit: true }
599
777
  }
600
778
  ];
601
779
 
@@ -610,6 +788,7 @@ function text(id, label, providerModelId, extra) {
610
788
  adapter: "ai-sdk-text",
611
789
  providerModelId,
612
790
  lifecycle: "active",
791
+ exposure: "internal",
613
792
  constraints: { supports: [] },
614
793
  defaults: {},
615
794
  usage: { ...TEXT_USAGE },
@@ -618,66 +797,465 @@ function text(id, label, providerModelId, extra) {
618
797
  };
619
798
  }
620
799
  var TEXT_MODELS = [
621
- text("gpt-4o", "GPT-4o", "gpt-4o"),
622
- text("gpt-4o-mini", "GPT-4o mini", "gpt-4o-mini"),
623
- text("gpt-5.1", "GPT-5.1", "gpt-5.1"),
624
- text("gpt-5.2", "GPT-5.2", "gpt-5.2"),
625
- text("gpt-5.4", "GPT-5.4", "gpt-5.4"),
800
+ text("gpt-4o", "GPT-4o", "gpt-4o", {
801
+ exposure: "internal",
802
+ display: {
803
+ provider: "openai",
804
+ costTier: 2,
805
+ description: "OpenAI GPT-4o flagship multimodal model; text and image input, 128K-token context."
806
+ },
807
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128e3 }
808
+ }),
809
+ text("gpt-4o-mini", "GPT-4o mini", "gpt-4o-mini", {
810
+ exposure: "internal",
811
+ display: {
812
+ provider: "openai",
813
+ costTier: 1,
814
+ description: "OpenAI GPT-4o mini fast, low-cost multimodal model; text and image input, 128K-token context."
815
+ },
816
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128e3 }
817
+ }),
818
+ text("gpt-5.1", "GPT-5.1", "gpt-5.1", {
819
+ exposure: "catalog",
820
+ display: {
821
+ provider: "openai",
822
+ costTier: 3,
823
+ description: "OpenAI GPT-5.1 reasoning model for coding and agentic tasks; text and image input, 400K-token context."
824
+ },
825
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
826
+ }),
827
+ text("gpt-5.2", "GPT-5.2", "gpt-5.2", {
828
+ exposure: "catalog",
829
+ display: {
830
+ provider: "openai",
831
+ costTier: 3,
832
+ description: "OpenAI GPT-5.2 reasoning model for complex professional work; text and image input, 400K-token context."
833
+ },
834
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
835
+ }),
836
+ // 1.05M-token context: https://platform.openai.com/docs/models/gpt-5.4
837
+ text("gpt-5.4", "GPT-5.4", "gpt-5.4", {
838
+ exposure: "internal",
839
+ display: {
840
+ provider: "openai",
841
+ costTier: 3,
842
+ description: "OpenAI GPT-5.4 flagship reasoning model; text and image input, 1.05M-token context."
843
+ },
844
+ capabilities: {
845
+ vision: true,
846
+ tools: true,
847
+ structuredOutput: true,
848
+ contextWindow: 105e4
849
+ }
850
+ }),
626
851
  // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.
627
852
  text("gpt-5.4-mini", "GPT-5.4 mini", "gpt-5.4-mini", {
628
- aliases: ["gpt-5.1-mini", "gpt-5.2-mini"]
853
+ exposure: "catalog",
854
+ aliases: ["gpt-5.1-mini", "gpt-5.2-mini"],
855
+ display: {
856
+ provider: "openai",
857
+ costTier: 1,
858
+ description: "OpenAI GPT-5.4 mini efficient reasoning model for high-volume workloads; text and image input, 400K-token context."
859
+ },
860
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
861
+ }),
862
+ text("gpt-5.5", "GPT-5.5", "gpt-5.5", {
863
+ exposure: "catalog",
864
+ display: {
865
+ provider: "openai",
866
+ costTier: 3,
867
+ description: "OpenAI GPT-5.5 flagship reasoning model for the most complex professional and coding work; text and image input, 1.05M-token context."
868
+ },
869
+ capabilities: {
870
+ vision: true,
871
+ tools: true,
872
+ structuredOutput: true,
873
+ contextWindow: 105e4
874
+ }
875
+ }),
876
+ text("gpt-5.6-luna", "GPT-5.6 Luna", "gpt-5.6-luna", {
877
+ exposure: "catalog",
878
+ display: {
879
+ provider: "openai",
880
+ costTier: 1,
881
+ description: "OpenAI GPT-5.6 Luna cost-optimized tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
882
+ },
883
+ capabilities: {
884
+ vision: true,
885
+ tools: true,
886
+ structuredOutput: true,
887
+ contextWindow: 105e4
888
+ }
889
+ }),
890
+ text("gpt-5.6-terra", "GPT-5.6 Terra", "gpt-5.6-terra", {
891
+ exposure: "catalog",
892
+ display: {
893
+ provider: "openai",
894
+ costTier: 2,
895
+ description: "OpenAI GPT-5.6 Terra balanced tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
896
+ },
897
+ capabilities: {
898
+ vision: true,
899
+ tools: true,
900
+ structuredOutput: true,
901
+ contextWindow: 105e4
902
+ }
903
+ }),
904
+ text("gpt-5.6-sol", "GPT-5.6 Sol", "gpt-5.6-sol", {
905
+ exposure: "catalog",
906
+ display: {
907
+ provider: "openai",
908
+ costTier: 3,
909
+ description: "OpenAI GPT-5.6 Sol flagship tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
910
+ },
911
+ capabilities: {
912
+ vision: true,
913
+ tools: true,
914
+ structuredOutput: true,
915
+ contextWindow: 105e4
916
+ }
629
917
  }),
630
- text("gpt-5.5", "GPT-5.5", "gpt-5.5"),
631
- text("gpt-5.6-luna", "GPT-5.6 Luna", "gpt-5.6-luna"),
632
- text("gpt-5.6-terra", "GPT-5.6 Terra", "gpt-5.6-terra"),
633
- text("gpt-5.6-sol", "GPT-5.6 Sol", "gpt-5.6-sol"),
634
918
  // Library key "claude-sonnet-4.5" maps to the SDK id "claude-sonnet-4-5".
635
919
  text("claude-sonnet-4-5", "Claude Sonnet 4.5", "claude-sonnet-4-5", {
636
- aliases: ["claude-sonnet-4.5", "claude-sonnet-4-5-20250929"]
920
+ exposure: "internal",
921
+ aliases: ["claude-sonnet-4.5", "claude-sonnet-4-5-20250929"],
922
+ display: {
923
+ provider: "anthropic",
924
+ costTier: 2,
925
+ description: "Anthropic Claude Sonnet 4.5 (legacy) balanced model; text and image input, 200K-token context."
926
+ },
927
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 2e5 }
637
928
  }),
638
929
  // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.
639
930
  text("claude-sonnet-4-6", "Claude Sonnet 4.6", "claude-sonnet-4-6", {
931
+ exposure: "catalog",
640
932
  aliases: [
641
933
  "claude-sonnet-4.6",
642
934
  "claude-sonnet-4",
643
935
  "claude-sonnet-4.0",
644
936
  "claude-sonnet-4-20250514"
645
- ]
937
+ ],
938
+ display: {
939
+ provider: "anthropic",
940
+ costTier: 2,
941
+ description: "Anthropic Claude Sonnet 4.6 (legacy) balanced model; text and image input, 1M-token context."
942
+ },
943
+ capabilities: {
944
+ vision: true,
945
+ tools: true,
946
+ structuredOutput: true,
947
+ contextWindow: 1e6
948
+ }
949
+ }),
950
+ text("claude-sonnet-5", "Claude Sonnet 5", "claude-sonnet-5", {
951
+ exposure: "catalog",
952
+ display: {
953
+ provider: "anthropic",
954
+ costTier: 3,
955
+ description: "Anthropic Claude Sonnet 5 current balanced model; text and image input, 1M-token context."
956
+ },
957
+ capabilities: {
958
+ vision: true,
959
+ tools: true,
960
+ structuredOutput: true,
961
+ contextWindow: 1e6
962
+ }
646
963
  }),
647
- text("claude-sonnet-5", "Claude Sonnet 5", "claude-sonnet-5"),
648
964
  text("claude-opus-4-8", "Claude Opus 4.8", "claude-opus-4-8", {
649
- aliases: ["claude-opus-4.8", "claude-opus-4", "claude-opus-4.0", "claude-opus-4-20250514"]
965
+ exposure: "catalog",
966
+ aliases: ["claude-opus-4.8", "claude-opus-4", "claude-opus-4.0", "claude-opus-4-20250514"],
967
+ display: {
968
+ provider: "anthropic",
969
+ costTier: 3,
970
+ description: "Anthropic Claude Opus 4.8 (legacy) frontier model; text and image input, 1M-token context."
971
+ },
972
+ capabilities: {
973
+ vision: true,
974
+ tools: true,
975
+ structuredOutput: true,
976
+ contextWindow: 1e6
977
+ }
650
978
  }),
651
979
  text("claude-haiku-4-5", "Claude Haiku 4.5", "claude-haiku-4-5", {
652
- aliases: ["claude-haiku-4.5", "claude-haiku-4-5-20251001", "claude-haiku-4"]
980
+ exposure: "catalog",
981
+ aliases: ["claude-haiku-4.5", "claude-haiku-4-5-20251001", "claude-haiku-4"],
982
+ display: {
983
+ provider: "anthropic",
984
+ costTier: 1,
985
+ description: "Anthropic Claude Haiku 4.5 fast model with near-frontier intelligence; text and image input, 200K-token context."
986
+ },
987
+ capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 2e5 }
653
988
  }),
654
989
  text("claude-opus-5", "Claude Opus 5", "claude-opus-5", {
655
- aliases: ["claude-opus-5.0"]
990
+ exposure: "internal",
991
+ aliases: ["claude-opus-5.0"],
992
+ display: {
993
+ provider: "anthropic",
994
+ costTier: 3,
995
+ description: "Anthropic Claude Opus 5 current frontier model for agentic coding and enterprise work; text and image input, 1M-token context."
996
+ },
997
+ capabilities: {
998
+ vision: true,
999
+ tools: true,
1000
+ structuredOutput: true,
1001
+ contextWindow: 1e6
1002
+ }
1003
+ }),
1004
+ text("claude-fable-5", "Claude Fable 5", "claude-fable-5", {
1005
+ exposure: "internal",
1006
+ display: {
1007
+ provider: "anthropic",
1008
+ costTier: 3,
1009
+ description: "Anthropic Claude Fable 5 (legacy) model for demanding reasoning and long-horizon agentic work; text and image input, 1M-token context."
1010
+ },
1011
+ capabilities: {
1012
+ vision: true,
1013
+ tools: true,
1014
+ structuredOutput: true,
1015
+ contextWindow: 1e6
1016
+ }
1017
+ }),
1018
+ text("gemini-2.5-flash", "Gemini 2.5 Flash", "gemini-2.5-flash", {
1019
+ exposure: "internal",
1020
+ display: {
1021
+ provider: "google",
1022
+ costTier: 1,
1023
+ description: "Google Gemini 2.5 Flash low-latency multimodal model for high-volume reasoning over text, images, video, and audio; 1M-token context."
1024
+ },
1025
+ capabilities: {
1026
+ vision: true,
1027
+ tools: true,
1028
+ structuredOutput: true,
1029
+ contextWindow: 1048576
1030
+ }
1031
+ }),
1032
+ text("gemini-2.5-pro", "Gemini 2.5 Pro", "gemini-2.5-pro", {
1033
+ exposure: "internal",
1034
+ display: {
1035
+ provider: "google",
1036
+ costTier: 2,
1037
+ 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."
1038
+ },
1039
+ capabilities: {
1040
+ vision: true,
1041
+ tools: true,
1042
+ structuredOutput: true,
1043
+ contextWindow: 1048576
1044
+ }
1045
+ }),
1046
+ text("gemini-3.1-pro-preview", "Gemini 3.1 Pro (preview)", "gemini-3.1-pro-preview", {
1047
+ exposure: "catalog",
1048
+ display: {
1049
+ provider: "google",
1050
+ costTier: 2,
1051
+ description: "Google Gemini 3.1 Pro preview reasoning model for software engineering, tool use, and reliable agentic workflows; 1M-token context."
1052
+ },
1053
+ capabilities: {
1054
+ vision: true,
1055
+ tools: true,
1056
+ structuredOutput: true,
1057
+ contextWindow: 1048576
1058
+ }
1059
+ }),
1060
+ text("gemini-3.5-flash", "Gemini 3.5 Flash", "gemini-3.5-flash", {
1061
+ exposure: "catalog",
1062
+ display: {
1063
+ provider: "google",
1064
+ costTier: 1,
1065
+ description: "Google Gemini 3.5 Flash high-throughput model for frontier-level agentic tasks; text, image, video, audio, and PDF input, 1M-token context."
1066
+ },
1067
+ capabilities: {
1068
+ vision: true,
1069
+ tools: true,
1070
+ structuredOutput: true,
1071
+ contextWindow: 1048576
1072
+ }
1073
+ }),
1074
+ text("gemini-3.6-flash", "Gemini 3.6 Flash", "gemini-3.6-flash", {
1075
+ exposure: "catalog",
1076
+ display: {
1077
+ provider: "google",
1078
+ costTier: 1,
1079
+ description: "Google Gemini 3.6 Flash general-purpose multimodal agentic model balancing speed and capability; 1M-token context."
1080
+ },
1081
+ capabilities: {
1082
+ vision: true,
1083
+ tools: true,
1084
+ structuredOutput: true,
1085
+ contextWindow: 1048576
1086
+ }
1087
+ }),
1088
+ text("gemini-3.7-flash", "Gemini 3.7 Flash", "gemini-3.7-flash", {
1089
+ exposure: "catalog",
1090
+ display: {
1091
+ provider: "google",
1092
+ costTier: 1,
1093
+ recommended: true,
1094
+ description: "Google Gemini 3.7 Flash natively multimodal reasoning model for coding, agentic workflows, and multi-step execution; 1M-token context."
1095
+ },
1096
+ capabilities: {
1097
+ vision: true,
1098
+ tools: true,
1099
+ structuredOutput: true,
1100
+ contextWindow: 1048576
1101
+ }
1102
+ }),
1103
+ text("gemini-3.8-flash", "Gemini 3.8 Flash", "gemini-3.8-flash", {
1104
+ exposure: "internal",
1105
+ display: {
1106
+ provider: "google",
1107
+ costTier: 1,
1108
+ description: "Google Gemini 3.8 Flash frontier model for long-horizon software engineering, autonomous agents, and enterprise workflows; 1M-token context."
1109
+ },
1110
+ capabilities: {
1111
+ vision: true,
1112
+ tools: true,
1113
+ structuredOutput: true,
1114
+ contextWindow: 1048576
1115
+ }
656
1116
  }),
657
- text("claude-fable-5", "Claude Fable 5", "claude-fable-5"),
658
- text("gemini-2.5-flash", "Gemini 2.5 Flash", "gemini-2.5-flash"),
659
- text("gemini-2.5-pro", "Gemini 2.5 Pro", "gemini-2.5-pro"),
660
- text("gemini-3.1-pro-preview", "Gemini 3.1 Pro (preview)", "gemini-3.1-pro-preview"),
661
- text("gemini-3.5-flash", "Gemini 3.5 Flash", "gemini-3.5-flash"),
662
- text("gemini-3.6-flash", "Gemini 3.6 Flash", "gemini-3.6-flash"),
663
- text("gemini-3.7-flash", "Gemini 3.7 Flash", "gemini-3.7-flash"),
664
- text("gemini-3.8-flash", "Gemini 3.8 Flash", "gemini-3.8-flash"),
665
1117
  // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.
666
1118
  text("gemini-3-flash-preview", "Gemini 3 Flash (preview)", "gemini-3-flash-preview", {
1119
+ exposure: "internal",
667
1120
  lifecycle: "deprecated",
668
1121
  replacedBy: "gemini-3.6-flash"
669
1122
  }),
670
- text("gemini-3.1-flash-lite", "Gemini 3.1 Flash Lite", "gemini-3.1-flash-lite"),
671
- text("sonar", "Sonar", "sonar"),
672
- text("sonar-pro", "Sonar Pro", "sonar-pro"),
673
- text("sonar-reasoning-pro", "Sonar Reasoning Pro", "sonar-reasoning-pro"),
674
- text("deepseek-v4-flash", "DeepSeek V4 Flash", "deepseek-v4-flash"),
675
- text("deepseek-v4-pro", "DeepSeek V4 Pro", "deepseek-v4-pro"),
676
- text("grok-4.3", "Grok 4.3", "grok-4.3"),
677
- text("kimi-k2.5", "Kimi K2.5", "kimi-k2.5"),
678
- text("kimi-k3", "Kimi K3", "kimi-k3"),
1123
+ text("gemini-3.1-flash-lite", "Gemini 3.1 Flash Lite", "gemini-3.1-flash-lite", {
1124
+ exposure: "internal",
1125
+ display: {
1126
+ provider: "google",
1127
+ costTier: 1,
1128
+ description: "Google Gemini 3.1 Flash-Lite low-latency multimodal model for high-volume agentic, translation, and data-extraction tasks; 1M-token context."
1129
+ },
1130
+ capabilities: {
1131
+ vision: true,
1132
+ tools: true,
1133
+ structuredOutput: true,
1134
+ contextWindow: 1048576
1135
+ }
1136
+ }),
1137
+ text("sonar", "Sonar", "sonar", {
1138
+ exposure: "internal",
1139
+ display: {
1140
+ provider: "perplexity",
1141
+ costTier: 1,
1142
+ description: "Perplexity Sonar lightweight web-grounded search model returning cited answers; 128K-token context."
1143
+ },
1144
+ capabilities: {
1145
+ vision: true,
1146
+ tools: false,
1147
+ structuredOutput: true,
1148
+ contextWindow: 128e3
1149
+ }
1150
+ }),
1151
+ text("sonar-pro", "Sonar Pro", "sonar-pro", {
1152
+ exposure: "internal",
1153
+ display: {
1154
+ provider: "perplexity",
1155
+ costTier: 2,
1156
+ description: "Perplexity Sonar Pro advanced web-grounded search model for complex multi-step queries; 200K-token context."
1157
+ },
1158
+ capabilities: {
1159
+ vision: true,
1160
+ tools: false,
1161
+ structuredOutput: true,
1162
+ contextWindow: 2e5
1163
+ }
1164
+ }),
1165
+ text("sonar-reasoning-pro", "Sonar Reasoning Pro", "sonar-reasoning-pro", {
1166
+ exposure: "internal",
1167
+ display: {
1168
+ provider: "perplexity",
1169
+ costTier: 2,
1170
+ description: "Perplexity Sonar Reasoning Pro chain-of-thought web-grounded search model for complex problem-solving; 128K-token context."
1171
+ },
1172
+ capabilities: {
1173
+ vision: true,
1174
+ tools: false,
1175
+ structuredOutput: true,
1176
+ contextWindow: 128e3
1177
+ }
1178
+ }),
1179
+ text("deepseek-v4-flash", "DeepSeek V4 Flash", "deepseek-v4-flash", {
1180
+ exposure: "catalog",
1181
+ display: {
1182
+ provider: "deepseek",
1183
+ costTier: 1,
1184
+ recommended: true,
1185
+ description: "DeepSeek V4 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens."
1186
+ },
1187
+ capabilities: {
1188
+ vision: true,
1189
+ tools: true,
1190
+ structuredOutput: true,
1191
+ contextWindow: 1e6
1192
+ }
1193
+ }),
1194
+ text("deepseek-v4-pro", "DeepSeek V4 Pro", "deepseek-v4-pro", {
1195
+ exposure: "catalog",
1196
+ display: {
1197
+ provider: "deepseek",
1198
+ costTier: 2,
1199
+ 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."
1200
+ },
1201
+ capabilities: {
1202
+ vision: false,
1203
+ tools: true,
1204
+ structuredOutput: true,
1205
+ contextWindow: 1e6
1206
+ }
1207
+ }),
1208
+ // 1M-token context: https://docs.x.ai/docs/models/grok-4.3
1209
+ text("grok-4.3", "Grok 4.3", "grok-4.3", {
1210
+ exposure: "catalog",
1211
+ display: {
1212
+ provider: "xai",
1213
+ costTier: 2,
1214
+ description: "xAI Grok 4.3 reasoning model with tool calling and structured outputs; text and image input, 1M-token context."
1215
+ },
1216
+ capabilities: {
1217
+ vision: true,
1218
+ tools: true,
1219
+ structuredOutput: true,
1220
+ contextWindow: 1e6
1221
+ }
1222
+ }),
1223
+ // Moonshot retired kimi-k2.5 on 2026-08-31 and no longer publishes its specs.
1224
+ text("kimi-k2.5", "Kimi K2.5", "kimi-k2.5", {
1225
+ exposure: "catalog",
1226
+ display: {
1227
+ provider: "moonshot",
1228
+ costTier: 2,
1229
+ description: "Moonshot Kimi K2.5; the provider retired the model on 2026-08-31 and calls now return a model-not-found error."
1230
+ },
1231
+ capabilities: {}
1232
+ }),
1233
+ text("kimi-k3", "Kimi K3", "kimi-k3", {
1234
+ exposure: "catalog",
1235
+ display: {
1236
+ provider: "moonshot",
1237
+ costTier: 2,
1238
+ description: "Moonshot Kimi K3 flagship model with native visual understanding and always-on thinking; text, image, and video input, 1M-token context."
1239
+ },
1240
+ capabilities: {
1241
+ vision: true,
1242
+ tools: true,
1243
+ structuredOutput: true,
1244
+ contextWindow: 1e6
1245
+ }
1246
+ }),
679
1247
  // Cowork calls the provider "MiniMax-M3"; the pricing key is lowercase.
680
- text("minimax-m3", "MiniMax M3", "MiniMax-M3", { aliases: ["MiniMax-M3"] })
1248
+ // 1M-token context: https://platform.minimax.io/docs/api-reference/text-openai-api
1249
+ text("minimax-m3", "MiniMax M3", "MiniMax-M3", {
1250
+ exposure: "catalog",
1251
+ aliases: ["MiniMax-M3"],
1252
+ display: {
1253
+ provider: "minimax",
1254
+ costTier: 2,
1255
+ description: "MiniMax M3 frontier multimodal model for agentic reasoning, tool use, and coding; text, image, and video input, 1M-token context."
1256
+ },
1257
+ capabilities: { vision: true, tools: true, contextWindow: 1e6 }
1258
+ })
681
1259
  ];
682
1260
 
683
1261
  // src/catalog/video.ts
@@ -689,6 +1267,8 @@ var GROK_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"];
689
1267
  var H3_RATIOS = ["21:9", "16:9", "4:3", "1:1", "3:4", "9:16"];
690
1268
  var H3_REFERENCE_RATIOS = ["adaptive", ...H3_RATIOS];
691
1269
  var NEGATIVE_PROMPT = "blur, distort, and low quality";
1270
+ var FRAMES_EXCLUDE_REFERENCES = { framesExcludeReferences: true };
1271
+ var GOOGLE_LOGO = "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png";
692
1272
  var VIDEO_MODELS = [
693
1273
  {
694
1274
  id: "veo-3.1",
@@ -703,6 +1283,7 @@ var VIDEO_MODELS = [
703
1283
  adapter: "google-genai",
704
1284
  providerModelId: "veo-3.1-generate-preview",
705
1285
  lifecycle: "active",
1286
+ exposure: "catalog",
706
1287
  constraints: {
707
1288
  aspectRatios: [...OMNI_RATIOS],
708
1289
  resolutions: ["720p", "1080p", "4k"],
@@ -712,7 +1293,13 @@ var VIDEO_MODELS = [
712
1293
  },
713
1294
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
714
1295
  usage: { ...VIDEO_USAGE },
715
- pricingKind: "video_per_second"
1296
+ pricingKind: "video_per_second",
1297
+ display: {
1298
+ provider: "google",
1299
+ description: "Google's highest-quality video generation model. Supports up to 4K resolution and 8-second clips with reference image conditioning.",
1300
+ logo: GOOGLE_LOGO
1301
+ },
1302
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
716
1303
  },
717
1304
  {
718
1305
  id: "veo-3.1-fast",
@@ -726,6 +1313,7 @@ var VIDEO_MODELS = [
726
1313
  adapter: "google-genai",
727
1314
  providerModelId: "veo-3.1-fast-generate-preview",
728
1315
  lifecycle: "active",
1316
+ exposure: "internal",
729
1317
  constraints: {
730
1318
  aspectRatios: [...OMNI_RATIOS],
731
1319
  resolutions: ["720p", "1080p", "4k"],
@@ -735,7 +1323,12 @@ var VIDEO_MODELS = [
735
1323
  },
736
1324
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
737
1325
  usage: { ...VIDEO_USAGE },
738
- pricingKind: "video_per_second"
1326
+ pricingKind: "video_per_second",
1327
+ display: {
1328
+ provider: "google",
1329
+ description: "Faster variant of Google Veo 3.1; text- and image-to-video with natively generated audio at 4 or 8 seconds."
1330
+ },
1331
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
739
1332
  },
740
1333
  {
741
1334
  id: "veo-3.1-lite",
@@ -749,16 +1342,22 @@ var VIDEO_MODELS = [
749
1342
  adapter: "google-genai",
750
1343
  providerModelId: "veo-3.1-lite-generate-preview",
751
1344
  lifecycle: "active",
1345
+ exposure: "internal",
752
1346
  constraints: {
753
1347
  aspectRatios: [...OMNI_RATIOS],
754
- resolutions: ["720p", "1080p", "4k"],
1348
+ resolutions: ["720p", "1080p"],
755
1349
  durations: [4, 8],
756
1350
  references: { images: 3 },
757
1351
  supports: ["lastFrame"]
758
1352
  },
759
1353
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
760
1354
  usage: { ...VIDEO_USAGE },
761
- pricingKind: "video_per_second"
1355
+ pricingKind: "video_per_second",
1356
+ display: {
1357
+ provider: "google",
1358
+ 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."
1359
+ },
1360
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
762
1361
  },
763
1362
  {
764
1363
  id: "gemini-omni-flash",
@@ -774,6 +1373,7 @@ var VIDEO_MODELS = [
774
1373
  adapter: "google-genai",
775
1374
  providerModelId: "gemini-omni-flash-preview",
776
1375
  lifecycle: "active",
1376
+ exposure: "catalog",
777
1377
  constraints: {
778
1378
  // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter
779
1379
  // sends ratio and duration only when the caller set them, so a
@@ -785,7 +1385,13 @@ var VIDEO_MODELS = [
785
1385
  },
786
1386
  defaults: {},
787
1387
  usage: { ...VIDEO_USAGE },
788
- pricingKind: "video_per_second"
1388
+ pricingKind: "video_per_second",
1389
+ display: {
1390
+ provider: "google",
1391
+ 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.",
1392
+ logo: GOOGLE_LOGO
1393
+ },
1394
+ capabilities: { acceptsSourceVideo: true }
789
1395
  },
790
1396
  {
791
1397
  id: "gemini-omni-1.1-flash",
@@ -795,6 +1401,7 @@ var VIDEO_MODELS = [
795
1401
  adapter: "google-genai",
796
1402
  providerModelId: "gemini-omni-1.1-flash",
797
1403
  lifecycle: "active",
1404
+ exposure: "catalog",
798
1405
  constraints: {
799
1406
  aspectRatios: [...OMNI_RATIOS],
800
1407
  resolutions: ["360p", "720p", "1080p", "4k"],
@@ -804,7 +1411,12 @@ var VIDEO_MODELS = [
804
1411
  },
805
1412
  defaults: {},
806
1413
  usage: { ...VIDEO_USAGE },
807
- pricingKind: "video_per_second"
1414
+ pricingKind: "video_per_second",
1415
+ display: {
1416
+ provider: "google",
1417
+ 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."
1418
+ },
1419
+ capabilities: { acceptsSourceVideo: true }
808
1420
  },
809
1421
  {
810
1422
  // vibe-triggers and Space Builder drop the ratio when a frame is wired; Cowork always sends it.
@@ -815,10 +1427,12 @@ var VIDEO_MODELS = [
815
1427
  adapter: "ark",
816
1428
  providerModelId: "dreamina-seedance-2-0-260128",
817
1429
  lifecycle: "active",
1430
+ exposure: "catalog",
818
1431
  constraints: {
819
1432
  aspectRatios: [...SEEDANCE_RATIOS],
820
1433
  resolutions: ["480p", "720p", "1080p", "4k"],
821
1434
  durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1435
+ durationPresets: [4, 6, 8, 10, 12, 15],
822
1436
  references: { images: 9, videos: 3, audios: 3, audioOnly: false },
823
1437
  ratioIgnoredWith: ["firstFrame"],
824
1438
  supports: ["generateAudio", "seed", "lastFrame", "watermark"]
@@ -830,7 +1444,13 @@ var VIDEO_MODELS = [
830
1444
  generateAudio: true
831
1445
  },
832
1446
  usage: { ...VIDEO_USAGE },
833
- pricingKind: "video_per_second"
1447
+ pricingKind: "video_per_second",
1448
+ display: {
1449
+ provider: "bytedance",
1450
+ description: "High-quality AI video generation with reference image conditioning. Supports 4-15 second clips with human preprocessing.",
1451
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png"
1452
+ },
1453
+ capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES }
834
1454
  },
835
1455
  {
836
1456
  id: "seedance-2.0-fast",
@@ -840,6 +1460,7 @@ var VIDEO_MODELS = [
840
1460
  adapter: "ark",
841
1461
  providerModelId: "dreamina-seedance-2-0-fast-260128",
842
1462
  lifecycle: "active",
1463
+ exposure: "catalog",
843
1464
  constraints: {
844
1465
  aspectRatios: [...SEEDANCE_RATIOS],
845
1466
  resolutions: ["480p", "720p"],
@@ -855,7 +1476,12 @@ var VIDEO_MODELS = [
855
1476
  generateAudio: true
856
1477
  },
857
1478
  usage: { ...VIDEO_USAGE },
858
- pricingKind: "video_per_second"
1479
+ pricingKind: "video_per_second",
1480
+ display: {
1481
+ provider: "bytedance",
1482
+ 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."
1483
+ },
1484
+ capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES }
859
1485
  },
860
1486
  {
861
1487
  // generateAudio defaults to false here (trigger-workflows); Space Builder defaults it to true.
@@ -866,6 +1492,7 @@ var VIDEO_MODELS = [
866
1492
  adapter: "ark",
867
1493
  providerModelId: "dreamina-seedance-2-5-260628",
868
1494
  lifecycle: "active",
1495
+ exposure: "catalog",
869
1496
  constraints: {
870
1497
  aspectRatios: [...SEEDANCE_RATIOS],
871
1498
  resolutions: ["480p", "720p", "1080p"],
@@ -881,7 +1508,12 @@ var VIDEO_MODELS = [
881
1508
  generateAudio: false
882
1509
  },
883
1510
  usage: { ...VIDEO_USAGE },
884
- pricingKind: "video_per_second"
1511
+ pricingKind: "video_per_second",
1512
+ display: {
1513
+ provider: "bytedance",
1514
+ 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."
1515
+ },
1516
+ capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES }
885
1517
  },
886
1518
  {
887
1519
  // Cowork allows 7 reference images and durations 4/6/8/10; Space Builder allows 5 and 1-15s.
@@ -892,17 +1524,25 @@ var VIDEO_MODELS = [
892
1524
  adapter: "xai-video",
893
1525
  providerModelId: "grok-imagine-video",
894
1526
  lifecycle: "active",
1527
+ exposure: "catalog",
895
1528
  constraints: {
896
1529
  aspectRatios: [...GROK_RATIOS],
897
1530
  resolutions: ["480p", "720p"],
898
1531
  durations: { min: 1, max: 15 },
1532
+ durationPresets: [4, 6, 8, 10],
899
1533
  references: { images: 7 },
900
1534
  supports: []
901
1535
  },
902
1536
  // No resolution default: xAI picks its own unless the caller asks.
903
1537
  defaults: { durationSeconds: 8, aspectRatio: "16:9" },
904
1538
  usage: { unit: "reported_cost_usd", modality: "VIDEO" },
905
- pricingKind: "video_per_second"
1539
+ pricingKind: "video_per_second",
1540
+ display: {
1541
+ provider: "xai",
1542
+ description: "xAI's reference-to-video model. Generates short clips conditioned on up to 7 reference images with flexible aspect ratios.",
1543
+ logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png"
1544
+ },
1545
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
906
1546
  },
907
1547
  {
908
1548
  id: "kling-2.5",
@@ -912,6 +1552,7 @@ var VIDEO_MODELS = [
912
1552
  adapter: "higgsfield",
913
1553
  providerModelId: "kling-video/v2.5-turbo/pro/image-to-video",
914
1554
  lifecycle: "active",
1555
+ exposure: "catalog",
915
1556
  constraints: {
916
1557
  aspectRatios: [...KLING_RATIOS],
917
1558
  durations: [5, 10],
@@ -925,7 +1566,12 @@ var VIDEO_MODELS = [
925
1566
  negativePrompt: NEGATIVE_PROMPT
926
1567
  },
927
1568
  usage: { ...VIDEO_USAGE },
928
- pricingKind: "video_per_second"
1569
+ pricingKind: "video_per_second",
1570
+ display: {
1571
+ provider: "kuaishou",
1572
+ 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."
1573
+ },
1574
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
929
1575
  },
930
1576
  {
931
1577
  // trigger-workflows validates 5/10 only; Space Builder allows 3-15s (Kling30Input).
@@ -936,6 +1582,7 @@ var VIDEO_MODELS = [
936
1582
  adapter: "higgsfield",
937
1583
  providerModelId: "kling-video/v3.0/pro/image-to-video",
938
1584
  lifecycle: "active",
1585
+ exposure: "catalog",
939
1586
  constraints: {
940
1587
  aspectRatios: [...KLING_RATIOS],
941
1588
  durations: { min: 3, max: 15 },
@@ -949,7 +1596,12 @@ var VIDEO_MODELS = [
949
1596
  negativePrompt: NEGATIVE_PROMPT
950
1597
  },
951
1598
  usage: { ...VIDEO_USAGE },
952
- pricingKind: "video_per_second"
1599
+ pricingKind: "video_per_second",
1600
+ display: {
1601
+ provider: "kuaishou",
1602
+ 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."
1603
+ },
1604
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
953
1605
  },
954
1606
  {
955
1607
  // mode standard/pro selects 720p/1080p; the endpoint takes no separate resolution.
@@ -960,6 +1612,7 @@ var VIDEO_MODELS = [
960
1612
  adapter: "replicate",
961
1613
  providerModelId: "kwaivgi/kling-v3-omni-video",
962
1614
  lifecycle: "active",
1615
+ exposure: "catalog",
963
1616
  constraints: {
964
1617
  aspectRatios: [
965
1618
  "1:1",
@@ -980,7 +1633,12 @@ var VIDEO_MODELS = [
980
1633
  },
981
1634
  defaults: { durationSeconds: 5, aspectRatio: "16:9", generateAudio: false, mode: "pro" },
982
1635
  usage: { unit: "compute_seconds", modality: "VIDEO" },
983
- pricingKind: "video_per_second"
1636
+ pricingKind: "video_per_second",
1637
+ display: {
1638
+ provider: "kuaishou",
1639
+ 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."
1640
+ },
1641
+ capabilities: {}
984
1642
  },
985
1643
  {
986
1644
  id: "minimax-h3",
@@ -990,6 +1648,7 @@ var VIDEO_MODELS = [
990
1648
  adapter: "fal",
991
1649
  providerModelId: "minimax/h3",
992
1650
  lifecycle: "active",
1651
+ exposure: "catalog",
993
1652
  constraints: {
994
1653
  aspectRatios: [...H3_RATIOS],
995
1654
  resolutions: ["480p", "768p", "2k", "4k"],
@@ -1003,7 +1662,12 @@ var VIDEO_MODELS = [
1003
1662
  promptExpansion: "balanced"
1004
1663
  },
1005
1664
  usage: { ...VIDEO_USAGE },
1006
- pricingKind: "video_per_second"
1665
+ pricingKind: "video_per_second",
1666
+ display: {
1667
+ provider: "minimax",
1668
+ 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."
1669
+ },
1670
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
1007
1671
  },
1008
1672
  {
1009
1673
  id: "minimax-h3-max",
@@ -1013,6 +1677,7 @@ var VIDEO_MODELS = [
1013
1677
  adapter: "fal",
1014
1678
  providerModelId: "minimax/h3-max",
1015
1679
  lifecycle: "active",
1680
+ exposure: "catalog",
1016
1681
  constraints: {
1017
1682
  aspectRatios: [...H3_RATIOS],
1018
1683
  resolutions: ["480p", "768p"],
@@ -1026,7 +1691,12 @@ var VIDEO_MODELS = [
1026
1691
  promptExpansion: "balanced"
1027
1692
  },
1028
1693
  usage: { ...VIDEO_USAGE },
1029
- pricingKind: "video_per_second"
1694
+ pricingKind: "video_per_second",
1695
+ display: {
1696
+ provider: "minimax",
1697
+ description: "High-speed MiniMax H3 Max variant for text-to-video and image-to-video (first/last frame) only, up to 768p."
1698
+ },
1699
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
1030
1700
  },
1031
1701
  {
1032
1702
  id: "minimax-h3-reference",
@@ -1036,6 +1706,7 @@ var VIDEO_MODELS = [
1036
1706
  adapter: "fal",
1037
1707
  providerModelId: "minimax/h3/reference-to-video",
1038
1708
  lifecycle: "active",
1709
+ exposure: "catalog",
1039
1710
  constraints: {
1040
1711
  aspectRatios: [...H3_REFERENCE_RATIOS],
1041
1712
  resolutions: ["480p", "768p", "2k", "4k"],
@@ -1050,7 +1721,12 @@ var VIDEO_MODELS = [
1050
1721
  promptExpansion: "balanced"
1051
1722
  },
1052
1723
  usage: { ...VIDEO_USAGE },
1053
- pricingKind: "video_per_second"
1724
+ pricingKind: "video_per_second",
1725
+ display: {
1726
+ provider: "minimax",
1727
+ 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."
1728
+ },
1729
+ capabilities: {}
1054
1730
  },
1055
1731
  {
1056
1732
  id: "minimax-h3-max-reference",
@@ -1060,6 +1736,7 @@ var VIDEO_MODELS = [
1060
1736
  adapter: "fal",
1061
1737
  providerModelId: "minimax/h3-max/reference-to-video",
1062
1738
  lifecycle: "active",
1739
+ exposure: "catalog",
1063
1740
  constraints: {
1064
1741
  aspectRatios: [...H3_REFERENCE_RATIOS],
1065
1742
  resolutions: ["480p", "768p"],
@@ -1074,7 +1751,12 @@ var VIDEO_MODELS = [
1074
1751
  promptExpansion: "balanced"
1075
1752
  },
1076
1753
  usage: { ...VIDEO_USAGE },
1077
- pricingKind: "video_per_second"
1754
+ pricingKind: "video_per_second",
1755
+ display: {
1756
+ provider: "minimax",
1757
+ 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."
1758
+ },
1759
+ capabilities: {}
1078
1760
  },
1079
1761
  {
1080
1762
  // Duration 3-10s per trigger-workflows mapDuration; the endpoint takes no resolution.
@@ -1085,6 +1767,7 @@ var VIDEO_MODELS = [
1085
1767
  adapter: "fal",
1086
1768
  providerModelId: "fal-ai/kling-video/o1/video-to-video/reference",
1087
1769
  lifecycle: "active",
1770
+ exposure: "internal",
1088
1771
  constraints: {
1089
1772
  aspectRatios: [...KLING_RATIOS],
1090
1773
  durations: { min: 3, max: 10 },
@@ -1093,7 +1776,12 @@ var VIDEO_MODELS = [
1093
1776
  },
1094
1777
  defaults: { durationSeconds: 5, aspectRatio: "16:9" },
1095
1778
  usage: { ...VIDEO_USAGE },
1096
- pricingKind: "video_per_second"
1779
+ pricingKind: "video_per_second",
1780
+ display: {
1781
+ provider: "kuaishou",
1782
+ 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."
1783
+ },
1784
+ capabilities: { acceptsSourceVideo: true }
1097
1785
  },
1098
1786
  {
1099
1787
  id: "hailuo-02",
@@ -1103,6 +1791,7 @@ var VIDEO_MODELS = [
1103
1791
  adapter: "replicate",
1104
1792
  providerModelId: "minimax/hailuo-02",
1105
1793
  lifecycle: "active",
1794
+ exposure: "internal",
1106
1795
  constraints: {
1107
1796
  resolutions: ["768p"],
1108
1797
  durations: [6, 10],
@@ -1110,7 +1799,12 @@ var VIDEO_MODELS = [
1110
1799
  },
1111
1800
  defaults: { durationSeconds: 6, resolution: "768p" },
1112
1801
  usage: { unit: "compute_seconds", modality: "VIDEO" },
1113
- pricingKind: "video_per_second"
1802
+ pricingKind: "video_per_second",
1803
+ display: {
1804
+ provider: "minimax",
1805
+ 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."
1806
+ },
1807
+ capabilities: {}
1114
1808
  },
1115
1809
  {
1116
1810
  id: "higgsfield-dop-preview",
@@ -1120,13 +1814,19 @@ var VIDEO_MODELS = [
1120
1814
  adapter: "higgsfield",
1121
1815
  providerModelId: "dop-preview",
1122
1816
  lifecycle: "active",
1817
+ exposure: "internal",
1123
1818
  constraints: {
1124
1819
  requires: ["firstFrame"],
1125
1820
  supports: ["seed", "lastFrame"]
1126
1821
  },
1127
1822
  defaults: {},
1128
1823
  usage: { ...VIDEO_USAGE },
1129
- pricingKind: "video_per_second"
1824
+ pricingKind: "video_per_second",
1825
+ display: {
1826
+ provider: "higgsfield",
1827
+ 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."
1828
+ },
1829
+ capabilities: {}
1130
1830
  }
1131
1831
  ];
1132
1832
 
@@ -1712,6 +2412,7 @@ function passthroughTextModel(model) {
1712
2412
  adapter: "ai-sdk-text",
1713
2413
  providerModelId: model.modelId,
1714
2414
  lifecycle: "active",
2415
+ exposure: "internal",
1715
2416
  constraints: {},
1716
2417
  defaults: {},
1717
2418
  usage: { unit: "tokens", modality: "TEXT" },