@shop-os/modelkit 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -133,7 +133,7 @@ type Lifecycle = "active" | "deprecated" | "retired";
133
133
  type Surface = "cowork" | "space_builder";
134
134
  /** @deprecated use Surface[] */
135
135
  type Exposure = Surface[];
136
- type AdapterId = "ai-sdk-text" | "google-image" | "openai-image" | "google-genai" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "xai-video";
136
+ type AdapterId = "ai-sdk-text" | "google-image" | "openai-image" | "google-genai" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "xai-video" | "luma";
137
137
  /** Gemini image safety threshold, per category, sent only when the caller opts in. */
138
138
  type ImageSafetySetting = {
139
139
  category: string;
@@ -901,7 +901,7 @@ interface UsageEvent {
901
901
  latencyMs?: number;
902
902
  raw?: unknown;
903
903
  }
904
- type ProviderKeyName = "openai" | "anthropic" | "google" | "xai" | "perplexity" | "deepseek" | "moonshot" | "minimax" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "cloudflare";
904
+ type ProviderKeyName = "openai" | "anthropic" | "google" | "xai" | "perplexity" | "deepseek" | "moonshot" | "minimax" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "luma" | "cloudflare";
905
905
  type ProviderKeys = Partial<Record<ProviderKeyName, string>> & {
906
906
  /** Higgsfield needs the pair; both switch together. */
907
907
  higgsfieldSecret?: string;
@@ -950,6 +950,8 @@ interface Routing {
950
950
  interface AdapterEndpoints {
951
951
  /** Ark (Seedream images, Seedance videos). Defaults to the BytePlus ap-southeast endpoint. */
952
952
  ark?: string;
953
+ /** Luma Agents API. Defaults to https://agents.lumalabs.ai. */
954
+ luma?: string;
953
955
  }
954
956
  interface ModelKitConfig {
955
957
  keys: {
@@ -1024,7 +1026,7 @@ declare function isListed(row: CatalogModel): boolean;
1024
1026
  */
1025
1027
  declare const MODELS: CatalogModel[];
1026
1028
 
1027
- declare const ADAPTER_IDS: readonly ["ai-sdk-text", "google-image", "openai-image", "google-genai", "ark", "fal", "replicate", "prodia", "higgsfield", "xai-video"];
1029
+ declare const ADAPTER_IDS: readonly ["ai-sdk-text", "google-image", "openai-image", "google-genai", "ark", "fal", "replicate", "prodia", "higgsfield", "xai-video", "luma"];
1028
1030
  declare const SurfaceSchema: z.ZodEnum<{
1029
1031
  cowork: "cowork";
1030
1032
  space_builder: "space_builder";
@@ -1072,6 +1074,7 @@ declare const CatalogModelSchemaBase: z.ZodObject<{
1072
1074
  prodia: "prodia";
1073
1075
  higgsfield: "higgsfield";
1074
1076
  "xai-video": "xai-video";
1077
+ luma: "luma";
1075
1078
  }>;
1076
1079
  providerModelId: z.ZodString;
1077
1080
  lifecycle: z.ZodEnum<{
package/dist/catalog.d.ts CHANGED
@@ -133,7 +133,7 @@ type Lifecycle = "active" | "deprecated" | "retired";
133
133
  type Surface = "cowork" | "space_builder";
134
134
  /** @deprecated use Surface[] */
135
135
  type Exposure = Surface[];
136
- type AdapterId = "ai-sdk-text" | "google-image" | "openai-image" | "google-genai" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "xai-video";
136
+ type AdapterId = "ai-sdk-text" | "google-image" | "openai-image" | "google-genai" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "xai-video" | "luma";
137
137
  /** Gemini image safety threshold, per category, sent only when the caller opts in. */
138
138
  type ImageSafetySetting = {
139
139
  category: string;
@@ -901,7 +901,7 @@ interface UsageEvent {
901
901
  latencyMs?: number;
902
902
  raw?: unknown;
903
903
  }
904
- type ProviderKeyName = "openai" | "anthropic" | "google" | "xai" | "perplexity" | "deepseek" | "moonshot" | "minimax" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "cloudflare";
904
+ type ProviderKeyName = "openai" | "anthropic" | "google" | "xai" | "perplexity" | "deepseek" | "moonshot" | "minimax" | "ark" | "fal" | "replicate" | "prodia" | "higgsfield" | "luma" | "cloudflare";
905
905
  type ProviderKeys = Partial<Record<ProviderKeyName, string>> & {
906
906
  /** Higgsfield needs the pair; both switch together. */
907
907
  higgsfieldSecret?: string;
@@ -950,6 +950,8 @@ interface Routing {
950
950
  interface AdapterEndpoints {
951
951
  /** Ark (Seedream images, Seedance videos). Defaults to the BytePlus ap-southeast endpoint. */
952
952
  ark?: string;
953
+ /** Luma Agents API. Defaults to https://agents.lumalabs.ai. */
954
+ luma?: string;
953
955
  }
954
956
  interface ModelKitConfig {
955
957
  keys: {
@@ -1024,7 +1026,7 @@ declare function isListed(row: CatalogModel): boolean;
1024
1026
  */
1025
1027
  declare const MODELS: CatalogModel[];
1026
1028
 
1027
- declare const ADAPTER_IDS: readonly ["ai-sdk-text", "google-image", "openai-image", "google-genai", "ark", "fal", "replicate", "prodia", "higgsfield", "xai-video"];
1029
+ declare const ADAPTER_IDS: readonly ["ai-sdk-text", "google-image", "openai-image", "google-genai", "ark", "fal", "replicate", "prodia", "higgsfield", "xai-video", "luma"];
1028
1030
  declare const SurfaceSchema: z.ZodEnum<{
1029
1031
  cowork: "cowork";
1030
1032
  space_builder: "space_builder";
@@ -1072,6 +1074,7 @@ declare const CatalogModelSchemaBase: z.ZodObject<{
1072
1074
  prodia: "prodia";
1073
1075
  higgsfield: "higgsfield";
1074
1076
  "xai-video": "xai-video";
1077
+ luma: "luma";
1075
1078
  }>;
1076
1079
  providerModelId: z.ZodString;
1077
1080
  lifecycle: z.ZodEnum<{
package/dist/catalog.js CHANGED
@@ -364,8 +364,59 @@ var FAL_IMAGE_MODELS = [
364
364
  }
365
365
  ];
366
366
 
367
- // src/catalog/image.ts
367
+ // src/catalog/image-luma.ts
368
368
  var IMAGE_USAGE2 = { unit: "images" };
369
+ var EXPOSURE2 = ["cowork", "space_builder"];
370
+ var LOBE2 = "https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light";
371
+ var LUMA_LOGO = `${LOBE2}/luma-color.png`;
372
+ var UNI_RATIOS = ["adaptive", "16:9", "3:2", "1:1", "2:3", "9:16"];
373
+ function uniImage(id, label, providerModelId, description) {
374
+ return {
375
+ // https://docs.agents.lumalabs.ai: type "image" without references, else
376
+ // "image_edit" with the first reference as source and up to 8 more as
377
+ // image_ref. The output is always 2048 px on the long side.
378
+ id,
379
+ aliases: [],
380
+ label,
381
+ type: "image",
382
+ adapter: "luma",
383
+ providerModelId,
384
+ lifecycle: "active",
385
+ exposure: EXPOSURE2,
386
+ constraints: {
387
+ aspectRatios: [...UNI_RATIOS],
388
+ sizes: ["2K"],
389
+ references: { images: 9 },
390
+ supports: ["outputFormat"],
391
+ prompt: { referenceSyntax: "numbered", maxChars: 6e3 }
392
+ },
393
+ defaults: { size: "2K", aspectRatio: "adaptive" },
394
+ usage: { ...IMAGE_USAGE2 },
395
+ pricingKind: "image_size",
396
+ display: {
397
+ provider: "luma",
398
+ description,
399
+ logo: LUMA_LOGO
400
+ }
401
+ };
402
+ }
403
+ var LUMA_IMAGE_MODELS = [
404
+ uniImage(
405
+ "uni-1",
406
+ "Uni-1",
407
+ "uni-1",
408
+ "Luma Uni-1 fast image generation and editing; takes a prompt and up to 9 reference images and outputs 2K."
409
+ ),
410
+ uniImage(
411
+ "uni-1-max",
412
+ "Uni-1 Max",
413
+ "uni-1-max",
414
+ "Luma Uni-1 Max higher-quality image generation and editing; takes a prompt and up to 9 reference images and outputs 2K."
415
+ )
416
+ ];
417
+
418
+ // src/catalog/image.ts
419
+ var IMAGE_USAGE3 = { unit: "images" };
369
420
  var GEMINI_RATIOS = [
370
421
  "1:1",
371
422
  "2:3",
@@ -410,7 +461,7 @@ function geminiImage(id, label, aliases, sizes, display, exposure, references, p
410
461
  exposure,
411
462
  constraints,
412
463
  defaults: { size: "1K", aspectRatio: "1:1" },
413
- usage: { ...IMAGE_USAGE2, slug: "gemini" },
464
+ usage: { ...IMAGE_USAGE3, slug: "gemini" },
414
465
  pricingKind: "image_size",
415
466
  display
416
467
  };
@@ -523,7 +574,7 @@ var IMAGE_MODELS = [
523
574
  prompt: GPT_IMAGE_PROMPT
524
575
  },
525
576
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
526
- usage: { ...IMAGE_USAGE2, slug: "gpt" },
577
+ usage: { ...IMAGE_USAGE3, slug: "gpt" },
527
578
  pricingKind: "image_size",
528
579
  display: {
529
580
  provider: "openai",
@@ -559,7 +610,7 @@ var IMAGE_MODELS = [
559
610
  prompt: GPT_IMAGE_PROMPT
560
611
  },
561
612
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
562
- usage: { ...IMAGE_USAGE2 },
613
+ usage: { ...IMAGE_USAGE3 },
563
614
  pricingKind: "image_size",
564
615
  display: {
565
616
  provider: "openai",
@@ -594,7 +645,7 @@ var IMAGE_MODELS = [
594
645
  prompt: GPT_IMAGE_PROMPT
595
646
  },
596
647
  defaults: { size: "1K", aspectRatio: "adaptive", quality: "auto" },
597
- usage: { ...IMAGE_USAGE2 },
648
+ usage: { ...IMAGE_USAGE3 },
598
649
  pricingKind: "image_size",
599
650
  display: {
600
651
  provider: "openai",
@@ -629,7 +680,7 @@ var IMAGE_MODELS = [
629
680
  supports: ["count", "outputFormat"]
630
681
  },
631
682
  defaults: { size: "1K", aspectRatio: "1:1", outputFormat: "png", count: 1 },
632
- usage: { ...IMAGE_USAGE2, slug: "muse" },
683
+ usage: { ...IMAGE_USAGE3, slug: "muse" },
633
684
  pricingKind: "image_size",
634
685
  display: {
635
686
  provider: "meta",
@@ -656,7 +707,7 @@ var IMAGE_MODELS = [
656
707
  supports: ["quality", "count", "seed"]
657
708
  },
658
709
  defaults: { size: "2K", aspectRatio: "1:1", quality: "medium", count: 1 },
659
- usage: { ...IMAGE_USAGE2, slug: "ideogram" },
710
+ usage: { ...IMAGE_USAGE3, slug: "ideogram" },
660
711
  pricingKind: "image_size",
661
712
  display: {
662
713
  provider: "ideogram",
@@ -681,7 +732,7 @@ var IMAGE_MODELS = [
681
732
  supports: ["seed", "outputFormat"]
682
733
  },
683
734
  defaults: { size: "1K", aspectRatio: "1:1" },
684
- usage: { ...IMAGE_USAGE2 },
735
+ usage: { ...IMAGE_USAGE3 },
685
736
  pricingKind: "image_size",
686
737
  display: {
687
738
  provider: "bytedance",
@@ -719,7 +770,7 @@ var IMAGE_MODELS = [
719
770
  supports: ["seed"]
720
771
  },
721
772
  defaults: { size: "1K", aspectRatio: "1:1" },
722
- usage: { ...IMAGE_USAGE2 },
773
+ usage: { ...IMAGE_USAGE3 },
723
774
  pricingKind: "image_size",
724
775
  display: {
725
776
  provider: "bytedance",
@@ -745,7 +796,7 @@ var IMAGE_MODELS = [
745
796
  prompt: { referenceSyntax: "numbered", maxChars: 32768 }
746
797
  },
747
798
  defaults: { size: "1K", aspectRatio: "1:1" },
748
- usage: { ...IMAGE_USAGE2 },
799
+ usage: { ...IMAGE_USAGE3 },
749
800
  pricingKind: "image_size",
750
801
  display: {
751
802
  provider: "black-forest-labs",
@@ -772,7 +823,7 @@ var IMAGE_MODELS = [
772
823
  supports: []
773
824
  },
774
825
  defaults: { size: "1K", aspectRatio: "1:1" },
775
- usage: { ...IMAGE_USAGE2 },
826
+ usage: { ...IMAGE_USAGE3 },
776
827
  pricingKind: "image_size",
777
828
  display: {
778
829
  provider: "google",
@@ -797,7 +848,7 @@ var IMAGE_MODELS = [
797
848
  supports: []
798
849
  },
799
850
  defaults: { size: "1K", aspectRatio: "1:1" },
800
- usage: { ...IMAGE_USAGE2 },
851
+ usage: { ...IMAGE_USAGE3 },
801
852
  pricingKind: "image_size",
802
853
  display: {
803
854
  provider: "google",
@@ -883,7 +934,8 @@ var IMAGE_MODELS = [
883
934
  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."
884
935
  }
885
936
  },
886
- ...FAL_IMAGE_MODELS
937
+ ...FAL_IMAGE_MODELS,
938
+ ...LUMA_IMAGE_MODELS
887
939
  ];
888
940
 
889
941
  // src/catalog/audio-formats.ts
@@ -1079,7 +1131,7 @@ var VEED_SUBTITLE_LANGUAGES = [
1079
1131
  ];
1080
1132
 
1081
1133
  // src/catalog/canvas-tools.ts
1082
- var EXPOSURE2 = ["cowork", "space_builder"];
1134
+ var EXPOSURE3 = ["cowork", "space_builder"];
1083
1135
  var META_LOGO = "https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png";
1084
1136
  var VEED_SUBTITLE_PRESETS = [
1085
1137
  "simple",
@@ -1121,7 +1173,7 @@ var SAM_3_IMAGE = {
1121
1173
  adapter: "fal",
1122
1174
  providerModelId: "fal-ai/sam-3/image",
1123
1175
  lifecycle: "active",
1124
- exposure: EXPOSURE2,
1176
+ exposure: EXPOSURE3,
1125
1177
  constraints: {
1126
1178
  references: { images: 1 },
1127
1179
  requires: ["references"],
@@ -1144,7 +1196,7 @@ var VEED_SUBTITLES = {
1144
1196
  adapter: "fal",
1145
1197
  providerModelId: "veed/subtitles",
1146
1198
  lifecycle: "active",
1147
- exposure: EXPOSURE2,
1199
+ exposure: EXPOSURE3,
1148
1200
  constraints: {
1149
1201
  supports: [],
1150
1202
  // fal: up to 2 hours at 1080p or below, 1 hour above.
@@ -3249,7 +3301,7 @@ var GOOGLE_LOGO = "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a
3249
3301
  var MINIMAX_LOGO = "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png";
3250
3302
  var SYNC_LOGO = "https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/sync.png";
3251
3303
  var PER_CALL = { unit: "images" };
3252
- var EXPOSURE3 = ["cowork", "space_builder"];
3304
+ var EXPOSURE4 = ["cowork", "space_builder"];
3253
3305
  var LIPSYNC_AUDIO = { audioSeconds: { max: 30 } };
3254
3306
  function elevenLabsTts(tts) {
3255
3307
  return {
@@ -3260,7 +3312,7 @@ function elevenLabsTts(tts) {
3260
3312
  adapter: "fal",
3261
3313
  providerModelId: tts.providerModelId,
3262
3314
  lifecycle: "active",
3263
- exposure: EXPOSURE3,
3315
+ exposure: EXPOSURE4,
3264
3316
  constraints: {
3265
3317
  voices: ELEVENLABS_VOICES,
3266
3318
  languages: tts.languages,
@@ -3285,7 +3337,7 @@ function geminiTts(id, label, description) {
3285
3337
  adapter: "fal",
3286
3338
  providerModelId,
3287
3339
  lifecycle: "active",
3288
- exposure: EXPOSURE3,
3340
+ exposure: EXPOSURE4,
3289
3341
  constraints: {
3290
3342
  voices: GEMINI_TTS_VOICES,
3291
3343
  supports: ["style"],
@@ -3308,7 +3360,7 @@ function syncLipsync(id, label, providerModelId, syncModel, description) {
3308
3360
  adapter: "fal",
3309
3361
  providerModelId,
3310
3362
  lifecycle: "active",
3311
- exposure: EXPOSURE3,
3363
+ exposure: EXPOSURE4,
3312
3364
  constraints: {
3313
3365
  requires: ["sourceVideo", "sourceAudio"],
3314
3366
  references: LIPSYNC_AUDIO,
@@ -3369,7 +3421,7 @@ var MEDIA_NODE_MODELS = [
3369
3421
  adapter: "fal",
3370
3422
  providerModelId: "fal-ai/minimax/speech-2.8-hd",
3371
3423
  lifecycle: "active",
3372
- exposure: EXPOSURE3,
3424
+ exposure: EXPOSURE4,
3373
3425
  constraints: {
3374
3426
  voices: MINIMAX_VOICES,
3375
3427
  languages: MINIMAX_SPEECH_LANGUAGES,
@@ -3394,7 +3446,7 @@ var MEDIA_NODE_MODELS = [
3394
3446
  adapter: "fal",
3395
3447
  providerModelId: "fal-ai/elevenlabs/voice-changer",
3396
3448
  lifecycle: "active",
3397
- exposure: EXPOSURE3,
3449
+ exposure: EXPOSURE4,
3398
3450
  constraints: {
3399
3451
  requires: ["sourceAudio"],
3400
3452
  // The flat price assumes at most a minute of speech.
@@ -3421,7 +3473,7 @@ var MEDIA_NODE_MODELS = [
3421
3473
  adapter: "fal",
3422
3474
  providerModelId: "fal-ai/elevenlabs/dubbing",
3423
3475
  lifecycle: "active",
3424
- exposure: EXPOSURE3,
3476
+ exposure: EXPOSURE4,
3425
3477
  constraints: {
3426
3478
  requiresOneOf: ["sourceVideo", "sourceAudio"],
3427
3479
  // The flat price covers 60 s of source.
@@ -3469,7 +3521,7 @@ var MEDIA_NODE_MODELS = [
3469
3521
  adapter: "fal",
3470
3522
  providerModelId: "veed/lipsync/v2",
3471
3523
  lifecycle: "active",
3472
- exposure: EXPOSURE3,
3524
+ exposure: EXPOSURE4,
3473
3525
  constraints: {
3474
3526
  requires: ["sourceVideo", "sourceAudio"],
3475
3527
  references: LIPSYNC_AUDIO,
@@ -3495,7 +3547,7 @@ var MEDIA_NODE_MODELS = [
3495
3547
  adapter: "fal",
3496
3548
  providerModelId: "minimax/h3-max/lip-sync/image-to-video",
3497
3549
  lifecycle: "active",
3498
- exposure: EXPOSURE3,
3550
+ exposure: EXPOSURE4,
3499
3551
  constraints: {
3500
3552
  requires: ["firstFrame", "sourceAudio"],
3501
3553
  resolutions: ["480p", "768p", "1080p", "2k"],
@@ -3521,7 +3573,7 @@ var MEDIA_NODE_MODELS = [
3521
3573
  adapter: "fal",
3522
3574
  providerModelId: "fal-ai/elevenlabs/speech-to-text/scribe-v2",
3523
3575
  lifecycle: "active",
3524
- exposure: EXPOSURE3,
3576
+ exposure: EXPOSURE4,
3525
3577
  constraints: {
3526
3578
  requires: ["sourceAudio"],
3527
3579
  // The flat price covers 10 minutes of audio.
@@ -5057,8 +5109,113 @@ var VIDEO_FAMILY_MODELS = [
5057
5109
  }
5058
5110
  ];
5059
5111
 
5060
- // src/catalog/video.ts
5112
+ // src/catalog/video-luma.ts
5061
5113
  var VIDEO_USAGE2 = { unit: "seconds" };
5114
+ var EXPOSURE5 = ["cowork", "space_builder"];
5115
+ var LUMA_LOGO2 = "https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/luma-color.png";
5116
+ var RAY_RATIOS = ["9:16", "3:4", "1:1", "4:3", "16:9", "21:9"];
5117
+ var RAY_RESOLUTIONS = ["360p", "720p", "1080p"];
5118
+ var RAY_PROMPT = { referenceSyntax: "numbered", maxChars: 6e3 };
5119
+ var LUMA_VIDEO_MODELS = [
5120
+ {
5121
+ // https://docs.agents.lumalabs.ai: type "video" with a fixed 5 s duration;
5122
+ // firstFrame and lastFrame ride as start_frame and end_frame.
5123
+ id: "ray-3.2",
5124
+ aliases: [],
5125
+ label: "Ray 3.2",
5126
+ type: "video",
5127
+ adapter: "luma",
5128
+ providerModelId: "ray-3.2",
5129
+ lifecycle: "active",
5130
+ exposure: EXPOSURE5,
5131
+ constraints: {
5132
+ aspectRatios: ["adaptive", ...RAY_RATIOS],
5133
+ resolutions: [...RAY_RESOLUTIONS],
5134
+ durations: [5],
5135
+ supports: ["lastFrame"],
5136
+ prompt: { ...RAY_PROMPT },
5137
+ audio: "never"
5138
+ },
5139
+ defaults: { durationSeconds: 5, resolution: "720p", aspectRatio: "adaptive" },
5140
+ usage: { ...VIDEO_USAGE2 },
5141
+ pricingKind: "video_per_second",
5142
+ display: {
5143
+ provider: "luma",
5144
+ description: "Luma Ray 3.2 text- and image-to-video with optional first and last frames, 5-second clips at up to 1080p.",
5145
+ logo: LUMA_LOGO2
5146
+ },
5147
+ capabilities: {}
5148
+ },
5149
+ {
5150
+ // https://docs.agents.lumalabs.ai: type "video_edit" with a source video of
5151
+ // up to 18 s; the output keeps the source length, so there is no durations
5152
+ // knob, no aspect_ratio and no end frame. Luma bills its 5 s price for any
5153
+ // source (live, 2026-10-21) and the row is priced per source second, so a
5154
+ // source under 5 s is refused: it would be billed below Luma's charge.
5155
+ id: "ray-3.2-edit",
5156
+ aliases: [],
5157
+ label: "Ray 3.2 Edit",
5158
+ type: "video",
5159
+ adapter: "luma",
5160
+ providerModelId: "ray-3.2",
5161
+ lifecycle: "active",
5162
+ exposure: EXPOSURE5,
5163
+ constraints: {
5164
+ resolutions: [...RAY_RESOLUTIONS],
5165
+ requires: ["sourceVideo"],
5166
+ sourceVideoSeconds: { min: 5, max: 18 },
5167
+ supports: [],
5168
+ prompt: { ...RAY_PROMPT },
5169
+ audio: "never"
5170
+ },
5171
+ defaults: { resolution: "720p" },
5172
+ usage: { ...VIDEO_USAGE2 },
5173
+ pricingKind: "video_per_second",
5174
+ display: {
5175
+ provider: "luma",
5176
+ description: "Luma Ray 3.2 video edit: changes a 5-18 second clip from a prompt, keeping its length.",
5177
+ logo: LUMA_LOGO2
5178
+ },
5179
+ capabilities: { acceptsSourceVideo: true, videoEdit: true }
5180
+ },
5181
+ {
5182
+ // https://docs.agents.lumalabs.ai: type "video_reframe" with a required
5183
+ // target aspect_ratio; the source is up to 10 s and the output keeps its
5184
+ // length whatever video.duration says, while Luma bills that duration
5185
+ // (live, 2026-10-21). So there is no durations knob, and a source under
5186
+ // 5 s is refused, as on ray-3.2-edit. 1080p is not offered for the
5187
+ // vertical targets 9:16 and 3:4.
5188
+ id: "ray-3.2-reframe",
5189
+ aliases: [],
5190
+ label: "Ray 3.2 Reframe",
5191
+ type: "video",
5192
+ adapter: "luma",
5193
+ providerModelId: "ray-3.2",
5194
+ lifecycle: "active",
5195
+ exposure: EXPOSURE5,
5196
+ constraints: {
5197
+ aspectRatios: [...RAY_RATIOS],
5198
+ resolutions: [...RAY_RESOLUTIONS],
5199
+ requires: ["sourceVideo"],
5200
+ sourceVideoSeconds: { min: 5, max: 10 },
5201
+ supports: [],
5202
+ prompt: { ...RAY_PROMPT },
5203
+ audio: "never"
5204
+ },
5205
+ defaults: { resolution: "720p", aspectRatio: "16:9" },
5206
+ usage: { ...VIDEO_USAGE2 },
5207
+ pricingKind: "video_per_second",
5208
+ display: {
5209
+ provider: "luma",
5210
+ description: "Luma Ray 3.2 Reframe: changes a 5-10 second clip to a new aspect ratio and fills the new area from the prompt.",
5211
+ logo: LUMA_LOGO2
5212
+ },
5213
+ capabilities: { acceptsSourceVideo: true, videoEdit: true }
5214
+ }
5215
+ ];
5216
+
5217
+ // src/catalog/video.ts
5218
+ var VIDEO_USAGE3 = { unit: "seconds" };
5062
5219
  var SEEDANCE_RATIOS = ["21:9", "16:9", "4:3", "1:1", "3:4", "9:16", "adaptive"];
5063
5220
  var KLING_RATIOS2 = ["16:9", "9:16", "1:1", "adaptive"];
5064
5221
  var KLING_OMNI_RATIOS = ["16:9", "9:16", "1:1"];
@@ -5111,7 +5268,7 @@ var VIDEO_MODELS = [
5111
5268
  audio: "always"
5112
5269
  },
5113
5270
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
5114
- usage: { ...VIDEO_USAGE2, slug: "veo" },
5271
+ usage: { ...VIDEO_USAGE3, slug: "veo" },
5115
5272
  pricingKind: "video_per_second",
5116
5273
  display: {
5117
5274
  provider: "google",
@@ -5144,7 +5301,7 @@ var VIDEO_MODELS = [
5144
5301
  audio: "always"
5145
5302
  },
5146
5303
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
5147
- usage: { ...VIDEO_USAGE2 },
5304
+ usage: { ...VIDEO_USAGE3 },
5148
5305
  pricingKind: "video_per_second",
5149
5306
  display: {
5150
5307
  provider: "google",
@@ -5174,7 +5331,7 @@ var VIDEO_MODELS = [
5174
5331
  audio: "always"
5175
5332
  },
5176
5333
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
5177
- usage: { ...VIDEO_USAGE2 },
5334
+ usage: { ...VIDEO_USAGE3 },
5178
5335
  pricingKind: "video_per_second",
5179
5336
  display: {
5180
5337
  provider: "google",
@@ -5211,7 +5368,7 @@ var VIDEO_MODELS = [
5211
5368
  audio: "always"
5212
5369
  },
5213
5370
  defaults: {},
5214
- usage: { ...VIDEO_USAGE2, slug: "gemini_omni" },
5371
+ usage: { ...VIDEO_USAGE3, slug: "gemini_omni" },
5215
5372
  pricingKind: "video_per_second",
5216
5373
  display: {
5217
5374
  provider: "google",
@@ -5248,7 +5405,7 @@ var VIDEO_MODELS = [
5248
5405
  audio: "always"
5249
5406
  },
5250
5407
  defaults: {},
5251
- usage: { ...VIDEO_USAGE2 },
5408
+ usage: { ...VIDEO_USAGE3 },
5252
5409
  pricingKind: "video_per_second",
5253
5410
  display: {
5254
5411
  provider: "google",
@@ -5297,7 +5454,7 @@ var VIDEO_MODELS = [
5297
5454
  aspectRatio: "16:9",
5298
5455
  generateAudio: true
5299
5456
  },
5300
- usage: { ...VIDEO_USAGE2, slug: "seedance2", providerLabel: "byteplus" },
5457
+ usage: { ...VIDEO_USAGE3, slug: "seedance2", providerLabel: "byteplus" },
5301
5458
  pricingKind: "video_per_second",
5302
5459
  display: {
5303
5460
  provider: "bytedance",
@@ -5340,7 +5497,7 @@ var VIDEO_MODELS = [
5340
5497
  aspectRatio: "16:9",
5341
5498
  generateAudio: true
5342
5499
  },
5343
- usage: { ...VIDEO_USAGE2 },
5500
+ usage: { ...VIDEO_USAGE3 },
5344
5501
  pricingKind: "video_per_second",
5345
5502
  display: {
5346
5503
  provider: "bytedance",
@@ -5390,7 +5547,7 @@ var VIDEO_MODELS = [
5390
5547
  aspectRatio: "16:9",
5391
5548
  generateAudio: true
5392
5549
  },
5393
- usage: { ...VIDEO_USAGE2 },
5550
+ usage: { ...VIDEO_USAGE3 },
5394
5551
  pricingKind: "video_per_second",
5395
5552
  display: {
5396
5553
  provider: "bytedance",
@@ -5452,7 +5609,7 @@ var VIDEO_MODELS = [
5452
5609
  cfgScale: 0.5,
5453
5610
  negativePrompt: NEGATIVE_PROMPT
5454
5611
  },
5455
- usage: { ...VIDEO_USAGE2 },
5612
+ usage: { ...VIDEO_USAGE3 },
5456
5613
  pricingKind: "video_per_second",
5457
5614
  display: {
5458
5615
  provider: "kuaishou",
@@ -5484,7 +5641,7 @@ var VIDEO_MODELS = [
5484
5641
  cfgScale: 0.5,
5485
5642
  generateAudio: true
5486
5643
  },
5487
- usage: { ...VIDEO_USAGE2 },
5644
+ usage: { ...VIDEO_USAGE3 },
5488
5645
  pricingKind: "video_per_second",
5489
5646
  display: {
5490
5647
  provider: "kuaishou",
@@ -5552,7 +5709,7 @@ var VIDEO_MODELS = [
5552
5709
  aspectRatio: "16:9",
5553
5710
  promptExpansion: "balanced"
5554
5711
  },
5555
- usage: { ...VIDEO_USAGE2 },
5712
+ usage: { ...VIDEO_USAGE3 },
5556
5713
  pricingKind: "video_per_second",
5557
5714
  display: {
5558
5715
  provider: "minimax",
@@ -5586,7 +5743,7 @@ var VIDEO_MODELS = [
5586
5743
  aspectRatio: "16:9",
5587
5744
  promptExpansion: "balanced"
5588
5745
  },
5589
- usage: { ...VIDEO_USAGE2 },
5746
+ usage: { ...VIDEO_USAGE3 },
5590
5747
  pricingKind: "video_per_second",
5591
5748
  display: {
5592
5749
  provider: "minimax",
@@ -5628,7 +5785,7 @@ var VIDEO_MODELS = [
5628
5785
  aspectRatio: "adaptive",
5629
5786
  promptExpansion: "balanced"
5630
5787
  },
5631
- usage: { ...VIDEO_USAGE2 },
5788
+ usage: { ...VIDEO_USAGE3 },
5632
5789
  pricingKind: "video_per_second",
5633
5790
  display: {
5634
5791
  provider: "minimax",
@@ -5672,7 +5829,7 @@ var VIDEO_MODELS = [
5672
5829
  aspectRatio: "adaptive",
5673
5830
  promptExpansion: "balanced"
5674
5831
  },
5675
- usage: { ...VIDEO_USAGE2 },
5832
+ usage: { ...VIDEO_USAGE3 },
5676
5833
  pricingKind: "video_per_second",
5677
5834
  display: {
5678
5835
  provider: "minimax",
@@ -5717,7 +5874,7 @@ var VIDEO_MODELS = [
5717
5874
  aspectRatio: "adaptive",
5718
5875
  generateAudio: true
5719
5876
  },
5720
- usage: { ...VIDEO_USAGE2 },
5877
+ usage: { ...VIDEO_USAGE3 },
5721
5878
  pricingKind: "video_per_second",
5722
5879
  display: {
5723
5880
  provider: "alibaba",
@@ -5744,7 +5901,7 @@ var VIDEO_MODELS = [
5744
5901
  audio: "never"
5745
5902
  },
5746
5903
  defaults: { durationSeconds: 5, aspectRatio: "16:9" },
5747
- usage: { ...VIDEO_USAGE2 },
5904
+ usage: { ...VIDEO_USAGE3 },
5748
5905
  pricingKind: "video_per_second",
5749
5906
  display: {
5750
5907
  provider: "kuaishou",
@@ -5793,7 +5950,7 @@ var VIDEO_MODELS = [
5793
5950
  audio: "never"
5794
5951
  },
5795
5952
  defaults: {},
5796
- usage: { ...VIDEO_USAGE2 },
5953
+ usage: { ...VIDEO_USAGE3 },
5797
5954
  // Higgsfield bills DoP per generation: a fixed-length clip with no duration knob.
5798
5955
  pricingKind: "flat",
5799
5956
  display: {
@@ -5802,7 +5959,8 @@ var VIDEO_MODELS = [
5802
5959
  },
5803
5960
  capabilities: {}
5804
5961
  },
5805
- ...VIDEO_FAMILY_MODELS
5962
+ ...VIDEO_FAMILY_MODELS,
5963
+ ...LUMA_VIDEO_MODELS
5806
5964
  ];
5807
5965
 
5808
5966
  // src/catalog/video-tools.ts
@@ -6782,7 +6940,8 @@ var ADAPTER_IDS = [
6782
6940
  "replicate",
6783
6941
  "prodia",
6784
6942
  "higgsfield",
6785
- "xai-video"
6943
+ "xai-video",
6944
+ "luma"
6786
6945
  ];
6787
6946
  var ModelTypeSchema = z3.enum([
6788
6947
  "text",