@marlinjai/studio-mcp 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -436,17 +436,6 @@ function resolveConfig(env = process.env) {
436
436
  import { z as z8 } from "zod";
437
437
 
438
438
  // ../lumitra-core/dist/models/index.js
439
- var FAL_NANO_BANANA_2_USD_BY_RESOLUTION = {
440
- "0.5K": 0.06,
441
- "1K": 0.08,
442
- "2K": 0.12,
443
- "4K": 0.16
444
- };
445
- var STUDIO3D_USD_PER_CREDIT = 29 / 3500;
446
- function studio3dCreditsToUsd(credits) {
447
- return Math.round(credits * STUDIO3D_USD_PER_CREDIT * 1e3) / 1e3;
448
- }
449
- var FAL_MESHY_RIG_USD = 0.2;
450
439
  var veo = (tier, label) => {
451
440
  const slug2 = tier ? `veo-3-1-${tier}` : "veo-3-1";
452
441
  return {
@@ -488,11 +477,11 @@ var ROUTES = [
488
477
  id: "route/kling-2-5-turbo-pro",
489
478
  label: "Kling 2.5 Turbo Pro (KIE, fal fallback)",
490
479
  primary: "kie/kling-v2-5-turbo-pro-image-to-video",
491
- fallback: { start: "fal/kling-v2-5-image-to-video" },
492
- // fal needs an aspect ratio (16:9, 9:16 or 1:1) and KIE takes none, so a
493
- // fallback would crop a start frame of another shape. The ratio comes from
494
- // the start frame once that is built (decision 7 of the plan).
495
- noFallbackYet: "fal renders Kling 2.5 at a set aspect ratio (16:9, 9:16 or 1:1) and KIE takes none, so a fallback could crop the start frame. Pin the fal Kling 2.5 entry to choose the ratio yourself."
480
+ // fal renders Kling 2.5 at a set aspect ratio (16:9, 9:16 or 1:1) and KIE
481
+ // takes none. The fal attempt gets the allowed ratio nearest the start
482
+ // frame's shape (`aspectFromFrame`, decision 7 of the plan); a frame whose
483
+ // size cannot be read leaves this route without a fallback.
484
+ fallback: { start: "fal/kling-v2-5-image-to-video" }
496
485
  },
497
486
  {
498
487
  kind: "video",
@@ -552,32 +541,33 @@ var MODEL_ROUTES = Object.fromEntries(ROUTES.map((r) => [r.id, r]));
552
541
  function getRoute(modelId) {
553
542
  return modelId ? MODEL_ROUTES[modelId] : void 0;
554
543
  }
555
- var MODEL_CATALOG = [
556
- // LIST PRICES (`listPrice`, pricing plan of 2026-10-10). Every KIE entry
557
- // names where the official list price of its requests is found, because KIE
558
- // is the reseller route that sells below list and the price floor needs the
559
- // figure. The rule: the model owner's own published price where the catalog
560
- // records one (Google's Veo price, billed unchanged by the OpenRouter
561
- // entries; Vertex AI's Imagen 4 Fast price), else the fal entry for the same
562
- // upstream model. `unrecorded` means neither exists in this catalog, and the
563
- // floor then does not apply: Seedream V4, MiniMax H3 and Gemini Omni Flash
564
- // have no fal entry, Kling O3 on KIE does not say whether it is fal's
565
- // Standard or Pro tier, Suno has no per-song list price, and the Claude
566
- // entries bill per token. Entries of every other provider carry no
567
- // reference: their route bills the list price itself.
544
+ function fallbackModels(route) {
545
+ if (route.kind === "image") return [route.fallback];
546
+ if ("byResolution" in route.fallback) return Object.values(route.fallback.byResolution);
547
+ return [route.fallback.start, ...route.fallback.startAndEnd ? [route.fallback.startAndEnd] : []];
548
+ }
549
+ var ROLES = (() => {
550
+ const roles = /* @__PURE__ */ new Map();
551
+ for (const route of ROUTES) {
552
+ roles.set(route.primary, { role: "primary", route });
553
+ for (const model of fallbackModels(route)) {
554
+ if (!roles.has(model)) roles.set(model, { role: "fallback", route });
555
+ }
556
+ }
557
+ return roles;
558
+ })();
559
+ function routeRoleOf(modelId) {
560
+ return modelId ? ROLES.get(modelId) : void 0;
561
+ }
562
+ var CATALOG_ENTRIES = [
568
563
  // ── 3D AI Studio: 3D generation ────────────────────────────────────────
569
- // `credits` is what the model's DEFAULT request bills (the options its
570
- // builder sends when a node sets none), priced by providers/studio3d/
571
- // pricing.ts; catalog.spec pins every entry to that rule. A job with other
572
- // options records its own price at completion.
573
564
  {
574
565
  id: "studio3d/tripo-3-1-text-to-3d",
575
566
  provider: "studio3d",
576
567
  modality: "3d",
577
568
  task: "text-to-3d",
578
569
  label: "Tripo 3.1 (text-to-3D)",
579
- description: "Cheapest text-to-3D path on 3D AI Studio. Good for fast iteration.",
580
- cost: { credits: 40, usd: studio3dCreditsToUsd(40) },
570
+ description: "The lightest text-to-3D path on 3D AI Studio. Good for fast iteration.",
581
571
  capabilities: { supportsTextures: true, supportsPbr: true },
582
572
  isDefault: true
583
573
  },
@@ -587,7 +577,6 @@ var MODEL_CATALOG = [
587
577
  modality: "3d",
588
578
  task: "image-to-3d",
589
579
  label: "Tripo 3.1 (image-to-3D)",
590
- cost: { credits: 60, usd: studio3dCreditsToUsd(60) },
591
580
  capabilities: { needsImageInput: true, supportsTextures: true, supportsPbr: true }
592
581
  },
593
582
  {
@@ -596,8 +585,7 @@ var MODEL_CATALOG = [
596
585
  modality: "3d",
597
586
  task: "text-to-3d",
598
587
  label: "Hunyuan 3.1 Rapid",
599
- description: "Tencent Hunyuan3D, rapid edition. Mid-quality, mid-cost.",
600
- cost: { credits: 35, usd: studio3dCreditsToUsd(35) },
588
+ description: "Tencent Hunyuan3D, rapid edition. Mid-quality.",
601
589
  capabilities: { supportsTextures: true, supportsPbr: true }
602
590
  },
603
591
  {
@@ -606,8 +594,7 @@ var MODEL_CATALOG = [
606
594
  modality: "3d",
607
595
  task: "text-to-3d",
608
596
  label: "Hunyuan 3.1 Pro",
609
- description: "Tencent Hunyuan3D, pro edition. High quality, PBR materials on by default, about 2.3x Rapid.",
610
- cost: { credits: 80, usd: studio3dCreditsToUsd(80) },
597
+ description: "Tencent Hunyuan3D, pro edition. High quality, PBR materials on by default.",
611
598
  capabilities: { supportsTextures: true, supportsPbr: true, maxOutputDetail: "1.5M polys" }
612
599
  },
613
600
  {
@@ -617,7 +604,6 @@ var MODEL_CATALOG = [
617
604
  task: "image-to-3d",
618
605
  label: "Trellis 2",
619
606
  description: "Microsoft Trellis 2. Best image-to-3D fidelity. Image input only.",
620
- cost: { credits: 30, usd: studio3dCreditsToUsd(30) },
621
607
  capabilities: { needsImageInput: true, supportsTextures: true, supportsPbr: true, maxOutputDetail: "1024" },
622
608
  isDefault: true
623
609
  },
@@ -629,7 +615,6 @@ var MODEL_CATALOG = [
629
615
  task: "remesh",
630
616
  label: "Tripo Remesh",
631
617
  description: "Convert + remesh: target polycount, quad topology, multiple output formats.",
632
- cost: { credits: 10, usd: studio3dCreditsToUsd(10) },
633
618
  isDefault: true
634
619
  },
635
620
  {
@@ -638,43 +623,25 @@ var MODEL_CATALOG = [
638
623
  modality: "3d",
639
624
  task: "texture",
640
625
  label: "Tripo Texture",
641
- cost: { credits: 20, usd: studio3dCreditsToUsd(20) },
642
626
  capabilities: { supportsTextures: true, supportsPbr: true },
643
627
  isDefault: true
644
628
  },
645
- // KIE: image gen. Pricing pulled 2026-05-08 from https://kie.ai/pricing
646
- // (1 credit = $0.005 USD). Indemnification: KIE provides ZERO IP indemnity,
647
- // so reserve these for internal asset work. v0.1 ships as private internal
648
- // infra, so KIE is the v0.1 default; revisit if customer-facing output is
649
- // ever needed.
650
- {
651
- // Verified 2026-05-09 via two consecutive CLI smokes at 1:1, 1K, single
652
- // candidate, default options: KIE billed 8 credits ($0.040) each time.
653
- // Earlier spec estimate was $0.020 (4 credits); replaced with the measured
654
- // value. The 2K and 4K tiers ($0.06, $0.09) come from KIE's price page
655
- // (checked 2026-10-04), the same as the edit entry. The provider's costUsd from creditsConsumed remains the source of
656
- // truth for accounting; this catalog field is UI hints only.
629
+ {
657
630
  id: "kie/nano-banana-2",
658
631
  provider: "kie",
659
632
  modality: "image",
660
633
  task: "text-to-image",
661
634
  label: "Nano Banana 2 (KIE)",
662
- description: "Google Gemini 3.1 Flash Image via KIE. $0.04 at 1K, $0.06 at 2K, $0.09 at 4K. Kept as fallback aggregator path; default flipped to fal/nano-banana-2 in 2026-06-04 fal slice.",
663
- cost: { usd: 0.04, usdByResolution: { "1K": 0.04, "2K": 0.06, "4K": 0.09 } },
664
- listPrice: { source: "fal", model: "fal/nano-banana-2" },
635
+ description: "Google Gemini 3.1 Flash Image via KIE. Kept as fallback aggregator path; default flipped to fal/nano-banana-2 in 2026-06-04 fal slice.",
665
636
  capabilities: { resolutions: ["1K", "2K", "4K"] }
666
637
  },
667
638
  {
668
- // imagen-4-fast price is estimated; KIE docs do not publish a per-image
669
- // USD rate. Read data.creditsConsumed from a real run to verify.
670
639
  id: "kie/imagen-4-fast",
671
640
  provider: "kie",
672
641
  modality: "image",
673
642
  task: "text-to-image",
674
643
  label: "Imagen 4 Fast (KIE)",
675
- description: "Google Imagen 4 Fast via KIE. No price advantage vs Vertex direct. No IP indemnity. Vertex AI lists Imagen 4 Fast at $0.02 per image (2026-09-27), which matches the estimate; the KIE price itself is still unmeasured.",
676
- cost: { usd: 0.02 },
677
- listPrice: { source: "owner", usd: 0.02 },
644
+ description: "Google Imagen 4 Fast via KIE. No IP indemnity.",
678
645
  capabilities: { resolutions: [] }
679
646
  },
680
647
  {
@@ -683,25 +650,16 @@ var MODEL_CATALOG = [
683
650
  modality: "image",
684
651
  task: "text-to-image",
685
652
  label: "Seedream V4 (KIE)",
686
- description: "ByteDance Seedream V4 via KIE. Stylized output not available on Vertex. No IP indemnity.",
687
- cost: { usd: 0.0175 },
688
- listPrice: { source: "unrecorded" }
653
+ description: "ByteDance Seedream V4 via KIE. Stylized output not available on Vertex. No IP indemnity."
689
654
  },
690
655
  // ── KIE.ai: newer image models, the cheaper route (price feed 2026-09-23) ─
691
- // Billed from the credits KIE reports on each task. KIE offers no data
692
- // processing agreement. Decided 2026-09-23 (Q5 C of the routing plan,
693
- // docs/plans/2026-09-26-kie-first-fal-fallback.md): the automatic routes try
694
- // KIE first for everything, a recorded risk; pinning the fal entry of a model
695
- // is how a job with a real person's photo is kept off KIE.
696
656
  {
697
657
  id: "kie/nano-banana-2-edit",
698
658
  provider: "kie",
699
659
  modality: "image",
700
660
  task: "image-edit",
701
661
  label: "Nano Banana 2 Edit (KIE)",
702
- description: "Nano Banana 2 instruction edit via KIE with up to 8 reference images, half the fal price: $0.04 at 1K, $0.06 at 2K, $0.09 at 4K.",
703
- cost: { usd: 0.04, usdByResolution: { "1K": 0.04, "2K": 0.06, "4K": 0.09 } },
704
- listPrice: { source: "fal", model: "fal/nano-banana-2-edit" },
662
+ description: "Nano Banana 2 instruction edit via KIE with up to 8 reference images.",
705
663
  capabilities: { resolutions: ["1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
706
664
  },
707
665
  {
@@ -710,9 +668,7 @@ var MODEL_CATALOG = [
710
668
  modality: "image",
711
669
  task: "text-to-image",
712
670
  label: "Nano Banana Pro (KIE)",
713
- description: "Google Gemini 3 Pro Image via KIE: stronger on complex scenes, text in images and new characters than Nano Banana 2 (a relighting edit showed no difference on 2026-09-23). $0.09 at 1K or 2K, $0.12 at 4K (fal: $0.15, $0.30).",
714
- cost: { usd: 0.09, usdByResolution: { "1K": 0.09, "2K": 0.09, "4K": 0.12 } },
715
- listPrice: { source: "fal", model: "fal/nano-banana-pro" },
671
+ description: "Google Gemini 3 Pro Image via KIE: stronger on complex scenes, text in images and new characters than Nano Banana 2 (a relighting edit showed no difference on 2026-09-23).",
716
672
  capabilities: { resolutions: ["1K", "2K", "4K"], maxInputImages: 0 }
717
673
  },
718
674
  {
@@ -721,9 +677,7 @@ var MODEL_CATALOG = [
721
677
  modality: "image",
722
678
  task: "image-edit",
723
679
  label: "Nano Banana Pro Edit (KIE)",
724
- description: "Nano Banana Pro instruction edit via KIE with up to 8 reference images. $0.09 at 1K or 2K, $0.12 at 4K (fal: $0.15, $0.30).",
725
- cost: { usd: 0.09, usdByResolution: { "1K": 0.09, "2K": 0.09, "4K": 0.12 } },
726
- listPrice: { source: "fal", model: "fal/nano-banana-pro-edit" },
680
+ description: "Nano Banana Pro instruction edit via KIE with up to 8 reference images.",
727
681
  capabilities: { resolutions: ["1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
728
682
  },
729
683
  {
@@ -732,9 +686,7 @@ var MODEL_CATALOG = [
732
686
  modality: "image",
733
687
  task: "text-to-image",
734
688
  label: "Seedream 5 Lite (KIE)",
735
- description: "ByteDance Seedream 5 Lite via KIE, 2K or 4K. $0.0275 per image (fal: $0.035).",
736
- cost: { usd: 0.0275 },
737
- listPrice: { source: "fal", model: "fal/seedream-5-lite" },
689
+ description: "ByteDance Seedream 5 Lite via KIE, 2K or 4K.",
738
690
  capabilities: { resolutions: ["2K", "4K"], maxInputImages: 0 }
739
691
  },
740
692
  {
@@ -743,9 +695,7 @@ var MODEL_CATALOG = [
743
695
  modality: "image",
744
696
  task: "image-edit",
745
697
  label: "Seedream 5 Lite Edit (KIE)",
746
- description: "ByteDance Seedream 5 Lite image-to-image via KIE, up to 10 reference images, 2K or 4K. $0.0275 per image (fal: $0.035).",
747
- cost: { usd: 0.0275 },
748
- listPrice: { source: "fal", model: "fal/seedream-5-lite-edit" },
698
+ description: "ByteDance Seedream 5 Lite image-to-image via KIE, up to 10 reference images, 2K or 4K.",
749
699
  capabilities: { resolutions: ["2K", "4K"], needsImageInput: true, maxInputImages: 10 }
750
700
  },
751
701
  {
@@ -754,9 +704,7 @@ var MODEL_CATALOG = [
754
704
  modality: "image",
755
705
  task: "text-to-image",
756
706
  label: "Seedream 5 Pro (KIE)",
757
- description: "ByteDance Seedream 5 Pro via KIE, 1K or 2K. $0.035 at 1K, $0.07 at 2K (fal: $0.0675 to $0.135).",
758
- cost: { usd: 0.035, usdByResolution: { "1K": 0.035, "2K": 0.07 } },
759
- listPrice: { source: "fal", model: "fal/seedream-5-pro" },
707
+ description: "ByteDance Seedream 5 Pro via KIE, 1K or 2K.",
760
708
  capabilities: { resolutions: ["1K", "2K"], maxInputImages: 0 }
761
709
  },
762
710
  {
@@ -765,30 +713,17 @@ var MODEL_CATALOG = [
765
713
  modality: "image",
766
714
  task: "image-edit",
767
715
  label: "Seedream 5 Pro Edit (KIE)",
768
- description: "ByteDance Seedream 5 Pro image-to-image via KIE, up to 10 reference images, 1K or 2K. $0.035 at 1K, $0.07 at 2K, plus $0.0025 per extra reference.",
769
- cost: { usd: 0.035, usdByResolution: { "1K": 0.035, "2K": 0.07 } },
770
- listPrice: { source: "fal", model: "fal/seedream-5-pro-edit" },
716
+ description: "ByteDance Seedream 5 Pro image-to-image via KIE, up to 10 reference images, 1K or 2K.",
771
717
  capabilities: { resolutions: ["1K", "2K"], needsImageInput: true, maxInputImages: 10 }
772
718
  },
773
719
  // ── fal.ai: image gen ─────────────────────────────────────────────────
774
- // Prices from docs/internal/research/fal-api-reference.md (vetted
775
- // 2026-06-04). Nano Banana 2 (Google Gemini 3.1 Flash Image) is the SAME upstream model as today's KIE
776
- // nano-banana-2 default; flipping the default from kie/nano-banana-2 to
777
- // fal/nano-banana-2 is zero aesthetic change. FLUX 1.1 [pro] is the
778
- // fal-native flagship; FLUX.1 [schnell] the fast/cheap option; FLUX.1
779
- // Kontext [pro] is for instruction edits.
780
- //
781
- // Per-task entries (Weave-style classification, option a from the spec):
782
- // Nano Banana 2 appears as both text-to-image (default) and the /edit
783
- // endpoint as image-to-image + image-edit, sharing one upstream id.
784
720
  {
785
721
  id: "fal/nano-banana-2",
786
722
  provider: "fal",
787
723
  modality: "image",
788
724
  task: "text-to-image",
789
725
  label: "Nano Banana 2 (fal)",
790
- description: "Google Gemini 3.1 Flash Image via fal. Default for image gen; same upstream model as KIE nano-banana-2 with no aesthetic change. $0.08 per image at 1K (0.5K x0.75, 2K x1.5, 4K x2).",
791
- cost: { usd: 0.08, usdByResolution: FAL_NANO_BANANA_2_USD_BY_RESOLUTION },
726
+ description: "Google Gemini 3.1 Flash Image via fal. Default for image gen; same upstream model as KIE nano-banana-2 with no aesthetic change.",
792
727
  capabilities: { resolutions: ["0.5K", "1K", "2K", "4K"], maxInputImages: 0 },
793
728
  isDefault: true
794
729
  },
@@ -798,8 +733,7 @@ var MODEL_CATALOG = [
798
733
  modality: "image",
799
734
  task: "image-edit",
800
735
  label: "Nano Banana 2 Edit (fal)",
801
- description: "Nano Banana 2 instruction edit. Takes up to 8 reference images for full brand consistency. $0.08 per image at 1K (0.5K x0.75, 2K x1.5, 4K x2).",
802
- cost: { usd: 0.08, usdByResolution: FAL_NANO_BANANA_2_USD_BY_RESOLUTION },
736
+ description: "Nano Banana 2 instruction edit. Takes up to 8 reference images for full brand consistency.",
803
737
  capabilities: { resolutions: ["0.5K", "1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
804
738
  },
805
739
  {
@@ -808,11 +742,7 @@ var MODEL_CATALOG = [
808
742
  modality: "image",
809
743
  task: "image-to-image",
810
744
  label: "Nano Banana 2 Image-to-Image (fal)",
811
- description: "Nano Banana 2 in image-to-image mode; same upstream endpoint as the edit entry, separate task classification. $0.08 per image at 1K (0.5K x0.75, 2K x1.5, 4K x2).",
812
- // Same fal endpoint as the edit entry, so the same tier prices: fal's
813
- // recorded cost is keyed by endpoint and was already tiered, and the
814
- // estimates and quota must agree with it.
815
- cost: { usd: 0.08, usdByResolution: FAL_NANO_BANANA_2_USD_BY_RESOLUTION },
745
+ description: "Nano Banana 2 in image-to-image mode; same upstream endpoint as the edit entry, separate task classification.",
816
746
  capabilities: { resolutions: ["0.5K", "1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
817
747
  },
818
748
  // ── fal.ai: Nano Banana Pro and Seedream 5 (the fallback for the KIE entries) ─
@@ -822,8 +752,7 @@ var MODEL_CATALOG = [
822
752
  modality: "image",
823
753
  task: "text-to-image",
824
754
  label: "Nano Banana Pro (fal)",
825
- description: "Google Gemini 3 Pro Image via fal. $0.15 at 1K or 2K, $0.30 at 4K. The KIE entry is cheaper; this one runs under fal terms.",
826
- cost: { usd: 0.15, usdByResolution: { "1K": 0.15, "2K": 0.15, "4K": 0.3 } },
755
+ description: "Google Gemini 3 Pro Image via fal. This entry runs under fal terms.",
827
756
  capabilities: { resolutions: ["1K", "2K", "4K"], maxInputImages: 0 }
828
757
  },
829
758
  {
@@ -832,8 +761,7 @@ var MODEL_CATALOG = [
832
761
  modality: "image",
833
762
  task: "image-edit",
834
763
  label: "Nano Banana Pro Edit (fal)",
835
- description: "Nano Banana Pro instruction edit via fal with up to 8 reference images. $0.15 at 1K or 2K, $0.30 at 4K.",
836
- cost: { usd: 0.15, usdByResolution: { "1K": 0.15, "2K": 0.15, "4K": 0.3 } },
764
+ description: "Nano Banana Pro instruction edit via fal with up to 8 reference images.",
837
765
  capabilities: { resolutions: ["1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
838
766
  },
839
767
  {
@@ -842,8 +770,7 @@ var MODEL_CATALOG = [
842
770
  modality: "image",
843
771
  task: "text-to-image",
844
772
  label: "Seedream 5 Lite (fal)",
845
- description: "ByteDance Seedream 5 Lite via fal, 2K or 4K. $0.035 per image.",
846
- cost: { usd: 0.035 },
773
+ description: "ByteDance Seedream 5 Lite via fal, 2K or 4K.",
847
774
  capabilities: { resolutions: ["2K", "4K"], maxInputImages: 0 }
848
775
  },
849
776
  {
@@ -852,8 +779,7 @@ var MODEL_CATALOG = [
852
779
  modality: "image",
853
780
  task: "image-edit",
854
781
  label: "Seedream 5 Lite Edit (fal)",
855
- description: "ByteDance Seedream 5 Lite edit via fal, up to 10 reference images, 2K or 4K. $0.035 per image.",
856
- cost: { usd: 0.035 },
782
+ description: "ByteDance Seedream 5 Lite edit via fal, up to 10 reference images, 2K or 4K.",
857
783
  capabilities: { resolutions: ["2K", "4K"], needsImageInput: true, maxInputImages: 10 }
858
784
  },
859
785
  {
@@ -862,8 +788,7 @@ var MODEL_CATALOG = [
862
788
  modality: "image",
863
789
  task: "text-to-image",
864
790
  label: "Seedream 5 Pro (fal)",
865
- description: "ByteDance Seedream 5 Pro via fal, 1K or 2K. $0.0675 per image up to 1536x1536 pixels (the 1K tier), $0.135 above that up to 2048x2048 (the 2K tier, the default). fal marks the price tentative.",
866
- cost: { usd: 0.135, usdByResolution: { "1K": 0.0675, "2K": 0.135 } },
791
+ description: "ByteDance Seedream 5 Pro via fal, 1K or 2K.",
867
792
  capabilities: { resolutions: ["1K", "2K"], maxInputImages: 0 }
868
793
  },
869
794
  {
@@ -872,8 +797,7 @@ var MODEL_CATALOG = [
872
797
  modality: "image",
873
798
  task: "image-edit",
874
799
  label: "Seedream 5 Pro Edit (fal)",
875
- description: "ByteDance Seedream 5 Pro edit via fal, up to 10 reference images, 1K or 2K. $0.0675 per image up to 1536x1536 pixels (the 1K tier), $0.135 above that up to 2048x2048 (the 2K tier, the default), plus $0.0045 for every input image after the first. fal marks the price tentative.",
876
- cost: { usd: 0.135, usdByResolution: { "1K": 0.0675, "2K": 0.135 } },
800
+ description: "ByteDance Seedream 5 Pro edit via fal, up to 10 reference images, 1K or 2K.",
877
801
  capabilities: { resolutions: ["1K", "2K"], needsImageInput: true, maxInputImages: 10 }
878
802
  },
879
803
  {
@@ -882,8 +806,7 @@ var MODEL_CATALOG = [
882
806
  modality: "image",
883
807
  task: "text-to-image",
884
808
  label: "FLUX 1.1 [pro] (fal)",
885
- description: "Black Forest Labs FLUX 1.1 [pro] via fal. Flagship text-to-image; $0.04 per megapixel. Text-only, no reference-image brand conditioning.",
886
- cost: { usd: 0.04 },
809
+ description: "Black Forest Labs FLUX 1.1 [pro] via fal. Flagship text-to-image. Text-only, no reference-image brand conditioning.",
887
810
  capabilities: { resolutions: [], maxInputImages: 0 }
888
811
  },
889
812
  {
@@ -892,8 +815,7 @@ var MODEL_CATALOG = [
892
815
  modality: "image",
893
816
  task: "text-to-image",
894
817
  label: "FLUX.1 [schnell] (fal)",
895
- description: "Black Forest Labs FLUX.1 [schnell] via fal. Fast/cheap text-to-image; $0.003 per megapixel. Text-only.",
896
- cost: { usd: 3e-3 },
818
+ description: "Black Forest Labs FLUX.1 [schnell] via fal. Fast text-to-image. Text-only.",
897
819
  capabilities: { resolutions: [], maxInputImages: 0 }
898
820
  },
899
821
  {
@@ -902,42 +824,28 @@ var MODEL_CATALOG = [
902
824
  modality: "image",
903
825
  task: "image-edit",
904
826
  label: "FLUX.1 Kontext [pro] (fal)",
905
- description: "FLUX.1 Kontext instruction edit via fal. Single image_url input ($0.04 per image). For multi-ref, the kontext/max/multi endpoint is a follow-up.",
906
- cost: { usd: 0.04 },
827
+ description: "FLUX.1 Kontext instruction edit via fal. Single image_url input. For multi-ref, the kontext/max/multi endpoint is a follow-up.",
907
828
  capabilities: { resolutions: [], needsImageInput: true, maxInputImages: 1 }
908
829
  },
909
830
  // ── fal.ai: virtual try-on (E3) ────────────────────────────────────────
910
- // FASHN garment-preserving try-on. A DISTINCT task from image-edit: it takes
911
- // TWO named images (garment + person/model) and preserves the garment's
912
- // pixels (text/pattern/fabric) rather than letting a general diffusion edit
913
- // redraw them. Id, schema, and price verified 2026-07-20 against fal's model
914
- // page for fal-ai/fashn/tryon/v1.6; see docs/internal/research/fal-fashn-tryon.md.
915
- // Flat $0.075 per run (fal does not return cost; the provider computes it).
916
831
  {
917
832
  id: "fal/fashn-tryon-v1-6",
918
833
  provider: "fal",
919
834
  modality: "image",
920
835
  task: "virtual-try-on",
921
836
  label: "FASHN Try-On v1.6",
922
- description: "Garment-preserving virtual try-on via fal. Preserves product text/pattern/fabric; takes a garment image and a model/person image. $0.075 per run (fal-ai/fashn/tryon/v1.6, vetted 2026-07-20).",
923
- cost: { usd: 0.075 },
837
+ description: "Garment-preserving virtual try-on via fal. Preserves product text/pattern/fabric; takes a garment image and a model/person image.",
924
838
  capabilities: { maxInputImages: 2, needsImageInput: true },
925
839
  isDefault: true
926
840
  },
927
841
  // ── fal.ai: video gen (B1) ─────────────────────────────────────────────
928
- // Async via fal's queue API (submit -> webhook / poll). Prices are per the
929
- // fal model pages (vetted 2026-06-16); fal does NOT return cost, so the
930
- // provider computes a flat per-video estimate from the catalog usd anchored
931
- // to the model's base clip length. Exactly one isDefault per (video, task):
932
- // Kling 2.5 Turbo Pro for image-to-video, Seedance 1.0 Pro for text-to-video.
933
842
  {
934
843
  id: "fal/kling-v2-5-image-to-video",
935
844
  provider: "fal",
936
845
  modality: "video",
937
846
  task: "image-to-video",
938
847
  label: "Kling 2.5 Turbo Pro (image-to-video)",
939
- description: "Kuaishou Kling 2.5 Turbo Pro via fal. Cinematic image-to-video; $0.35 base (5s) plus $0.07 per extra second. Default image-to-video.",
940
- cost: { usd: 0.35 },
848
+ description: "Kuaishou Kling 2.5 Turbo Pro via fal. Cinematic image-to-video. Default image-to-video.",
941
849
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true },
942
850
  isDefault: true
943
851
  },
@@ -947,8 +855,7 @@ var MODEL_CATALOG = [
947
855
  modality: "video",
948
856
  task: "image-to-video",
949
857
  label: "Seedance 1.0 Pro (image-to-video)",
950
- description: "ByteDance Seedance 1.0 Pro via fal. Image-to-video; roughly $0.62 per 1080p 5s clip. Alternative to Kling for stylized motion.",
951
- cost: { usd: 0.62 },
858
+ description: "ByteDance Seedance 1.0 Pro via fal. Image-to-video. Alternative to Kling for stylized motion.",
952
859
  capabilities: { needsImageInput: true, maxInputImages: 1 }
953
860
  },
954
861
  {
@@ -958,9 +865,7 @@ var MODEL_CATALOG = [
958
865
  task: "image-to-video",
959
866
  label: "Seedance 2.5 (image-to-video)",
960
867
  refusesPhotorealPeople: true,
961
- description: "ByteDance Seedance 2.5 via fal. Accepts a start frame AND an end frame (end_image_url), selectable duration 4-30s, up to 1080p, with synchronised audio (generate_audio, on by default). Token-billed: (w*h*s*24)/1024 at $0.0214 per 1000 tokens, so $2.31 for the default 5s at 720p 16:9 ($1.85 for 4s) and $4.16 for 4s at 1080p. CAUTION: ByteDance partner moderation on 2.5 rejected even fal's own robot test image with content_policy_violation (observed 2026-08-21), and it refuses photoreal people, generated ones included (observed 2026-08-21 and 2026-09-23). Seedance 2.0 refuses them too, so pick another model for a person; use this one for subjects without people.",
962
- // The default clip the estimate prices (computeVideoCostUsd): 5s at 720p 16:9.
963
- cost: { usd: 2.3112 },
868
+ description: "ByteDance Seedance 2.5 via fal. Accepts a start frame AND an end frame (end_image_url), selectable duration 4-30s, up to 1080p, with synchronised audio (generate_audio, on by default). CAUTION: ByteDance partner moderation on 2.5 rejected even fal's own robot test image with content_policy_violation (observed 2026-08-21), and it refuses photoreal people, generated ones included (observed 2026-08-21 and 2026-09-23). Seedance 2.0 refuses them too, so pick another model for a person; use this one for subjects without people.",
964
869
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
965
870
  },
966
871
  {
@@ -970,9 +875,7 @@ var MODEL_CATALOG = [
970
875
  task: "image-to-video",
971
876
  label: "Seedance 2.0 (image-to-video)",
972
877
  refusesPhotorealPeople: true,
973
- description: "ByteDance Seedance 2.0 via fal. Start frame plus optional end frame (end_image_url), duration 4-15s, up to 4k, and it accepts seven explicit aspect ratios where 2.5 is fixed to auto. It refuses photoreal people, generated ones included, in every fal mode (observed 2026-09-23). Not simply superseded by 2.5: 2.0 generated from photographic input that 2.5 refused on content policy (observed 2026-08-21), and it is the only one offering 4k. Token-billed with the same formula as 2.5 but at a lower rate: 2.0 is $0.014 per 1000 tokens and 2.5 is $0.0214, so 2.0 costs $1.51 for the default 5s at 720p 16:9 ($1.21 for 4s).",
974
- // The default clip the estimate prices (computeVideoCostUsd): 5s at 720p 16:9.
975
- cost: { usd: 1.512 },
878
+ description: "ByteDance Seedance 2.0 via fal. Start frame plus optional end frame (end_image_url), duration 4-15s, up to 4k, and it accepts seven explicit aspect ratios where 2.5 is fixed to auto. It refuses photoreal people, generated ones included, in every fal mode (observed 2026-09-23). Not simply superseded by 2.5: 2.0 generated from photographic input that 2.5 refused on content policy (observed 2026-08-21), and it is the only one offering 4k.",
976
879
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
977
880
  },
978
881
  // ── A start-frame model that accepts photoreal generated characters ───────
@@ -988,25 +891,17 @@ var MODEL_CATALOG = [
988
891
  modality: "video",
989
892
  task: "image-to-video",
990
893
  label: "Grok Imagine (image-to-video)",
991
- description: "xAI Grok Imagine Video via fal. Animates a start frame with audio, 1 to 15 s, 480p or 720p, aspect auto or eight explicit ratios. Accepts photoreal generated characters that Seedance refuses (tested 2026-09-23). $0.05 per second at 480p, $0.07 at 720p, plus $0.002 per input image. No end frame.",
992
- // 5 s at the 720p default plus fal's $0.002 for the input image.
993
- cost: { usd: 0.352 },
894
+ description: "xAI Grok Imagine Video via fal. Animates a start frame with audio, 1 to 15 s, 480p or 720p, aspect auto or eight explicit ratios. Accepts photoreal generated characters that Seedance refuses (tested 2026-09-23). No end frame.",
994
895
  capabilities: { needsImageInput: true, maxInputImages: 1 }
995
896
  },
996
897
  // ── Google Veo 3.1 (fal): start frame, and first and last frame ──────────
997
- // Accepted every photoreal still of a minted character on 2026-09-23 and
998
- // landed exactly on the end frame; the best quality tested that day. Durations
999
- // 4, 6 or 8 s (Lite first-and-last: 8 s only), aspect auto, 16:9 or 9:16.
1000
- // Studio sends it SILENT unless the job sets generateAudio: true (audio costs
1001
- // 50 to 100% more), so the anchors are 8 s silent at 720p. fal vetted 2026-09-23.
1002
898
  {
1003
899
  id: "fal/veo-3-1-lite-image-to-video",
1004
900
  provider: "fal",
1005
901
  modality: "video",
1006
902
  task: "image-to-video",
1007
903
  label: "Veo 3.1 Lite (image-to-video)",
1008
- description: "Google Veo 3.1 Lite via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p or 1080p. Accepts photoreal generated characters Seedance refuses. $0.03 per second silent ($0.05 with audio) at 720p, $0.05 ($0.08) at 1080p.",
1009
- cost: { usd: 0.24 },
904
+ description: "Google Veo 3.1 Lite via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p or 1080p. Accepts photoreal generated characters Seedance refuses.",
1010
905
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1011
906
  },
1012
907
  {
@@ -1015,8 +910,7 @@ var MODEL_CATALOG = [
1015
910
  modality: "video",
1016
911
  task: "image-to-video",
1017
912
  label: "Veo 3.1 Lite (first and last frame)",
1018
- description: "Google Veo 3.1 Lite via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 8 s only, 720p or 1080p. Accepts photoreal generated characters Seedance refuses. $0.03 per second silent ($0.05 with audio) at 720p, $0.05 ($0.08) at 1080p.",
1019
- cost: { usd: 0.24 },
913
+ description: "Google Veo 3.1 Lite via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 8 s only, 720p or 1080p. Accepts photoreal generated characters Seedance refuses.",
1020
914
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1021
915
  },
1022
916
  {
@@ -1025,8 +919,7 @@ var MODEL_CATALOG = [
1025
919
  modality: "video",
1026
920
  task: "image-to-video",
1027
921
  label: "Veo 3.1 Fast (image-to-video)",
1028
- description: "Google Veo 3.1 Fast via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.10 per second silent ($0.15 with audio) at 720p or 1080p, $0.30 ($0.35) at 4K.",
1029
- cost: { usd: 0.8 },
922
+ description: "Google Veo 3.1 Fast via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
1030
923
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1031
924
  },
1032
925
  {
@@ -1035,8 +928,7 @@ var MODEL_CATALOG = [
1035
928
  modality: "video",
1036
929
  task: "image-to-video",
1037
930
  label: "Veo 3.1 Fast (first and last frame)",
1038
- description: "Google Veo 3.1 Fast via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.10 per second silent ($0.15 with audio) at 720p or 1080p, $0.30 ($0.35) at 4K.",
1039
- cost: { usd: 0.8 },
931
+ description: "Google Veo 3.1 Fast via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
1040
932
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1041
933
  },
1042
934
  {
@@ -1045,8 +937,7 @@ var MODEL_CATALOG = [
1045
937
  modality: "video",
1046
938
  task: "image-to-video",
1047
939
  label: "Veo 3.1 (image-to-video)",
1048
- description: "Google Veo 3.1 via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.20 per second silent ($0.40 with audio) at 720p or 1080p, $0.40 ($0.60) at 4K.",
1049
- cost: { usd: 1.6 },
940
+ description: "Google Veo 3.1 via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
1050
941
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1051
942
  },
1052
943
  {
@@ -1055,27 +946,17 @@ var MODEL_CATALOG = [
1055
946
  modality: "video",
1056
947
  task: "image-to-video",
1057
948
  label: "Veo 3.1 (first and last frame)",
1058
- description: "Google Veo 3.1 via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.20 per second silent ($0.40 with audio) at 720p or 1080p, $0.40 ($0.60) at 4K.",
1059
- cost: { usd: 1.6 },
949
+ description: "Google Veo 3.1 via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
1060
950
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1061
951
  },
1062
952
  // ── KIE.ai video: the cheaper route to the same upstream models ──────────
1063
- // Async via KIE's Veo and createTask APIs (providers/kie-video.ts). 20 to 85%
1064
- // below fal (KIE price feed, 2026-09-23). KIE offers no data processing
1065
- // agreement. Decided 2026-09-23 (Q5 C of the routing plan): the automatic
1066
- // routes try KIE first for everything, a recorded risk; pinning the fal
1067
- // entry of a model is how a job with a real person's photo is kept off KIE.
1068
- // Anchors are the model's default clip at 720p (Kling: its fixed size). KIE
1069
- // docs vetted 2026-09-23.
1070
953
  {
1071
954
  id: "kie/veo-3-1-lite",
1072
955
  provider: "kie",
1073
956
  modality: "video",
1074
957
  task: "image-to-video",
1075
958
  label: "Veo 3.1 Lite (KIE)",
1076
- description: "Google Veo 3.1 Lite via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. Priced per clip: $0.15 at 720p, $0.175 at 1080p, $0.75 at 4K (fal: $0.24 silent, $0.40 with audio, for 8 s at 720p). KIE's Auto aspect letterboxes, so pick 16:9 or 9:16.",
1077
- cost: { usd: 0.15 },
1078
- listPrice: { source: "owner", model: "openrouter/veo-3-1-lite" },
959
+ description: "Google Veo 3.1 Lite via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. KIE's Auto aspect letterboxes, so pick 16:9 or 9:16.",
1079
960
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1080
961
  },
1081
962
  {
@@ -1084,9 +965,7 @@ var MODEL_CATALOG = [
1084
965
  modality: "video",
1085
966
  task: "image-to-video",
1086
967
  label: "Veo 3.1 Fast (KIE)",
1087
- description: "Google Veo 3.1 Fast via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. Priced per clip: $0.30 at 720p, $0.325 at 1080p, $0.90 at 4K (fal: $1.20 with audio for 8 s). Pick 16:9 or 9:16.",
1088
- cost: { usd: 0.3 },
1089
- listPrice: { source: "owner", model: "openrouter/veo-3-1-fast" },
968
+ description: "Google Veo 3.1 Fast via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. Pick 16:9 or 9:16.",
1090
969
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1091
970
  },
1092
971
  {
@@ -1095,25 +974,17 @@ var MODEL_CATALOG = [
1095
974
  modality: "video",
1096
975
  task: "image-to-video",
1097
976
  label: "Veo 3.1 (KIE)",
1098
- description: "Google Veo 3.1 (quality tier) via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Same upstream model as the tested Lite and Fast tiers. Priced per clip: $1.25 at 720p, $1.275 at 1080p, $1.85 at 4K (fal: $3.20 with audio).",
1099
- cost: { usd: 1.25 },
1100
- listPrice: { source: "owner", model: "openrouter/veo-3-1" },
977
+ description: "Google Veo 3.1 (quality tier) via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Same upstream model as the tested Lite and Fast tiers.",
1101
978
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1102
979
  },
1103
980
  // ── OpenRouter video: Google Veo 3.1 at Google's own prices ───────────────
1104
- // Async via OpenRouter's video API (providers/openrouter-video.ts). One entry
1105
- // per tier, like KIE: an end frame adds a last frame. 16:9 or 9:16 only (no
1106
- // auto), frames must be JPEG or PNG (WebP is refused). Studio sends it SILENT
1107
- // unless the job sets generateAudio: true, like the fal Veo entries, so the
1108
- // anchors are 8 s silent at 720p. OpenRouter models endpoint vetted 2026-10-04.
1109
981
  {
1110
982
  id: "openrouter/veo-3-1-lite",
1111
983
  provider: "openrouter",
1112
984
  modality: "video",
1113
985
  task: "image-to-video",
1114
986
  label: "Veo 3.1 Lite (OpenRouter)",
1115
- description: "Google Veo 3.1 Lite via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p or 1080p; 16:9 or 9:16, one must be set. Accepted a minted character's photoreal still on 2026-10-04. $0.03 per second silent ($0.05 with audio) at 720p, $0.05 ($0.08) at 1080p, the same as fal.",
1116
- cost: { usd: 0.24 },
987
+ description: "Google Veo 3.1 Lite via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p or 1080p; 16:9 or 9:16, one must be set. Accepted a minted character's photoreal still on 2026-10-04.",
1117
988
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1118
989
  },
1119
990
  {
@@ -1122,8 +993,7 @@ var MODEL_CATALOG = [
1122
993
  modality: "video",
1123
994
  task: "image-to-video",
1124
995
  label: "Veo 3.1 Fast (OpenRouter)",
1125
- description: "Google Veo 3.1 Fast via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set. $0.08 per second silent ($0.10 with audio) at 720p, $0.10 ($0.12) at 1080p, $0.25 ($0.30) at 4K (fal: $0.10 silent, $0.15 with audio at 720p).",
1126
- cost: { usd: 0.64 },
996
+ description: "Google Veo 3.1 Fast via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set.",
1127
997
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1128
998
  },
1129
999
  {
@@ -1132,8 +1002,7 @@ var MODEL_CATALOG = [
1132
1002
  modality: "video",
1133
1003
  task: "image-to-video",
1134
1004
  label: "Veo 3.1 (OpenRouter)",
1135
- description: "Google Veo 3.1 (quality tier) via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set. $0.20 per second silent ($0.40 with audio) at 720p or 1080p, $0.40 ($0.60) at 4K, the same as fal.",
1136
- cost: { usd: 1.6 },
1005
+ description: "Google Veo 3.1 (quality tier) via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set.",
1137
1006
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1138
1007
  },
1139
1008
  {
@@ -1142,9 +1011,7 @@ var MODEL_CATALOG = [
1142
1011
  modality: "video",
1143
1012
  task: "image-to-video",
1144
1013
  label: "Grok Imagine (KIE)",
1145
- description: "xAI Grok Imagine via KIE. A start frame, 6 to 30 s, 480p, 720p or 1080p, with audio. Accepted a minted character's photoreal stills on 2026-09-23. $0.012 per second at 480p, $0.0225 at 720p, $0.04 at 1080p (fal: $0.07 at 720p). No end frame.",
1146
- cost: { usd: 0.135 },
1147
- listPrice: { source: "fal", model: "fal/grok-imagine-image-to-video" },
1014
+ description: "xAI Grok Imagine via KIE. A start frame, 6 to 30 s, 480p, 720p or 1080p, with audio. Accepted a minted character's photoreal stills on 2026-09-23. No end frame.",
1148
1015
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1149
1016
  },
1150
1017
  {
@@ -1153,9 +1020,7 @@ var MODEL_CATALOG = [
1153
1020
  modality: "video",
1154
1021
  task: "image-to-video",
1155
1022
  label: "Grok Imagine 1.5 (KIE, preview)",
1156
- description: "xAI Grok Imagine 1.5 preview via KIE. A start frame, 1 to 15 s, 480p or 720p. Not yet tested with a minted character. $0.012 per second at 480p, $0.0225 at 720p (fal: $0.14 at 720p). No end frame.",
1157
- cost: { usd: 0.18 },
1158
- listPrice: { source: "fal", model: "fal/grok-imagine-1-5-image-to-video" },
1023
+ description: "xAI Grok Imagine 1.5 preview via KIE. A start frame, 1 to 15 s, 480p or 720p. Not yet tested with a minted character. No end frame.",
1159
1024
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1160
1025
  },
1161
1026
  {
@@ -1164,9 +1029,7 @@ var MODEL_CATALOG = [
1164
1029
  modality: "video",
1165
1030
  task: "image-to-video",
1166
1031
  label: "Kling 2.5 Turbo Pro (KIE)",
1167
- description: "Kuaishou Kling 2.5 Turbo Pro via KIE. A start frame and an optional end frame, 5 or 10 s, fixed size. The fal route accepted minted characters; this KIE route is not yet tested with a minted character. $0.21 for 5 s, $0.42 for 10 s (fal: $0.35 for 5 s).",
1168
- cost: { usd: 0.21 },
1169
- listPrice: { source: "fal", model: "fal/kling-v2-5-image-to-video" },
1032
+ description: "Kuaishou Kling 2.5 Turbo Pro via KIE. A start frame and an optional end frame, 5 or 10 s, fixed size. The fal route accepted minted characters; this KIE route is not yet tested with a minted character.",
1170
1033
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1171
1034
  },
1172
1035
  {
@@ -1175,9 +1038,7 @@ var MODEL_CATALOG = [
1175
1038
  modality: "video",
1176
1039
  task: "image-to-video",
1177
1040
  label: "Kling 2.6 (KIE)",
1178
- description: "Kuaishou Kling 2.6 via KIE. A start frame, 5 or 10 s, fixed size, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.275 for 5 s silent, $0.55 with sound, 10 s double (fal: $0.35 or $0.70).",
1179
- cost: { usd: 0.275 },
1180
- listPrice: { source: "fal", model: "fal/kling-2-6-image-to-video" },
1041
+ description: "Kuaishou Kling 2.6 via KIE. A start frame, 5 or 10 s, fixed size, silent unless the job sets generateAudio. Not yet tested with a minted character.",
1181
1042
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1182
1043
  },
1183
1044
  {
@@ -1187,9 +1048,7 @@ var MODEL_CATALOG = [
1187
1048
  task: "image-to-video",
1188
1049
  label: "Seedance 2.0 (KIE)",
1189
1050
  refusesPhotorealPeople: true,
1190
- description: "ByteDance Seedance 2.0 via KIE. A start frame and an optional end frame, 4 to 15 s, 480p to 4K. Seedance 2.0 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person. $0.095 per second at 480p, $0.205 at 720p, $0.51 at 1080p, $1.04 at 4K (fal: about $0.30 at 720p).",
1191
- cost: { usd: 1.025 },
1192
- listPrice: { source: "fal", model: "fal/seedance-2-0-image-to-video" },
1051
+ description: "ByteDance Seedance 2.0 via KIE. A start frame and an optional end frame, 4 to 15 s, 480p to 4K. Seedance 2.0 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person.",
1193
1052
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1194
1053
  },
1195
1054
  {
@@ -1199,9 +1058,7 @@ var MODEL_CATALOG = [
1199
1058
  task: "image-to-video",
1200
1059
  label: "Seedance 2.5 (KIE)",
1201
1060
  refusesPhotorealPeople: true,
1202
- description: "ByteDance Seedance 2.5 via KIE. A start frame and an optional end frame, 4 to 30 s, 480p to 1080p. Seedance 2.5 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-08-21 and 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person. $0.14 per second at 480p, $0.315 at 720p, $0.79 at 1080p.",
1203
- cost: { usd: 1.575 },
1204
- listPrice: { source: "fal", model: "fal/seedance-2-5-image-to-video" },
1061
+ description: "ByteDance Seedance 2.5 via KIE. A start frame and an optional end frame, 4 to 30 s, 480p to 1080p. Seedance 2.5 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-08-21 and 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person.",
1205
1062
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1206
1063
  },
1207
1064
  {
@@ -1210,9 +1067,7 @@ var MODEL_CATALOG = [
1210
1067
  modality: "video",
1211
1068
  task: "image-to-video",
1212
1069
  label: "Wan 3.0 (KIE)",
1213
- description: "Alibaba Wan 3.0 via KIE (hosted only, no downloadable weights). A start frame and an optional end frame, 2 to 30 s, 480p, 720p or 1080p, audio included. Accepted a minted character's photoreal stills on 2026-09-24. $0.04 per second at 480p, $0.08 at 720p, $0.16 at 1080p (fal and Alibaba: $0.10 at 720p).",
1214
- cost: { usd: 0.4 },
1215
- listPrice: { source: "fal", model: "fal/wan-3-0-image-to-video" },
1070
+ description: "Alibaba Wan 3.0 via KIE (hosted only, no downloadable weights). A start frame and an optional end frame, 2 to 30 s, 480p, 720p or 1080p, audio included. Accepted a minted character's photoreal stills on 2026-09-24.",
1216
1071
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1217
1072
  },
1218
1073
  {
@@ -1221,9 +1076,7 @@ var MODEL_CATALOG = [
1221
1076
  modality: "video",
1222
1077
  task: "image-to-video",
1223
1078
  label: "MiniMax H3 (KIE)",
1224
- description: "MiniMax H3 via KIE. A start frame and an optional end frame, 4 to 15 s, 768p (the 720p setting) or 2K (the 1080p setting). Accepted a minted character's photoreal stills on 2026-09-24. Its open weights exclude the EU by license; this is KIE's hosted service. $0.04 per second at 768p, $0.065 at 2K.",
1225
- cost: { usd: 0.24 },
1226
- listPrice: { source: "unrecorded" },
1079
+ description: "MiniMax H3 via KIE. A start frame and an optional end frame, 4 to 15 s, 768p (the 720p setting) or 2K (the 1080p setting). Accepted a minted character's photoreal stills on 2026-09-24. Its open weights exclude the EU by license; this is KIE's hosted service.",
1227
1080
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1228
1081
  },
1229
1082
  {
@@ -1232,9 +1085,7 @@ var MODEL_CATALOG = [
1232
1085
  modality: "video",
1233
1086
  task: "image-to-video",
1234
1087
  label: "Gemini Omni 1.1 Flash (KIE)",
1235
- description: "Google Gemini Omni 1.1 Flash via KIE, first-and-last-frame mode. A start frame and an optional end frame, 4, 6, 8 or 10 s, 720p to 4K, 16:9 or 9:16. KIE refuses registered characters in this mode, so identity comes from the frames alone. Accepted a minted character's photoreal stills on 2026-09-24 (set 9:16 for a portrait still: it defaults to 16:9 and crops). $0.315 for 4 s up to $0.63 for 10 s at 720p or 1080p, $0.735 to $1.05 at 4K. No fal equivalent.",
1236
- cost: { usd: 0.525 },
1237
- listPrice: { source: "unrecorded" },
1088
+ description: "Google Gemini Omni 1.1 Flash via KIE, first-and-last-frame mode. A start frame and an optional end frame, 4, 6, 8 or 10 s, 720p to 4K, 16:9 or 9:16. KIE refuses registered characters in this mode, so identity comes from the frames alone. Accepted a minted character's photoreal stills on 2026-09-24 (set 9:16 for a portrait still: it defaults to 16:9 and crops). No fal equivalent.",
1238
1089
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1239
1090
  },
1240
1091
  {
@@ -1243,9 +1094,7 @@ var MODEL_CATALOG = [
1243
1094
  modality: "video",
1244
1095
  task: "image-to-video",
1245
1096
  label: "Kling O3 (KIE)",
1246
- description: "Kuaishou Kling O3 (KIE calls it Kling 3.0 Omni) via KIE. A start frame and an optional end frame, 3 to 15 s, 720p to 4K in the start frame's shape, silent unless the job sets generateAudio. Accepted a minted character's photoreal stills on 2026-09-24. $0.07 per second at 720p, $0.09 at 1080p, $0.335 at 4K; with sound $0.10 and $0.135.",
1247
- cost: { usd: 0.35 },
1248
- listPrice: { source: "unrecorded" },
1097
+ description: "Kuaishou Kling O3 (KIE calls it Kling 3.0 Omni) via KIE. A start frame and an optional end frame, 3 to 15 s, 720p to 4K in the start frame's shape, silent unless the job sets generateAudio. Accepted a minted character's photoreal stills on 2026-09-24.",
1249
1098
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1250
1099
  },
1251
1100
  {
@@ -1254,9 +1103,7 @@ var MODEL_CATALOG = [
1254
1103
  modality: "video",
1255
1104
  task: "image-to-video",
1256
1105
  label: "Grok Imagine 1.5 (image-to-video)",
1257
- description: "xAI Grok Imagine 1.5 via fal, the fallback for the KIE entry. Animates a start frame with audio, 1 to 15 s, 480p to 1080p, in the start frame's shape. Not yet tested with a minted character (1.0 accepted them). $0.08 per second at 480p, $0.14 at 720p, $0.25 at 1080p, plus $0.01 per input image. No end frame.",
1258
- // 8 s at the 720p default plus $0.01 for the input image.
1259
- cost: { usd: 1.13 },
1106
+ description: "xAI Grok Imagine 1.5 via fal, the fallback for the KIE entry. Animates a start frame with audio, 1 to 15 s, 480p to 1080p, in the start frame's shape. Not yet tested with a minted character (1.0 accepted them). No end frame.",
1260
1107
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1261
1108
  },
1262
1109
  {
@@ -1265,9 +1112,8 @@ var MODEL_CATALOG = [
1265
1112
  modality: "video",
1266
1113
  task: "image-to-video",
1267
1114
  label: "Wan 3.0 (image-to-video)",
1268
- description: "Alibaba Wan 3.0 via fal, the fallback for the KIE entry. A start frame and an optional end frame, 480p to 1080p (1080p unless set), audio included. Not yet tested with a minted character. $0.05 per second at 480p, $0.10 at 720p, $0.20 at 1080p.",
1115
+ description: "Alibaba Wan 3.0 via fal, the fallback for the KIE entry. A start frame and an optional end frame, 480p to 1080p (1080p unless set), audio included. Not yet tested with a minted character.",
1269
1116
  // 5 s at fal's 1080p default.
1270
- cost: { usd: 1 },
1271
1117
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1272
1118
  },
1273
1119
  {
@@ -1276,8 +1122,7 @@ var MODEL_CATALOG = [
1276
1122
  modality: "video",
1277
1123
  task: "image-to-video",
1278
1124
  label: "Kling 2.6 Pro (image-to-video)",
1279
- description: "Kuaishou Kling 2.6 Pro via fal, the fallback for the KIE entry. A start frame and an optional end frame, 5 or 10 s, fixed 1080p, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.07 per second silent, $0.14 with sound.",
1280
- cost: { usd: 0.35 },
1125
+ description: "Kuaishou Kling 2.6 Pro via fal, the fallback for the KIE entry. A start frame and an optional end frame, 5 or 10 s, fixed 1080p, silent unless the job sets generateAudio. Not yet tested with a minted character.",
1281
1126
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1282
1127
  },
1283
1128
  {
@@ -1286,8 +1131,7 @@ var MODEL_CATALOG = [
1286
1131
  modality: "video",
1287
1132
  task: "image-to-video",
1288
1133
  label: "Kling O3 Standard (image-to-video)",
1289
- description: "Kuaishou Kling O3 Standard via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.084 per second silent, $0.112 with sound (KIE: $0.07 at 720p).",
1290
- cost: { usd: 0.42 },
1134
+ description: "Kuaishou Kling O3 Standard via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character.",
1291
1135
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1292
1136
  },
1293
1137
  {
@@ -1296,8 +1140,7 @@ var MODEL_CATALOG = [
1296
1140
  modality: "video",
1297
1141
  task: "image-to-video",
1298
1142
  label: "Kling O3 Pro (image-to-video)",
1299
- description: "Kuaishou Kling O3 Pro via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.112 per second silent, $0.14 with sound (KIE: $0.07 at 720p).",
1300
- cost: { usd: 0.56 },
1143
+ description: "Kuaishou Kling O3 Pro via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character.",
1301
1144
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1302
1145
  },
1303
1146
  {
@@ -1306,9 +1149,8 @@ var MODEL_CATALOG = [
1306
1149
  modality: "video",
1307
1150
  task: "image-to-video",
1308
1151
  label: "LTX-2.5 Fast (image-to-video)",
1309
- description: "Lightricks LTX-2.5 Fast (ltx.io calls it Lite) via fal; not served by KIE. A start frame and an optional end frame, 6 to 20 s in 2 s steps, 720p, 1080p or 4K, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26. $0.09 per second at 720p, $0.13 at 1080p, $0.30 at 4K.",
1152
+ description: "Lightricks LTX-2.5 Fast (ltx.io calls it Lite) via fal; not served by KIE. A start frame and an optional end frame, 6 to 20 s in 2 s steps, 720p, 1080p or 4K, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26.",
1310
1153
  // 6 s at fal's 1080p default.
1311
- cost: { usd: 0.78 },
1312
1154
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1313
1155
  },
1314
1156
  {
@@ -1317,34 +1159,18 @@ var MODEL_CATALOG = [
1317
1159
  modality: "video",
1318
1160
  task: "image-to-video",
1319
1161
  label: "LTX-2.5 Pro (image-to-video)",
1320
- description: "Lightricks LTX-2.5 Pro via fal; not served by KIE. A start frame and an optional end frame, 6, 8 or 10 s, 720p or 1080p, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26. $0.12 per second at 720p, $0.17 at 1080p.",
1162
+ description: "Lightricks LTX-2.5 Pro via fal; not served by KIE. A start frame and an optional end frame, 6, 8 or 10 s, 720p or 1080p, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26.",
1321
1163
  // 6 s at fal's 1080p default.
1322
- cost: { usd: 1.02 },
1323
1164
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1324
1165
  },
1325
1166
  // ── FLUX.3 (Black Forest Labs) ───────────────────────────────────────────
1326
- // One model, three tiers of the same three input shapes:
1327
- // draft $0.06/s, fixed 720p, plus a draft_cache bundle (preview)
1328
- // direct $0.17/s at 720p, $0.29/s at 1080p, one shot (finished)
1329
- // enhance $0.29/s, fixed 1080p, from the cache only (finished)
1330
- // Draft + enhance totals $0.35/s, a 21% premium over direct 1080p on a first-try
1331
- // keeper and cheaper from the second attempt on, which is exactly the
1332
- // generate-several-pick-one shape. Use direct when one confident render is
1333
- // enough or 720p is the deliverable; use draft + enhance when a human picks.
1334
- // The completion handler mirrors each draft's cache into Storage Brain, so an
1335
- // approval gate between the two can take as long as it needs (measured: the
1336
- // bundle is ~29 KB and fal enhances from a re-hosted copy, 2026-08-23).
1337
- // Different model owner than Seedance, so ByteDance partner moderation does
1338
- // not apply here. That changes which filter runs, and nothing about whether we
1339
- // hold the depicted person's consent.
1340
1167
  {
1341
1168
  id: "fal/flux-3-image-to-video-draft",
1342
1169
  provider: "fal",
1343
1170
  modality: "video",
1344
1171
  task: "image-to-video",
1345
1172
  label: "FLUX.3 draft (image-to-video)",
1346
- description: "Black Forest Labs FLUX.3 draft tier via fal. Single opening keyframe, duration auto or 5-20s, fixed 720p, audio ON by default (generate_audio). $0.06 per second of draft. Returns a draft_cache for a later full-quality enhance pass, which bills separately. Accepts no resolution, seed or negative prompt. PREVIEW QUALITY: do not ship a draft as a deliverable.",
1347
- cost: { usd: 0.3 },
1173
+ description: "Black Forest Labs FLUX.3 draft tier via fal. Single opening keyframe, duration auto or 5-20s, fixed 720p, audio ON by default (generate_audio). Returns a draft_cache for a later full-quality enhance pass, which bills separately. Accepts no resolution, seed or negative prompt. PREVIEW QUALITY: do not ship a draft as a deliverable.",
1348
1174
  capabilities: { needsImageInput: true, maxInputImages: 1, emitsDraftCache: true }
1349
1175
  },
1350
1176
  {
@@ -1353,8 +1179,7 @@ var MODEL_CATALOG = [
1353
1179
  modality: "video",
1354
1180
  task: "image-to-video",
1355
1181
  label: "FLUX.3 draft (first + last frame)",
1356
- description: "Black Forest Labs FLUX.3 draft tier via fal. Start AND end keyframe, duration 5-20s, fixed 720p, audio ON by default. $0.06 per second of draft, roughly a third of Kling 2.5 for the same two-keyframe shot. Note it names the start frame start_image_url, not image_url. Minimum 5s, so a 4s cut means rendering 5s and trimming. PREVIEW QUALITY: enhance before shipping.",
1357
- cost: { usd: 0.3 },
1182
+ description: "Black Forest Labs FLUX.3 draft tier via fal. Start AND end keyframe, duration 5-20s, fixed 720p, audio ON by default. Note it names the start frame start_image_url, not image_url. Minimum 5s, so a 4s cut means rendering 5s and trimming. PREVIEW QUALITY: enhance before shipping.",
1358
1183
  capabilities: { needsImageInput: true, maxInputImages: 2, emitsDraftCache: true, acceptsEndFrame: true }
1359
1184
  },
1360
1185
  {
@@ -1363,8 +1188,7 @@ var MODEL_CATALOG = [
1363
1188
  modality: "video",
1364
1189
  task: "image-to-video",
1365
1190
  label: "FLUX.3 draft (keyframes)",
1366
- description: "Black Forest Labs FLUX.3 draft tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, fixed 720p, audio ON by default. $0.06 per second of draft. The only endpoint here that expresses motion through more than two keyframes, so it can describe a pass-by or a multi-beat action that a first/last pair structurally cannot. Falls back to deriving two keyframes from the standard start/end inputs. PREVIEW QUALITY: enhance before shipping.",
1367
- cost: { usd: 0.3 },
1191
+ description: "Black Forest Labs FLUX.3 draft tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, fixed 720p, audio ON by default. The only endpoint here that expresses motion through more than two keyframes, so it can describe a pass-by or a multi-beat action that a first/last pair structurally cannot. Falls back to deriving two keyframes from the standard start/end inputs. PREVIEW QUALITY: enhance before shipping.",
1368
1192
  capabilities: { needsImageInput: true, maxInputImages: 10, emitsDraftCache: true, acceptsKeyframes: true }
1369
1193
  },
1370
1194
  {
@@ -1373,8 +1197,7 @@ var MODEL_CATALOG = [
1373
1197
  modality: "video",
1374
1198
  task: "image-to-video",
1375
1199
  label: "FLUX.3 (image-to-video)",
1376
- description: "Black Forest Labs FLUX.3 direct tier via fal. Single opening keyframe, duration auto or 5-20s, resolution 720p (default) or 1080p, audio ON by default. $0.17 per second at 720p, $0.29 at 1080p; the catalog usd anchors 5s at 720p. One-shot finished render, returns the seed. Use when one confident render is enough; for iterate-then-pick, draft + enhance is cheaper.",
1377
- cost: { usd: 0.85 },
1200
+ description: "Black Forest Labs FLUX.3 direct tier via fal. Single opening keyframe, duration auto or 5-20s, resolution 720p (default) or 1080p, audio ON by default. One-shot finished render, returns the seed.",
1378
1201
  capabilities: { needsImageInput: true, maxInputImages: 1 }
1379
1202
  },
1380
1203
  {
@@ -1383,8 +1206,7 @@ var MODEL_CATALOG = [
1383
1206
  modality: "video",
1384
1207
  task: "image-to-video",
1385
1208
  label: "FLUX.3 (first + last frame)",
1386
- description: "Black Forest Labs FLUX.3 direct tier via fal. Start AND end keyframe (start_image_url / end_image_url), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. $0.17 per second at 720p, $0.29 at 1080p; the catalog usd anchors 5s at 720p. Minimum 5s, so a 4s cut means rendering 5s and trimming. Finished quality, returns the seed.",
1387
- cost: { usd: 0.85 },
1209
+ description: "Black Forest Labs FLUX.3 direct tier via fal. Start AND end keyframe (start_image_url / end_image_url), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. Minimum 5s, so a 4s cut means rendering 5s and trimming. Finished quality, returns the seed.",
1388
1210
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
1389
1211
  },
1390
1212
  {
@@ -1393,8 +1215,7 @@ var MODEL_CATALOG = [
1393
1215
  modality: "video",
1394
1216
  task: "image-to-video",
1395
1217
  label: "FLUX.3 (keyframes)",
1396
- description: "Black Forest Labs FLUX.3 direct tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. $0.17 per second at 720p, $0.29 at 1080p; the catalog usd anchors 5s at 720p. Multi-beat actions and pass-bys that a first/last pair cannot express. Finished quality, returns the seed.",
1397
- cost: { usd: 0.85 },
1218
+ description: "Black Forest Labs FLUX.3 direct tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. Multi-beat actions and pass-bys that a first/last pair cannot express. Finished quality, returns the seed.",
1398
1219
  capabilities: { needsImageInput: true, maxInputImages: 10, acceptsKeyframes: true }
1399
1220
  },
1400
1221
  {
@@ -1403,8 +1224,7 @@ var MODEL_CATALOG = [
1403
1224
  modality: "video",
1404
1225
  task: "video-enhance",
1405
1226
  label: "FLUX.3 enhance (draft to 1080p)",
1406
- description: "Black Forest Labs FLUX.3 draft-enhance via fal. Input is ONLY the draft_cache of a FLUX.3 draft node (wire the draft node in; nothing else can be enhanced, only re-rendered). Renders the same take, same motion and composition, at a fixed 1080p with synchronized audio. $0.29 per second of enhanced video; the catalog usd anchors 5s. No prompt, duration, aspect or audio knobs (all baked into the cache); safety_tolerance only. Output has no seed or cache.",
1407
- cost: { usd: 1.45 },
1227
+ description: "Black Forest Labs FLUX.3 draft-enhance via fal. Input is ONLY the draft_cache of a FLUX.3 draft node (wire the draft node in; nothing else can be enhanced, only re-rendered). Renders the same take, same motion and composition, at a fixed 1080p with synchronized audio. No prompt, duration, aspect or audio knobs (all baked into the cache); safety_tolerance only. Output has no seed or cache.",
1408
1228
  capabilities: { needsImageInput: false, maxInputImages: 0 },
1409
1229
  isDefault: true
1410
1230
  },
@@ -1414,54 +1234,32 @@ var MODEL_CATALOG = [
1414
1234
  modality: "video",
1415
1235
  task: "text-to-video",
1416
1236
  label: "Seedance 1.0 Pro (text-to-video)",
1417
- description: "ByteDance Seedance 1.0 Pro via fal. Text-to-video; roughly $0.62 per 1080p 5s clip. Default text-to-video.",
1418
- cost: { usd: 0.62 },
1237
+ description: "ByteDance Seedance 1.0 Pro via fal. Text-to-video. Default text-to-video.",
1419
1238
  capabilities: { maxInputImages: 0 },
1420
1239
  isDefault: true
1421
1240
  },
1422
- // Video-to-video: Wan 2.2 Animate Replace swaps the person in a source video
1423
- // for the character in ONE reference image, keeping scene + motion. Priced
1424
- // per video second by resolution (fal pricing, vetted 2026-08-20): 480p $0.04,
1425
- // 580p $0.06, 720p $0.08. The catalog usd anchors a 5s clip at 720p, the same
1426
- // way Kling anchors its base clip; the provider scales by duration + resolution.
1427
- // Output is 50fps, 720p max. Only model for the task, so it is the default.
1428
1241
  {
1429
1242
  id: "fal/wan-animate-replace",
1430
1243
  provider: "fal",
1431
1244
  modality: "video",
1432
1245
  task: "video-to-video",
1433
1246
  label: "Wan 2.2 Animate Replace (video-to-video)",
1434
- description: "Wan 2.2 14B Animate Replace via fal. Replaces the person in a source video with the character from one reference image, preserving motion and scene. $0.04 (480p) / $0.06 (580p) / $0.08 (720p) per video second. Default video-to-video.",
1435
- cost: { usd: 0.4 },
1247
+ description: "Wan 2.2 14B Animate Replace via fal. Replaces the person in a source video with the character from one reference image, preserving motion and scene. Default video-to-video.",
1436
1248
  capabilities: { needsImageInput: true, maxInputImages: 1 },
1437
1249
  isDefault: true
1438
1250
  },
1439
- // Kling O3 Pro Edit (fal, July 2026): also keeps the source clip's motion, but
1440
- // takes the character as an ELEMENT of up to four images (a front view plus
1441
- // back and profile views, which a person seen from behind needs) and renders
1442
- // at the source resolution instead of Wan's 720p cap. $0.168 per output
1443
- // second at any resolution; the catalog usd anchors 5s like the Wan entry.
1444
- // Source clip 3 to 15 s, 720 to 3840 px, mp4 or mov (fal enforces).
1445
1251
  {
1446
1252
  id: "fal/kling-o3-edit",
1447
1253
  provider: "fal",
1448
1254
  modality: "video",
1449
1255
  task: "video-to-video",
1450
1256
  label: "Kling O3 Pro Edit (video-to-video)",
1451
- description: "Kuaishou Kling O3 Pro Edit via fal. Replaces the person in a source video (3 to 15 s) with a character given as up to four images: the first wire is the front view, the rest are further views such as back and profile. Keeps motion, audio and the source resolution. $0.168 per video second.",
1452
- cost: { usd: 0.84 },
1257
+ description: "Kuaishou Kling O3 Pro Edit via fal. Replaces the person in a source video (3 to 15 s) with a character given as up to four images: the first wire is the front view, the rest are further views such as back and profile. Keeps motion, audio and the source resolution.",
1453
1258
  // `resolutions: []`: it renders at the source's size and refuses a
1454
1259
  // resolution, so the settings panel offers none and validation refuses one.
1455
1260
  capabilities: { needsImageInput: true, maxInputImages: 4, resolutions: [] }
1456
1261
  },
1457
1262
  // ── fal.ai: vision + utility (B4) ──────────────────────────────────────
1458
- // All sync via fal's subscribe. Two return text/json (vision), two return a
1459
- // new image (upscale / background-remove). fal bills these per compute second
1460
- // and does NOT return a per-call cost, so the catalog usd is a UI hint only
1461
- // (the provider leaves costUsd undefined, same as an unknown image endpoint).
1462
- // Endpoint ids + schemas verified 2026-06-16 against the fal model /api pages.
1463
- // Modality stays `image` (these consume / produce images); one isDefault per
1464
- // (image, task) for the four new tasks.
1465
1263
  {
1466
1264
  id: "fal/florence-2-detailed-caption",
1467
1265
  provider: "fal",
@@ -1469,7 +1267,6 @@ var MODEL_CATALOG = [
1469
1267
  task: "image-to-text",
1470
1268
  label: "Florence-2 Detailed Caption (fal)",
1471
1269
  description: "Microsoft Florence-2 Large detailed caption via fal. Returns a rich text description of an image (caption -> job.output.text, no asset). Default image-to-text.",
1472
- cost: { usd: 3e-3 },
1473
1270
  capabilities: { needsImageInput: true, maxInputImages: 1 },
1474
1271
  isDefault: true
1475
1272
  },
@@ -1483,7 +1280,6 @@ var MODEL_CATALOG = [
1483
1280
  task: "video-to-text",
1484
1281
  label: "Motion record (Studio)",
1485
1282
  description: "Measures a clip's camera motion from its frames (phase correlation every 0.1 s: pan, tilt, dolly, steadiness, subject motion) and writes a deterministic description to job.output.text plus the full record to job.output.json. Runs in Studio, costs nothing. Default video-to-text.",
1486
- cost: { usd: 0 },
1487
1283
  isDefault: true
1488
1284
  },
1489
1285
  {
@@ -1493,17 +1289,9 @@ var MODEL_CATALOG = [
1493
1289
  task: "image-to-json",
1494
1290
  label: "MoonDreamNext VQA (fal)",
1495
1291
  description: "MoonDreamNext visual question answering via fal. Answers a prompt about an image; the provider parses the answer into structured JSON (-> job.output.json, no asset). Default image-to-json.",
1496
- cost: { usd: 3e-3 },
1497
1292
  capabilities: { needsImageInput: true, maxInputImages: 1 },
1498
1293
  isDefault: true
1499
1294
  },
1500
- // Judge (P3 J1). The same MoonDreamNext VQA endpoint `fal/moondream-next-vqa`
1501
- // above already runs shotReview.ts's ranking call, under a separate catalog
1502
- // id because a catalog entry's `task` is fixed and `listByTask('judge')`
1503
- // needs at least one entry to give a placed judge node a selectable default
1504
- // model. Not dispatched yet: `judge` runs as a human gate (`taskExecution`
1505
- // in task-kind.ts) and makes no model call at all until J5 wires the actual
1506
- // ranking back onto shotReview.ts rather than a second implementation.
1507
1295
  {
1508
1296
  id: "fal/moondream-next-vqa-judge",
1509
1297
  provider: "fal",
@@ -1511,22 +1299,16 @@ var MODEL_CATALOG = [
1511
1299
  task: "judge",
1512
1300
  label: "MoonDreamNext VQA (judge ranking)",
1513
1301
  description: "The judge node's ranking call: the same MoonDreamNext VQA endpoint shotReview.ts already uses to score a candidate image. A judge node runs as a human GATE (it parks the run on a decision, see taskExecution), so it has no job kind; this model is what P3 J5 will rank candidates with. Default judge.",
1514
- cost: { usd: 3e-3 },
1515
1302
  capabilities: { needsImageInput: true, maxInputImages: 1 },
1516
1303
  isDefault: true
1517
1304
  },
1518
- // Rig and animate (2026-09-26): Meshy on fal. One entry for both of fal's
1519
- // Meshy endpoints: a rig with no presets calls `fal-ai/meshy/rigging`, one
1520
- // with presets calls `fal-ai/meshy/rigging/multi-animation`, and the price
1521
- // rule is the same for both (models/pricing.ts `meshyRigCostUsd`).
1522
1305
  {
1523
1306
  id: "fal/meshy-rigging",
1524
1307
  provider: "fal",
1525
1308
  modality: "3d",
1526
1309
  task: "rig",
1527
1310
  label: "Meshy rig and animate (fal)",
1528
- description: "Adds a skeleton and skin weights to a humanoid mesh and applies up to 10 animation presets from Meshy's 678-preset library; walk and run clips are always included. $0.20 per rig plus $0.12 per preset. Humanoid characters only.",
1529
- cost: { usd: FAL_MESHY_RIG_USD },
1311
+ description: "Adds a skeleton and skin weights to a humanoid mesh and applies up to 10 animation presets from Meshy's 678-preset library; walk and run clips are always included. Humanoid characters only.",
1530
1312
  isDefault: true
1531
1313
  },
1532
1314
  {
@@ -1535,8 +1317,7 @@ var MODEL_CATALOG = [
1535
1317
  modality: "image",
1536
1318
  task: "upscale",
1537
1319
  label: "AuraSR Upscale (fal)",
1538
- description: "AuraSR GigaGAN upscaler via fal. Produces a higher-resolution Image asset from a source image (default 4x). Default upscale. Compute-second billed; catalog usd is a hint.",
1539
- cost: { usd: 0.01 },
1320
+ description: "AuraSR GigaGAN upscaler via fal. Produces a higher-resolution Image asset from a source image (default 4x). Default upscale.",
1540
1321
  capabilities: { needsImageInput: true, maxInputImages: 1 },
1541
1322
  isDefault: true
1542
1323
  },
@@ -1546,35 +1327,21 @@ var MODEL_CATALOG = [
1546
1327
  modality: "image",
1547
1328
  task: "background-remove",
1548
1329
  label: "BiRefNet v2 Background Removal (fal)",
1549
- description: "BiRefNet v2 background removal via fal. Produces a transparent-background PNG Image asset from a source image. Default background-remove. Compute-second billed; catalog usd is a hint.",
1550
- cost: { usd: 0.01 },
1330
+ description: "BiRefNet v2 background removal via fal. Produces a transparent-background PNG Image asset from a source image. Default background-remove.",
1551
1331
  capabilities: { needsImageInput: true, maxInputImages: 1 },
1552
1332
  isDefault: true
1553
1333
  },
1554
1334
  // ── audio: music via Suno-through-KIE (B2) ─────────────────────────────
1555
- // Async via KIE's Suno job API (createTask -> webhook / record-info poll).
1556
- // KIE does not return a per-song USD on the result, so the catalog usd is a
1557
- // flat per-song estimate (~$0.03-$0.04 per song per audio-providers.md, KIE's
1558
- // markup keeps it in that band). V5 is Suno's current top model.
1559
1335
  {
1560
1336
  id: "kie/suno-v5",
1561
1337
  provider: "kie",
1562
1338
  modality: "audio",
1563
1339
  task: "text-to-audio",
1564
1340
  label: "Suno V5 (KIE)",
1565
- description: "Suno V5 music generation via KIE. Text-to-music with or without lyrics; ~4 min cap per generation. Default text-to-audio. No IP indemnity (KIE aggregator). KIE's site now features Suno v5.5 and no longer lists a V5 price (checked 2026-09-27), so the $0.04 is an unverified hint.",
1566
- cost: { usd: 0.04 },
1567
- listPrice: { source: "unrecorded" },
1341
+ description: "Suno V5 music generation via KIE. Text-to-music with or without lyrics; ~4 min cap per generation. Default text-to-audio. No IP indemnity (KIE aggregator).",
1568
1342
  isDefault: true
1569
1343
  },
1570
1344
  // ── audio: voice via ElevenLabs (B2) ───────────────────────────────────
1571
- // Sync against the official ElevenLabs API (xi-api-key). TTS returns audio
1572
- // bytes inline; STT returns a transcript (text, not a binary asset). Prices
1573
- // per ElevenLabs API price page (checked 2026-09-27): text-to-speech
1574
- // Multilingual v2 is $0.10 per 1,000 characters (not about $0.0003 per
1575
- // character). Scribe v1 is no longer on the price page; Scribe v2 is $0.22
1576
- // per audio hour. The catalog usd is a per-call hint, the provider does not
1577
- // bill per call so cost stays approximate.
1578
1345
  {
1579
1346
  id: "elevenlabs/tts-multilingual-v2",
1580
1347
  provider: "elevenlabs",
@@ -1582,7 +1349,6 @@ var MODEL_CATALOG = [
1582
1349
  task: "text-to-speech",
1583
1350
  label: "ElevenLabs Multilingual v2 (TTS)",
1584
1351
  description: "ElevenLabs Multilingual v2 text-to-speech. 99+ languages, brand-voice cloning capable. Default text-to-speech. Returns mp3 bytes synchronously.",
1585
- cost: { usd: 0.03 },
1586
1352
  isDefault: true
1587
1353
  },
1588
1354
  {
@@ -1592,28 +1358,16 @@ var MODEL_CATALOG = [
1592
1358
  task: "speech-to-text",
1593
1359
  label: "ElevenLabs Scribe v1 (STT)",
1594
1360
  description: "ElevenLabs Scribe v1 speech-to-text. Whisper-class transcription; returns a transcript (text), not a binary asset. Default speech-to-text.",
1595
- cost: { usd: 0.01 },
1596
1361
  isDefault: true
1597
1362
  },
1598
1363
  // ── text: LLM director (B3) ────────────────────────────────────────────
1599
- // The director's brain, NOT an asset-generation path: prompt improvement and
1600
- // shot descriptions via a synchronous TextClient (no Jobs, no Assets). KIE
1601
- // exposes Claude (Sonnet / Opus) at a lower rate than the official API via an
1602
- // Anthropic-Messages-compatible endpoint (api.kie.ai/claude/v1/messages,
1603
- // vetted 2026-06-16); OpenRouter routes the same Claude family through its
1604
- // OpenAI chat/completions surface and returns the authoritative usage.cost.
1605
- // KIE / OpenRouter report real cost per call, so the catalog usd is a UI hint.
1606
- // Exactly one isDefault for (text, text-generation): KIE Sonnet (cheapest
1607
- // reliable director path with no IP-indemnity concern for internal use).
1608
1364
  {
1609
1365
  id: "kie/claude-sonnet-4-5",
1610
1366
  provider: "kie",
1611
1367
  modality: "text",
1612
1368
  task: "text-generation",
1613
1369
  label: "Claude Sonnet 4.5 (KIE)",
1614
- description: "Anthropic Claude Sonnet 4.5 via KIE (Anthropic Messages API at a lower rate). Default LLM director: prompt improvement + shot descriptions. Cost billed per token; catalog usd is a hint.",
1615
- cost: { usd: 0.01 },
1616
- listPrice: { source: "unrecorded" },
1370
+ description: "Anthropic Claude Sonnet 4.5 via KIE. Default LLM director: prompt improvement + shot descriptions.",
1617
1371
  isDefault: true
1618
1372
  },
1619
1373
  {
@@ -1622,9 +1376,7 @@ var MODEL_CATALOG = [
1622
1376
  modality: "text",
1623
1377
  task: "text-generation",
1624
1378
  label: "Claude Opus 4.5 (KIE)",
1625
- description: "Anthropic Claude Opus 4.5 via KIE. Higher quality, higher cost; use for harder director reasoning. Cost billed per token; catalog usd is a hint.",
1626
- cost: { usd: 0.05 },
1627
- listPrice: { source: "unrecorded" }
1379
+ description: "Anthropic Claude Opus 4.5 via KIE. Higher quality; use for harder director reasoning."
1628
1380
  },
1629
1381
  {
1630
1382
  id: "openrouter/claude-sonnet-4-6",
@@ -1632,25 +1384,15 @@ var MODEL_CATALOG = [
1632
1384
  modality: "text",
1633
1385
  task: "text-generation",
1634
1386
  label: "Claude Sonnet 4.6 (OpenRouter)",
1635
- description: "Anthropic Claude Sonnet 4.6 via OpenRouter (OpenAI chat/completions shape). Alternative director path; returns authoritative usage.cost per request.",
1636
- cost: { usd: 0.012 }
1637
- },
1638
- // The prompt-improve models (2026-09-27). Marlin asked for a more capable
1639
- // model than the default director for the Improve button. On his real
1640
- // image-edit prompt ("make her look a bit like a red panda, cartoonish, like
1641
- // from Disney") GPT-6 Astra was the only one of five that kept the "a bit":
1642
- // a light transformation that keeps her recognizable, at about $0.011 per
1643
- // rewrite in 6 s. Claude Opus 5.5 wrote the richest detail ($0.012, 9.5 s)
1644
- // and is Astra's fallback from a different vendor. Costs are that measured
1645
- // call; OpenRouter bills the real usage.cost.
1387
+ description: "Anthropic Claude Sonnet 4.6 via OpenRouter (OpenAI chat/completions shape). Alternative director path; returns authoritative usage.cost per request."
1388
+ },
1646
1389
  {
1647
1390
  id: "openrouter/gpt-6-astra",
1648
1391
  provider: "openrouter",
1649
1392
  modality: "text",
1650
1393
  task: "text-generation",
1651
1394
  label: "GPT-6 Astra (OpenRouter)",
1652
- description: "OpenAI GPT-6 Astra, the flagship of the GPT-6 series, via OpenRouter. Writes the Improve rewrites: the most faithful to the intent of a rough prompt in a five-model comparison on 2026-09-27. $10 per million input and $50 per million output tokens, about $0.011 per rewrite.",
1653
- cost: { usd: 0.011 }
1395
+ description: "OpenAI GPT-6 Astra, the flagship of the GPT-6 series, via OpenRouter. Writes the Improve rewrites: the most faithful to the intent of a rough prompt in a five-model comparison on 2026-09-27."
1654
1396
  },
1655
1397
  {
1656
1398
  id: "openrouter/claude-opus-5-5",
@@ -1658,8 +1400,7 @@ var MODEL_CATALOG = [
1658
1400
  modality: "text",
1659
1401
  task: "text-generation",
1660
1402
  label: "Claude Opus 5.5 (OpenRouter)",
1661
- description: "Anthropic Claude Opus 5.5 via OpenRouter. The fallback for GPT-6 Astra on Improve, from a different vendor so one outage cannot break it. $4 per million input and $20 per million output tokens, about $0.012 per rewrite.",
1662
- cost: { usd: 0.012 }
1403
+ description: "Anthropic Claude Opus 5.5 via OpenRouter. The fallback for GPT-6 Astra on Improve, from a different vendor so one outage cannot break it."
1663
1404
  },
1664
1405
  // ── Vertex AI: fallback path, kept unwired for v0.1 ────────────────────
1665
1406
  // Provider code is still in place so a future flip back is one isDefault
@@ -1689,20 +1430,30 @@ var MODEL_CATALOG = [
1689
1430
  description: "Vertex AI direct, newest flash variant. Global region. Preview status."
1690
1431
  }
1691
1432
  ];
1433
+ var PINNED_FAL_NOTE = "Pinned to fal: a job on this entry never goes to KIE.";
1434
+ var PINNED_KIE_NOTE = "Pinned to KIE: no fal fallback. Pick the automatic entry of this model to get one.";
1435
+ function withRouteNote(entry) {
1436
+ const role = routeRoleOf(entry.id);
1437
+ if (!role) return entry;
1438
+ const note = role.role === "fallback" ? PINNED_FAL_NOTE : PINNED_KIE_NOTE;
1439
+ return { ...entry, description: `${entry.description ?? ""} ${note}`.trim() };
1440
+ }
1441
+ var MODEL_CATALOG = CATALOG_ENTRIES.map(withRouteNote);
1692
1442
  var routeEntries = /* @__PURE__ */ new Map();
1693
1443
  function routeEntry(id) {
1694
1444
  const cached = routeEntries.get(id);
1695
1445
  if (cached) return cached;
1696
1446
  const route = getRoute(id);
1697
- const primary = route ? MODEL_CATALOG.find((m) => m.id === route.primary) : void 0;
1447
+ const primary = route ? CATALOG_ENTRIES.find((m) => m.id === route.primary) : void 0;
1698
1448
  if (!route || !primary) return void 0;
1699
1449
  const entry = {
1700
1450
  ...primary,
1701
- // A route is never the default of its task (that is slice 3's switch).
1451
+ // Whether a route is the default of its task is `getDefaultModelId`'s
1452
+ // answer, never a flag copied from its KIE side.
1702
1453
  isDefault: void 0,
1703
1454
  id: route.id,
1704
1455
  label: route.label,
1705
- description: `Runs on KIE first and, when KIE fails on its side, again on fal with the same settings. ${primary.description ?? ""}`.trim()
1456
+ description: `Runs on KIE first and, when KIE fails on its side, again on fal with the same settings. ` + `To keep a job off KIE, pin the fal entry of this model. ${primary.description ?? ""}`.trim()
1706
1457
  };
1707
1458
  routeEntries.set(id, entry);
1708
1459
  return entry;
@@ -1710,937 +1461,7 @@ function routeEntry(id) {
1710
1461
  function tryGetModel(id) {
1711
1462
  return MODEL_CATALOG.find((m) => m.id === id) ?? routeEntry(id);
1712
1463
  }
1713
- var ROWS = [
1714
- [0, "Idle", "DailyActions", "Idle"],
1715
- [1, "Walking_Woman", "WalkAndRun", "Walking"],
1716
- [2, "Alert", "DailyActions", "LookingAround"],
1717
- [3, "Arise", "DailyActions", "LookingAround"],
1718
- [4, "Attack", "Fighting", "AttackingwithWeapon"],
1719
- [5, "BackLeft_run", "WalkAndRun", "Running"],
1720
- [6, "BackRight_Run", "WalkAndRun", "Running"],
1721
- [7, "BeHit_FlyUp", "Fighting", "GettingHit"],
1722
- [8, "Dead", "Fighting", "Dying"],
1723
- [9, "ForwardLeft_Run_Fight", "Fighting", "Transitioning"],
1724
- [10, "ForwardRight_Run_Fight", "Fighting", "Transitioning"],
1725
- [11, "Idle_02", "DailyActions", "Idle"],
1726
- [12, "Idle_03", "DailyActions", "Idle"],
1727
- [13, "Jump_Run", "WalkAndRun", "Running"],
1728
- [14, "Run_02", "WalkAndRun", "Running"],
1729
- [15, "Run_03", "WalkAndRun", "Running"],
1730
- [16, "RunFast", "WalkAndRun", "Running"],
1731
- [17, "Skill_01", "BodyMovements", "Acting"],
1732
- [18, "Skill_02", "BodyMovements", "Acting"],
1733
- [19, "Skill_03", "BodyMovements", "Acting"],
1734
- [20, "Walk_Fight_Back", "WalkAndRun", "Walking"],
1735
- [21, "Walk_Fight_Forward", "WalkAndRun", "Walking"],
1736
- [22, "FunnyDancing_01", "Dancing", "Dancing"],
1737
- [23, "FunnyDancing_02", "Dancing", "Dancing"],
1738
- [24, "FunnyDancing_03", "Dancing", "Dancing"],
1739
- [25, "Agree_Gesture", "DailyActions", "Interacting"],
1740
- [26, "Angry_Stomp", "DailyActions", "Interacting"],
1741
- [27, "Big_Heart_Gesture", "BodyMovements", "Acting"],
1742
- [28, "Big_Wave_Hello", "DailyActions", "Interacting"],
1743
- [29, "Call_Gesture", "BodyMovements", "Acting"],
1744
- [30, "Casual_Walk", "WalkAndRun", "Walking"],
1745
- [31, "Catching_Breath", "BodyMovements", "Acting"],
1746
- [32, "Chair_Sit_Idle_F", "DailyActions", "Idle"],
1747
- [33, "Chair_Sit_Idle_M", "DailyActions", "Idle"],
1748
- [34, "Checkout_Gesture", "DailyActions", "Interacting"],
1749
- [35, "Clapping_Run", "BodyMovements", "Acting"],
1750
- [36, "Confused_Scratch", "DailyActions", "Idle"],
1751
- [37, "Discuss_While_Moving", "DailyActions", "Interacting"],
1752
- [38, "Dozing_Elderly", "DailyActions", "Idle"],
1753
- [39, "Excited_Walk_F", "BodyMovements", "Acting"],
1754
- [40, "Excited_Walk_M", "BodyMovements", "Acting"],
1755
- [41, "Formal_Bow", "DailyActions", "Interacting"],
1756
- [42, "Gentlemans_Bow", "DailyActions", "Interacting"],
1757
- [43, "Handbag_Walk", "BodyMovements", "Acting"],
1758
- [44, "Happy_jump_f", "BodyMovements", "Acting"],
1759
- [45, "Indoor_Play", "BodyMovements", "Acting"],
1760
- [46, "Jump_Rope", "BodyMovements", "Acting"],
1761
- [47, "Listening_Gesture", "DailyActions", "Interacting"],
1762
- [48, "Mirror_Viewing", "DailyActions", "Idle"],
1763
- [49, "Motivational_Cheer", "DailyActions", "Interacting"],
1764
- [50, "Phone_Call_Gesture", "DailyActions", "Interacting"],
1765
- [51, "Shouting_Angrily", "BodyMovements", "Acting"],
1766
- [52, "Sit_to_Stand_Transition_F", "DailyActions", "Transitioning"],
1767
- [53, "Sit_to_Stand_Transition_M", "DailyActions", "Transitioning"],
1768
- [54, "Squat_Stance", "Dancing", "Dancing"],
1769
- [55, "Stage_Walk", "WalkAndRun", "Walking"],
1770
- [56, "Stand_and_Chat", "DailyActions", "Interacting"],
1771
- [57, "Stand_to_Sit_Transition_M", "DailyActions", "Transitioning"],
1772
- [58, "Step_to_Sit_Transition", "DailyActions", "Transitioning"],
1773
- [59, "Victory_Cheer", "BodyMovements", "Acting"],
1774
- [60, "Walk_to_Sit", "DailyActions", "Transitioning"],
1775
- [61, "happy_jump_m", "BodyMovements", "Acting"],
1776
- [62, "penguin_walk", "BodyMovements", "Acting"],
1777
- [63, "Arm_Circle_Shuffle", "Dancing", "Dancing"],
1778
- [64, "All_Night_Dance", "Dancing", "Dancing"],
1779
- [65, "Bass_Beats", "Dancing", "Dancing"],
1780
- [66, "Boom_Dance", "Dancing", "Dancing"],
1781
- [67, "Bubble_Dance", "Dancing", "Dancing"],
1782
- [68, "Cherish_Pop_Dance", "Dancing", "Dancing"],
1783
- [69, "Crystal_Beads", "Dancing", "Dancing"],
1784
- [70, "Cardio_Dance", "Dancing", "Dancing"],
1785
- [71, "Denim_Pop_Dance", "Dancing", "Dancing"],
1786
- [72, "Dont_You_Dare", "Dancing", "Dancing"],
1787
- [73, "Fast_Lightning", "Dancing", "Dancing"],
1788
- [74, "Gangnam_Groove", "Dancing", "Dancing"],
1789
- [75, "Indoor_Swing", "Dancing", "Dancing"],
1790
- [76, "Love_You_Pop_Dance", "Dancing", "Dancing"],
1791
- [77, "Magic_Genie", "Dancing", "Dancing"],
1792
- [78, "Not_Your_Mom", "Dancing", "Dancing"],
1793
- [79, "OMG_Groove", "Dancing", "Dancing"],
1794
- [80, "Pop_Dance_LSA2", "Dancing", "Dancing"],
1795
- [81, "Pod_Baby_Groove", "Dancing", "Dancing"],
1796
- [82, "Shake_It_Off_Dance", "Dancing", "Dancing"],
1797
- [83, "Superlove_Pop_Dance", "Dancing", "Dancing"],
1798
- [84, "You_Groove", "Dancing", "Dancing"],
1799
- [85, "Axe_Stance", "Fighting", "Transitioning"],
1800
- [86, "Basic_Jump", "Fighting", "AttackingwithWeapon"],
1801
- [87, "Boxing_Practice", "Fighting", "Punching"],
1802
- [88, "Chest_Pound_Taunt", "Fighting", "Transitioning"],
1803
- [89, "Combat_Stance", "Fighting", "AttackingwithWeapon"],
1804
- [90, "Counterstrike", "Fighting", "Punching"],
1805
- [91, "Double_Blade_Spin", "Fighting", "AttackingwithWeapon"],
1806
- [92, "Double_Combo_Attack", "Fighting", "AttackingwithWeapon"],
1807
- [93, "Dodge_and_Counter", "Fighting", "Punching"],
1808
- [94, "Flying_Fist_Kick", "Fighting", "Punching"],
1809
- [95, "Gun_Hold_Left_Turn", "Fighting", "AttackingwithWeapon"],
1810
- [96, "Kung_Fu_Punch", "Fighting", "Punching"],
1811
- [97, "Left_Slash", "Fighting", "AttackingwithWeapon"],
1812
- [98, "Run_and_Shoot", "Fighting", "AttackingwithWeapon"],
1813
- [99, "Reaping_Swing", "Fighting", "Transitioning"],
1814
- [100, "Rightward_Spin", "Fighting", "Transitioning"],
1815
- [101, "Sword_Shout", "BodyMovements", "Acting"],
1816
- [102, "Sword_Judgment", "Fighting", "AttackingwithWeapon"],
1817
- [103, "Simple_Kick", "Fighting", "AttackingwithWeapon"],
1818
- [104, "Side_Shot", "Fighting", "AttackingwithWeapon"],
1819
- [105, "Triple_Combo_Attack", "Fighting", "AttackingwithWeapon"],
1820
- [106, "Confident_Walk", "WalkAndRun", "Walking"],
1821
- [107, "Confident_Strut", "WalkAndRun", "Walking"],
1822
- [108, "Flirty_Strut", "WalkAndRun", "Walking"],
1823
- [109, "Groovy_Walk", "BodyMovements", "Acting"],
1824
- [110, "Hello_Run", "WalkAndRun", "Running"],
1825
- [111, "Injured_Walk", "WalkAndRun", "Walking"],
1826
- [112, "Monster_Walk", "WalkAndRun", "Walking"],
1827
- [113, "Mummy_Stagger", "BodyMovements", "Acting"],
1828
- [114, "Proud_Strut", "WalkAndRun", "Walking"],
1829
- [115, "Quick_Walk", "WalkAndRun", "Walking"],
1830
- [116, "Run_to_Walk_Transition", "WalkAndRun", "Walking"],
1831
- [117, "Red_Carpet_Walk", "WalkAndRun", "Walking"],
1832
- [118, "Skip_Forward", "WalkAndRun", "Walking"],
1833
- [119, "Slow_Orc_Walk", "WalkAndRun", "Walking"],
1834
- [120, "Touch_and_Run", "WalkAndRun", "Running"],
1835
- [121, "Thoughtful_Walk", "WalkAndRun", "Walking"],
1836
- [122, "Texting_Walk", "WalkAndRun", "Walking"],
1837
- [123, "Unsteady_Walk", "WalkAndRun", "Walking"],
1838
- [124, "Walking_with_Phone", "WalkAndRun", "Walking"],
1839
- [125, "Charged_Spell_Cast", "Fighting", "CastingSpell"],
1840
- [126, "Charged_Spell_Cast_1", "Fighting", "CastingSpell"],
1841
- [127, "Charged_Ground_Slam", "Fighting", "CastingSpell"],
1842
- [128, "Heavy_Hammer_Swing", "Fighting", "AttackingwithWeapon"],
1843
- [129, "mage_soell_cast", "Fighting", "CastingSpell"],
1844
- [130, "mage_soell_cast_1", "Fighting", "CastingSpell"],
1845
- [131, "mage_soell_cast_2", "Fighting", "CastingSpell"],
1846
- [132, "mage_soell_cast_3", "Fighting", "CastingSpell"],
1847
- [133, "mage_soell_cast_4", "Fighting", "CastingSpell"],
1848
- [134, "mage_soell_cast_5", "Fighting", "CastingSpell"],
1849
- [135, "mage_soell_cast_6", "Fighting", "CastingSpell"],
1850
- [136, "mage_soell_cast_7", "Fighting", "CastingSpell"],
1851
- [137, "mage_soell_cast_8", "Fighting", "CastingSpell"],
1852
- [138, "Block1", "Fighting", "Blocking"],
1853
- [139, "Block2", "Fighting", "Blocking"],
1854
- [140, "Block3", "Fighting", "Blocking"],
1855
- [141, "Block4", "Fighting", "Blocking"],
1856
- [142, "Block5", "Fighting", "Blocking"],
1857
- [143, "Block6", "Fighting", "Blocking"],
1858
- [144, "Block8", "Fighting", "Blocking"],
1859
- [145, "Block9", "Fighting", "Blocking"],
1860
- [146, "Block10", "Fighting", "Blocking"],
1861
- [147, "Sword_Parry", "Fighting", "Blocking"],
1862
- [148, "Sword_Parry_Backward", "Fighting", "Blocking"],
1863
- [149, "Two_Handed_Parry", "Fighting", "Blocking"],
1864
- [150, "Hit_Reaction_with_Bow", "Fighting", "Blocking"],
1865
- [151, "Sword_Parry_Backward_1", "Fighting", "Blocking"],
1866
- [152, "Sword_Parry_Backward_2", "Fighting", "Blocking"],
1867
- [153, "Sword_Parry_Backward_3", "Fighting", "Blocking"],
1868
- [154, "Sword_Parry_Backward_4", "Fighting", "Blocking"],
1869
- [155, "Sword_Parry_Backward_5", "Fighting", "Blocking"],
1870
- [156, "Stand_Dodge", "Fighting", "Transitioning"],
1871
- [157, "Stand_Dodge_1", "Fighting", "Transitioning"],
1872
- [158, "Roll_Dodge", "Fighting", "Transitioning"],
1873
- [159, "Roll_Dodge_1", "Fighting", "Transitioning"],
1874
- [160, "Roll_Dodge_2", "Fighting", "Transitioning"],
1875
- [161, "Roll_Dodge_3", "Fighting", "Transitioning"],
1876
- [162, "Stand_Dodge_2", "Fighting", "Transitioning"],
1877
- [163, "Roll_Dodge_4", "Fighting", "Transitioning"],
1878
- [164, "Stand_Dodge_3", "Fighting", "Transitioning"],
1879
- [165, "Kneeling_Reload", "Fighting", "Transitioning"],
1880
- [166, "Running_Reload", "Fighting", "Transitioning"],
1881
- [167, "Slow_Walk_Reload", "Fighting", "Transitioning"],
1882
- [168, "Prone_Reload", "Fighting", "Transitioning"],
1883
- [169, "Forward_Reload_Subtle", "Fighting", "Transitioning"],
1884
- [170, "Standing_Reload", "Fighting", "Transitioning"],
1885
- [171, "Hit_Reaction_to_Waist", "Fighting", "Transitioning"],
1886
- [172, "Electrocution_Reaction", "Fighting", "GettingHit"],
1887
- [173, "Slap_Reaction", "Fighting", "GettingHit"],
1888
- [174, "Face_Punch_Reaction", "Fighting", "GettingHit"],
1889
- [175, "Face_Punch_Reaction_1", "Fighting", "GettingHit"],
1890
- [176, "Face_Punch_Reaction_2", "Fighting", "GettingHit"],
1891
- [177, "Gunshot_Reaction", "Fighting", "GettingHit"],
1892
- [178, "Hit_Reaction", "Fighting", "GettingHit"],
1893
- [179, "Hit_Reaction_1", "Fighting", "GettingHit"],
1894
- [180, "Shot_in_the_Back_and_Fall", "Fighting", "GettingHit"],
1895
- [181, "Electrocuted_Fall", "Fighting", "Dying"],
1896
- [182, "Shot_and_Blown_Back", "Fighting", "Dying"],
1897
- [183, "Shot_and_Fall_Backward", "Fighting", "Dying"],
1898
- [184, "Shot_and_Fall_Forward", "Fighting", "Dying"],
1899
- [185, "Shot_and_Slow_Fall_Backward", "Fighting", "Dying"],
1900
- [186, "Strangled_and_Fall_Forward", "Fighting", "Dying"],
1901
- [187, "Knock_Down", "Fighting", "Dying"],
1902
- [188, "Fall_Dead_from_Abdominal_Injury", "Fighting", "Dying"],
1903
- [189, "dying_backwards", "Fighting", "Dying"],
1904
- [190, "Knock_Down_1", "Fighting", "Dying"],
1905
- [191, "Left_Jab_from_Guard", "Fighting", "Punching"],
1906
- [192, "Right_Jab_from_Guard", "Fighting", "Punching"],
1907
- [193, "Left_Hook_from_Guard", "Fighting", "Punching"],
1908
- [194, "Right_Uppercut_from_Guard", "Fighting", "Punching"],
1909
- [195, "Right_Upper_Hook_from_Guard", "Fighting", "Punching"],
1910
- [196, "Left_Uppercut_from_Guard", "Fighting", "Punching"],
1911
- [197, "Left_Short_Hook_from_Guard", "Fighting", "Punching"],
1912
- [198, "Punch_Combo", "Fighting", "Punching"],
1913
- [199, "Weapon_Combo", "Fighting", "Punching"],
1914
- [200, "Punch_Combo_1", "Fighting", "Punching"],
1915
- [201, "Punch_Combo_2", "Fighting", "Punching"],
1916
- [202, "Weapon_Combo_1", "Fighting", "Punching"],
1917
- [203, "Punch_Combo_3", "Fighting", "Punching"],
1918
- [204, "Punch_Combo_4", "Fighting", "Punching"],
1919
- [205, "Punch_Combo_5", "Fighting", "Punching"],
1920
- [206, "Spartan_Kick", "Fighting", "Punching"],
1921
- [207, "Roundhouse_Kick", "Fighting", "Punching"],
1922
- [208, "Lunge_Roundhouse_Kick", "Fighting", "Punching"],
1923
- [209, "Boxing_Guard_Right_Straight_Kick", "Fighting", "Punching"],
1924
- [210, "Boxing_Guard_Prep_Straight_Punch", "Fighting", "Punching"],
1925
- [211, "Boxing_Guard_Step_Knee_Strike", "Fighting", "Punching"],
1926
- [212, "Elbow_Strike", "Fighting", "Punching"],
1927
- [213, "Leg_Sweep", "Fighting", "Punching"],
1928
- [214, "Punch_Forward_with_Both_Fists", "Fighting", "Punching"],
1929
- [215, "High_Kick", "Fighting", "Punching"],
1930
- [216, "Lunge_Spin_Kick", "Fighting", "Punching"],
1931
- [217, "Sweeping_Kick", "Fighting", "Punching"],
1932
- [218, "Step_in_High_Kick", "Fighting", "Punching"],
1933
- [219, "Right_Hand_Sword_Slash", "Fighting", "Punching"],
1934
- [220, "Shield_Push_Left", "Fighting", "Punching"],
1935
- [221, "Charged_Upward_Slash", "Fighting", "Punching"],
1936
- [222, "Draw_and_Shoot_from_Back", "Fighting", "AttackingwithWeapon"],
1937
- [223, "Draw_and_Shoot_from_Back_1", "Fighting", "AttackingwithWeapon"],
1938
- [224, "Archery_Shot", "Fighting", "AttackingwithWeapon"],
1939
- [225, "Archery_Shot_1", "Fighting", "AttackingwithWeapon"],
1940
- [226, "Archery_Shot_2", "Fighting", "AttackingwithWeapon"],
1941
- [227, "Archery_Shot_3", "Fighting", "AttackingwithWeapon"],
1942
- [228, "Walk_Forward_with_Bow_Aimed", "Fighting", "AttackingwithWeapon"],
1943
- [229, "Draw_and_Shoot_from_Back_2", "Fighting", "AttackingwithWeapon"],
1944
- [230, "Walk_Backward_with_Bow_Aimed", "Fighting", "AttackingwithWeapon"],
1945
- [231, "Archery_Aim_with_Lateral_Scan", "Fighting", "AttackingwithWeapon"],
1946
- [232, "Cowboy_Quick_Draw_Shooting", "Fighting", "AttackingwithWeapon"],
1947
- [233, "Walk_Backward_While_Shooting", "Fighting", "AttackingwithWeapon"],
1948
- [234, "Walk_Forward_While_Shooting", "Fighting", "AttackingwithWeapon"],
1949
- [235, "Forward_Roll_and_Fire", "Fighting", "AttackingwithWeapon"],
1950
- [236, "Draw_and_Shoot_Left", "Fighting", "AttackingwithWeapon"],
1951
- [237, "Charged_Axe_Chop", "Fighting", "AttackingwithWeapon"],
1952
- [238, "Axe_Spin_Attack", "Fighting", "AttackingwithWeapon"],
1953
- [239, "Crouch_Pull_and_Throw", "Fighting", "AttackingwithWeapon"],
1954
- [240, "Thrust_Slash", "Fighting", "AttackingwithWeapon"],
1955
- [241, "Weapon_Combo_2", "Fighting", "AttackingwithWeapon"],
1956
- [242, "Charged_Slash", "Fighting", "AttackingwithWeapon"],
1957
- [243, "Idle_3", "DailyActions", "Idle"],
1958
- [244, "Idle_4", "DailyActions", "Idle"],
1959
- [245, "Idle_5", "DailyActions", "Idle"],
1960
- [246, "Idle_6", "DailyActions", "Idle"],
1961
- [247, "Idle_7", "DailyActions", "Idle"],
1962
- [248, "Idle_8", "DailyActions", "Idle"],
1963
- [249, "Idle_9", "DailyActions", "Idle"],
1964
- [250, "Idle_10", "DailyActions", "Idle"],
1965
- [251, "Idle_11", "DailyActions", "Idle"],
1966
- [252, "Idle_12", "DailyActions", "Idle"],
1967
- [253, "Idle_13", "DailyActions", "Idle"],
1968
- [254, "Idle_14", "DailyActions", "Idle"],
1969
- [255, "Angry_Ground_Stomp", "DailyActions", "Idle"],
1970
- [256, "Angry_Ground_Stomp_1", "DailyActions", "Idle"],
1971
- [257, "Angry_Ground_Stomp_2", "DailyActions", "Idle"],
1972
- [258, "CrouchLookAroundBow", "DailyActions", "Idle"],
1973
- [259, "Step_Forward_and_Push", "DailyActions", "Pushing"],
1974
- [260, "Push_Forward_and_Stop", "DailyActions", "Pushing"],
1975
- [261, "Push_and_Walk_Forward", "DailyActions", "Pushing"],
1976
- [262, "Crouch_and_Push_Forward", "DailyActions", "Pushing"],
1977
- [263, "Sleep_on_Desk", "DailyActions", "Sleeping"],
1978
- [264, "Cough_While_Sleeping", "DailyActions", "Sleeping"],
1979
- [265, "Groan_Holding_Stomach_in_Sleep", "DailyActions", "Sleeping"],
1980
- [266, "Lie_Down_Hands_Spread", "DailyActions", "Sleeping"],
1981
- [267, "Sleep_Normally", "DailyActions", "Sleeping"],
1982
- [268, "Sit_and_Doze_Off", "DailyActions", "Sleeping"],
1983
- [269, "sleep", "DailyActions", "Sleeping"],
1984
- [270, "Toss_and_Turn", "DailyActions", "Sleeping"],
1985
- [271, "Wake_Up_and_Look_Up", "DailyActions", "Sleeping"],
1986
- [272, "Lie_on_Chair_Sunbathe_and_Sleep", "DailyActions", "Sleeping"],
1987
- [273, "Male_Run_Forward_Pick_Up_Left", "DailyActions", "PickingUpItem"],
1988
- [274, "Female_Crouch_Pick_Up_Place_Side", "DailyActions", "PickingUpItem"],
1989
- [275, "Female_Run_Forward_Pick_Up_Right", "DailyActions", "PickingUpItem"],
1990
- [276, "Male_Bend_Over_Pick_Up", "DailyActions", "PickingUpItem"],
1991
- [277, "Female_Crouch_Pick_Fruit_Basket_Stand", "DailyActions", "PickingUpItem"],
1992
- [278, "Female_Stand_Pick_Fruit_Basket", "DailyActions", "PickingUpItem"],
1993
- [279, "Female_Crouch_Pick_Gun_Point_Forward", "DailyActions", "PickingUpItem"],
1994
- [280, "Female_Crouch_Pick_Throw_Forward", "DailyActions", "PickingUpItem"],
1995
- [281, "Female_Bend_Over_Pick_Up_Inspect", "DailyActions", "PickingUpItem"],
1996
- [282, "Female_Walk_Pick_Put_In_Pocket", "DailyActions", "PickingUpItem"],
1997
- [283, "Pull_Radish", "DailyActions", "PickingUpItem"],
1998
- [284, "Collect_Object", "DailyActions", "PickingUpItem"],
1999
- [285, "open_door", "DailyActions", "Interacting"],
2000
- [286, "open_door_1", "DailyActions", "Interacting"],
2001
- [287, "open_door_2", "DailyActions", "Interacting"],
2002
- [288, "open_door_3", "DailyActions", "Interacting"],
2003
- [289, "open_door_4", "DailyActions", "Interacting"],
2004
- [290, "Wave_One_Hand", "DailyActions", "Interacting"],
2005
- [291, "Wave_for_Help", "DailyActions", "Interacting"],
2006
- [292, "Gesture_with_Hand_on_Gun", "DailyActions", "Interacting"],
2007
- [293, "Wave_for_Help_1", "DailyActions", "Interacting"],
2008
- [294, "Wave_for_Help_2", "DailyActions", "Interacting"],
2009
- [295, "Wave_for_Help_3", "DailyActions", "Interacting"],
2010
- [296, "Wave_for_Help_4", "DailyActions", "Interacting"],
2011
- [297, "Personalized_Gesture", "DailyActions", "Interacting"],
2012
- [298, "Cheer_with_Both_Hands_Up", "DailyActions", "Interacting"],
2013
- [299, "Stand_Clap_and_Sit_Down", "DailyActions", "Interacting"],
2014
- [300, "Sit_Cheer_with_Left_Hand", "DailyActions", "Interacting"],
2015
- [301, "Cheer_with_Both_Hands_1", "DailyActions", "Interacting"],
2016
- [302, "Stand_Wave_and_Sit_Down", "DailyActions", "Interacting"],
2017
- [303, "Cheer_with_Both_Hands", "DailyActions", "Interacting"],
2018
- [304, "Seated_Fist_Pump", "DailyActions", "Interacting"],
2019
- [305, "Stand_Cheer_and_Sit_Down", "DailyActions", "Interacting"],
2020
- [306, "Cheer_with_One_Hand_Up", "DailyActions", "Interacting"],
2021
- [307, "Sitting_Answering_Questions", "DailyActions", "Interacting"],
2022
- [308, "Talk_Passionately", "DailyActions", "Interacting"],
2023
- [309, "Talk_with_Left_Hand_on_Hip", "DailyActions", "Interacting"],
2024
- [310, "Talk_with_Left_Hand_Raised", "DailyActions", "Interacting"],
2025
- [311, "Stand_Talking_Angry", "DailyActions", "Interacting"],
2026
- [312, "Phone_Conversation", "DailyActions", "Interacting"],
2027
- [313, "Talk_with_Hands_Open", "DailyActions", "Interacting"],
2028
- [314, "Talk_with_Right_Hand_Open", "DailyActions", "Interacting"],
2029
- [315, "Hand_on_Hip_Gesture", "DailyActions", "Interacting"],
2030
- [316, "Headache_Relief", "DailyActions", "Interacting"],
2031
- [317, "Shrug", "DailyActions", "Interacting"],
2032
- [318, "Scheming_Hand_Rub", "DailyActions", "Interacting"],
2033
- [319, "air_squat", "DailyActions", "WorkingOut"],
2034
- [320, "bicep_curl", "DailyActions", "WorkingOut"],
2035
- [321, "bicycle_crunch", "DailyActions", "WorkingOut"],
2036
- [322, "circle_crunch", "DailyActions", "WorkingOut"],
2037
- [323, "golf_drive", "DailyActions", "WorkingOut"],
2038
- [324, "idle_to_push_up", "DailyActions", "WorkingOut"],
2039
- [325, "jump_push_up", "DailyActions", "WorkingOut"],
2040
- [326, "jumping_jacks", "DailyActions", "WorkingOut"],
2041
- [327, "kettlebell_swing", "DailyActions", "WorkingOut"],
2042
- [328, "push_up_to_idle", "DailyActions", "WorkingOut"],
2043
- [329, "push_up", "DailyActions", "WorkingOut"],
2044
- [330, "situps", "DailyActions", "WorkingOut"],
2045
- [331, "Sumo_High_Pull", "DailyActions", "WorkingOut"],
2046
- [333, "Look_Around_Dumbfounded", "DailyActions", "LookingAround"],
2047
- [334, "Lower_Weapon_Look_Raise", "DailyActions", "LookingAround"],
2048
- [335, "Axe_Breathe_and_Look_Around", "DailyActions", "LookingAround"],
2049
- [336, "Long_Breathe_and_Look_Around", "DailyActions", "LookingAround"],
2050
- [337, "Torch_Look_Around", "DailyActions", "LookingAround"],
2051
- [338, "Short_Breathe_and_Look_Around", "DailyActions", "LookingAround"],
2052
- [339, "Walking_Scan_with_Sudden_Look_Back", "DailyActions", "LookingAround"],
2053
- [340, "Crawl_and_Look_Back", "DailyActions", "LookingAround"],
2054
- [341, "Walk_Slowly_and_Look_Around", "DailyActions", "LookingAround"],
2055
- [342, "Stand_and_Drink", "DailyActions", "Drinking"],
2056
- [343, "Sit_and_Drink", "DailyActions", "Drinking"],
2057
- [344, "Stand_Up1", "DailyActions", "Transitioning"],
2058
- [345, "Stand_Up2", "DailyActions", "Transitioning"],
2059
- [346, "Stand_Up3", "DailyActions", "Transitioning"],
2060
- [347, "Stand_Up4", "DailyActions", "Transitioning"],
2061
- [348, "Stand_Up5", "DailyActions", "Transitioning"],
2062
- [349, "Stand_Up6", "DailyActions", "Transitioning"],
2063
- [350, "Stand_Up7", "DailyActions", "Transitioning"],
2064
- [351, "Stand_Up8", "DailyActions", "Transitioning"],
2065
- [352, "Stand_Up9", "DailyActions", "Transitioning"],
2066
- [353, "Stand_Up10", "DailyActions", "Transitioning"],
2067
- [354, "Sitting_Clap", "DailyActions", "Transitioning"],
2068
- [355, "Sit_Finger_Wag_No", "DailyActions", "Transitioning"],
2069
- [356, "Sit_Hands_on_Head_Lean_Back", "DailyActions", "Transitioning"],
2070
- [357, "Sit_Thumbs_Up_Right", "DailyActions", "Transitioning"],
2071
- [358, "Sit_Shout_Hands_on_Mouth", "DailyActions", "Transitioning"],
2072
- [359, "Look_Back_and_Sit", "DailyActions", "Transitioning"],
2073
- [360, "Sit_to_standTransition_Female_2", "DailyActions", "Transitioning"],
2074
- [361, "Sit_Dodge", "DailyActions", "Transitioning"],
2075
- [362, "Sit_Cross_Legged", "DailyActions", "Transitioning"],
2076
- [363, "Sit_Cross_Legged_on_Floor", "DailyActions", "Transitioning"],
2077
- [364, "Sit_on_Chair_Arms_Crossed", "DailyActions", "Transitioning"],
2078
- [365, "Kneel_on_One_Knee_and_Stand", "DailyActions", "Transitioning"],
2079
- [366, "falling_down", "DailyActions", "Transitioning"],
2080
- [367, "SideLying_Reach_Help", "DailyActions", "Transitioning"],
2081
- [368, "Angry_To_Tantrum_Sit", "DailyActions", "Transitioning"],
2082
- [369, "Lie_Back_Leg_Swing", "DailyActions", "Transitioning"],
2083
- [370, "Stand_To_Side_Lying", "DailyActions", "Transitioning"],
2084
- [371, "Sit_Lie_Bed", "DailyActions", "Transitioning"],
2085
- [372, "Prone_Reach_Help", "DailyActions", "Transitioning"],
2086
- [375, "Handstand_Flip", "BodyMovements", "Acting"],
2087
- [376, "Punch_Pose", "BodyMovements", "Acting"],
2088
- [377, "Relax_arms_then_strike_battle_pose", "BodyMovements", "Acting"],
2089
- [378, "Large_step_then_high_kick", "BodyMovements", "Acting"],
2090
- [379, "Side_jumps_in_horse_stance", "BodyMovements", "Acting"],
2091
- [381, "Step_Right_for_Exercise", "BodyMovements", "Acting"],
2092
- [382, "Jump_and_Slam_Back_Down", "BodyMovements", "Acting"],
2093
- [384, "Quick_Step_and_Spin_Dodge", "BodyMovements", "Acting"],
2094
- [385, "Boxing_Warmup", "BodyMovements", "Acting"],
2095
- [386, "Zombie_Scream", "BodyMovements", "Acting"],
2096
- [387, "Half_Squat_with_Thumb_Up", "BodyMovements", "Acting"],
2097
- [388, "Show_Both_Arm_Muscles", "BodyMovements", "Acting"],
2098
- [389, "Grip_and_Throw_Down", "BodyMovements", "Acting"],
2099
- [390, "Stand_on_Pole_and_Balance", "BodyMovements", "Acting"],
2100
- [391, "Head_Hold_in_Pain", "BodyMovements", "Acting"],
2101
- [392, "Ground_Flip_and_Sweep_Up", "BodyMovements", "Acting"],
2102
- [393, "baseball_pitching", "BodyMovements", "Acting"],
2103
- [394, "Backflip_and_Hooks", "BodyMovements", "Acting"],
2104
- [395, "Breakdance_1990", "BodyMovements", "Acting"],
2105
- [396, "Burpee_Exercise", "BodyMovements", "Acting"],
2106
- [397, "360_Power_Spin_Jump", "BodyMovements", "Acting"],
2107
- [398, "Crouch_Charge_and_Throw", "BodyMovements", "Acting"],
2108
- [399, "Step_Step_Turn_Kick", "BodyMovements", "Acting"],
2109
- [401, "Sprint_Roll_and_Flip", "BodyMovements", "Acting"],
2110
- [402, "Run_and_Leap", "BodyMovements", "Acting"],
2111
- [403, "Victory_Fist_Pump", "BodyMovements", "Acting"],
2112
- [404, "Crouch_and_Step_Back", "BodyMovements", "Acting"],
2113
- [405, "Joyful_Dance_with_Hand_Sway", "BodyMovements", "Acting"],
2114
- [406, "Thomas_Flair_to_Jump_Up", "BodyMovements", "Acting"],
2115
- [407, "Wall_Push_Jump_and_Flip", "BodyMovements", "Acting"],
2116
- [408, "Jazz_Hands", "BodyMovements", "Acting"],
2117
- [409, "Finger_Wag_No", "BodyMovements", "Acting"],
2118
- [410, "Kick_a_Soccer_Ball", "BodyMovements", "Acting"],
2119
- [411, "Neck_Slashing_Gesture", "BodyMovements", "Acting"],
2120
- [412, "victory", "BodyMovements", "Acting"],
2121
- [413, "Backflip_and_Rise", "BodyMovements", "Acting"],
2122
- [414, "Double_kick_forward", "BodyMovements", "Acting"],
2123
- [415, "Happy_Sway_Standing", "BodyMovements", "Acting"],
2124
- [416, "Hit_in_Back_While_Running", "BodyMovements", "Acting"],
2125
- [417, "Hop_with_Arms_Raised", "BodyMovements", "Acting"],
2126
- [419, "Jump_to_Catch_and_Fall", "BodyMovements", "Acting"],
2127
- [420, "Left_Hand_Bitten_Step_Back", "BodyMovements", "Acting"],
2128
- [421, "Over_Shoulder_Throw", "BodyMovements", "Acting"],
2129
- [422, "Rising_Flying_Kick", "BodyMovements", "Acting"],
2130
- [425, "Vault_with_Rifle", "BodyMovements", "VaultingOverObstacle"],
2131
- [426, "Roll_Behind_Cover", "BodyMovements", "VaultingOverObstacle"],
2132
- [427, "Vault_and_Land", "BodyMovements", "VaultingOverObstacle"],
2133
- [428, "Unarmed_Vault", "BodyMovements", "VaultingOverObstacle"],
2134
- [429, "Parkour_Vault", "BodyMovements", "VaultingOverObstacle"],
2135
- [430, "Parkour_Vault_with_Roll", "BodyMovements", "VaultingOverObstacle"],
2136
- [431, "Parkour_Vault_1", "BodyMovements", "VaultingOverObstacle"],
2137
- [432, "Parkour_Vault_2", "BodyMovements", "VaultingOverObstacle"],
2138
- [433, "Parkour_Vault_3", "BodyMovements", "VaultingOverObstacle"],
2139
- [434, "Fast_Ladder_Climb", "BodyMovements", "Climbing"],
2140
- [435, "Ladder_Climb_Finish", "BodyMovements", "Climbing"],
2141
- [436, "Ladder_Mount_Start", "BodyMovements", "Climbing"],
2142
- [437, "Slow_Ladder_Climb", "BodyMovements", "Climbing"],
2143
- [438, "Ladder_Climb_Loop", "BodyMovements", "Climbing"],
2144
- [439, "Climb_Left_with_Both_Limbs", "BodyMovements", "Climbing"],
2145
- [440, "Climb_Right_with_Both_Limbs", "BodyMovements", "Climbing"],
2146
- [441, "Climb_Stairs", "BodyMovements", "Climbing"],
2147
- [442, "Fast_Stair_Climb", "BodyMovements", "Climbing"],
2148
- [444, "climbing_up_wall", "BodyMovements", "Climbing"],
2149
- [445, "diagonal_wall_run", "BodyMovements", "Climbing"],
2150
- [446, "Hang_and_Climb_Left", "BodyMovements", "Climbing"],
2151
- [447, "Hang_and_Climb_Rght", "BodyMovements", "Climbing"],
2152
- [448, "Jump_and_Grab_Wall", "BodyMovements", "Climbing"],
2153
- [449, "Climb_Up_Rope", "BodyMovements", "Climbing"],
2154
- [450, "Wall_Flip", "BodyMovements", "PerformingStunt"],
2155
- [451, "One_Arm_Handstand", "BodyMovements", "PerformingStunt"],
2156
- [452, "Backflip", "BodyMovements", "PerformingStunt"],
2157
- [453, "Backflip_Sweep_Kick", "BodyMovements", "PerformingStunt"],
2158
- [455, "Sweep_Kick", "BodyMovements", "PerformingStunt"],
2159
- [456, "Jumping_Head_Scissor_Takedown", "BodyMovements", "PerformingStunt"],
2160
- [457, "Jumping_Punch", "BodyMovements", "PerformingStunt"],
2161
- [458, "Unicycle_Jump_Dismount", "BodyMovements", "PerformingStunt"],
2162
- [459, "Run_Jump_and_Roll", "BodyMovements", "PerformingStunt"],
2163
- [460, "Jump_with_Arms_Open", "BodyMovements", "Jumping"],
2164
- [461, "Jump_with_Arms_and_Legs_Open", "BodyMovements", "Jumping"],
2165
- [462, "Backflip_Jump", "BodyMovements", "Jumping"],
2166
- [463, "Run_and_Jump", "BodyMovements", "Jumping"],
2167
- [464, "Leap_and_Punch", "BodyMovements", "Jumping"],
2168
- [465, "Leap_Right_and_Catch", "BodyMovements", "Jumping"],
2169
- [466, "Regular_Jump", "BodyMovements", "Jumping"],
2170
- [467, "Jump_Over_Obstacle_2", "BodyMovements", "Jumping"],
2171
- [468, "Back_Jump", "BodyMovements", "Jumping"],
2172
- [470, "Jumping_Down", "BodyMovements", "Jumping"],
2173
- [471, "Jump_Over_Obstacle", "BodyMovements", "Jumping"],
2174
- [472, "Jump_Over_Obstacle_1", "BodyMovements", "Jumping"],
2175
- [473, "Quad_Jump_Left", "BodyMovements", "HangingfromLedge"],
2176
- [474, "Quad_Jump_Up", "BodyMovements", "HangingfromLedge"],
2177
- [475, "Quad_Climb_Right", "BodyMovements", "HangingfromLedge"],
2178
- [476, "Hang_and_Push_with_Foot", "BodyMovements", "HangingfromLedge"],
2179
- [477, "Rope_Hang_Idle", "BodyMovements", "HangingfromLedge"],
2180
- [478, "Bar_Hang_Idle", "BodyMovements", "HangingfromLedge"],
2181
- [479, "Upside_Down_Rope_Hang", "BodyMovements", "HangingfromLedge"],
2182
- [480, "Upside_Down_Rope_Hang_1", "BodyMovements", "HangingfromLedge"],
2183
- [481, "Upside_Down_Rope_Hang_2", "BodyMovements", "HangingfromLedge"],
2184
- [482, "Grab_Wall_Midair_Idle", "BodyMovements", "HangingfromLedge"],
2185
- [483, "Slow_Bar_Hang_Left", "BodyMovements", "HangingfromLedge"],
2186
- [484, "Slow_Bar_Hang_Right", "BodyMovements", "HangingfromLedge"],
2187
- [485, "Jump_and_Hang_on_Bar", "BodyMovements", "HangingfromLedge"],
2188
- [486, "Wall_Support_to_Step_Down", "BodyMovements", "HangingfromLedge"],
2189
- [487, "Climb_Attempt_and_Fall_3", "BodyMovements", "FallingFreely"],
2190
- [488, "Climb_Attempt_and_Fall_4", "BodyMovements", "FallingFreely"],
2191
- [489, "Climb_Attempt_and_Fall_5", "BodyMovements", "FallingFreely"],
2192
- [490, "Fall_Down", "BodyMovements", "HangingfromLedge"],
2193
- [491, "Fall_from_Bar", "BodyMovements", "HangingfromLedge"],
2194
- [492, "Wall_Support_Jump_to_Ground", "BodyMovements", "HangingfromLedge"],
2195
- [493, "Jump_Down_from_Wall", "BodyMovements", "HangingfromLedge"],
2196
- [494, "Swing_on_Rope_to_Ground", "BodyMovements", "HangingfromLedge"],
2197
- [495, "Grab_Bar_and_Swing_Forward", "BodyMovements", "HangingfromLedge"],
2198
- [496, "Rope_Hang_Backflip_to_Crouch", "BodyMovements", "HangingfromLedge"],
2199
- [497, "climbing_down_wall", "BodyMovements", "Climbing"],
2200
- [498, "Climb_Attempt_and_Fall", "BodyMovements", "FallingFreely"],
2201
- [499, "Climb_Attempt_and_Fall_1", "BodyMovements", "FallingFreely"],
2202
- [500, "Climb_Attempt_and_Fall_2", "BodyMovements", "FallingFreely"],
2203
- [501, "Leap_of_Faith", "BodyMovements", "FallingFreely"],
2204
- [502, "Fall1", "BodyMovements", "FallingFreely"],
2205
- [503, "Fall2", "BodyMovements", "FallingFreely"],
2206
- [504, "Fall3", "BodyMovements", "FallingFreely"],
2207
- [505, "Fall4", "BodyMovements", "FallingFreely"],
2208
- [506, "Dive_Down_and_Land", "BodyMovements", "FallingFreely"],
2209
- [507, "Dive_Down_and_Land_1", "BodyMovements", "FallingFreely"],
2210
- [508, "Dive_Down_and_Land_2", "BodyMovements", "FallingFreely"],
2211
- [509, "Lean_Forward_Sprint", "WalkAndRun", "Running"],
2212
- [510, "Standard_Forward_Charge", "WalkAndRun", "Running"],
2213
- [511, "Rifle_Charge", "WalkAndRun", "Running"],
2214
- [512, "Male_Head_Down_Charge", "WalkAndRun", "Running"],
2215
- [513, "Female_Head_Down_Charge", "WalkAndRun", "Running"],
2216
- [514, "Female_Bow_Charge_Left_Hand", "WalkAndRun", "Running"],
2217
- [515, "Female_Throwing_Stance_Charge", "WalkAndRun", "Running"],
2218
- [516, "slide_light", "WalkAndRun", "Running"],
2219
- [517, "slide_right", "WalkAndRun", "Running"],
2220
- [518, "sliding_rool", "WalkAndRun", "Running"],
2221
- [519, "sliding_stumble", "WalkAndRun", "Running"],
2222
- [520, "Crouch_Walk_with_Torch", "WalkAndRun", "CrouchWalking"],
2223
- [521, "Crouch_Walk_Left_with_Torch", "WalkAndRun", "CrouchWalking"],
2224
- [522, "Crouch_Walk_Right_with_Torch", "WalkAndRun", "CrouchWalking"],
2225
- [523, "Cautious_Crouch_Walk_Backward", "WalkAndRun", "CrouchWalking"],
2226
- [524, "Cautious_Crouch_Walk_Forward", "WalkAndRun", "CrouchWalking"],
2227
- [525, "Cautious_Crouch_Walk_Left", "WalkAndRun", "CrouchWalking"],
2228
- [526, "Cautious_Crouch_Walk_Right", "WalkAndRun", "CrouchWalking"],
2229
- [527, "Crouch_Walk_Left_with_Gun", "WalkAndRun", "CrouchWalking"],
2230
- [528, "Walk_Left_with_Gun", "WalkAndRun", "CrouchWalking"],
2231
- [529, "Walk_Backward_with_Gun", "WalkAndRun", "CrouchWalking"],
2232
- [530, "run_fast_3", "WalkAndRun", "Running"],
2233
- [531, "Sprint_and_Sudden_Stop", "WalkAndRun", "Running"],
2234
- [532, "run_fast_4", "WalkAndRun", "Running"],
2235
- [533, "run_fast_5", "WalkAndRun", "Running"],
2236
- [534, "run_fast_6", "WalkAndRun", "Running"],
2237
- [535, "run_fast_7", "WalkAndRun", "Running"],
2238
- [536, "run_fast_8", "WalkAndRun", "Running"],
2239
- [537, "run_fast_9", "WalkAndRun", "Running"],
2240
- [538, "run_fast_10", "WalkAndRun", "Running"],
2241
- [539, "run_fast_2", "WalkAndRun", "Running"],
2242
- [540, "Injured_Walk_Backward", "WalkAndRun", "Walking"],
2243
- [541, "Walk_Backward_with_Gun_1", "WalkAndRun", "Walking"],
2244
- [542, "Walk_Backward_with_Grenade", "WalkAndRun", "Walking"],
2245
- [543, "Step_Back", "WalkAndRun", "Walking"],
2246
- [544, "Walk_Backward", "WalkAndRun", "Walking"],
2247
- [545, "Walk_Backward_with_Bow", "WalkAndRun", "Walking"],
2248
- [546, "Walk_Backward_with_Sword", "WalkAndRun", "Walking"],
2249
- [547, "Walk_Backward_with_Bow_1", "WalkAndRun", "Walking"],
2250
- [548, "Walk_Backward_with_Sword_Shield", "WalkAndRun", "Walking"],
2251
- [549, "Crawl_Backward", "WalkAndRun", "Walking"],
2252
- [550, "Carry_Heavy_Cannon_Forward", "WalkAndRun", "Walking"],
2253
- [551, "Carry_Heavy_Object_Walk", "WalkAndRun", "Walking"],
2254
- [552, "Carry_Water_Bucket_Walk", "WalkAndRun", "Walking"],
2255
- [553, "Elderly_Shaky_Walk", "WalkAndRun", "Walking"],
2256
- [554, "Funky_Walk", "WalkAndRun", "Walking"],
2257
- [555, "Limping_Walk_1", "WalkAndRun", "Walking"],
2258
- [556, "Limping_Walk_2", "WalkAndRun", "Walking"],
2259
- [557, "Limping_Walk_3", "WalkAndRun", "Walking"],
2260
- [558, "Limping_Walk", "WalkAndRun", "Walking"],
2261
- [559, "Sneaky_Walk", "WalkAndRun", "Walking"],
2262
- [560, "Spear_Walk", "WalkAndRun", "Walking"],
2263
- [561, "Step_Hip_Hop_Dance", "WalkAndRun", "Walking"],
2264
- [562, "Stumble_Walk", "WalkAndRun", "Walking"],
2265
- [563, "Stylish_Walk", "WalkAndRun", "Walking"],
2266
- [564, "Tightrope_Walk", "WalkAndRun", "Walking"],
2267
- [565, "Walk_with_Umbrella", "WalkAndRun", "Walking"],
2268
- [566, "walking_2", "WalkAndRun", "Walking"],
2269
- [567, "Walk_with_Walker_Support", "WalkAndRun", "Walking"],
2270
- [568, "Swim_Idle", "WalkAndRun", "Swimming"],
2271
- [569, "Swim_Forward", "WalkAndRun", "Swimming"],
2272
- [570, "swimming_to_edge", "WalkAndRun", "Swimming"],
2273
- [571, "Run_Turn_Left", "WalkAndRun", "TurningAround"],
2274
- [572, "Walk_Turn_Left", "WalkAndRun", "TurningAround"],
2275
- [573, "Rifle_Turn_Left", "WalkAndRun", "TurningAround"],
2276
- [574, "Walk_Turn_Left_with_Weapon", "WalkAndRun", "TurningAround"],
2277
- [575, "Combat_Idle_Turn_Left", "WalkAndRun", "TurningAround"],
2278
- [576, "Idle_Turn_Left", "WalkAndRun", "TurningAround"],
2279
- [577, "Idle_Step_Turn_Left", "WalkAndRun", "TurningAround"],
2280
- [578, "Idle_Torch_Turn_Left", "WalkAndRun", "TurningAround"],
2281
- [579, "Depressed_Full_Turn_Left", "WalkAndRun", "TurningAround"],
2282
- [580, "Sword_and_Shield_Alert_Turn_Left", "WalkAndRun", "TurningAround"],
2283
- [581, "Run_Sharp_Turn_Right", "WalkAndRun", "TurningAround"],
2284
- [582, "Run_Turn_Right", "WalkAndRun", "TurningAround"],
2285
- [583, "Walk_Turn_Right", "WalkAndRun", "TurningAround"],
2286
- [584, "Walk_Turn_Right_Female", "WalkAndRun", "TurningAround"],
2287
- [585, "Rifle_Aim_Turn_Right", "WalkAndRun", "TurningAround"],
2288
- [586, "Idle_Turn_Right", "WalkAndRun", "TurningAround"],
2289
- [587, "Walk_Turn_Right_Idle_Style", "WalkAndRun", "TurningAround"],
2290
- [588, "Frustrated_Turn_Right", "WalkAndRun", "TurningAround"],
2291
- [589, "Alert_Quick_Turn_Right", "WalkAndRun", "TurningAround"],
2292
- [590, "Sword_and_Shield_Alert_Turn_Right", "WalkAndRun", "TurningAround"],
2293
- [591, "Hip_Hop_Dance", "Dancing", "Dancing"],
2294
- [592, "Hip_Hop_Dance_1", "Dancing", "Dancing"],
2295
- [593, "Hip_Hop_Dance_2", "Dancing", "Dancing"],
2296
- [594, "Hip_Hop_Dance_3", "Dancing", "Dancing"],
2297
- [595, "jazz_danc", "Dancing", "Dancing"],
2298
- [596, "ymca_dance", "Dancing", "Dancing"],
2299
- [597, "Hip_Hop_Dance_4", "Dancing", "Dancing"],
2300
- [598, "kettlebell_swing_1", "DailyActions", "WorkingOut"],
2301
- [599, "Idle_15", "DailyActions", "Idle"],
2302
- [601, "Backflip_inplace", "BodyMovements", "PerformingStunt"],
2303
- [604, "Backflip_Sweep_Kick_inplace", "BodyMovements", "PerformingStunt"],
2304
- [605, "Back_Jump_inplace", "BodyMovements", "Jumping"],
2305
- [606, "BackLeft_run_inplace", "WalkAndRun", "Running"],
2306
- [607, "BackRight_Run_inplace", "WalkAndRun", "Running"],
2307
- [608, "BeHit_FlyUp_inplace", "Fighting", "GettingHit"],
2308
- [609, "Boxing_Practice_inplace", "Fighting", "Punching"],
2309
- [610, "Carry_Heavy_Cannon_Forward_inplace", "WalkAndRun", "Walking"],
2310
- [611, "Carry_Heavy_Object_Walk_inplace", "WalkAndRun", "Walking"],
2311
- [612, "Carry_Water_Bucket_Walk_inplace", "WalkAndRun", "Walking"],
2312
- [613, "Casual_Walk_inplace", "WalkAndRun", "Walking"],
2313
- [615, "Cautious_Crouch_Walk_Backward_inplace", "WalkAndRun", "CrouchWalking"],
2314
- [616, "Cautious_Crouch_Walk_Forward_inplace", "WalkAndRun", "CrouchWalking"],
2315
- [617, "Cautious_Crouch_Walk_Left_inplace", "WalkAndRun", "CrouchWalking"],
2316
- [618, "Cautious_Crouch_Walk_Right_inplace", "WalkAndRun", "CrouchWalking"],
2317
- [619, "Climb_Left_with_Both_Limbs_inplace", "BodyMovements", "Climbing"],
2318
- [620, "Climb_Right_with_Both_Limbs_inplace", "BodyMovements", "Climbing"],
2319
- [621, "Confident_Strut_inplace", "WalkAndRun", "Walking"],
2320
- [622, "Crawl_Backward_inplace", "WalkAndRun", "Walking"],
2321
- [623, "Crouch_Walk_Left_with_Gun_inplace", "WalkAndRun", "CrouchWalking"],
2322
- [624, "Crouch_Walk_Left_with_Torch_inplace", "WalkAndRun", "CrouchWalking"],
2323
- [625, "Crouch_Walk_Right_with_Torch_inplace", "WalkAndRun", "CrouchWalking"],
2324
- [626, "Elderly_Shaky_Walk_inplace", "WalkAndRun", "Walking"],
2325
- [627, "Female_Bow_Charge_Left_Hand_inplace", "WalkAndRun", "Running"],
2326
- [628, "Female_Throwing_Stance_Charge_inplace", "WalkAndRun", "Running"],
2327
- [629, "Flirty_Strut_inplace", "WalkAndRun", "Walking"],
2328
- [630, "ForwardLeft_Run_Fight_inplace", "Fighting", "Transitioning"],
2329
- [631, "ForwardRight_Run_Fight_inplace", "Fighting", "Transitioning"],
2330
- [632, "Funky_Walk_inplace", "WalkAndRun", "Walking"],
2331
- [635, "Handbag_Walk_inplace", "BodyMovements", "Acting"],
2332
- [636, "Hello_Run_inplace", "WalkAndRun", "Running"],
2333
- [637, "Injured_Walk_inplace", "WalkAndRun", "Walking"],
2334
- [638, "Injured_Walk_Backward_inplace", "WalkAndRun", "Walking"],
2335
- [639, "Jazz_Hands_inplace", "BodyMovements", "Acting"],
2336
- [640, "Jump_Over_Obstacle_inplace", "BodyMovements", "Jumping"],
2337
- [641, "Jump_Over_Obstacle_1_inplace", "BodyMovements", "Jumping"],
2338
- [642, "Jump_Over_Obstacle_2_inplace", "BodyMovements", "Jumping"],
2339
- [643, "Jump_Run_inplace", "WalkAndRun", "Running"],
2340
- [644, "Lean_Forward_Sprint_inplace", "WalkAndRun", "Running"],
2341
- [645, "Limping_Walk_inplace", "WalkAndRun", "Walking"],
2342
- [646, "Limping_Walk_1_inplace", "WalkAndRun", "Walking"],
2343
- [647, "Limping_Walk_2_inplace", "WalkAndRun", "Walking"],
2344
- [648, "Limping_Walk_3_inplace", "WalkAndRun", "Walking"],
2345
- [649, "Lunge_Roundhouse_Kick_inplace", "Fighting", "Punching"],
2346
- [650, "Mummy_Stagger_inplace", "BodyMovements", "Acting"],
2347
- [651, "Parkour_Vault_with_Roll_inplace", "BodyMovements", "VaultingOverObstacle"],
2348
- [652, "Proud_Strut_inplace", "WalkAndRun", "Walking"],
2349
- [653, "Red_Carpet_Walk_inplace", "WalkAndRun", "Walking"],
2350
- [654, "Rifle_Charge_inplace", "WalkAndRun", "Running"],
2351
- [656, "Run_and_Leap_inplace", "BodyMovements", "Acting"],
2352
- [657, "run_fast_10_inplace", "WalkAndRun", "Running"],
2353
- [658, "run_fast_2_inplace", "WalkAndRun", "Running"],
2354
- [659, "run_fast_3_inplace", "WalkAndRun", "Running"],
2355
- [660, "run_fast_4_inplace", "WalkAndRun", "Running"],
2356
- [661, "run_fast_5_inplace", "WalkAndRun", "Running"],
2357
- [662, "run_fast_6_inplace", "WalkAndRun", "Running"],
2358
- [663, "run_fast_7_inplace", "WalkAndRun", "Running"],
2359
- [664, "run_fast_8_inplace", "WalkAndRun", "Running"],
2360
- [665, "run_fast_9_inplace", "WalkAndRun", "Running"],
2361
- [666, "Running_Reload_inplace", "Fighting", "Transitioning"],
2362
- [667, "Run_to_Walk_Transition_inplace", "WalkAndRun", "Walking"],
2363
- [668, "Skip_Forward_inplace", "WalkAndRun", "Walking"],
2364
- [669, "Slow_Orc_Walk_inplace", "WalkAndRun", "Walking"],
2365
- [670, "Slow_Walk_Reload_inplace", "Fighting", "Transitioning"],
2366
- [671, "Sneaky_Walk_inplace", "WalkAndRun", "Walking"],
2367
- [672, "Spear_Walk_inplace", "WalkAndRun", "Walking"],
2368
- [673, "Standard_Forward_Charge_inplace", "WalkAndRun", "Running"],
2369
- [674, "Stumble_Walk_inplace", "WalkAndRun", "Walking"],
2370
- [675, "Stylish_Walk_inplace", "WalkAndRun", "Walking"],
2371
- [676, "Texting_Walk_inplace", "WalkAndRun", "Walking"],
2372
- [677, "Tightrope_Walk_inplace", "WalkAndRun", "Walking"],
2373
- [678, "Unsteady_Walk_inplace", "WalkAndRun", "Walking"],
2374
- [679, "Walk_Backward_inplace", "WalkAndRun", "Walking"],
2375
- [680, "Walk_Backward_While_Shooting_inplace", "Fighting", "AttackingwithWeapon"],
2376
- [681, "Walk_Backward_with_Bow_inplace", "WalkAndRun", "Walking"],
2377
- [682, "Walk_Backward_with_Bow_1_inplace", "WalkAndRun", "Walking"],
2378
- [683, "Walk_Backward_with_Bow_Aimed_inplace", "Fighting", "AttackingwithWeapon"],
2379
- [684, "Walk_Backward_with_Grenade_inplace", "WalkAndRun", "Walking"],
2380
- [685, "Walk_Backward_with_Gun_inplace", "WalkAndRun", "CrouchWalking"],
2381
- [686, "Walk_Backward_with_Gun_1_inplace", "WalkAndRun", "Walking"],
2382
- [687, "Walk_Backward_with_Sword_inplace", "WalkAndRun", "Walking"],
2383
- [688, "Walk_Fight_Back_inplace", "WalkAndRun", "Walking"],
2384
- [689, "Walk_Fight_Forward_inplace", "WalkAndRun", "Walking"],
2385
- [690, "Walk_Forward_While_Shooting_inplace", "Fighting", "AttackingwithWeapon"],
2386
- [691, "Walk_Forward_with_Bow_Aimed_inplace", "Fighting", "AttackingwithWeapon"],
2387
- [692, "walking_2_inplace", "WalkAndRun", "Walking"],
2388
- [693, "Walking_with_Phone_inplace", "WalkAndRun", "Walking"],
2389
- [694, "Walk_Left_with_Gun_inplace", "WalkAndRun", "CrouchWalking"],
2390
- [695, "Walk_with_Umbrella_inplace", "WalkAndRun", "Walking"],
2391
- [696, "Walk_with_Walker_Support_inplace", "WalkAndRun", "Walking"]
2392
- ];
2393
- var MESHY_ANIMATIONS = ROWS.map(([id, name, category, subcategory]) => ({
2394
- id,
2395
- name,
2396
- category,
2397
- subcategory
2398
- }));
2399
- var BY_ID = new Map(MESHY_ANIMATIONS.map((a) => [a.id, a]));
2400
- var BY_NAME = new Map(MESHY_ANIMATIONS.map((a) => [normalize(a.name), a]));
2401
- function normalize(name) {
2402
- return name.trim().toLowerCase().replace(/[\s_-]+/g, "_");
2403
- }
2404
- function meshyAnimationById(id) {
2405
- return BY_ID.get(id);
2406
- }
2407
- function meshyAnimationByName(name) {
2408
- return BY_NAME.get(normalize(name));
2409
- }
2410
- function searchMeshyAnimations(query, limit = 25) {
2411
- const words = query.toLowerCase().split(/[\s_-]+/).filter(Boolean);
2412
- if (words.length === 0) return MESHY_ANIMATIONS.slice(0, limit);
2413
- const out = [];
2414
- for (const a of MESHY_ANIMATIONS) {
2415
- const hay = `${a.name} ${a.category} ${a.subcategory ?? ""}`.toLowerCase().replace(/[_-]+/g, " ");
2416
- if (words.every((w) => hay.includes(w))) {
2417
- out.push(a);
2418
- if (out.length >= limit) break;
2419
- }
2420
- }
2421
- return out;
2422
- }
2423
- var GROK_IMAGINE_I2V_ENDPOINT = "xai/grok-imagine-video/image-to-video";
2424
- var GROK_IMAGINE_15_I2V_ENDPOINT = "xai/grok-imagine-video/v1.5/image-to-video";
2425
- var WAN_30_I2V_ENDPOINT = "alibaba/wan-3.0/image-to-video";
2426
- var KLING_26_I2V_ENDPOINT = "fal-ai/kling-video/v2.6/pro/image-to-video";
2427
- var KLING_O3_STANDARD_I2V_ENDPOINT = "fal-ai/kling-video/o3/standard/image-to-video";
2428
- var KLING_O3_PRO_I2V_ENDPOINT = "fal-ai/kling-video/o3/pro/image-to-video";
2429
- var KLING_O3_I2V_ENDPOINTS = [KLING_O3_STANDARD_I2V_ENDPOINT, KLING_O3_PRO_I2V_ENDPOINT];
2430
- var LTX_25_FAST_I2V_ENDPOINT = "lightricks/ltx-2.5/image-to-video/fast";
2431
- var LTX_25_PRO_I2V_ENDPOINT = "lightricks/ltx-2.5/image-to-video/pro";
2432
- var LTX_25_I2V_ENDPOINTS = [LTX_25_FAST_I2V_ENDPOINT, LTX_25_PRO_I2V_ENDPOINT];
2433
- var VEO_LITE_I2V_ENDPOINT = "fal-ai/veo3.1/lite/image-to-video";
2434
- var VEO_LITE_FLF_ENDPOINT = "fal-ai/veo3.1/lite/first-last-frame-to-video";
2435
- var VEO_FAST_I2V_ENDPOINT = "fal-ai/veo3.1/fast/image-to-video";
2436
- var VEO_FAST_FLF_ENDPOINT = "fal-ai/veo3.1/fast/first-last-frame-to-video";
2437
- var VEO_I2V_ENDPOINT = "fal-ai/veo3.1/image-to-video";
2438
- var VEO_FLF_ENDPOINT = "fal-ai/veo3.1/first-last-frame-to-video";
2439
- var VEO_ENDPOINTS = [
2440
- VEO_LITE_I2V_ENDPOINT,
2441
- VEO_LITE_FLF_ENDPOINT,
2442
- VEO_FAST_I2V_ENDPOINT,
2443
- VEO_FAST_FLF_ENDPOINT,
2444
- VEO_I2V_ENDPOINT,
2445
- VEO_FLF_ENDPOINT
2446
- ];
2447
- var VIDEO_PER_SECOND_RATES = {
2448
- "fal-ai/wan/v2.2-14b/animate/replace": { "480p": 0.04, "580p": 0.06, "720p": 0.08 },
2449
- // Kling O3 Pro Edit: one rate at every resolution (it renders at the source's),
2450
- // keyed under the fixed label below. fal model page, vetted 2026-09-23.
2451
- "fal-ai/kling-video/o3/pro/video-to-video/edit": { source: 0.168 },
2452
- // FLUX.3 (fal model pages, vetted 2026-08-23). Three tiers of the same model:
2453
- // draft $0.06/s, fixed 720p, plus a draft_cache for enhance
2454
- // direct $0.17/s at 720p, $0.29/s at 1080p, one-shot
2455
- // draft-enhance $0.29/s, fixed 1080p, audio included, from the cache only
2456
- // So draft + enhance is $0.35/s for a 1080p result: a 21% premium over direct
2457
- // 1080p on a first-try keeper, and cheaper from the second attempt on. The
2458
- // draft estimate is the draft price ONLY; the enhance node bills its own.
2459
- "blackforestlabs/flux-3/keyframes-to-video/draft": { "720p": 0.06 },
2460
- "blackforestlabs/flux-3/first-last-frame-to-video/draft": { "720p": 0.06 },
2461
- "blackforestlabs/flux-3/image-to-video/draft": { "720p": 0.06 },
2462
- "blackforestlabs/flux-3/keyframes-to-video": { "720p": 0.17, "1080p": 0.29 },
2463
- "blackforestlabs/flux-3/first-last-frame-to-video": { "720p": 0.17, "1080p": 0.29 },
2464
- "blackforestlabs/flux-3/image-to-video": { "720p": 0.17, "1080p": 0.29 },
2465
- "blackforestlabs/flux-3/draft-enhance": { "1080p": 0.29 },
2466
- // Grok Imagine: $0.05/s at 480p, $0.07/s at 720p, plus $0.002 per input image
2467
- // (VIDEO_PER_INPUT_IMAGE_USD). fal model page, vetted 2026-09-23.
2468
- [GROK_IMAGINE_I2V_ENDPOINT]: { "480p": 0.05, "720p": 0.07 },
2469
- // Veo 3.1, SILENT rates (the audio rates are VIDEO_PER_SECOND_AUDIO_RATES).
2470
- // Both modes of a tier bill the same. fal model pages, vetted 2026-09-23.
2471
- [VEO_LITE_I2V_ENDPOINT]: { "720p": 0.03, "1080p": 0.05 },
2472
- [VEO_LITE_FLF_ENDPOINT]: { "720p": 0.03, "1080p": 0.05 },
2473
- [VEO_FAST_I2V_ENDPOINT]: { "720p": 0.1, "1080p": 0.1, "4k": 0.3 },
2474
- [VEO_FAST_FLF_ENDPOINT]: { "720p": 0.1, "1080p": 0.1, "4k": 0.3 },
2475
- [VEO_I2V_ENDPOINT]: { "720p": 0.2, "1080p": 0.2, "4k": 0.4 },
2476
- [VEO_FLF_ENDPOINT]: { "720p": 0.2, "1080p": 0.2, "4k": 0.4 },
2477
- // Grok Imagine 1.5: plus $0.01 per input image (VIDEO_PER_INPUT_IMAGE_USD).
2478
- [GROK_IMAGINE_15_I2V_ENDPOINT]: { "480p": 0.08, "720p": 0.14, "1080p": 0.25 },
2479
- // Wan 3.0: audio included at no extra charge.
2480
- [WAN_30_I2V_ENDPOINT]: { "480p": 0.05, "720p": 0.1, "1080p": 0.2 },
2481
- // Kling 2.6 Pro, SILENT: one size, keyed under its fixed resolution.
2482
- [KLING_26_I2V_ENDPOINT]: { "1080p": 0.07 },
2483
- // Kling O3 takes no resolution; each tier bills one rate, keyed 'fixed'.
2484
- [KLING_O3_STANDARD_I2V_ENDPOINT]: { fixed: 0.084 },
2485
- [KLING_O3_PRO_I2V_ENDPOINT]: { fixed: 0.112 },
2486
- // LTX-2.5: audio included at every tier. The canvas's 4k is fal's 2160p.
2487
- [LTX_25_FAST_I2V_ENDPOINT]: { "720p": 0.09, "1080p": 0.13, "4k": 0.3 },
2488
- [LTX_25_PRO_I2V_ENDPOINT]: { "720p": 0.12, "1080p": 0.17 }
2489
- };
2490
- var VIDEO_PER_SECOND_AUDIO_RATES = {
2491
- [VEO_LITE_I2V_ENDPOINT]: { "720p": 0.05, "1080p": 0.08 },
2492
- [VEO_LITE_FLF_ENDPOINT]: { "720p": 0.05, "1080p": 0.08 },
2493
- [VEO_FAST_I2V_ENDPOINT]: { "720p": 0.15, "1080p": 0.15, "4k": 0.35 },
2494
- [VEO_FAST_FLF_ENDPOINT]: { "720p": 0.15, "1080p": 0.15, "4k": 0.35 },
2495
- [VEO_I2V_ENDPOINT]: { "720p": 0.4, "1080p": 0.4, "4k": 0.6 },
2496
- [VEO_FLF_ENDPOINT]: { "720p": 0.4, "1080p": 0.4, "4k": 0.6 },
2497
- [KLING_26_I2V_ENDPOINT]: { "1080p": 0.14 },
2498
- [KLING_O3_STANDARD_I2V_ENDPOINT]: { fixed: 0.112 },
2499
- [KLING_O3_PRO_I2V_ENDPOINT]: { fixed: 0.14 }
2500
- };
2501
- var VIDEO_PER_INPUT_IMAGE_USD = {
2502
- [GROK_IMAGINE_I2V_ENDPOINT]: 2e-3,
2503
- [GROK_IMAGINE_15_I2V_ENDPOINT]: 0.01
2504
- };
2505
- var VIDEO_FIXED_RESOLUTION = {
2506
- "blackforestlabs/flux-3/keyframes-to-video/draft": "720p",
2507
- "blackforestlabs/flux-3/first-last-frame-to-video/draft": "720p",
2508
- "blackforestlabs/flux-3/image-to-video/draft": "720p",
2509
- "blackforestlabs/flux-3/draft-enhance": "1080p",
2510
- // Not a resolution the caller picks: Kling O3 Edit renders at the source's.
2511
- "fal-ai/kling-video/o3/pro/video-to-video/edit": "source",
2512
- // Kling 2.6 Pro takes no resolution; it renders 1080p.
2513
- [KLING_26_I2V_ENDPOINT]: "1080p",
2514
- // Not a resolution the caller picks: Kling O3's tier sets the size.
2515
- [KLING_O3_STANDARD_I2V_ENDPOINT]: "fixed",
2516
- [KLING_O3_PRO_I2V_ENDPOINT]: "fixed"
2517
- };
2518
- var VIDEO_PINNED_DEFAULT_SECONDS = {
2519
- [GROK_IMAGINE_I2V_ENDPOINT]: 5,
2520
- // Veo defaults to 8 s itself, and 8 s is the only length Lite first-and-last
2521
- // renders; pinning it keeps the bill and the clip in step either way.
2522
- ...Object.fromEntries(VEO_ENDPOINTS.map((e) => [e, 8])),
2523
- // The fal twins render the length their KIE entries default to, so a clip
2524
- // falling back from KIE to fal has the same length.
2525
- [GROK_IMAGINE_15_I2V_ENDPOINT]: 8,
2526
- [WAN_30_I2V_ENDPOINT]: 5,
2527
- [KLING_26_I2V_ENDPOINT]: 5,
2528
- [KLING_O3_STANDARD_I2V_ENDPOINT]: 5,
2529
- [KLING_O3_PRO_I2V_ENDPOINT]: 5,
2530
- // LTX-2.5 defaults to "auto", a length nobody can price up front; 6 s is its
2531
- // shortest clip on both tiers.
2532
- [LTX_25_FAST_I2V_ENDPOINT]: 6,
2533
- [LTX_25_PRO_I2V_ENDPOINT]: 6
2534
- };
2535
- var VIDEO_DEFAULT_RESOLUTION = {
2536
- "blackforestlabs/flux-3/keyframes-to-video": "720p",
2537
- "blackforestlabs/flux-3/first-last-frame-to-video": "720p",
2538
- "blackforestlabs/flux-3/image-to-video": "720p",
2539
- // fal schema default: Grok renders 720p.
2540
- [GROK_IMAGINE_I2V_ENDPOINT]: "720p",
2541
- ...Object.fromEntries(VEO_ENDPOINTS.map((e) => [e, "720p"])),
2542
- [GROK_IMAGINE_15_I2V_ENDPOINT]: "720p",
2543
- // fal schema default: Wan 3.0 renders 1080p unless asked for less.
2544
- [WAN_30_I2V_ENDPOINT]: "1080p",
2545
- // fal schema default: LTX-2.5 renders 1080p unless asked for less.
2546
- [LTX_25_FAST_I2V_ENDPOINT]: "1080p",
2547
- [LTX_25_PRO_I2V_ENDPOINT]: "1080p"
2548
- };
2549
- var VIDEO_ALLOWED_VALUES = {
2550
- // Seedance 2.5 derives its aspect from the input image.
2551
- "bytedance/seedance-2.5/image-to-video": { aspectRatio: ["auto"] },
2552
- "fal-ai/kling-video/v2.5-turbo/pro/image-to-video": {
2553
- aspectRatio: ["16:9", "9:16", "1:1"],
2554
- durationSeconds: { values: [5, 10] }
2555
- },
2556
- [GROK_IMAGINE_I2V_ENDPOINT]: {
2557
- aspectRatio: ["auto", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16"],
2558
- resolution: ["480p", "720p"],
2559
- durationSeconds: { min: 1, max: 15 }
2560
- },
2561
- ...Object.fromEntries(
2562
- VEO_ENDPOINTS.map((e) => [
2563
- e,
2564
- {
2565
- aspectRatio: ["auto", "16:9", "9:16"],
2566
- resolution: e === VEO_LITE_I2V_ENDPOINT || e === VEO_LITE_FLF_ENDPOINT ? ["720p", "1080p"] : ["720p", "1080p", "4k"],
2567
- // Lite first-and-last renders 8 s only (its schema pins the const).
2568
- durationSeconds: { values: e === VEO_LITE_FLF_ENDPOINT ? [8] : [4, 6, 8] }
2569
- }
2570
- ])
2571
- ),
2572
- [GROK_IMAGINE_15_I2V_ENDPOINT]: { resolution: ["480p", "720p", "1080p"], durationSeconds: { min: 1, max: 15 } },
2573
- [WAN_30_I2V_ENDPOINT]: {
2574
- aspectRatio: ["auto", "16:9", "4:3", "1:1", "3:4", "9:16"],
2575
- resolution: ["480p", "720p", "1080p"]
2576
- },
2577
- [KLING_26_I2V_ENDPOINT]: { durationSeconds: { values: [5, 10] } },
2578
- ...Object.fromEntries(KLING_O3_I2V_ENDPOINTS.map((e) => [e, { durationSeconds: { min: 3, max: 15 } }])),
2579
- [LTX_25_FAST_I2V_ENDPOINT]: {
2580
- aspectRatio: ["auto", "16:9", "9:16"],
2581
- // fal also renders 1440p, which the canvas does not offer.
2582
- resolution: ["720p", "1080p", "4k"],
2583
- durationSeconds: { values: [6, 8, 10, 12, 14, 16, 18, 20] }
2584
- },
2585
- [LTX_25_PRO_I2V_ENDPOINT]: {
2586
- aspectRatio: ["auto", "16:9", "9:16"],
2587
- resolution: ["720p", "1080p"],
2588
- durationSeconds: { values: [6, 8, 10] }
2589
- }
2590
- };
2591
- var VIDEO_MAX_SECONDS_AT_RESOLUTION = {
2592
- [LTX_25_FAST_I2V_ENDPOINT]: { "4k": 10 }
2593
- };
2594
- var VIDEO_UNSUPPORTED_PARAMS = {
2595
- // Kling O3 Edit follows the source clip: its length, frame, size and look are
2596
- // the source's, and the endpoint declares none of these knobs. A duration in
2597
- // particular would only have been a (wrong) billing figure; the completer
2598
- // measures the result instead.
2599
- "fal-ai/kling-video/o3/pro/video-to-video/edit": [
2600
- "resolution",
2601
- "seed",
2602
- "negativePrompt",
2603
- "aspectRatio",
2604
- "generateAudio",
2605
- "durationSeconds"
2606
- ],
2607
- // Wan's output is also as long as its source; it takes resolution and seed.
2608
- "fal-ai/wan/v2.2-14b/animate/replace": ["durationSeconds", "negativePrompt", "aspectRatio", "generateAudio"],
2609
- "blackforestlabs/flux-3/keyframes-to-video/draft": ["resolution", "seed", "negativePrompt"],
2610
- "blackforestlabs/flux-3/first-last-frame-to-video/draft": ["resolution", "seed", "negativePrompt"],
2611
- "blackforestlabs/flux-3/image-to-video/draft": ["resolution", "seed", "negativePrompt"],
2612
- // The direct tier adds `resolution` (720p | 1080p) and nothing else: `seed` is
2613
- // OUTPUT only on every FLUX.3 endpoint, so a caller cannot pin a take by seed.
2614
- "blackforestlabs/flux-3/keyframes-to-video": ["seed", "negativePrompt"],
2615
- "blackforestlabs/flux-3/first-last-frame-to-video": ["seed", "negativePrompt"],
2616
- "blackforestlabs/flux-3/image-to-video": ["seed", "negativePrompt"],
2617
- // Enhance renders whatever the cache holds: duration, aspect, audio and prompt
2618
- // are all baked in, and the output is a fixed 1080p. `durationSeconds` is NOT
2619
- // banned although it is not forwarded either (buildFalVideoInput sends only
2620
- // the cache url + safety_tolerance): the executor injects the upstream
2621
- // draft's duration as a COST hint, since enhance bills $0.29 per second and
2622
- // the request itself carries nothing the estimate could read.
2623
- "blackforestlabs/flux-3/draft-enhance": [
2624
- "resolution",
2625
- "seed",
2626
- "negativePrompt",
2627
- "aspectRatio",
2628
- "generateAudio"
2629
- ],
2630
- // Grok's schema declares no seed, negative prompt or audio switch: it always
2631
- // renders audio.
2632
- [GROK_IMAGINE_I2V_ENDPOINT]: ["seed", "negativePrompt", "generateAudio"],
2633
- [GROK_IMAGINE_15_I2V_ENDPOINT]: ["aspectRatio", "seed", "negativePrompt", "generateAudio"],
2634
- [WAN_30_I2V_ENDPOINT]: ["negativePrompt"],
2635
- [KLING_26_I2V_ENDPOINT]: ["resolution", "aspectRatio", "seed"],
2636
- ...Object.fromEntries(KLING_O3_I2V_ENDPOINTS.map((e) => [e, ["resolution", "aspectRatio", "seed", "negativePrompt"]])),
2637
- ...Object.fromEntries(LTX_25_I2V_ENDPOINTS.map((e) => [e, ["seed", "negativePrompt"]]))
2638
- };
2639
- var perSecond = (rates) => (s, r) => {
2640
- const rate = rates[r];
2641
- return rate === void 0 ? void 0 : rate * s;
2642
- };
2643
- function veoSpec(model, label, perClip) {
1464
+ function veoSpec(model, label) {
2644
1465
  return {
2645
1466
  family: "veo",
2646
1467
  label,
@@ -2652,8 +1473,6 @@ function veoSpec(model, label, perClip) {
2652
1473
  defaultResolution: "720p",
2653
1474
  audioSwitch: false,
2654
1475
  defaultAudio: true,
2655
- // KIE prices Veo per clip whatever its length, and always renders audio.
2656
- price: (_s, r) => perClip[r],
2657
1476
  build: (i) => ({
2658
1477
  prompt: i.prompt,
2659
1478
  model,
@@ -2669,9 +1488,9 @@ function veoSpec(model, label, perClip) {
2669
1488
  var SEEDANCE_ASPECTS = ["auto", "1:1", "4:3", "3:4", "16:9", "9:16", "21:9"];
2670
1489
  var seedanceAspect = (a) => a === "auto" ? "adaptive" : a;
2671
1490
  var KIE_VIDEO_SPECS = {
2672
- veo3_lite: veoSpec("veo3_lite", "Veo 3.1 Lite", { "720p": 0.15, "1080p": 0.175, "4k": 0.75 }),
2673
- veo3_fast: veoSpec("veo3_fast", "Veo 3.1 Fast", { "720p": 0.3, "1080p": 0.325, "4k": 0.9 }),
2674
- veo3: veoSpec("veo3", "Veo 3.1", { "720p": 1.25, "1080p": 1.275, "4k": 1.85 }),
1491
+ veo3_lite: veoSpec("veo3_lite", "Veo 3.1 Lite"),
1492
+ veo3_fast: veoSpec("veo3_fast", "Veo 3.1 Fast"),
1493
+ veo3: veoSpec("veo3", "Veo 3.1"),
2675
1494
  "grok-imagine/image-to-video": {
2676
1495
  family: "job",
2677
1496
  label: "Grok Imagine",
@@ -2685,7 +1504,6 @@ var KIE_VIDEO_SPECS = {
2685
1504
  // here only feeds `price()`, which ignores it, so it states no audio fact.
2686
1505
  audioSwitch: false,
2687
1506
  defaultAudio: false,
2688
- price: perSecond({ "480p": 0.012, "720p": 0.0225, "1080p": 0.04 }),
2689
1507
  build: (i) => ({
2690
1508
  image_urls: [i.start],
2691
1509
  prompt: i.prompt,
@@ -2707,7 +1525,6 @@ var KIE_VIDEO_SPECS = {
2707
1525
  // As for Grok Imagine 1.0 above: audio is always rendered, with no switch.
2708
1526
  audioSwitch: false,
2709
1527
  defaultAudio: false,
2710
- price: perSecond({ "480p": 0.012, "720p": 0.0225 }),
2711
1528
  build: (i) => ({
2712
1529
  image_urls: [i.start],
2713
1530
  prompt: i.prompt,
@@ -2726,7 +1543,6 @@ var KIE_VIDEO_SPECS = {
2726
1543
  defaultResolution: "",
2727
1544
  audioSwitch: false,
2728
1545
  defaultAudio: false,
2729
- price: (s) => s >= 10 ? 0.42 : 0.21,
2730
1546
  build: (i) => ({
2731
1547
  prompt: i.prompt,
2732
1548
  image_url: i.start,
@@ -2745,7 +1561,6 @@ var KIE_VIDEO_SPECS = {
2745
1561
  defaultResolution: "",
2746
1562
  audioSwitch: true,
2747
1563
  defaultAudio: false,
2748
- price: (s, _r, audio) => (audio ? 0.55 : 0.275) * (s >= 10 ? 2 : 1),
2749
1564
  build: (i) => ({
2750
1565
  prompt: i.prompt,
2751
1566
  image_urls: [i.start],
@@ -2764,10 +1579,6 @@ var KIE_VIDEO_SPECS = {
2764
1579
  defaultResolution: "720p",
2765
1580
  audioSwitch: true,
2766
1581
  defaultAudio: true,
2767
- // A real 4 s 720p task billed 164 credits ($0.82, $0.205 per second) on
2768
- // 2026-10-04, confirming this table. KIE's web page shows a lower "$0.124"
2769
- // figure that the API does not bill.
2770
- price: perSecond({ "480p": 0.095, "720p": 0.205, "1080p": 0.51, "4k": 1.04 }),
2771
1582
  build: (i) => ({
2772
1583
  prompt: i.prompt,
2773
1584
  first_frame_url: i.start,
@@ -2790,7 +1601,6 @@ var KIE_VIDEO_SPECS = {
2790
1601
  defaultResolution: "720p",
2791
1602
  audioSwitch: true,
2792
1603
  defaultAudio: true,
2793
- price: perSecond({ "480p": 0.14, "720p": 0.315, "1080p": 0.79 }),
2794
1604
  build: (i) => ({
2795
1605
  prompt: i.prompt,
2796
1606
  first_frame_url: i.start,
@@ -2813,8 +1623,6 @@ var KIE_VIDEO_SPECS = {
2813
1623
  defaultResolution: "720p",
2814
1624
  audioSwitch: true,
2815
1625
  defaultAudio: true,
2816
- // Audio is included in the price.
2817
- price: perSecond({ "480p": 0.04, "720p": 0.08, "1080p": 0.16 }),
2818
1626
  build: (i) => ({
2819
1627
  prompt: i.prompt,
2820
1628
  first_frame_url: i.start,
@@ -2838,7 +1646,6 @@ var KIE_VIDEO_SPECS = {
2838
1646
  defaultResolution: "720p",
2839
1647
  audioSwitch: false,
2840
1648
  defaultAudio: false,
2841
- price: perSecond({ "720p": 0.04, "1080p": 0.065 }),
2842
1649
  build: (i) => ({
2843
1650
  prompt: i.prompt,
2844
1651
  first_frame_url: i.start,
@@ -2859,8 +1666,6 @@ var KIE_VIDEO_SPECS = {
2859
1666
  defaultResolution: "720p",
2860
1667
  audioSwitch: false,
2861
1668
  defaultAudio: false,
2862
- // Priced per clip by length; 4K carries a surcharge.
2863
- price: (s, r) => (r === "4k" ? { 4: 0.735, 6: 0.84, 8: 0.945, 10: 1.05 } : { 4: 0.315, 6: 0.42, 8: 0.525, 10: 0.63 })[s],
2864
1669
  // The first-and-last-frame mode: KIE refuses it combined with registered
2865
1670
  // characters, reference images, audio or video, so none are sent.
2866
1671
  build: (i) => ({
@@ -2885,8 +1690,6 @@ var KIE_VIDEO_SPECS = {
2885
1690
  defaultResolution: "720p",
2886
1691
  audioSwitch: true,
2887
1692
  defaultAudio: false,
2888
- // With-audio rates from KIE's price feed, the higher of its two listings.
2889
- price: (s, r, audio) => perSecond(audio ? { "720p": 0.1, "1080p": 0.135, "4k": 0.335 } : { "720p": 0.07, "1080p": 0.09, "4k": 0.335 })(s, r),
2890
1693
  build: (i) => ({
2891
1694
  prompt: i.prompt,
2892
1695
  image_urls: i.end ? [i.start, i.end] : [i.start],
@@ -2895,35 +1698,891 @@ var KIE_VIDEO_SPECS = {
2895
1698
  audio: i.audio
2896
1699
  })
2897
1700
  }
2898
- };
2899
- function veoSpec2(label, perSecond2) {
2900
- return {
2901
- label,
2902
- // OpenRouter's Veo has no auto: it renders exactly one of these.
2903
- aspectRatios: ["16:9", "9:16"],
2904
- resolutions: Object.keys(perSecond2),
2905
- durations: { values: [4, 6, 8] },
2906
- defaultSeconds: 8,
2907
- defaultResolution: "720p",
2908
- perSecond: perSecond2
2909
- };
1701
+ };
1702
+ function veoSpec2(label, resolutions) {
1703
+ return {
1704
+ label,
1705
+ // OpenRouter's Veo has no auto: it renders exactly one of these.
1706
+ aspectRatios: ["16:9", "9:16"],
1707
+ resolutions,
1708
+ durations: { values: [4, 6, 8] },
1709
+ defaultSeconds: 8,
1710
+ defaultResolution: "720p"
1711
+ };
1712
+ }
1713
+ var OPENROUTER_VIDEO_SPECS = {
1714
+ "google/veo-3.1-lite": veoSpec2("Veo 3.1 Lite", ["720p", "1080p"]),
1715
+ "google/veo-3.1-fast": veoSpec2("Veo 3.1 Fast", ["720p", "1080p", "4k"]),
1716
+ "google/veo-3.1": veoSpec2("Veo 3.1", ["720p", "1080p", "4k"])
1717
+ };
1718
+ var GROK_IMAGINE_I2V_ENDPOINT = "xai/grok-imagine-video/image-to-video";
1719
+ var GROK_IMAGINE_15_I2V_ENDPOINT = "xai/grok-imagine-video/v1.5/image-to-video";
1720
+ var WAN_30_I2V_ENDPOINT = "alibaba/wan-3.0/image-to-video";
1721
+ var KLING_26_I2V_ENDPOINT = "fal-ai/kling-video/v2.6/pro/image-to-video";
1722
+ var KLING_O3_STANDARD_I2V_ENDPOINT = "fal-ai/kling-video/o3/standard/image-to-video";
1723
+ var KLING_O3_PRO_I2V_ENDPOINT = "fal-ai/kling-video/o3/pro/image-to-video";
1724
+ var KLING_O3_I2V_ENDPOINTS = [KLING_O3_STANDARD_I2V_ENDPOINT, KLING_O3_PRO_I2V_ENDPOINT];
1725
+ var LTX_25_FAST_I2V_ENDPOINT = "lightricks/ltx-2.5/image-to-video/fast";
1726
+ var LTX_25_PRO_I2V_ENDPOINT = "lightricks/ltx-2.5/image-to-video/pro";
1727
+ var LTX_25_I2V_ENDPOINTS = [LTX_25_FAST_I2V_ENDPOINT, LTX_25_PRO_I2V_ENDPOINT];
1728
+ var VEO_LITE_I2V_ENDPOINT = "fal-ai/veo3.1/lite/image-to-video";
1729
+ var VEO_LITE_FLF_ENDPOINT = "fal-ai/veo3.1/lite/first-last-frame-to-video";
1730
+ var VEO_FAST_I2V_ENDPOINT = "fal-ai/veo3.1/fast/image-to-video";
1731
+ var VEO_FAST_FLF_ENDPOINT = "fal-ai/veo3.1/fast/first-last-frame-to-video";
1732
+ var VEO_I2V_ENDPOINT = "fal-ai/veo3.1/image-to-video";
1733
+ var VEO_FLF_ENDPOINT = "fal-ai/veo3.1/first-last-frame-to-video";
1734
+ var VEO_ENDPOINTS = [
1735
+ VEO_LITE_I2V_ENDPOINT,
1736
+ VEO_LITE_FLF_ENDPOINT,
1737
+ VEO_FAST_I2V_ENDPOINT,
1738
+ VEO_FAST_FLF_ENDPOINT,
1739
+ VEO_I2V_ENDPOINT,
1740
+ VEO_FLF_ENDPOINT
1741
+ ];
1742
+ var VIDEO_FIXED_RESOLUTION = {
1743
+ "blackforestlabs/flux-3/keyframes-to-video/draft": "720p",
1744
+ "blackforestlabs/flux-3/first-last-frame-to-video/draft": "720p",
1745
+ "blackforestlabs/flux-3/image-to-video/draft": "720p",
1746
+ "blackforestlabs/flux-3/draft-enhance": "1080p",
1747
+ // Not a resolution the caller picks: Kling O3 Edit renders at the source's.
1748
+ "fal-ai/kling-video/o3/pro/video-to-video/edit": "source",
1749
+ // Kling 2.6 Pro takes no resolution; it renders 1080p.
1750
+ [KLING_26_I2V_ENDPOINT]: "1080p",
1751
+ // Not a resolution the caller picks: Kling O3's tier sets the size.
1752
+ [KLING_O3_STANDARD_I2V_ENDPOINT]: "fixed",
1753
+ [KLING_O3_PRO_I2V_ENDPOINT]: "fixed"
1754
+ };
1755
+ var VIDEO_PINNED_DEFAULT_SECONDS = {
1756
+ [GROK_IMAGINE_I2V_ENDPOINT]: 5,
1757
+ // Veo defaults to 8 s itself, and 8 s is the only length Lite first-and-last
1758
+ // renders; pinning it keeps the bill and the clip in step either way.
1759
+ ...Object.fromEntries(VEO_ENDPOINTS.map((e) => [e, 8])),
1760
+ // The fal twins render the length their KIE entries default to, so a clip
1761
+ // falling back from KIE to fal has the same length.
1762
+ [GROK_IMAGINE_15_I2V_ENDPOINT]: 8,
1763
+ [WAN_30_I2V_ENDPOINT]: 5,
1764
+ [KLING_26_I2V_ENDPOINT]: 5,
1765
+ [KLING_O3_STANDARD_I2V_ENDPOINT]: 5,
1766
+ [KLING_O3_PRO_I2V_ENDPOINT]: 5,
1767
+ // LTX-2.5 defaults to "auto", a length nobody can price up front; 6 s is its
1768
+ // shortest clip on both tiers.
1769
+ [LTX_25_FAST_I2V_ENDPOINT]: 6,
1770
+ [LTX_25_PRO_I2V_ENDPOINT]: 6
1771
+ };
1772
+ var VIDEO_DEFAULT_RESOLUTION = {
1773
+ "blackforestlabs/flux-3/keyframes-to-video": "720p",
1774
+ "blackforestlabs/flux-3/first-last-frame-to-video": "720p",
1775
+ "blackforestlabs/flux-3/image-to-video": "720p",
1776
+ // fal schema default: Grok renders 720p.
1777
+ [GROK_IMAGINE_I2V_ENDPOINT]: "720p",
1778
+ ...Object.fromEntries(VEO_ENDPOINTS.map((e) => [e, "720p"])),
1779
+ [GROK_IMAGINE_15_I2V_ENDPOINT]: "720p",
1780
+ // fal schema default: Wan 3.0 renders 1080p unless asked for less.
1781
+ [WAN_30_I2V_ENDPOINT]: "1080p",
1782
+ // fal schema default: LTX-2.5 renders 1080p unless asked for less.
1783
+ [LTX_25_FAST_I2V_ENDPOINT]: "1080p",
1784
+ [LTX_25_PRO_I2V_ENDPOINT]: "1080p"
1785
+ };
1786
+ var VIDEO_ALLOWED_VALUES = {
1787
+ // Seedance 2.5 derives its aspect from the input image.
1788
+ "bytedance/seedance-2.5/image-to-video": { aspectRatio: ["auto"] },
1789
+ "fal-ai/kling-video/v2.5-turbo/pro/image-to-video": {
1790
+ aspectRatio: ["16:9", "9:16", "1:1"],
1791
+ durationSeconds: { values: [5, 10] }
1792
+ },
1793
+ [GROK_IMAGINE_I2V_ENDPOINT]: {
1794
+ aspectRatio: ["auto", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16"],
1795
+ resolution: ["480p", "720p"],
1796
+ durationSeconds: { min: 1, max: 15 }
1797
+ },
1798
+ ...Object.fromEntries(
1799
+ VEO_ENDPOINTS.map((e) => [
1800
+ e,
1801
+ {
1802
+ aspectRatio: ["auto", "16:9", "9:16"],
1803
+ resolution: e === VEO_LITE_I2V_ENDPOINT || e === VEO_LITE_FLF_ENDPOINT ? ["720p", "1080p"] : ["720p", "1080p", "4k"],
1804
+ // Lite first-and-last renders 8 s only (its schema pins the const).
1805
+ durationSeconds: { values: e === VEO_LITE_FLF_ENDPOINT ? [8] : [4, 6, 8] }
1806
+ }
1807
+ ])
1808
+ ),
1809
+ [GROK_IMAGINE_15_I2V_ENDPOINT]: { resolution: ["480p", "720p", "1080p"], durationSeconds: { min: 1, max: 15 } },
1810
+ [WAN_30_I2V_ENDPOINT]: {
1811
+ aspectRatio: ["auto", "16:9", "4:3", "1:1", "3:4", "9:16"],
1812
+ resolution: ["480p", "720p", "1080p"]
1813
+ },
1814
+ [KLING_26_I2V_ENDPOINT]: { durationSeconds: { values: [5, 10] } },
1815
+ ...Object.fromEntries(KLING_O3_I2V_ENDPOINTS.map((e) => [e, { durationSeconds: { min: 3, max: 15 } }])),
1816
+ [LTX_25_FAST_I2V_ENDPOINT]: {
1817
+ aspectRatio: ["auto", "16:9", "9:16"],
1818
+ // fal also renders 1440p, which the canvas does not offer.
1819
+ resolution: ["720p", "1080p", "4k"],
1820
+ durationSeconds: { values: [6, 8, 10, 12, 14, 16, 18, 20] }
1821
+ },
1822
+ [LTX_25_PRO_I2V_ENDPOINT]: {
1823
+ aspectRatio: ["auto", "16:9", "9:16"],
1824
+ resolution: ["720p", "1080p"],
1825
+ durationSeconds: { values: [6, 8, 10] }
1826
+ }
1827
+ };
1828
+ var VIDEO_MAX_SECONDS_AT_RESOLUTION = {
1829
+ [LTX_25_FAST_I2V_ENDPOINT]: { "4k": 10 }
1830
+ };
1831
+ var VIDEO_UNSUPPORTED_PARAMS = {
1832
+ // Kling O3 Edit follows the source clip: its length, frame, size and look are
1833
+ // the source's, and the endpoint declares none of these knobs. A duration in
1834
+ // particular would only have been a (wrong) billing figure; the completer
1835
+ // measures the result instead.
1836
+ "fal-ai/kling-video/o3/pro/video-to-video/edit": [
1837
+ "resolution",
1838
+ "seed",
1839
+ "negativePrompt",
1840
+ "aspectRatio",
1841
+ "generateAudio",
1842
+ "durationSeconds"
1843
+ ],
1844
+ // Wan's output is also as long as its source; it takes resolution and seed.
1845
+ "fal-ai/wan/v2.2-14b/animate/replace": ["durationSeconds", "negativePrompt", "aspectRatio", "generateAudio"],
1846
+ "blackforestlabs/flux-3/keyframes-to-video/draft": ["resolution", "seed", "negativePrompt"],
1847
+ "blackforestlabs/flux-3/first-last-frame-to-video/draft": ["resolution", "seed", "negativePrompt"],
1848
+ "blackforestlabs/flux-3/image-to-video/draft": ["resolution", "seed", "negativePrompt"],
1849
+ // The direct tier adds `resolution` (720p | 1080p) and nothing else: `seed` is
1850
+ // OUTPUT only on every FLUX.3 endpoint, so a caller cannot pin a take by seed.
1851
+ "blackforestlabs/flux-3/keyframes-to-video": ["seed", "negativePrompt"],
1852
+ "blackforestlabs/flux-3/first-last-frame-to-video": ["seed", "negativePrompt"],
1853
+ "blackforestlabs/flux-3/image-to-video": ["seed", "negativePrompt"],
1854
+ // Enhance renders whatever the cache holds: duration, aspect, audio and prompt
1855
+ // are all baked in, and the output is a fixed 1080p. `durationSeconds` is NOT
1856
+ // banned although it is not forwarded either (buildFalVideoInput sends only
1857
+ // the cache url + safety_tolerance): the executor injects the upstream
1858
+ // draft's duration as a COST hint, since enhance bills per second and
1859
+ // the request itself carries nothing the estimate could read.
1860
+ "blackforestlabs/flux-3/draft-enhance": [
1861
+ "resolution",
1862
+ "seed",
1863
+ "negativePrompt",
1864
+ "aspectRatio",
1865
+ "generateAudio"
1866
+ ],
1867
+ // Grok's schema declares no seed, negative prompt or audio switch: it always
1868
+ // renders audio.
1869
+ [GROK_IMAGINE_I2V_ENDPOINT]: ["seed", "negativePrompt", "generateAudio"],
1870
+ [GROK_IMAGINE_15_I2V_ENDPOINT]: ["aspectRatio", "seed", "negativePrompt", "generateAudio"],
1871
+ [WAN_30_I2V_ENDPOINT]: ["negativePrompt"],
1872
+ [KLING_26_I2V_ENDPOINT]: ["resolution", "aspectRatio", "seed"],
1873
+ ...Object.fromEntries(KLING_O3_I2V_ENDPOINTS.map((e) => [e, ["resolution", "aspectRatio", "seed", "negativePrompt"]])),
1874
+ ...Object.fromEntries(LTX_25_I2V_ENDPOINTS.map((e) => [e, ["seed", "negativePrompt"]]))
1875
+ };
1876
+ var ROWS = [
1877
+ [0, "Idle", "DailyActions", "Idle"],
1878
+ [1, "Walking_Woman", "WalkAndRun", "Walking"],
1879
+ [2, "Alert", "DailyActions", "LookingAround"],
1880
+ [3, "Arise", "DailyActions", "LookingAround"],
1881
+ [4, "Attack", "Fighting", "AttackingwithWeapon"],
1882
+ [5, "BackLeft_run", "WalkAndRun", "Running"],
1883
+ [6, "BackRight_Run", "WalkAndRun", "Running"],
1884
+ [7, "BeHit_FlyUp", "Fighting", "GettingHit"],
1885
+ [8, "Dead", "Fighting", "Dying"],
1886
+ [9, "ForwardLeft_Run_Fight", "Fighting", "Transitioning"],
1887
+ [10, "ForwardRight_Run_Fight", "Fighting", "Transitioning"],
1888
+ [11, "Idle_02", "DailyActions", "Idle"],
1889
+ [12, "Idle_03", "DailyActions", "Idle"],
1890
+ [13, "Jump_Run", "WalkAndRun", "Running"],
1891
+ [14, "Run_02", "WalkAndRun", "Running"],
1892
+ [15, "Run_03", "WalkAndRun", "Running"],
1893
+ [16, "RunFast", "WalkAndRun", "Running"],
1894
+ [17, "Skill_01", "BodyMovements", "Acting"],
1895
+ [18, "Skill_02", "BodyMovements", "Acting"],
1896
+ [19, "Skill_03", "BodyMovements", "Acting"],
1897
+ [20, "Walk_Fight_Back", "WalkAndRun", "Walking"],
1898
+ [21, "Walk_Fight_Forward", "WalkAndRun", "Walking"],
1899
+ [22, "FunnyDancing_01", "Dancing", "Dancing"],
1900
+ [23, "FunnyDancing_02", "Dancing", "Dancing"],
1901
+ [24, "FunnyDancing_03", "Dancing", "Dancing"],
1902
+ [25, "Agree_Gesture", "DailyActions", "Interacting"],
1903
+ [26, "Angry_Stomp", "DailyActions", "Interacting"],
1904
+ [27, "Big_Heart_Gesture", "BodyMovements", "Acting"],
1905
+ [28, "Big_Wave_Hello", "DailyActions", "Interacting"],
1906
+ [29, "Call_Gesture", "BodyMovements", "Acting"],
1907
+ [30, "Casual_Walk", "WalkAndRun", "Walking"],
1908
+ [31, "Catching_Breath", "BodyMovements", "Acting"],
1909
+ [32, "Chair_Sit_Idle_F", "DailyActions", "Idle"],
1910
+ [33, "Chair_Sit_Idle_M", "DailyActions", "Idle"],
1911
+ [34, "Checkout_Gesture", "DailyActions", "Interacting"],
1912
+ [35, "Clapping_Run", "BodyMovements", "Acting"],
1913
+ [36, "Confused_Scratch", "DailyActions", "Idle"],
1914
+ [37, "Discuss_While_Moving", "DailyActions", "Interacting"],
1915
+ [38, "Dozing_Elderly", "DailyActions", "Idle"],
1916
+ [39, "Excited_Walk_F", "BodyMovements", "Acting"],
1917
+ [40, "Excited_Walk_M", "BodyMovements", "Acting"],
1918
+ [41, "Formal_Bow", "DailyActions", "Interacting"],
1919
+ [42, "Gentlemans_Bow", "DailyActions", "Interacting"],
1920
+ [43, "Handbag_Walk", "BodyMovements", "Acting"],
1921
+ [44, "Happy_jump_f", "BodyMovements", "Acting"],
1922
+ [45, "Indoor_Play", "BodyMovements", "Acting"],
1923
+ [46, "Jump_Rope", "BodyMovements", "Acting"],
1924
+ [47, "Listening_Gesture", "DailyActions", "Interacting"],
1925
+ [48, "Mirror_Viewing", "DailyActions", "Idle"],
1926
+ [49, "Motivational_Cheer", "DailyActions", "Interacting"],
1927
+ [50, "Phone_Call_Gesture", "DailyActions", "Interacting"],
1928
+ [51, "Shouting_Angrily", "BodyMovements", "Acting"],
1929
+ [52, "Sit_to_Stand_Transition_F", "DailyActions", "Transitioning"],
1930
+ [53, "Sit_to_Stand_Transition_M", "DailyActions", "Transitioning"],
1931
+ [54, "Squat_Stance", "Dancing", "Dancing"],
1932
+ [55, "Stage_Walk", "WalkAndRun", "Walking"],
1933
+ [56, "Stand_and_Chat", "DailyActions", "Interacting"],
1934
+ [57, "Stand_to_Sit_Transition_M", "DailyActions", "Transitioning"],
1935
+ [58, "Step_to_Sit_Transition", "DailyActions", "Transitioning"],
1936
+ [59, "Victory_Cheer", "BodyMovements", "Acting"],
1937
+ [60, "Walk_to_Sit", "DailyActions", "Transitioning"],
1938
+ [61, "happy_jump_m", "BodyMovements", "Acting"],
1939
+ [62, "penguin_walk", "BodyMovements", "Acting"],
1940
+ [63, "Arm_Circle_Shuffle", "Dancing", "Dancing"],
1941
+ [64, "All_Night_Dance", "Dancing", "Dancing"],
1942
+ [65, "Bass_Beats", "Dancing", "Dancing"],
1943
+ [66, "Boom_Dance", "Dancing", "Dancing"],
1944
+ [67, "Bubble_Dance", "Dancing", "Dancing"],
1945
+ [68, "Cherish_Pop_Dance", "Dancing", "Dancing"],
1946
+ [69, "Crystal_Beads", "Dancing", "Dancing"],
1947
+ [70, "Cardio_Dance", "Dancing", "Dancing"],
1948
+ [71, "Denim_Pop_Dance", "Dancing", "Dancing"],
1949
+ [72, "Dont_You_Dare", "Dancing", "Dancing"],
1950
+ [73, "Fast_Lightning", "Dancing", "Dancing"],
1951
+ [74, "Gangnam_Groove", "Dancing", "Dancing"],
1952
+ [75, "Indoor_Swing", "Dancing", "Dancing"],
1953
+ [76, "Love_You_Pop_Dance", "Dancing", "Dancing"],
1954
+ [77, "Magic_Genie", "Dancing", "Dancing"],
1955
+ [78, "Not_Your_Mom", "Dancing", "Dancing"],
1956
+ [79, "OMG_Groove", "Dancing", "Dancing"],
1957
+ [80, "Pop_Dance_LSA2", "Dancing", "Dancing"],
1958
+ [81, "Pod_Baby_Groove", "Dancing", "Dancing"],
1959
+ [82, "Shake_It_Off_Dance", "Dancing", "Dancing"],
1960
+ [83, "Superlove_Pop_Dance", "Dancing", "Dancing"],
1961
+ [84, "You_Groove", "Dancing", "Dancing"],
1962
+ [85, "Axe_Stance", "Fighting", "Transitioning"],
1963
+ [86, "Basic_Jump", "Fighting", "AttackingwithWeapon"],
1964
+ [87, "Boxing_Practice", "Fighting", "Punching"],
1965
+ [88, "Chest_Pound_Taunt", "Fighting", "Transitioning"],
1966
+ [89, "Combat_Stance", "Fighting", "AttackingwithWeapon"],
1967
+ [90, "Counterstrike", "Fighting", "Punching"],
1968
+ [91, "Double_Blade_Spin", "Fighting", "AttackingwithWeapon"],
1969
+ [92, "Double_Combo_Attack", "Fighting", "AttackingwithWeapon"],
1970
+ [93, "Dodge_and_Counter", "Fighting", "Punching"],
1971
+ [94, "Flying_Fist_Kick", "Fighting", "Punching"],
1972
+ [95, "Gun_Hold_Left_Turn", "Fighting", "AttackingwithWeapon"],
1973
+ [96, "Kung_Fu_Punch", "Fighting", "Punching"],
1974
+ [97, "Left_Slash", "Fighting", "AttackingwithWeapon"],
1975
+ [98, "Run_and_Shoot", "Fighting", "AttackingwithWeapon"],
1976
+ [99, "Reaping_Swing", "Fighting", "Transitioning"],
1977
+ [100, "Rightward_Spin", "Fighting", "Transitioning"],
1978
+ [101, "Sword_Shout", "BodyMovements", "Acting"],
1979
+ [102, "Sword_Judgment", "Fighting", "AttackingwithWeapon"],
1980
+ [103, "Simple_Kick", "Fighting", "AttackingwithWeapon"],
1981
+ [104, "Side_Shot", "Fighting", "AttackingwithWeapon"],
1982
+ [105, "Triple_Combo_Attack", "Fighting", "AttackingwithWeapon"],
1983
+ [106, "Confident_Walk", "WalkAndRun", "Walking"],
1984
+ [107, "Confident_Strut", "WalkAndRun", "Walking"],
1985
+ [108, "Flirty_Strut", "WalkAndRun", "Walking"],
1986
+ [109, "Groovy_Walk", "BodyMovements", "Acting"],
1987
+ [110, "Hello_Run", "WalkAndRun", "Running"],
1988
+ [111, "Injured_Walk", "WalkAndRun", "Walking"],
1989
+ [112, "Monster_Walk", "WalkAndRun", "Walking"],
1990
+ [113, "Mummy_Stagger", "BodyMovements", "Acting"],
1991
+ [114, "Proud_Strut", "WalkAndRun", "Walking"],
1992
+ [115, "Quick_Walk", "WalkAndRun", "Walking"],
1993
+ [116, "Run_to_Walk_Transition", "WalkAndRun", "Walking"],
1994
+ [117, "Red_Carpet_Walk", "WalkAndRun", "Walking"],
1995
+ [118, "Skip_Forward", "WalkAndRun", "Walking"],
1996
+ [119, "Slow_Orc_Walk", "WalkAndRun", "Walking"],
1997
+ [120, "Touch_and_Run", "WalkAndRun", "Running"],
1998
+ [121, "Thoughtful_Walk", "WalkAndRun", "Walking"],
1999
+ [122, "Texting_Walk", "WalkAndRun", "Walking"],
2000
+ [123, "Unsteady_Walk", "WalkAndRun", "Walking"],
2001
+ [124, "Walking_with_Phone", "WalkAndRun", "Walking"],
2002
+ [125, "Charged_Spell_Cast", "Fighting", "CastingSpell"],
2003
+ [126, "Charged_Spell_Cast_1", "Fighting", "CastingSpell"],
2004
+ [127, "Charged_Ground_Slam", "Fighting", "CastingSpell"],
2005
+ [128, "Heavy_Hammer_Swing", "Fighting", "AttackingwithWeapon"],
2006
+ [129, "mage_soell_cast", "Fighting", "CastingSpell"],
2007
+ [130, "mage_soell_cast_1", "Fighting", "CastingSpell"],
2008
+ [131, "mage_soell_cast_2", "Fighting", "CastingSpell"],
2009
+ [132, "mage_soell_cast_3", "Fighting", "CastingSpell"],
2010
+ [133, "mage_soell_cast_4", "Fighting", "CastingSpell"],
2011
+ [134, "mage_soell_cast_5", "Fighting", "CastingSpell"],
2012
+ [135, "mage_soell_cast_6", "Fighting", "CastingSpell"],
2013
+ [136, "mage_soell_cast_7", "Fighting", "CastingSpell"],
2014
+ [137, "mage_soell_cast_8", "Fighting", "CastingSpell"],
2015
+ [138, "Block1", "Fighting", "Blocking"],
2016
+ [139, "Block2", "Fighting", "Blocking"],
2017
+ [140, "Block3", "Fighting", "Blocking"],
2018
+ [141, "Block4", "Fighting", "Blocking"],
2019
+ [142, "Block5", "Fighting", "Blocking"],
2020
+ [143, "Block6", "Fighting", "Blocking"],
2021
+ [144, "Block8", "Fighting", "Blocking"],
2022
+ [145, "Block9", "Fighting", "Blocking"],
2023
+ [146, "Block10", "Fighting", "Blocking"],
2024
+ [147, "Sword_Parry", "Fighting", "Blocking"],
2025
+ [148, "Sword_Parry_Backward", "Fighting", "Blocking"],
2026
+ [149, "Two_Handed_Parry", "Fighting", "Blocking"],
2027
+ [150, "Hit_Reaction_with_Bow", "Fighting", "Blocking"],
2028
+ [151, "Sword_Parry_Backward_1", "Fighting", "Blocking"],
2029
+ [152, "Sword_Parry_Backward_2", "Fighting", "Blocking"],
2030
+ [153, "Sword_Parry_Backward_3", "Fighting", "Blocking"],
2031
+ [154, "Sword_Parry_Backward_4", "Fighting", "Blocking"],
2032
+ [155, "Sword_Parry_Backward_5", "Fighting", "Blocking"],
2033
+ [156, "Stand_Dodge", "Fighting", "Transitioning"],
2034
+ [157, "Stand_Dodge_1", "Fighting", "Transitioning"],
2035
+ [158, "Roll_Dodge", "Fighting", "Transitioning"],
2036
+ [159, "Roll_Dodge_1", "Fighting", "Transitioning"],
2037
+ [160, "Roll_Dodge_2", "Fighting", "Transitioning"],
2038
+ [161, "Roll_Dodge_3", "Fighting", "Transitioning"],
2039
+ [162, "Stand_Dodge_2", "Fighting", "Transitioning"],
2040
+ [163, "Roll_Dodge_4", "Fighting", "Transitioning"],
2041
+ [164, "Stand_Dodge_3", "Fighting", "Transitioning"],
2042
+ [165, "Kneeling_Reload", "Fighting", "Transitioning"],
2043
+ [166, "Running_Reload", "Fighting", "Transitioning"],
2044
+ [167, "Slow_Walk_Reload", "Fighting", "Transitioning"],
2045
+ [168, "Prone_Reload", "Fighting", "Transitioning"],
2046
+ [169, "Forward_Reload_Subtle", "Fighting", "Transitioning"],
2047
+ [170, "Standing_Reload", "Fighting", "Transitioning"],
2048
+ [171, "Hit_Reaction_to_Waist", "Fighting", "Transitioning"],
2049
+ [172, "Electrocution_Reaction", "Fighting", "GettingHit"],
2050
+ [173, "Slap_Reaction", "Fighting", "GettingHit"],
2051
+ [174, "Face_Punch_Reaction", "Fighting", "GettingHit"],
2052
+ [175, "Face_Punch_Reaction_1", "Fighting", "GettingHit"],
2053
+ [176, "Face_Punch_Reaction_2", "Fighting", "GettingHit"],
2054
+ [177, "Gunshot_Reaction", "Fighting", "GettingHit"],
2055
+ [178, "Hit_Reaction", "Fighting", "GettingHit"],
2056
+ [179, "Hit_Reaction_1", "Fighting", "GettingHit"],
2057
+ [180, "Shot_in_the_Back_and_Fall", "Fighting", "GettingHit"],
2058
+ [181, "Electrocuted_Fall", "Fighting", "Dying"],
2059
+ [182, "Shot_and_Blown_Back", "Fighting", "Dying"],
2060
+ [183, "Shot_and_Fall_Backward", "Fighting", "Dying"],
2061
+ [184, "Shot_and_Fall_Forward", "Fighting", "Dying"],
2062
+ [185, "Shot_and_Slow_Fall_Backward", "Fighting", "Dying"],
2063
+ [186, "Strangled_and_Fall_Forward", "Fighting", "Dying"],
2064
+ [187, "Knock_Down", "Fighting", "Dying"],
2065
+ [188, "Fall_Dead_from_Abdominal_Injury", "Fighting", "Dying"],
2066
+ [189, "dying_backwards", "Fighting", "Dying"],
2067
+ [190, "Knock_Down_1", "Fighting", "Dying"],
2068
+ [191, "Left_Jab_from_Guard", "Fighting", "Punching"],
2069
+ [192, "Right_Jab_from_Guard", "Fighting", "Punching"],
2070
+ [193, "Left_Hook_from_Guard", "Fighting", "Punching"],
2071
+ [194, "Right_Uppercut_from_Guard", "Fighting", "Punching"],
2072
+ [195, "Right_Upper_Hook_from_Guard", "Fighting", "Punching"],
2073
+ [196, "Left_Uppercut_from_Guard", "Fighting", "Punching"],
2074
+ [197, "Left_Short_Hook_from_Guard", "Fighting", "Punching"],
2075
+ [198, "Punch_Combo", "Fighting", "Punching"],
2076
+ [199, "Weapon_Combo", "Fighting", "Punching"],
2077
+ [200, "Punch_Combo_1", "Fighting", "Punching"],
2078
+ [201, "Punch_Combo_2", "Fighting", "Punching"],
2079
+ [202, "Weapon_Combo_1", "Fighting", "Punching"],
2080
+ [203, "Punch_Combo_3", "Fighting", "Punching"],
2081
+ [204, "Punch_Combo_4", "Fighting", "Punching"],
2082
+ [205, "Punch_Combo_5", "Fighting", "Punching"],
2083
+ [206, "Spartan_Kick", "Fighting", "Punching"],
2084
+ [207, "Roundhouse_Kick", "Fighting", "Punching"],
2085
+ [208, "Lunge_Roundhouse_Kick", "Fighting", "Punching"],
2086
+ [209, "Boxing_Guard_Right_Straight_Kick", "Fighting", "Punching"],
2087
+ [210, "Boxing_Guard_Prep_Straight_Punch", "Fighting", "Punching"],
2088
+ [211, "Boxing_Guard_Step_Knee_Strike", "Fighting", "Punching"],
2089
+ [212, "Elbow_Strike", "Fighting", "Punching"],
2090
+ [213, "Leg_Sweep", "Fighting", "Punching"],
2091
+ [214, "Punch_Forward_with_Both_Fists", "Fighting", "Punching"],
2092
+ [215, "High_Kick", "Fighting", "Punching"],
2093
+ [216, "Lunge_Spin_Kick", "Fighting", "Punching"],
2094
+ [217, "Sweeping_Kick", "Fighting", "Punching"],
2095
+ [218, "Step_in_High_Kick", "Fighting", "Punching"],
2096
+ [219, "Right_Hand_Sword_Slash", "Fighting", "Punching"],
2097
+ [220, "Shield_Push_Left", "Fighting", "Punching"],
2098
+ [221, "Charged_Upward_Slash", "Fighting", "Punching"],
2099
+ [222, "Draw_and_Shoot_from_Back", "Fighting", "AttackingwithWeapon"],
2100
+ [223, "Draw_and_Shoot_from_Back_1", "Fighting", "AttackingwithWeapon"],
2101
+ [224, "Archery_Shot", "Fighting", "AttackingwithWeapon"],
2102
+ [225, "Archery_Shot_1", "Fighting", "AttackingwithWeapon"],
2103
+ [226, "Archery_Shot_2", "Fighting", "AttackingwithWeapon"],
2104
+ [227, "Archery_Shot_3", "Fighting", "AttackingwithWeapon"],
2105
+ [228, "Walk_Forward_with_Bow_Aimed", "Fighting", "AttackingwithWeapon"],
2106
+ [229, "Draw_and_Shoot_from_Back_2", "Fighting", "AttackingwithWeapon"],
2107
+ [230, "Walk_Backward_with_Bow_Aimed", "Fighting", "AttackingwithWeapon"],
2108
+ [231, "Archery_Aim_with_Lateral_Scan", "Fighting", "AttackingwithWeapon"],
2109
+ [232, "Cowboy_Quick_Draw_Shooting", "Fighting", "AttackingwithWeapon"],
2110
+ [233, "Walk_Backward_While_Shooting", "Fighting", "AttackingwithWeapon"],
2111
+ [234, "Walk_Forward_While_Shooting", "Fighting", "AttackingwithWeapon"],
2112
+ [235, "Forward_Roll_and_Fire", "Fighting", "AttackingwithWeapon"],
2113
+ [236, "Draw_and_Shoot_Left", "Fighting", "AttackingwithWeapon"],
2114
+ [237, "Charged_Axe_Chop", "Fighting", "AttackingwithWeapon"],
2115
+ [238, "Axe_Spin_Attack", "Fighting", "AttackingwithWeapon"],
2116
+ [239, "Crouch_Pull_and_Throw", "Fighting", "AttackingwithWeapon"],
2117
+ [240, "Thrust_Slash", "Fighting", "AttackingwithWeapon"],
2118
+ [241, "Weapon_Combo_2", "Fighting", "AttackingwithWeapon"],
2119
+ [242, "Charged_Slash", "Fighting", "AttackingwithWeapon"],
2120
+ [243, "Idle_3", "DailyActions", "Idle"],
2121
+ [244, "Idle_4", "DailyActions", "Idle"],
2122
+ [245, "Idle_5", "DailyActions", "Idle"],
2123
+ [246, "Idle_6", "DailyActions", "Idle"],
2124
+ [247, "Idle_7", "DailyActions", "Idle"],
2125
+ [248, "Idle_8", "DailyActions", "Idle"],
2126
+ [249, "Idle_9", "DailyActions", "Idle"],
2127
+ [250, "Idle_10", "DailyActions", "Idle"],
2128
+ [251, "Idle_11", "DailyActions", "Idle"],
2129
+ [252, "Idle_12", "DailyActions", "Idle"],
2130
+ [253, "Idle_13", "DailyActions", "Idle"],
2131
+ [254, "Idle_14", "DailyActions", "Idle"],
2132
+ [255, "Angry_Ground_Stomp", "DailyActions", "Idle"],
2133
+ [256, "Angry_Ground_Stomp_1", "DailyActions", "Idle"],
2134
+ [257, "Angry_Ground_Stomp_2", "DailyActions", "Idle"],
2135
+ [258, "CrouchLookAroundBow", "DailyActions", "Idle"],
2136
+ [259, "Step_Forward_and_Push", "DailyActions", "Pushing"],
2137
+ [260, "Push_Forward_and_Stop", "DailyActions", "Pushing"],
2138
+ [261, "Push_and_Walk_Forward", "DailyActions", "Pushing"],
2139
+ [262, "Crouch_and_Push_Forward", "DailyActions", "Pushing"],
2140
+ [263, "Sleep_on_Desk", "DailyActions", "Sleeping"],
2141
+ [264, "Cough_While_Sleeping", "DailyActions", "Sleeping"],
2142
+ [265, "Groan_Holding_Stomach_in_Sleep", "DailyActions", "Sleeping"],
2143
+ [266, "Lie_Down_Hands_Spread", "DailyActions", "Sleeping"],
2144
+ [267, "Sleep_Normally", "DailyActions", "Sleeping"],
2145
+ [268, "Sit_and_Doze_Off", "DailyActions", "Sleeping"],
2146
+ [269, "sleep", "DailyActions", "Sleeping"],
2147
+ [270, "Toss_and_Turn", "DailyActions", "Sleeping"],
2148
+ [271, "Wake_Up_and_Look_Up", "DailyActions", "Sleeping"],
2149
+ [272, "Lie_on_Chair_Sunbathe_and_Sleep", "DailyActions", "Sleeping"],
2150
+ [273, "Male_Run_Forward_Pick_Up_Left", "DailyActions", "PickingUpItem"],
2151
+ [274, "Female_Crouch_Pick_Up_Place_Side", "DailyActions", "PickingUpItem"],
2152
+ [275, "Female_Run_Forward_Pick_Up_Right", "DailyActions", "PickingUpItem"],
2153
+ [276, "Male_Bend_Over_Pick_Up", "DailyActions", "PickingUpItem"],
2154
+ [277, "Female_Crouch_Pick_Fruit_Basket_Stand", "DailyActions", "PickingUpItem"],
2155
+ [278, "Female_Stand_Pick_Fruit_Basket", "DailyActions", "PickingUpItem"],
2156
+ [279, "Female_Crouch_Pick_Gun_Point_Forward", "DailyActions", "PickingUpItem"],
2157
+ [280, "Female_Crouch_Pick_Throw_Forward", "DailyActions", "PickingUpItem"],
2158
+ [281, "Female_Bend_Over_Pick_Up_Inspect", "DailyActions", "PickingUpItem"],
2159
+ [282, "Female_Walk_Pick_Put_In_Pocket", "DailyActions", "PickingUpItem"],
2160
+ [283, "Pull_Radish", "DailyActions", "PickingUpItem"],
2161
+ [284, "Collect_Object", "DailyActions", "PickingUpItem"],
2162
+ [285, "open_door", "DailyActions", "Interacting"],
2163
+ [286, "open_door_1", "DailyActions", "Interacting"],
2164
+ [287, "open_door_2", "DailyActions", "Interacting"],
2165
+ [288, "open_door_3", "DailyActions", "Interacting"],
2166
+ [289, "open_door_4", "DailyActions", "Interacting"],
2167
+ [290, "Wave_One_Hand", "DailyActions", "Interacting"],
2168
+ [291, "Wave_for_Help", "DailyActions", "Interacting"],
2169
+ [292, "Gesture_with_Hand_on_Gun", "DailyActions", "Interacting"],
2170
+ [293, "Wave_for_Help_1", "DailyActions", "Interacting"],
2171
+ [294, "Wave_for_Help_2", "DailyActions", "Interacting"],
2172
+ [295, "Wave_for_Help_3", "DailyActions", "Interacting"],
2173
+ [296, "Wave_for_Help_4", "DailyActions", "Interacting"],
2174
+ [297, "Personalized_Gesture", "DailyActions", "Interacting"],
2175
+ [298, "Cheer_with_Both_Hands_Up", "DailyActions", "Interacting"],
2176
+ [299, "Stand_Clap_and_Sit_Down", "DailyActions", "Interacting"],
2177
+ [300, "Sit_Cheer_with_Left_Hand", "DailyActions", "Interacting"],
2178
+ [301, "Cheer_with_Both_Hands_1", "DailyActions", "Interacting"],
2179
+ [302, "Stand_Wave_and_Sit_Down", "DailyActions", "Interacting"],
2180
+ [303, "Cheer_with_Both_Hands", "DailyActions", "Interacting"],
2181
+ [304, "Seated_Fist_Pump", "DailyActions", "Interacting"],
2182
+ [305, "Stand_Cheer_and_Sit_Down", "DailyActions", "Interacting"],
2183
+ [306, "Cheer_with_One_Hand_Up", "DailyActions", "Interacting"],
2184
+ [307, "Sitting_Answering_Questions", "DailyActions", "Interacting"],
2185
+ [308, "Talk_Passionately", "DailyActions", "Interacting"],
2186
+ [309, "Talk_with_Left_Hand_on_Hip", "DailyActions", "Interacting"],
2187
+ [310, "Talk_with_Left_Hand_Raised", "DailyActions", "Interacting"],
2188
+ [311, "Stand_Talking_Angry", "DailyActions", "Interacting"],
2189
+ [312, "Phone_Conversation", "DailyActions", "Interacting"],
2190
+ [313, "Talk_with_Hands_Open", "DailyActions", "Interacting"],
2191
+ [314, "Talk_with_Right_Hand_Open", "DailyActions", "Interacting"],
2192
+ [315, "Hand_on_Hip_Gesture", "DailyActions", "Interacting"],
2193
+ [316, "Headache_Relief", "DailyActions", "Interacting"],
2194
+ [317, "Shrug", "DailyActions", "Interacting"],
2195
+ [318, "Scheming_Hand_Rub", "DailyActions", "Interacting"],
2196
+ [319, "air_squat", "DailyActions", "WorkingOut"],
2197
+ [320, "bicep_curl", "DailyActions", "WorkingOut"],
2198
+ [321, "bicycle_crunch", "DailyActions", "WorkingOut"],
2199
+ [322, "circle_crunch", "DailyActions", "WorkingOut"],
2200
+ [323, "golf_drive", "DailyActions", "WorkingOut"],
2201
+ [324, "idle_to_push_up", "DailyActions", "WorkingOut"],
2202
+ [325, "jump_push_up", "DailyActions", "WorkingOut"],
2203
+ [326, "jumping_jacks", "DailyActions", "WorkingOut"],
2204
+ [327, "kettlebell_swing", "DailyActions", "WorkingOut"],
2205
+ [328, "push_up_to_idle", "DailyActions", "WorkingOut"],
2206
+ [329, "push_up", "DailyActions", "WorkingOut"],
2207
+ [330, "situps", "DailyActions", "WorkingOut"],
2208
+ [331, "Sumo_High_Pull", "DailyActions", "WorkingOut"],
2209
+ [333, "Look_Around_Dumbfounded", "DailyActions", "LookingAround"],
2210
+ [334, "Lower_Weapon_Look_Raise", "DailyActions", "LookingAround"],
2211
+ [335, "Axe_Breathe_and_Look_Around", "DailyActions", "LookingAround"],
2212
+ [336, "Long_Breathe_and_Look_Around", "DailyActions", "LookingAround"],
2213
+ [337, "Torch_Look_Around", "DailyActions", "LookingAround"],
2214
+ [338, "Short_Breathe_and_Look_Around", "DailyActions", "LookingAround"],
2215
+ [339, "Walking_Scan_with_Sudden_Look_Back", "DailyActions", "LookingAround"],
2216
+ [340, "Crawl_and_Look_Back", "DailyActions", "LookingAround"],
2217
+ [341, "Walk_Slowly_and_Look_Around", "DailyActions", "LookingAround"],
2218
+ [342, "Stand_and_Drink", "DailyActions", "Drinking"],
2219
+ [343, "Sit_and_Drink", "DailyActions", "Drinking"],
2220
+ [344, "Stand_Up1", "DailyActions", "Transitioning"],
2221
+ [345, "Stand_Up2", "DailyActions", "Transitioning"],
2222
+ [346, "Stand_Up3", "DailyActions", "Transitioning"],
2223
+ [347, "Stand_Up4", "DailyActions", "Transitioning"],
2224
+ [348, "Stand_Up5", "DailyActions", "Transitioning"],
2225
+ [349, "Stand_Up6", "DailyActions", "Transitioning"],
2226
+ [350, "Stand_Up7", "DailyActions", "Transitioning"],
2227
+ [351, "Stand_Up8", "DailyActions", "Transitioning"],
2228
+ [352, "Stand_Up9", "DailyActions", "Transitioning"],
2229
+ [353, "Stand_Up10", "DailyActions", "Transitioning"],
2230
+ [354, "Sitting_Clap", "DailyActions", "Transitioning"],
2231
+ [355, "Sit_Finger_Wag_No", "DailyActions", "Transitioning"],
2232
+ [356, "Sit_Hands_on_Head_Lean_Back", "DailyActions", "Transitioning"],
2233
+ [357, "Sit_Thumbs_Up_Right", "DailyActions", "Transitioning"],
2234
+ [358, "Sit_Shout_Hands_on_Mouth", "DailyActions", "Transitioning"],
2235
+ [359, "Look_Back_and_Sit", "DailyActions", "Transitioning"],
2236
+ [360, "Sit_to_standTransition_Female_2", "DailyActions", "Transitioning"],
2237
+ [361, "Sit_Dodge", "DailyActions", "Transitioning"],
2238
+ [362, "Sit_Cross_Legged", "DailyActions", "Transitioning"],
2239
+ [363, "Sit_Cross_Legged_on_Floor", "DailyActions", "Transitioning"],
2240
+ [364, "Sit_on_Chair_Arms_Crossed", "DailyActions", "Transitioning"],
2241
+ [365, "Kneel_on_One_Knee_and_Stand", "DailyActions", "Transitioning"],
2242
+ [366, "falling_down", "DailyActions", "Transitioning"],
2243
+ [367, "SideLying_Reach_Help", "DailyActions", "Transitioning"],
2244
+ [368, "Angry_To_Tantrum_Sit", "DailyActions", "Transitioning"],
2245
+ [369, "Lie_Back_Leg_Swing", "DailyActions", "Transitioning"],
2246
+ [370, "Stand_To_Side_Lying", "DailyActions", "Transitioning"],
2247
+ [371, "Sit_Lie_Bed", "DailyActions", "Transitioning"],
2248
+ [372, "Prone_Reach_Help", "DailyActions", "Transitioning"],
2249
+ [375, "Handstand_Flip", "BodyMovements", "Acting"],
2250
+ [376, "Punch_Pose", "BodyMovements", "Acting"],
2251
+ [377, "Relax_arms_then_strike_battle_pose", "BodyMovements", "Acting"],
2252
+ [378, "Large_step_then_high_kick", "BodyMovements", "Acting"],
2253
+ [379, "Side_jumps_in_horse_stance", "BodyMovements", "Acting"],
2254
+ [381, "Step_Right_for_Exercise", "BodyMovements", "Acting"],
2255
+ [382, "Jump_and_Slam_Back_Down", "BodyMovements", "Acting"],
2256
+ [384, "Quick_Step_and_Spin_Dodge", "BodyMovements", "Acting"],
2257
+ [385, "Boxing_Warmup", "BodyMovements", "Acting"],
2258
+ [386, "Zombie_Scream", "BodyMovements", "Acting"],
2259
+ [387, "Half_Squat_with_Thumb_Up", "BodyMovements", "Acting"],
2260
+ [388, "Show_Both_Arm_Muscles", "BodyMovements", "Acting"],
2261
+ [389, "Grip_and_Throw_Down", "BodyMovements", "Acting"],
2262
+ [390, "Stand_on_Pole_and_Balance", "BodyMovements", "Acting"],
2263
+ [391, "Head_Hold_in_Pain", "BodyMovements", "Acting"],
2264
+ [392, "Ground_Flip_and_Sweep_Up", "BodyMovements", "Acting"],
2265
+ [393, "baseball_pitching", "BodyMovements", "Acting"],
2266
+ [394, "Backflip_and_Hooks", "BodyMovements", "Acting"],
2267
+ [395, "Breakdance_1990", "BodyMovements", "Acting"],
2268
+ [396, "Burpee_Exercise", "BodyMovements", "Acting"],
2269
+ [397, "360_Power_Spin_Jump", "BodyMovements", "Acting"],
2270
+ [398, "Crouch_Charge_and_Throw", "BodyMovements", "Acting"],
2271
+ [399, "Step_Step_Turn_Kick", "BodyMovements", "Acting"],
2272
+ [401, "Sprint_Roll_and_Flip", "BodyMovements", "Acting"],
2273
+ [402, "Run_and_Leap", "BodyMovements", "Acting"],
2274
+ [403, "Victory_Fist_Pump", "BodyMovements", "Acting"],
2275
+ [404, "Crouch_and_Step_Back", "BodyMovements", "Acting"],
2276
+ [405, "Joyful_Dance_with_Hand_Sway", "BodyMovements", "Acting"],
2277
+ [406, "Thomas_Flair_to_Jump_Up", "BodyMovements", "Acting"],
2278
+ [407, "Wall_Push_Jump_and_Flip", "BodyMovements", "Acting"],
2279
+ [408, "Jazz_Hands", "BodyMovements", "Acting"],
2280
+ [409, "Finger_Wag_No", "BodyMovements", "Acting"],
2281
+ [410, "Kick_a_Soccer_Ball", "BodyMovements", "Acting"],
2282
+ [411, "Neck_Slashing_Gesture", "BodyMovements", "Acting"],
2283
+ [412, "victory", "BodyMovements", "Acting"],
2284
+ [413, "Backflip_and_Rise", "BodyMovements", "Acting"],
2285
+ [414, "Double_kick_forward", "BodyMovements", "Acting"],
2286
+ [415, "Happy_Sway_Standing", "BodyMovements", "Acting"],
2287
+ [416, "Hit_in_Back_While_Running", "BodyMovements", "Acting"],
2288
+ [417, "Hop_with_Arms_Raised", "BodyMovements", "Acting"],
2289
+ [419, "Jump_to_Catch_and_Fall", "BodyMovements", "Acting"],
2290
+ [420, "Left_Hand_Bitten_Step_Back", "BodyMovements", "Acting"],
2291
+ [421, "Over_Shoulder_Throw", "BodyMovements", "Acting"],
2292
+ [422, "Rising_Flying_Kick", "BodyMovements", "Acting"],
2293
+ [425, "Vault_with_Rifle", "BodyMovements", "VaultingOverObstacle"],
2294
+ [426, "Roll_Behind_Cover", "BodyMovements", "VaultingOverObstacle"],
2295
+ [427, "Vault_and_Land", "BodyMovements", "VaultingOverObstacle"],
2296
+ [428, "Unarmed_Vault", "BodyMovements", "VaultingOverObstacle"],
2297
+ [429, "Parkour_Vault", "BodyMovements", "VaultingOverObstacle"],
2298
+ [430, "Parkour_Vault_with_Roll", "BodyMovements", "VaultingOverObstacle"],
2299
+ [431, "Parkour_Vault_1", "BodyMovements", "VaultingOverObstacle"],
2300
+ [432, "Parkour_Vault_2", "BodyMovements", "VaultingOverObstacle"],
2301
+ [433, "Parkour_Vault_3", "BodyMovements", "VaultingOverObstacle"],
2302
+ [434, "Fast_Ladder_Climb", "BodyMovements", "Climbing"],
2303
+ [435, "Ladder_Climb_Finish", "BodyMovements", "Climbing"],
2304
+ [436, "Ladder_Mount_Start", "BodyMovements", "Climbing"],
2305
+ [437, "Slow_Ladder_Climb", "BodyMovements", "Climbing"],
2306
+ [438, "Ladder_Climb_Loop", "BodyMovements", "Climbing"],
2307
+ [439, "Climb_Left_with_Both_Limbs", "BodyMovements", "Climbing"],
2308
+ [440, "Climb_Right_with_Both_Limbs", "BodyMovements", "Climbing"],
2309
+ [441, "Climb_Stairs", "BodyMovements", "Climbing"],
2310
+ [442, "Fast_Stair_Climb", "BodyMovements", "Climbing"],
2311
+ [444, "climbing_up_wall", "BodyMovements", "Climbing"],
2312
+ [445, "diagonal_wall_run", "BodyMovements", "Climbing"],
2313
+ [446, "Hang_and_Climb_Left", "BodyMovements", "Climbing"],
2314
+ [447, "Hang_and_Climb_Rght", "BodyMovements", "Climbing"],
2315
+ [448, "Jump_and_Grab_Wall", "BodyMovements", "Climbing"],
2316
+ [449, "Climb_Up_Rope", "BodyMovements", "Climbing"],
2317
+ [450, "Wall_Flip", "BodyMovements", "PerformingStunt"],
2318
+ [451, "One_Arm_Handstand", "BodyMovements", "PerformingStunt"],
2319
+ [452, "Backflip", "BodyMovements", "PerformingStunt"],
2320
+ [453, "Backflip_Sweep_Kick", "BodyMovements", "PerformingStunt"],
2321
+ [455, "Sweep_Kick", "BodyMovements", "PerformingStunt"],
2322
+ [456, "Jumping_Head_Scissor_Takedown", "BodyMovements", "PerformingStunt"],
2323
+ [457, "Jumping_Punch", "BodyMovements", "PerformingStunt"],
2324
+ [458, "Unicycle_Jump_Dismount", "BodyMovements", "PerformingStunt"],
2325
+ [459, "Run_Jump_and_Roll", "BodyMovements", "PerformingStunt"],
2326
+ [460, "Jump_with_Arms_Open", "BodyMovements", "Jumping"],
2327
+ [461, "Jump_with_Arms_and_Legs_Open", "BodyMovements", "Jumping"],
2328
+ [462, "Backflip_Jump", "BodyMovements", "Jumping"],
2329
+ [463, "Run_and_Jump", "BodyMovements", "Jumping"],
2330
+ [464, "Leap_and_Punch", "BodyMovements", "Jumping"],
2331
+ [465, "Leap_Right_and_Catch", "BodyMovements", "Jumping"],
2332
+ [466, "Regular_Jump", "BodyMovements", "Jumping"],
2333
+ [467, "Jump_Over_Obstacle_2", "BodyMovements", "Jumping"],
2334
+ [468, "Back_Jump", "BodyMovements", "Jumping"],
2335
+ [470, "Jumping_Down", "BodyMovements", "Jumping"],
2336
+ [471, "Jump_Over_Obstacle", "BodyMovements", "Jumping"],
2337
+ [472, "Jump_Over_Obstacle_1", "BodyMovements", "Jumping"],
2338
+ [473, "Quad_Jump_Left", "BodyMovements", "HangingfromLedge"],
2339
+ [474, "Quad_Jump_Up", "BodyMovements", "HangingfromLedge"],
2340
+ [475, "Quad_Climb_Right", "BodyMovements", "HangingfromLedge"],
2341
+ [476, "Hang_and_Push_with_Foot", "BodyMovements", "HangingfromLedge"],
2342
+ [477, "Rope_Hang_Idle", "BodyMovements", "HangingfromLedge"],
2343
+ [478, "Bar_Hang_Idle", "BodyMovements", "HangingfromLedge"],
2344
+ [479, "Upside_Down_Rope_Hang", "BodyMovements", "HangingfromLedge"],
2345
+ [480, "Upside_Down_Rope_Hang_1", "BodyMovements", "HangingfromLedge"],
2346
+ [481, "Upside_Down_Rope_Hang_2", "BodyMovements", "HangingfromLedge"],
2347
+ [482, "Grab_Wall_Midair_Idle", "BodyMovements", "HangingfromLedge"],
2348
+ [483, "Slow_Bar_Hang_Left", "BodyMovements", "HangingfromLedge"],
2349
+ [484, "Slow_Bar_Hang_Right", "BodyMovements", "HangingfromLedge"],
2350
+ [485, "Jump_and_Hang_on_Bar", "BodyMovements", "HangingfromLedge"],
2351
+ [486, "Wall_Support_to_Step_Down", "BodyMovements", "HangingfromLedge"],
2352
+ [487, "Climb_Attempt_and_Fall_3", "BodyMovements", "FallingFreely"],
2353
+ [488, "Climb_Attempt_and_Fall_4", "BodyMovements", "FallingFreely"],
2354
+ [489, "Climb_Attempt_and_Fall_5", "BodyMovements", "FallingFreely"],
2355
+ [490, "Fall_Down", "BodyMovements", "HangingfromLedge"],
2356
+ [491, "Fall_from_Bar", "BodyMovements", "HangingfromLedge"],
2357
+ [492, "Wall_Support_Jump_to_Ground", "BodyMovements", "HangingfromLedge"],
2358
+ [493, "Jump_Down_from_Wall", "BodyMovements", "HangingfromLedge"],
2359
+ [494, "Swing_on_Rope_to_Ground", "BodyMovements", "HangingfromLedge"],
2360
+ [495, "Grab_Bar_and_Swing_Forward", "BodyMovements", "HangingfromLedge"],
2361
+ [496, "Rope_Hang_Backflip_to_Crouch", "BodyMovements", "HangingfromLedge"],
2362
+ [497, "climbing_down_wall", "BodyMovements", "Climbing"],
2363
+ [498, "Climb_Attempt_and_Fall", "BodyMovements", "FallingFreely"],
2364
+ [499, "Climb_Attempt_and_Fall_1", "BodyMovements", "FallingFreely"],
2365
+ [500, "Climb_Attempt_and_Fall_2", "BodyMovements", "FallingFreely"],
2366
+ [501, "Leap_of_Faith", "BodyMovements", "FallingFreely"],
2367
+ [502, "Fall1", "BodyMovements", "FallingFreely"],
2368
+ [503, "Fall2", "BodyMovements", "FallingFreely"],
2369
+ [504, "Fall3", "BodyMovements", "FallingFreely"],
2370
+ [505, "Fall4", "BodyMovements", "FallingFreely"],
2371
+ [506, "Dive_Down_and_Land", "BodyMovements", "FallingFreely"],
2372
+ [507, "Dive_Down_and_Land_1", "BodyMovements", "FallingFreely"],
2373
+ [508, "Dive_Down_and_Land_2", "BodyMovements", "FallingFreely"],
2374
+ [509, "Lean_Forward_Sprint", "WalkAndRun", "Running"],
2375
+ [510, "Standard_Forward_Charge", "WalkAndRun", "Running"],
2376
+ [511, "Rifle_Charge", "WalkAndRun", "Running"],
2377
+ [512, "Male_Head_Down_Charge", "WalkAndRun", "Running"],
2378
+ [513, "Female_Head_Down_Charge", "WalkAndRun", "Running"],
2379
+ [514, "Female_Bow_Charge_Left_Hand", "WalkAndRun", "Running"],
2380
+ [515, "Female_Throwing_Stance_Charge", "WalkAndRun", "Running"],
2381
+ [516, "slide_light", "WalkAndRun", "Running"],
2382
+ [517, "slide_right", "WalkAndRun", "Running"],
2383
+ [518, "sliding_rool", "WalkAndRun", "Running"],
2384
+ [519, "sliding_stumble", "WalkAndRun", "Running"],
2385
+ [520, "Crouch_Walk_with_Torch", "WalkAndRun", "CrouchWalking"],
2386
+ [521, "Crouch_Walk_Left_with_Torch", "WalkAndRun", "CrouchWalking"],
2387
+ [522, "Crouch_Walk_Right_with_Torch", "WalkAndRun", "CrouchWalking"],
2388
+ [523, "Cautious_Crouch_Walk_Backward", "WalkAndRun", "CrouchWalking"],
2389
+ [524, "Cautious_Crouch_Walk_Forward", "WalkAndRun", "CrouchWalking"],
2390
+ [525, "Cautious_Crouch_Walk_Left", "WalkAndRun", "CrouchWalking"],
2391
+ [526, "Cautious_Crouch_Walk_Right", "WalkAndRun", "CrouchWalking"],
2392
+ [527, "Crouch_Walk_Left_with_Gun", "WalkAndRun", "CrouchWalking"],
2393
+ [528, "Walk_Left_with_Gun", "WalkAndRun", "CrouchWalking"],
2394
+ [529, "Walk_Backward_with_Gun", "WalkAndRun", "CrouchWalking"],
2395
+ [530, "run_fast_3", "WalkAndRun", "Running"],
2396
+ [531, "Sprint_and_Sudden_Stop", "WalkAndRun", "Running"],
2397
+ [532, "run_fast_4", "WalkAndRun", "Running"],
2398
+ [533, "run_fast_5", "WalkAndRun", "Running"],
2399
+ [534, "run_fast_6", "WalkAndRun", "Running"],
2400
+ [535, "run_fast_7", "WalkAndRun", "Running"],
2401
+ [536, "run_fast_8", "WalkAndRun", "Running"],
2402
+ [537, "run_fast_9", "WalkAndRun", "Running"],
2403
+ [538, "run_fast_10", "WalkAndRun", "Running"],
2404
+ [539, "run_fast_2", "WalkAndRun", "Running"],
2405
+ [540, "Injured_Walk_Backward", "WalkAndRun", "Walking"],
2406
+ [541, "Walk_Backward_with_Gun_1", "WalkAndRun", "Walking"],
2407
+ [542, "Walk_Backward_with_Grenade", "WalkAndRun", "Walking"],
2408
+ [543, "Step_Back", "WalkAndRun", "Walking"],
2409
+ [544, "Walk_Backward", "WalkAndRun", "Walking"],
2410
+ [545, "Walk_Backward_with_Bow", "WalkAndRun", "Walking"],
2411
+ [546, "Walk_Backward_with_Sword", "WalkAndRun", "Walking"],
2412
+ [547, "Walk_Backward_with_Bow_1", "WalkAndRun", "Walking"],
2413
+ [548, "Walk_Backward_with_Sword_Shield", "WalkAndRun", "Walking"],
2414
+ [549, "Crawl_Backward", "WalkAndRun", "Walking"],
2415
+ [550, "Carry_Heavy_Cannon_Forward", "WalkAndRun", "Walking"],
2416
+ [551, "Carry_Heavy_Object_Walk", "WalkAndRun", "Walking"],
2417
+ [552, "Carry_Water_Bucket_Walk", "WalkAndRun", "Walking"],
2418
+ [553, "Elderly_Shaky_Walk", "WalkAndRun", "Walking"],
2419
+ [554, "Funky_Walk", "WalkAndRun", "Walking"],
2420
+ [555, "Limping_Walk_1", "WalkAndRun", "Walking"],
2421
+ [556, "Limping_Walk_2", "WalkAndRun", "Walking"],
2422
+ [557, "Limping_Walk_3", "WalkAndRun", "Walking"],
2423
+ [558, "Limping_Walk", "WalkAndRun", "Walking"],
2424
+ [559, "Sneaky_Walk", "WalkAndRun", "Walking"],
2425
+ [560, "Spear_Walk", "WalkAndRun", "Walking"],
2426
+ [561, "Step_Hip_Hop_Dance", "WalkAndRun", "Walking"],
2427
+ [562, "Stumble_Walk", "WalkAndRun", "Walking"],
2428
+ [563, "Stylish_Walk", "WalkAndRun", "Walking"],
2429
+ [564, "Tightrope_Walk", "WalkAndRun", "Walking"],
2430
+ [565, "Walk_with_Umbrella", "WalkAndRun", "Walking"],
2431
+ [566, "walking_2", "WalkAndRun", "Walking"],
2432
+ [567, "Walk_with_Walker_Support", "WalkAndRun", "Walking"],
2433
+ [568, "Swim_Idle", "WalkAndRun", "Swimming"],
2434
+ [569, "Swim_Forward", "WalkAndRun", "Swimming"],
2435
+ [570, "swimming_to_edge", "WalkAndRun", "Swimming"],
2436
+ [571, "Run_Turn_Left", "WalkAndRun", "TurningAround"],
2437
+ [572, "Walk_Turn_Left", "WalkAndRun", "TurningAround"],
2438
+ [573, "Rifle_Turn_Left", "WalkAndRun", "TurningAround"],
2439
+ [574, "Walk_Turn_Left_with_Weapon", "WalkAndRun", "TurningAround"],
2440
+ [575, "Combat_Idle_Turn_Left", "WalkAndRun", "TurningAround"],
2441
+ [576, "Idle_Turn_Left", "WalkAndRun", "TurningAround"],
2442
+ [577, "Idle_Step_Turn_Left", "WalkAndRun", "TurningAround"],
2443
+ [578, "Idle_Torch_Turn_Left", "WalkAndRun", "TurningAround"],
2444
+ [579, "Depressed_Full_Turn_Left", "WalkAndRun", "TurningAround"],
2445
+ [580, "Sword_and_Shield_Alert_Turn_Left", "WalkAndRun", "TurningAround"],
2446
+ [581, "Run_Sharp_Turn_Right", "WalkAndRun", "TurningAround"],
2447
+ [582, "Run_Turn_Right", "WalkAndRun", "TurningAround"],
2448
+ [583, "Walk_Turn_Right", "WalkAndRun", "TurningAround"],
2449
+ [584, "Walk_Turn_Right_Female", "WalkAndRun", "TurningAround"],
2450
+ [585, "Rifle_Aim_Turn_Right", "WalkAndRun", "TurningAround"],
2451
+ [586, "Idle_Turn_Right", "WalkAndRun", "TurningAround"],
2452
+ [587, "Walk_Turn_Right_Idle_Style", "WalkAndRun", "TurningAround"],
2453
+ [588, "Frustrated_Turn_Right", "WalkAndRun", "TurningAround"],
2454
+ [589, "Alert_Quick_Turn_Right", "WalkAndRun", "TurningAround"],
2455
+ [590, "Sword_and_Shield_Alert_Turn_Right", "WalkAndRun", "TurningAround"],
2456
+ [591, "Hip_Hop_Dance", "Dancing", "Dancing"],
2457
+ [592, "Hip_Hop_Dance_1", "Dancing", "Dancing"],
2458
+ [593, "Hip_Hop_Dance_2", "Dancing", "Dancing"],
2459
+ [594, "Hip_Hop_Dance_3", "Dancing", "Dancing"],
2460
+ [595, "jazz_danc", "Dancing", "Dancing"],
2461
+ [596, "ymca_dance", "Dancing", "Dancing"],
2462
+ [597, "Hip_Hop_Dance_4", "Dancing", "Dancing"],
2463
+ [598, "kettlebell_swing_1", "DailyActions", "WorkingOut"],
2464
+ [599, "Idle_15", "DailyActions", "Idle"],
2465
+ [601, "Backflip_inplace", "BodyMovements", "PerformingStunt"],
2466
+ [604, "Backflip_Sweep_Kick_inplace", "BodyMovements", "PerformingStunt"],
2467
+ [605, "Back_Jump_inplace", "BodyMovements", "Jumping"],
2468
+ [606, "BackLeft_run_inplace", "WalkAndRun", "Running"],
2469
+ [607, "BackRight_Run_inplace", "WalkAndRun", "Running"],
2470
+ [608, "BeHit_FlyUp_inplace", "Fighting", "GettingHit"],
2471
+ [609, "Boxing_Practice_inplace", "Fighting", "Punching"],
2472
+ [610, "Carry_Heavy_Cannon_Forward_inplace", "WalkAndRun", "Walking"],
2473
+ [611, "Carry_Heavy_Object_Walk_inplace", "WalkAndRun", "Walking"],
2474
+ [612, "Carry_Water_Bucket_Walk_inplace", "WalkAndRun", "Walking"],
2475
+ [613, "Casual_Walk_inplace", "WalkAndRun", "Walking"],
2476
+ [615, "Cautious_Crouch_Walk_Backward_inplace", "WalkAndRun", "CrouchWalking"],
2477
+ [616, "Cautious_Crouch_Walk_Forward_inplace", "WalkAndRun", "CrouchWalking"],
2478
+ [617, "Cautious_Crouch_Walk_Left_inplace", "WalkAndRun", "CrouchWalking"],
2479
+ [618, "Cautious_Crouch_Walk_Right_inplace", "WalkAndRun", "CrouchWalking"],
2480
+ [619, "Climb_Left_with_Both_Limbs_inplace", "BodyMovements", "Climbing"],
2481
+ [620, "Climb_Right_with_Both_Limbs_inplace", "BodyMovements", "Climbing"],
2482
+ [621, "Confident_Strut_inplace", "WalkAndRun", "Walking"],
2483
+ [622, "Crawl_Backward_inplace", "WalkAndRun", "Walking"],
2484
+ [623, "Crouch_Walk_Left_with_Gun_inplace", "WalkAndRun", "CrouchWalking"],
2485
+ [624, "Crouch_Walk_Left_with_Torch_inplace", "WalkAndRun", "CrouchWalking"],
2486
+ [625, "Crouch_Walk_Right_with_Torch_inplace", "WalkAndRun", "CrouchWalking"],
2487
+ [626, "Elderly_Shaky_Walk_inplace", "WalkAndRun", "Walking"],
2488
+ [627, "Female_Bow_Charge_Left_Hand_inplace", "WalkAndRun", "Running"],
2489
+ [628, "Female_Throwing_Stance_Charge_inplace", "WalkAndRun", "Running"],
2490
+ [629, "Flirty_Strut_inplace", "WalkAndRun", "Walking"],
2491
+ [630, "ForwardLeft_Run_Fight_inplace", "Fighting", "Transitioning"],
2492
+ [631, "ForwardRight_Run_Fight_inplace", "Fighting", "Transitioning"],
2493
+ [632, "Funky_Walk_inplace", "WalkAndRun", "Walking"],
2494
+ [635, "Handbag_Walk_inplace", "BodyMovements", "Acting"],
2495
+ [636, "Hello_Run_inplace", "WalkAndRun", "Running"],
2496
+ [637, "Injured_Walk_inplace", "WalkAndRun", "Walking"],
2497
+ [638, "Injured_Walk_Backward_inplace", "WalkAndRun", "Walking"],
2498
+ [639, "Jazz_Hands_inplace", "BodyMovements", "Acting"],
2499
+ [640, "Jump_Over_Obstacle_inplace", "BodyMovements", "Jumping"],
2500
+ [641, "Jump_Over_Obstacle_1_inplace", "BodyMovements", "Jumping"],
2501
+ [642, "Jump_Over_Obstacle_2_inplace", "BodyMovements", "Jumping"],
2502
+ [643, "Jump_Run_inplace", "WalkAndRun", "Running"],
2503
+ [644, "Lean_Forward_Sprint_inplace", "WalkAndRun", "Running"],
2504
+ [645, "Limping_Walk_inplace", "WalkAndRun", "Walking"],
2505
+ [646, "Limping_Walk_1_inplace", "WalkAndRun", "Walking"],
2506
+ [647, "Limping_Walk_2_inplace", "WalkAndRun", "Walking"],
2507
+ [648, "Limping_Walk_3_inplace", "WalkAndRun", "Walking"],
2508
+ [649, "Lunge_Roundhouse_Kick_inplace", "Fighting", "Punching"],
2509
+ [650, "Mummy_Stagger_inplace", "BodyMovements", "Acting"],
2510
+ [651, "Parkour_Vault_with_Roll_inplace", "BodyMovements", "VaultingOverObstacle"],
2511
+ [652, "Proud_Strut_inplace", "WalkAndRun", "Walking"],
2512
+ [653, "Red_Carpet_Walk_inplace", "WalkAndRun", "Walking"],
2513
+ [654, "Rifle_Charge_inplace", "WalkAndRun", "Running"],
2514
+ [656, "Run_and_Leap_inplace", "BodyMovements", "Acting"],
2515
+ [657, "run_fast_10_inplace", "WalkAndRun", "Running"],
2516
+ [658, "run_fast_2_inplace", "WalkAndRun", "Running"],
2517
+ [659, "run_fast_3_inplace", "WalkAndRun", "Running"],
2518
+ [660, "run_fast_4_inplace", "WalkAndRun", "Running"],
2519
+ [661, "run_fast_5_inplace", "WalkAndRun", "Running"],
2520
+ [662, "run_fast_6_inplace", "WalkAndRun", "Running"],
2521
+ [663, "run_fast_7_inplace", "WalkAndRun", "Running"],
2522
+ [664, "run_fast_8_inplace", "WalkAndRun", "Running"],
2523
+ [665, "run_fast_9_inplace", "WalkAndRun", "Running"],
2524
+ [666, "Running_Reload_inplace", "Fighting", "Transitioning"],
2525
+ [667, "Run_to_Walk_Transition_inplace", "WalkAndRun", "Walking"],
2526
+ [668, "Skip_Forward_inplace", "WalkAndRun", "Walking"],
2527
+ [669, "Slow_Orc_Walk_inplace", "WalkAndRun", "Walking"],
2528
+ [670, "Slow_Walk_Reload_inplace", "Fighting", "Transitioning"],
2529
+ [671, "Sneaky_Walk_inplace", "WalkAndRun", "Walking"],
2530
+ [672, "Spear_Walk_inplace", "WalkAndRun", "Walking"],
2531
+ [673, "Standard_Forward_Charge_inplace", "WalkAndRun", "Running"],
2532
+ [674, "Stumble_Walk_inplace", "WalkAndRun", "Walking"],
2533
+ [675, "Stylish_Walk_inplace", "WalkAndRun", "Walking"],
2534
+ [676, "Texting_Walk_inplace", "WalkAndRun", "Walking"],
2535
+ [677, "Tightrope_Walk_inplace", "WalkAndRun", "Walking"],
2536
+ [678, "Unsteady_Walk_inplace", "WalkAndRun", "Walking"],
2537
+ [679, "Walk_Backward_inplace", "WalkAndRun", "Walking"],
2538
+ [680, "Walk_Backward_While_Shooting_inplace", "Fighting", "AttackingwithWeapon"],
2539
+ [681, "Walk_Backward_with_Bow_inplace", "WalkAndRun", "Walking"],
2540
+ [682, "Walk_Backward_with_Bow_1_inplace", "WalkAndRun", "Walking"],
2541
+ [683, "Walk_Backward_with_Bow_Aimed_inplace", "Fighting", "AttackingwithWeapon"],
2542
+ [684, "Walk_Backward_with_Grenade_inplace", "WalkAndRun", "Walking"],
2543
+ [685, "Walk_Backward_with_Gun_inplace", "WalkAndRun", "CrouchWalking"],
2544
+ [686, "Walk_Backward_with_Gun_1_inplace", "WalkAndRun", "Walking"],
2545
+ [687, "Walk_Backward_with_Sword_inplace", "WalkAndRun", "Walking"],
2546
+ [688, "Walk_Fight_Back_inplace", "WalkAndRun", "Walking"],
2547
+ [689, "Walk_Fight_Forward_inplace", "WalkAndRun", "Walking"],
2548
+ [690, "Walk_Forward_While_Shooting_inplace", "Fighting", "AttackingwithWeapon"],
2549
+ [691, "Walk_Forward_with_Bow_Aimed_inplace", "Fighting", "AttackingwithWeapon"],
2550
+ [692, "walking_2_inplace", "WalkAndRun", "Walking"],
2551
+ [693, "Walking_with_Phone_inplace", "WalkAndRun", "Walking"],
2552
+ [694, "Walk_Left_with_Gun_inplace", "WalkAndRun", "CrouchWalking"],
2553
+ [695, "Walk_with_Umbrella_inplace", "WalkAndRun", "Walking"],
2554
+ [696, "Walk_with_Walker_Support_inplace", "WalkAndRun", "Walking"]
2555
+ ];
2556
+ var MESHY_ANIMATIONS = ROWS.map(([id, name, category, subcategory]) => ({
2557
+ id,
2558
+ name,
2559
+ category,
2560
+ subcategory
2561
+ }));
2562
+ var BY_ID = new Map(MESHY_ANIMATIONS.map((a) => [a.id, a]));
2563
+ var BY_NAME = new Map(MESHY_ANIMATIONS.map((a) => [normalize(a.name), a]));
2564
+ function normalize(name) {
2565
+ return name.trim().toLowerCase().replace(/[\s_-]+/g, "_");
2566
+ }
2567
+ function meshyAnimationById(id) {
2568
+ return BY_ID.get(id);
2569
+ }
2570
+ function meshyAnimationByName(name) {
2571
+ return BY_NAME.get(normalize(name));
2572
+ }
2573
+ function searchMeshyAnimations(query, limit = 25) {
2574
+ const words = query.toLowerCase().split(/[\s_-]+/).filter(Boolean);
2575
+ if (words.length === 0) return MESHY_ANIMATIONS.slice(0, limit);
2576
+ const out = [];
2577
+ for (const a of MESHY_ANIMATIONS) {
2578
+ const hay = `${a.name} ${a.category} ${a.subcategory ?? ""}`.toLowerCase().replace(/[_-]+/g, " ");
2579
+ if (words.every((w) => hay.includes(w))) {
2580
+ out.push(a);
2581
+ if (out.length >= limit) break;
2582
+ }
2583
+ }
2584
+ return out;
2910
2585
  }
2911
- var OPENROUTER_VIDEO_SPECS = {
2912
- "google/veo-3.1-lite": veoSpec2("Veo 3.1 Lite", {
2913
- "720p": { audio: 0.05, silent: 0.03 },
2914
- "1080p": { audio: 0.08, silent: 0.05 }
2915
- }),
2916
- "google/veo-3.1-fast": veoSpec2("Veo 3.1 Fast", {
2917
- "720p": { audio: 0.1, silent: 0.08 },
2918
- "1080p": { audio: 0.12, silent: 0.1 },
2919
- "4k": { audio: 0.3, silent: 0.25 }
2920
- }),
2921
- "google/veo-3.1": veoSpec2("Veo 3.1", {
2922
- "720p": { audio: 0.4, silent: 0.2 },
2923
- "1080p": { audio: 0.4, silent: 0.2 },
2924
- "4k": { audio: 0.6, silent: 0.4 }
2925
- })
2926
- };
2927
2586
  var PORT_TYPES = ["text", "image", "video", "mask", "mesh3d", "audio", "json"];
2928
2587
  var INPUT_PORT_TYPES = PORT_TYPES.filter((p) => p !== "mask");
2929
2588
 
@@ -3300,34 +2959,6 @@ function edgeKey(e) {
3300
2959
  function slotKey(target, port) {
3301
2960
  return JSON.stringify([target, port]);
3302
2961
  }
3303
- var FAL_NANO_BANANA_2_USD_BY_RESOLUTION2 = {
3304
- "0.5K": 0.06,
3305
- "1K": 0.08,
3306
- "2K": 0.12,
3307
- "4K": 0.16
3308
- };
3309
- var STUDIO3D_USD_PER_CREDIT2 = 29 / 3500;
3310
- function studio3dCreditsToUsd2(credits) {
3311
- return Math.round(credits * STUDIO3D_USD_PER_CREDIT2 * 1e3) / 1e3;
3312
- }
3313
- var FAL_MESHY_RIG_USD2 = 0.2;
3314
- function imageResolutionTier(value) {
3315
- if (typeof value !== "string") return null;
3316
- switch (value.trim().toLowerCase()) {
3317
- case "0.5k":
3318
- case "512px":
3319
- case "512":
3320
- return "0.5K";
3321
- case "1k":
3322
- return "1K";
3323
- case "2k":
3324
- return "2K";
3325
- case "4k":
3326
- return "4K";
3327
- default:
3328
- return null;
3329
- }
3330
- }
3331
2962
  var veo2 = (tier, label) => {
3332
2963
  const slug2 = tier ? `veo-3-1-${tier}` : "veo-3-1";
3333
2964
  return {
@@ -3369,11 +3000,11 @@ var ROUTES2 = [
3369
3000
  id: "route/kling-2-5-turbo-pro",
3370
3001
  label: "Kling 2.5 Turbo Pro (KIE, fal fallback)",
3371
3002
  primary: "kie/kling-v2-5-turbo-pro-image-to-video",
3372
- fallback: { start: "fal/kling-v2-5-image-to-video" },
3373
- // fal needs an aspect ratio (16:9, 9:16 or 1:1) and KIE takes none, so a
3374
- // fallback would crop a start frame of another shape. The ratio comes from
3375
- // the start frame once that is built (decision 7 of the plan).
3376
- noFallbackYet: "fal renders Kling 2.5 at a set aspect ratio (16:9, 9:16 or 1:1) and KIE takes none, so a fallback could crop the start frame. Pin the fal Kling 2.5 entry to choose the ratio yourself."
3003
+ // fal renders Kling 2.5 at a set aspect ratio (16:9, 9:16 or 1:1) and KIE
3004
+ // takes none. The fal attempt gets the allowed ratio nearest the start
3005
+ // frame's shape (`aspectFromFrame`, decision 7 of the plan); a frame whose
3006
+ // size cannot be read leaves this route without a fallback.
3007
+ fallback: { start: "fal/kling-v2-5-image-to-video" }
3377
3008
  },
3378
3009
  {
3379
3010
  kind: "video",
@@ -3433,32 +3064,33 @@ var MODEL_ROUTES2 = Object.fromEntries(ROUTES2.map((r) => [r.id, r]));
3433
3064
  function getRoute2(modelId) {
3434
3065
  return modelId ? MODEL_ROUTES2[modelId] : void 0;
3435
3066
  }
3436
- var MODEL_CATALOG2 = [
3437
- // LIST PRICES (`listPrice`, pricing plan of 2026-10-10). Every KIE entry
3438
- // names where the official list price of its requests is found, because KIE
3439
- // is the reseller route that sells below list and the price floor needs the
3440
- // figure. The rule: the model owner's own published price where the catalog
3441
- // records one (Google's Veo price, billed unchanged by the OpenRouter
3442
- // entries; Vertex AI's Imagen 4 Fast price), else the fal entry for the same
3443
- // upstream model. `unrecorded` means neither exists in this catalog, and the
3444
- // floor then does not apply: Seedream V4, MiniMax H3 and Gemini Omni Flash
3445
- // have no fal entry, Kling O3 on KIE does not say whether it is fal's
3446
- // Standard or Pro tier, Suno has no per-song list price, and the Claude
3447
- // entries bill per token. Entries of every other provider carry no
3448
- // reference: their route bills the list price itself.
3067
+ function fallbackModels2(route) {
3068
+ if (route.kind === "image") return [route.fallback];
3069
+ if ("byResolution" in route.fallback) return Object.values(route.fallback.byResolution);
3070
+ return [route.fallback.start, ...route.fallback.startAndEnd ? [route.fallback.startAndEnd] : []];
3071
+ }
3072
+ var ROLES2 = (() => {
3073
+ const roles = /* @__PURE__ */ new Map();
3074
+ for (const route of ROUTES2) {
3075
+ roles.set(route.primary, { role: "primary", route });
3076
+ for (const model of fallbackModels2(route)) {
3077
+ if (!roles.has(model)) roles.set(model, { role: "fallback", route });
3078
+ }
3079
+ }
3080
+ return roles;
3081
+ })();
3082
+ function routeRoleOf2(modelId) {
3083
+ return modelId ? ROLES2.get(modelId) : void 0;
3084
+ }
3085
+ var CATALOG_ENTRIES2 = [
3449
3086
  // ── 3D AI Studio: 3D generation ────────────────────────────────────────
3450
- // `credits` is what the model's DEFAULT request bills (the options its
3451
- // builder sends when a node sets none), priced by providers/studio3d/
3452
- // pricing.ts; catalog.spec pins every entry to that rule. A job with other
3453
- // options records its own price at completion.
3454
3087
  {
3455
3088
  id: "studio3d/tripo-3-1-text-to-3d",
3456
3089
  provider: "studio3d",
3457
3090
  modality: "3d",
3458
3091
  task: "text-to-3d",
3459
3092
  label: "Tripo 3.1 (text-to-3D)",
3460
- description: "Cheapest text-to-3D path on 3D AI Studio. Good for fast iteration.",
3461
- cost: { credits: 40, usd: studio3dCreditsToUsd2(40) },
3093
+ description: "The lightest text-to-3D path on 3D AI Studio. Good for fast iteration.",
3462
3094
  capabilities: { supportsTextures: true, supportsPbr: true },
3463
3095
  isDefault: true
3464
3096
  },
@@ -3468,7 +3100,6 @@ var MODEL_CATALOG2 = [
3468
3100
  modality: "3d",
3469
3101
  task: "image-to-3d",
3470
3102
  label: "Tripo 3.1 (image-to-3D)",
3471
- cost: { credits: 60, usd: studio3dCreditsToUsd2(60) },
3472
3103
  capabilities: { needsImageInput: true, supportsTextures: true, supportsPbr: true }
3473
3104
  },
3474
3105
  {
@@ -3477,8 +3108,7 @@ var MODEL_CATALOG2 = [
3477
3108
  modality: "3d",
3478
3109
  task: "text-to-3d",
3479
3110
  label: "Hunyuan 3.1 Rapid",
3480
- description: "Tencent Hunyuan3D, rapid edition. Mid-quality, mid-cost.",
3481
- cost: { credits: 35, usd: studio3dCreditsToUsd2(35) },
3111
+ description: "Tencent Hunyuan3D, rapid edition. Mid-quality.",
3482
3112
  capabilities: { supportsTextures: true, supportsPbr: true }
3483
3113
  },
3484
3114
  {
@@ -3487,8 +3117,7 @@ var MODEL_CATALOG2 = [
3487
3117
  modality: "3d",
3488
3118
  task: "text-to-3d",
3489
3119
  label: "Hunyuan 3.1 Pro",
3490
- description: "Tencent Hunyuan3D, pro edition. High quality, PBR materials on by default, about 2.3x Rapid.",
3491
- cost: { credits: 80, usd: studio3dCreditsToUsd2(80) },
3120
+ description: "Tencent Hunyuan3D, pro edition. High quality, PBR materials on by default.",
3492
3121
  capabilities: { supportsTextures: true, supportsPbr: true, maxOutputDetail: "1.5M polys" }
3493
3122
  },
3494
3123
  {
@@ -3498,7 +3127,6 @@ var MODEL_CATALOG2 = [
3498
3127
  task: "image-to-3d",
3499
3128
  label: "Trellis 2",
3500
3129
  description: "Microsoft Trellis 2. Best image-to-3D fidelity. Image input only.",
3501
- cost: { credits: 30, usd: studio3dCreditsToUsd2(30) },
3502
3130
  capabilities: { needsImageInput: true, supportsTextures: true, supportsPbr: true, maxOutputDetail: "1024" },
3503
3131
  isDefault: true
3504
3132
  },
@@ -3510,7 +3138,6 @@ var MODEL_CATALOG2 = [
3510
3138
  task: "remesh",
3511
3139
  label: "Tripo Remesh",
3512
3140
  description: "Convert + remesh: target polycount, quad topology, multiple output formats.",
3513
- cost: { credits: 10, usd: studio3dCreditsToUsd2(10) },
3514
3141
  isDefault: true
3515
3142
  },
3516
3143
  {
@@ -3519,43 +3146,25 @@ var MODEL_CATALOG2 = [
3519
3146
  modality: "3d",
3520
3147
  task: "texture",
3521
3148
  label: "Tripo Texture",
3522
- cost: { credits: 20, usd: studio3dCreditsToUsd2(20) },
3523
3149
  capabilities: { supportsTextures: true, supportsPbr: true },
3524
3150
  isDefault: true
3525
3151
  },
3526
- // KIE: image gen. Pricing pulled 2026-05-08 from https://kie.ai/pricing
3527
- // (1 credit = $0.005 USD). Indemnification: KIE provides ZERO IP indemnity,
3528
- // so reserve these for internal asset work. v0.1 ships as private internal
3529
- // infra, so KIE is the v0.1 default; revisit if customer-facing output is
3530
- // ever needed.
3531
- {
3532
- // Verified 2026-05-09 via two consecutive CLI smokes at 1:1, 1K, single
3533
- // candidate, default options: KIE billed 8 credits ($0.040) each time.
3534
- // Earlier spec estimate was $0.020 (4 credits); replaced with the measured
3535
- // value. The 2K and 4K tiers ($0.06, $0.09) come from KIE's price page
3536
- // (checked 2026-10-04), the same as the edit entry. The provider's costUsd from creditsConsumed remains the source of
3537
- // truth for accounting; this catalog field is UI hints only.
3152
+ {
3538
3153
  id: "kie/nano-banana-2",
3539
3154
  provider: "kie",
3540
3155
  modality: "image",
3541
3156
  task: "text-to-image",
3542
3157
  label: "Nano Banana 2 (KIE)",
3543
- description: "Google Gemini 3.1 Flash Image via KIE. $0.04 at 1K, $0.06 at 2K, $0.09 at 4K. Kept as fallback aggregator path; default flipped to fal/nano-banana-2 in 2026-06-04 fal slice.",
3544
- cost: { usd: 0.04, usdByResolution: { "1K": 0.04, "2K": 0.06, "4K": 0.09 } },
3545
- listPrice: { source: "fal", model: "fal/nano-banana-2" },
3158
+ description: "Google Gemini 3.1 Flash Image via KIE. Kept as fallback aggregator path; default flipped to fal/nano-banana-2 in 2026-06-04 fal slice.",
3546
3159
  capabilities: { resolutions: ["1K", "2K", "4K"] }
3547
3160
  },
3548
3161
  {
3549
- // imagen-4-fast price is estimated; KIE docs do not publish a per-image
3550
- // USD rate. Read data.creditsConsumed from a real run to verify.
3551
3162
  id: "kie/imagen-4-fast",
3552
3163
  provider: "kie",
3553
3164
  modality: "image",
3554
3165
  task: "text-to-image",
3555
3166
  label: "Imagen 4 Fast (KIE)",
3556
- description: "Google Imagen 4 Fast via KIE. No price advantage vs Vertex direct. No IP indemnity. Vertex AI lists Imagen 4 Fast at $0.02 per image (2026-09-27), which matches the estimate; the KIE price itself is still unmeasured.",
3557
- cost: { usd: 0.02 },
3558
- listPrice: { source: "owner", usd: 0.02 },
3167
+ description: "Google Imagen 4 Fast via KIE. No IP indemnity.",
3559
3168
  capabilities: { resolutions: [] }
3560
3169
  },
3561
3170
  {
@@ -3564,25 +3173,16 @@ var MODEL_CATALOG2 = [
3564
3173
  modality: "image",
3565
3174
  task: "text-to-image",
3566
3175
  label: "Seedream V4 (KIE)",
3567
- description: "ByteDance Seedream V4 via KIE. Stylized output not available on Vertex. No IP indemnity.",
3568
- cost: { usd: 0.0175 },
3569
- listPrice: { source: "unrecorded" }
3176
+ description: "ByteDance Seedream V4 via KIE. Stylized output not available on Vertex. No IP indemnity."
3570
3177
  },
3571
3178
  // ── KIE.ai: newer image models, the cheaper route (price feed 2026-09-23) ─
3572
- // Billed from the credits KIE reports on each task. KIE offers no data
3573
- // processing agreement. Decided 2026-09-23 (Q5 C of the routing plan,
3574
- // docs/plans/2026-09-26-kie-first-fal-fallback.md): the automatic routes try
3575
- // KIE first for everything, a recorded risk; pinning the fal entry of a model
3576
- // is how a job with a real person's photo is kept off KIE.
3577
3179
  {
3578
3180
  id: "kie/nano-banana-2-edit",
3579
3181
  provider: "kie",
3580
3182
  modality: "image",
3581
3183
  task: "image-edit",
3582
3184
  label: "Nano Banana 2 Edit (KIE)",
3583
- description: "Nano Banana 2 instruction edit via KIE with up to 8 reference images, half the fal price: $0.04 at 1K, $0.06 at 2K, $0.09 at 4K.",
3584
- cost: { usd: 0.04, usdByResolution: { "1K": 0.04, "2K": 0.06, "4K": 0.09 } },
3585
- listPrice: { source: "fal", model: "fal/nano-banana-2-edit" },
3185
+ description: "Nano Banana 2 instruction edit via KIE with up to 8 reference images.",
3586
3186
  capabilities: { resolutions: ["1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
3587
3187
  },
3588
3188
  {
@@ -3591,9 +3191,7 @@ var MODEL_CATALOG2 = [
3591
3191
  modality: "image",
3592
3192
  task: "text-to-image",
3593
3193
  label: "Nano Banana Pro (KIE)",
3594
- description: "Google Gemini 3 Pro Image via KIE: stronger on complex scenes, text in images and new characters than Nano Banana 2 (a relighting edit showed no difference on 2026-09-23). $0.09 at 1K or 2K, $0.12 at 4K (fal: $0.15, $0.30).",
3595
- cost: { usd: 0.09, usdByResolution: { "1K": 0.09, "2K": 0.09, "4K": 0.12 } },
3596
- listPrice: { source: "fal", model: "fal/nano-banana-pro" },
3194
+ description: "Google Gemini 3 Pro Image via KIE: stronger on complex scenes, text in images and new characters than Nano Banana 2 (a relighting edit showed no difference on 2026-09-23).",
3597
3195
  capabilities: { resolutions: ["1K", "2K", "4K"], maxInputImages: 0 }
3598
3196
  },
3599
3197
  {
@@ -3602,9 +3200,7 @@ var MODEL_CATALOG2 = [
3602
3200
  modality: "image",
3603
3201
  task: "image-edit",
3604
3202
  label: "Nano Banana Pro Edit (KIE)",
3605
- description: "Nano Banana Pro instruction edit via KIE with up to 8 reference images. $0.09 at 1K or 2K, $0.12 at 4K (fal: $0.15, $0.30).",
3606
- cost: { usd: 0.09, usdByResolution: { "1K": 0.09, "2K": 0.09, "4K": 0.12 } },
3607
- listPrice: { source: "fal", model: "fal/nano-banana-pro-edit" },
3203
+ description: "Nano Banana Pro instruction edit via KIE with up to 8 reference images.",
3608
3204
  capabilities: { resolutions: ["1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
3609
3205
  },
3610
3206
  {
@@ -3613,9 +3209,7 @@ var MODEL_CATALOG2 = [
3613
3209
  modality: "image",
3614
3210
  task: "text-to-image",
3615
3211
  label: "Seedream 5 Lite (KIE)",
3616
- description: "ByteDance Seedream 5 Lite via KIE, 2K or 4K. $0.0275 per image (fal: $0.035).",
3617
- cost: { usd: 0.0275 },
3618
- listPrice: { source: "fal", model: "fal/seedream-5-lite" },
3212
+ description: "ByteDance Seedream 5 Lite via KIE, 2K or 4K.",
3619
3213
  capabilities: { resolutions: ["2K", "4K"], maxInputImages: 0 }
3620
3214
  },
3621
3215
  {
@@ -3624,9 +3218,7 @@ var MODEL_CATALOG2 = [
3624
3218
  modality: "image",
3625
3219
  task: "image-edit",
3626
3220
  label: "Seedream 5 Lite Edit (KIE)",
3627
- description: "ByteDance Seedream 5 Lite image-to-image via KIE, up to 10 reference images, 2K or 4K. $0.0275 per image (fal: $0.035).",
3628
- cost: { usd: 0.0275 },
3629
- listPrice: { source: "fal", model: "fal/seedream-5-lite-edit" },
3221
+ description: "ByteDance Seedream 5 Lite image-to-image via KIE, up to 10 reference images, 2K or 4K.",
3630
3222
  capabilities: { resolutions: ["2K", "4K"], needsImageInput: true, maxInputImages: 10 }
3631
3223
  },
3632
3224
  {
@@ -3635,9 +3227,7 @@ var MODEL_CATALOG2 = [
3635
3227
  modality: "image",
3636
3228
  task: "text-to-image",
3637
3229
  label: "Seedream 5 Pro (KIE)",
3638
- description: "ByteDance Seedream 5 Pro via KIE, 1K or 2K. $0.035 at 1K, $0.07 at 2K (fal: $0.0675 to $0.135).",
3639
- cost: { usd: 0.035, usdByResolution: { "1K": 0.035, "2K": 0.07 } },
3640
- listPrice: { source: "fal", model: "fal/seedream-5-pro" },
3230
+ description: "ByteDance Seedream 5 Pro via KIE, 1K or 2K.",
3641
3231
  capabilities: { resolutions: ["1K", "2K"], maxInputImages: 0 }
3642
3232
  },
3643
3233
  {
@@ -3646,30 +3236,17 @@ var MODEL_CATALOG2 = [
3646
3236
  modality: "image",
3647
3237
  task: "image-edit",
3648
3238
  label: "Seedream 5 Pro Edit (KIE)",
3649
- description: "ByteDance Seedream 5 Pro image-to-image via KIE, up to 10 reference images, 1K or 2K. $0.035 at 1K, $0.07 at 2K, plus $0.0025 per extra reference.",
3650
- cost: { usd: 0.035, usdByResolution: { "1K": 0.035, "2K": 0.07 } },
3651
- listPrice: { source: "fal", model: "fal/seedream-5-pro-edit" },
3239
+ description: "ByteDance Seedream 5 Pro image-to-image via KIE, up to 10 reference images, 1K or 2K.",
3652
3240
  capabilities: { resolutions: ["1K", "2K"], needsImageInput: true, maxInputImages: 10 }
3653
3241
  },
3654
3242
  // ── fal.ai: image gen ─────────────────────────────────────────────────
3655
- // Prices from docs/internal/research/fal-api-reference.md (vetted
3656
- // 2026-06-04). Nano Banana 2 (Google Gemini 3.1 Flash Image) is the SAME upstream model as today's KIE
3657
- // nano-banana-2 default; flipping the default from kie/nano-banana-2 to
3658
- // fal/nano-banana-2 is zero aesthetic change. FLUX 1.1 [pro] is the
3659
- // fal-native flagship; FLUX.1 [schnell] the fast/cheap option; FLUX.1
3660
- // Kontext [pro] is for instruction edits.
3661
- //
3662
- // Per-task entries (Weave-style classification, option a from the spec):
3663
- // Nano Banana 2 appears as both text-to-image (default) and the /edit
3664
- // endpoint as image-to-image + image-edit, sharing one upstream id.
3665
3243
  {
3666
3244
  id: "fal/nano-banana-2",
3667
3245
  provider: "fal",
3668
3246
  modality: "image",
3669
3247
  task: "text-to-image",
3670
3248
  label: "Nano Banana 2 (fal)",
3671
- description: "Google Gemini 3.1 Flash Image via fal. Default for image gen; same upstream model as KIE nano-banana-2 with no aesthetic change. $0.08 per image at 1K (0.5K x0.75, 2K x1.5, 4K x2).",
3672
- cost: { usd: 0.08, usdByResolution: FAL_NANO_BANANA_2_USD_BY_RESOLUTION2 },
3249
+ description: "Google Gemini 3.1 Flash Image via fal. Default for image gen; same upstream model as KIE nano-banana-2 with no aesthetic change.",
3673
3250
  capabilities: { resolutions: ["0.5K", "1K", "2K", "4K"], maxInputImages: 0 },
3674
3251
  isDefault: true
3675
3252
  },
@@ -3679,8 +3256,7 @@ var MODEL_CATALOG2 = [
3679
3256
  modality: "image",
3680
3257
  task: "image-edit",
3681
3258
  label: "Nano Banana 2 Edit (fal)",
3682
- description: "Nano Banana 2 instruction edit. Takes up to 8 reference images for full brand consistency. $0.08 per image at 1K (0.5K x0.75, 2K x1.5, 4K x2).",
3683
- cost: { usd: 0.08, usdByResolution: FAL_NANO_BANANA_2_USD_BY_RESOLUTION2 },
3259
+ description: "Nano Banana 2 instruction edit. Takes up to 8 reference images for full brand consistency.",
3684
3260
  capabilities: { resolutions: ["0.5K", "1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
3685
3261
  },
3686
3262
  {
@@ -3689,11 +3265,7 @@ var MODEL_CATALOG2 = [
3689
3265
  modality: "image",
3690
3266
  task: "image-to-image",
3691
3267
  label: "Nano Banana 2 Image-to-Image (fal)",
3692
- description: "Nano Banana 2 in image-to-image mode; same upstream endpoint as the edit entry, separate task classification. $0.08 per image at 1K (0.5K x0.75, 2K x1.5, 4K x2).",
3693
- // Same fal endpoint as the edit entry, so the same tier prices: fal's
3694
- // recorded cost is keyed by endpoint and was already tiered, and the
3695
- // estimates and quota must agree with it.
3696
- cost: { usd: 0.08, usdByResolution: FAL_NANO_BANANA_2_USD_BY_RESOLUTION2 },
3268
+ description: "Nano Banana 2 in image-to-image mode; same upstream endpoint as the edit entry, separate task classification.",
3697
3269
  capabilities: { resolutions: ["0.5K", "1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
3698
3270
  },
3699
3271
  // ── fal.ai: Nano Banana Pro and Seedream 5 (the fallback for the KIE entries) ─
@@ -3703,8 +3275,7 @@ var MODEL_CATALOG2 = [
3703
3275
  modality: "image",
3704
3276
  task: "text-to-image",
3705
3277
  label: "Nano Banana Pro (fal)",
3706
- description: "Google Gemini 3 Pro Image via fal. $0.15 at 1K or 2K, $0.30 at 4K. The KIE entry is cheaper; this one runs under fal terms.",
3707
- cost: { usd: 0.15, usdByResolution: { "1K": 0.15, "2K": 0.15, "4K": 0.3 } },
3278
+ description: "Google Gemini 3 Pro Image via fal. This entry runs under fal terms.",
3708
3279
  capabilities: { resolutions: ["1K", "2K", "4K"], maxInputImages: 0 }
3709
3280
  },
3710
3281
  {
@@ -3713,8 +3284,7 @@ var MODEL_CATALOG2 = [
3713
3284
  modality: "image",
3714
3285
  task: "image-edit",
3715
3286
  label: "Nano Banana Pro Edit (fal)",
3716
- description: "Nano Banana Pro instruction edit via fal with up to 8 reference images. $0.15 at 1K or 2K, $0.30 at 4K.",
3717
- cost: { usd: 0.15, usdByResolution: { "1K": 0.15, "2K": 0.15, "4K": 0.3 } },
3287
+ description: "Nano Banana Pro instruction edit via fal with up to 8 reference images.",
3718
3288
  capabilities: { resolutions: ["1K", "2K", "4K"], needsImageInput: true, maxInputImages: 8 }
3719
3289
  },
3720
3290
  {
@@ -3723,8 +3293,7 @@ var MODEL_CATALOG2 = [
3723
3293
  modality: "image",
3724
3294
  task: "text-to-image",
3725
3295
  label: "Seedream 5 Lite (fal)",
3726
- description: "ByteDance Seedream 5 Lite via fal, 2K or 4K. $0.035 per image.",
3727
- cost: { usd: 0.035 },
3296
+ description: "ByteDance Seedream 5 Lite via fal, 2K or 4K.",
3728
3297
  capabilities: { resolutions: ["2K", "4K"], maxInputImages: 0 }
3729
3298
  },
3730
3299
  {
@@ -3733,8 +3302,7 @@ var MODEL_CATALOG2 = [
3733
3302
  modality: "image",
3734
3303
  task: "image-edit",
3735
3304
  label: "Seedream 5 Lite Edit (fal)",
3736
- description: "ByteDance Seedream 5 Lite edit via fal, up to 10 reference images, 2K or 4K. $0.035 per image.",
3737
- cost: { usd: 0.035 },
3305
+ description: "ByteDance Seedream 5 Lite edit via fal, up to 10 reference images, 2K or 4K.",
3738
3306
  capabilities: { resolutions: ["2K", "4K"], needsImageInput: true, maxInputImages: 10 }
3739
3307
  },
3740
3308
  {
@@ -3743,8 +3311,7 @@ var MODEL_CATALOG2 = [
3743
3311
  modality: "image",
3744
3312
  task: "text-to-image",
3745
3313
  label: "Seedream 5 Pro (fal)",
3746
- description: "ByteDance Seedream 5 Pro via fal, 1K or 2K. $0.0675 per image up to 1536x1536 pixels (the 1K tier), $0.135 above that up to 2048x2048 (the 2K tier, the default). fal marks the price tentative.",
3747
- cost: { usd: 0.135, usdByResolution: { "1K": 0.0675, "2K": 0.135 } },
3314
+ description: "ByteDance Seedream 5 Pro via fal, 1K or 2K.",
3748
3315
  capabilities: { resolutions: ["1K", "2K"], maxInputImages: 0 }
3749
3316
  },
3750
3317
  {
@@ -3753,8 +3320,7 @@ var MODEL_CATALOG2 = [
3753
3320
  modality: "image",
3754
3321
  task: "image-edit",
3755
3322
  label: "Seedream 5 Pro Edit (fal)",
3756
- description: "ByteDance Seedream 5 Pro edit via fal, up to 10 reference images, 1K or 2K. $0.0675 per image up to 1536x1536 pixels (the 1K tier), $0.135 above that up to 2048x2048 (the 2K tier, the default), plus $0.0045 for every input image after the first. fal marks the price tentative.",
3757
- cost: { usd: 0.135, usdByResolution: { "1K": 0.0675, "2K": 0.135 } },
3323
+ description: "ByteDance Seedream 5 Pro edit via fal, up to 10 reference images, 1K or 2K.",
3758
3324
  capabilities: { resolutions: ["1K", "2K"], needsImageInput: true, maxInputImages: 10 }
3759
3325
  },
3760
3326
  {
@@ -3763,8 +3329,7 @@ var MODEL_CATALOG2 = [
3763
3329
  modality: "image",
3764
3330
  task: "text-to-image",
3765
3331
  label: "FLUX 1.1 [pro] (fal)",
3766
- description: "Black Forest Labs FLUX 1.1 [pro] via fal. Flagship text-to-image; $0.04 per megapixel. Text-only, no reference-image brand conditioning.",
3767
- cost: { usd: 0.04 },
3332
+ description: "Black Forest Labs FLUX 1.1 [pro] via fal. Flagship text-to-image. Text-only, no reference-image brand conditioning.",
3768
3333
  capabilities: { resolutions: [], maxInputImages: 0 }
3769
3334
  },
3770
3335
  {
@@ -3773,8 +3338,7 @@ var MODEL_CATALOG2 = [
3773
3338
  modality: "image",
3774
3339
  task: "text-to-image",
3775
3340
  label: "FLUX.1 [schnell] (fal)",
3776
- description: "Black Forest Labs FLUX.1 [schnell] via fal. Fast/cheap text-to-image; $0.003 per megapixel. Text-only.",
3777
- cost: { usd: 3e-3 },
3341
+ description: "Black Forest Labs FLUX.1 [schnell] via fal. Fast text-to-image. Text-only.",
3778
3342
  capabilities: { resolutions: [], maxInputImages: 0 }
3779
3343
  },
3780
3344
  {
@@ -3783,42 +3347,28 @@ var MODEL_CATALOG2 = [
3783
3347
  modality: "image",
3784
3348
  task: "image-edit",
3785
3349
  label: "FLUX.1 Kontext [pro] (fal)",
3786
- description: "FLUX.1 Kontext instruction edit via fal. Single image_url input ($0.04 per image). For multi-ref, the kontext/max/multi endpoint is a follow-up.",
3787
- cost: { usd: 0.04 },
3350
+ description: "FLUX.1 Kontext instruction edit via fal. Single image_url input. For multi-ref, the kontext/max/multi endpoint is a follow-up.",
3788
3351
  capabilities: { resolutions: [], needsImageInput: true, maxInputImages: 1 }
3789
3352
  },
3790
3353
  // ── fal.ai: virtual try-on (E3) ────────────────────────────────────────
3791
- // FASHN garment-preserving try-on. A DISTINCT task from image-edit: it takes
3792
- // TWO named images (garment + person/model) and preserves the garment's
3793
- // pixels (text/pattern/fabric) rather than letting a general diffusion edit
3794
- // redraw them. Id, schema, and price verified 2026-07-20 against fal's model
3795
- // page for fal-ai/fashn/tryon/v1.6; see docs/internal/research/fal-fashn-tryon.md.
3796
- // Flat $0.075 per run (fal does not return cost; the provider computes it).
3797
3354
  {
3798
3355
  id: "fal/fashn-tryon-v1-6",
3799
3356
  provider: "fal",
3800
3357
  modality: "image",
3801
3358
  task: "virtual-try-on",
3802
3359
  label: "FASHN Try-On v1.6",
3803
- description: "Garment-preserving virtual try-on via fal. Preserves product text/pattern/fabric; takes a garment image and a model/person image. $0.075 per run (fal-ai/fashn/tryon/v1.6, vetted 2026-07-20).",
3804
- cost: { usd: 0.075 },
3360
+ description: "Garment-preserving virtual try-on via fal. Preserves product text/pattern/fabric; takes a garment image and a model/person image.",
3805
3361
  capabilities: { maxInputImages: 2, needsImageInput: true },
3806
3362
  isDefault: true
3807
3363
  },
3808
3364
  // ── fal.ai: video gen (B1) ─────────────────────────────────────────────
3809
- // Async via fal's queue API (submit -> webhook / poll). Prices are per the
3810
- // fal model pages (vetted 2026-06-16); fal does NOT return cost, so the
3811
- // provider computes a flat per-video estimate from the catalog usd anchored
3812
- // to the model's base clip length. Exactly one isDefault per (video, task):
3813
- // Kling 2.5 Turbo Pro for image-to-video, Seedance 1.0 Pro for text-to-video.
3814
3365
  {
3815
3366
  id: "fal/kling-v2-5-image-to-video",
3816
3367
  provider: "fal",
3817
3368
  modality: "video",
3818
3369
  task: "image-to-video",
3819
3370
  label: "Kling 2.5 Turbo Pro (image-to-video)",
3820
- description: "Kuaishou Kling 2.5 Turbo Pro via fal. Cinematic image-to-video; $0.35 base (5s) plus $0.07 per extra second. Default image-to-video.",
3821
- cost: { usd: 0.35 },
3371
+ description: "Kuaishou Kling 2.5 Turbo Pro via fal. Cinematic image-to-video. Default image-to-video.",
3822
3372
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true },
3823
3373
  isDefault: true
3824
3374
  },
@@ -3828,8 +3378,7 @@ var MODEL_CATALOG2 = [
3828
3378
  modality: "video",
3829
3379
  task: "image-to-video",
3830
3380
  label: "Seedance 1.0 Pro (image-to-video)",
3831
- description: "ByteDance Seedance 1.0 Pro via fal. Image-to-video; roughly $0.62 per 1080p 5s clip. Alternative to Kling for stylized motion.",
3832
- cost: { usd: 0.62 },
3381
+ description: "ByteDance Seedance 1.0 Pro via fal. Image-to-video. Alternative to Kling for stylized motion.",
3833
3382
  capabilities: { needsImageInput: true, maxInputImages: 1 }
3834
3383
  },
3835
3384
  {
@@ -3839,9 +3388,7 @@ var MODEL_CATALOG2 = [
3839
3388
  task: "image-to-video",
3840
3389
  label: "Seedance 2.5 (image-to-video)",
3841
3390
  refusesPhotorealPeople: true,
3842
- description: "ByteDance Seedance 2.5 via fal. Accepts a start frame AND an end frame (end_image_url), selectable duration 4-30s, up to 1080p, with synchronised audio (generate_audio, on by default). Token-billed: (w*h*s*24)/1024 at $0.0214 per 1000 tokens, so $2.31 for the default 5s at 720p 16:9 ($1.85 for 4s) and $4.16 for 4s at 1080p. CAUTION: ByteDance partner moderation on 2.5 rejected even fal's own robot test image with content_policy_violation (observed 2026-08-21), and it refuses photoreal people, generated ones included (observed 2026-08-21 and 2026-09-23). Seedance 2.0 refuses them too, so pick another model for a person; use this one for subjects without people.",
3843
- // The default clip the estimate prices (computeVideoCostUsd): 5s at 720p 16:9.
3844
- cost: { usd: 2.3112 },
3391
+ description: "ByteDance Seedance 2.5 via fal. Accepts a start frame AND an end frame (end_image_url), selectable duration 4-30s, up to 1080p, with synchronised audio (generate_audio, on by default). CAUTION: ByteDance partner moderation on 2.5 rejected even fal's own robot test image with content_policy_violation (observed 2026-08-21), and it refuses photoreal people, generated ones included (observed 2026-08-21 and 2026-09-23). Seedance 2.0 refuses them too, so pick another model for a person; use this one for subjects without people.",
3845
3392
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3846
3393
  },
3847
3394
  {
@@ -3851,9 +3398,7 @@ var MODEL_CATALOG2 = [
3851
3398
  task: "image-to-video",
3852
3399
  label: "Seedance 2.0 (image-to-video)",
3853
3400
  refusesPhotorealPeople: true,
3854
- description: "ByteDance Seedance 2.0 via fal. Start frame plus optional end frame (end_image_url), duration 4-15s, up to 4k, and it accepts seven explicit aspect ratios where 2.5 is fixed to auto. It refuses photoreal people, generated ones included, in every fal mode (observed 2026-09-23). Not simply superseded by 2.5: 2.0 generated from photographic input that 2.5 refused on content policy (observed 2026-08-21), and it is the only one offering 4k. Token-billed with the same formula as 2.5 but at a lower rate: 2.0 is $0.014 per 1000 tokens and 2.5 is $0.0214, so 2.0 costs $1.51 for the default 5s at 720p 16:9 ($1.21 for 4s).",
3855
- // The default clip the estimate prices (computeVideoCostUsd): 5s at 720p 16:9.
3856
- cost: { usd: 1.512 },
3401
+ description: "ByteDance Seedance 2.0 via fal. Start frame plus optional end frame (end_image_url), duration 4-15s, up to 4k, and it accepts seven explicit aspect ratios where 2.5 is fixed to auto. It refuses photoreal people, generated ones included, in every fal mode (observed 2026-09-23). Not simply superseded by 2.5: 2.0 generated from photographic input that 2.5 refused on content policy (observed 2026-08-21), and it is the only one offering 4k.",
3857
3402
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3858
3403
  },
3859
3404
  // ── A start-frame model that accepts photoreal generated characters ───────
@@ -3869,25 +3414,17 @@ var MODEL_CATALOG2 = [
3869
3414
  modality: "video",
3870
3415
  task: "image-to-video",
3871
3416
  label: "Grok Imagine (image-to-video)",
3872
- description: "xAI Grok Imagine Video via fal. Animates a start frame with audio, 1 to 15 s, 480p or 720p, aspect auto or eight explicit ratios. Accepts photoreal generated characters that Seedance refuses (tested 2026-09-23). $0.05 per second at 480p, $0.07 at 720p, plus $0.002 per input image. No end frame.",
3873
- // 5 s at the 720p default plus fal's $0.002 for the input image.
3874
- cost: { usd: 0.352 },
3417
+ description: "xAI Grok Imagine Video via fal. Animates a start frame with audio, 1 to 15 s, 480p or 720p, aspect auto or eight explicit ratios. Accepts photoreal generated characters that Seedance refuses (tested 2026-09-23). No end frame.",
3875
3418
  capabilities: { needsImageInput: true, maxInputImages: 1 }
3876
3419
  },
3877
3420
  // ── Google Veo 3.1 (fal): start frame, and first and last frame ──────────
3878
- // Accepted every photoreal still of a minted character on 2026-09-23 and
3879
- // landed exactly on the end frame; the best quality tested that day. Durations
3880
- // 4, 6 or 8 s (Lite first-and-last: 8 s only), aspect auto, 16:9 or 9:16.
3881
- // Studio sends it SILENT unless the job sets generateAudio: true (audio costs
3882
- // 50 to 100% more), so the anchors are 8 s silent at 720p. fal vetted 2026-09-23.
3883
3421
  {
3884
3422
  id: "fal/veo-3-1-lite-image-to-video",
3885
3423
  provider: "fal",
3886
3424
  modality: "video",
3887
3425
  task: "image-to-video",
3888
3426
  label: "Veo 3.1 Lite (image-to-video)",
3889
- description: "Google Veo 3.1 Lite via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p or 1080p. Accepts photoreal generated characters Seedance refuses. $0.03 per second silent ($0.05 with audio) at 720p, $0.05 ($0.08) at 1080p.",
3890
- cost: { usd: 0.24 },
3427
+ description: "Google Veo 3.1 Lite via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p or 1080p. Accepts photoreal generated characters Seedance refuses.",
3891
3428
  capabilities: { needsImageInput: true, maxInputImages: 1 }
3892
3429
  },
3893
3430
  {
@@ -3896,8 +3433,7 @@ var MODEL_CATALOG2 = [
3896
3433
  modality: "video",
3897
3434
  task: "image-to-video",
3898
3435
  label: "Veo 3.1 Lite (first and last frame)",
3899
- description: "Google Veo 3.1 Lite via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 8 s only, 720p or 1080p. Accepts photoreal generated characters Seedance refuses. $0.03 per second silent ($0.05 with audio) at 720p, $0.05 ($0.08) at 1080p.",
3900
- cost: { usd: 0.24 },
3436
+ description: "Google Veo 3.1 Lite via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 8 s only, 720p or 1080p. Accepts photoreal generated characters Seedance refuses.",
3901
3437
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3902
3438
  },
3903
3439
  {
@@ -3906,8 +3442,7 @@ var MODEL_CATALOG2 = [
3906
3442
  modality: "video",
3907
3443
  task: "image-to-video",
3908
3444
  label: "Veo 3.1 Fast (image-to-video)",
3909
- description: "Google Veo 3.1 Fast via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.10 per second silent ($0.15 with audio) at 720p or 1080p, $0.30 ($0.35) at 4K.",
3910
- cost: { usd: 0.8 },
3445
+ description: "Google Veo 3.1 Fast via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
3911
3446
  capabilities: { needsImageInput: true, maxInputImages: 1 }
3912
3447
  },
3913
3448
  {
@@ -3916,8 +3451,7 @@ var MODEL_CATALOG2 = [
3916
3451
  modality: "video",
3917
3452
  task: "image-to-video",
3918
3453
  label: "Veo 3.1 Fast (first and last frame)",
3919
- description: "Google Veo 3.1 Fast via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.10 per second silent ($0.15 with audio) at 720p or 1080p, $0.30 ($0.35) at 4K.",
3920
- cost: { usd: 0.8 },
3454
+ description: "Google Veo 3.1 Fast via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
3921
3455
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3922
3456
  },
3923
3457
  {
@@ -3926,8 +3460,7 @@ var MODEL_CATALOG2 = [
3926
3460
  modality: "video",
3927
3461
  task: "image-to-video",
3928
3462
  label: "Veo 3.1 (image-to-video)",
3929
- description: "Google Veo 3.1 via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.20 per second silent ($0.40 with audio) at 720p or 1080p, $0.40 ($0.60) at 4K.",
3930
- cost: { usd: 1.6 },
3463
+ description: "Google Veo 3.1 via fal, image-to-video: animates a start frame, 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
3931
3464
  capabilities: { needsImageInput: true, maxInputImages: 1 }
3932
3465
  },
3933
3466
  {
@@ -3936,27 +3469,17 @@ var MODEL_CATALOG2 = [
3936
3469
  modality: "video",
3937
3470
  task: "image-to-video",
3938
3471
  label: "Veo 3.1 (first and last frame)",
3939
- description: "Google Veo 3.1 via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses. $0.20 per second silent ($0.40 with audio) at 720p or 1080p, $0.40 ($0.60) at 4K.",
3940
- cost: { usd: 1.6 },
3472
+ description: "Google Veo 3.1 via fal, first and last frame: animates from a start frame and lands exactly on the end frame (both required), 4, 6 or 8 s, 720p, 1080p or 4K. Accepts photoreal generated characters Seedance refuses.",
3941
3473
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3942
3474
  },
3943
3475
  // ── KIE.ai video: the cheaper route to the same upstream models ──────────
3944
- // Async via KIE's Veo and createTask APIs (providers/kie-video.ts). 20 to 85%
3945
- // below fal (KIE price feed, 2026-09-23). KIE offers no data processing
3946
- // agreement. Decided 2026-09-23 (Q5 C of the routing plan): the automatic
3947
- // routes try KIE first for everything, a recorded risk; pinning the fal
3948
- // entry of a model is how a job with a real person's photo is kept off KIE.
3949
- // Anchors are the model's default clip at 720p (Kling: its fixed size). KIE
3950
- // docs vetted 2026-09-23.
3951
3476
  {
3952
3477
  id: "kie/veo-3-1-lite",
3953
3478
  provider: "kie",
3954
3479
  modality: "video",
3955
3480
  task: "image-to-video",
3956
3481
  label: "Veo 3.1 Lite (KIE)",
3957
- description: "Google Veo 3.1 Lite via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. Priced per clip: $0.15 at 720p, $0.175 at 1080p, $0.75 at 4K (fal: $0.24 silent, $0.40 with audio, for 8 s at 720p). KIE's Auto aspect letterboxes, so pick 16:9 or 9:16.",
3958
- cost: { usd: 0.15 },
3959
- listPrice: { source: "owner", model: "openrouter/veo-3-1-lite" },
3482
+ description: "Google Veo 3.1 Lite via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. KIE's Auto aspect letterboxes, so pick 16:9 or 9:16.",
3960
3483
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3961
3484
  },
3962
3485
  {
@@ -3965,9 +3488,7 @@ var MODEL_CATALOG2 = [
3965
3488
  modality: "video",
3966
3489
  task: "image-to-video",
3967
3490
  label: "Veo 3.1 Fast (KIE)",
3968
- description: "Google Veo 3.1 Fast via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. Priced per clip: $0.30 at 720p, $0.325 at 1080p, $0.90 at 4K (fal: $1.20 with audio for 8 s). Pick 16:9 or 9:16.",
3969
- cost: { usd: 0.3 },
3970
- listPrice: { source: "owner", model: "openrouter/veo-3-1-fast" },
3491
+ description: "Google Veo 3.1 Fast via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Accepted a minted character's photoreal stills on 2026-09-23. Pick 16:9 or 9:16.",
3971
3492
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3972
3493
  },
3973
3494
  {
@@ -3976,25 +3497,17 @@ var MODEL_CATALOG2 = [
3976
3497
  modality: "video",
3977
3498
  task: "image-to-video",
3978
3499
  label: "Veo 3.1 (KIE)",
3979
- description: "Google Veo 3.1 (quality tier) via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Same upstream model as the tested Lite and Fast tiers. Priced per clip: $1.25 at 720p, $1.275 at 1080p, $1.85 at 4K (fal: $3.20 with audio).",
3980
- cost: { usd: 1.25 },
3981
- listPrice: { source: "owner", model: "openrouter/veo-3-1" },
3500
+ description: "Google Veo 3.1 (quality tier) via KIE. A start frame, or a start and an end frame; 4, 6 or 8 s; 720p, 1080p or 4K; always with audio. Same upstream model as the tested Lite and Fast tiers.",
3982
3501
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3983
3502
  },
3984
3503
  // ── OpenRouter video: Google Veo 3.1 at Google's own prices ───────────────
3985
- // Async via OpenRouter's video API (providers/openrouter-video.ts). One entry
3986
- // per tier, like KIE: an end frame adds a last frame. 16:9 or 9:16 only (no
3987
- // auto), frames must be JPEG or PNG (WebP is refused). Studio sends it SILENT
3988
- // unless the job sets generateAudio: true, like the fal Veo entries, so the
3989
- // anchors are 8 s silent at 720p. OpenRouter models endpoint vetted 2026-10-04.
3990
3504
  {
3991
3505
  id: "openrouter/veo-3-1-lite",
3992
3506
  provider: "openrouter",
3993
3507
  modality: "video",
3994
3508
  task: "image-to-video",
3995
3509
  label: "Veo 3.1 Lite (OpenRouter)",
3996
- description: "Google Veo 3.1 Lite via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p or 1080p; 16:9 or 9:16, one must be set. Accepted a minted character's photoreal still on 2026-10-04. $0.03 per second silent ($0.05 with audio) at 720p, $0.05 ($0.08) at 1080p, the same as fal.",
3997
- cost: { usd: 0.24 },
3510
+ description: "Google Veo 3.1 Lite via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p or 1080p; 16:9 or 9:16, one must be set. Accepted a minted character's photoreal still on 2026-10-04.",
3998
3511
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
3999
3512
  },
4000
3513
  {
@@ -4003,8 +3516,7 @@ var MODEL_CATALOG2 = [
4003
3516
  modality: "video",
4004
3517
  task: "image-to-video",
4005
3518
  label: "Veo 3.1 Fast (OpenRouter)",
4006
- description: "Google Veo 3.1 Fast via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set. $0.08 per second silent ($0.10 with audio) at 720p, $0.10 ($0.12) at 1080p, $0.25 ($0.30) at 4K (fal: $0.10 silent, $0.15 with audio at 720p).",
4007
- cost: { usd: 0.64 },
3519
+ description: "Google Veo 3.1 Fast via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set.",
4008
3520
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4009
3521
  },
4010
3522
  {
@@ -4013,8 +3525,7 @@ var MODEL_CATALOG2 = [
4013
3525
  modality: "video",
4014
3526
  task: "image-to-video",
4015
3527
  label: "Veo 3.1 (OpenRouter)",
4016
- description: "Google Veo 3.1 (quality tier) via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set. $0.20 per second silent ($0.40 with audio) at 720p or 1080p, $0.40 ($0.60) at 4K, the same as fal.",
4017
- cost: { usd: 1.6 },
3528
+ description: "Google Veo 3.1 (quality tier) via OpenRouter. A start frame, or a start and an end frame (JPEG or PNG, not WebP); 4, 6 or 8 s; 720p, 1080p or 4K; 16:9 or 9:16, one must be set.",
4018
3529
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4019
3530
  },
4020
3531
  {
@@ -4023,9 +3534,7 @@ var MODEL_CATALOG2 = [
4023
3534
  modality: "video",
4024
3535
  task: "image-to-video",
4025
3536
  label: "Grok Imagine (KIE)",
4026
- description: "xAI Grok Imagine via KIE. A start frame, 6 to 30 s, 480p, 720p or 1080p, with audio. Accepted a minted character's photoreal stills on 2026-09-23. $0.012 per second at 480p, $0.0225 at 720p, $0.04 at 1080p (fal: $0.07 at 720p). No end frame.",
4027
- cost: { usd: 0.135 },
4028
- listPrice: { source: "fal", model: "fal/grok-imagine-image-to-video" },
3537
+ description: "xAI Grok Imagine via KIE. A start frame, 6 to 30 s, 480p, 720p or 1080p, with audio. Accepted a minted character's photoreal stills on 2026-09-23. No end frame.",
4029
3538
  capabilities: { needsImageInput: true, maxInputImages: 1 }
4030
3539
  },
4031
3540
  {
@@ -4034,9 +3543,7 @@ var MODEL_CATALOG2 = [
4034
3543
  modality: "video",
4035
3544
  task: "image-to-video",
4036
3545
  label: "Grok Imagine 1.5 (KIE, preview)",
4037
- description: "xAI Grok Imagine 1.5 preview via KIE. A start frame, 1 to 15 s, 480p or 720p. Not yet tested with a minted character. $0.012 per second at 480p, $0.0225 at 720p (fal: $0.14 at 720p). No end frame.",
4038
- cost: { usd: 0.18 },
4039
- listPrice: { source: "fal", model: "fal/grok-imagine-1-5-image-to-video" },
3546
+ description: "xAI Grok Imagine 1.5 preview via KIE. A start frame, 1 to 15 s, 480p or 720p. Not yet tested with a minted character. No end frame.",
4040
3547
  capabilities: { needsImageInput: true, maxInputImages: 1 }
4041
3548
  },
4042
3549
  {
@@ -4045,9 +3552,7 @@ var MODEL_CATALOG2 = [
4045
3552
  modality: "video",
4046
3553
  task: "image-to-video",
4047
3554
  label: "Kling 2.5 Turbo Pro (KIE)",
4048
- description: "Kuaishou Kling 2.5 Turbo Pro via KIE. A start frame and an optional end frame, 5 or 10 s, fixed size. The fal route accepted minted characters; this KIE route is not yet tested with a minted character. $0.21 for 5 s, $0.42 for 10 s (fal: $0.35 for 5 s).",
4049
- cost: { usd: 0.21 },
4050
- listPrice: { source: "fal", model: "fal/kling-v2-5-image-to-video" },
3555
+ description: "Kuaishou Kling 2.5 Turbo Pro via KIE. A start frame and an optional end frame, 5 or 10 s, fixed size. The fal route accepted minted characters; this KIE route is not yet tested with a minted character.",
4051
3556
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4052
3557
  },
4053
3558
  {
@@ -4056,9 +3561,7 @@ var MODEL_CATALOG2 = [
4056
3561
  modality: "video",
4057
3562
  task: "image-to-video",
4058
3563
  label: "Kling 2.6 (KIE)",
4059
- description: "Kuaishou Kling 2.6 via KIE. A start frame, 5 or 10 s, fixed size, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.275 for 5 s silent, $0.55 with sound, 10 s double (fal: $0.35 or $0.70).",
4060
- cost: { usd: 0.275 },
4061
- listPrice: { source: "fal", model: "fal/kling-2-6-image-to-video" },
3564
+ description: "Kuaishou Kling 2.6 via KIE. A start frame, 5 or 10 s, fixed size, silent unless the job sets generateAudio. Not yet tested with a minted character.",
4062
3565
  capabilities: { needsImageInput: true, maxInputImages: 1 }
4063
3566
  },
4064
3567
  {
@@ -4068,9 +3571,7 @@ var MODEL_CATALOG2 = [
4068
3571
  task: "image-to-video",
4069
3572
  label: "Seedance 2.0 (KIE)",
4070
3573
  refusesPhotorealPeople: true,
4071
- description: "ByteDance Seedance 2.0 via KIE. A start frame and an optional end frame, 4 to 15 s, 480p to 4K. Seedance 2.0 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person. $0.095 per second at 480p, $0.205 at 720p, $0.51 at 1080p, $1.04 at 4K (fal: about $0.30 at 720p).",
4072
- cost: { usd: 1.025 },
4073
- listPrice: { source: "fal", model: "fal/seedance-2-0-image-to-video" },
3574
+ description: "ByteDance Seedance 2.0 via KIE. A start frame and an optional end frame, 4 to 15 s, 480p to 4K. Seedance 2.0 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person.",
4074
3575
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4075
3576
  },
4076
3577
  {
@@ -4080,9 +3581,7 @@ var MODEL_CATALOG2 = [
4080
3581
  task: "image-to-video",
4081
3582
  label: "Seedance 2.5 (KIE)",
4082
3583
  refusesPhotorealPeople: true,
4083
- description: "ByteDance Seedance 2.5 via KIE. A start frame and an optional end frame, 4 to 30 s, 480p to 1080p. Seedance 2.5 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-08-21 and 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person. $0.14 per second at 480p, $0.315 at 720p, $0.79 at 1080p.",
4084
- cost: { usd: 1.575 },
4085
- listPrice: { source: "fal", model: "fal/seedance-2-5-image-to-video" },
3584
+ description: "ByteDance Seedance 2.5 via KIE. A start frame and an optional end frame, 4 to 30 s, 480p to 1080p. Seedance 2.5 refuses photoreal people, generated ones included: on fal it refused them in every mode (observed 2026-08-21 and 2026-09-23). The refusal comes from the moderation of the model itself, so this route carries the same caution; the KIE route itself has not been run with a person.",
4086
3585
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4087
3586
  },
4088
3587
  {
@@ -4091,9 +3590,7 @@ var MODEL_CATALOG2 = [
4091
3590
  modality: "video",
4092
3591
  task: "image-to-video",
4093
3592
  label: "Wan 3.0 (KIE)",
4094
- description: "Alibaba Wan 3.0 via KIE (hosted only, no downloadable weights). A start frame and an optional end frame, 2 to 30 s, 480p, 720p or 1080p, audio included. Accepted a minted character's photoreal stills on 2026-09-24. $0.04 per second at 480p, $0.08 at 720p, $0.16 at 1080p (fal and Alibaba: $0.10 at 720p).",
4095
- cost: { usd: 0.4 },
4096
- listPrice: { source: "fal", model: "fal/wan-3-0-image-to-video" },
3593
+ description: "Alibaba Wan 3.0 via KIE (hosted only, no downloadable weights). A start frame and an optional end frame, 2 to 30 s, 480p, 720p or 1080p, audio included. Accepted a minted character's photoreal stills on 2026-09-24.",
4097
3594
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4098
3595
  },
4099
3596
  {
@@ -4102,9 +3599,7 @@ var MODEL_CATALOG2 = [
4102
3599
  modality: "video",
4103
3600
  task: "image-to-video",
4104
3601
  label: "MiniMax H3 (KIE)",
4105
- description: "MiniMax H3 via KIE. A start frame and an optional end frame, 4 to 15 s, 768p (the 720p setting) or 2K (the 1080p setting). Accepted a minted character's photoreal stills on 2026-09-24. Its open weights exclude the EU by license; this is KIE's hosted service. $0.04 per second at 768p, $0.065 at 2K.",
4106
- cost: { usd: 0.24 },
4107
- listPrice: { source: "unrecorded" },
3602
+ description: "MiniMax H3 via KIE. A start frame and an optional end frame, 4 to 15 s, 768p (the 720p setting) or 2K (the 1080p setting). Accepted a minted character's photoreal stills on 2026-09-24. Its open weights exclude the EU by license; this is KIE's hosted service.",
4108
3603
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4109
3604
  },
4110
3605
  {
@@ -4113,9 +3608,7 @@ var MODEL_CATALOG2 = [
4113
3608
  modality: "video",
4114
3609
  task: "image-to-video",
4115
3610
  label: "Gemini Omni 1.1 Flash (KIE)",
4116
- description: "Google Gemini Omni 1.1 Flash via KIE, first-and-last-frame mode. A start frame and an optional end frame, 4, 6, 8 or 10 s, 720p to 4K, 16:9 or 9:16. KIE refuses registered characters in this mode, so identity comes from the frames alone. Accepted a minted character's photoreal stills on 2026-09-24 (set 9:16 for a portrait still: it defaults to 16:9 and crops). $0.315 for 4 s up to $0.63 for 10 s at 720p or 1080p, $0.735 to $1.05 at 4K. No fal equivalent.",
4117
- cost: { usd: 0.525 },
4118
- listPrice: { source: "unrecorded" },
3611
+ description: "Google Gemini Omni 1.1 Flash via KIE, first-and-last-frame mode. A start frame and an optional end frame, 4, 6, 8 or 10 s, 720p to 4K, 16:9 or 9:16. KIE refuses registered characters in this mode, so identity comes from the frames alone. Accepted a minted character's photoreal stills on 2026-09-24 (set 9:16 for a portrait still: it defaults to 16:9 and crops). No fal equivalent.",
4119
3612
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4120
3613
  },
4121
3614
  {
@@ -4124,9 +3617,7 @@ var MODEL_CATALOG2 = [
4124
3617
  modality: "video",
4125
3618
  task: "image-to-video",
4126
3619
  label: "Kling O3 (KIE)",
4127
- description: "Kuaishou Kling O3 (KIE calls it Kling 3.0 Omni) via KIE. A start frame and an optional end frame, 3 to 15 s, 720p to 4K in the start frame's shape, silent unless the job sets generateAudio. Accepted a minted character's photoreal stills on 2026-09-24. $0.07 per second at 720p, $0.09 at 1080p, $0.335 at 4K; with sound $0.10 and $0.135.",
4128
- cost: { usd: 0.35 },
4129
- listPrice: { source: "unrecorded" },
3620
+ description: "Kuaishou Kling O3 (KIE calls it Kling 3.0 Omni) via KIE. A start frame and an optional end frame, 3 to 15 s, 720p to 4K in the start frame's shape, silent unless the job sets generateAudio. Accepted a minted character's photoreal stills on 2026-09-24.",
4130
3621
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4131
3622
  },
4132
3623
  {
@@ -4135,9 +3626,7 @@ var MODEL_CATALOG2 = [
4135
3626
  modality: "video",
4136
3627
  task: "image-to-video",
4137
3628
  label: "Grok Imagine 1.5 (image-to-video)",
4138
- description: "xAI Grok Imagine 1.5 via fal, the fallback for the KIE entry. Animates a start frame with audio, 1 to 15 s, 480p to 1080p, in the start frame's shape. Not yet tested with a minted character (1.0 accepted them). $0.08 per second at 480p, $0.14 at 720p, $0.25 at 1080p, plus $0.01 per input image. No end frame.",
4139
- // 8 s at the 720p default plus $0.01 for the input image.
4140
- cost: { usd: 1.13 },
3629
+ description: "xAI Grok Imagine 1.5 via fal, the fallback for the KIE entry. Animates a start frame with audio, 1 to 15 s, 480p to 1080p, in the start frame's shape. Not yet tested with a minted character (1.0 accepted them). No end frame.",
4141
3630
  capabilities: { needsImageInput: true, maxInputImages: 1 }
4142
3631
  },
4143
3632
  {
@@ -4146,9 +3635,8 @@ var MODEL_CATALOG2 = [
4146
3635
  modality: "video",
4147
3636
  task: "image-to-video",
4148
3637
  label: "Wan 3.0 (image-to-video)",
4149
- description: "Alibaba Wan 3.0 via fal, the fallback for the KIE entry. A start frame and an optional end frame, 480p to 1080p (1080p unless set), audio included. Not yet tested with a minted character. $0.05 per second at 480p, $0.10 at 720p, $0.20 at 1080p.",
3638
+ description: "Alibaba Wan 3.0 via fal, the fallback for the KIE entry. A start frame and an optional end frame, 480p to 1080p (1080p unless set), audio included. Not yet tested with a minted character.",
4150
3639
  // 5 s at fal's 1080p default.
4151
- cost: { usd: 1 },
4152
3640
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4153
3641
  },
4154
3642
  {
@@ -4157,8 +3645,7 @@ var MODEL_CATALOG2 = [
4157
3645
  modality: "video",
4158
3646
  task: "image-to-video",
4159
3647
  label: "Kling 2.6 Pro (image-to-video)",
4160
- description: "Kuaishou Kling 2.6 Pro via fal, the fallback for the KIE entry. A start frame and an optional end frame, 5 or 10 s, fixed 1080p, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.07 per second silent, $0.14 with sound.",
4161
- cost: { usd: 0.35 },
3648
+ description: "Kuaishou Kling 2.6 Pro via fal, the fallback for the KIE entry. A start frame and an optional end frame, 5 or 10 s, fixed 1080p, silent unless the job sets generateAudio. Not yet tested with a minted character.",
4162
3649
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4163
3650
  },
4164
3651
  {
@@ -4167,8 +3654,7 @@ var MODEL_CATALOG2 = [
4167
3654
  modality: "video",
4168
3655
  task: "image-to-video",
4169
3656
  label: "Kling O3 Standard (image-to-video)",
4170
- description: "Kuaishou Kling O3 Standard via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.084 per second silent, $0.112 with sound (KIE: $0.07 at 720p).",
4171
- cost: { usd: 0.42 },
3657
+ description: "Kuaishou Kling O3 Standard via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character.",
4172
3658
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4173
3659
  },
4174
3660
  {
@@ -4177,8 +3663,7 @@ var MODEL_CATALOG2 = [
4177
3663
  modality: "video",
4178
3664
  task: "image-to-video",
4179
3665
  label: "Kling O3 Pro (image-to-video)",
4180
- description: "Kuaishou Kling O3 Pro via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character. $0.112 per second silent, $0.14 with sound (KIE: $0.07 at 720p).",
4181
- cost: { usd: 0.56 },
3666
+ description: "Kuaishou Kling O3 Pro via fal, a fallback for the KIE entry. A start frame and an optional end frame, 3 to 15 s, in the start frame's shape at the tier's size, silent unless the job sets generateAudio. Not yet tested with a minted character.",
4182
3667
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4183
3668
  },
4184
3669
  {
@@ -4187,9 +3672,8 @@ var MODEL_CATALOG2 = [
4187
3672
  modality: "video",
4188
3673
  task: "image-to-video",
4189
3674
  label: "LTX-2.5 Fast (image-to-video)",
4190
- description: "Lightricks LTX-2.5 Fast (ltx.io calls it Lite) via fal; not served by KIE. A start frame and an optional end frame, 6 to 20 s in 2 s steps, 720p, 1080p or 4K, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26. $0.09 per second at 720p, $0.13 at 1080p, $0.30 at 4K.",
3675
+ description: "Lightricks LTX-2.5 Fast (ltx.io calls it Lite) via fal; not served by KIE. A start frame and an optional end frame, 6 to 20 s in 2 s steps, 720p, 1080p or 4K, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26.",
4191
3676
  // 6 s at fal's 1080p default.
4192
- cost: { usd: 0.78 },
4193
3677
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4194
3678
  },
4195
3679
  {
@@ -4198,34 +3682,18 @@ var MODEL_CATALOG2 = [
4198
3682
  modality: "video",
4199
3683
  task: "image-to-video",
4200
3684
  label: "LTX-2.5 Pro (image-to-video)",
4201
- description: "Lightricks LTX-2.5 Pro via fal; not served by KIE. A start frame and an optional end frame, 6, 8 or 10 s, 720p or 1080p, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26. $0.12 per second at 720p, $0.17 at 1080p.",
3685
+ description: "Lightricks LTX-2.5 Pro via fal; not served by KIE. A start frame and an optional end frame, 6, 8 or 10 s, 720p or 1080p, aspect auto, 16:9 or 9:16, with native audio included. Accepted a minted character's photoreal stills on 2026-09-26.",
4202
3686
  // 6 s at fal's 1080p default.
4203
- cost: { usd: 1.02 },
4204
3687
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4205
3688
  },
4206
3689
  // ── FLUX.3 (Black Forest Labs) ───────────────────────────────────────────
4207
- // One model, three tiers of the same three input shapes:
4208
- // draft $0.06/s, fixed 720p, plus a draft_cache bundle (preview)
4209
- // direct $0.17/s at 720p, $0.29/s at 1080p, one shot (finished)
4210
- // enhance $0.29/s, fixed 1080p, from the cache only (finished)
4211
- // Draft + enhance totals $0.35/s, a 21% premium over direct 1080p on a first-try
4212
- // keeper and cheaper from the second attempt on, which is exactly the
4213
- // generate-several-pick-one shape. Use direct when one confident render is
4214
- // enough or 720p is the deliverable; use draft + enhance when a human picks.
4215
- // The completion handler mirrors each draft's cache into Storage Brain, so an
4216
- // approval gate between the two can take as long as it needs (measured: the
4217
- // bundle is ~29 KB and fal enhances from a re-hosted copy, 2026-08-23).
4218
- // Different model owner than Seedance, so ByteDance partner moderation does
4219
- // not apply here. That changes which filter runs, and nothing about whether we
4220
- // hold the depicted person's consent.
4221
3690
  {
4222
3691
  id: "fal/flux-3-image-to-video-draft",
4223
3692
  provider: "fal",
4224
3693
  modality: "video",
4225
3694
  task: "image-to-video",
4226
3695
  label: "FLUX.3 draft (image-to-video)",
4227
- description: "Black Forest Labs FLUX.3 draft tier via fal. Single opening keyframe, duration auto or 5-20s, fixed 720p, audio ON by default (generate_audio). $0.06 per second of draft. Returns a draft_cache for a later full-quality enhance pass, which bills separately. Accepts no resolution, seed or negative prompt. PREVIEW QUALITY: do not ship a draft as a deliverable.",
4228
- cost: { usd: 0.3 },
3696
+ description: "Black Forest Labs FLUX.3 draft tier via fal. Single opening keyframe, duration auto or 5-20s, fixed 720p, audio ON by default (generate_audio). Returns a draft_cache for a later full-quality enhance pass, which bills separately. Accepts no resolution, seed or negative prompt. PREVIEW QUALITY: do not ship a draft as a deliverable.",
4229
3697
  capabilities: { needsImageInput: true, maxInputImages: 1, emitsDraftCache: true }
4230
3698
  },
4231
3699
  {
@@ -4234,8 +3702,7 @@ var MODEL_CATALOG2 = [
4234
3702
  modality: "video",
4235
3703
  task: "image-to-video",
4236
3704
  label: "FLUX.3 draft (first + last frame)",
4237
- description: "Black Forest Labs FLUX.3 draft tier via fal. Start AND end keyframe, duration 5-20s, fixed 720p, audio ON by default. $0.06 per second of draft, roughly a third of Kling 2.5 for the same two-keyframe shot. Note it names the start frame start_image_url, not image_url. Minimum 5s, so a 4s cut means rendering 5s and trimming. PREVIEW QUALITY: enhance before shipping.",
4238
- cost: { usd: 0.3 },
3705
+ description: "Black Forest Labs FLUX.3 draft tier via fal. Start AND end keyframe, duration 5-20s, fixed 720p, audio ON by default. Note it names the start frame start_image_url, not image_url. Minimum 5s, so a 4s cut means rendering 5s and trimming. PREVIEW QUALITY: enhance before shipping.",
4239
3706
  capabilities: { needsImageInput: true, maxInputImages: 2, emitsDraftCache: true, acceptsEndFrame: true }
4240
3707
  },
4241
3708
  {
@@ -4244,8 +3711,7 @@ var MODEL_CATALOG2 = [
4244
3711
  modality: "video",
4245
3712
  task: "image-to-video",
4246
3713
  label: "FLUX.3 draft (keyframes)",
4247
- description: "Black Forest Labs FLUX.3 draft tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, fixed 720p, audio ON by default. $0.06 per second of draft. The only endpoint here that expresses motion through more than two keyframes, so it can describe a pass-by or a multi-beat action that a first/last pair structurally cannot. Falls back to deriving two keyframes from the standard start/end inputs. PREVIEW QUALITY: enhance before shipping.",
4248
- cost: { usd: 0.3 },
3714
+ description: "Black Forest Labs FLUX.3 draft tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, fixed 720p, audio ON by default. The only endpoint here that expresses motion through more than two keyframes, so it can describe a pass-by or a multi-beat action that a first/last pair structurally cannot. Falls back to deriving two keyframes from the standard start/end inputs. PREVIEW QUALITY: enhance before shipping.",
4249
3715
  capabilities: { needsImageInput: true, maxInputImages: 10, emitsDraftCache: true, acceptsKeyframes: true }
4250
3716
  },
4251
3717
  {
@@ -4254,8 +3720,7 @@ var MODEL_CATALOG2 = [
4254
3720
  modality: "video",
4255
3721
  task: "image-to-video",
4256
3722
  label: "FLUX.3 (image-to-video)",
4257
- description: "Black Forest Labs FLUX.3 direct tier via fal. Single opening keyframe, duration auto or 5-20s, resolution 720p (default) or 1080p, audio ON by default. $0.17 per second at 720p, $0.29 at 1080p; the catalog usd anchors 5s at 720p. One-shot finished render, returns the seed. Use when one confident render is enough; for iterate-then-pick, draft + enhance is cheaper.",
4258
- cost: { usd: 0.85 },
3723
+ description: "Black Forest Labs FLUX.3 direct tier via fal. Single opening keyframe, duration auto or 5-20s, resolution 720p (default) or 1080p, audio ON by default. One-shot finished render, returns the seed.",
4259
3724
  capabilities: { needsImageInput: true, maxInputImages: 1 }
4260
3725
  },
4261
3726
  {
@@ -4264,8 +3729,7 @@ var MODEL_CATALOG2 = [
4264
3729
  modality: "video",
4265
3730
  task: "image-to-video",
4266
3731
  label: "FLUX.3 (first + last frame)",
4267
- description: "Black Forest Labs FLUX.3 direct tier via fal. Start AND end keyframe (start_image_url / end_image_url), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. $0.17 per second at 720p, $0.29 at 1080p; the catalog usd anchors 5s at 720p. Minimum 5s, so a 4s cut means rendering 5s and trimming. Finished quality, returns the seed.",
4268
- cost: { usd: 0.85 },
3732
+ description: "Black Forest Labs FLUX.3 direct tier via fal. Start AND end keyframe (start_image_url / end_image_url), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. Minimum 5s, so a 4s cut means rendering 5s and trimming. Finished quality, returns the seed.",
4269
3733
  capabilities: { needsImageInput: true, maxInputImages: 1, acceptsEndFrame: true }
4270
3734
  },
4271
3735
  {
@@ -4274,8 +3738,7 @@ var MODEL_CATALOG2 = [
4274
3738
  modality: "video",
4275
3739
  task: "image-to-video",
4276
3740
  label: "FLUX.3 (keyframes)",
4277
- description: "Black Forest Labs FLUX.3 direct tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. $0.17 per second at 720p, $0.29 at 1080p; the catalog usd anchors 5s at 720p. Multi-beat actions and pass-bys that a first/last pair cannot express. Finished quality, returns the seed.",
4278
- cost: { usd: 0.85 },
3741
+ description: "Black Forest Labs FLUX.3 direct tier via fal. Up to 10 images pinned to positions on a 24 fps timeline (params.keyframes as [{ imageUrl, frameIndex }]), duration 5-20s, resolution 720p (default) or 1080p, audio ON by default. Multi-beat actions and pass-bys that a first/last pair cannot express. Finished quality, returns the seed.",
4279
3742
  capabilities: { needsImageInput: true, maxInputImages: 10, acceptsKeyframes: true }
4280
3743
  },
4281
3744
  {
@@ -4284,8 +3747,7 @@ var MODEL_CATALOG2 = [
4284
3747
  modality: "video",
4285
3748
  task: "video-enhance",
4286
3749
  label: "FLUX.3 enhance (draft to 1080p)",
4287
- description: "Black Forest Labs FLUX.3 draft-enhance via fal. Input is ONLY the draft_cache of a FLUX.3 draft node (wire the draft node in; nothing else can be enhanced, only re-rendered). Renders the same take, same motion and composition, at a fixed 1080p with synchronized audio. $0.29 per second of enhanced video; the catalog usd anchors 5s. No prompt, duration, aspect or audio knobs (all baked into the cache); safety_tolerance only. Output has no seed or cache.",
4288
- cost: { usd: 1.45 },
3750
+ description: "Black Forest Labs FLUX.3 draft-enhance via fal. Input is ONLY the draft_cache of a FLUX.3 draft node (wire the draft node in; nothing else can be enhanced, only re-rendered). Renders the same take, same motion and composition, at a fixed 1080p with synchronized audio. No prompt, duration, aspect or audio knobs (all baked into the cache); safety_tolerance only. Output has no seed or cache.",
4289
3751
  capabilities: { needsImageInput: false, maxInputImages: 0 },
4290
3752
  isDefault: true
4291
3753
  },
@@ -4295,54 +3757,32 @@ var MODEL_CATALOG2 = [
4295
3757
  modality: "video",
4296
3758
  task: "text-to-video",
4297
3759
  label: "Seedance 1.0 Pro (text-to-video)",
4298
- description: "ByteDance Seedance 1.0 Pro via fal. Text-to-video; roughly $0.62 per 1080p 5s clip. Default text-to-video.",
4299
- cost: { usd: 0.62 },
3760
+ description: "ByteDance Seedance 1.0 Pro via fal. Text-to-video. Default text-to-video.",
4300
3761
  capabilities: { maxInputImages: 0 },
4301
3762
  isDefault: true
4302
3763
  },
4303
- // Video-to-video: Wan 2.2 Animate Replace swaps the person in a source video
4304
- // for the character in ONE reference image, keeping scene + motion. Priced
4305
- // per video second by resolution (fal pricing, vetted 2026-08-20): 480p $0.04,
4306
- // 580p $0.06, 720p $0.08. The catalog usd anchors a 5s clip at 720p, the same
4307
- // way Kling anchors its base clip; the provider scales by duration + resolution.
4308
- // Output is 50fps, 720p max. Only model for the task, so it is the default.
4309
3764
  {
4310
3765
  id: "fal/wan-animate-replace",
4311
3766
  provider: "fal",
4312
3767
  modality: "video",
4313
3768
  task: "video-to-video",
4314
3769
  label: "Wan 2.2 Animate Replace (video-to-video)",
4315
- description: "Wan 2.2 14B Animate Replace via fal. Replaces the person in a source video with the character from one reference image, preserving motion and scene. $0.04 (480p) / $0.06 (580p) / $0.08 (720p) per video second. Default video-to-video.",
4316
- cost: { usd: 0.4 },
3770
+ description: "Wan 2.2 14B Animate Replace via fal. Replaces the person in a source video with the character from one reference image, preserving motion and scene. Default video-to-video.",
4317
3771
  capabilities: { needsImageInput: true, maxInputImages: 1 },
4318
3772
  isDefault: true
4319
3773
  },
4320
- // Kling O3 Pro Edit (fal, July 2026): also keeps the source clip's motion, but
4321
- // takes the character as an ELEMENT of up to four images (a front view plus
4322
- // back and profile views, which a person seen from behind needs) and renders
4323
- // at the source resolution instead of Wan's 720p cap. $0.168 per output
4324
- // second at any resolution; the catalog usd anchors 5s like the Wan entry.
4325
- // Source clip 3 to 15 s, 720 to 3840 px, mp4 or mov (fal enforces).
4326
3774
  {
4327
3775
  id: "fal/kling-o3-edit",
4328
3776
  provider: "fal",
4329
3777
  modality: "video",
4330
3778
  task: "video-to-video",
4331
3779
  label: "Kling O3 Pro Edit (video-to-video)",
4332
- description: "Kuaishou Kling O3 Pro Edit via fal. Replaces the person in a source video (3 to 15 s) with a character given as up to four images: the first wire is the front view, the rest are further views such as back and profile. Keeps motion, audio and the source resolution. $0.168 per video second.",
4333
- cost: { usd: 0.84 },
3780
+ description: "Kuaishou Kling O3 Pro Edit via fal. Replaces the person in a source video (3 to 15 s) with a character given as up to four images: the first wire is the front view, the rest are further views such as back and profile. Keeps motion, audio and the source resolution.",
4334
3781
  // `resolutions: []`: it renders at the source's size and refuses a
4335
3782
  // resolution, so the settings panel offers none and validation refuses one.
4336
3783
  capabilities: { needsImageInput: true, maxInputImages: 4, resolutions: [] }
4337
3784
  },
4338
3785
  // ── fal.ai: vision + utility (B4) ──────────────────────────────────────
4339
- // All sync via fal's subscribe. Two return text/json (vision), two return a
4340
- // new image (upscale / background-remove). fal bills these per compute second
4341
- // and does NOT return a per-call cost, so the catalog usd is a UI hint only
4342
- // (the provider leaves costUsd undefined, same as an unknown image endpoint).
4343
- // Endpoint ids + schemas verified 2026-06-16 against the fal model /api pages.
4344
- // Modality stays `image` (these consume / produce images); one isDefault per
4345
- // (image, task) for the four new tasks.
4346
3786
  {
4347
3787
  id: "fal/florence-2-detailed-caption",
4348
3788
  provider: "fal",
@@ -4350,7 +3790,6 @@ var MODEL_CATALOG2 = [
4350
3790
  task: "image-to-text",
4351
3791
  label: "Florence-2 Detailed Caption (fal)",
4352
3792
  description: "Microsoft Florence-2 Large detailed caption via fal. Returns a rich text description of an image (caption -> job.output.text, no asset). Default image-to-text.",
4353
- cost: { usd: 3e-3 },
4354
3793
  capabilities: { needsImageInput: true, maxInputImages: 1 },
4355
3794
  isDefault: true
4356
3795
  },
@@ -4364,7 +3803,6 @@ var MODEL_CATALOG2 = [
4364
3803
  task: "video-to-text",
4365
3804
  label: "Motion record (Studio)",
4366
3805
  description: "Measures a clip's camera motion from its frames (phase correlation every 0.1 s: pan, tilt, dolly, steadiness, subject motion) and writes a deterministic description to job.output.text plus the full record to job.output.json. Runs in Studio, costs nothing. Default video-to-text.",
4367
- cost: { usd: 0 },
4368
3806
  isDefault: true
4369
3807
  },
4370
3808
  {
@@ -4374,17 +3812,9 @@ var MODEL_CATALOG2 = [
4374
3812
  task: "image-to-json",
4375
3813
  label: "MoonDreamNext VQA (fal)",
4376
3814
  description: "MoonDreamNext visual question answering via fal. Answers a prompt about an image; the provider parses the answer into structured JSON (-> job.output.json, no asset). Default image-to-json.",
4377
- cost: { usd: 3e-3 },
4378
3815
  capabilities: { needsImageInput: true, maxInputImages: 1 },
4379
3816
  isDefault: true
4380
3817
  },
4381
- // Judge (P3 J1). The same MoonDreamNext VQA endpoint `fal/moondream-next-vqa`
4382
- // above already runs shotReview.ts's ranking call, under a separate catalog
4383
- // id because a catalog entry's `task` is fixed and `listByTask('judge')`
4384
- // needs at least one entry to give a placed judge node a selectable default
4385
- // model. Not dispatched yet: `judge` runs as a human gate (`taskExecution`
4386
- // in task-kind.ts) and makes no model call at all until J5 wires the actual
4387
- // ranking back onto shotReview.ts rather than a second implementation.
4388
3818
  {
4389
3819
  id: "fal/moondream-next-vqa-judge",
4390
3820
  provider: "fal",
@@ -4392,22 +3822,16 @@ var MODEL_CATALOG2 = [
4392
3822
  task: "judge",
4393
3823
  label: "MoonDreamNext VQA (judge ranking)",
4394
3824
  description: "The judge node's ranking call: the same MoonDreamNext VQA endpoint shotReview.ts already uses to score a candidate image. A judge node runs as a human GATE (it parks the run on a decision, see taskExecution), so it has no job kind; this model is what P3 J5 will rank candidates with. Default judge.",
4395
- cost: { usd: 3e-3 },
4396
3825
  capabilities: { needsImageInput: true, maxInputImages: 1 },
4397
3826
  isDefault: true
4398
3827
  },
4399
- // Rig and animate (2026-09-26): Meshy on fal. One entry for both of fal's
4400
- // Meshy endpoints: a rig with no presets calls `fal-ai/meshy/rigging`, one
4401
- // with presets calls `fal-ai/meshy/rigging/multi-animation`, and the price
4402
- // rule is the same for both (models/pricing.ts `meshyRigCostUsd`).
4403
3828
  {
4404
3829
  id: "fal/meshy-rigging",
4405
3830
  provider: "fal",
4406
3831
  modality: "3d",
4407
3832
  task: "rig",
4408
3833
  label: "Meshy rig and animate (fal)",
4409
- description: "Adds a skeleton and skin weights to a humanoid mesh and applies up to 10 animation presets from Meshy's 678-preset library; walk and run clips are always included. $0.20 per rig plus $0.12 per preset. Humanoid characters only.",
4410
- cost: { usd: FAL_MESHY_RIG_USD2 },
3834
+ description: "Adds a skeleton and skin weights to a humanoid mesh and applies up to 10 animation presets from Meshy's 678-preset library; walk and run clips are always included. Humanoid characters only.",
4411
3835
  isDefault: true
4412
3836
  },
4413
3837
  {
@@ -4416,8 +3840,7 @@ var MODEL_CATALOG2 = [
4416
3840
  modality: "image",
4417
3841
  task: "upscale",
4418
3842
  label: "AuraSR Upscale (fal)",
4419
- description: "AuraSR GigaGAN upscaler via fal. Produces a higher-resolution Image asset from a source image (default 4x). Default upscale. Compute-second billed; catalog usd is a hint.",
4420
- cost: { usd: 0.01 },
3843
+ description: "AuraSR GigaGAN upscaler via fal. Produces a higher-resolution Image asset from a source image (default 4x). Default upscale.",
4421
3844
  capabilities: { needsImageInput: true, maxInputImages: 1 },
4422
3845
  isDefault: true
4423
3846
  },
@@ -4427,35 +3850,21 @@ var MODEL_CATALOG2 = [
4427
3850
  modality: "image",
4428
3851
  task: "background-remove",
4429
3852
  label: "BiRefNet v2 Background Removal (fal)",
4430
- description: "BiRefNet v2 background removal via fal. Produces a transparent-background PNG Image asset from a source image. Default background-remove. Compute-second billed; catalog usd is a hint.",
4431
- cost: { usd: 0.01 },
3853
+ description: "BiRefNet v2 background removal via fal. Produces a transparent-background PNG Image asset from a source image. Default background-remove.",
4432
3854
  capabilities: { needsImageInput: true, maxInputImages: 1 },
4433
3855
  isDefault: true
4434
3856
  },
4435
3857
  // ── audio: music via Suno-through-KIE (B2) ─────────────────────────────
4436
- // Async via KIE's Suno job API (createTask -> webhook / record-info poll).
4437
- // KIE does not return a per-song USD on the result, so the catalog usd is a
4438
- // flat per-song estimate (~$0.03-$0.04 per song per audio-providers.md, KIE's
4439
- // markup keeps it in that band). V5 is Suno's current top model.
4440
3858
  {
4441
3859
  id: "kie/suno-v5",
4442
3860
  provider: "kie",
4443
3861
  modality: "audio",
4444
3862
  task: "text-to-audio",
4445
3863
  label: "Suno V5 (KIE)",
4446
- description: "Suno V5 music generation via KIE. Text-to-music with or without lyrics; ~4 min cap per generation. Default text-to-audio. No IP indemnity (KIE aggregator). KIE's site now features Suno v5.5 and no longer lists a V5 price (checked 2026-09-27), so the $0.04 is an unverified hint.",
4447
- cost: { usd: 0.04 },
4448
- listPrice: { source: "unrecorded" },
3864
+ description: "Suno V5 music generation via KIE. Text-to-music with or without lyrics; ~4 min cap per generation. Default text-to-audio. No IP indemnity (KIE aggregator).",
4449
3865
  isDefault: true
4450
3866
  },
4451
3867
  // ── audio: voice via ElevenLabs (B2) ───────────────────────────────────
4452
- // Sync against the official ElevenLabs API (xi-api-key). TTS returns audio
4453
- // bytes inline; STT returns a transcript (text, not a binary asset). Prices
4454
- // per ElevenLabs API price page (checked 2026-09-27): text-to-speech
4455
- // Multilingual v2 is $0.10 per 1,000 characters (not about $0.0003 per
4456
- // character). Scribe v1 is no longer on the price page; Scribe v2 is $0.22
4457
- // per audio hour. The catalog usd is a per-call hint, the provider does not
4458
- // bill per call so cost stays approximate.
4459
3868
  {
4460
3869
  id: "elevenlabs/tts-multilingual-v2",
4461
3870
  provider: "elevenlabs",
@@ -4463,7 +3872,6 @@ var MODEL_CATALOG2 = [
4463
3872
  task: "text-to-speech",
4464
3873
  label: "ElevenLabs Multilingual v2 (TTS)",
4465
3874
  description: "ElevenLabs Multilingual v2 text-to-speech. 99+ languages, brand-voice cloning capable. Default text-to-speech. Returns mp3 bytes synchronously.",
4466
- cost: { usd: 0.03 },
4467
3875
  isDefault: true
4468
3876
  },
4469
3877
  {
@@ -4473,28 +3881,16 @@ var MODEL_CATALOG2 = [
4473
3881
  task: "speech-to-text",
4474
3882
  label: "ElevenLabs Scribe v1 (STT)",
4475
3883
  description: "ElevenLabs Scribe v1 speech-to-text. Whisper-class transcription; returns a transcript (text), not a binary asset. Default speech-to-text.",
4476
- cost: { usd: 0.01 },
4477
3884
  isDefault: true
4478
3885
  },
4479
3886
  // ── text: LLM director (B3) ────────────────────────────────────────────
4480
- // The director's brain, NOT an asset-generation path: prompt improvement and
4481
- // shot descriptions via a synchronous TextClient (no Jobs, no Assets). KIE
4482
- // exposes Claude (Sonnet / Opus) at a lower rate than the official API via an
4483
- // Anthropic-Messages-compatible endpoint (api.kie.ai/claude/v1/messages,
4484
- // vetted 2026-06-16); OpenRouter routes the same Claude family through its
4485
- // OpenAI chat/completions surface and returns the authoritative usage.cost.
4486
- // KIE / OpenRouter report real cost per call, so the catalog usd is a UI hint.
4487
- // Exactly one isDefault for (text, text-generation): KIE Sonnet (cheapest
4488
- // reliable director path with no IP-indemnity concern for internal use).
4489
3887
  {
4490
3888
  id: "kie/claude-sonnet-4-5",
4491
3889
  provider: "kie",
4492
3890
  modality: "text",
4493
3891
  task: "text-generation",
4494
3892
  label: "Claude Sonnet 4.5 (KIE)",
4495
- description: "Anthropic Claude Sonnet 4.5 via KIE (Anthropic Messages API at a lower rate). Default LLM director: prompt improvement + shot descriptions. Cost billed per token; catalog usd is a hint.",
4496
- cost: { usd: 0.01 },
4497
- listPrice: { source: "unrecorded" },
3893
+ description: "Anthropic Claude Sonnet 4.5 via KIE. Default LLM director: prompt improvement + shot descriptions.",
4498
3894
  isDefault: true
4499
3895
  },
4500
3896
  {
@@ -4503,9 +3899,7 @@ var MODEL_CATALOG2 = [
4503
3899
  modality: "text",
4504
3900
  task: "text-generation",
4505
3901
  label: "Claude Opus 4.5 (KIE)",
4506
- description: "Anthropic Claude Opus 4.5 via KIE. Higher quality, higher cost; use for harder director reasoning. Cost billed per token; catalog usd is a hint.",
4507
- cost: { usd: 0.05 },
4508
- listPrice: { source: "unrecorded" }
3902
+ description: "Anthropic Claude Opus 4.5 via KIE. Higher quality; use for harder director reasoning."
4509
3903
  },
4510
3904
  {
4511
3905
  id: "openrouter/claude-sonnet-4-6",
@@ -4513,25 +3907,15 @@ var MODEL_CATALOG2 = [
4513
3907
  modality: "text",
4514
3908
  task: "text-generation",
4515
3909
  label: "Claude Sonnet 4.6 (OpenRouter)",
4516
- description: "Anthropic Claude Sonnet 4.6 via OpenRouter (OpenAI chat/completions shape). Alternative director path; returns authoritative usage.cost per request.",
4517
- cost: { usd: 0.012 }
4518
- },
4519
- // The prompt-improve models (2026-09-27). Marlin asked for a more capable
4520
- // model than the default director for the Improve button. On his real
4521
- // image-edit prompt ("make her look a bit like a red panda, cartoonish, like
4522
- // from Disney") GPT-6 Astra was the only one of five that kept the "a bit":
4523
- // a light transformation that keeps her recognizable, at about $0.011 per
4524
- // rewrite in 6 s. Claude Opus 5.5 wrote the richest detail ($0.012, 9.5 s)
4525
- // and is Astra's fallback from a different vendor. Costs are that measured
4526
- // call; OpenRouter bills the real usage.cost.
3910
+ description: "Anthropic Claude Sonnet 4.6 via OpenRouter (OpenAI chat/completions shape). Alternative director path; returns authoritative usage.cost per request."
3911
+ },
4527
3912
  {
4528
3913
  id: "openrouter/gpt-6-astra",
4529
3914
  provider: "openrouter",
4530
3915
  modality: "text",
4531
3916
  task: "text-generation",
4532
3917
  label: "GPT-6 Astra (OpenRouter)",
4533
- description: "OpenAI GPT-6 Astra, the flagship of the GPT-6 series, via OpenRouter. Writes the Improve rewrites: the most faithful to the intent of a rough prompt in a five-model comparison on 2026-09-27. $10 per million input and $50 per million output tokens, about $0.011 per rewrite.",
4534
- cost: { usd: 0.011 }
3918
+ description: "OpenAI GPT-6 Astra, the flagship of the GPT-6 series, via OpenRouter. Writes the Improve rewrites: the most faithful to the intent of a rough prompt in a five-model comparison on 2026-09-27."
4535
3919
  },
4536
3920
  {
4537
3921
  id: "openrouter/claude-opus-5-5",
@@ -4539,8 +3923,7 @@ var MODEL_CATALOG2 = [
4539
3923
  modality: "text",
4540
3924
  task: "text-generation",
4541
3925
  label: "Claude Opus 5.5 (OpenRouter)",
4542
- description: "Anthropic Claude Opus 5.5 via OpenRouter. The fallback for GPT-6 Astra on Improve, from a different vendor so one outage cannot break it. $4 per million input and $20 per million output tokens, about $0.012 per rewrite.",
4543
- cost: { usd: 0.012 }
3926
+ description: "Anthropic Claude Opus 5.5 via OpenRouter. The fallback for GPT-6 Astra on Improve, from a different vendor so one outage cannot break it."
4544
3927
  },
4545
3928
  // ── Vertex AI: fallback path, kept unwired for v0.1 ────────────────────
4546
3929
  // Provider code is still in place so a future flip back is one isDefault
@@ -4570,20 +3953,30 @@ var MODEL_CATALOG2 = [
4570
3953
  description: "Vertex AI direct, newest flash variant. Global region. Preview status."
4571
3954
  }
4572
3955
  ];
3956
+ var PINNED_FAL_NOTE2 = "Pinned to fal: a job on this entry never goes to KIE.";
3957
+ var PINNED_KIE_NOTE2 = "Pinned to KIE: no fal fallback. Pick the automatic entry of this model to get one.";
3958
+ function withRouteNote2(entry) {
3959
+ const role = routeRoleOf2(entry.id);
3960
+ if (!role) return entry;
3961
+ const note = role.role === "fallback" ? PINNED_FAL_NOTE2 : PINNED_KIE_NOTE2;
3962
+ return { ...entry, description: `${entry.description ?? ""} ${note}`.trim() };
3963
+ }
3964
+ var MODEL_CATALOG2 = CATALOG_ENTRIES2.map(withRouteNote2);
4573
3965
  var routeEntries2 = /* @__PURE__ */ new Map();
4574
3966
  function routeEntry2(id) {
4575
3967
  const cached = routeEntries2.get(id);
4576
3968
  if (cached) return cached;
4577
3969
  const route = getRoute2(id);
4578
- const primary = route ? MODEL_CATALOG2.find((m) => m.id === route.primary) : void 0;
3970
+ const primary = route ? CATALOG_ENTRIES2.find((m) => m.id === route.primary) : void 0;
4579
3971
  if (!route || !primary) return void 0;
4580
3972
  const entry = {
4581
3973
  ...primary,
4582
- // A route is never the default of its task (that is slice 3's switch).
3974
+ // Whether a route is the default of its task is `getDefaultModelId`'s
3975
+ // answer, never a flag copied from its KIE side.
4583
3976
  isDefault: void 0,
4584
3977
  id: route.id,
4585
3978
  label: route.label,
4586
- description: `Runs on KIE first and, when KIE fails on its side, again on fal with the same settings. ${primary.description ?? ""}`.trim()
3979
+ description: `Runs on KIE first and, when KIE fails on its side, again on fal with the same settings. ` + `To keep a job off KIE, pin the fal entry of this model. ${primary.description ?? ""}`.trim()
4587
3980
  };
4588
3981
  routeEntries2.set(id, entry);
4589
3982
  return entry;
@@ -4591,6 +3984,23 @@ function routeEntry2(id) {
4591
3984
  function tryGetModel2(id) {
4592
3985
  return MODEL_CATALOG2.find((m) => m.id === id) ?? routeEntry2(id);
4593
3986
  }
3987
+ function imageResolutionTier(value) {
3988
+ if (typeof value !== "string") return null;
3989
+ switch (value.trim().toLowerCase()) {
3990
+ case "0.5k":
3991
+ case "512px":
3992
+ case "512":
3993
+ return "0.5K";
3994
+ case "1k":
3995
+ return "1K";
3996
+ case "2k":
3997
+ return "2K";
3998
+ case "4k":
3999
+ return "4K";
4000
+ default:
4001
+ return null;
4002
+ }
4003
+ }
4594
4004
  function supportedResolutions(model) {
4595
4005
  const declared = model?.capabilities?.resolutions;
4596
4006
  return declared ? declared : null;
@@ -5288,6 +4698,29 @@ function paramTypeForInput(type) {
5288
4698
  function isUsableSourceUrl(url) {
5289
4699
  return url.length > 0 && !url.startsWith("data:");
5290
4700
  }
4701
+ function refNodesOf(binding) {
4702
+ if (binding.kind === "ref") return [binding.node];
4703
+ if (binding.kind === "list")
4704
+ return binding.items.flatMap((item) => item.kind === "ref" ? [item.node] : []);
4705
+ return [];
4706
+ }
4707
+ function upstreamClosure(doc, only) {
4708
+ const deps = /* @__PURE__ */ new Map();
4709
+ for (const e of doc.edges) {
4710
+ const list = deps.get(e.target);
4711
+ if (list) list.push(e.source);
4712
+ else deps.set(e.target, [e.source]);
4713
+ }
4714
+ const closure = /* @__PURE__ */ new Set();
4715
+ const queue = [...only];
4716
+ while (queue.length > 0) {
4717
+ const id = queue.pop();
4718
+ if (closure.has(id)) continue;
4719
+ closure.add(id);
4720
+ for (const source of deps.get(id) ?? []) queue.push(source);
4721
+ }
4722
+ return closure;
4723
+ }
5291
4724
  function documentToDefinition(doc, opts = {}) {
5292
4725
  const integrity = validateDocument(doc);
5293
4726
  if (!integrity.ok)
@@ -5295,8 +4728,9 @@ function documentToDefinition(doc, opts = {}) {
5295
4728
  ok: false,
5296
4729
  issues: [{ code: "integrity", message: integrity.message }]
5297
4730
  };
5298
- const issues = [];
4731
+ let issues = [];
5299
4732
  const byId = new Map(doc.nodes.map((n) => [n.id, n]));
4733
+ const scope = opts.only && opts.only.length > 0 ? upstreamClosure(doc, opts.only) : null;
5300
4734
  const incoming = /* @__PURE__ */ new Map();
5301
4735
  for (const e of doc.edges) {
5302
4736
  const list = incoming.get(e.target);
@@ -5313,7 +4747,7 @@ function documentToDefinition(doc, opts = {}) {
5313
4747
  ...n.cardinality === "many" ? { cardinality: "many" } : {},
5314
4748
  ...n.default !== void 0 ? { default: n.default } : {}
5315
4749
  }));
5316
- const nodes = [];
4750
+ let nodes = [];
5317
4751
  for (const node of doc.nodes) {
5318
4752
  if (node.kind !== "task") continue;
5319
4753
  const { task } = node;
@@ -5449,6 +4883,32 @@ function documentToDefinition(doc, opts = {}) {
5449
4883
  Object.assign(inputs, settingsBindings(task, node.settings));
5450
4884
  nodes.push({ id: node.id, task, model: node.model, inputs });
5451
4885
  }
4886
+ if (scope) {
4887
+ const projected = new Set(nodes.map((n) => n.id));
4888
+ const left = /* @__PURE__ */ new Set();
4889
+ for (const issue of issues)
4890
+ if (issue.nodeId !== void 0 && !scope.has(issue.nodeId))
4891
+ left.add(issue.nodeId);
4892
+ for (const n of doc.nodes)
4893
+ if (n.kind === "task" && !scope.has(n.id) && !projected.has(n.id))
4894
+ left.add(n.id);
4895
+ let grew = left.size > 0;
4896
+ while (grew) {
4897
+ grew = false;
4898
+ for (const n of nodes) {
4899
+ if (left.has(n.id) || scope.has(n.id)) continue;
4900
+ const reads = Object.values(n.inputs).flatMap(refNodesOf);
4901
+ if (reads.some((id) => left.has(id))) {
4902
+ left.add(n.id);
4903
+ grew = true;
4904
+ }
4905
+ }
4906
+ }
4907
+ issues = issues.filter(
4908
+ (issue) => issue.nodeId === void 0 || scope.has(issue.nodeId)
4909
+ );
4910
+ nodes = nodes.filter((n) => !left.has(n.id));
4911
+ }
5452
4912
  if (nodes.length === 0 && issues.length === 0) {
5453
4913
  issues.push({
5454
4914
  code: "no_task_nodes",
@@ -5972,7 +5432,7 @@ var studioWorkflowDescribe = defineTool({
5972
5432
  inputSchema: {
5973
5433
  tasks: z7.array(z7.string().min(1)).min(1).optional().describe('Only these task ids (e.g. ["text-to-image", "image-to-video"]). An unknown id is an error that lists the known ones.'),
5974
5434
  includeSettings: z7.boolean().default(false).describe("Include each task's settings knobs (key, type, range, default)."),
5975
- includeModels: z7.boolean().default(false).describe("Include the model catalog per task (id, label, provider, cost, isDefault).")
5435
+ includeModels: z7.boolean().default(false).describe("Include the model catalog per task (id, label, provider, price, isDefault). price is what one generation costs your company at the default settings: { usd, fromUsd? }.")
5976
5436
  },
5977
5437
  annotations: { readOnlyHint: true },
5978
5438
  handler: async (args, ctx) => {
@@ -6249,7 +5709,7 @@ var studioListProjects = defineTool({
6249
5709
  });
6250
5710
  var studioGenerateImage = defineTool({
6251
5711
  name: "studio_generate_image",
6252
- description: 'Generate an image from a prompt. A brand is optional: pass brandSlug to have the Studio apply that brand\'s style prefix and reference images server-side, or leave it out for an image without a brand. Optionally pin a character (characterSlug) so its identity references are injected too. A brandSlug or characterSlug that names nothing your company can use is refused before anything is spent (404, code input_not_found), and the error text says what to do next: act on it or relay it as written. The image is filed in projectId when given, otherwise in the project named after the brand (created on first use), otherwise in the project "default". Submits a job and, when wait=true (default), polls until it finishes and returns the signed image URL and costUsd (the provider cost of the job; what a company on prepaid credits pays for it is at least that cost times its rate, see studio_get_usage). With wait=false it returns the jobId immediately for studio_get_job. candidateCount asks for up to four candidates, but some models render one image regardless of the count: the result carries `candidates: { requested, rendered, mayRender? }`, and a `notice` to pass on to the user whenever fewer images will be made than were asked for. Typical cost ~$0.04 per image.',
5712
+ description: "Generate an image from a prompt. A brand is optional: pass brandSlug to have the Studio apply that brand's style prefix and reference images server-side, or leave it out for an image without a brand. Optionally pin a character (characterSlug) so its identity references are injected too. A brandSlug or characterSlug that names nothing your company can use is refused before anything is spent (404, code input_not_found), and the error text says what to do next: act on it or relay it as written. The image is filed in projectId when given, otherwise in the project named after the brand (created on first use), otherwise in the project \"default\". Submits a job and, when wait=true (default), polls until it finishes and returns the signed image URL and costUsd (what the job cost your company: for a company on prepaid credits, what left its balance). With wait=false it returns the jobId immediately for studio_get_job. candidateCount asks for up to four candidates, but some models render one image regardless of the count: the result carries `candidates: { requested, rendered, mayRender? }`, and a `notice` to pass on to the user whenever fewer images will be made than were asked for. A typical image costs about $0.06 on prepaid credits without a subscription; the job's costUsd is the exact amount.",
6253
5713
  inputSchema: {
6254
5714
  brandSlug: slug.optional().describe(
6255
5715
  "Optional. The slug of a brand of your company (create one with studio_create_brand). Omit it to generate without a brand. A slug that names no brand of your company is refused with 404 input_not_found; it is never used as a project name."
@@ -6303,7 +5763,7 @@ var studioGenerateImage = defineTool({
6303
5763
  var GENERATE_3D_TASKS = /* @__PURE__ */ new Set(["text-to-3d", "image-to-3d"]);
6304
5764
  var studioGenerate3d = defineTool({
6305
5765
  name: "studio_generate_3d",
6306
- description: "Generate one 3D model (a textured GLB mesh) through 3D AI Studio, from a text prompt or from one image (imageUrl). Text models: studio3d/tripo-3-1-text-to-3d (the default), studio3d/hunyuan-3-1-rapid, studio3d/hunyuan-3-1-pro. Image models: studio3d/trellis-2 (the default when imageUrl is given), studio3d/tripo-3-1-image-to-3d. Submits a job and, when wait=true (default), polls until it finishes (usually one to five minutes) and returns the signed GLB URL and its cost in USD (Studio prices the request it sent, since 3D AI Studio reports no per-job charge). With wait=false it returns the jobId for studio_get_job. Typical cost $0.25 to $0.70 per model.",
5766
+ description: "Generate one 3D model (a textured GLB mesh) through 3D AI Studio, from a text prompt or from one image (imageUrl). Text models: studio3d/tripo-3-1-text-to-3d (the default), studio3d/hunyuan-3-1-rapid, studio3d/hunyuan-3-1-pro. Image models: studio3d/trellis-2 (the default when imageUrl is given), studio3d/tripo-3-1-image-to-3d. Submits a job and, when wait=true (default), polls until it finishes (usually one to five minutes) and returns the signed GLB URL and its cost in USD (Studio prices the request it sent, since 3D AI Studio reports no per-job charge). With wait=false it returns the jobId for studio_get_job. The price follows the model and the quality flags; the returned costUsd is the exact amount.",
6307
5767
  inputSchema: {
6308
5768
  prompt: z8.string().min(1).max(1024).describe("What to model. With imageUrl, a short description of the object in the image."),
6309
5769
  imageUrl: httpUrl.optional().describe("Public http(s) URL of one image to model from. Selects an image model."),
@@ -6367,7 +5827,7 @@ var studioFindAnimations = defineTool({
6367
5827
  });
6368
5828
  var studioRig3d = defineTool({
6369
5829
  name: "studio_rig_3d",
6370
- description: "Rig a humanoid 3D model and animate it (Meshy on fal): adds a skeleton and skin weights to a Model3D asset and applies up to 10 animation presets from Meshy's library; walk and run clips always come with the rig. Pass the mesh's assetId (studio_generate_3d returns it as assetId) and presets as names or ids (find them with studio_find_animations). Runs as a one-node workflow, so the cost gate and quota apply. Waits by default (usually one to three minutes) and returns the rigged GLB url, each clip's name and url, and costUsd: $0.20 per rig plus $0.12 per preset. Humanoid characters only: an animal or an object will fail at the provider.",
5830
+ description: "Rig a humanoid 3D model and animate it (Meshy on fal): adds a skeleton and skin weights to a Model3D asset and applies up to 10 animation presets from Meshy's library; walk and run clips always come with the rig. Pass the mesh's assetId (studio_generate_3d returns it as assetId) and presets as names or ids (find them with studio_find_animations). Runs as a one-node workflow, so the cost gate and quota apply. Waits by default (usually one to three minutes) and returns the rigged GLB url, each clip's name and url, and costUsd (what it cost your company: a price per rig plus a price per preset). Humanoid characters only: an animal or an object will fail at the provider.",
6371
5831
  inputSchema: {
6372
5832
  projectId: z8.string().min(1).describe("The project the mesh lives in (from studio_list_projects)."),
6373
5833
  meshAssetId: z8.string().min(1).describe("The Model3D asset to rig: the assetId studio_generate_3d returned."),
@@ -6703,7 +6163,7 @@ var studioGetRunOutput = defineTool({
6703
6163
  });
6704
6164
  var studioReplaceCharacterInVideo = defineTool({
6705
6165
  name: "studio_replace_character_in_video",
6706
- description: 'Put a minted character into a video shot through the still-swap route: (1) an image-edit node (fal/nano-banana-2-edit) replaces the person in a scene FRAME with the character; (2) an image-to-video node animates that still (default fal/seedance-pro-image-to-video; with endFrameUrl it switches to fal/kling-v2-5-image-to-video and binds the end keyframe so the clip lands on it). Be honest with the user about what this route is: the video step REGENERATES the motion from the stills, so the original performance, timing and background are recreated rather than preserved; when the original motion must survive exactly, say so before spending. Declare scope: identity (default) takes face, head and hair and keeps the footage body; full_body also takes the character body proportions, which changes the silhouette. Pass preserve with the two or three shot-specific constraints most likely to fail, from looking at the frame (e.g. "keep the open door in front of his body", "match the face soft focus"), or a complete swapPrompt of your own. Never add a realism suffix like "photorealistic" or a promise that every pixel stays identical; the model cannot keep either and the suffix sharpens deliberately soft subjects. Give the character as characterSlug (its full-body reference is used, falling back to three-quarter then face) or as an explicit characterReferenceUrl. Requires a frame URL: extract a representative frame from the video yourself first (this tool does not decode video). Waits for both nodes and returns stillUrl, videoUrl, runId and costUsd (about $0.70 per take). Inspect the still before paying for more takes, keep generated cuts under 5 seconds, and budget one take plus two retries per shot. Do not use video-to-video swap models on dark or handheld footage.',
6166
+ description: 'Put a minted character into a video shot through the still-swap route: (1) an image-edit node (fal/nano-banana-2-edit) replaces the person in a scene FRAME with the character; (2) an image-to-video node animates that still (default fal/seedance-pro-image-to-video; with endFrameUrl it switches to fal/kling-v2-5-image-to-video and binds the end keyframe so the clip lands on it). Be honest with the user about what this route is: the video step REGENERATES the motion from the stills, so the original performance, timing and background are recreated rather than preserved; when the original motion must survive exactly, say so before spending. Declare scope: identity (default) takes face, head and hair and keeps the footage body; full_body also takes the character body proportions, which changes the silhouette. Pass preserve with the two or three shot-specific constraints most likely to fail, from looking at the frame (e.g. "keep the open door in front of his body", "match the face soft focus"), or a complete swapPrompt of your own. Never add a realism suffix like "photorealistic" or a promise that every pixel stays identical; the model cannot keep either and the suffix sharpens deliberately soft subjects. Give the character as characterSlug (its full-body reference is used, falling back to three-quarter then face) or as an explicit characterReferenceUrl. Requires a frame URL: extract a representative frame from the video yourself first (this tool does not decode video). Waits for both nodes and returns stillUrl, videoUrl, runId and costUsd (what the take cost your company; about $1.05 with the default models on prepaid credits without a subscription). Inspect the still before paying for more takes, keep generated cuts under 5 seconds, and budget one take plus two retries per shot. Do not use video-to-video swap models on dark or handheld footage.',
6707
6167
  inputSchema: {
6708
6168
  projectId: z8.string().min(1).describe("Project id from studio_list_projects."),
6709
6169
  sceneFrameUrl: httpUrl.describe("Public or signed URL of ONE frame of the target shot (png/jpg)."),
@@ -6782,7 +6242,7 @@ var studioReplaceCharacterInVideo = defineTool({
6782
6242
  });
6783
6243
  var studioGetSpend = defineTool({
6784
6244
  name: "studio_get_spend",
6785
- description: "Read the spend ledger: total USD and job counts for today, the last 7 days and the last 30 days, plus the most recent paid actions. The amounts are provider cost (each job's costUsd); for a company on prepaid credits, what left its balance is in studio_get_usage (`credits`). tzOffsetMinutes is the viewer's Date.getTimezoneOffset() so \"today\" rolls at local midnight (default UTC).",
6245
+ description: `Read the spend ledger: total USD and job counts for today, the last 7 days and the last 30 days, plus the most recent paid actions. The amounts are what the company paid (each job's costUsd): for a company on prepaid credits, what left its balance for those jobs. tzOffsetMinutes is the viewer's Date.getTimezoneOffset() so "today" rolls at local midnight (default UTC).`,
6786
6246
  inputSchema: {
6787
6247
  tzOffsetMinutes: z8.number().int().min(-840).max(840).optional()
6788
6248
  },
@@ -6794,7 +6254,7 @@ var studioGetSpend = defineTool({
6794
6254
  });
6795
6255
  var studioGetUsage = defineTool({
6796
6256
  name: "studio_get_usage",
6797
- description: "Read what limits the company this key belongs to, and what it has used: month-to-date spend (usedUsd, realizedUsd, inFlightEstimatedUsd) and job count at provider cost, the monthly cap (capUsd) and requests-per-minute limit (rpm), null meaning none, and a per-model breakdown, most expensive first. A company on prepaid credits (every new company; a company the Studio already knew keeps the caps it had) has no monthly cap unless the Lumitra operator set one; `credits` says what limits it instead: `balanceUsd` (the prepaid balance), `dailyLimitUsd` (null: none), `usedTodayUsd` (what left the balance today, running jobs included) and `dailyResetsAt` (midnight UTC). Each finished generation is debited from the balance at provider cost times the company's rate (1.50 on pay as you go), or 80 percent of the model's list price where that is higher, so the credit figures are higher than the provider-cost figures beside them. balanceUsd does not yet subtract what is reserved for requests that are still starting or running, so the room for a new request can be smaller than balanceUsd. A company not on credits has `credits` null and is held to its monthly cap (20 USD by default, capSource \"default\", unless the Lumitra operator set a plan). Call this before a large batch to check remaining room, or after a 402 or 429 to see what tripped. The refusal's own error text says which limit it was and what to do, so relay it as written; it also names the code: `credits_exhausted` (the balance does not cover the request: add credits on the Billing page, or wait a few seconds when part of the balance is only reserved), `daily_cap_reached` (on credits a company owner or admin raises the daily limit on the Billing page; it resets at midnight UTC), `monthly_cap_reached` (only the Lumitra operator can raise it) or `velocity_limit_reached` (too many paid requests in a short time: wait as long as the text says). usedUsd includes in-flight (not yet settled) job estimates, so it can go DOWN as well as up: a job that later fails releases its estimate.",
6257
+ description: "Read what limits the company this key belongs to, and what it has used: month-to-date spend (usedUsd, realizedUsd, inFlightEstimatedUsd) and job count in what the company paid, the monthly cap (capUsd) and requests-per-minute limit (rpm), null meaning none, and a per-model breakdown, most expensive first. A company on prepaid credits (every new company; a company the Studio already knew keeps the caps it had) has no monthly cap unless the Lumitra operator set one; `credits` says what limits it instead: `balanceUsd` (the prepaid balance), `dailyLimitUsd` (null: none), `usedTodayUsd` (what left the balance today, running jobs included), `dailyResetsAt` (midnight UTC) and `operatorMonthlyLimit` (true when the Lumitra operator set a monthly limit on top; its amount is not reported, and capUsd is null on credits). Each finished generation is paid from the balance at Studio's price for it, the same amount the job reports as costUsd, so every figure here is in the dollars the balance is in. balanceUsd does not yet subtract what is reserved for requests that are still starting or running, so the room for a new request can be smaller than balanceUsd. A company not on credits has `credits` null and is held to its monthly cap (20 USD by default, capSource \"default\", unless the Lumitra operator set a plan). Call this before a large batch to check remaining room, or after a 402 or 429 to see what tripped. The refusal's own error text says which limit it was and what to do, so relay it as written; it also names the code: `credits_exhausted` (the balance does not cover the request: add credits on the Billing page, or wait a few seconds when part of the balance is only reserved), `daily_cap_reached` (on credits a company owner or admin raises the daily limit on the Billing page; it resets at midnight UTC), `monthly_cap_reached` (only the Lumitra operator can raise it) or `velocity_limit_reached` (too many paid requests in a short time: wait as long as the text says). usedUsd includes in-flight (not yet settled) job estimates, so it can go DOWN as well as up: a job that later fails releases its estimate.",
6798
6258
  inputSchema: {},
6799
6259
  annotations: { readOnlyHint: true },
6800
6260
  handler: async (_args, ctx) => {
@@ -6914,7 +6374,7 @@ function registerTools(server, ctx) {
6914
6374
 
6915
6375
  // src/server.ts
6916
6376
  var SERVER_NAME = "lumitra-studio";
6917
- var SERVER_VERSION = "0.5.0";
6377
+ var SERVER_VERSION = "0.6.0";
6918
6378
  function createStudioMcpServer(opts = {}) {
6919
6379
  const config = opts.config ?? resolveConfig(opts.env ?? process.env);
6920
6380
  const client = new StudioClient(config, {