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