@shop-os/modelkit 0.1.7 → 0.1.9

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);
@@ -97,7 +114,7 @@ var GEMINI_RATIOS = [
97
114
  "5:4",
98
115
  "adaptive"
99
116
  ];
100
- function geminiImage(id, label, aliases, sizes, display) {
117
+ function geminiImage(id, label, aliases, sizes, display, exposure) {
101
118
  const model = {
102
119
  id,
103
120
  aliases,
@@ -106,13 +123,14 @@ function geminiImage(id, label, aliases, sizes, display) {
106
123
  adapter: "google-image",
107
124
  providerModelId: id,
108
125
  lifecycle: "active",
126
+ exposure,
109
127
  constraints: {
110
128
  aspectRatios: [...GEMINI_RATIOS],
111
129
  sizes,
112
130
  supports: ["safetySettings", "temperature"]
113
131
  },
114
132
  defaults: { size: "1K", aspectRatio: "1:1" },
115
- usage: { ...IMAGE_USAGE },
133
+ usage: { ...IMAGE_USAGE, slug: "gemini" },
116
134
  pricingKind: "image_size",
117
135
  display,
118
136
  capabilities: { ...IMAGE_GENERATE_EDIT }
@@ -120,14 +138,21 @@ function geminiImage(id, label, aliases, sizes, display) {
120
138
  return model;
121
139
  }
122
140
  var IMAGE_MODELS = [
123
- geminiImage("gemini-3-pro-image-preview", "Nano Banana Pro", ["nb-pro"], ["1K", "2K", "4K"], {
124
- provider: "google",
125
- description: "Create stunning, production-quality visuals with exceptional realism, detail, and typography. Best for campaigns, e-commerce, product photography, and hero creatives.",
126
- logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
127
- }),
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
+ ),
128
153
  geminiImage(
129
154
  "gemini-3.1-flash-image-preview",
130
- "Nano Banana Flash",
155
+ "Nano Banana 2",
131
156
  ["nb-2"],
132
157
  // Flash 3.1 is the only Gemini image model with the 512 tier.
133
158
  ["512", "1K", "2K", "4K"],
@@ -135,35 +160,61 @@ var IMAGE_MODELS = [
135
160
  provider: "google",
136
161
  description: "Generate high-quality images at speed. Perfect for brainstorming, moodboards, concept testing, creative exploration, and large batch workflows.",
137
162
  logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
138
- }
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"
139
177
  ),
140
- geminiImage("gemini-3.1-flash-lite-image", "Nano Banana Lite", ["nb-lite"], ["1K"], {
141
- provider: "google",
142
- description: "The fastest and most affordable image model. Ideal for rapid drafts, bulk exploration, and iterative concept testing at 1K resolution.",
143
- logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
144
- }),
145
178
  // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.
146
- geminiImage("gemini-2.5-flash-image", "Gemini 2.5 Flash Image", [], ["1K", "2K", "4K"], {
147
- provider: "google",
148
- description: "Nano Banana (legacy Gemini 2.5 Flash Image) native image generation and editing model for high-volume, low-latency creative workflows."
149
- }),
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
+ ),
150
190
  {
151
191
  // Cowork "auto" lets OpenAI pick the size; the canonical equivalent is adaptive.
152
192
  id: "gpt-image-2",
153
193
  aliases: [],
154
- label: "GPT Image 2",
194
+ label: "GPT-image-2",
155
195
  type: "image",
156
196
  adapter: "openai-image",
157
197
  providerModelId: "gpt-image-2",
158
198
  lifecycle: "active",
199
+ exposure: "catalog",
159
200
  constraints: {
201
+ exactSizes: {
202
+ "1:1": "1024x1024",
203
+ "3:2": "1536x1024",
204
+ "2:3": "1024x1536",
205
+ "16:9": "2048x1152",
206
+ "9:16": "1152x2048",
207
+ "4:5": "1024x1280",
208
+ "5:4": "1280x1024"
209
+ },
160
210
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
161
211
  sizes: ["1K", "2K", "4K"],
212
+ qualityOptions: ["auto", "low", "medium", "high"],
162
213
  references: { images: 16 },
163
214
  supports: ["quality", "count"]
164
215
  },
165
216
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
166
- usage: { ...IMAGE_USAGE },
217
+ usage: { ...IMAGE_USAGE, slug: "gpt" },
167
218
  pricingKind: "image_size",
168
219
  display: {
169
220
  provider: "openai",
@@ -181,9 +232,20 @@ var IMAGE_MODELS = [
181
232
  adapter: "openai-image",
182
233
  providerModelId: "gpt-image-2.5-sunburst",
183
234
  lifecycle: "active",
235
+ exposure: "internal",
184
236
  constraints: {
237
+ exactSizes: {
238
+ "1:1": "1024x1024",
239
+ "3:2": "1536x1024",
240
+ "2:3": "1024x1536",
241
+ "16:9": "2048x1152",
242
+ "9:16": "1152x2048",
243
+ "4:5": "1024x1280",
244
+ "5:4": "1280x1024"
245
+ },
185
246
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
186
247
  sizes: ["1K", "2K", "4K"],
248
+ qualityOptions: ["auto", "low", "medium", "high"],
187
249
  references: { images: 16 },
188
250
  supports: ["quality", "count"]
189
251
  },
@@ -205,9 +267,20 @@ var IMAGE_MODELS = [
205
267
  adapter: "openai-image",
206
268
  providerModelId: "gpt-image-2.5-flare",
207
269
  lifecycle: "active",
270
+ exposure: "internal",
208
271
  constraints: {
272
+ exactSizes: {
273
+ "1:1": "1024x1024",
274
+ "3:2": "1536x1024",
275
+ "2:3": "1024x1536",
276
+ "16:9": "2048x1152",
277
+ "9:16": "1152x2048",
278
+ "4:5": "1024x1280",
279
+ "5:4": "1280x1024"
280
+ },
209
281
  aspectRatios: ["1:1", "3:2", "2:3", "16:9", "9:16", "4:5", "5:4", "adaptive"],
210
282
  sizes: ["1K", "2K", "4K"],
283
+ qualityOptions: ["auto", "low", "medium", "high"],
211
284
  references: { images: 16 },
212
285
  supports: ["quality", "count"]
213
286
  },
@@ -223,12 +296,13 @@ var IMAGE_MODELS = [
223
296
  {
224
297
  // Cowork allows 7 ratios; trigger-workflows allows 9 (adds 3:2, 9:21, drops 4:5/5:4).
225
298
  id: "muse-image-1.0",
226
- aliases: [],
299
+ aliases: ["meta-muse"],
227
300
  label: "Meta Muse",
228
301
  type: "image",
229
302
  adapter: "fal",
230
303
  providerModelId: "muse-image-1.0",
231
304
  lifecycle: "active",
305
+ exposure: "catalog",
232
306
  constraints: {
233
307
  aspectRatios: [
234
308
  "21:9",
@@ -249,7 +323,7 @@ var IMAGE_MODELS = [
249
323
  supports: ["count", "outputFormat"]
250
324
  },
251
325
  defaults: { size: "1K", aspectRatio: "1:1", outputFormat: "png", count: 1 },
252
- usage: { ...IMAGE_USAGE },
326
+ usage: { ...IMAGE_USAGE, slug: "muse" },
253
327
  pricingKind: "image_size",
254
328
  display: {
255
329
  provider: "meta",
@@ -266,6 +340,7 @@ var IMAGE_MODELS = [
266
340
  adapter: "ark",
267
341
  providerModelId: "dola-seedream-5-0-pro-260628",
268
342
  lifecycle: "active",
343
+ exposure: "catalog",
269
344
  constraints: {
270
345
  aspectRatios: ["1:1", "4:3", "3:4", "16:9", "9:16", "3:2", "2:3", "21:9", "4:5", "5:4"],
271
346
  sizes: ["1K", "2K"],
@@ -291,6 +366,7 @@ var IMAGE_MODELS = [
291
366
  adapter: "ark",
292
367
  providerModelId: "seedream-4-5-251128",
293
368
  lifecycle: "active",
369
+ exposure: "internal",
294
370
  constraints: {
295
371
  // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and
296
372
  // omits the ratio instead. Advertise only sizes the adapter can send.
@@ -328,6 +404,7 @@ var IMAGE_MODELS = [
328
404
  adapter: "prodia",
329
405
  providerModelId: "flux-2-pro",
330
406
  lifecycle: "active",
407
+ exposure: "catalog",
331
408
  constraints: {
332
409
  aspectRatios: ["1:1", "2:3", "3:2", "16:9", "9:16", "4:3", "3:4", "4:5", "5:4", "21:9"],
333
410
  sizes: ["1K"],
@@ -354,6 +431,7 @@ var IMAGE_MODELS = [
354
431
  adapter: "prodia",
355
432
  providerModelId: "inference.gemini-3-pro.img2img.v1",
356
433
  lifecycle: "active",
434
+ exposure: "internal",
357
435
  constraints: {
358
436
  aspectRatios: ["1:1", "2:3", "3:2", "4:3", "3:4", "4:5", "5:4", "9:16", "16:9", "21:9"],
359
437
  sizes: ["1K", "2K", "4K"],
@@ -379,6 +457,7 @@ var IMAGE_MODELS = [
379
457
  adapter: "prodia",
380
458
  providerModelId: "inference.nano-banana.img2img.v2",
381
459
  lifecycle: "active",
460
+ exposure: "internal",
382
461
  constraints: {
383
462
  aspectRatios: ["1:1", "2:3", "3:4", "4:3", "9:16", "16:9", "21:9"],
384
463
  sizes: ["1K"],
@@ -405,6 +484,7 @@ var IMAGE_MODELS = [
405
484
  adapter: "replicate",
406
485
  providerModelId: "wan-video/wan-2.7-image-pro",
407
486
  lifecycle: "active",
487
+ exposure: "internal",
408
488
  constraints: {
409
489
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4"],
410
490
  sizes: ["1K", "2K", "4K"],
@@ -431,6 +511,7 @@ var IMAGE_MODELS = [
431
511
  adapter: "replicate",
432
512
  providerModelId: "qwen/qwen-image-2-pro",
433
513
  lifecycle: "active",
514
+ exposure: "internal",
434
515
  constraints: {
435
516
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"],
436
517
  sizes: [],
@@ -458,6 +539,7 @@ var IMAGE_MODELS = [
458
539
  adapter: "replicate",
459
540
  providerModelId: "qwen-edit-apps/qwen-image-edit-plus-lora-skin",
460
541
  lifecycle: "active",
542
+ exposure: "internal",
461
543
  constraints: {
462
544
  aspectRatios: ["1:1", "16:9", "9:16", "4:3", "3:4"],
463
545
  sizes: [],
@@ -486,6 +568,7 @@ var OTHER_MODELS = [
486
568
  adapter: "google-genai",
487
569
  providerModelId: "lyria-3-clip-preview",
488
570
  lifecycle: "active",
571
+ exposure: "catalog",
489
572
  constraints: {
490
573
  durations: [30],
491
574
  references: { images: 10 },
@@ -497,7 +580,8 @@ var OTHER_MODELS = [
497
580
  display: {
498
581
  provider: "google",
499
582
  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."
500
- }
583
+ },
584
+ capabilities: {}
501
585
  },
502
586
  {
503
587
  id: "lyria-3-pro-preview",
@@ -507,6 +591,7 @@ var OTHER_MODELS = [
507
591
  adapter: "google-genai",
508
592
  providerModelId: "lyria-3-pro-preview",
509
593
  lifecycle: "active",
594
+ exposure: "catalog",
510
595
  constraints: {
511
596
  references: { images: 10 },
512
597
  supports: []
@@ -517,7 +602,8 @@ var OTHER_MODELS = [
517
602
  display: {
518
603
  provider: "google",
519
604
  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."
520
- }
605
+ },
606
+ capabilities: {}
521
607
  },
522
608
  {
523
609
  id: "google/lyria-2",
@@ -527,6 +613,7 @@ var OTHER_MODELS = [
527
613
  adapter: "replicate",
528
614
  providerModelId: "google/lyria-2",
529
615
  lifecycle: "active",
616
+ exposure: "internal",
530
617
  constraints: {
531
618
  durations: [30],
532
619
  supports: ["seed", "negativePrompt"]
@@ -537,7 +624,8 @@ var OTHER_MODELS = [
537
624
  display: {
538
625
  provider: "google",
539
626
  description: "Lyria 2 music generation on Replicate; produces 30 seconds of 48 kHz stereo audio from a text prompt."
540
- }
627
+ },
628
+ capabilities: {}
541
629
  },
542
630
  {
543
631
  id: "mmaudio",
@@ -547,6 +635,7 @@ var OTHER_MODELS = [
547
635
  adapter: "replicate",
548
636
  providerModelId: "zsxkib/mmaudio:62871fb59889b2d7c13777f08deb3b36bdff88f7e1d53a50ad7694548a41b484",
549
637
  lifecycle: "active",
638
+ exposure: "catalog",
550
639
  constraints: {
551
640
  durations: { min: 1, max: 30 },
552
641
  requires: ["sourceVideo"],
@@ -558,7 +647,8 @@ var OTHER_MODELS = [
558
647
  display: {
559
648
  provider: "mmaudio",
560
649
  description: "MMAudio V2 video-to-audio model on Replicate; takes a source video and prompt and synthesizes synchronized environmental, action, and speech-like audio."
561
- }
650
+ },
651
+ capabilities: {}
562
652
  },
563
653
  {
564
654
  id: "elevenlabs-music",
@@ -568,6 +658,7 @@ var OTHER_MODELS = [
568
658
  adapter: "replicate",
569
659
  providerModelId: "elevenlabs/music",
570
660
  lifecycle: "active",
661
+ exposure: "internal",
571
662
  constraints: {
572
663
  durations: { min: 5, max: 300 },
573
664
  supports: ["instrumental"]
@@ -579,7 +670,8 @@ var OTHER_MODELS = [
579
670
  display: {
580
671
  provider: "elevenlabs",
581
672
  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."
582
- }
673
+ },
674
+ capabilities: {}
583
675
  },
584
676
  {
585
677
  id: "topaz",
@@ -589,6 +681,7 @@ var OTHER_MODELS = [
589
681
  adapter: "replicate",
590
682
  providerModelId: "topazlabs/image-upscale",
591
683
  lifecycle: "active",
684
+ exposure: "catalog",
592
685
  constraints: {
593
686
  references: { images: 1 },
594
687
  requires: ["references"],
@@ -611,6 +704,7 @@ var OTHER_MODELS = [
611
704
  adapter: "prodia",
612
705
  providerModelId: "inference.remove-background.v1",
613
706
  lifecycle: "active",
707
+ exposure: "catalog",
614
708
  constraints: {
615
709
  references: { images: 1 },
616
710
  requires: ["references"],
@@ -638,6 +732,7 @@ function text(id, label, providerModelId, extra) {
638
732
  adapter: "ai-sdk-text",
639
733
  providerModelId,
640
734
  lifecycle: "active",
735
+ exposure: "internal",
641
736
  constraints: { supports: [] },
642
737
  defaults: {},
643
738
  usage: { ...TEXT_USAGE },
@@ -645,39 +740,57 @@ function text(id, label, providerModelId, extra) {
645
740
  ...extra
646
741
  };
647
742
  }
743
+ var ANTHROPIC_THINKING = {
744
+ anthropic: { thinking: { type: "enabled", budgetTokens: 4e3 }, sendReasoning: true }
745
+ };
746
+ var ANTHROPIC_ADAPTIVE = {
747
+ anthropic: { thinking: { type: "adaptive", display: "summarized" }, sendReasoning: true }
748
+ };
749
+ var OPENAI_REASONING = { openai: { reasoningEffort: "medium", reasoningSummary: "auto" } };
750
+ var DEEPSEEK_THINKING = { deepseek: { thinking: { type: "enabled" } } };
648
751
  var TEXT_MODELS = [
649
752
  text("gpt-4o", "GPT-4o", "gpt-4o", {
753
+ exposure: "internal",
650
754
  display: {
651
755
  provider: "openai",
756
+ costTier: 2,
652
757
  description: "OpenAI GPT-4o flagship multimodal model; text and image input, 128K-token context."
653
758
  },
654
759
  capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128e3 }
655
760
  }),
656
761
  text("gpt-4o-mini", "GPT-4o mini", "gpt-4o-mini", {
762
+ exposure: "internal",
657
763
  display: {
658
764
  provider: "openai",
765
+ costTier: 1,
659
766
  description: "OpenAI GPT-4o mini fast, low-cost multimodal model; text and image input, 128K-token context."
660
767
  },
661
768
  capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128e3 }
662
769
  }),
663
770
  text("gpt-5.1", "GPT-5.1", "gpt-5.1", {
771
+ exposure: "catalog",
664
772
  display: {
665
773
  provider: "openai",
774
+ costTier: 3,
666
775
  description: "OpenAI GPT-5.1 reasoning model for coding and agentic tasks; text and image input, 400K-token context."
667
776
  },
668
777
  capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
669
778
  }),
670
779
  text("gpt-5.2", "GPT-5.2", "gpt-5.2", {
780
+ exposure: "catalog",
671
781
  display: {
672
782
  provider: "openai",
783
+ costTier: 3,
673
784
  description: "OpenAI GPT-5.2 reasoning model for complex professional work; text and image input, 400K-token context."
674
785
  },
675
786
  capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
676
787
  }),
677
788
  // 1.05M-token context: https://platform.openai.com/docs/models/gpt-5.4
678
789
  text("gpt-5.4", "GPT-5.4", "gpt-5.4", {
790
+ exposure: "internal",
679
791
  display: {
680
792
  provider: "openai",
793
+ costTier: 3,
681
794
  description: "OpenAI GPT-5.4 flagship reasoning model; text and image input, 1.05M-token context."
682
795
  },
683
796
  capabilities: {
@@ -689,16 +802,20 @@ var TEXT_MODELS = [
689
802
  }),
690
803
  // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.
691
804
  text("gpt-5.4-mini", "GPT-5.4 mini", "gpt-5.4-mini", {
805
+ exposure: "catalog",
692
806
  aliases: ["gpt-5.1-mini", "gpt-5.2-mini"],
693
807
  display: {
694
808
  provider: "openai",
809
+ costTier: 1,
695
810
  description: "OpenAI GPT-5.4 mini efficient reasoning model for high-volume workloads; text and image input, 400K-token context."
696
811
  },
697
812
  capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 4e5 }
698
813
  }),
699
814
  text("gpt-5.5", "GPT-5.5", "gpt-5.5", {
815
+ exposure: "catalog",
700
816
  display: {
701
817
  provider: "openai",
818
+ costTier: 3,
702
819
  description: "OpenAI GPT-5.5 flagship reasoning model for the most complex professional and coding work; text and image input, 1.05M-token context."
703
820
  },
704
821
  capabilities: {
@@ -709,11 +826,15 @@ var TEXT_MODELS = [
709
826
  }
710
827
  }),
711
828
  text("gpt-5.6-luna", "GPT-5.6 Luna", "gpt-5.6-luna", {
829
+ providerOptions: OPENAI_REASONING,
830
+ exposure: "catalog",
712
831
  display: {
713
832
  provider: "openai",
833
+ costTier: 1,
714
834
  description: "OpenAI GPT-5.6 Luna cost-optimized tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
715
835
  },
716
836
  capabilities: {
837
+ reasoning: true,
717
838
  vision: true,
718
839
  tools: true,
719
840
  structuredOutput: true,
@@ -721,11 +842,15 @@ var TEXT_MODELS = [
721
842
  }
722
843
  }),
723
844
  text("gpt-5.6-terra", "GPT-5.6 Terra", "gpt-5.6-terra", {
845
+ providerOptions: OPENAI_REASONING,
846
+ exposure: "catalog",
724
847
  display: {
725
848
  provider: "openai",
849
+ costTier: 2,
726
850
  description: "OpenAI GPT-5.6 Terra balanced tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
727
851
  },
728
852
  capabilities: {
853
+ reasoning: true,
729
854
  vision: true,
730
855
  tools: true,
731
856
  structuredOutput: true,
@@ -733,11 +858,15 @@ var TEXT_MODELS = [
733
858
  }
734
859
  }),
735
860
  text("gpt-5.6-sol", "GPT-5.6 Sol", "gpt-5.6-sol", {
861
+ providerOptions: OPENAI_REASONING,
862
+ exposure: "catalog",
736
863
  display: {
737
864
  provider: "openai",
865
+ costTier: 3,
738
866
  description: "OpenAI GPT-5.6 Sol flagship tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context."
739
867
  },
740
868
  capabilities: {
869
+ reasoning: true,
741
870
  vision: true,
742
871
  tools: true,
743
872
  structuredOutput: true,
@@ -746,15 +875,19 @@ var TEXT_MODELS = [
746
875
  }),
747
876
  // Library key "claude-sonnet-4.5" maps to the SDK id "claude-sonnet-4-5".
748
877
  text("claude-sonnet-4-5", "Claude Sonnet 4.5", "claude-sonnet-4-5", {
878
+ exposure: "internal",
749
879
  aliases: ["claude-sonnet-4.5", "claude-sonnet-4-5-20250929"],
750
880
  display: {
751
881
  provider: "anthropic",
882
+ costTier: 2,
752
883
  description: "Anthropic Claude Sonnet 4.5 (legacy) balanced model; text and image input, 200K-token context."
753
884
  },
754
885
  capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 2e5 }
755
886
  }),
756
887
  // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.
757
888
  text("claude-sonnet-4-6", "Claude Sonnet 4.6", "claude-sonnet-4-6", {
889
+ providerOptions: ANTHROPIC_THINKING,
890
+ exposure: "catalog",
758
891
  aliases: [
759
892
  "claude-sonnet-4.6",
760
893
  "claude-sonnet-4",
@@ -763,9 +896,11 @@ var TEXT_MODELS = [
763
896
  ],
764
897
  display: {
765
898
  provider: "anthropic",
899
+ costTier: 2,
766
900
  description: "Anthropic Claude Sonnet 4.6 (legacy) balanced model; text and image input, 1M-token context."
767
901
  },
768
902
  capabilities: {
903
+ reasoning: true,
769
904
  vision: true,
770
905
  tools: true,
771
906
  structuredOutput: true,
@@ -773,11 +908,15 @@ var TEXT_MODELS = [
773
908
  }
774
909
  }),
775
910
  text("claude-sonnet-5", "Claude Sonnet 5", "claude-sonnet-5", {
911
+ providerOptions: ANTHROPIC_ADAPTIVE,
912
+ exposure: "catalog",
776
913
  display: {
777
914
  provider: "anthropic",
915
+ costTier: 3,
778
916
  description: "Anthropic Claude Sonnet 5 current balanced model; text and image input, 1M-token context."
779
917
  },
780
918
  capabilities: {
919
+ reasoning: true,
781
920
  vision: true,
782
921
  tools: true,
783
922
  structuredOutput: true,
@@ -785,12 +924,16 @@ var TEXT_MODELS = [
785
924
  }
786
925
  }),
787
926
  text("claude-opus-4-8", "Claude Opus 4.8", "claude-opus-4-8", {
927
+ providerOptions: ANTHROPIC_ADAPTIVE,
928
+ exposure: "catalog",
788
929
  aliases: ["claude-opus-4.8", "claude-opus-4", "claude-opus-4.0", "claude-opus-4-20250514"],
789
930
  display: {
790
931
  provider: "anthropic",
932
+ costTier: 3,
791
933
  description: "Anthropic Claude Opus 4.8 (legacy) frontier model; text and image input, 1M-token context."
792
934
  },
793
935
  capabilities: {
936
+ reasoning: true,
794
937
  vision: true,
795
938
  tools: true,
796
939
  structuredOutput: true,
@@ -798,17 +941,28 @@ var TEXT_MODELS = [
798
941
  }
799
942
  }),
800
943
  text("claude-haiku-4-5", "Claude Haiku 4.5", "claude-haiku-4-5", {
944
+ providerOptions: ANTHROPIC_THINKING,
945
+ exposure: "catalog",
801
946
  aliases: ["claude-haiku-4.5", "claude-haiku-4-5-20251001", "claude-haiku-4"],
802
947
  display: {
803
948
  provider: "anthropic",
949
+ costTier: 1,
804
950
  description: "Anthropic Claude Haiku 4.5 fast model with near-frontier intelligence; text and image input, 200K-token context."
805
951
  },
806
- capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 2e5 }
952
+ capabilities: {
953
+ reasoning: true,
954
+ vision: true,
955
+ tools: true,
956
+ structuredOutput: true,
957
+ contextWindow: 2e5
958
+ }
807
959
  }),
808
960
  text("claude-opus-5", "Claude Opus 5", "claude-opus-5", {
961
+ exposure: "internal",
809
962
  aliases: ["claude-opus-5.0"],
810
963
  display: {
811
964
  provider: "anthropic",
965
+ costTier: 3,
812
966
  description: "Anthropic Claude Opus 5 current frontier model for agentic coding and enterprise work; text and image input, 1M-token context."
813
967
  },
814
968
  capabilities: {
@@ -819,8 +973,10 @@ var TEXT_MODELS = [
819
973
  }
820
974
  }),
821
975
  text("claude-fable-5", "Claude Fable 5", "claude-fable-5", {
976
+ exposure: "internal",
822
977
  display: {
823
978
  provider: "anthropic",
979
+ costTier: 3,
824
980
  description: "Anthropic Claude Fable 5 (legacy) model for demanding reasoning and long-horizon agentic work; text and image input, 1M-token context."
825
981
  },
826
982
  capabilities: {
@@ -831,8 +987,10 @@ var TEXT_MODELS = [
831
987
  }
832
988
  }),
833
989
  text("gemini-2.5-flash", "Gemini 2.5 Flash", "gemini-2.5-flash", {
990
+ exposure: "internal",
834
991
  display: {
835
992
  provider: "google",
993
+ costTier: 1,
836
994
  description: "Google Gemini 2.5 Flash low-latency multimodal model for high-volume reasoning over text, images, video, and audio; 1M-token context."
837
995
  },
838
996
  capabilities: {
@@ -843,8 +1001,10 @@ var TEXT_MODELS = [
843
1001
  }
844
1002
  }),
845
1003
  text("gemini-2.5-pro", "Gemini 2.5 Pro", "gemini-2.5-pro", {
1004
+ exposure: "internal",
846
1005
  display: {
847
1006
  provider: "google",
1007
+ costTier: 2,
848
1008
  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."
849
1009
  },
850
1010
  capabilities: {
@@ -855,8 +1015,10 @@ var TEXT_MODELS = [
855
1015
  }
856
1016
  }),
857
1017
  text("gemini-3.1-pro-preview", "Gemini 3.1 Pro (preview)", "gemini-3.1-pro-preview", {
1018
+ exposure: "catalog",
858
1019
  display: {
859
1020
  provider: "google",
1021
+ costTier: 2,
860
1022
  description: "Google Gemini 3.1 Pro preview reasoning model for software engineering, tool use, and reliable agentic workflows; 1M-token context."
861
1023
  },
862
1024
  capabilities: {
@@ -867,8 +1029,10 @@ var TEXT_MODELS = [
867
1029
  }
868
1030
  }),
869
1031
  text("gemini-3.5-flash", "Gemini 3.5 Flash", "gemini-3.5-flash", {
1032
+ exposure: "catalog",
870
1033
  display: {
871
1034
  provider: "google",
1035
+ costTier: 1,
872
1036
  description: "Google Gemini 3.5 Flash high-throughput model for frontier-level agentic tasks; text, image, video, audio, and PDF input, 1M-token context."
873
1037
  },
874
1038
  capabilities: {
@@ -879,8 +1043,10 @@ var TEXT_MODELS = [
879
1043
  }
880
1044
  }),
881
1045
  text("gemini-3.6-flash", "Gemini 3.6 Flash", "gemini-3.6-flash", {
1046
+ exposure: "catalog",
882
1047
  display: {
883
1048
  provider: "google",
1049
+ costTier: 1,
884
1050
  description: "Google Gemini 3.6 Flash general-purpose multimodal agentic model balancing speed and capability; 1M-token context."
885
1051
  },
886
1052
  capabilities: {
@@ -891,8 +1057,11 @@ var TEXT_MODELS = [
891
1057
  }
892
1058
  }),
893
1059
  text("gemini-3.7-flash", "Gemini 3.7 Flash", "gemini-3.7-flash", {
1060
+ exposure: "catalog",
894
1061
  display: {
895
1062
  provider: "google",
1063
+ costTier: 1,
1064
+ recommended: true,
896
1065
  description: "Google Gemini 3.7 Flash natively multimodal reasoning model for coding, agentic workflows, and multi-step execution; 1M-token context."
897
1066
  },
898
1067
  capabilities: {
@@ -903,8 +1072,10 @@ var TEXT_MODELS = [
903
1072
  }
904
1073
  }),
905
1074
  text("gemini-3.8-flash", "Gemini 3.8 Flash", "gemini-3.8-flash", {
1075
+ exposure: "internal",
906
1076
  display: {
907
1077
  provider: "google",
1078
+ costTier: 1,
908
1079
  description: "Google Gemini 3.8 Flash frontier model for long-horizon software engineering, autonomous agents, and enterprise workflows; 1M-token context."
909
1080
  },
910
1081
  capabilities: {
@@ -916,12 +1087,15 @@ var TEXT_MODELS = [
916
1087
  }),
917
1088
  // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.
918
1089
  text("gemini-3-flash-preview", "Gemini 3 Flash (preview)", "gemini-3-flash-preview", {
1090
+ exposure: "internal",
919
1091
  lifecycle: "deprecated",
920
1092
  replacedBy: "gemini-3.6-flash"
921
1093
  }),
922
1094
  text("gemini-3.1-flash-lite", "Gemini 3.1 Flash Lite", "gemini-3.1-flash-lite", {
1095
+ exposure: "internal",
923
1096
  display: {
924
1097
  provider: "google",
1098
+ costTier: 1,
925
1099
  description: "Google Gemini 3.1 Flash-Lite low-latency multimodal model for high-volume agentic, translation, and data-extraction tasks; 1M-token context."
926
1100
  },
927
1101
  capabilities: {
@@ -932,8 +1106,10 @@ var TEXT_MODELS = [
932
1106
  }
933
1107
  }),
934
1108
  text("sonar", "Sonar", "sonar", {
1109
+ exposure: "internal",
935
1110
  display: {
936
1111
  provider: "perplexity",
1112
+ costTier: 1,
937
1113
  description: "Perplexity Sonar lightweight web-grounded search model returning cited answers; 128K-token context."
938
1114
  },
939
1115
  capabilities: {
@@ -944,8 +1120,10 @@ var TEXT_MODELS = [
944
1120
  }
945
1121
  }),
946
1122
  text("sonar-pro", "Sonar Pro", "sonar-pro", {
1123
+ exposure: "internal",
947
1124
  display: {
948
1125
  provider: "perplexity",
1126
+ costTier: 2,
949
1127
  description: "Perplexity Sonar Pro advanced web-grounded search model for complex multi-step queries; 200K-token context."
950
1128
  },
951
1129
  capabilities: {
@@ -956,8 +1134,10 @@ var TEXT_MODELS = [
956
1134
  }
957
1135
  }),
958
1136
  text("sonar-reasoning-pro", "Sonar Reasoning Pro", "sonar-reasoning-pro", {
1137
+ exposure: "internal",
959
1138
  display: {
960
1139
  provider: "perplexity",
1140
+ costTier: 2,
961
1141
  description: "Perplexity Sonar Reasoning Pro chain-of-thought web-grounded search model for complex problem-solving; 128K-token context."
962
1142
  },
963
1143
  capabilities: {
@@ -967,12 +1147,21 @@ var TEXT_MODELS = [
967
1147
  contextWindow: 128e3
968
1148
  }
969
1149
  }),
970
- text("deepseek-v4-flash", "DeepSeek V4 Flash", "deepseek-v4-flash", {
1150
+ // DeepSeek retired V4 Flash upstream and routes the old id to V4.1 Flash at
1151
+ // Flash rates (https://api-docs.deepseek.com/news/news260910/); the old id
1152
+ // stays an alias so stored selections keep resolving.
1153
+ text("deepseek-flash", "DeepSeek V4.1 Flash", "deepseek-flash", {
1154
+ providerOptions: DEEPSEEK_THINKING,
1155
+ aliases: ["deepseek-v4-flash"],
1156
+ exposure: "catalog",
971
1157
  display: {
972
1158
  provider: "deepseek",
973
- description: "DeepSeek V4 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens."
1159
+ costTier: 1,
1160
+ recommended: true,
1161
+ description: "DeepSeek V4.1 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens."
974
1162
  },
975
1163
  capabilities: {
1164
+ reasoning: true,
976
1165
  vision: true,
977
1166
  tools: true,
978
1167
  structuredOutput: true,
@@ -980,11 +1169,15 @@ var TEXT_MODELS = [
980
1169
  }
981
1170
  }),
982
1171
  text("deepseek-v4-pro", "DeepSeek V4 Pro", "deepseek-v4-pro", {
1172
+ providerOptions: DEEPSEEK_THINKING,
1173
+ exposure: "catalog",
983
1174
  display: {
984
1175
  provider: "deepseek",
1176
+ costTier: 2,
985
1177
  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."
986
1178
  },
987
1179
  capabilities: {
1180
+ reasoning: true,
988
1181
  vision: false,
989
1182
  tools: true,
990
1183
  structuredOutput: true,
@@ -993,8 +1186,10 @@ var TEXT_MODELS = [
993
1186
  }),
994
1187
  // 1M-token context: https://docs.x.ai/docs/models/grok-4.3
995
1188
  text("grok-4.3", "Grok 4.3", "grok-4.3", {
1189
+ exposure: "catalog",
996
1190
  display: {
997
1191
  provider: "xai",
1192
+ costTier: 2,
998
1193
  description: "xAI Grok 4.3 reasoning model with tool calling and structured outputs; text and image input, 1M-token context."
999
1194
  },
1000
1195
  capabilities: {
@@ -1006,18 +1201,25 @@ var TEXT_MODELS = [
1006
1201
  }),
1007
1202
  // Moonshot retired kimi-k2.5 on 2026-08-31 and no longer publishes its specs.
1008
1203
  text("kimi-k2.5", "Kimi K2.5", "kimi-k2.5", {
1204
+ defaults: { temperature: 1 },
1205
+ exposure: "catalog",
1009
1206
  display: {
1010
1207
  provider: "moonshot",
1208
+ costTier: 2,
1011
1209
  description: "Moonshot Kimi K2.5; the provider retired the model on 2026-08-31 and calls now return a model-not-found error."
1012
1210
  },
1013
1211
  capabilities: {}
1014
1212
  }),
1015
1213
  text("kimi-k3", "Kimi K3", "kimi-k3", {
1214
+ defaults: { temperature: 1 },
1215
+ exposure: "catalog",
1016
1216
  display: {
1017
1217
  provider: "moonshot",
1218
+ costTier: 2,
1018
1219
  description: "Moonshot Kimi K3 flagship model with native visual understanding and always-on thinking; text, image, and video input, 1M-token context."
1019
1220
  },
1020
1221
  capabilities: {
1222
+ reasoning: true,
1021
1223
  vision: true,
1022
1224
  tools: true,
1023
1225
  structuredOutput: true,
@@ -1027,9 +1229,11 @@ var TEXT_MODELS = [
1027
1229
  // Cowork calls the provider "MiniMax-M3"; the pricing key is lowercase.
1028
1230
  // 1M-token context: https://platform.minimax.io/docs/api-reference/text-openai-api
1029
1231
  text("minimax-m3", "MiniMax M3", "MiniMax-M3", {
1232
+ exposure: "catalog",
1030
1233
  aliases: ["MiniMax-M3"],
1031
1234
  display: {
1032
1235
  provider: "minimax",
1236
+ costTier: 2,
1033
1237
  description: "MiniMax M3 frontier multimodal model for agentic reasoning, tool use, and coding; text, image, and video input, 1M-token context."
1034
1238
  },
1035
1239
  capabilities: { vision: true, tools: true, contextWindow: 1e6 }
@@ -1061,6 +1265,7 @@ var VIDEO_MODELS = [
1061
1265
  adapter: "google-genai",
1062
1266
  providerModelId: "veo-3.1-generate-preview",
1063
1267
  lifecycle: "active",
1268
+ exposure: "catalog",
1064
1269
  constraints: {
1065
1270
  aspectRatios: [...OMNI_RATIOS],
1066
1271
  resolutions: ["720p", "1080p", "4k"],
@@ -1069,7 +1274,7 @@ var VIDEO_MODELS = [
1069
1274
  supports: ["lastFrame"]
1070
1275
  },
1071
1276
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
1072
- usage: { ...VIDEO_USAGE },
1277
+ usage: { ...VIDEO_USAGE, slug: "veo" },
1073
1278
  pricingKind: "video_per_second",
1074
1279
  display: {
1075
1280
  provider: "google",
@@ -1090,6 +1295,7 @@ var VIDEO_MODELS = [
1090
1295
  adapter: "google-genai",
1091
1296
  providerModelId: "veo-3.1-fast-generate-preview",
1092
1297
  lifecycle: "active",
1298
+ exposure: "internal",
1093
1299
  constraints: {
1094
1300
  aspectRatios: [...OMNI_RATIOS],
1095
1301
  resolutions: ["720p", "1080p", "4k"],
@@ -1118,9 +1324,10 @@ var VIDEO_MODELS = [
1118
1324
  adapter: "google-genai",
1119
1325
  providerModelId: "veo-3.1-lite-generate-preview",
1120
1326
  lifecycle: "active",
1327
+ exposure: "internal",
1121
1328
  constraints: {
1122
1329
  aspectRatios: [...OMNI_RATIOS],
1123
- resolutions: ["720p", "1080p", "4k"],
1330
+ resolutions: ["720p", "1080p"],
1124
1331
  durations: [4, 8],
1125
1332
  references: { images: 3 },
1126
1333
  supports: ["lastFrame"]
@@ -1148,6 +1355,7 @@ var VIDEO_MODELS = [
1148
1355
  adapter: "google-genai",
1149
1356
  providerModelId: "gemini-omni-flash-preview",
1150
1357
  lifecycle: "active",
1358
+ exposure: "catalog",
1151
1359
  constraints: {
1152
1360
  // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter
1153
1361
  // sends ratio and duration only when the caller set them, so a
@@ -1158,7 +1366,7 @@ var VIDEO_MODELS = [
1158
1366
  supports: []
1159
1367
  },
1160
1368
  defaults: {},
1161
- usage: { ...VIDEO_USAGE },
1369
+ usage: { ...VIDEO_USAGE, slug: "gemini_omni" },
1162
1370
  pricingKind: "video_per_second",
1163
1371
  display: {
1164
1372
  provider: "google",
@@ -1175,6 +1383,7 @@ var VIDEO_MODELS = [
1175
1383
  adapter: "google-genai",
1176
1384
  providerModelId: "gemini-omni-1.1-flash",
1177
1385
  lifecycle: "active",
1386
+ exposure: "catalog",
1178
1387
  constraints: {
1179
1388
  aspectRatios: [...OMNI_RATIOS],
1180
1389
  resolutions: ["360p", "720p", "1080p", "4k"],
@@ -1200,10 +1409,12 @@ var VIDEO_MODELS = [
1200
1409
  adapter: "ark",
1201
1410
  providerModelId: "dreamina-seedance-2-0-260128",
1202
1411
  lifecycle: "active",
1412
+ exposure: "catalog",
1203
1413
  constraints: {
1204
1414
  aspectRatios: [...SEEDANCE_RATIOS],
1205
1415
  resolutions: ["480p", "720p", "1080p", "4k"],
1206
1416
  durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1417
+ durationPresets: [4, 6, 8, 10, 12, 15],
1207
1418
  references: { images: 9, videos: 3, audios: 3, audioOnly: false },
1208
1419
  ratioIgnoredWith: ["firstFrame"],
1209
1420
  supports: ["generateAudio", "seed", "lastFrame", "watermark"]
@@ -1214,7 +1425,7 @@ var VIDEO_MODELS = [
1214
1425
  aspectRatio: "16:9",
1215
1426
  generateAudio: true
1216
1427
  },
1217
- usage: { ...VIDEO_USAGE },
1428
+ usage: { ...VIDEO_USAGE, slug: "seedance2", providerLabel: "byteplus" },
1218
1429
  pricingKind: "video_per_second",
1219
1430
  display: {
1220
1431
  provider: "bytedance",
@@ -1231,6 +1442,7 @@ var VIDEO_MODELS = [
1231
1442
  adapter: "ark",
1232
1443
  providerModelId: "dreamina-seedance-2-0-fast-260128",
1233
1444
  lifecycle: "active",
1445
+ exposure: "catalog",
1234
1446
  constraints: {
1235
1447
  aspectRatios: [...SEEDANCE_RATIOS],
1236
1448
  resolutions: ["480p", "720p"],
@@ -1262,6 +1474,7 @@ var VIDEO_MODELS = [
1262
1474
  adapter: "ark",
1263
1475
  providerModelId: "dreamina-seedance-2-5-260628",
1264
1476
  lifecycle: "active",
1477
+ exposure: "catalog",
1265
1478
  constraints: {
1266
1479
  aspectRatios: [...SEEDANCE_RATIOS],
1267
1480
  resolutions: ["480p", "720p", "1080p"],
@@ -1293,10 +1506,12 @@ var VIDEO_MODELS = [
1293
1506
  adapter: "xai-video",
1294
1507
  providerModelId: "grok-imagine-video",
1295
1508
  lifecycle: "active",
1509
+ exposure: "catalog",
1296
1510
  constraints: {
1297
1511
  aspectRatios: [...GROK_RATIOS],
1298
1512
  resolutions: ["480p", "720p"],
1299
1513
  durations: { min: 1, max: 15 },
1514
+ durationPresets: [4, 6, 8, 10],
1300
1515
  references: { images: 7 },
1301
1516
  supports: []
1302
1517
  },
@@ -1319,6 +1534,7 @@ var VIDEO_MODELS = [
1319
1534
  adapter: "higgsfield",
1320
1535
  providerModelId: "kling-video/v2.5-turbo/pro/image-to-video",
1321
1536
  lifecycle: "active",
1537
+ exposure: "catalog",
1322
1538
  constraints: {
1323
1539
  aspectRatios: [...KLING_RATIOS],
1324
1540
  durations: [5, 10],
@@ -1331,7 +1547,7 @@ var VIDEO_MODELS = [
1331
1547
  cfgScale: 0.5,
1332
1548
  negativePrompt: NEGATIVE_PROMPT
1333
1549
  },
1334
- usage: { ...VIDEO_USAGE },
1550
+ usage: { ...VIDEO_USAGE, slug: "grok" },
1335
1551
  pricingKind: "video_per_second",
1336
1552
  display: {
1337
1553
  provider: "kuaishou",
@@ -1348,6 +1564,7 @@ var VIDEO_MODELS = [
1348
1564
  adapter: "higgsfield",
1349
1565
  providerModelId: "kling-video/v3.0/pro/image-to-video",
1350
1566
  lifecycle: "active",
1567
+ exposure: "catalog",
1351
1568
  constraints: {
1352
1569
  aspectRatios: [...KLING_RATIOS],
1353
1570
  durations: { min: 3, max: 15 },
@@ -1377,6 +1594,7 @@ var VIDEO_MODELS = [
1377
1594
  adapter: "replicate",
1378
1595
  providerModelId: "kwaivgi/kling-v3-omni-video",
1379
1596
  lifecycle: "active",
1597
+ exposure: "catalog",
1380
1598
  constraints: {
1381
1599
  aspectRatios: [
1382
1600
  "1:1",
@@ -1412,6 +1630,7 @@ var VIDEO_MODELS = [
1412
1630
  adapter: "fal",
1413
1631
  providerModelId: "minimax/h3",
1414
1632
  lifecycle: "active",
1633
+ exposure: "catalog",
1415
1634
  constraints: {
1416
1635
  aspectRatios: [...H3_RATIOS],
1417
1636
  resolutions: ["480p", "768p", "2k", "4k"],
@@ -1440,6 +1659,7 @@ var VIDEO_MODELS = [
1440
1659
  adapter: "fal",
1441
1660
  providerModelId: "minimax/h3-max",
1442
1661
  lifecycle: "active",
1662
+ exposure: "catalog",
1443
1663
  constraints: {
1444
1664
  aspectRatios: [...H3_RATIOS],
1445
1665
  resolutions: ["480p", "768p"],
@@ -1468,6 +1688,7 @@ var VIDEO_MODELS = [
1468
1688
  adapter: "fal",
1469
1689
  providerModelId: "minimax/h3/reference-to-video",
1470
1690
  lifecycle: "active",
1691
+ exposure: "catalog",
1471
1692
  constraints: {
1472
1693
  aspectRatios: [...H3_REFERENCE_RATIOS],
1473
1694
  resolutions: ["480p", "768p", "2k", "4k"],
@@ -1497,6 +1718,7 @@ var VIDEO_MODELS = [
1497
1718
  adapter: "fal",
1498
1719
  providerModelId: "minimax/h3-max/reference-to-video",
1499
1720
  lifecycle: "active",
1721
+ exposure: "catalog",
1500
1722
  constraints: {
1501
1723
  aspectRatios: [...H3_REFERENCE_RATIOS],
1502
1724
  resolutions: ["480p", "768p"],
@@ -1527,6 +1749,7 @@ var VIDEO_MODELS = [
1527
1749
  adapter: "fal",
1528
1750
  providerModelId: "fal-ai/kling-video/o1/video-to-video/reference",
1529
1751
  lifecycle: "active",
1752
+ exposure: "internal",
1530
1753
  constraints: {
1531
1754
  aspectRatios: [...KLING_RATIOS],
1532
1755
  durations: { min: 3, max: 10 },
@@ -1550,6 +1773,7 @@ var VIDEO_MODELS = [
1550
1773
  adapter: "replicate",
1551
1774
  providerModelId: "minimax/hailuo-02",
1552
1775
  lifecycle: "active",
1776
+ exposure: "internal",
1553
1777
  constraints: {
1554
1778
  resolutions: ["768p"],
1555
1779
  durations: [6, 10],
@@ -1572,6 +1796,7 @@ var VIDEO_MODELS = [
1572
1796
  adapter: "higgsfield",
1573
1797
  providerModelId: "dop-preview",
1574
1798
  lifecycle: "active",
1799
+ exposure: "internal",
1575
1800
  constraints: {
1576
1801
  requires: ["firstFrame"],
1577
1802
  supports: ["seed", "lastFrame"]
@@ -1773,6 +1998,40 @@ function resolveVideoOptions(model, request, onUnsupported = "error") {
1773
1998
  model: model.id
1774
1999
  });
1775
2000
  }
2001
+ if (merged.sourceVideo !== void 0 && !model.capabilities?.acceptsSourceVideo) {
2002
+ if (onUnsupported === "error") {
2003
+ throw new ModelKitError({
2004
+ code: "unsupported_option",
2005
+ message: `${model.id} does not take a source video`,
2006
+ model: model.id
2007
+ });
2008
+ }
2009
+ warnings.push({
2010
+ code: "option_ignored",
2011
+ field: "sourceVideo",
2012
+ message: `${model.id} does not take a source video; dropped`
2013
+ });
2014
+ delete merged.sourceVideo;
2015
+ }
2016
+ const hasFrames = merged.firstFrame !== void 0 || merged.lastFrame !== void 0;
2017
+ const hasRefs = compact(merged.referenceImages).length + compact(merged.referenceVideos).length + compact(merged.referenceAudios).length > 0;
2018
+ if (hasFrames && hasRefs && model.capabilities?.framesExcludeReferences) {
2019
+ if (onUnsupported === "error") {
2020
+ throw new ModelKitError({
2021
+ code: "unsupported_option",
2022
+ message: `${model.id} takes frames or references, not both`,
2023
+ model: model.id
2024
+ });
2025
+ }
2026
+ warnings.push({
2027
+ code: "option_ignored",
2028
+ field: "referenceImages",
2029
+ message: `${model.id} takes frames or references, not both; references dropped`
2030
+ });
2031
+ delete merged.referenceImages;
2032
+ delete merged.referenceVideos;
2033
+ delete merged.referenceAudios;
2034
+ }
1776
2035
  for (const input of c.ratioIgnoredWith ?? []) {
1777
2036
  if (merged[input] !== void 0 && merged.aspectRatio !== void 0) {
1778
2037
  if (request.aspectRatio !== void 0) {
@@ -2169,6 +2428,7 @@ function passthroughTextModel(model) {
2169
2428
  adapter: "ai-sdk-text",
2170
2429
  providerModelId: model.modelId,
2171
2430
  lifecycle: "active",
2431
+ exposure: "internal",
2172
2432
  constraints: {},
2173
2433
  defaults: {},
2174
2434
  usage: { unit: "tokens", modality: "TEXT" },