+
    kHàjÒ~  ã                  óÜ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHtH	t	H
t
HtHt ^ RIHtHtHt ]P"                  ! ]4      tR R ltRÀtRRR	RR
RRRRRRRRRRR/tRRR	RR
RRRRRRRRRRR/tRRR	RR
RRRRRRRRRRR/t/ R]! RRRRRRRRRR7	      bR]! RRRR R!R"RRÁRÂRR#RR/RÃ]! ]! ^^^4      4      R#^
R^
/RR$7      bR%]! R&RRR'R(R)RÄRÅRRRR*7      bR+]! R,RRR-R.R/]RÆRÇRR07
      bR1]! R2R3R4R5R6R7RÁRÈRÉRÊR8RRRR97      bR:]! R;R3R4R<R=R>]RËRÇRR07
      bR?]! R@RAR4RBRCRD]RÌRÆRÍRRE7      bRF]! RGRAR4RHRIRJRRÌ]RÎ]RÏRRK7      bRL]! RMRNR4RORPRQRRÌ]RÐ]RÏRRRS/RRRT7      bRU]! RVRWR4RXRYRZRRÌ]RÑ]RÏRRRS/RRRT7      bR[]! R\R3R4R]R^R_RRÒRÓRÔRR`7      bRa]! RbRR4RcRdReRRÌRÕRËRÅRRf7      bRg]! RhR3R4RiRjRkRRÁRÖR×RRl7      bRm]! RnRAR4RoRpRqRrRÌRØRÙRRRs7      bRt]! RuRAR4RvRwRxRrRÌRØRÙRRRs7      bRy]! RzR{R4R|R}R~RrRØRÙRRRR7      bR€]! R�RAR4R‚RƒR„RÌRØRÙRR…7
      bR†]! R‡RAR4RˆR‰RŠRrRR‹RÚRËRÛRRRŒ7      R�]! RŽRAR4R�R�R‘RrRR‹RÚRËRÛRRRŒ7      R’]! R“R3R4R”R•R–RRÌRÜRÓRÙRRR—7      /CtR˜]R™&   R%tRÝRš R› lltRœ R� ltRž RŸ lt R  R¡ lt!R¢ R£ lt"R¤ R¥ lt#Rs$R¦]R§&   ]PJ                  ! 4       t&Rs'R¦]R¨&   Rs(R¦]R©&   ]PJ                  ! 4       t)Rª R« lt*R¬ t+R­ R® lt,R¯ t-R° R± lt.R²t/^t0RÝR³ R´ llt1Rµt2R¶R·R¸R¹/t3RÞRº R» llt4 ! R¼ R½]4      t5R¾ R¿ lt6R# )ßuØ  FAL.ai video generation backend.

The user picks a **model family** (e.g. "Pixverse v6"); the plugin routes to its text-to-video endpoint without
``image_url`` and to its image-to-video endpoint otherwise. Active-family precedence:
tool ``model=`` â†’ ``FAL_VIDEO_MODEL`` env â†’ ``video_gen.fal.model`` â†’ ``video_gen.model`` (family id or an endpoint
path containing one) â†’ ``DEFAULT_MODEL``. Auth via ``FAL_KEY`` or the managed Nous gateway; output is an HTTPS URL.
)ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚTuple)ÚVideoGenProviderÚerror_responseÚsuccess_responsec               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )é   ÚdisplayÚstrÚspeedÚtierÚ	strengthsÚtextúOptional[str]ÚimageÚcapsr   Úreturnúdict[str, Any]© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/plugins/video_gen/fal/__init__.pyÚ__annotate__r      sU   € ÷ Eñ E�Sð E ð E¨Cð E¸Cð EÀ}ð EÐ]`ð EÐjmð Eð  sAñ Eó    c                ó>   € R V RVRVRVRVRVRVRRR	RR
RRRRRRR/VC# )r   r   Úpricer   r   Útext_endpointÚimage_endpointÚaspect_ratiosNÚresolutionsÚ	durationsÚaudioFÚnegativeÚseedr   )r   r   r   r   r   r   r   s   &&&&&&,r   Ú_familyr'      sc   € Ø�w ¨°¸¸vÀtÈ[ÐZcÐetÐvzð  }Mð  OTØ˜T =°$¸ÀTÈ7ÐTYÐ[eÐglÐntÐv{ðEð @DðEð Er   Ú480pÚ768PÚ540pÚ720pÚ768pÚ1080pÚ2KÚ2kÚ4kÚ4KÚ2160pÚ480PÚ1080Pzltx-2.3zLTX 2.3 (22B)z~30-60sÚcheapz322B model with native audio generation. Affordable.z fal-ai/ltx-2.3-22b/text-to-videoz!fal-ai/ltx-2.3-22b/image-to-videoT)r$   r%   r&   zltx-2.5zLTX 2.5z~30-90szdLightricks open-source audio-video model. Native audio, up to 20s / 4K (i2v), camera-motion presets.z%lightricks/ltx-2.5/text-to-video/fastz&lightricks/ltx-2.5/image-to-video/fastÚ1440p)Úduration_intr!   r"   Úresolution_aliasesr#   Úduration_enumÚduration_cap_by_resolutionr$   zpixverse-v6zPixverse v6z.Affordable. Negative prompts. 1-15s durations.z fal-ai/pixverse/v6/text-to-videoz!fal-ai/pixverse/v6/image-to-video)r"   r#   r$   r%   r&   zseedance-2.0-minizSeedance 2.0 MinizAByteDance. Faster/cheaper Seedance tier, audio + lip-sync, 4-15s.z)bytedance/seedance-2.0/mini/text-to-videoz*bytedance/seedance-2.0/mini/image-to-video)r!   r"   r#   r$   zveo3.1zVeo 3.1z~60-120sÚpremiumzBGoogle DeepMind. Cinematic, native audio, strong prompt adherence.zfal-ai/veo3.1zfal-ai/veo3.1/image-to-videoÚs)r!   r"   r#   r9   Úduration_suffixr$   r%   r&   zseedance-2.0zSeedance 2.0z;ByteDance. Cinematic, synchronized audio + lip-sync, 4-15s.z$bytedance/seedance-2.0/text-to-videoz%bytedance/seedance-2.0/image-to-videozseedance-2.5zSeedance 2.5z~60-180szUByteDance flagship. Native 30s single-pass, audio in the same latent space, lip-sync.z$bytedance/seedance-2.5/text-to-videoz%bytedance/seedance-2.5/image-to-video)r!   Úimage_drop_keysr"   r#   r$   z
minimax-h3z
MiniMax H3zCMiniMax frontier. Native 2K (up to 4K), 5-15s, seven aspect ratios.zminimax/h3/text-to-videozminimax/h3/image-to-video)r7   r>   r!   r"   r8   r#   Úaudio_nativezminimax-h3-maxzMiniMax H3 Max (fal post-train)z~5-30szffal's post-trained MiniMax H3. Top-ranked quality/prompt adherence/aesthetics, 768p in seconds, 5-15s.zminimax/h3-max/text-to-videozminimax/h3-max/image-to-videoÚprompt_expansion_modeÚbalanced)	r7   r>   r!   r"   r8   r#   Ústatic_payloadr?   r&   zminimax-h3-max-turboz%MiniMax H3 Max Turbo (fal post-train)z~5-20sznfal's throughput-tuned H3 Max variant. Near-Max quality at a fraction of the price/latency, 480P-1080P, 5-15s.z"minimax/h3-max-turbo/text-to-videoz#minimax/h3-max-turbo/image-to-videozflux-3zFLUX 3 (via FAL)zGBlack Forest Labs frontier video. Native audio, 5-20s, 8 aspect ratios.z$blackforestlabs/flux-3/text-to-videoz%blackforestlabs/flux-3/image-to-video)r7   r!   r"   r#   r$   zgrok-imagine-1.5zGrok Imagine 1.5 (via FAL)z=xAI. Fast stylized video with audio, 1-15s, cheap per second.z)xai/grok-imagine-video/v1.5/text-to-videoz*xai/grok-imagine-video/v1.5/image-to-video)r7   r>   r!   r"   r#   r?   zgemini-omni-flashzGemini Omni Flash 1.1 (via FAL)zZGoogle. Text & image to video with native audio, physics-grounded motion, up to 4K, 3-10s.z+google/gemini-omni-flash/v1.1/text-to-videoz,google/gemini-omni-flash/v1.1/image-to-video)r7   r!   r"   r#   r?   zkling-v3zKling 3.0 (Standard)zDKuaishou frontier core model. Cinematic motion, native audio, 3-15s.z,fal-ai/kling-video/v3/standard/text-to-videoz-fal-ai/kling-video/v3/standard/image-to-videoÚstart_image_url)Úimage_param_keyr>   r!   r#   r$   r%   zkling-v3-prozKling 3.0 ProzBKling 3.0 top quality tier. Cinematic motion, native audio, 3-15s.z'fal-ai/kling-video/v3/pro/text-to-videoz(fal-ai/kling-video/v3/pro/image-to-videozkling-v3-4kzKling v3 4Kz	~120-300sz14K output, native audio (Chinese/English), 3-15s.z&fal-ai/kling-video/v3/4k/text-to-videoz'fal-ai/kling-video/v3/4k/image-to-video)rD   r!   r#   r$   r%   r&   zkling-o3zKling O3 (Standard)zIKuaishou frontier. Multi-shot native storytelling, optional audio, 3-15s.z,fal-ai/kling-video/o3/standard/text-to-videoz-fal-ai/kling-video/o3/standard/image-to-video)r>   r!   r#   r$   zwan-3.0zWan 3.0zEAlibaba latest gen. 2-30s clips, native audio, up to 1080p, lip-sync.zalibaba/wan-3.0/text-to-videozalibaba/wan-3.0/image-to-videor$   )rD   r7   Úaudio_param_keyr!   r"   r#   r$   r&   zwan-3.0-primezWan 3.0 PrimezMAlibaba premium tier. Faster iteration, higher fidelity, 2-30s, native audio.z#alibaba/wan-3.0-prime/text-to-videoz$alibaba/wan-3.0-prime/image-to-videozhappy-horsezHappy Horse 1.1zYAlibaba flagship. 1080p, native audio + multilingual lip-sync, 3-15s, nine aspect ratios.z&alibaba/happy-horse/v1.1/text-to-videoz'alibaba/happy-horse/v1.1/image-to-video)r7   r>   r!   r"   r#   r?   r&   zdict[str, dict[str, Any]]ÚFAL_FAMILIESc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úfamilyr   ÚdurationúOptional[int]Ú
resolutionr   r   r   )r   s   "r   r   r   }   s*   € ÷ 9ñ 9˜Nð 9°mð 9ÐQ^ð 9Ðjwñ 9r   c                ó  a€ Sf   R# V P                  R4      pV'       d   \        VV3R lR7      pM!V R,          w  rV\        V\        VS4      4      pV P                  R4      ;'       g    / P                  V4      pVf   V# \        WG4      # )a'  Snap to the nearest ``duration_enum`` entry when the family declares one, else clamp into the ``durations``
``(min, max)`` range; None stays None (endpoint default). A ``duration_cap_by_resolution`` ceiling for the resolved
*resolution* is applied last (fal rejects LTX 2.5 >10s at 1440p/2160p).Nr9   c                ó(   <€ \        V S,
          4      # ©N)Úabs)ÚdrI   s   &€r   Ú<lambda>Ú!_clamp_duration.<locals>.<lambda>…   s   ø€ ¬#¨a°(­lÔ*;r   )Úkeyr#   r:   )ÚgetÚminÚmax)rH   rI   rK   ÚenumÚclampedÚloÚhiÚcaps   &f&     r   Ú_clamp_durationr\   }   s�   ø€ ð ÒÙØ�:‰:�oÓ&€DßÜ�dÔ ;Ô<‰à˜Õ$‰ˆÜ�bœ#˜b (Ó+Ó,ˆØ�:‰:Ð2Ó3×9Ð9°r×
>Ñ
>¸zÓ
J€CØ’kˆ7Ð8¤s¨7Ó'8Ð8r   c               ó    € V ^8„  d   QhRRRR/# )r   Úmetar   r   z	list[str]r   )r   s   "r   r   r   �   s   € ÷ Cñ C�nð C¨ñ Cr   c                óV   € R Uu. uF  qV R2,          '       g   K  VNK  	  up# u upi )r   Ú	_endpoint)r   r   r   )r^   Úms   & r   Ú_modalitiesrb   �   s,   € Ù(ÓBÑ(�!°A°3°i°×,AÑ,A�AˆAÑ(ÑBÐBùÒBs   …&�&c               ó    € V ^8„  d   QhRRRR/# )r   Úcr   r   r   r   )r   s   "r   r   r   ‘   s   € ÷ #ñ #˜Sð # ]ñ #r   c           
     óÔ  a € S P                  4       o S '       d   S \        9   d   S ;'       g    R# \        P                  4        UUUu. uF9  w  rVR,          VR,          3 F  p\        V\        4      '       g   K  W3NK   	  K;  	  ppppV UUu. uF  w  rS V8X  g   K  VNK  	  upp;'       g’    V UUu. uFZ  w  rVP                  S R,           4      '       g   K%  V\        S 4      ^,           R P                  R^4      ^ ,          R9   g   KX  VNK\  	  upp;'       g!    \        V 3R l\         4       \        RR7      pV'       d
   V^ ,          # R# u upppi u uppi u uppi )	znKnown family ID from a bare id, full endpoint path, truncated stem (``minimax/h3``) or provider-prefixed name.Nr   r    Ú/c              3  óV   <"  € T F  qSP                  R 4      9   g   K  Vx € K   	  R# 5i)rf   N)Úsplit)Ú.0Úfidrd   s   & €r   Ú	<genexpr>Ú(_normalize_family_key.<locals>.<genexpr>�   s    øé € ÐI¡\˜c¸A¿G¹GÀC»LÑ5H—c’c£\ùs   ƒ)Ÿ
)T)rS   Úreverse)ztext-to-videozimage-to-video)	ÚstriprF   ÚitemsÚ
isinstancer   Ú
startswithÚlenrh   Úsorted)rd   rj   r^   ÚepÚ	endpointsÚhits   f     r   Ú_normalize_family_keyrw   ‘   sN  ø€ à	�‰‹	€Aß�”\Ô!Ø�yˆy�DÐÜ,8×,>Ñ,>Ô,@õ cÑ,@™y˜sØ  Õ1°4Ð8HÕ3IÓJ�RÌjÐY[Ô]`×Naô �#“ÙJñ Ñ,@€Iò cñ
  )Ô4™y‘G�C¨A°©G�CˆC™yÒ4÷ bð bÙ"+ô  S¡)‘w�s¨r¯}©}¸QÀ½W×/EŒsÈ"ÌSÐQRËVÐVWÍZÈ[È/×J_ÑJ_Ð`cÐefÓJgÐhiÕJjð  oRñ  KR�sˆs¡)ò  S÷bð bäÔI¥\ÓIÌsÐ\`Ôað ÷ ˆ3ˆq�6Ð"˜dÐ"ùôcùó
 5ùó Ss*   Á	/EÁ=EÂEÂ!EÂ8"E$Ã.E$ÄE$c               ó    € V ^8„  d   QhRRRR/# )r   Úexplicitr   r   ztuple[str, dict[str, Any]]r   )r   s   "r   r   r   ¡   s   € ÷ 6ñ 6˜mð 6Ð0Jñ 6r   c                óª  € ^ RI p ^ RIHp V! 4       p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   TM/ p\        VP                  R4      \        4      '       d   VP                  R4      M/ pWP                  P                  R4      VP                  R4      VP                  R4      3 F?  p\        V\        4      '       d   \        V4      MRpV'       g   K0  V\        V,          3u # 	  \        \        \        ,          3#   \         d$   p\        P                  RT4       Rp Rp?EL:Rp?ii ; i)z>Decide which FAL family to use. Returns ``(family_id, meta)``.N)Úload_configz#Could not load video_gen config: %sÚ	video_genÚfalÚFAL_VIDEO_MODELÚmodel)ÚosÚhermes_cli.configr{   Ú	ExceptionÚloggerÚdebugrp   ÚdictrT   Úenvironr   rw   rF   ÚDEFAULT_MODEL)ry   r€   r{   ÚcfgÚexcÚfal_cfgrd   rj   s   &       r   Ú_resolve_familyr‹   ¡   s  € ãðÝ1Ù‹mˆô #-¨S´$×"7Ò"7ˆ#�'‰'�+Ô
¸T€CÜ˜C¤×&Ò&‰#¨B€CÜ *¨3¯7©7°5«>¼4× @Ò @ˆc�g‰g�eŒnÀb€GØŸ
™
Ÿ™Ð'8Ó9¸7¿;¹;ÀwÓ;OÐQT×QXÑQXÐY`ÓQaÓbˆÜ*4°Q¼×*<Ò*<Ô# AÔ&À$ˆß‰3Øœ SÕ)Ð)Ò)ñ cô œ,¤}Õ5Ð5Ð5øô ô Ü�‰Ð:¸CÔ@ØŽûðús   †D$ Ä$EÄ/EÅEc               ó@   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRR/
# )r   rH   r   Úpromptr   Ú	image_urlr   rI   rJ   Úaspect_ratiorK   Únegative_promptr$   úOptional[bool]r&   r   r   )r   s   "r   r   r   ´   s]   € ÷ ñ ˜>ð °cð Àmð Ð_lð Ð|ð Ø"ðØ5BðØKYðØanðð tBñr   c               ó  € V P                  R4      ;'       g    / P                  T;'       g    RP                  4       V4      p	V R,          '       d   \        WV	4      MRp
VRV3Y P                  R4      ;'       g    RV3VRJ;'       d    V P                  RR	4      RV3V R
,          ;'       d    W@R
,          9   RV3V R,          ;'       d    W�R,          9   RV	3V
RJRV P                  R4      '       d   T
MV
 V P                  RR4       23V R,          ;'       d    VRJV P                  R4      ;'       g    R\        V4      3V R,          ;'       d    TRV33 UUUu/ uF  w  r¼pV'       g   K  WÍbK  	  ppppV'       d   V P                  RR4      MR F  pVP	                  VR4       K  	  V P                  R4      ;'       g    / P                  4        F  w  rÍVP                  WÍ4       K  	  V# u upppi )us   Build a family-specific payload, dropping keys the family doesn't declare (unsupported enums â†’ endpoint default).r8   Ú r#   Nr�   rD   rŽ   r&   Tr!   r�   r"   rK   rI   r7   r=   r$   rE   Úgenerate_audior%   r�   r>   rB   r   )rT   Úlowerr\   ÚboolÚpopro   Ú
setdefault)rH   r�   rŽ   rI   r�   rK   r�   r$   r&   ÚresolvedrX   ÚokrS   ÚvalueÚpayloads   &$$$$$$$$      r   Ú_build_payloadr�   ´   s  € ð —
‘
Ð/Ó0×6Ð6°B×;Ñ;¸Z×=MÐ=MÈ2×<TÑ<TÓ<VÐXbÓc€HØ=CÀK×=PÔ=PŒo˜f°Ô9ÐVZ€Gà	�˜6Ð"Ø	—J‘JÐ0Ó1×@Ð@°[À)ÐLà	�TÐ	×	6Ð	6˜fŸj™j¨°Ó6¸ÀÐEØ	�Õ	 ×	LÐ	L \¸OÕ5LÑ%LÈnÐ^jÐkØ	�Õ	×	DÐ	D 8°mÕ/DÑ#DÀlÐT\Ð]à	˜Ð	˜j°V·Z±ZÀ×5OÒ5O©'ÐX_ÐW`Ðag×akÑakÐl}ð  @Bó  bCð  aDð  VEð  	FØ	��×	.Ð	.˜U¨$Ð.°·
±
Ð;LÓ0M×0aÐ0aÐQaÔcgÐhmÓcnÐoØ	�
Õ	×	/Ð	/ Ð1BÀOÐTñAõ ñ A©n¨b°uô 
ô  *˜sšzñ A€Gò ÷ 5>ˆv�z‰zÐ+¨RÔ0À2ÒEˆØ�‰�C˜Öñ Fà—z‘zÐ"2Ó3×9Ð9°r×@Ñ@ÖB‰
ˆØ×Ñ˜3Ö&ñ Cà€Nùô!s   Å$G:Å6G:c               ó    € V ^8„  d   QhRRRR/# )r   Úresultr   r   ztuple[Any, Optional[str]]r   )r   s   "r   r   r   Ì   s   € ÷ ñ  3ð Ð+Dñ r   c                óð   € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   VP                  R4      M\        V\        4      '       d   TMRpY;'       g    R3# )zJReturn ``(video_field, url)`` from a FAL result dict (url None if absent).ÚvideoNÚurl)rp   r…   rT   r   )rŸ   r¡   r¢   s   &  r   Ú_video_url_from_resultr£   Ì   sY   € ä#-¨f´d×#;Ò#;ˆF�J‰J�wÔÀ€EÜ(¨´×5Ò5ˆ%�)‰)�EÔ
ÄJÈuÔVY×DZÒDZ¹5Ð`d€CØ—+�+˜ÐÐr   r   Ú_fal_clientÚ_managed_fal_video_clientÚ _managed_fal_video_client_configc               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   ß   s   € ÷ ñ ˜#ñ r   c                 ó’   € \         ;_uu_ 4        \        f   ^ RIHp  V ! 4       s\        uuRRR4       #   + '       g   i     R# ; i)z7Lazy-load ``fal_client`` once via ``tools.fal_common``.N©Úimport_fal_client)Ú_fal_client_lockr¤   Útools.fal_commonrª   r©   s    r   Ú_load_fal_clientr­   ß   s-   € ÷ 
Ö	ÜÒÝ:Ù+Ó-ˆKÜ÷	 
×	×	Ó	ús	   �5µA	c                 óþ   € ^ RI Hp  ^ RIHpHpHpHp V! R4      pWQ8X  d"   V ! R4      pVf   \        V! RVR4      4      hV# Ve#   V! 4       '       g   \        V! RVR4      4      hR# V! 4       '       d   R# V ! R4      # )uí   Resolve the FAL video route from the stored ``video_gen`` selection: ``"nous"`` â†’ managed only (unentitled â‡’
selection-naming error); other stored provider â†’ direct only (missing FAL_KEY â‡’ error); never-configured â†’ autodetect.)Úresolve_managed_tool_gateway)ÚNOUS_MANAGED_PROVIDERÚfal_key_is_configuredÚread_selectionÚselection_errorr|   z	fal-queueNzDthe Nous Tool Gateway is not available (not entitled or unreachable)zFAL_KEY is not set)Útools.managed_tool_gatewayr¯   Útools.tool_backend_helpersr°   r±   r²   r³   Ú
ValueError)r¯   r°   r±   r²   r³   ÚselectedÚgateways          r   Ú"_resolve_managed_fal_video_gatewayr¹   é   s•   € õ HßxÓxÙ˜kÓ*€HØÔ(Ù.¨{Ó;ˆØŠ?Ü™_¨[Ð:Oð  RXó  Yó  Zð  ZØˆØÒÙ$×&Ò&Ü™_¨[¸(ÐDXÓYÓZÐZÙÙ(×*Ò*ˆ4ÐYÑ0LÈ[Ó0YÐYr   c               ó   € V ^8„  d   QhRR/# ©r   r   r–   r   )r   s   "r   r   r   û   s   € ÷ Wñ W˜dñ Wr   c                 óD   € ^ RI Hp  \        4       RJ;'       g    V ! 4       # )zsTrue if the selected (or, never-configured, any) FAL backend is reachable; raises on a stored-but-broken selection.©r±   N)rµ   r±   r¹   r½   s    r   Ú_fal_video_availabler¾   û   s   € å@Ü-Ó/°tÐ;×VÐVÑ?TÓ?VÐVr   c                ó:  € ^ RI Hp V P                  P                  R4      V P                  3p\
        ;_uu_ 4        \        e   \        V8w  d*   V! \        4       V P                  V P                  R7      sVs\        uuRRR4       #   + '       g   i     R# ; i)zQReuse the managed FAL client so its internal httpx.Client is not leaked per call.)Ú_ManagedFalSyncClientrf   N)rS   Úqueue_run_origin)	r¬   rÀ   Úgateway_originÚrstripÚnous_user_tokenÚ_managed_fal_video_client_lockr¥   r¦   r­   )Úmanaged_gatewayrÀ   Úclient_configs   &  r   Ú_get_managed_fal_video_clientrÈ     sy   € õ 7Ø$×3Ñ3×:Ñ:¸3Ó?À×A`ÑA`Ða€Mß	'Ö	'Ü$Ò,Ô0PÐTaÔ0aÙ(=Ô>NÓ>PÐVe×VuÑVuØO^×OmÑOmô)oÐ%à/<Ð,Ü(÷ 
(×	'×	'Ó	'ús   ¼AB	Â	B	c               ó    € V ^8„  d   QhRRRR/# )r   Úendpointr   Ú	argumentsr   r   )r   s   "r   r   r     s   € ÷ ñ ¨ð ¸ñ r   c           	     ó¦  a aa
€ \        4       pR\        \        P                  ! 4       4      /p\	        4       o
S
f   VP                  S SVR7      # ^ RIHpHpH	p  V! VV V
3R lRS R7      #   \         dZ   pT! T4      pTeH   RTu;8:  d   R	8  d9   M h T! TR
4      p	T	e   \        RS  RT RT	 24      Th\        RS  RT R24      Thh Rp?ii ; i)z]Submit via direct credentials or the managed queue gateway; ``wait_fal_queue_result`` blocks.zx-idempotency-keyN©rË   Úheaders)Ú_extract_http_statusÚ_managed_fal_billing_errorÚ(submit_managed_fal_with_rate_limit_retryc                ó>   <€ \        S4      P                  SSV R 7      # )rÍ   )rÈ   Úsubmit)Úrequest_headersrË   rÊ   rÆ   s   &€€€r   rQ   Ú+_submit_fal_video_request.<locals>.<lambda>  s$   ø€ Ô$AÀ/Ó$R×$YÑ$YØ I°ð %Zô %Hr   zvideo endpoint)ÚwhatÚnamei�  iô  rÊ   z-Nous Subscription gateway rejected endpoint 'z' (HTTP z): uÓ   ). This model may not yet be enabled on the Nous Portal's FAL proxy. Either:
  â€¢ Set FAL_KEY in your environment to use FAL.ai directly, or
  â€¢ Pick a different model via `hermes tools` â†’ Video Generation.)r­   r   ÚuuidÚuuid4r¹   rÓ   r¬   rÏ   rÐ   rÑ   r‚   r¶   )rÊ   rË   ÚclientrÎ   rÏ   rÐ   rÑ   r‰   ÚstatusÚbillingrÆ   s   ff        @r   Ú_submit_fal_video_requestrÝ     s  ú€ äÓ€FØ"¤C¬¯
ª
«Ó$5Ð6€GÜ8Ó:€OØÒØ�}‰}˜X°ÀGˆ}ÓLÐL÷ñ ðÙ7öHà!¨ô2ð 	2øô ô 
Ù% cÓ*ˆØÒ #¨Ö"5°#Ö"5ð 	ñ 1°°jÓAˆGØÒ"Ü ØCÀHÀ:ÈXÐV\ÐU]Ð]`ÐahÐ`iÐjólØqtðuäÐLÈXÈJÐV^Ð_eÐ^fð geð fó gàloðpð 	ûð
ús   ÁA, Á,CÁ7ACÃCzfal-ai/seedvr/upscale/videoc               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	video_urlr   Úsource_request_idr   r   r   )r   s   "r   r   r   /  s!   € ÷ ñ ˜cð °mð È}ñ r   c                ó„  €  \         P                  R\        4       RV RRR\        /p\        4       e   V'       g   \	        R4      hWR&   ^ R	IHp V! \        \        V4      4      p\        T4      w  rgT'       g   \         P                  R4       T#   \         d"   p\         P                  R
T4        Rp?R# Rp?ii ; i)zHBest-effort SeedVR2 upscale; returns the new URL or None (never raises).z%Upscaling video with SeedVR2 (%dx)...rß   Úupscale_modeÚfactorÚupscale_factorNz9Managed SeedVR upscale requires the source FAL request idrà   ©Úwait_fal_queue_resultzVideo upscale failed: %szVideo upscaler returned no URL)rƒ   ÚinfoÚUPSCALER_FACTORr¹   ÚRuntimeErrorr¬   ræ   rÝ   ÚUPSCALER_ENDPOINTr‚   Úwarningr£   )rß   rà   rË   ræ   rŸ   r‰   Ú_videor¢   s   &&      r   Ú_upscale_videorí   /  s©   € ðÜ�‰Ð;¼_ÔMØ%0°)¸^ÈXÐWgÔixÐ$yˆ	Ü-Ó/Ò;ß$Ü"Ð#^Ó_Ð_Ø->Ð)Ñ*Ý:Ù&Ô'@ÔARÐT]Ó'^Ó_ˆô )¨Ó0�K€FßÜ�‰Ð7Ô8Ø€Jøô ô Ü�‰Ð1°3Ô7Ýûðús   ‚9B ¼+B ÂB?ÂB:Â:B?u«   No FAL backend available. Either set FAL_KEY (run `hermes tools` â†’ Video Generation â†’ FAL to configure) or sign in to Nous (`hermes setup`) for managed gateway access.r   uƒ   FAL family {fid} has no image-to-video endpoint. Pick a family with image-to-video support via `hermes tools` â†’ Video Generation.r   z�FAL family {fid} has no text-to-video endpoint. Pass an image_url to use its image-to-video endpoint, or pick a different family.c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   Úerrorr   Ú
error_typer�   r   r�   r   r   r   )r   s   "r   r   r   K  s@   € ÷ Eñ E�cð E sð E°Cð EÀð EÐX[ð EÐesñ Er   c           	     ó    € \        WR W2VR7      # )r}   )rï   rð   Úproviderr   r�   r�   )r	   )rï   rð   r�   r   r�   s   &&&&&r   Ú
_fal_errorró   K  s   € Ü ÀuÐTYð  xDô  Eð  Er   c                  ó–   € ] tR tRtRtRtRtR R ltR R ltR	 R
 lt	R R lt
R R ltRRRRRRRRRRRRRRRRRRRR/
R R lltRtR# )ÚFALVideoGenProvideriO  zFFAL.ai multi-family backend; routes t2v/i2v on ``image_url`` presence.r}   ÚFALc               ó   € V ^8„  d   QhRR/# r»   r   )r   s   "r   r   Ú FALVideoGenProvider.__annotate__U  s   € ÷ ñ ˜dñ r   c                	ó<   €  \        4       #   \         d     R # i ; i)F)r¾   r‚   ©Úselfs   &r   Úis_availableÚ FALVideoGenProvider.is_availableU  s"   € ð	Ü'Ó)Ð)øÜô 	Úð	ús   ‚	 Œšc               ó   € V ^8„  d   QhRR/# )r   r   zlist[dict[str, Any]]r   )r   s   "r   r   rø   \  s   € ÷ 7ñ 7Ð1ñ 7r   c                	ó  € \         P                  4        UUUu. uFY  w  rR V/R Uu/ uF  q3W#,          bK  	  upCR\        V4      /CVR,          ;p'       d   R\        V4      R\	        V4      /M/ CNK[  	  uppp# u upi u upppi )ÚidÚ
modalitiesr#   Úmin_durationÚmax_duration)r   r   r   r   r   )rF   ro   rb   rU   rV   )rû   rj   r^   ÚkrP   s   &    r   Úlist_modelsÚFALVideoGenProvider.list_models\  s¨   € ô ".×!3Ñ!3Ô!5õ7á!5‘I�Cð �sð kÑ3eÓfÑ3e¨a $¥'šzÑ3eÑfð kÐhtô  wBð  CGó  wHñ kØNRÐS^ÕN_ÐI_ÈÖI_�^¤S¨£V¨^¼SÀ»VÑDÐfhóká!5ó7ð 	7ùÒfùô 7s   ™B§A=¸A BÁ=Bc               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   rø   a  s   € ÷ ñ ˜}ñ r   c                	ó   € \         # rN   )r‡   rú   s   &r   Údefault_modelÚ!FALVideoGenProvider.default_modela  s   € ÜÐr   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   rø   d  s   € ÷ Iñ I .ñ Ir   c                	ó$   € R RRRRRRRRR	R
/.RR/# )r×   rö   ÚbadgeÚpaidÚenv_varsrS   ÚFAL_KEYr�   zFAL.ai API keyr¢   zhttps://fal.ai/dashboard/keysÚtagu®   LTX 2.3/2.5, Pixverse, Seedance 2.0/2.5/Mini, Veo 3.1, MiniMax H3, FLUX 3, Kling 3.0/4K/O3, Wan 3.0, Happy Horse, Grok Imagine, Gemini Omni â€” text-to-video & image-to-videor   rú   s   &r   Úget_setup_schemaÚ$FALVideoGenProvider.get_setup_schemad  sB   € Ø˜˜w¨°
¸eÀYÐPXÐZjÐlqð  tSð  >Tð  =UØð HðIð 	Ir   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rø   i  s   € ÷ Vñ V˜nñ Vr   c                	óV  €  \        R 4      w  rV'       dÎ   VR,          ;'       g    RpR\        V4      ;'       g    R.R\        VR,          ;'       g    . 4      R\        VR,          ;'       g    . 4      R\	        V4      R\        V4      R\        VR	,          4      R
\        VP                  R4      4      R\        VR,          4      R\        VR,          4      RRR^ /# \        P                  4        Uu. uF  qDR,          '       g   K  VR,          NK  	  ppRRR.R. ROR. ROR\	        ^.V Uu. uF  p\	        V4      NK  	  up,           4      R\        V Uu. uF  p\        V4      NK  	  up^R7      RRRRRRRRR^ /
#   \         d    R p EL‰i ; iu upi u upi u upi )Nr#   r  r   r!   r"   r  r  Úsupports_audior$   Úaudio_always_onr?   Úsupports_negative_promptr%   Úsupports_seedr&   Úsupports_upscaleTÚmax_reference_imagesr   )Údefault)é   r  ©ú16:9ú9:16ú1:1©Ú360pr*   r+   r-   )
r‹   r‚   rb   ÚlistrV   rU   r–   rT   rF   Úvalues)rû   Ú
_family_idrH   r#   ra   ÚspansrP   s   &      r   ÚcapabilitiesÚ FALVideoGenProvider.capabilitiesi  sÎ  € ð	ä!0°Ó!6ÑˆJ÷ Ø˜{Õ+×5Ð5¨vˆIØ ¤+¨fÓ"5×"AÐ"A¸&¸À?ÔTXÐY_Ð`oÕYp×YvÐYvÐtvÓTwØ!¤4¨¨}Õ(=×(CÐ(CÀÓ#DÀnÔVYÐZcÓVdÐftÔvyð  {Dó  wEØ$¤d¨6°'­?Ó&;Ð=NÔPTÐU[×U_ÑU_Ð`nÓUoÓPpØ.´°V¸JÕ5GÓ0HÈ/Ô[_Ð`fÐgmÕ`nÓ[oØ&¨Ð.DÀað	Ið Iô
 *6×)<Ñ)<Ô)>ÓQÑ)> AÀKÇ.Á.”��;—�Ñ)>ˆÐQØ˜v wÐ/°ÒBYÐ[hò  kLØ¤ Q C¹5Ó*A¹5°a¬3¨q®6¹5Ñ*AÕ$AÓ BÀNÔTWÑinÓXoÑinÐdeÔY\Ð]^ÖY_ÑinÑXoÐyzÔT{Ø  $Ð(BÀDÈ/Ð[_ÐasÐuyð  |Rð  TUðVð 	Vøô ô 	Ø‹Fð	üò Rùâ*AùÒXos)   ‚F Ã:FÄFÄ6F!Å F&ÆFÆFr   NrŽ   Úreference_image_urlsrI   r�   r   rK   r+   r�   r$   r&   Úupscalec               óL   € V ^8„  d   Qh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   r   r   rŽ   r+  zOptional[list[str]]rI   rJ   r�   rK   r�   r$   r‘   r&   r,  Úkwargsr   r   r   r   )r   s   "r   r   rø   |  s†   € ÷ 0
ñ 0
Øð0
Ø%2ð0
ØFSð0
ð sFð0
àð0
à69ð0
àPSð0
ào|ð0
ð ð0
ð -:ð0
ð LZð0
ð mpð0
ð 
ñ	0
r   c       
        	óì  €  \        4       '       g   \        \        R V4      #   \        4        T;'       g    RP                  4       p\        T4      w  rïT;'       g    RP                  4       ;'       g    RpT'       d   RMRpTT R2,          pT'       g*   \        \        T,          P                  TR7      R	YR
7      # T'       g   \        RRYR
7      # \        YñTYVYxYšR7	      p ^ RIHp \        TT4      p\        TRR4      p\!        T! T4      4      w  ppT'       g   \        RRYR
7      # T'       d   \)        TT4      MRp\+        T4      pT'       d   T'       g   \$        P'                  R4       T;'       g    TpRTRT/T'       d	   R\,        /M/ Cp\/        T\0        4      '       dM   TP3                  T'       d   R"MR# Uu/ uF&  pTP5                  T4      '       g   K  TTT,          bK(  	  up4       \7        TYáTRTRT9   d   TMRRT9   dA   \9        RP;                  R \	        TR,          4       4       4      ;'       g    R 4      R!7      # ^ R!7      #   \         d!   p\        \	        T4      R T4      u Rp?# Rp?ii ; i  \         d    \        RRT4      u # i ; i  \"         d7   p\$        P'                  RTTTRR7       \        RT 2RYTR7      u Rp?# Rp?ii ; iu upi )$Úauth_requiredNz@fal_client Python package not installed (pip install fal-client)Úmissing_dependencyr“   r   r   r`   )rj   Úmodality_unsupported)r   zprompt is required.Úmissing_prompt)r�   rŽ   rI   r�   rK   r�   r$   r&   rå   Ú
request_idz1FAL video gen failed (family=%s, endpoint=%s): %sT)Úexc_infozFAL video generation failed: Ú	api_error)r   r�   z%FAL returned no video URL in responseÚempty_responseu?   Video upscale pass failed â€” returning native-resolution videorÊ   Úupscaledrä   r}   r�   rI   c              3  óT   "  € T F  qP                  4       '       g   K  Vx € K   	  R # 5irN   )Úisdigit)ri   rd   s   & r   rk   Ú/FALVideoGenProvider.generate.<locals>.<genexpr>«  s   é € Ð TÑ,D qÏ	É	Ï§¢Ó,Dùs   ‚(ž
(Ú0)r¡   r   r�   Úmodalityrò   Úextrar�   rI   )Úcontent_type)Ú	file_sizer?  )r¾   ró   Ú_NO_BACKEND_MSGr¶   r   r­   ÚImportErrorrn   r‹   Ú_MODALITY_MISSING_MSGr   r�   r¬   ræ   rÝ   Úgetattrr£   r‚   rƒ   rë   rí   r–   rè   rp   r…   ÚupdaterT   r
   ÚintÚjoin)rû   r�   r   rŽ   r+  rI   r�   rK   r�   r$   r&   r,  r.  r‰   Ú	family_idrH   Úimage_url_normÚmodality_usedrÊ   rœ   ræ   Úhandlerà   r¡   r¢   Úupscaled_urlr8  r>  r  s   &&$$$$$$$$$$,                r   ÚgenerateÚFALVideoGenProvider.generate|  s  € ð
	AÜ'×)Ò)Ü!¤/°?ÀFÓKÐKð *ð	@ÜÔð —,�,˜B×%Ñ%Ó'ˆÜ+¨EÓ2Ñˆ	Ø#Ÿ/˜/ r×0Ñ0Ó2×:Ð:°dˆß#1™°vˆØ˜]˜O¨9Ð5Õ6ˆßÜÔ3°MÕB×IÑIÈiÐIÓXÐZpÐrxô  Kð  KßÜÐ3Ð5EÀvÔ_Ð_Ü  À.Ð[cØ,6Ð_dôqˆð	FÝ>Ü.¨x¸ÓAˆFÜ '¨°¸dÓ CÐÜ/Ñ0EÀfÓ0MÓN‰JˆE�3÷ ÜÐEÐGWÐY_ÔqÐqçAH”~ cÐ+<Ô=ÈdˆÜ˜Ó%ˆßŸ8Ü�N‰NÐ\Ô]Ø×!Ð!˜cˆØ!+¨X°zÀ8ð  !J×wÐQaÔcrÑPsð  FHð  !JˆÜ�eœT×"Ò"Ø�L‰LÇXÑ0AÐSpÐ0pó  CÑ0p¨!Ðuz×u~Ñu~ð  @A÷  vBœ+˜!˜U 1�Xš+Ñ0pñ  Cô  DÜØ˜YÀÐX]ÐejØ)7¸7Ô)B™ÈØ`jÐnuÔ`u”S˜Ÿ™Ñ T¬C°¸
Õ0CÔ,DÓ TÓT×[Ð[ÐX[Ó\ô
ð 	
ð |}ô
ð 	
øôI ô 	AÜœc #›h¨¸Ó@Õ@ûð	Aûô ô 	@ÜÐ`ÐbvÐx~ÓÒð	@ûô$ ô 	FÜ�N‰NÐNÐPYÐ[cÐehÐswˆNÔxÜÐ =¸c¸UÐCÀ[ÐRXð  yEô  Fõ  Fûð	Füò CsX   ‚ I! ¥
J Ã*3J- ÇK1Ç*K1É!JÉ,JÊJÊJÊJ*Ê)J*Ê-K.Ê8+K)Ë#K.Ë)K.r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r×   Údisplay_namerü   r  r	  r  r)  rM  Ú__static_attributes__r   r   r   rõ   rõ   O  s•   † ÙPà€DØ€Lõõ7õ
õIõ
Vð&0
Ø59ð0
ØVZð0
ð IMð0
à"&ð0
à<Bð0
àV\ð0
ð @Dð0
ð !%ð0
ð =Að0
ð ]a÷0
ó 0
r   rõ   c               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   r   ¯  s   € ÷ ;ñ ;�Tñ ;r   c                ó8   € V P                  \        4       4       R# )uF   Plugin entry point â€” wire ``FALVideoGenProvider`` into the registry.N)Úregister_video_gen_providerrõ   )Úctxs   &r   Úregisterr[  ¯  s   € à×#Ñ#Ô$7Ó$9Ö:r   )ú21:9r   ú4:3r"  ú3:4r!  )r   r!  )r+   r-   r6   r2   )é   é   r#  )r  é   )r(   r+   )é   ra  )r+   r-   r0   )rb  é   )rb  r_  rc  )r(   r+   r-   )r�   )rb  é   )r)   r.   r1   )é   ra  )r3   r)   )r3   r)   r4   )r\  z2:1r   r]  r"  r^  r!  )r+   r-   )re  r`  )r   r]  z3:2r"  z2:3r^  r!  )r$  r+   r-   r0   )é   é
   r  )rf  ra  )r   r]  r"  r^  r!  )r   rd  )	r   r!  r"  r]  r^  r\  z9:21z5:4z4:5rN   )r“   r“   )7Ú__conditional_annotations__rS  Ú
__future__r   ÚloggingÚ	threadingrØ   Útypingr   r   r   r   r   Úagent.video_gen_providerr   r	   r
   Ú	getLoggerrO  rƒ   r'   Ú_SIX_ASPECTSÚ_H3_ALIASESÚ_H3_MAX_ALIASESÚ_H3_MAX_TURBO_ALIASESÚtupleÚrangerF   Ú__annotations__r‡   r\   rb   rw   r‹   r�   r£   r¤   ÚLockr«   r¥   r¦   rÅ   r­   r¹   r¾   rÈ   rÝ   rê   rè   rí   rA  rC  ró   rõ   r[  )rh  s   @r   Ú<module>rw     s  øðôõ #ã Û Û ß 3Õ 3ç WÑ Wà	×	Ò	˜8Ó	$€õEð
 =€à�v˜v v¨v°v¸vÀvÈwÐX\Ð^bÐdhÐjnÐptÐv}ð  @Dð  E€Ø˜6 6¨6°6¸6À6È6ÐSZÐ\bÐdhÐjpÐrvÐx~ð  AHð  JPð  Q€Ø ¨°¸ÀÈÐQWÐY`ÐbiÐkoÐqxÐz~ð  AHð  JQð  SZð  [Ð ðR+à‰w�¨	°7Ð<qØ9Ð;^ÐfjÐuyð  AEôFðR+ð
 ‰w�y )¨Wð  7]Ø>Ð@hÐw{ð  L\Ø#FÐ\`ÐbiÐkoÐqxÐ[yØ!(¹¹eÀAÀrÈ1»oÓ8NÐlsÐuwð  zAð  CEð  lFð  NRôSðR+ð ‘7˜=¨)°WÐ>nð  qSØ>ÐLmð  zAð  IMð  X\ð  cgôhðR+ð ™Ð!4°iÀð  KNØ!LÐNzð  KWØ-=ÈÐX\ô^ðR+ð ‰g�i ¨YÐ8|ð  NØ4ÐDTÐbyð  FLð  \eØ&)°ÀÈ4ôQðR+ð$ ‘G˜N¨J¸	ð  DAØBÐDkð  |HØ(AÈWÐ\`ôbð%R+ð* ‘G˜N¨J¸	ð  D[ØBÐDkð  |HØ,=ÐK[ÐgnÐvzô|ð+R+ð0 ‘'˜,¨
°Ið  @EØ4Ð6QÐ`dð  wHØ(4ÐBVÐkvð  CJð  Y]ô^ð1R+ð8 ‘gÐ?ÀÈ9ð WNØOmð  pOØ+/ÐARÐbnð  }MØ1@ÈGÐe|ð  Ið  eJð  Y]ð  dhôið9R+ðD ™GÐ$KÈXÐW`ð ceð gKØ$IÐX\Ðnð  P\Ø0IÐ^sð  @GØ4KÈZÐ3XÐgkÐrvô	xðER+ðN ‰gÐ(¨*°ið  BKØ<Ð>eÐtxØ$XÐfwð  DKð  SWôXðOR+ðT ™Ð <¸iÈð  UTØ KÐMyð  IMØ0Að  REØ,EÐQXÐgkômðUR+ð^ ™Ð!BÀJÐPYð  \xØ!NÐP~ð  NRØ/?ÐMlÐxð  OSôTð_R+ðh ‘Ð.°
¸Ið  HNØFÐHwð  J[Ø(9ÐI`ÐlsÐ{ð  KOôPðiR+ðn ‘G˜O¨Z¸ð  EIØEÐGqð  DUØ,=ÐMdÐpwð  @Dð  OSôTðoR+ðt ‘7˜=¨+°yÐBuð  x`ØDÐVgð  xOØ%,°DÀ4ÈdôTðuR+ð~ ‘Ð-¨z¸9ð  GRØFÐHwØ(9ÐI`ÐlsÐ{ôAðR+ðH ‰w�y *¨ið  :AØ6Ð8XÐj{ð  KOØ'.Ð>cð  rKØ!(°¸4ôAð ‘W˜_¨j¸)ð  FUØBÐDjð  }NØ*.ÀÐW|Ø)BÈgÐ]aÐhlônð ‘7Ð,¨j¸)ð  FaØCÐEnð  ~BØ+<ð  MPØ'8ÀGÐZ^Ðeiôkñ]R+€Ð'ó Rðh €÷9õ Cõ#õ 6õ&õ0ð €ˆSÓ Ø—>’>Ó#Ð ð "&Ð ˜3Ó %Ø(,Ð   #Ó ,Ø!*§¢Ó!1Ð õòZõ$Wò
)õð: 2Ð Ø€÷ð(U€ð ð  SØ
ð  PðÐ ÷Eô]
Ð*ô ]
÷@;r   