+
    kHàj«M  ã                  óv  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHtHtHtHtHt ^ RIt^ RIHtHtHt ]P0                  ! ]4      tRtR;ttR	t^^utt R
Rut!t"^ð^ut#t$0 RMmt%RR0t&^t'RNt(0 ROmt)RR0t*Rt+Rt,RRRRRRRRRRRR./R	RRRRRRRRRR.//t-R].R &   R!R/R" R# llt/R$ R% lt0R& R' lt1RPR( R) llt2R* R+ lt3R, R- lt4R. R/ lt5R0R1R2^R3]/R4 R5 llt6R6 R7 lt7 ! R8 R9]4      t8R: R; lt9R<R/R= R> llt:R?RR<R/R@ RA llt;RB RC lt<RD RE lt=RF RG lt>RHR/RI RJ llt?RK RL lt@R# )QuB  xAI Grok-Imagine video generation backend.

Text-, image- and reference-to-video through the unified video provider; edit/extend are exposed by
``tools.xai_video_tools`` via ``run_xai_video_edit`` / ``run_xai_video_extend``. Auth: xAI Grok OAuth tokens
(preferred â€” billed to the user's SuperGrok / X Premium+ subscription) or ``XAI_API_KEY``, both via
``tools.xai_http.resolve_xai_http_credentials``. With xAI storage enabled the primary ``video`` / ``public_url``
fields are the stored files-cdn HTTPS link; pass it as ``video_url`` for edit/extend (sent as ``video.url``).
)ÚannotationsN)Úclosing)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)ÚVideoGenProviderÚerror_responseÚsuccess_responsezhttps://api.x.ai/v1zgrok-imagine-videozgrok-imagine-video-1.5ú16:9Ú720pÚ480pzgrok-imagine-video-1.5-previewz!grok-imagine-video-1.5-2026-05-30z‡No xAI credentials found. Sign in via `hermes auth add xai-oauth` (SuperGrok / Premium+) or set XAI_API_KEY from https://console.x.ai/.z;(e.g. the `image`/`public_url` from a prior Imagine result)ÚdisplayzGrok Imagine VideoÚspeedz~60-240sÚ	strengthsz.Text-to-video; legacy image-to-video fallback.Úpricez:see https://docs.x.ai/developers/models/grok-imagine-videoÚ
modalitiesÚtextÚimagezGrok Imagine Video 1.5z Latest xAI image-to-video model.z(see https://docs.x.ai/developers/pricingzdict[str, dict[str, Any]]Ú_MODELSÚlogc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	é   ÚhelperÚstrÚfallbackr   Úargsr   úOptional[str]Úreturn© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/plugins/video_gen/xai/__init__.pyÚ__annotate__r$   8   s0   € ÷ ñ �cð  Sð °ð ¸=ð ÐTWñ ó    c               óœ   €  ^ RI Hp \        W@4      ! V!  #   \         d*   pT'       d   \        P                  Y%4       Tu Rp?# Rp?ii ; i)zn``tools.xai_http.<helper>(*args)``, or ``fallback`` when it is unavailable or raises (never breaks video gen).)Úxai_httpN)Útoolsr'   ÚgetattrÚ	ExceptionÚloggerÚdebug)r   r   r   r   r'   Úexcs   &&$*  r#   Ú	_xai_httpr.   8   s>   € ðÝ"Ü�xÔ(¨$Ñ/Ð/øÜô ßÜ�L‰L˜Ô"Ø�ûðús   ‚ —A¢AÁ AÁAc               ó   € V ^8„  d   QhRR/# )r   r    ztuple[str, str]r!   )r"   s   "r#   r$   r$   C   s   € ÷ Qñ Q /ñ Qr%   c                 ó$  € \        R/ RR7      ;'       g    / p \        V P                  R4      ;'       g    \        4      p\        V P                  R4      ;'       g    R4      P	                  4       VP	                  4       P                  R4      3# )u�  ``(api_key, base_url)``: runtime xai-oauth pool entry â†’ ``auth.json`` OAuth tokens â†’ ``XAI_API_KEY``
(empty key = none; callers check). ``resolve_xai_http_credentials`` already applies the profile
secret scope to both fields, so a miss stays a miss: a raw ``os.getenv`` fallback here would hand a
multiplexed secondary the default profile's key after the scoped resolver correctly returned none.Úresolve_xai_http_credentialsz"xAI credential resolver failed: %s)r   Úbase_urlÚapi_keyÚ Ú/)r.   r   ÚgetÚDEFAULT_XAI_BASE_URLÚstripÚrstrip)Úcredsr2   s     r#   Ú_resolve_xai_credentialsr;   C   su   € ô
 Ð4°bÐ>bÔc×iÐiÐgi€EÜ�5—9‘9˜ZÓ(×@Ð@Ô,@ÓA€HÜˆu�y‰y˜Ó#×)Ð) rÓ*×0Ñ0Ó2°H·N±NÓ4D×4KÑ4KÈCÓ4PÐPÐPr%   c               ó    € V ^8„  d   QhRRRR/# )r   r3   r   r    zdict[str, str]r!   )r"   s   "r#   r$   r$   M   s   € ÷ Xñ X˜#ð X .ñ Xr%   c           	     ó,   € R RV  2RRR\        RR4      /# )ÚAuthorizationzBearer zContent-Typezapplication/jsonz
User-AgentÚhermes_xai_user_agentzhermes-agent/video_gen©r.   )r3   s   &r#   Ú_xai_headersrA   M   s-   € Ø˜w w iÐ0°.ÐBTØœ)Ð$;Ð=UÓVðXð Xr%   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   Úerrorr   Ú
error_typeÚpromptÚmodelÚaspect_ratior    údict[str, Any]r!   )r"   s   "r#   r$   r$   R   s@   € ÷ Eñ E�cð E sð E°Cð EÀð EÐX[ð EÐesñ Er%   c           	     ó    € \        WR W2VR7      # )Úxai)rC   rD   ÚproviderrF   rE   rG   )r   )rC   rD   rE   rF   rG   s   &&&&&r#   Ú
_xai_errorrL   R   s   € Ü ÀuÐTYð  xDô  Eð  Er%   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úvaluer   ÚkindÚfallback_mimer    r!   )r"   s   "r#   r$   r$   V   s.   € ÷ ñ  ð ¨sð À3ð È3ñ r%   c               ó˜  € T ;'       g    RP                  4       p\        V4      P                  4       pV'       dL   VP                  4       P	                  \
        RV R23,           4      '       g   VP                  4       '       g   V#  ^ RIHp V! V4       \        P                  ! VP                  4      ^ ,          ;'       g    TpVP	                  V R24      '       d:   RV R\        P                   ! VP#                  4       4      P%                  R4       2# T#   \         d!   p\        P                  RT4        Rp?L¬Rp?ii ; i)	aO  URL/data URI accepted by xAI for ``kind`` (``image``/``video``) inputs: remote URLs and matching data URIs pass
through; a readable local file of the right MIME class is inlined as base64 (after Hermes' read deny-list /
credential-store guard, which fails open if unavailable); anything else is returned as-is so the caller rejects it.r4   zdata:r5   )Úraise_if_read_blockedz*xAI media input read guard unavailable: %sNz;base64,Úascii)r8   r   Ú
expanduserÚlowerÚ
startswithÚ_REMOTE_PREFIXESÚis_fileÚagent.file_safetyrR   r*   r+   r,   Ú	mimetypesÚ
guess_typeÚnameÚbase64Ú	b64encodeÚ
read_bytesÚdecode)rN   rO   rP   ÚrefÚpathrR   r-   Úmimes   &$$     r#   Ú_media_ref_to_xai_urlrd   V   s  € ð �;ˆ;�B×
Ñ
Ó
€CÜ�‹9×ÑÓ!€Dß�#—)‘)“+×(Ñ(Ô)9¸uÀTÀFÈ!¸_Ð<NÕ)N×OÒOÐW[×WcÑWc×WeÒWeØˆ
ð#Ý;ñ 	˜cÔ"Ü×Ò §	¡	Ó*¨1Õ-×>Ð>°€DØZ^×ZiÑZiÐmqÐlrÐrsÐjt×ZuÒZuˆU�4�&˜¤×!1Ò!1°$·/±/Ó2CÓ!D×!KÑ!KÈGÓ!TÐ UÐVÐ~Ð{~Ð~øô ô HÜ�‰ÐAÀ3×GÑGûðHús   Â
D ÄE	Ä)EÅE	c               ó    € V ^8„  d   QhRRRR/# )r   rN   r   r    úOptional[dict[str, str]]r!   )r"   s   "r#   r$   r$   h   s   € ÷ iñ i 3ð iÐ+Cñ ir%   c                óš   € \        V R RR7      pV'       d5   VP                  4       P                  \        R,           4      '       d   RV/# R# )r   zapplication/octet-stream©rO   rP   ÚurlN)zdata:image/)rd   rU   rV   rW   )rN   ra   s   & r#   Ú_image_ref_to_xai_inputrj   h   s@   € Ü
 ¨GÐC]Ô
^€Cß 3§9¡9£;×#9Ñ#9Ô:JÐM]Õ:]×#^Ò#^ˆE�3ˆ<ÐhÐdhÐhr%   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rN   r   r3   r2   r    rf   r!   )r"   s   "r#   r$   r$   m   s/   € ÷ Nñ N¨cð N¸sð NÈcð NÐVnñ Nr%   c             ƒ  ó&  "  € T ;'       g    RP                  4       pV'       d>   \        V4      P                  4       P                  4       '       d   R\	        VRRR7      /# VP                  4       P                  \        4      '       d   RV/# R# 5i)zHBuild xAI ``video`` input using a public HTTPS URL (``url`` field only).r4   ri   Úvideoz	video/mp4rh   N)r8   r   rT   rX   rd   rU   rV   rW   )rN   r3   r2   ra   s   &$$ r#   Ú_video_input_from_public_urlrn   m   sr   é € à�;ˆ;�B×
Ñ
Ó
€Cß
Œt�C‹y×#Ñ#Ó%×-Ñ-×/Ò/ØÔ,¨S°wÈkÔZÐ[Ð[ØŸ9™9›;×1Ñ1Ô2B×CÒCˆE�3ˆ<ÐMÈÐMùs   ‚"B¥A%BÂBÚhas_reference_imagesFÚmax_secondsÚdefaultc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   ÚdurationúOptional[int]ro   Úboolrp   Úintrq   r    r!   )r"   s   "r#   r$   r$   u   s9   € ÷ Eñ E˜mð EÀdð EÐadð EØ ðEØ8;ñEr%   c          	     óh   € \        \        ^\        Y e   T MT4      4      V'       d   ^
4      # T4      # )zKClamp to ``[1, max_seconds]``; reference-to-video additionally caps at 10s.)ÚminÚmax)rs   ro   rp   rq   s   &$$$r#   Ú_clamp_durationrz   u   sA   € ô Œs�1”c˜+Ò3G¡xÈWÓUÓV×^rÐXZó  Eð  Eð  yDó  Eð  Er%   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rF   r   Úmodalityr   Úexplicit_modelru   r    r!   )r"   s   "r#   r$   r$   {   s0   € ÷ 	Tñ 	T }ð 	TÀ3ð 	TÐX\ð 	TÐadñ 	Tr%   c               óØ   € T ;'       g    RP                  4       pV'       d   V'       d   V# VR8X  d   \        # V\        8H  ;'       g
    V\        9   pV'       g	   V'       g   \        # T# )zÓSelect xAI's text/video model without treating config as a prompt override: ``grok-imagine-video-1.5``
rejects text-only generation but is the desired image-to-video backend; explicit tool ``model=`` still wins.r4   r   )r8   ÚDEFAULT_IMAGE_TO_VIDEO_MODELÚ _IMAGE_TO_VIDEO_COMPAT_MODEL_IDSÚDEFAULT_TEXT_TO_VIDEO_MODEL)rF   r|   r}   Ú	requestedÚ	is_i2v_ids   &$$  r#   Ú_resolve_model_for_modalityr„   {   sZ   € ð —�˜"×#Ñ#Ó%€IßŸ)ØÐØ�7ÔÜ+Ð+ØÔ9Ñ9×jÐj¸YÔJjÑ=j€Iß*3¿9Ô&ÐSÈ)ÐSr%   c                  ó’   € ] tR t^‡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 lltRtR# )ÚXAIVideoGenProviderzxAI Grok Imagine video backend.rJ   ÚxAIc               ó   € V ^8„  d   QhRR/# ©r   r    ru   r!   )r"   s   "r#   r$   Ú XAIVideoGenProvider.__annotate__�   s   € ÷ +ñ +˜dñ +r%   c                	ó   € \        4       # ©N)Úhas_xai_video_credentials©Úselfs   &r#   Úis_availableÚ XAIVideoGenProvider.is_available�   s   € Ü(Ó*Ð*r%   c               ó   € V ^8„  d   QhRR/# )r   r    zlist[dict[str, Any]]r!   )r"   s   "r#   r$   rŠ   �   s   € ÷ Fñ FÐ1ñ Fr%   c                	óf   € \         P                  4        UUu. uF  w  rR V/VCNK  	  upp# u uppi )Úid)r   Úitems)r�   ÚmidÚmetas   &  r#   Úlist_modelsÚXAIVideoGenProvider.list_models�   s,   € Ü5<·]±]´_ÔE±_©	¨��sÐ#˜dÓ#±_ÒEÐEùÓEs   ˜-c               ó   € V ^8„  d   QhRR/# )r   r    r   r!   )r"   s   "r#   r$   rŠ   “   s   € ÷ ñ ˜}ñ r%   c                	ó   € \         # rŒ   )ÚDEFAULT_MODELrŽ   s   &r#   Údefault_modelÚ!XAIVideoGenProvider.default_model“   s   € ÜÐr%   c               ó   € V ^8„  d   QhRR/# ©r   r    rH   r!   )r"   s   "r#   r$   rŠ   –   s   € ÷ sñ s .ñ sr%   c           
     	ó`   € \        R RR4      pRV'       d   RV 2MR,           pRRRRR	VR
. RR/# )Úxai_storage_notice_textr4   Ú	video_genzØgrok-imagine-video for text/reference; grok-imagine-video-1.5 for image-to-video; edit/extend: pass the stored public HTTPS MP4 (`video` / `public_url` from a prior Imagine result); uses xAI Grok OAuth or XAI_API_KEYz. r\   zxAI Grok ImagineÚbadgeÚpaidÚtagÚenv_varsÚ
post_setupÚxai_grokr@   )r�   Ústorage_noticer¦   s   &  r#   Úget_setup_schemaÚ$XAIVideoGenProvider.get_setup_schema–   sQ   € ô #Ð#<¸bÀ+ÓNˆðtç-;�b˜Ð(Ñ)ÀõEˆð Ð*¨G°V¸UÀCÈÐUWÐYeÐgqÐrÐrr%   c               ó   € V ^8„  d   QhRR/# r    r!   )r"   s   "r#   r$   rŠ   Ÿ   s   € ÷ Yñ Y˜nñ Yr%   c                	ón   € R RR.R\        \        4      R\        \        4      R^R^RRR	RR
RRRR\        /
# )r   r   r   Úaspect_ratiosÚresolutionsÚmax_durationÚmin_durationÚsupports_audioFÚsupports_negative_promptÚsupports_seedTÚsupports_upscaleÚmax_reference_images)ÚsortedÚVALID_ASPECT_RATIOSÚVALID_RESOLUTIONSÚMAX_REFERENCE_IMAGESrŽ   s   &r#   ÚcapabilitiesÚ XAIVideoGenProvider.capabilitiesŸ   sc   € Ø˜v wÐ/°Ä&ÔI\ÓB]Ð_lÔntô  vGó  oHØ  N°AÐ7GÈÐPjÐlqð  tCð  EIØ" EÐ+AÔCWðYð 	Yr%   rF   NÚ	image_urlÚreference_image_urlsrs   rG   Ú
resolutionÚnegative_promptÚaudioÚseedc               óH   € 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   rE   r   rF   r   r¾   r¿   úOptional[list[str]]rs   rt   rG   rÀ   rÁ   rÂ   zOptional[bool]rÃ   Úkwargsr   r    rH   r!   )r"   s   "r#   r$   rŠ   ¤   s|   € ÷ 

ñ 

Øð

Ø%2ð

ØFSð

à1ð

àDQð

àhkð

ð ð

ð @Mð

ð ]kð

ð ð	

ð /2ð	

ð
 
ñ

r%   c       	        	ó.   € \        R \        WRVWEWgR7
      # )Ú
generationF)rE   rF   r}   r¾   r¿   rs   rG   rÀ   )Ú_run_xai_videoÚ_generate_xai_video_async)r�   rE   rF   r¾   r¿   rs   rG   rÀ   rÁ   rÂ   rÃ   rÆ   s   &&$$$$$$$$$,r#   ÚgenerateÚXAIVideoGenProvider.generate¤   s%   € ô àÔ3¸FÐ`eÐqzØ!5ÐWcô
ð 	
r%   r!   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r\   Údisplay_namer�   r˜   r�   r«   r¼   ÚDEFAULT_ASPECT_RATIOÚDEFAULT_RESOLUTIONrË   Ú__static_attributes__r!   r%   r#   r†   r†   ‡   s�   † Ù)à€DØ€Lõ+õFõõsõYð


Ø59ð

ØVZð

à48ð

àTXð

ð oCð

ð -ð

ð PTð

ð nrð

ð #÷	

ó 

r%   r†   c               ó   € V ^8„  d   QhRR/# r‰   r!   )r"   s   "r#   r$   r$   ±   s   € ÷ /ñ / 4ñ /r%   c                 ó6   € \        \        4       ^ ,          4      # )é    )ru   r;   r!   r%   r#   r�   r�   ±   s   € ÜÔ(Ó*¨1Õ-Ó.Ð.r%   rF   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rE   r   Ú	video_urlrF   r   r    rH   r!   )r"   s   "r#   r$   r$   µ   s/   € ÷ Yñ Y #ð Y°#ð Y¸mð YÐWeñ Yr%   c                ó6   € \        R \        WVRR \        R7      # )ÚeditÚedits©rE   rÚ   rF   ÚendpointÚ	operationrs   )rÉ   Ú_mutate_xai_video_asyncÚDEFAULT_DURATION)rE   rÚ   rF   s   $$$r#   Úrun_xai_video_editrã   µ   s#   € Ü˜&Ô"9À&ÐejØ#*°fÔGWôYð Yr%   rs   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rE   r   rÚ   rs   rt   rF   r   r    rH   r!   )r"   s   "r#   r$   r$   º   s<   € ÷ oñ o Cð o°Cð oÀ=ð oÐ`mð oð  zHñ or%   c                óN   € \        R \        WVRR \        V^
\        R7      R7      # )ÚextendÚ
extensions)rp   rq   rÞ   )rÉ   rá   rz   ÚDEFAULT_EXTEND_DURATION)rE   rÚ   rs   rF   s   $$$$r#   Úrun_xai_video_extendré   º   s-   € Ü˜(Ô$;ÀFÐglØ#/¸8Ü#2°8ÈÔUlÔ#môoð or%   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úlabelr   rÆ   r   r    rH   r!   )r"   s   "r#   r$   r$   À   s&   € ÷ wñ w˜#ð w°#ð w¸.ñ wr%   c               ó   € VR,          VR,          rC\        4       w  rVV'       g   \        \        RV4      #  \        \        P
                  ! 4       4      ;_uu_ 4       pVP                  V! RRVRV/VB 4      uuRRR4       #   + '       g   i     R# ; i  \         d[   p\        P                  RYRR	7       \        R
T  RT 2RTT;'       g    \        TP                  R\        4      R7      u Rp?# Rp?ii ; i)u   Resolve credentials, then drive ``flow(api_key=, base_url=, **kwargs)`` on a fresh event loop; escaped exception â†’ api_error.rE   rF   Úauth_requiredr3   r2   Nz#xAI video %s unexpected failure: %sT)Úexc_infoz
xAI video z	 failed: Ú	api_errorrG   )rF   rG   r!   )r;   rL   Ú_AUTH_REQUIRED_MSGr   ÚasyncioÚnew_event_loopÚrun_until_completer*   r+   Úwarningrœ   r6   rÓ   )	rë   ÚflowrÆ   rE   rF   r3   r2   Úloopr-   s	   "",      r#   rÉ   rÉ   À   sÝ   € à˜8Õ$ f¨W¥oˆEÜ0Ó2Ñ€GßÜÔ,¨o¸vÓFÐFðwÜ”W×+Ò+Ó-×.Ô.°$Ø×*Ñ*©4Ñ+]¸Ð+]È(Ð+]ÐV\Ñ+]Ó^÷ /×.×.Ó.ûäô wÜ�‰Ð<¸eÐSWˆÔXÜ˜J u g¨Y°s°eÐ<¸kÈ6Ø %× 6Ð 6¬ÀVÇZÁZÐP^Ô`tÓEuôwõ 	wûðwús<   ¸&B ÁBÁ9
B ÂB	ÂB ÂB ÂC=Â#AC8Ã2C=Ã8C=c               óD   € 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   r3   r   r2   rE   rF   r   r}   ru   r¾   r¿   rÅ   rs   rt   rG   rÀ   r    rH   r!   )r"   s   "r#   r$   r$   Ï   sq   € ÷  xñ  xØð xØ"ð xØ,/ð xØ8Eð xØW[ð xØhuð xà-ð xà9Fð xàVYð xàgjð xào}ñ xr%   c        
      ƒ  óÐ  "  € T;'       g    R P                  4       T;'       g    R P                  4       rRV'       d   \        V4      MRp
T;'       g    .  Uu. uF=  q»;'       g    R P                  4       '       g   K$  \        VP                  4       4      NK?  	  ppT;'       d    V
'       * R\         2R3\        V4      '       * R\         2R3V'       * RR3\	        V4      \
        8„  R\
         R	2R
3T
;'       d    TRR33 F  w  rÞpV'       g   K  \        WïV4      u # 	  T;'       g    \        P                  4       pV\        9   d   TM\        pT	;'       g    \        P                  4       P                  4       p	V	\        9   d   T	M\        p	V'       d   RMV
'       d   RMRp\        VVVR7      pV'       d3   V\        8w  d(   V'       d   \        R\         RV 2RVVR7      # \        p\        V\        V4      R7      pRVRVRVRVRV	/RV
3RV33 UUu/ uF  w  ppV'       g   K  VVbK  	  uppCp\!        WRVVRVVV	R7	      G Rj  x€L
 # u upi u uppi  L5i)r4   Nz1image_url must be a public HTTPS URL or data URI Úinvalid_image_urlz<reference_image_urls must be public HTTPS URLs or data URIs Úinvalid_reference_image_urlsz+prompt is required for xAI video generationÚmissing_promptz&reference_image_urls supports at most z images on xAIÚtoo_many_referencesz<image_url and reference_image_urls cannot be combined on xAIÚconflicting_inputsÚ	referencer   r   ©r|   r}   z xAI reference-to-video requires z; got Úunsupported_model©rF   )ro   rF   rE   rs   rG   rÀ   Úreference_imagesÚgenerationsrË   )r|   rà   rG   rs   rÀ   )r8   rj   Ú_PUBLIC_URL_HINTÚallÚlenr»   rL   rÓ   r¹   rÔ   rU   rº   r„   r�   rz   ru   Ú_submit_xai_video_payload)r3   r2   rE   rF   r}   r¾   r¿   rs   rG   rÀ   Úimage_inputri   ÚrefsÚbadÚmessagerD   Úmodality_usedÚresolved_modelÚclamped_durationÚkÚvÚpayloads   $$$$$$$$$$            r#   rÊ   rÊ   Ï   sœ  é € ð  Ÿ˜ 2×,Ñ,Ó.°·°¸b×0GÑ0GÓ0IˆIß8AÔ)¨)Ô4Àt€KØ<P×<VÐ<VÐTVÐ<VÓnÑ<V°S×[dÐ[dÐbd×ZkÑZk×ZmÔ0Ô# C§I¡I£KÖ0Ñ<V€DÐnà	×	&Ð	&˜;”Ð*[Ô\lÐ[mÐ(nð  qDð  	EÜ�‹YŒÐVÔWgÐVhÐið  lJð  	KØŒÐBÐDTÐUÜ	ˆT‹Ô)Ñ	)Ð-SÔThÐSiÐiwÐ+xð  {Pð  	QØ	×	Ð	˜Ð]Ð_sÐtó%Ñ ˆ�j÷ ‰3Ü˜g°6Ó:Ò:ñ%ð !×8Ð8Ô$8×?Ñ?ÓA€LØ#/Ô3FÔ#F‘<ÔL`€LØ×2Ð2Ô 2×9Ñ9Ó;×AÑAÓC€JØ)Ô->Ô>‘ÔDV€Jß#'‘K¿©gÈ&€MÜ0°ÀÐ_mÔn€Nç�Ô"=Ô=ßÜÐ @ÔA\Ð@]Ð]cÐdrÐcsÐtØ1°6ÀôQð Qä4ˆÜ& xÄdÈ4ÃjÔQÐØ˜¨°&¸*ÐFVÐXfÐhtð  wCð  EOð _Ø%,¨kÐ$:Ð=OÐQUÐ<VÑ#WÔ]Ñ#W™4˜1˜aÔ[\”$�!�Q’$Ñ#WÒ]ð_€Gä*¨7¸mÈWÐ_lð  yCØ8DÐO_Ðlvôx÷ xð xùò5 oùó2 ^ñxùsx   ‚"I&¥.I&ÁI&ÁIÁ&IÁ?IÂ
I&Â'AI&Ã?I&ÄI&Ä/0I&Å =I&Æ	I&Æ(,I&ÇAI&È IÈ2IÈ9I&ÉI$ÉI&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   r3   r   r2   rE   rÚ   rF   r   rß   rà   rs   rv   r    rH   r!   )r"   s   "r#   r$   r$   ò   s`   € ÷ añ a¨cð a¸Sð aÈ#ð aÐZ]ð aÐfsð að  @Cð aØ-0ðaØ<?ðaØDRñar%   c              ƒ  ód  "  € T;'       g    RP                  4       p\        T;'       g    RWR7      G Rj  x€L
 pV'       g   \        RRV4      # V'       g   \        RRV4      # R\        VR	\	        V4      R
7      RVRV/VR8X  d   RV/M/ Cp	\        WWYWf\        VR7      G Rj  x€L
 #  Lt L5i)zNEdit or extend using a public HTTPS ``video_url`` input (``url`` on the wire).r4   )r3   r2   Nz,prompt is required for xAI video edit/extendrû   z_video_url must be a public HTTPS MP4 URL (the `video`/`public_url` from a prior Imagine result)Úmissing_videorF   r   rÿ   rE   rm   rç   rs   )r|   rà   rG   rs   )r8   rn   rL   r„   ru   r  rÓ   )
r3   r2   rE   rÚ   rF   rß   rà   rs   Úvideo_inputr  s
   $$$$$$$$  r#   rá   rá   ò   sá   é € ð �lˆl˜×!Ñ!Ó#€FÜ4°Y·_°_À"ÈgÔi×i€KßÜÐHÐJZÐ\bÓcÐcßÜÐ{ð  ~Mð  OUó  Vð  	VØ&Ô(CÀEÐTZÔkoÐpuÓkvÔ(wð  zBð  DJØ&¨ðuØRZÐ^jÔRj¸ÀXÑ8NÐprðu€Gä*¨7¸hÐZcÜ8LÐW_ôa÷ að añ jñaùs3   ‚(B0«B0·B,¸B0ÁB0ÁAB0Â'B.Â(B0Â.B0rÀ   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   r3   r   r2   rß   r  rH   r|   rà   rG   rs   rv   rÀ   r   r    r!   )r"   s   "r#   r$   r$     si   € ÷ :@ñ :@¨Sð :@¸Cð :@È3ð :@ÐYgð :@Ðvyð :@ð  GJð :@Ø25ð:@ØADð:@ØR_ð:@Økyñ:@r%   c             ƒ  óf
  "  € VR,          VR,          r© ^ RI HpHpHp V! RRRR7      pV! R4      pV! R4      pVe   WãR&   \        V 4      p\        P                  ! 4       ;_uu_4       GRj  x€L
 p VP                  V RV 2/ VCR\        \        P                  ! 4       4      /CV^<R7      G Rj  x€L
 pVP                  4        TP%                  4       P'                  R4      pT'       g   \)        R4      hRR/ pppT\*        8  d¨   TP'                  T RT 2T^R7      G Rj  x€L
 pTP                  4        TP%                  4       pTP'                  R4      ;'       g    RP-                  4       pT\.        9   d   MZ\0        P2                  ! \4        4      G Rj  x€L
  T\4        ,          pK²  \!        R\*         R2RT	T
R7      uuRRR4      GRj  x€L
  # RRR4      GRj  x€L
  XR8w  dd   XP'                  R/ 4      ;'       g    / P'                  R 4      ;'       g    TP'                  R 4      p\!        T;'       g    R!T R"2R#T 2YšR7      # \7        XP'                  R$4      \8        4      '       d   TP'                  R$4      M/ p\7        TP'                  R%4      \8        4      '       d   TP'                  R%4      M/ pR& TP'                  R'4      TP'                  R(4      3 4       w  ppT;'       g    T;'       g    RpT'       g)   \!        R)R*T	TP'                  R4      ;'       g    T
R7      # RXR+TR,\;        TP'                  R	4      4      /p T P=                  R-T3R.T3R'T3R/T;'       d    TT8g  ;'       d    T33 U!U"u/ uF  w  p!p"T"'       g   K  T!T"bK  	  up"p!4       T P<                  ! R4 U!u/ uF  p!T!T9   g   K  T!TT!,          bK  	  up!3/ TP'                  R04      '       d   R0TR0,          /M/ B  \?        TTP'                  R4      ;'       g    T
Y”TTP'                  R14      ;'       g    TR2T R37      #   \         d    RRR	R
/prþ EL i ; i ELð EL®  \        P                   d‚   p TP                  P                  R,          pM  \         d    Rp Mi ; i\!        RTP                  P"                   RT;'       g    T 2RYšR7      u Rp?uuRRR4      GRj  x€L 
  # Rp?ii ; i ELÖ ELb EL. EL   + GRj  x€L 
 '       g   i     EL8; iu up"p!i u up!i 5i)5zsPOST ``payload`` to ``/videos/{endpoint}``, poll ``/videos/{request_id}`` to a terminal status, shape the response.rE   rF   )Úbuild_xai_storage_optionsÚ"maybe_mark_xai_storage_notice_seenÚread_xai_imagine_storage_configr£   zhermes-xai-videoÚmp4)Úfilename_prefixÚ	extensionNÚenabledFÚstorage_optionsz/videos/zx-idempotency-key)ÚheadersÚjsonÚtimeout:Niô  Nr4   zxAI submit failed (z): rï   r  Ú
request_idz-xAI video response did not include request_idg        Úqueued)r   r"  Ústatusz.Timed out waiting for xAI video request after Úsr"  ÚdonerC   r  z%xAI video request ended with status 'Ú'Úxai_rm   Úfile_outputc              3  ór   "  € T F-  p\        V\        4      '       d   VP                  4       MR x € K/  	  R # 5irŒ   )Ú
isinstancer   r8   )Ú.0r  s   & r#   Ú	<genexpr>Ú,_submit_xai_video_payload.<locals>.<genexpr>1  s4   é € ð   Fñ  TEÈa¬Z¸¼3×-?Ò-? §¡¤	ÀTÔ Ió  TEùs   ‚57Ú
public_urlri   z/xAI video request completed without a video URLÚempty_responserà   Ústorage_enabledrÀ   rª   Útemporary_urlÚusagers   rJ   )rm   rF   rE   r|   rG   rs   rK   Úextra)ÚfilenameÚ
expires_atÚpublic_url_expires_atÚpublic_url_errorÚstorage_error) Útools.xai_httpr  r  r  r*   rA   ÚhttpxÚAsyncClientÚpostr   ÚuuidÚuuid4Úraise_for_statusÚHTTPStatusErrorÚresponser   rL   Ústatus_coder!  r6   ÚRuntimeErrorÚDEFAULT_TIMEOUT_SECONDSrU   Ú_TERMINAL_POLL_STATUSESrñ   ÚsleepÚDEFAULT_POLL_INTERVAL_SECONDSr,  Údictru   Úupdater   )#r3   r2   rß   r  r|   rà   rG   rs   rÀ   rE   r  r  r  r  r  rª   Ústorage_cfgr   ÚclientrC  r-   Údetailr#  Úelapsedr%  Úbodyr  rm   r*  Ústored_publicÚ	temporaryÚpublic_video_urlr5  r  r  s#   &&&&$$$$$                          r#   r  r    sƒ  é € ð % XÕ.°¸Õ0@ˆNðV÷ 	Bñ  	BÙ3°KÐQcÐotÔuˆÙ;¸KÓHˆÙ5°kÓBˆð Ò"Ø%4Ð!Ñ"Ü˜7Ó#€GÜ× Ò ×"×"Ô" fð		MØ#Ÿ[™[¨H¨:°X¸h¸ZÐ)Hð  SFÐU\ð  SFÐ^qÔsvÔw{÷  xBò  xBó  xDó  tEñ  SFØ.5¸rð )ó C÷ CˆHà×%Ñ%Ô'ð —]‘]“_×(Ñ(¨Ó6ˆ
ßÜÐNÓOÐOØ # X¨r˜�ˆØÔ/Ô/Ø#ŸZ™Z¨8¨*°H¸Z¸LÐ(IÐSZÐdf˜ZÓg×gˆHØ×%Ñ%Ô'Ø—=‘=“?ˆDØ—h‘h˜xÓ(×.Ð.¨B×5Ñ5Ó7ˆFØÔ0Ô0ØÜ—-’-Ô =Ó>×>Ð>ØÔ4Õ4ŠGäÐ NÔOfÐNgÐghÐiÐktÐv|Ø$2ô4÷3 #×"×"×"Ò"ð6 �ÔØ—8‘8˜G RÓ(×.Ð.¨B×3Ñ3°IÓ>×UÐUÀ$Ç(Á(È9ÓBUˆÜ˜'×VÐVÐ'LÈVÈHÐTUÐ%VÐZ^Ð_eÐ^fÐXgÐioô  Gð  	GÜ!+¨D¯H©H°WÓ,=¼t×!DÒ!DˆD�H‰H�WÔÈ"€Eô /9¸¿¹À=Ó9QÔSW×.XÒ.X�%—)‘)˜MÔ*Ð^`€Kñ  FÐT_×TcÑTcÐdpÓTqÐsx×s|Ñs|ð  ~Có  tDñ  TEó   FÑ€M�9Ø$×7Ð7¨	×7Ð7°RÐßÜÐKÐM]Ð_eÐmq×muÑmuÐv}Óm~÷  nQð  nQð  CQô  Rð  	RØ)¨:°{ÀIÐO`ÔbfÐgr×gvÑgvð  xAó  hBó  cCð  D€EØ	‡L�L \°:Ð$>ÐAQÐSaÐ@bÐeqð  tAð  eBØ%4°m×6pÐ6pÈ	ÐUbÑHb×6pÐ6pÐgpÐ$qñ$sô yñ $s™4˜1˜aÜvwô �!�Q’$ñ $sò yô zà	‡L‚Lñ  .Fó 'ñ  .F¨Ø˜+Ñ%ô $�!�[ •^Ò#ñ  .Fñ 'ñ cØGKÇxÁxÐPW×GXÒGX¨G°T¸'µ]Ñ+CÐ^`òcäÐ"2¸$¿(¹(À7Ó:K×:]Ð:]È~ÐflØ)5ÀÇ	Á	È*Ó@U×@aÐ@aÐYaÐlqÐy~ô@ð @øôa ô VØ7;¸TÀIÈuÐCU¨˜ªðVúò
 #òCøô ×$Ñ$ô 	MðØŸ™×*Ñ*¨4Õ0‘øÜô Ø’ðúäÐ 3°C·L±L×4LÑ4LÐ3MÈSÐQW×Q^ÐQ^Ð[^ÐP_Ð`ÐbmÐouô  Mô  M÷ #×"Ó"ûð
	Múò hò ?÷- #×"×"×"üóNyùò'ùs‘  ‚T1•%Q º4T1Á.QÁ/T1Á2T	Á4?Q$Â3Q!Â4Q$Ã&T	Ã/8T	Ä'S=Ä(;T	Å$:T	ÆT Æ)T	ÇT1ÇTÇT1Ç&TÇ'#T1ÈT1È$T1ÉB5T1Ë:	T1Ì
T1ÌT1Ì/AT1Í5T1ÎT1Î
T&
ÎT&
Î#T1Î;	T,Ï	T,ÏT1Ï2,T1ÐT1Ð;
T1ÑQÑT1ÑQÑT1Ñ!Q$Ñ$S:Ñ:RÒS5ÒR(	Ò%S5Ò'R(	Ò((S5ÓS5ÓS:ÓT	Ó!T1Ó.S1Ó/T1Ó5S:Ó:T	Ô T	ÔT1ÔT1Ô	T#	ÔTÔ
T#	ÔT#	ÔT1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 ``XAIVideoGenProvider`` into the registry.N)Úregister_video_gen_providerr†   )Úctxs   &r#   ÚregisterrY  >  s   € à×#Ñ#Ô$7Ó$9Ö:r%   >   ú1:1ú2:3ú3:2ú3:4ú4:3r   ú9:16)zhttp://zhttps://>   r'  rC   ÚfailedÚexpiredÚ	cancelled)r4   r4   )AÚ__conditional_annotations__rÑ   Ú
__future__r   rñ   r]   ÚloggingrZ   r?  Ú
contextlibr   Úpathlibr   Útypingr   r   r   r   r	   r<  Úagent.video_gen_providerr
   r   r   Ú	getLoggerrÍ   r+   r7   r�   rœ   r   râ   rè   rÓ   rÔ   rF  rI  r¹   rº   r»   rW   rG  r€   rð   r  r   Ú__annotations__r.   r;   rA   rL   rd   rj   rn   rz   r„   r†   r�   rã   ré   rÉ   rÊ   rá   r  rY  )rc  s   @r#   Ú<module>rl     sÖ  øðôõ #ã Û Û Û Û Ý Ý ß 3Õ 3ã ç WÑ Wà	×	Ò	˜8Ó	$€à,Ð Ø.BÐ BÐ ˜mØ7Ð Ø,-¨qÐ )Ð Ð)Ø+1°6Ð (Ð Ð(Ø9<¸aÐ 6Ð Ð6âIÐ Ø˜VÐ$Ð ØÐ à*Ð ÚMÐ Ø$DÐFiÐ#jÐ  ð^Ð àPÐ àØÐ'¨°*¸kÐK{ØÐMÈ|Ð^dÐfmÐ]nðð ØÐ+¨W°jÀ+ÐOqØÐ;¸\ÈGÈ9ðð	&€Ð	"ó 	ðÈ4÷ õQõX÷
Eõõ$iõ
NðEÈUð EÐgið EØ#3÷Eõ	Tô'
Ð*ô '
õT/ðYÈd÷ Yð
oÐSWð oÐpt÷ oõwõ xõFað:@Øbf÷:@÷z;r%   