@agentmedia/schema 0.2.2 → 0.3.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/video.d.ts CHANGED
@@ -350,26 +350,428 @@ export declare const SubtitleSchema: z.ZodObject<{
350
350
  style?: "hormozi" | "minimal" | "bold" | "karaoke" | "clean" | "tiktok" | "neon" | "fire" | "glow" | "pop" | "aesthetic" | "impact" | "pastel" | "electric" | "boxed" | "gradient" | "spotlight" | undefined;
351
351
  }>;
352
352
  export type SubtitleInput = z.infer<typeof SubtitleSchema>;
353
- export declare const ProductReviewSchema: z.ZodObject<{
354
- product_url: z.ZodString;
353
+ export declare const SaasReviewSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
354
+ script: z.ZodOptional<z.ZodString>;
355
+ prompt: z.ZodOptional<z.ZodString>;
356
+ product_url: z.ZodOptional<z.ZodString>;
355
357
  angle: z.ZodOptional<z.ZodEnum<["honest", "enthusiastic", "roast", "tutorial", "comparison"]>>;
358
+ actor_slug: z.ZodOptional<z.ZodString>;
359
+ persona_slug: z.ZodOptional<z.ZodString>;
360
+ face_photo_url: z.ZodOptional<z.ZodString>;
361
+ voice: z.ZodOptional<z.ZodString>;
362
+ target_duration: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
363
+ style: z.ZodOptional<z.ZodString>;
356
364
  tone: z.ZodOptional<z.ZodEnum<["energetic", "calm", "confident", "dramatic"]>>;
365
+ voice_speed: z.ZodOptional<z.ZodNumber>;
366
+ music: z.ZodOptional<z.ZodEnum<["chill", "energetic", "corporate", "dramatic", "upbeat"]>>;
367
+ cta: z.ZodOptional<z.ZodString>;
368
+ aspect_ratio: z.ZodOptional<z.ZodEnum<["9:16", "16:9", "1:1"]>>;
369
+ template: z.ZodOptional<z.ZodString>;
370
+ composition_mode: z.ZodOptional<z.ZodLiteral<"pip">>;
371
+ pip_options: z.ZodOptional<z.ZodObject<{
372
+ position: z.ZodOptional<z.ZodEnum<["bottom-center", "bottom-left", "bottom-right"]>>;
373
+ size: z.ZodOptional<z.ZodEnum<["small", "medium", "large"]>>;
374
+ animation: z.ZodOptional<z.ZodEnum<["slide-up", "slide-left", "slide-right", "fade", "scale"]>>;
375
+ frame_style: z.ZodOptional<z.ZodEnum<["none", "rounded", "shadow"]>>;
376
+ }, "strict", z.ZodTypeAny, {
377
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
378
+ size?: "medium" | "small" | "large" | undefined;
379
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
380
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
381
+ }, {
382
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
383
+ size?: "medium" | "small" | "large" | undefined;
384
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
385
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
386
+ }>>;
387
+ allow_broll: z.ZodOptional<z.ZodBoolean>;
388
+ broll_model: z.ZodOptional<z.ZodEnum<["kling3", "hailuo2", "wan21"]>>;
389
+ broll_images: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
390
+ dub_language: z.ZodOptional<z.ZodString>;
391
+ webhook_url: z.ZodOptional<z.ZodString>;
392
+ scenes: z.ZodOptional<z.ZodArray<z.ZodObject<{
393
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
394
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
395
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
396
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
397
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
398
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
399
+ }, "strip", z.ZodTypeAny, {
400
+ persona_slug?: string | undefined;
401
+ face_photo_url?: string | undefined;
402
+ voice?: string | undefined;
403
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
404
+ style?: string | undefined;
405
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
406
+ cta?: string | undefined;
407
+ actor_slug?: string | undefined;
408
+ target_duration?: number | undefined;
409
+ allow_broll?: boolean | undefined;
410
+ broll_images?: string[] | undefined;
411
+ script?: string | undefined;
412
+ prompt?: string | undefined;
413
+ product_url?: string | undefined;
414
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
415
+ voice_speed?: number | undefined;
416
+ template?: string | undefined;
417
+ composition_mode?: "pip" | undefined;
418
+ pip_options?: {
419
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
420
+ size?: "medium" | "small" | "large" | undefined;
421
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
422
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
423
+ } | undefined;
424
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
425
+ dub_language?: string | undefined;
426
+ webhook_url?: string | undefined;
427
+ scenes?: z.objectOutputType<{
428
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
429
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
430
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
431
+ }, {
432
+ persona_slug?: string | undefined;
433
+ face_photo_url?: string | undefined;
434
+ voice?: string | undefined;
435
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
436
+ style?: string | undefined;
437
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
438
+ cta?: string | undefined;
439
+ actor_slug?: string | undefined;
440
+ target_duration?: number | undefined;
441
+ allow_broll?: boolean | undefined;
442
+ broll_images?: string[] | undefined;
443
+ script?: string | undefined;
444
+ prompt?: string | undefined;
445
+ product_url?: string | undefined;
446
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
447
+ voice_speed?: number | undefined;
448
+ template?: string | undefined;
449
+ composition_mode?: "pip" | undefined;
450
+ pip_options?: {
451
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
452
+ size?: "medium" | "small" | "large" | undefined;
453
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
454
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
455
+ } | undefined;
456
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
457
+ dub_language?: string | undefined;
458
+ webhook_url?: string | undefined;
459
+ scenes?: z.objectInputType<{
460
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
461
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
462
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
463
+ }>, {
464
+ persona_slug?: string | undefined;
465
+ face_photo_url?: string | undefined;
466
+ voice?: string | undefined;
467
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
468
+ style?: string | undefined;
469
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
470
+ cta?: string | undefined;
471
+ actor_slug?: string | undefined;
472
+ target_duration?: number | undefined;
473
+ allow_broll?: boolean | undefined;
474
+ broll_images?: string[] | undefined;
475
+ script?: string | undefined;
476
+ prompt?: string | undefined;
477
+ product_url?: string | undefined;
478
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
479
+ voice_speed?: number | undefined;
480
+ template?: string | undefined;
481
+ composition_mode?: "pip" | undefined;
482
+ pip_options?: {
483
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
484
+ size?: "medium" | "small" | "large" | undefined;
485
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
486
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
487
+ } | undefined;
488
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
489
+ dub_language?: string | undefined;
490
+ webhook_url?: string | undefined;
491
+ scenes?: z.objectOutputType<{
492
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
493
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
494
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
495
+ }, {
496
+ persona_slug?: string | undefined;
497
+ face_photo_url?: string | undefined;
498
+ voice?: string | undefined;
499
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
500
+ style?: string | undefined;
501
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
502
+ cta?: string | undefined;
503
+ actor_slug?: string | undefined;
504
+ target_duration?: number | undefined;
505
+ allow_broll?: boolean | undefined;
506
+ broll_images?: string[] | undefined;
507
+ script?: string | undefined;
508
+ prompt?: string | undefined;
509
+ product_url?: string | undefined;
510
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
511
+ voice_speed?: number | undefined;
512
+ template?: string | undefined;
513
+ composition_mode?: "pip" | undefined;
514
+ pip_options?: {
515
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
516
+ size?: "medium" | "small" | "large" | undefined;
517
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
518
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
519
+ } | undefined;
520
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
521
+ dub_language?: string | undefined;
522
+ webhook_url?: string | undefined;
523
+ scenes?: z.objectInputType<{
524
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
525
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
526
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
527
+ }>, {
528
+ persona_slug?: string | undefined;
529
+ face_photo_url?: string | undefined;
530
+ voice?: string | undefined;
531
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
532
+ style?: string | undefined;
533
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
534
+ cta?: string | undefined;
535
+ actor_slug?: string | undefined;
536
+ target_duration?: number | undefined;
537
+ allow_broll?: boolean | undefined;
538
+ broll_images?: string[] | undefined;
539
+ script?: string | undefined;
540
+ prompt?: string | undefined;
541
+ product_url?: string | undefined;
542
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
543
+ voice_speed?: number | undefined;
544
+ template?: string | undefined;
545
+ composition_mode?: "pip" | undefined;
546
+ pip_options?: {
547
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
548
+ size?: "medium" | "small" | "large" | undefined;
549
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
550
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
551
+ } | undefined;
552
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
553
+ dub_language?: string | undefined;
554
+ webhook_url?: string | undefined;
555
+ scenes?: z.objectOutputType<{
556
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
557
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
558
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
559
+ }, unknown>;
560
+ export type SaasReviewInput = z.infer<typeof SaasReviewSchema>;
561
+ /**
562
+ * @deprecated Use SaasReviewSchema. Kept for API/SDK compatibility.
563
+ */
564
+ export declare const ProductReviewSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
565
+ script: z.ZodOptional<z.ZodString>;
566
+ prompt: z.ZodOptional<z.ZodString>;
567
+ product_url: z.ZodOptional<z.ZodString>;
568
+ angle: z.ZodOptional<z.ZodEnum<["honest", "enthusiastic", "roast", "tutorial", "comparison"]>>;
357
569
  actor_slug: z.ZodOptional<z.ZodString>;
570
+ persona_slug: z.ZodOptional<z.ZodString>;
571
+ face_photo_url: z.ZodOptional<z.ZodString>;
572
+ voice: z.ZodOptional<z.ZodString>;
358
573
  target_duration: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
574
+ style: z.ZodOptional<z.ZodString>;
575
+ tone: z.ZodOptional<z.ZodEnum<["energetic", "calm", "confident", "dramatic"]>>;
576
+ voice_speed: z.ZodOptional<z.ZodNumber>;
577
+ music: z.ZodOptional<z.ZodEnum<["chill", "energetic", "corporate", "dramatic", "upbeat"]>>;
578
+ cta: z.ZodOptional<z.ZodString>;
579
+ aspect_ratio: z.ZodOptional<z.ZodEnum<["9:16", "16:9", "1:1"]>>;
580
+ template: z.ZodOptional<z.ZodString>;
581
+ composition_mode: z.ZodOptional<z.ZodLiteral<"pip">>;
582
+ pip_options: z.ZodOptional<z.ZodObject<{
583
+ position: z.ZodOptional<z.ZodEnum<["bottom-center", "bottom-left", "bottom-right"]>>;
584
+ size: z.ZodOptional<z.ZodEnum<["small", "medium", "large"]>>;
585
+ animation: z.ZodOptional<z.ZodEnum<["slide-up", "slide-left", "slide-right", "fade", "scale"]>>;
586
+ frame_style: z.ZodOptional<z.ZodEnum<["none", "rounded", "shadow"]>>;
587
+ }, "strict", z.ZodTypeAny, {
588
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
589
+ size?: "medium" | "small" | "large" | undefined;
590
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
591
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
592
+ }, {
593
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
594
+ size?: "medium" | "small" | "large" | undefined;
595
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
596
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
597
+ }>>;
598
+ allow_broll: z.ZodOptional<z.ZodBoolean>;
599
+ broll_model: z.ZodOptional<z.ZodEnum<["kling3", "hailuo2", "wan21"]>>;
600
+ broll_images: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
601
+ dub_language: z.ZodOptional<z.ZodString>;
602
+ webhook_url: z.ZodOptional<z.ZodString>;
603
+ scenes: z.ZodOptional<z.ZodArray<z.ZodObject<{
604
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
605
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
606
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
607
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
608
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
609
+ }, z.ZodTypeAny, "passthrough">>, "many">>;
359
610
  }, "strip", z.ZodTypeAny, {
360
- product_url: string;
611
+ persona_slug?: string | undefined;
612
+ face_photo_url?: string | undefined;
613
+ voice?: string | undefined;
614
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
615
+ style?: string | undefined;
616
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
617
+ cta?: string | undefined;
361
618
  actor_slug?: string | undefined;
362
619
  target_duration?: number | undefined;
620
+ allow_broll?: boolean | undefined;
621
+ broll_images?: string[] | undefined;
622
+ script?: string | undefined;
623
+ prompt?: string | undefined;
624
+ product_url?: string | undefined;
363
625
  tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
626
+ voice_speed?: number | undefined;
627
+ template?: string | undefined;
628
+ composition_mode?: "pip" | undefined;
629
+ pip_options?: {
630
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
631
+ size?: "medium" | "small" | "large" | undefined;
632
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
633
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
634
+ } | undefined;
635
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
636
+ dub_language?: string | undefined;
637
+ webhook_url?: string | undefined;
638
+ scenes?: z.objectOutputType<{
639
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
640
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
364
641
  angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
365
642
  }, {
366
- product_url: string;
643
+ persona_slug?: string | undefined;
644
+ face_photo_url?: string | undefined;
645
+ voice?: string | undefined;
646
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
647
+ style?: string | undefined;
648
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
649
+ cta?: string | undefined;
367
650
  actor_slug?: string | undefined;
368
651
  target_duration?: number | undefined;
652
+ allow_broll?: boolean | undefined;
653
+ broll_images?: string[] | undefined;
654
+ script?: string | undefined;
655
+ prompt?: string | undefined;
656
+ product_url?: string | undefined;
369
657
  tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
658
+ voice_speed?: number | undefined;
659
+ template?: string | undefined;
660
+ composition_mode?: "pip" | undefined;
661
+ pip_options?: {
662
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
663
+ size?: "medium" | "small" | "large" | undefined;
664
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
665
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
666
+ } | undefined;
667
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
668
+ dub_language?: string | undefined;
669
+ webhook_url?: string | undefined;
670
+ scenes?: z.objectInputType<{
671
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
672
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
370
673
  angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
371
- }>;
372
- export type ProductReviewInput = z.infer<typeof ProductReviewSchema>;
674
+ }>, {
675
+ persona_slug?: string | undefined;
676
+ face_photo_url?: string | undefined;
677
+ voice?: string | undefined;
678
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
679
+ style?: string | undefined;
680
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
681
+ cta?: string | undefined;
682
+ actor_slug?: string | undefined;
683
+ target_duration?: number | undefined;
684
+ allow_broll?: boolean | undefined;
685
+ broll_images?: string[] | undefined;
686
+ script?: string | undefined;
687
+ prompt?: string | undefined;
688
+ product_url?: string | undefined;
689
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
690
+ voice_speed?: number | undefined;
691
+ template?: string | undefined;
692
+ composition_mode?: "pip" | undefined;
693
+ pip_options?: {
694
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
695
+ size?: "medium" | "small" | "large" | undefined;
696
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
697
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
698
+ } | undefined;
699
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
700
+ dub_language?: string | undefined;
701
+ webhook_url?: string | undefined;
702
+ scenes?: z.objectOutputType<{
703
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
704
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
705
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
706
+ }, {
707
+ persona_slug?: string | undefined;
708
+ face_photo_url?: string | undefined;
709
+ voice?: string | undefined;
710
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
711
+ style?: string | undefined;
712
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
713
+ cta?: string | undefined;
714
+ actor_slug?: string | undefined;
715
+ target_duration?: number | undefined;
716
+ allow_broll?: boolean | undefined;
717
+ broll_images?: string[] | undefined;
718
+ script?: string | undefined;
719
+ prompt?: string | undefined;
720
+ product_url?: string | undefined;
721
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
722
+ voice_speed?: number | undefined;
723
+ template?: string | undefined;
724
+ composition_mode?: "pip" | undefined;
725
+ pip_options?: {
726
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
727
+ size?: "medium" | "small" | "large" | undefined;
728
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
729
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
730
+ } | undefined;
731
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
732
+ dub_language?: string | undefined;
733
+ webhook_url?: string | undefined;
734
+ scenes?: z.objectInputType<{
735
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
736
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
737
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
738
+ }>, {
739
+ persona_slug?: string | undefined;
740
+ face_photo_url?: string | undefined;
741
+ voice?: string | undefined;
742
+ aspect_ratio?: "9:16" | "16:9" | "1:1" | undefined;
743
+ style?: string | undefined;
744
+ music?: "energetic" | "dramatic" | "chill" | "corporate" | "upbeat" | undefined;
745
+ cta?: string | undefined;
746
+ actor_slug?: string | undefined;
747
+ target_duration?: number | undefined;
748
+ allow_broll?: boolean | undefined;
749
+ broll_images?: string[] | undefined;
750
+ script?: string | undefined;
751
+ prompt?: string | undefined;
752
+ product_url?: string | undefined;
753
+ tone?: "energetic" | "calm" | "confident" | "dramatic" | undefined;
754
+ voice_speed?: number | undefined;
755
+ template?: string | undefined;
756
+ composition_mode?: "pip" | undefined;
757
+ pip_options?: {
758
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
759
+ size?: "medium" | "small" | "large" | undefined;
760
+ animation?: "slide-up" | "slide-left" | "slide-right" | "fade" | "scale" | undefined;
761
+ frame_style?: "none" | "rounded" | "shadow" | undefined;
762
+ } | undefined;
763
+ broll_model?: "kling3" | "hailuo2" | "wan21" | undefined;
764
+ dub_language?: string | undefined;
765
+ webhook_url?: string | undefined;
766
+ scenes?: z.objectOutputType<{
767
+ type: z.ZodOptional<z.ZodEnum<["talking_head", "broll"]>>;
768
+ }, z.ZodTypeAny, "passthrough">[] | undefined;
769
+ angle?: "honest" | "enthusiastic" | "roast" | "tutorial" | "comparison" | undefined;
770
+ }, unknown>;
771
+ /**
772
+ * @deprecated Use SaasReviewInput. Kept for API/SDK compatibility.
773
+ */
774
+ export type ProductReviewInput = SaasReviewInput;
373
775
  export declare const SHOW_YOUR_APP_WORDS_PER_SECOND = 3;
374
776
  export declare const SHOW_YOUR_APP_DURATIONS: readonly [5, 10, 15];
375
777
  export declare const ShowYourAppSchema: z.ZodEffects<z.ZodObject<{
@@ -409,6 +811,55 @@ export declare const ShowYourAppSchema: z.ZodEffects<z.ZodObject<{
409
811
  subtitle_style?: "hormozi" | "none" | undefined;
410
812
  }>;
411
813
  export type ShowYourAppInput = z.infer<typeof ShowYourAppSchema>;
814
+ export declare const LAPTOP_UGC_WORDS_PER_SECOND = 3;
815
+ export declare const LAPTOP_UGC_DURATIONS: readonly [15, 20];
816
+ export declare const LAPTOP_UGC_MAX_RECORDING_BYTES: number;
817
+ export declare const LAPTOP_UGC_MAX_RECORDING_SECONDS = 10;
818
+ export declare const LAPTOP_UGC_RECORDING_MIME_TYPES: readonly ["video/mp4", "video/quicktime"];
819
+ export declare const LAPTOP_UGC_MAX_IMAGE_BYTES: number;
820
+ export declare const LAPTOP_UGC_IMAGE_MIME_TYPES: readonly ["image/png", "image/jpeg", "image/webp"];
821
+ export declare const LaptopUgcSchema: z.ZodEffects<z.ZodObject<{
822
+ app_screen_recording_url: z.ZodOptional<z.ZodString>;
823
+ app_screen_image_url: z.ZodOptional<z.ZodString>;
824
+ actor_slug: z.ZodOptional<z.ZodString>;
825
+ script: z.ZodString;
826
+ duration: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>>;
827
+ subtitle_style: z.ZodDefault<z.ZodOptional<z.ZodEnum<["hormozi", "none"]>>>;
828
+ webhook_url: z.ZodOptional<z.ZodString>;
829
+ }, "strip", z.ZodTypeAny, {
830
+ duration: number;
831
+ script: string;
832
+ subtitle_style: "hormozi" | "none";
833
+ actor_slug?: string | undefined;
834
+ webhook_url?: string | undefined;
835
+ app_screen_recording_url?: string | undefined;
836
+ app_screen_image_url?: string | undefined;
837
+ }, {
838
+ script: string;
839
+ duration?: number | undefined;
840
+ actor_slug?: string | undefined;
841
+ webhook_url?: string | undefined;
842
+ subtitle_style?: "hormozi" | "none" | undefined;
843
+ app_screen_recording_url?: string | undefined;
844
+ app_screen_image_url?: string | undefined;
845
+ }>, {
846
+ duration: number;
847
+ script: string;
848
+ subtitle_style: "hormozi" | "none";
849
+ actor_slug?: string | undefined;
850
+ webhook_url?: string | undefined;
851
+ app_screen_recording_url?: string | undefined;
852
+ app_screen_image_url?: string | undefined;
853
+ }, {
854
+ script: string;
855
+ duration?: number | undefined;
856
+ actor_slug?: string | undefined;
857
+ webhook_url?: string | undefined;
858
+ subtitle_style?: "hormozi" | "none" | undefined;
859
+ app_screen_recording_url?: string | undefined;
860
+ app_screen_image_url?: string | undefined;
861
+ }>;
862
+ export type LaptopUgcInput = z.infer<typeof LaptopUgcSchema>;
412
863
  export declare const PRODUCT_ACTING_WORDS_PER_SECOND = 3;
413
864
  export declare const PRODUCT_ACTING_DURATIONS: readonly [5, 10, 15];
414
865
  export declare const PRODUCT_ACTING_TEMPLATES: readonly ["product-in-hand", "mirror-selfie", "bathroom-reaction", "kitchen-counter", "car-selfie", "couch-review", "expert-interview", "product-closeup"];
@@ -1 +1 @@
1
- {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"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"}
package/dist/video.js CHANGED
@@ -166,13 +166,38 @@ export const SubtitleSchema = z.object({
166
166
  video_url: z.string().url(),
167
167
  style: z.enum(SUBTITLE_STYLES).optional(),
168
168
  });
169
- export const ProductReviewSchema = z.object({
170
- product_url: z.string().url(),
169
+ export const SaasReviewSchema = z.preprocess(flattenGroupedParams, z.object({
170
+ script: z.string().min(50).max(3000).optional(),
171
+ prompt: z.string().min(1).max(1000).optional(),
172
+ product_url: z.string().url().optional(),
171
173
  angle: z.enum(REVIEW_ANGLES).optional(),
172
- tone: z.enum(TONES).optional(),
173
174
  actor_slug: z.string().min(1).max(100).optional(),
175
+ persona_slug: z.string().min(1).max(100).optional(),
176
+ face_photo_url: z.string().url().optional(),
177
+ voice: z.string().max(100).optional(),
174
178
  target_duration: z.number().refine((v) => DURATIONS.includes(v), { message: 'target_duration must be 5, 10, or 15' }).optional(),
175
- });
179
+ style: z.string().max(50).optional(),
180
+ tone: z.enum(TONES).optional(),
181
+ voice_speed: z.number().min(0.7).max(1.5).optional(),
182
+ music: z.enum(MUSIC_GENRES).optional(),
183
+ cta: z.string().max(100).optional(),
184
+ aspect_ratio: z.enum(ASPECT_RATIOS).optional(),
185
+ template: z.string().max(50).optional(),
186
+ composition_mode: z.literal('pip').optional(),
187
+ pip_options: PipOptionsSchema.optional(),
188
+ allow_broll: z.boolean().optional(),
189
+ broll_model: z.enum(BROLL_MODELS).optional(),
190
+ broll_images: z.array(z.string().url()).max(10).optional(),
191
+ dub_language: z.string().max(10).optional(),
192
+ webhook_url: z.string().url().optional(),
193
+ scenes: z.array(z.object({
194
+ type: z.enum(SCENE_TYPES).optional(),
195
+ }).passthrough()).max(30).optional(),
196
+ }).refine((data) => data.script !== undefined || data.prompt !== undefined || data.product_url !== undefined, { message: 'script, prompt, or product_url is required' }));
197
+ /**
198
+ * @deprecated Use SaasReviewSchema. Kept for API/SDK compatibility.
199
+ */
200
+ export const ProductReviewSchema = SaasReviewSchema;
176
201
  export const SHOW_YOUR_APP_WORDS_PER_SECOND = 3;
177
202
  export const SHOW_YOUR_APP_DURATIONS = [5, 10, 15];
178
203
  export const ShowYourAppSchema = z.object({
@@ -194,6 +219,52 @@ export const ShowYourAppSchema = z.object({
194
219
  });
195
220
  }
196
221
  });
222
+ // ── Laptop UGC ──────────────────────────────────────────────────────────────
223
+ export const LAPTOP_UGC_WORDS_PER_SECOND = 3;
224
+ export const LAPTOP_UGC_DURATIONS = [15, 20];
225
+ export const LAPTOP_UGC_MAX_RECORDING_BYTES = 10 * 1024 * 1024; // 10 MB
226
+ export const LAPTOP_UGC_MAX_RECORDING_SECONDS = 10;
227
+ export const LAPTOP_UGC_RECORDING_MIME_TYPES = ['video/mp4', 'video/quicktime'];
228
+ export const LAPTOP_UGC_MAX_IMAGE_BYTES = 5 * 1024 * 1024; // 5 MB
229
+ export const LAPTOP_UGC_IMAGE_MIME_TYPES = ['image/png', 'image/jpeg', 'image/webp'];
230
+ export const LaptopUgcSchema = z.object({
231
+ app_screen_recording_url: z.string().url().optional().describe('Public URL of a screen recording of your app (mp4 or mov). Max 10 MB, max 10 seconds. Provide this OR app_screen_image_url, not both.'),
232
+ app_screen_image_url: z.string().url().optional().describe('Public URL of a static screenshot of your app (png, jpeg, or webp). Max 5 MB. Provide this OR app_screen_recording_url, not both.'),
233
+ actor_slug: z.string().min(1).max(100).optional().describe('Actor slug from GET /v1/actors. Random actor if omitted.'),
234
+ script: z.string().min(5).max(3000).describe('Full voiceover script. Auto-split at sentence boundary into two halves for the two face shots.'),
235
+ duration: z.number().refine((v) => LAPTOP_UGC_DURATIONS.includes(v), { message: 'duration must be 15 or 20' }).optional().default(20),
236
+ subtitle_style: z.enum(['hormozi', 'none']).optional().default('hormozi'),
237
+ webhook_url: z.string().url().optional(),
238
+ }).superRefine((val, ctx) => {
239
+ // Exactly one of recording / image must be provided
240
+ const hasRecording = !!val.app_screen_recording_url;
241
+ const hasImage = !!val.app_screen_image_url;
242
+ if (hasRecording && hasImage) {
243
+ ctx.addIssue({
244
+ code: z.ZodIssueCode.custom,
245
+ path: ['app_screen_recording_url'],
246
+ message: 'Provide app_screen_recording_url OR app_screen_image_url, not both',
247
+ });
248
+ }
249
+ if (!hasRecording && !hasImage) {
250
+ ctx.addIssue({
251
+ code: z.ZodIssueCode.custom,
252
+ path: ['app_screen_recording_url'],
253
+ message: 'Either app_screen_recording_url or app_screen_image_url is required',
254
+ });
255
+ }
256
+ // Word-count cap
257
+ const duration = val.duration ?? 20;
258
+ const maxWords = duration * LAPTOP_UGC_WORDS_PER_SECOND;
259
+ const wordCount = val.script.trim().split(/\s+/).filter(Boolean).length;
260
+ if (wordCount > maxWords) {
261
+ ctx.addIssue({
262
+ code: z.ZodIssueCode.custom,
263
+ path: ['script'],
264
+ message: `Script has ${wordCount} words; max ${maxWords} for ${duration}s at ${LAPTOP_UGC_WORDS_PER_SECOND} words/sec`,
265
+ });
266
+ }
267
+ });
197
268
  export const PRODUCT_ACTING_WORDS_PER_SECOND = 3;
198
269
  export const PRODUCT_ACTING_DURATIONS = [5, 10, 15];
199
270
  export const PRODUCT_ACTING_TEMPLATES = [