
    ^(j)                        d dl Z d dlmZ d dlmZmZmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ ddiZdedz  fd	Z dedz  fd
Z! G d dejD                        Z#g dZ$de%de&fdZ' G d dejD                        Z( G d dejD                        Z) G d dejD                        Z* G d dejD                        Z+ G d dejD                        Z, G d dejD                        Z- G d de      Z.de.fdZ/y)     N)override)IOComfyExtensionInput)	ImageEditRequestImageGenerationRequestImageGenerationResponseInputUrlObjectVideoEditRequestVideoExtensionRequestVideoGenerationRequestVideoGenerationResponseVideoStatusResponse)ApiEndpointdownload_url_to_image_tensordownload_url_to_video_outputget_fs_object_sizeget_number_of_imagespoll_opsync_optensor_to_base64_stringupload_images_to_comfyapiupload_video_to_comfyapivalidate_stringvalidate_video_durationgrok-imagine-video-1.5zgrok-imagine-video-1.5-previewreturnc                 z    | j                   r/| j                   j                  | j                   j                  dz  S y )Nl    d(	 )usagecost_in_usd_ticks)responses    D/Users/danicosta/Desktop/Flux2/ComfyUI/comfy_api_nodes/nodes_grok.py_extract_grok_pricer#   %   s0    ~~(..::F~~//.@@    c                 (    t        |       }||dz  S y )NgzG?)r#   )r!   prices     r"   _extract_grok_video_pricer'   +   s    )Et|r$   c                   b    e Zd Zed        Ze	 ddededededededej                  fd	       Z	y
)GrokImageNodec                 j   t        j                  ddddt         j                  j                  dg d      t         j                  j                  dd	d
      t         j                  j                  dg d      t         j
                  j                  ddddddt         j                  j                        t         j
                  j                  dddddt         j                  j                  d	d      t         j                  j                  dddgd	      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gd	t        j                  t        j                  g d      d       	      S )!Nr)   z
Grok Imagepartner/image/Grokz1Generate images using Grok based on a text promptmodelgrok-imagine-image-qualitygrok-imagine-image-progrok-imagine-imageoptionspromptT*The text prompt used to generate the image	multilinetooltipaspect_ratio)1:12:33:23:44:39:1616:99:19.519.5:99:2020:91:22:1number_of_images   
   zNumber of images to generatedefaultminmaxstepr7   display_modeseedr   `Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.rJ   rK   rL   rM   rN   control_after_generater7   
resolution1K2K)r2   optionalr,   rF   rT   widgetsaM  
                (
                  $rate := widgets.model = "grok-imagine-image-quality"
                    ? (widgets.resolution = "1k" ? 0.05 : 0.07)
                    : ($contains(widgets.model, "pro") ? 0.07 : 0.02);
                  {"type":"usd","usd": $rate * widgets.number_of_images}
                )
                
depends_onexpr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaCombor   StringIntNumberDisplaynumberImageOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclss    r"   define_schemazGrokImageNode.define_schema4   s   yy#%)K   		"H   
 "  $ &:!#!1!1!8!8   "!#!1!1!8!8+/N  
 |dD\DQi5n ! 		..		++		##
 //8cd
IO
 O	
r$   r,   r3   r8   rF   rO   rT   r   c                 ~  K   t        |dd       t        | t        dd      t        ||||||j	                               t
        t               d {   }t        |j                        dk(  r=t        j                  t        |j                  d	   j                         d {         S t        j                  t        j                  |j                  D cg c]$  }|j                  st        |j                        & c}D 	cg c]  }	t        |	       d {    c}	            S 7 7 c c}w 7 c c}	w w)
NTrG   strip_whitespace
min_lengthz /proxy/xai/v1/images/generationsPOSTpathmethod)r,   r3   r8   nrO   rT   dataresponse_modelprice_extractorr   )r   r   r   r   lowerr	   r#   lenr   r   
NodeOutputr   urltorchcatstr)
rw   r,   r3   r8   rF   rO   rT   r!   dis
             r"   executezGrokImageNode.execute   s     	!D ?O')"%++- 3/
 
 x}}"=='CHMMRSDTDXDX'Y!YZZ}}IIU]UbUb@lUbPQfgfkfkQUUUb@lm@l13A666@lm
 	
!
 "Z Am6msa   AD=D-AD=%D/&4D=D1,D1D=D8D6D8"D=/D=1D=6D88D=N)rU   )
__name__
__module____qualname__classmethodrx   r   intr   r   r    r$   r"   r)   r)   2   sx    P
 P
d  

 
 	

 
 
 
 

 
r$   r)   autor9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   max_ref_imageswith_aspect_ratioc                 N   t         j                  j                  dt         j                  j                  t         j                  j                  d      t        d| dz         D cg c]  }d| 	 c}d      | dk(  rdnd|  d	      t         j                  j                  d
ddg      t         j                  j                  ddddddt         j                  j                        g}|r5|j                  t         j                  j                  dt        d             |S c c}w )NimagesimagerG   image_)namesrK   zReference image to edit.z"Reference image(s) to edit. Up to z images.templater7   rT   rU   rV   r1   rF   rH   #Number of edited images to generaterI   r8   z0Only allowed when multiple images are connected.r2   r7   )r   Autogrowr   TemplateNamesrn   rangeri   rk   rl   rm   append%_GROK_IMAGE_EDIT_ASPECT_RATIO_OPTIONS)r   r   r   rc   s       r"   _grok_image_edit_model_inputsr      s   
[[..w'-21nq6H-IJ-Is|-IJ /  "Q& +9.9IR 	 	
 	|dD\:
9))00 	 	
F2 HHNN=J  	
 M9 Ks   #D"c                   z    e Zd Zed        Ze	 ddedej                  dededededed	e	j                  fd
       Zy)GrokImageEditNodec                    t        j                  ddddt         j                  j                  dg d      t         j                  j                  dd	
      t         j
                  j                  ddd      t         j                  j                  dddg      t         j                  j                  ddddddt         j                  j                        t         j                  j                  dddddt         j                  j                  dd      t         j                  j                  dg ddd      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                  t        j                  g d !      d"#      d$
      S )%Nr   Grok Image Editr+   /Modify an existing image based on a text promptr,   r-   r1   r   r   )r`   r3   Tr4   r5   rT   rU   rV   rF   rG   rH   r   rI   rO   r   rP   rQ   rR   r8   r   zCOnly allowed when multiple images are connected to the image input.)r2   rW   r7   rX   rY   a  
                (
                  $isQualityModel := widgets.model = "grok-imagine-image-quality";
                  $isPro := $contains(widgets.model, "pro");
                  $rate := $isQualityModel
                    ? (widgets.resolution = "1k" ? 0.05 : 0.07)
                    : ($isPro ? 0.07 : 0.02);
                  $base := $isQualityModel ? 0.01 : 0.002;
                  $output := $rate * widgets.number_of_images;
                  $isPro
                    ? {"type":"usd","usd": $base + $output}
                    : {"type":"range_usd","min_usd": $base + $output, "max_usd": 3 * $base + $output}
                )
                r[   )
r_   r`   ra   rb   rc   rd   re   rf   rg   is_deprecated)r   rh   ri   r   rn   rj   rk   rl   rm   ro   rp   rq   rr   rs   rt   ru   rv   s    r"   rx   zGrokImageEditNode.define_schema   s   yy'*)I   wX>		"H   
 |dD\B&A!#!1!1!8!8   "!#!1!1!8!8+/N  
 "  "a'  I9v ! 		..		++		##
 //8cd" sZ
 Z	
r$   r,   r   r3   rT   rF   rO   r8   r   c                   K   t        |dd       |dk(  rt        |      dkD  r$t        d      t        |      dkD  rt        d      |dk7  rt        |      dk(  rt        d	      t        | t	        d
d      t        ||D cg c]  }t        dt        |              c}||j                         |||dk(  rd n|      t        t               d {   }	t        |	j                        dk(  r=t        j                  t        |	j                  d   j                          d {         S t        j                  t#        j$                  |	j                  D 
cg c]$  }
|
j                   st'        |
j                         & c}
D cg c]  }t        |       d {    c}            S c c}w 7 7 c c}
w 7 c c}w w)NTrG   rz   r/   *The pro model supports only 1 input image.   )A maximum of 3 input images is supported.r   ZCustom aspect ratio is only allowed when multiple images are connected to the image input./proxy/xai/v1/images/editsr}   r~   data:image/png;base64,r   r,   r   r3   rT   r   rO   r8   r   r   )r   r   
ValueErrorr   r   r   r
   r   r   r	   r#   r   r   r   r   r   r   r   r   r   )rw   r,   r   r3   rT   rF   rO   r8   r   r!   r   s              r"   r   zGrokImageEditNode.execute@  s     	!D,,#E*Q. !MNN!%(1,HII6!&:5&AQ&Fl  !9&I!kpqkpfg-CD[\]D^C_+`akpq%++-"%1V%;T 3/
 
 x}}"=='CHMMRSDTDXDX'Y!YZZ}}IIU]UbUb@lUbPQfgfkfkQUUUb@lm@l13A666@lm
 	
 r
  "Z Am6msm   B GF.!4GF3AG&F5'4GF7-F7G	F>F<F>#G5G7G<F>>GN)r   )r   r   r   r   rx   r   r   rn   r   r   r   r   r   r$   r"   r   r      s    [
 [
z  #)
)
 {{)
 	)

 )
 )
 )
 )
 
)
 )
r$   r   c            	       R    e Zd Zed        Zededededej                  fd       Z
y)GrokImageEditNodeV2c                 `   t        j                  ddddt         j                  j                  dddd	      t         j                  j                  d
t         j                  j                  dt        dd            t         j                  j                  dt        dd            t         j                  j                  dt        dd            g      t         j                  j                  dddddt         j                  j                  dd      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                   t        j"                  g d      d      	      S )Nr   r   r+   r   r3   T r4   )r6   rJ   r7   r,   r.   r   )r   r   r/   rG   Fr0   r1   rO   r   rP   rQ   rR   )r,   model.resolutionzmodel.number_of_imagesrY   a  
                (
                  $isQualityModel := widgets.model = "grok-imagine-image-quality";
                  $isPro := $contains(widgets.model, "pro");
                  $res := $lookup(widgets, "model.resolution");
                  $n := $lookup(widgets, "model.number_of_images");
                  $rate := $isQualityModel
                    ? ($res = "1k" ? 0.05 : 0.07)
                    : ($isPro ? 0.07 : 0.02);
                  $base := $isQualityModel ? 0.01 : 0.002;
                  $output := $rate * $n;
                  $isPro
                    ? {"type":"usd","usd": $base + $output}
                    : {"type":"range_usd","min_usd": $base + $output, "max_usd": 3 * $base + $output}
                )
                r[   r^   )r   rh   rj   r   DynamicComboOptionr   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   s    r"   rx   z!GrokImageEditNodeV2.define_schemao  sv   yy)*)I		"H	    %%..89^bc ..49^cd ..09^bc & " "!#!1!1!8!8+/N  
1#J ! 		..		++		##
 //S	eG
 G	
r$   r3   r,   rO   r   c                    K   t        |dd       |d   }|d   }|d   }|j                  d      xs i }|j                  dd	      }|j                         D 	cg c]  }	|	|		 }
}	t        d
 |
D              }|dk  rt	        d      |dk(  r|dkD  rt	        d      |dk7  r|dkD  rt	        d      |d	k7  r|dk(  rt	        d      g }|
D ]\  t        j                        dk(  r1|j                  fdt        j                  d         D               L|j                         ^ t        | t        dd      t        ||D cg c]  }t        dt        |              c}||j                         |||d	k(  rd n|      t         t"               d {   }t        |j$                        dk(  r=t'        j(                  t+        |j$                  d   j,                         d {         S t'        j(                  t/        j0                  |j$                  D cg c]$  }|j,                  st3        |j,                        & c}D cg c]  }t+        |       d {    c}            S c c}	w c c}w 7 7 c c}w 7 $c c}w w)NTrG   rz   r,   rT   rF   r   r8   r   c              3   2   K   | ]  }t        |        y wN)r   ).0ts     r"   	<genexpr>z.GrokImageEditNodeV2.execute.<locals>.<genexpr>  s     F1+A.s   z+At least one image is required for editing.r/   r   r   r   r      c              3   (   K   | ]	  }|     y wr   r   )r   r   tensors     r"   r   z.GrokImageEditNodeV2.execute.<locals>.<genexpr>  s     #N7M!F1I7Ms   r   r   r}   r~   r   r   r   r   )r   getvaluessumr   r   shapeextendr   r   r   r   r   r
   r   r   r	   r#   r   r   r   r   r   r   r   r   )rw   r3   r,   rO   model_idrT   rF   images_dictr8   r   image_tensorsn_imagesflat_tensorsr   r!   r   r   s                   @r"   r   zGrokImageEditNodeV2.execute  s     	!D><(
 !34ii)/Ryy87B7I7I7K+]7K!q}A7K+]FFFa<JKK//HqLIJJ//HqLHII6!h!ml  ,.#F6<< A%###NuV\\!_7M#NN##F+	 $ !9&I!gsgsbcN)?@WXY@Z?['\]gs %++-"%1V%;T
 3/
 
" x}}"=='CHMMRSDTDXDX'Y!YZZ}}IIU]UbUb@lUbPQfgfkfkQUUUb@lm@l13A666@lm
 	
O ,^2
$ "Z Am6ms   AJI4"I4&C"JI9'4JI>AJ,J -4J!J3J
JJ	"J#J	)J JJJ		JNr   r   r   r   rx   r   dictr   r   r   r   r   r$   r"   r   r   m  sU    H
 H
T 8
8
 8
 	8

 
8
 8
r$   r   c                       e Zd Zed        Ze	 ddedededededed	ej                  dz  d
e	j                  fd       Zy)GrokVideoNodec                    t        j                  ddddt         j                  j                  dddgd	      t         j                  j                  d
dd      t         j                  j                  dddgd	      t         j                  j                  dg dd	      t         j
                  j                  ddddddt         j                  j                        t         j
                  j                  dddddt         j                  j                  dd      t         j                  j                  d dd!"      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                   t        j"                  g d#d g$      d%&      '	      S )(Nr   z
Grok Videopartner/video/Grokz(Generate video from a prompt or an imager,   grok-imagine-videor   z@grok-imagine-video-1.5 currently always requires an input image.r   r3   T&Text description of the desired video.r5   rT   480p720p#The resolution of the output video.r8   )r   r?   r=   r;   r9   r:   r<   r>   %The aspect ratio of the output video.duration   rG      ,The duration of the output video in seconds.rI   rO   r   rP   rQ   rR   r   zTOptional starting image for grok-imagine-video. Required for grok-imagine-video-1.5.)rW   r7   )r,   r   rT   )rZ   rc   a  
                (
                  $is15 := $contains(widgets.model, "1.5");
                  $rate := $is15
                    ? (widgets.resolution = "720p" ? 0.2002 : 0.1144)
                    : (widgets.resolution = "720p" ? 0.07 : 0.05);
                  $imgCost := $is15 ? 0.0143 : 0.002;
                  $base := $rate * widgets.duration;
                  {"type":"usd","usd": inputs.image.connected ? $base + $imgCost : $base}
                )
                r[   r^   )r   rh   ri   r   rj   rk   rl   sliderrm   rn   Videoro   rp   rq   rr   rs   rt   ru   rv   s    r"   rx   zGrokVideoNode.define_schema  s   yy#%)B13KL^  
 		"D   
  #V,A  
 "WC  
 J!#!1!1!8!8   "!#!1!1!8!8+/N  
 !r  S.` ! 		..		++		##
 //8[eldmn
{K
 K	
r$   Nr,   r3   rT   r8   r   rO   r   r   c                 d  K   ||dk(  rt        d| d      d }|1t        |      dk7  rt        d      t        dt        |             }t	        |dd	       t        | t        d
d      t        t        j                  ||      |||||dk(  rd n||      t               d {   }	t        | t        d|	j                         d t        |dk(  rt        nt               d {   }
t!        j"                  t%        |
j&                  j(                         d {         S 7 7 @7 w)Nr   zThe 'zB' model requires an input image; connect one to the 'image' input.rG   z"Only one input image is supported.r   r   Trz    /proxy/xai/v1/videos/generationsr}   r~   r   )r,   r   r3   rT   r   r8   rO   r   r   /proxy/xai/v1/videos/r   c                 6    | j                   | j                   S dS Ncompletestatusrs    r"   <lambda>z'GrokVideoNode.execute.<locals>.<lambda>k      1883Gqxx'WZ'Wr$   status_extractorr   r   )r   r   r
   r   r   r   r   r   _GROK_VIDEO_MODEL_API_IDSr   r   r   
request_idr   r'   r#   r   r   r   videor   )rw   r,   r3   rT   r8   r   rO   r   	image_urlinitial_responser!   s              r"   r   zGrokVideoNode.executeG  sA     =U&>>uUG+mnoo	#E*a/ !EFF&-CD[\aDbCc+deI!D!(?O'/33E5A%!%1V%;T 3"
 
 !45E5P5P4QRSW.9>BZ9Z5`s
 
 }}#?@R@R#SSTT+

 Ts7   B&D0(D*)AD0+D,,5D0!D."	D0,D0.D0r   )r   r   r   r   rx   r   r   r   rn   r   r   r   r   r$   r"   r   r     s    L
 L
\  %)'U'U 'U 	'U
 'U 'U 'U {{T!'U 
'U 'Ur$   r   c                   j    e Zd Zed        Zedededej                  dede	j                  f
d       Zy)	GrokVideoEditNodec                 v   t        j                  ddddt         j                  j                  ddg      t         j                  j                  dd	d
      t         j
                  j                  dd      t         j                  j                  dddddt         j                  j                  d	d      gt         j
                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gd	t        j                  d      	      S )Nr   zGrok Video Editr   z.Edit an existing video based on a text prompt.r,   r   r1   r3   Tr   r5   r   z=Maximum supported duration is 8.7 seconds and 50MB file size.r7   rO   r   rP   rG   rQ   rR   zM{"type":"usd","usd": 0.06, "format": {"suffix": "/sec", "approximate": true}})r]   r^   )r   rh   ri   r   rj   r   rk   rl   rm   ro   rp   rq   rr   rs   rt   rv   s    r"   rx   zGrokVideoEditNode.define_schemat  s   yy'*)Hw1E0FG		"D   
 w0op"!#!1!1!8!8+/N  
* ! 		..		++		##
 hE%
 %	
r$   r,   r3   r   rO   r   c                 @  K   t        |dd       t        |dd       |j                         }t        |      }|dkD  rt	        d|dz  dz  d	d
      t        | t        dd      t        |t        t        | |       d {         ||      t               d {   }t        | t        d|j                         d t        t               d {   }t        j                   t#        |j$                  j&                         d {         S 7 7 x7 B7 w)NTrG   rz   gffffff!@min_durationmax_duration   Video size (   .1fMB) exceeds 50MB limit.z/proxy/xai/v1/videos/editsr}   r~   r   )r,   r   r3   rO   r   r   r   c                 6    | j                   | j                   S dS r   r   r   s    r"   r   z+GrokVideoEditNode.execute.<locals>.<lambda>  r   r$   r   )r   r   get_stream_sourcer   r   r   r   r   r
   r   r   r   r   r   r#   r   r   r   r   r   )	rw   r,   r3   r   rO   video_stream
video_sizer   r!   s	            r"   r   zGrokVideoEditNode.execute  s     	!DACH..0'5
((|J,=,DS+II`abb!(9&I!$/GU/S)ST	 3
"
 

 !45E5P5P4QRSW./
 
 }}#?@R@R#SSTT *T


 TsH   A?DDDD 7DD5DD	DDDDN)r   r   r   r   rx   r   r   r   r   r   r   r   r   r$   r"   r   r   r  sh    &
 &
P UU U {{	U
 U 
U Ur$   r   c            	       R    e Zd Zed        Zededededej                  fd       Z
y)GrokVideoReferenceNodec                 j   t        j                  ddddt         j                  j                  ddd      t         j                  j                  d	t         j                  j                  d
t         j                  j                  dt         j                  j                  t         j                  j                  d      ddd      d      t         j                  j                  dddgd      t         j                  j                  dg dd      t         j                  j                  ddddddt         j                  j                         g      gd!      t         j                  j                  d"d#d#d$dt         j                  j                  dd%&      gt         j                  j                         gt         j                   j"                  t         j                   j$                  t         j                   j&                  gdt        j(                  t        j*                  d'd(gd)g*      d+,      -	      S ).Nr  zGrok Reference-to-Videor   zJGenerate video guided by reference images as style and content references.r3   Tr   r5   r,   r   reference_imagesr   
reference_rG      )prefixrK   rL   z7Up to 7 reference images to guide the video generation.r   rT   r   r   r   r   r8   )r?   r=   r;   r9   r:   r<   r>   r   r   r      rH   r   rI   z&The model to use for video generation.rO   r   rP   rQ   rR   model.durationr   zmodel.reference_images)rZ   input_groupsa  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $dur := $lookup(widgets, "model.duration");
                  $refs := $lookup(inputGroups, "model.reference_images");
                  $rate := $res = "720p" ? 0.07 : 0.05;
                  $price := ($rate * $dur + 0.002 * $refs) * 1.43;
                  {"type":"usd","usd": $price}
                )
                r[   r^   )r   rh   rj   r   r   r   r   TemplatePrefixrn   ri   rk   rl   r   rm   r   ro   rp   rq   rr   rs   rt   ru   rv   s    r"   rx   z$GrokVideoReferenceNode.define_schema  s   yy,2)d		"D   
 %%..0 " 1 1$6-/[[-G-G(*w(?/;,-,-	 .H .& -f !2 	!" !#$0-3V,<,Q !/ !"
 !#$2,_,S !/ !"
 !#$.,-()(*)*,Z131A1A1H1H !- !"+!#H EM & 'P "!#!1!1!8!8+/N  
]9v ! 		..		++		##
 //-/AB":!;	QX
 X	
r$   r3   r,   rO   r   c                 <  K   t        |dd       t        | t        |d   j                               ddd       d {   }t	        | t        d	d
      t        |d   |D cg c]  }t        |       c}||d   |d   |d   |      t               d {   }t        | t        d|j                         d t        t               d {   }t        j                  t        |j                   j"                         d {         S 7 c c}w 7 }7 G7 w)NTrG   rz   r  z	image/pngzUploading base imagesr  )	mime_type
wait_label
max_imagesr   r}   r~   r,   r   rT   r   r8   )r,   r  r3   rT   r   r8   rO   r   r   r   c                 6    | j                   | j                   S dS r   r   r   s    r"   r   z0GrokVideoReferenceNode.execute.<locals>.<lambda>>  r   r$   r   )r   r   listr   r   r   r   r
   r   r   r   r   r'   r   r   r   r   r   )rw   r3   r,   rO   ref_image_urlsr   r   r!   s           r"   r   zGrokVideoReferenceNode.execute  s%     	!D8)*1134!. 
 
 ")?O'GnAO!PA.Q"7!P .z*">2 3"
 
 !45E5P5P4QRSW.5
 
 }}#?@R@R#SSTT9
 "Q

 TsQ   <DD#D"D5#DD7DD5DD	DDDDNr   r   r$   r"   r  r    s[    Y
 Y
v #U#U #U 	#U
 
#U #Ur$   r  c                   j    e Zd Zed        Zededej                  dede	de
j                  f
d       Zy)	GrokVideoExtendNodec                 Z   t        j                  ddddt         j                  j                  ddd      t         j                  j                  d	d
      t         j
                  j                  dt         j
                  j                  dt         j                  j                  ddddddt         j                  j                        g      gd      t         j                  j                  dddddt         j                  j                  dd      gt         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                   t        j"                  dg      d       	      S )!Nr  zGrok Video Extendr   zMExtend an existing video with a seamless continuation based on a text prompt.r3   Tz9Text description of what should happen next in the video.r5   r   z1Source video to extend. MP4 format, 2-15 seconds.r   r,   r   r      r  rH   rG   z#Length of the extension in seconds.rI   z%The model to use for video extension.r   rO   r   rP   rQ   rR   r  rY   a;  
                (
                  $dur := $lookup(widgets, "model.duration");
                  {
                    "type": "range_usd",
                    "min_usd": (0.02 + 0.05 * $dur) * 1.43,
                    "max_usd": (0.15 + 0.05 * $dur) * 1.43
                  }
                )
                r[   r^   )r   rh   rj   r   r   r   r   rk   rl   r   rm   ro   rp   rq   rr   rs   rt   ru   rv   s    r"   rx   z!GrokVideoExtendNode.define_schemaG  s{   yy),)g		"W   
 w0cd%%..0 "$.,-()(*)*,Q131A1A1H1H !- !"
  D% & ( "!#!1!1!8!8+/N  
7&P ! 		..		++		##
 //9I8JK	kB
 B	
r$   r3   r   r,   rO   r   c                 @  K   t        |dd       t        |dd       t        |j                               }|dkD  rt	        d|d	z  d	z  d
d      t        | t        dd      t        |t        t        | |       d {         |d         t               d {   }t        | t        d|j                         d t        t               d {   }t        j                   t#        |j$                  j&                         d {         S 7 7 x7 B7 w)NTrG   rz   r  r   r   r  r  r  r  r  z/proxy/xai/v1/videos/extensionsr}   r~   r   r   )r3   r   r   r   r   r   c                 6    | j                   | j                   S dS r   r   r   s    r"   r   z-GrokVideoExtendNode.execute.<locals>.<lambda>  r   r$   r   )r   r   r   r  r   r   r   r   r
   r   r   r   r   r   r'   r   r   r   r   r   )rw   r3   r   r,   rO   r
  r   r!   s           r"   r   zGrokVideoExtendNode.execute  s     	!DABG'(?(?(AB
((|J,=,DS+II`abb!(>vN&$/GU/S)STz*
 3	"
 	
 !45E5P5P4QRSW.5
 
 }}#?@R@R#SSTT *T	

 TsH   A=D?D DD 7DD5DD	DDDDN)r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r$   r"   r  r  E  sj    C
 C
J UU {{U 	U
 U 
U Ur$   r  c                   B    e Zd Zedeeej                        fd       Zy)GrokExtensionr   c                 T   K   t         t        t        t        t        t
        t        gS wr   )r)   r   r   r   r  r   r  )selfs    r"   get_node_listzGrokExtension.get_node_list  s'      "
 	
s   &(N)	r   r   r   r   r  typer   	ComfyNoder'  r   r$   r"   r$  r$    s)    	
T$r||*<%= 	
 	
r$   r$  c                     K   t               S wr   )r$  r   r$   r"   comfy_entrypointr+    s     ?s   )0r   typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.grokr   r   r	   r
   r   r   r   r   r   comfy_api_nodes.utilr   r   r   r   r   r   r   r   r   r   r   r   r   floatr#   r'   r)  r)   r   r   boolr   r   r   r   r   r  r  r$  r+  r   r$   r"   <module>r2     s%    & 6 6
 
 
   " > 
UT\ 54< t
BLL t
n) %$"S "T "JJ
 J
ZF
",, F
RyUBLL yUxKU KU\BUR\\ BUJfU",, fUR
N 
 r$   