
    +j_[                       S SK r S SKJr  S SKJrJrJr  S SKJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%  S SK&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4  \ Rj                  " S5      r6 " S S\Rn                  5      r8 " S	 S
\Rn                  5      r9 " S S\Rn                  5      r: " S S\Rn                  5      r; " S S\Rn                  5      r< " S S\Rn                  5      r= " S S\Rn                  5      r> " S S\Rn                  5      r? " S S\Rn                  5      r@ " S S\Rn                  5      rA " S S\Rn                  5      rB " S S\Rn                  5      rC " S S \Rn                  5      rD " S! S"\Rn                  5      rE " S# S$\5      rFS%\F4S& jrGg)'    N)override)IOComfyExtensionInput)Image2ImageInputFieldImage2ImageParametersFieldImage2ImageTaskCreationRequestImage2VideoInputFieldImage2VideoParametersFieldImage2VideoTaskCreationRequestImageTaskStatusResponseReference2VideoInputFieldReference2VideoParametersField"Reference2VideoTaskCreationRequestTaskCreationResponseText2ImageInputFieldText2ImageTaskCreationRequestText2VideoInputFieldText2VideoParametersFieldText2VideoTaskCreationRequestTxt2ImageParametersFieldVideoTaskStatusResponseWan27ImageToVideoInputField Wan27ImageToVideoParametersField$Wan27ImageToVideoTaskCreationRequestWan27MediaItemWan27ReferenceVideoInputField"Wan27ReferenceVideoParametersField&Wan27ReferenceVideoTaskCreationRequestWan27Text2VideoParametersField"Wan27Text2VideoTaskCreationRequestWan27VideoEditInputFieldWan27VideoEditParametersField!Wan27VideoEditTaskCreationRequest)ApiEndpointaudio_to_base64_stringdownload_url_to_image_tensordownload_url_to_video_outputget_number_of_imagespoll_opsync_optensor_to_base64_stringupload_audio_to_comfyapiupload_image_to_comfyapiupload_video_to_comfyapivalidate_audio_durationvalidate_stringvalidate_video_durationu   \((\d+)\s*[x×]\s*(\d+)\)c                   h    \ rS rSr\S 5       r\      SS\S\S\S\S\S\S	\S
\4S jj5       r	Sr
g)WanTextToImageApi:   c                 f   [         R                  " SSSS[         R                  R                  SS/SS9[         R                  R                  S	S
SSS9[         R                  R                  SS
SSS
S9[         R
                  R                  SSSSSS
S9[         R
                  R                  SSSSSS
S9[         R
                  R                  SSSSS[         R                  R                  S
SS
S9	[         R                  R                  SS
SS
S
S 9[         R                  R                  S!S"S#S
S
S 9/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                  /S
[         R                  " S$S%9S&9	$ )'Nr4   zWan Text to Imagepartner/image/Wanz*Generates an image based on a text prompt.modelzwan2.5-t2i-previewModel to use.optionstooltippromptT QPrompt describing the elements and visual features. Supports English and Chinese.	multilinedefaultr<   negative_prompt)Negative prompt describing what to avoid.rA   rB   r<   optionalwidth   i   i      )rB   minmaxsteprF   heightseedr      Seed to use for generation.rB   rJ   rK   rL   display_modecontrol_after_generater<   rF   prompt_extend1Whether to enhance the prompt with AI assistance.rB   r<   rF   advanced	watermarkF7Whether to add an AI-generated watermark to the result.{"type":"usd","usd":0.03}expr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaCombor   StringIntNumberDisplaynumberBooleanImageOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgeclss    9/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_wan.pydefine_schemaWanTextToImageApi.define_schema;   s   yy',(D12+  
 		"o	    		%"G!     !    !   "!#!1!1!8!8+/9!  
 

  # O!! !  

  !U!! ! k<| ! 		..		++		##
 4WN
 N	
    r8   r=   rC   rG   rM   rN   rU   rY   c	                   #    [        U [        SSS9[        [        U[	        X#S9[        U SU 3UUUS9S9S9I S h  vN n	U	R                  (       d%  [        S	U	R                   S
U	R                   35      e[        U [        SU	R                  R                   3S9[        S SSS9I S h  vN n
[        R                  " [        [!        U
R                  R"                  S   R$                  5      5      I S h  vN 5      $  N NW N7f)Nz:/proxy/wan/api/v1/services/aigc/text2image/image-synthesisPOSTpathmethodr=   rC   *)sizerN   rU   rY   r8   input
parametersresponse_modeldataAn unknown error occurred:  - /proxy/wan/api/v1/tasks/r   c                 .    U R                   R                  $ Noutputtask_statusxs    rx   <lambda>+WanTextToImageApi.execute.<locals>.<lambda>       qxx';';r{   	      r   status_extractorestimated_durationpoll_intervalr   )r+   r%   r   r   r   r   r   	Exceptioncodemessager*   task_idr   r   
NodeOutputr'   strresultsurl)rw   r8   r=   rC   rG   rM   rN   rU   rY   initial_responseresponses              rx   executeWanTextToImageApi.execute   s     ")Ybhi/.*&Z3!7!F8,"/'			"
 
  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2; 
 
 }}#?HOOD[D[\]D^DbDb@c#ddee3
"
 es5   ;DDA.D,D-AD9D:	DDD N)r>   rH   rH   r   TF)__name__
__module____qualname____firstlineno__classmethodry   r   intboolr   __static_attributes__r   r{   rx   r4   r4   :   s    O
 O
b 
  ""$f$f $f 	$f
 $f $f $f $f $f $fr{   r4   c                   n    \ rS rSr\S 5       r\   SS\S\R                  S\S\S\	S\
4S	 jj5       rS
rg)WanImageToImageApi   c                    [         R                  " SSSS[         R                  R                  SS/SSS9[         R                  R                  S	S
S9[         R
                  R                  SSSSS9[         R
                  R                  SSSSSS9[         R                  R                  SSSSS[         R                  R                  SSSS9	[         R                  R                  SSSSSS9/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " SS9S 9	$ )!Nr   zWan Image to Imager7   zGenerates an image from one or two input images and a text prompt. The output image is currently fixed at 1.6 MP, and its aspect ratio matches the input image(s).r8   zwan2.5-i2i-previewr9   r;   rB   r<   imagez=Single-image editing or multi-image fusion. Maximum 2 images.r<   r=   Tr>   r?   r@   rC   rD   rE   rN   r   rO   rP   rQ   rR   rY   FrZ   rW   r[   r\   r^   )r   rh   ri   r   ro   rj   rk   rl   rm   rn   rp   rq   rr   rs   rt   ru   rv   s    rx   ry    WanImageToImageApi.define_schema   su   yy(-(n 120+	   [   		"o	    		%"G!   0 "!#!1!1!8!8+/9!  
 

  !U!! ! i;z ! 		..		++		##
 4WN
 N	
r{   r8   r   r=   rC   rN   rY   c                   #    [        U5      nUS;  a  [        SU S35      e/ nU H  n	UR                  S[        U	SS9-   5        M!     [	        U [        SSS	9[        [        U[        X4US
9[        UUS9S9S9I S h  vN n
U
R                  (       d%  [        SU
R                   SU
R                   35      e[        U [        SU
R                  R                   3S9[         S SSS9I S h  vN n["        R$                  " ['        [)        UR                  R*                  S   R,                  5      5      I S h  vN 5      $  N NW N7f)N)rP      z&Expected 1 or 2 input images, but got .data:image/png;base64,i   total_pixelsz;/proxy/wan/api/v1/services/aigc/image2image/image-synthesisr}   r~   )r=   rC   images)rN   rY   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   ,WanImageToImageApi.execute.<locals>.<lambda>.  r   r{   *      r   r   )r)   
ValueErrorappendr,   r+   r%   r   r	   r   r   r   r   r   r   r*   r   r   r   r   r'   r   r   r   )rw   r8   r   r=   rC   rN   rY   n_imagesr   ir   r   s               rx   r   WanImageToImageApi.execute  sT     (.6!EhZqQRRAMM25LQ]h5iij !(Zcij//+6cij5'	"
 
  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;!
 
 }}#?HOOD[D[\]D^DbDb@c#ddee1
 
 es8   A<E	>E?A.E	-E.AE	:E;	E	E	E	r   N)r>   r   F)r   r   r   r   r   ry   r   r   ro   r   r   r   r   r   r{   rx   r   r      s~    O
 O
b   " )f)f {{)f 	)f
 )f )f )f )fr{   r   c                       \ rS rSr\S 5       r\         SS\S\S\S\S\S	\R                  S-  S
\S\
S\
S\
S\4S jj5       rSrg)WanTextToVideoApii5  c                    [         R                  " SSSS[         R                  R                  SSS/SSS	9[         R                  R                  S
SSSS9[         R                  R                  SSSSSS9[         R                  R                  S/ SQSSS9[         R
                  R                  SSSSS[         R                  R                  SSS9[         R                  R                  SSSS9[         R
                  R                  SSSS S![         R                  R                  SS"SS#9	[         R                  R                  S$S%SS&SS'9[         R                  R                  S(SS)SSS*9[         R                  R                  S+S%S,SSS*9[         R                  R                  S-S.S//S0SSS19/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                   " [         R"                  " SS/S29S3S49S59	$ )6Nr   zWan Text to Videopartner/video/Wanz)Generates a video based on a text prompt.r8   wan2.5-t2v-preview
wan2.6-t2vr9   r   r=   Tr>   r?   r@   rC   rD   rE   r   )z480p: 1:1 (624x624)z480p: 16:9 (832x480)z480p: 9:16 (480x832)720p: 1:1 (960x960)720p: 16:9 (1280x720)720p: 9:16 (720x1280)720p: 4:3 (1088x832)720p: 3:4 (832x1088)1080p: 1:1 (1440x1440)1080p: 16:9 (1920x1080)1080p: 9:16 (1080x1920)1080p: 4:3 (1632x1248)1080p: 3:4 (1248x1632)r   r;   rB   rF   duration      z=A 15-second duration is available only for the Wan 2.6 model.rB   rJ   rK   rL   rS   r<   rF   audioUAudio must contain a clear, loud voice, without extraneous noise or background music.rF   r<   rN   r   rO   rP   rQ   rR   generate_audioF<If no audio input is provided, generate audio automatically.rB   rF   r<   rX   rU   rV   rW   rY   rZ   	shot_typesinglemultiSpecifies the shot type for the generated video, that is, whether the video is a single continuous shot or multiple shots with cuts. This parameter takes effect only when prompt_extend is True.r;   r<   rF   rX   widgetsaJ  
                (
                  $ppsTable := { "480p": 0.05, "720p": 0.1, "1080p": 0.15 };
                  $resKey := $substringBefore(widgets.size, ":");
                  $pps := $lookup($ppsTable, $resKey);
                  { "type": "usd", "usd": $round($pps * widgets.duration, 2) }
                )
                
depends_onr]   r^   )r   rh   ri   r   rj   rk   rl   rm   Audiorn   Videorp   rq   rr   rs   rt   ru   PriceBadgeDependsrv   s    rx   ry   WanTextToVideoApi.define_schema6  sm   yy',(C1<@(+	   		"o	    		%"G!     2!%  ( !#!1!1!8!8[!  	 !s  
 "!#!1!1!8!8+/9!  
 

  $!!Z! !  

  # O!! !  

  !U!! !  %w/S "!  o`D ! 		..		++		##
 //V8LM
_z
 z	
r{   Nr8   r=   rC   r   r   r   rN   r   rU   rY   r   c                   #    SU;   a  US:X  a  [        S5      eUS:X  a  US:X  a  [        S5      e[        R                  U5      R                  5       u  pS nUb  [	        USS5        S	[        US
S5      -   n[        U [        SSS9[        [        U[        X#US9[        U SU 3UUUU	U
US9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[!        U [        SUR                  R"                   3S9[$        S S['        US-  5      -  SS9I S h  vN n[(        R*                  " [-        UR                  R.                  5      I S h  vN 5      $  N NA N7f)N480pr   z(The Wan 2.6 model does not support 480p.r   r   <A 15-second duration is supported only by the Wan 2.6 model.      @      =@data:audio/mp3;base64,mp3
libmp3lame@/proxy/wan/api/v1/services/aigc/video-generation/video-synthesisr}   r~   r=   rC   	audio_urlr   )r   r   rN   r   rU   rY   r   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   +WanTextToVideoApi.execute.<locals>.<lambda>  r   r{   x   r      r   )r   RES_IN_PARENSsearchgroupsr0   r&   r+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r   r(   	video_url)rw   r8   r=   rC   r   r   r   rN   r   rU   rY   r   rG   rM   r   r   r   s                    rx   r   WanTextToVideoApi.execute  s     T>e|3GHHr>e';;[\\%,,T299;	#E3503I%QVXd3eeI!(_hno/.*&eno4!7!F8,%("/''	"
 
$  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;"SA%66
 
 }}#?@Y@Y#ZZ[[9
(
 [s7   B4E:6E47A=E:4E656E:+E8,	E:6E:8E:r   )	r>   r   r   Nr   FTFr   )r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r{   rx   r   r   5  s    {
 {
z 
  ")$($"!4\4\ 4\ 	4\
 4\ 4\ {{T!4\ 4\ 4\ 4\ 4\ 4\ 4\r{   r   c                       \ rS rSr\S 5       r\         SS\S\R                  S\S\S\S	\	S
\R                  S-  S\	S\S\S\S\4S jj5       rSrg)WanImageToVideoApii  c                    [         R                  " SSSS[         R                  R                  SSS/SSS	9[         R                  R                  S
5      [         R
                  R                  SSSSS9[         R
                  R                  SSSSSS9[         R                  R                  S/ SQSSS9[         R                  R                  SSSSS[         R                  R                  SSS9[         R                  R                  SSSS9[         R                  R                  SS S S!S"[         R                  R                  SS#SS$9	[         R                  R                  S%S&SS'SS(9[         R                  R                  S)SS*SSS+9[         R                  R                  S,S&S-SSS+9[         R                  R                  S.S/S0/S1SSS29/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                   /S[         R"                  " [         R$                  " SS/S39S4S59S69	$ )7Nr  zWan Image to Videor   z9Generates a video from the first frame and a text prompt.r8   wan2.5-i2v-preview
wan2.6-i2vr9   r   r   r=   Tr>   r?   r@   rC   rD   rE   
resolution)480P720P1080Pr  r   r   r   r   z,Duration 15 available only for WAN2.6 model.r   r   r   r   rN   r   rO   rP   rQ   rR   r   Fr   r   rU   rV   rW   rY   rZ   r   r   r   r   r   r   a  
                (
                  $ppsTable := { "480p": 0.05, "720p": 0.1, "1080p": 0.15 };
                  $pps := $lookup($ppsTable, widgets.resolution);
                  { "type": "usd", "usd": $round($pps * widgets.duration, 2) }
                )
                r   r^   )r   rh   ri   r   ro   rj   rk   rl   rm   r   rn   r   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry    WanImageToVideoApi.define_schema  s   yy(-(S1<@(+	    		"o	    		%"G!     
 #!  	 !#!1!1!8!8J!  	 !s  
 "!#!1!1!8!8+/9!  
 

  $!!Z! !  

  # O!! !  

  !U!! !  %w/S "!  aYv ! 		..		++		##
 //\8RS	Qr
 r	
r{   Nr8   r   r=   rC   r  r   r   rN   r   rU   rY   r   c                   #    [        U5      S:w  a  [        S5      eSU;   a  US:X  a  [        S5      eUS:X  a  US:X  a  [        S5      eS	[        US
S9-   nS nUb  [        USS5        S[	        USS5      -   n[        U [        SSS9[        [        U[        X4XS9[        UUUU	U
UUS9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[        U [        SUR                  R                    3S9["        S S[%        US-  5      -  SS 9I S h  vN n[&        R(                  " [+        UR                  R,                  5      I S h  vN 5      $  N NA N7f)!NrP   z$Exactly one input image is required.r  r  z(The Wan 2.6 model does not support 480P.r   r
  r   r   i 	= r   r   r   r   r   r   r   r}   r~   )r=   rC   img_urlr   )r  r   rN   r   rU   rY   r   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   ,WanImageToVideoApi.execute.<locals>.<lambda>  r   r{   r   r   r  r   )r)   r   r,   r0   r&   r+   r%   r   r   r
   r   r   r   r   r   r*   r   r   r   r   r   r(   r  )rw   r8   r   r=   rC   r  r   r   rN   r   rU   rY   r   	image_urlr   r   r   s                    rx   r   WanImageToVideoApi.executec  s       &!+CDDZE\$9GHHr>e';;[\\,/Fu[f/gg		#E3503I%QVXd3eeI!(_hno//+!I 6)%("/''	"
 
(  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;"SA%66
 
 }}#?@Y@Y#ZZ[[=
,
 [s7   B1E73E14A=E71E326E7(E5)	E73E75E7r   )	r>   r  r   Nr   FTFr   )r   r   r   r   r   ry   r   r   ro   r   r   r   r   r   r   r{   rx   r  r    s    s
 s
j   " $($"!8\8\ {{8\ 	8\
 8\ 8\ 8\ {{T!8\ 8\ 8\ 8\ 8\ 8\ 8\r{   r  c                       \ rS rSr\S 5       r\S\S\S\S\R                  R                  S\S\
S	\
S
\S\4S j5       rSrg)WanReferenceVideoApii  c                 f   [         R                  " SSSS[         R                  R                  SS/S9[         R                  R                  SS	S
SS9[         R                  R                  SS	S
SS9[         R
                  R                  S[         R
                  R                  [         R                  R                  S5      / SQSS9S9[         R                  R                  S/ SQS9[         R                  R                  SSSSS[         R                  R                  S9[         R                  R                  SSSSS[         R                  R                  S	S9[         R                  R                  SS S!/S"S	S#9[         R                  R                  S$S%S&S	S'9/	[         R                  R                  5       /[         R                  R                  [         R                  R                   [         R                  R"                  /S	[         R$                  " [         R&                  " SS/S(9S)S*9S+9	$ ),Nr  zWan Reference to Videor   zUse the character and voice from input videos, combined with a prompt, to generate a new video that maintains character consistency.r8   z
wan2.6-r2vr;   r=   Tr>   zPrompt describing the elements and visual features. Supports English and Chinese. Use identifiers such as `character1` and `character2` to refer to the reference characters.r@   rC   rD   reference_videosreference_video)
character1
character2
character3rP   namesrJ   templater   )
r   r   r   r   r   r   r   r   r   r   r   r   
   rB   rJ   rK   rL   rS   rN   r   rO   )rB   rJ   rK   rL   rS   rT   r   r   r   zSpecifies the shot type for the generated video, that is, whether the video is a single continuous shot or multiple shots with cuts.)r;   r<   rX   rY   FrZ   rB   r<   rX   r   a  
                (
                  $rate := $contains(widgets.size, "1080p") ? 0.15 : 0.10;
                  $inputMin := 2 * $rate;
                  $inputMax := 5 * $rate;
                  $outputPrice := widgets.duration * $rate;
                  {
                    "type": "range_usd",
                    "min_usd": $inputMin + $outputPrice,
                    "max_usd": $inputMax + $outputPrice
                  }
                )
                r   r^   )r   rh   ri   r   rj   AutogrowTemplateNamesr   rk   rl   sliderrm   rn   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   "WanReferenceVideoApi.define_schema  s   yy*1(L w?		"r	    		%"G	    !!&[[66'89H 7  "     !#!1!1!8!8   "!#!1!1!8!8+/   %w/J!   

  !U!	 ! }DL ! 		..		++		##
 //8LMid
 d	
r{   r8   r=   rC   r  r   r   rN   r   rY   c
                   #    / n
U H  n[        XK   SSS9  M     U H(  nU
R                  [        XU   5      I S h  vN 5        M*     [        R	                  U5      R                  5       u  p[        U [        SSS9[        [        U[        X#U
S9[        U SU 3UUU	US	9S
9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[!        U [        SUR                  R"                   3S9[$        S SS9I S h  vN n[&        R(                  " [+        UR                  R,                  5      I S h  vN 5      $  GN N ND N7f)Nr      min_durationmax_durationr   r}   r~   )r=   rC   reference_video_urlsr   )r   r   r   rY   rN   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   .WanReferenceVideoApi.execute.<locals>.<lambda>3  r   r{   r  r   r   r   )r2   r   r/   r  r  r  r+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r(   r  )rw   r8   r=   rC   r  r   r   rN   r   rY   r0  r   rG   rM   r   r   s                   rx   r   WanReferenceVideoApi.execute  sq      "!A#$4$7aVXY "!A ''.Fs]^L_.`(`a "%,,T299;!(_hno/3/!Ym :!7!F8,%''	"
 
$  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[; )a
(
 [sG   :E!E
A-E!*E+A-E!E6E!E	E!E!E!E!r   N)r   r   r   r   r   ry   r   r   r'  Typer   r   r   r   r   r{   rx   r  r    s    e
 e
N -\-\ -\ 	-\
 ++**-\ -\ -\ -\ -\ -\ -\r{   r  c                   l    \ rS rSr\S 5       r\ SS\S\S\S\S\	R                  S-  4
S	 jj5       rS
rg)Wan2TextToVideoApii9  c                 h   [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R
                  R                  SSS	SS9[         R                  R                  SSS/S9[         R                  R                  S/ SQS9[         R                  R                  SSSSS[         R                  R                  S9/5      /S9[         R                  R                  SSSS9[         R                  R                  SSSSS[         R                  R                  SS S!9[         R                  R                  S"SS#SS$9[         R                  R                  S%S&S'SS$9/[         R                  R                  5       /[         R                  R                  [         R                  R                   [         R                  R"                  /S[         R$                  " [         R&                  " / S(QS)9S*S+9S,9	$ )-Nr7  zWan 2.7 Text to Videor   zAGenerates a video based on a text prompt using the Wan 2.7 model.r8   z
wan2.7-t2vr=   Tr>   r?   r@   rC   rD   r  r  r  r  ratioz16:9z9:16z1:1z4:3z3:4r   r   r   r   rP   r%  r   zAudio for driving video generation (e.g., lip sync, beat-matched motion). Duration: 3s-30s. If not provided, the model automatically generates matching background music or sound effects.r   rN   r   rO   rQ   rB   rJ   rK   rL   rS   rT   r<   rU   rV   r&  rY   FrZ   r8   model.resolutionzmodel.durationr   ^  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $dur := $lookup(widgets, "model.duration");
                  $ppsTable := { "720p": 0.1, "1080p": 0.15 };
                  $pps := $lookup($ppsTable, $res);
                  { "type": "usd", "usd": $pps * $dur }
                )
                r   r^   )r   rh   DynamicCombor   Optionrj   ri   rk   rl   rm   r   rn   r   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry    Wan2TextToVideoApi.define_schema:  s.   yy(0([%%..( "		$,.2,.-D	 !0 !" !#		$5.2,.,W	 !0 !" !#$0-3W,= !/ !" !#$+,Q !/ !" !#$.,-()(*)*131A1A1H1H !- !"-!# & &N !9   "!#!1!1!8!8+/9  	 

  # O!	 !  

  !U!	 ! EN ! 		..		++		##
 //8ghi`
 `	
r{   Nr8   rN   rU   rY   r   c                   #    [        US   SSS9  S nUb!  [        USS5        [        XSSS	S
9I S h  vN n[        U [	        SSS9[
        [        US   [        US   US   =(       d    S US9[        US   US   US   UUUS9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[        U [	        SUR                  R                   3S9[        S SS9I S h  vN n[         R"                  " [%        UR                  R&                  5      I S h  vN 5      $  GN N ND N7f)Nr=   FrP   strip_whitespace
min_lengthg      ?g      N@r   r   
audio/mpegcontainer_format
codec_name	mime_typer   r}   r~   r8   rC   r   r  r9  r   )r  r9  r   rN   rU   rY   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   ,Wan2TextToVideoApi.execute.<locals>.<lambda>  r   r{      r3  )r1   r0   r-   r+   r%   r   r!   r   r    r   r   r   r   r*   r   r   r   r   r(   r  )	rw   r8   rN   rU   rY   r   r   r   r   s	            rx   r   Wan2TextToVideoApi.execute  sp     	h%AN	#E356U|Wc I ")W 03Gn* ?$)*;$<$D'
 :$\2.":."/'"
 
0  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[I
4
 [sG   0ED9AED<A-E9D>:6E0E 1	E<E>E Er   r   )r   r   r   r   r   ry   dictr   r   r   r   r   r   r   r{   rx   r7  r7  9  sp    a
 a
F  %)0\0\ 0\ 	0\
 0\ {{T!0\ 0\r{   r7  c                       \ rS rSr\S 5       r\  SS\S\R                  S\	S\
S\
S	\R                  S-  S
\R                  S-  4S jj5       rSrg)Wan2ImageToVideoApii  c                    [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R
                  R                  SSS	SS9[         R                  R                  SSS/S9[         R                  R                  SSSSS[         R                  R                  S9/5      /S9[         R                  R                  SSS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  S S!S!S"S[         R                  R                  SS#S$9[         R                  R                  S%SS&SS'9[         R                  R                  S(S)S*SS'9/[         R                  R                  5       /[         R                  R                   [         R                  R"                  [         R                  R$                  /S[         R&                  " [         R(                  " / S+QS,9S-S.9S/9	$ )0NrQ  zWan 2.7 Image to Videor   zTGenerate a video from a first-frame image, with optional last-frame image and audio.r8   
wan2.7-i2vr=   Tr>   r?   r@   rC   rD   r  r  r  r  r   r   r   r   rP   r%  first_frameFFirst frame image. The output aspect ratio is derived from this image.r   
last_framezULast frame image. The model generates a video transitioning from first to last frame.r   r   zAudio for driving video generation (e.g., lip sync, beat-matched motion). Duration: 2s-30s. If not provided, the model automatically generates matching background music or sound effects.rN   r   rO   rQ   r;  rU   rV   r&  rY   FrZ   r<  r   r>  r   r^   )r   rh   r?  r   r@  rj   ri   rk   rl   rm   ro   r   rn   r   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   !Wan2ImageToVideoApi.define_schema  sN   yy)1(n%%..( "		$,.2,.-D	 !0 !" !#		$5.2,.,W	 !0 !" !#$0-3W,= !/ !" !#$.,-()(*)*131A1A1H1H !- !"% & "F !d    !s  
 !9   "!#!1!1!8!8+/9  	 

  # O!	 !  

  !U!	 ! IJX ! 		..		++		##
 //8ghse
 e	
r{   Nr8   rT  rN   rU   rY   rV  r   c                 :  #    [        S[        XS9I S h  vN S9/nUb(  UR                  [        S[        XS9I S h  vN S95        Ub:  [        USS5        [	        XSSS	S
9I S h  vN n	UR                  [        SU	S95        [        U [        SSS9[        [        US   [        US   =(       d    S US   =(       d    S US9[        US   US   UUUS9S9S9I S h  vN n
U
R                  (       d%  [        SU
R                   SU
R                   35      e[        U [        SU
R                  R                    3S9["        S SS9I S h  vN n[$        R&                  " [)        UR                  R*                  5      I S h  vN 5      $  GNw GNR GN+ N NJ N7f)NrT  r   typer   rV  g       @g      >@r   r   rF  rG  driving_audior   r}   r~   r8   r=   rC   r=   rC   mediar  r   r  r   rN   rU   rY   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   -Wan2ImageToVideoApi.execute.<locals>.<lambda>w  r   r{   rM  r3  )r   r.   r   r0   r-   r+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r(   r  )rw   r8   rT  rN   rU   rY   rV  r   r^  r   r   r   s               rx   r   Wan2ImageToVideoApi.execute<  s     "23JJ
 !LL%6sMM #E356U|Wc I LL_)LM!(W 05Gn1 ?2d$)*;$<$D
 <$\2":."/'"
 
.  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[a K N

2
 [si   FF
'FF)F'F(A6FFA-FF6FF	FFFFFFr   )NN)r   r   r   r   r   ry   rO  r   ro   r   r   r   r   r   r   r{   rx   rQ  rQ    s    f
 f
P  *.$(=\=\ [[=\ 	=\
 =\ =\ KK$&=\ {{T!=\ =\r{   rQ  c                       \ rS rSr\S 5       r\      SS\S\R                  S\	S\	S\R                  S-  S	\S
\S\4S jj5       rSrg)Wan2VideoContinuationApii}  c                 f   [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R
                  R                  SSS	SS9[         R                  R                  SSS/S9[         R                  R                  SSSSS[         R                  R                  SS9/5      /S9[         R                  R                  SSS9[         R                  R                  SSSS9[         R                  R                  SS S S!S[         R                  R                  SS"S#9[         R                  R                  S$SS%SS&9[         R                  R                  S'S(S)SS&9/[         R                  R                  5       /[         R                  R                  [         R                  R                   [         R                  R"                  /S[         R$                  " [         R&                  " / S*QS+9S,S-9S.9	$ )/Nrd  zWan 2.7 Video Continuationr   zJContinue a video from where it left off, with optional last-frame control.r8   rS  r=   Tr>   r?   r@   rC   rD   r  r  r  r  r   r   r   r   rP   zsTotal output duration in seconds. The model generates continuation to fill the remaining time after the input clip.)rB   rJ   rK   rL   rS   r<   
first_clipzcInput video to continue from. Duration: 2s-10s. The output aspect ratio is derived from this video.r   rV  zFLast frame image. The continuation will transition towards this frame.r   rN   r   rO   rQ   r;  rU   rV   r&  rY   FrZ   r<  r   a  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $dur := $lookup(widgets, "model.duration");
                  $ppsTable := { "720p": 0.1, "1080p": 0.15 };
                  $pps := $lookup($ppsTable, $res);
                  $outputPrice := $pps * $dur;
                  {
                    "type": "range_usd",
                    "min_usd": 2 * $pps + $outputPrice,
                    "max_usd": 5 * $pps + $outputPrice
                  }
                )
                r   r^   )r   rh   r?  r   r@  rj   ri   rk   rl   rm   r   ro   rn   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   &Wan2VideoContinuationApi.define_schema~  s2   yy.5(d%%..( "		$,.2,.,	 !0 !" !#		$5.2,.,W	 !0 !" !#$0-3W,= !/ !" !#$.,-()(*)*131A1A1H1H-W !- 	!"#  & #H  J  
  !d  
 "!#!1!1!8!8+/9  	 

  # O!	 !  

  !U!	 ! EN ! 		..		++		##
 //8ghie
 e	
r{   Nr8   rf  r=   rC   rV  rN   rU   rY   c	                   #    [        USSS9  [        S[        X5      I S h  vN S9/n	Ub(  U	R                  [        S[	        XS9I S h  vN S95        [        U [        SS	S
9[        [        US   [        US   =(       d    S US   =(       d    S U	S9[        US   US   UUUS9S9S9I S h  vN n
U
R                  (       d%  [        SU
R                   SU
R                   35      e[        U [        SU
R                  R                    3S9["        S SS9I S h  vN n[$        R&                  " [)        UR                  R*                  5      I S h  vN 5      $  GN: GN N NG N7f)Nr   r$  r-  rf  rZ  rV  rY  r   r}   r~   r8   r=   rC   r]  r  r   r_  r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   2Wan2VideoContinuationApi.execute.<locals>.<lambda>  r   r{   rM  r3  )r2   r   r/   r   r.   r+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r(   r  )rw   r8   rf  r=   rC   rV  rN   rU   rY   r^  r   r   s               rx   r    Wan2VideoContinuationApi.execute  s     	 
L!23CC
 !LL%6sMM ")W 05Gn1 ?2d$)*;$<$D
 <$\2":."/'"
 
.  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[U D N
2
 [sY    E(E
'E(
EA#E(.E"/A-E(E$6E(E&	E(E("E($E(&E(r   )r>   r>   Nr   TF)r   r   r   r   r   ry   rO  r   r   r   ro   r   r   r   r   r   r{   rx   rd  rd  }  s    f
 f
P 
 !)-"9\9\ KK9\ 	9\
 9\ KK$&9\ 9\ 9\ 9\ 9\r{   rd  c                   `    \ rS rSr\S 5       r\S\S\R                  S\	S\
S\4
S j5       rS	rg
)Wan2VideoEditApii$  c                    [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R                  R                  SSS/S9[         R                  R                  S/ SQSS9[         R                  R                  S/ SQSSS9[         R                  R                  S[         R                  R                  [         R                  R                  S5      / SQSS9S9/5      /S9[         R                  R                  SS S!9[         R                  R                  S"SSS#S$[         R                  R                  SS%S&9[         R                  R                  S'SS(/SS)SS*9[         R                  R                  S+S,S-SS.9/[         R                  R                  5       /[         R                   R"                  [         R                   R$                  [         R                   R&                  /S[         R(                  " [         R*                  " / S/QS09S1S29S39	$ )4Nrm  zWan 2.7 Video Editr   zJEdit a video using text instructions, reference images, or style transfer.r8   zwan2.7-videoeditr=   Tr>   4Editing instructions or style transfer requirements.r@   r  r  r  r  r9  r:  AAspect ratio. If not changed, approximates the input video ratio.r:   r   )
auto2345678910rq  z|Output duration in seconds. 'auto' matches the input video duration. A specific value truncates from the start of the video.r   reference_imagesreference_image)image1image2image3image4r   r   r"  videoThe video to edit.r   rN   rO   rP   rQ   r;  audio_settingoriginz'auto': model decides whether to regenerate audio based on the prompt. 'origin': preserve the original audio from the input video.)r;   rB   r<   rX   rY   FrZ   r&  r<  r   a  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $dur := $lookup(widgets, "model.duration");
                  $ppsTable := { "720p": 0.1, "1080p": 0.15 };
                  $pps := $lookup($ppsTable, $res);
                  { "type": "usd", "usd": $pps, "format": { "suffix": "/second", "note": "(input + output)" } }
                )
                r   r^   r   rh   r?  r   r@  rj   ri   r'  r(  ro   r   rk   rl   rm   rn   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   Wan2VideoEditApi.define_schema%  sO   yy&-(d%%... "		$,.2,.,b	 !0 !" !#$0-3W,= !/ !" !#$+,Q,o !/ !"
 !#$.,b,2-^	 !/ !" !# 1 1$6-/[[-F-F(*7H(I/* -. .G 	.& !2 !"/$') & ,Z 0   "!#!1!1!8!8+/9  	 ##X."R!   

  !U!	 ! IJX ! 		..		++		##
 //8ghse
 e	
r{   r8   r  rN   r  rY   c                 .  #    [        US   SSS9  [        USSS9  US   S	:X  a  S
O[        US   5      n[        S[	        X5      I S h  vN S9/nUR                  S0 5      nU H.  n	UR                  [        S[        XU	   S9I S h  vN S95        M0     [        U [        SSS9[        [        US   [        US   US9[        US   US   UUUUS9S9S9I S h  vN n
U
R                  (       d%  [        SU
R                    SU
R"                   35      e[%        U [        SU
R                  R&                   3S9[(        S SS 9I S h  vN n[*        R,                  " [/        UR                  R0                  5      I S h  vN 5      $  GN@ GN N NG N7f)!Nr=   FrP   rC  r   r$  r-  r   rq  r   r  rZ  r{  r|  rY  r   r}   r~   r8   r=   r^  r  r9  )r  r9  r   r  rY   rN   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   *Wan2VideoEditApi.execute.<locals>.<lambda>  r   r{   rM  r3  )r1   r2   r   r   r/   getr   r.   r+   r%   r   r$   r"   r#   r   r   r   r   r*   r   r   r   r   r(   r  )rw   r8   r  rN   r  rY   r   r^  r{  keyr   r   s               rx   r   Wan2VideoEditApi.execute  s     	h%ANABGj)V31U:=N9OW8PQT8\2\]^ 99%7<#CLL*6NsknZo6p0p $ ")W 02Gn.eHoUS8$\2.%"/'"
 
(  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[K 3]
 1q
,
 [s\   AF	F	

>FF	AFFA-F	F
6F F	FFFFFr   N)r   r   r   r   r   ry   rO  r   r   r   r   r   r   r   r   r{   rx   rm  rm  $  sf    f
 f
P 0\0\ {{0\ 	0\
 0\ 0\ 0\r{   rm  c                   D    \ rS rSr\S 5       r\S\S\S\4S j5       r	Sr
g)	Wan2ReferenceVideoApii  c                 R   [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R
                  R                  SSS	SS9[         R                  R                  SSS/S9[         R                  R                  S/ SQS9[         R                  R                  SSSSS[         R                  R                  S9[         R                  R                  S[         R                  R                  [         R                  R                  S5      / SQSS9S9[         R                  R                  S [         R                  R                  [         R                  R                  S!5      / S"QSS9S9/5      /S9[         R                  R                  S#SSS$S[         R                  R                  SS%S&9[         R                  R                  S'S(S)SS*9/[         R                  R                  5       /[         R                   R"                  [         R                   R$                  [         R                   R&                  /S[         R(                  " [         R*                  " / S+QS,9S-S.9S/9	$ )0Nr  zWan 2.7 Reference to Videor   zGenerate a video featuring a person or object from reference materials. Supports single-character performances and multi-character interactions.r8   z
wan2.7-r2vr=   Tr>   xPrompt describing the video. Use identifiers such as 'character1' and 'character2' to refer to the reference characters.r@   rC   rD   r  r  r  r  r9  r:  r   r   r   r$  rP   r%  r  r  )video1video2video3r   r   r"  r{  r|  r}  r~  r  r  image5rN   rO   rQ   r;  rY   FrZ   r&  r<  r   a
  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $dur := $lookup(widgets, "model.duration");
                  $ppsTable := { "720p": 0.1, "1080p": 0.15 };
                  $pps := $lookup($ppsTable, $res);
                  $outputPrice := $pps * $dur;
                  {
                    "type": "range_usd",
                    "min_usd": $outputPrice,
                    "max_usd": 5 * $pps + $outputPrice
                  }
                )
                r   r^   )r   rh   r?  r   r@  rj   ri   rk   rl   rm   r'  r(  r   ro   rn   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   #Wan2ReferenceVideoApi.define_schema  s   yy+5(W %%..( "		$,.2,.-Y	 !0 !" !#		$5.2,.,W	 !0 !" !#$0-3W,= !/ !" !#$+,Q !/ !" !#$.,-()(*)*131A1A1H1H !- !" !# 1 1$6-/[[-F-F(*7H(I.L,- .G .& !2 !" !# 1 1$6-/[[-F-F(*7H(I.`,- .G .& !2 !"M.13 & 6n "!#!1!1!8!8+/9  	 

  !U!	 ! EHT ! 		..		++		##
 //8ghqi
 i	
r{   r8   rN   rY   c                   #    [        US   SSS9  / nUR                  S0 5      nU H0  nUR                  [        S[	        XU   5      I S h  vN S95        M2     UR                  S0 5      nU H.  nUR                  [        S	[        XU   S
9I S h  vN S95        M0     U(       d  [        S5      e[        U5      S:  a  [        S[        U5       S35      e[        U [        SSS9[        [        US   [        US   US   =(       d    S US9[        US   US   US   UUS9S9S9I S h  vN nUR                  (       d%  [        SUR                    SUR"                   35      e[%        U [        SUR                  R&                   3S9[(        S S S!9I S h  vN n	[*        R,                  " [/        U	R                  R0                  5      I S h  vN 5      $  GN GNL N NG N7f)"Nr=   FrP   rC  r  r  rZ  r{  r|  rY  zAAt least one reference video or reference image must be provided.r   zToo many references (z9). The maximum total of reference videos and images is 5.r   r}   r~   r8   rC   r]  r  r9  r   r  r9  r   rY   rN   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   /Wan2ReferenceVideoApi.execute.<locals>.<lambda>j  r   r{   rM  r3  )r1   r  r   r   r/   r.   r   lenr+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r(   r  )
rw   r8   rN   rY   r^  r  r  r{  r   r   s
             rx   r   Wan2ReferenceVideoApi.execute0  s     	h%AN 99%7<#CLL$5AYZ]ps_tAu;uv $ !99%7<#CLL*6sSVBWXX $ `aau:>'E
|3lm  ")W 07Gn3 ?$)*;$<$D
 >$\2.":.'"
 
.  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[c <v Y
2
 [s]   A
G'GAG'GBG'-G!.A-G'G#6G'G%	G'G'!G'#G'%G'r   Nr   r   r   r   r   ry   rO  r   r   r   r   r   r{   rx   r  r    sL    j
 j
X <\<\ <\ 	<\ <\r{   r  c                   D    \ rS rSr\S 5       r\S\S\S\4S j5       r	Sr
g)	HappyHorseTextToVideoApiip  c                    [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R                  R                  SSS/S9[         R                  R                  S/ SQS9[         R                  R                  SSSSS[         R                  R                  S9/5      /S9[         R                  R                  SSSSS[         R                  R                  SSS9[         R                  R                  SSSSS 9/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                   /S[         R"                  " [         R$                  " / S!QS"9S#S$9S%9	$ )&Nr  zHappyHorse Text to Videor   zDGenerates a video based on a text prompt using the HappyHorse model.r8   zhappyhorse-1.0-t2vr=   Tr>   r?   r@   r  r  r  r  r9  r:  r   r   r   r   rP   r%  rN   r   rO   rQ   r;  rY   FrZ   r&  r<  r   _  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $dur := $lookup(widgets, "model.duration");
                  $ppsTable := { "720p": 0.14, "1080p": 0.24 };
                  $pps := $lookup($ppsTable, $res);
                  { "type": "usd", "usd": $pps * $dur }
                )
                r   r^   )r   rh   r?  r   r@  rj   ri   rk   rl   rm   rn   r   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   &HappyHorseTextToVideoApi.define_schemaq  s   yy.3(^%%..0 "		$,.2,.-D	 !0 !" !#$0-3W,= !/ !" !#$+,Q !/ !" !#$.,-()(*)*131A1A1H1H !- !"! &  B "!#!1!1!8!8+/9  	 

  !U!	 ! Y2h ! 		..		++		##
 //8ghCM
 M	
r{   r8   rN   rY   c                   #    [        US   SSS9  [        U [        SSS9[        [	        US   [        US   S S	9[        US
   US   US   UUS9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[        U [        SUR                  R                   3S9[        S SS9I S h  vN n[        R                  " [!        UR                  R"                  5      I S h  vN 5      $  N NA N7f)Nr=   FrP   rC  r   r}   r~   r8   r   r  r9  r   )r  r9  r   rN   rY   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   2HappyHorseTextToVideoApi.execute.<locals>.<lambda>  r   r{   rM  r3  )r1   r+   r%   r   r!   r   r    r   r   r   r   r*   r   r   r   r   r(   r  )rw   r8   rN   rY   r   r   s         rx   r    HappyHorseTextToVideoApi.execute  s'     	h%AN!(W 03Gn* ?$( :$\2.":.'"
 
,  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[?
0
 [s7   ADDA-DD6D<D	=	DD	Dr   Nr  r   r{   rx   r  r  p  sL    N
 N
` &\&\ &\ 	&\ &\r{   r  c            	       \    \ rS rSr\S 5       r\S\S\R                  S\	S\
4S j5       rSrg	)
HappyHorseImageToVideoApii  c                    [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R                  R                  SSS/S9[         R                  R                  SSSSS[         R                  R                  S9/5      /S9[         R                  R                  SSS9[         R                  R                  SSSSS[         R                  R                  SSS9[         R                  R                  SSS SS!9/[         R                  R                  5       /[         R                  R                  [         R                  R                   [         R                  R"                  /S[         R$                  " [         R&                  " / S"QS#9S$S%9S&9	$ )'Nr  zHappyHorse Image to Videor   zEGenerate a video from a first-frame image using the HappyHorse model.r8   zhappyhorse-1.0-i2vr=   Tr>   r?   r@   r  r  r  r  r   r   r   r   rP   r%  rT  rU  r   rN   r   rO   rQ   r;  rY   FrZ   r&  r<  r   r  r   r^   )r   rh   r?  r   r@  rj   ri   rk   rl   rm   ro   rn   r   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   'HappyHorseImageToVideoApi.define_schema  s   yy/4(_%%..0 "		$,.2,.-D	 !0 !" !#$0-3W,= !/ !" !#$.,-()(*)*131A1A1H1H !- !" & : !d   "!#!1!1!8!8+/9  	 

  !U!	 ! Y2h ! 		..		++		##
 //8ghCM
 M	
r{   r8   rT  rN   rY   c                 D  #    [        S[        XS9I S h  vN S9/n[        U [        SSS9[        [        US   [        US   =(       d    S S US	9[        US
   US   UUS9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[        U [        SUR                  R                   3S9[        S SS9I S h  vN n[        R                   " [#        UR                  R$                  5      I S h  vN 5      $  GN N ND N7f)NrT  rY  rZ  r   r}   r~   r8   r=   r]  r  r   )r  r   rN   rY   r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   3HappyHorseImageToVideoApi.execute.<locals>.<lambda>h  r   r{   rM  r3  )r   r.   r+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r(   r  )rw   r8   rT  rN   rY   r^  r   r   s           rx   r   !HappyHorseImageToVideoApi.execute>  s>     "23JJ
 ")W 05Gn1 ?2d$(
 <$\2":.'	"
 
,  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[E K
0
 [sG   D D
AD )D*A-D D6D D	D D D D r   N)r   r   r   r   r   ry   rO  r   ro   r   r   r   r   r   r{   rx   r  r    s[    N
 N
` ,\,\ [[,\ 	,\
 ,\ ,\r{   r  c            	       \    \ rS rSr\S 5       r\S\S\R                  S\	S\
4S j5       rSrg	)
HappyHorseVideoEditApiin  c                 ,   [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R                  R                  SSS/S9[         R                  R                  S/ SQSS9[         R                  R                  S[         R                  R                  [         R                  R                  S5      / SQSS9S9/5      /S9[         R                  R                  SSS9[         R                  R                  SSSSS[         R                  R                  SS S!9[         R                  R                  S"S#S$SS%9/[         R                  R                  5       /[         R                   R"                  [         R                   R$                  [         R                   R&                  /S[         R(                  " [         R*                  " SS&/S'9S(S)9S*9	$ )+Nr  zHappyHorse Video Editr   zEdit a video using text instructions or reference images with the HappyHorse model. Output duration is 3-15s and matches the input video; inputs longer than 15s are truncated.r8   zhappyhorse-1.0-video-editr=   Tr>   ro  r@   r  r  r  r  r9  r:  rp  r:   r{  r|  r  r   r   r"  r  r  r   rN   rO   rP   rQ   r;  rY   FrZ   r&  r=  r   a=  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $ppsTable := { "720p": 0.14, "1080p": 0.24 };
                  $pps := $lookup($ppsTable, $res);
                  { "type": "usd", "usd": $pps, "format": { "suffix": "/second" } }
                )
                r   r^   r  rv   s    rx   ry   $HappyHorseVideoEditApi.define_schemao  s   yy,0(j %%..7 "		$,.2,.,b	 !0 !" !#$0-3W,= !/ !" !#$+,Q,o !/ !"
 !# 1 1$6-/[[-F-F(*7H(I/* -. .G 
.& !2 !"!!# & &N 0   "!#!1!1!8!8+/9  	 

  !U!	 ! m<| ! 		..		++		##
 //BT8UV
YW
 W	
r{   r8   r  rN   rY   c                   #    [        US   SSS9  [        USSS9  [        S[        X5      I S h  vN S	9/nUR	                  S
0 5      nU H.  nUR                  [        S[        XU   S9I S h  vN S	95        M0     [        U [        SSS9[        [        US   [        US   US9[        US   US   S UUS9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                    35      e[#        U [        SUR                  R$                   3S9[&        S SS9I S h  vN n	[(        R*                  " [-        U	R                  R.                  5      I S h  vN 5      $  GN? GN N NG N7f)Nr=   FrP   rC  r   <   r-  r  rZ  r{  r|  rY  r   r}   r~   r8   r  r  r9  r  r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   0HappyHorseVideoEditApi.execute.<locals>.<lambda>  r   r{   rM  r3  )r1   r2   r   r/   r  r   r.   r+   r%   r   r$   r"   r#   r   r   r   r   r*   r   r   r   r   r(   r  )
rw   r8   r  rN   rY   r^  r{  r  r   r   s
             rx   r   HappyHorseVideoEditApi.execute  s     	h%ANABGW8PQT8\2\]^ 99%7<#CLL*6NsknZo6p0p $ ")W 02Gn.eHoUS8$\2.!'
"
 
&  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[I 3]
 1q
*
 [sY   .E;E/
>E;/E20AE;E5A-E;/E706E;&E9'	E;2E;5E;7E;9E;r   N)r   r   r   r   r   ry   rO  r   r   r   r   r   r   r   r{   rx   r  r  n  s[    X
 X
t -\-\ {{-\ 	-\
 -\ -\r{   r  c                   D    \ rS rSr\S 5       r\S\S\S\4S j5       r	Sr
g)	HappyHorseReferenceVideoApii  c                 b   [         R                  " SSSS[         R                  R                  S[         R                  R	                  S[         R
                  R                  SSS	S
S9[         R                  R                  SSS/S9[         R                  R                  S/ SQS9[         R                  R                  SSSSS[         R                  R                  S9[         R                  R                  S[         R                  R                  [         R                  R                  S5      / SQSS9S9/5      /S9[         R                  R                  SSSSS[         R                  R                  SS S!9[         R                  R                  S"S#S$SS%9/[         R                  R                  5       /[         R                   R"                  [         R                   R$                  [         R                   R&                  /S[         R(                  " [         R*                  " / S&QS'9S(S)9S*9	$ )+Nr  zHappyHorse Reference to Videor   zGenerate a video featuring a person or object from reference materials with the HappyHorse model. Supports single-character performances and multi-character interactions.r8   zhappyhorse-1.0-r2vr=   Tr>   r  r@   r  r  r  r  r9  r:  r   r   r   r   rP   r%  r{  r|  )	r}  r~  r  r  r  image6image7image8image9r   r"  rN   r   rO   rQ   r;  rY   FrZ   r&  r<  r   r  r   r^   )r   rh   r?  r   r@  rj   ri   rk   rl   rm   r'  r(  ro   rn   r   rp   rq   rr   rs   rt   ru   r   rv   s    rx   ry   )HappyHorseReferenceVideoApi.define_schema  s   yy18(^ %%..0 "		$,.2,.-Y	 !0 !" !#$0-3W,= !/ !" !#$+,Q !/ !" !#$.,-()(*)*131A1A1H1H !- !" !# 1 1$6-/[[-F-F(*7H(I
/* -. .G .& !2 !"1*-/ & 2f "!#!1!1!8!8+/9  	 

  !U!	 ! }DL ! 		..		++		##
 //8ghi`
 `	
r{   r8   rN   rY   c                   #    [        US   SSS9  / nUR                  S0 5      nU H.  nUR                  [        S[	        XU   S9I S h  vN S95        M0     U(       d  [        S	5      e[        U [        S
SS9[        [        US   [        US   S US9[        US   US   US   UUS9S9S9I S h  vN nUR                  (       d%  [        SUR                   SUR                   35      e[!        U [        SUR                  R"                   3S9[$        S SS9I S h  vN n[&        R(                  " [+        UR                  R,                  5      I S h  vN 5      $  GN N ND N7f)Nr=   FrP   rC  r{  r|  rY  rZ  z8At least one reference reference image must be provided.r   r}   r~   r8   r]  r  r9  r   r  r   r   r   r   r   r   c                 .    U R                   R                  $ r   r   r   s    rx   r   5HappyHorseReferenceVideoApi.execute.<locals>.<lambda>  r   r{   rM  r3  )r1   r  r   r   r.   r   r+   r%   r   r   r   r   r   r   r   r   r*   r   r   r   r   r(   r  )	rw   r8   rN   rY   r^  r{  r  r   r   s	            rx   r   #HappyHorseReferenceVideoApi.execute`  s     	h%AN 99%7<#CLL*6sSVBWXX $ WXX!(W 07Gn3 ?$(
 >$\2.":.'"
 
.  &&9:J:O:O9PPSTdTlTlSmnoo 78H8O8O8W8W7XYZ2;
 
 }}#?@Y@Y#ZZ[[M Y
2
 [sJ   AE)
E A'E)2E#3A-E) E%!6E)E'	E)#E)%E)'E)r   Nr  r   r{   rx   r  r    sL    a
 a
F 3\3\ 3\ 	3\ 3\r{   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)WanApiExtensioni  returnc                    #    [         [        [        [        [        [
        [        [        [        [        [        [        [        [        /$ 7fr   )r4   r   r   r  r  r7  rQ  rd  rm  r  r  r  r  r  )selfs    rx   get_node_listWanApiExtension.get_node_list  s;       $!$%"'
 	
s   A	Ar   N)r   r   r   r   r   listr[  r   	ComfyNoder  r   r   r{   rx   r  r    s)    
T$r||*<%= 
 
r{   r  r  c                     #    [        5       $ 7fr   )r  r   r{   rx   comfy_entrypointr    s     s   )Hretyping_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.wanr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   comfy_api_nodes.utilr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   compiler  r  r4   r   r   r  r  r7  rQ  rd  rm  r  r  r  r  r  r  r  r   r{   rx   <module>r     s   	 & 6 6       @   " 

78xf xfv}f }f@t\ t\np\ p\fW\2<< W\tV\ V\rh\",, h\Vd\r|| d\N[\r|| [\|k\BLL k\\y\r|| y\x\ \DJ\R\\ J\ZY\",, Y\x
n 
* r{   