Ë
    âß²jU  ã                  óš  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZmZmZmZmZ ddlZddlmZmZmZ  ej.                  e«      ZdZd	xZZd
Zd\  ZZd\  Z Z!d\  Z"Z#h d£Z$ddhZ%dZ&dZ'h d£Z(ddhZ)dZ*dZ+ddddddgdœddd d!dgdœd"œZ,d#e-d$<   dd%œdAd&„Z.dBd'„Z/dCd(„Z0dDdEd)„Z1dFd*„Z2dGd+„Z3dHd,„Z4d-d.ed/œ	 	 	 dId0„Z5dJd1„Z6 G d2„ d3e«      Z7dKd4„Z8dd5œdLd6„Z9ddd7œdMd8„Z:dNd9„Z;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dOd:„Z<	 	 	 	 	 	 dPd;„Z=dd<œ	 	 	 	 	 	 	 dQd=„Z>dRd>„Z?	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dSd?„Z@	 	 	 	 	 	 	 	 	 	 dTd@„ZAy)UuB  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/v1úgrok-imagine-videoúgrok-imagine-video-1.5)é   é   )ú16:9Ú720p)éð   é   >   ú1:1ú2:3ú3:2ú3:4ú4:3ú9:16r   Ú480pr   é   )zhttp://zhttps://>   ÚdoneÚerrorÚfailedÚexpiredÚ	cancelledz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)zGrok Imagine Videoz~60-240sz.Text-to-video; legacy image-to-video fallback.z:see https://docs.x.ai/developers/models/grok-imagine-videoÚtextÚimage)ÚdisplayÚspeedÚ	strengthsÚpriceÚ
modalitieszGrok Imagine Video 1.5z Latest xAI image-to-video model.z(see https://docs.x.ai/developers/pricing)r   r   zDict[str, Dict[str, Any]]Ú_MODELS©Úlogc               óŽ   — 	 ddl m}  t        || «      |Ž S # t        $ r$}|rt        j                  ||«       |cY d}~S d}~ww xY w)zn``tools.xai_http.<helper>(*args)``, or ``fallback`` when it is unavailable or raises (never breaks video gen).r   N)Útools.xai_httpÚxai_httpÚgetattrÚ	ExceptionÚloggerÚdebug)ÚhelperÚfallbackr,   Úargsr/   Úexcs         úC/home/ubuntu/.hermes/hermes-agent/plugins/video_gen/xai/__init__.pyÚ	_xai_httpr9   8   sD   € ðÝ)Ø(Œw�x Ó(¨$Ð/Ð/øÜò ÙÜ�L‰L˜˜cÔ"Ø�ûðús   ‚ —	A ?¹A¿Ac                 ó   — t        di d¬«      xs i } t        | j                  d«      xs t        «      }t        | j                  d«      xs d«      j	                  «       |j	                  «       j                  d«      fS )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: %sr+   Úbase_urlÚapi_keyÚ ú/)r9   ÚstrÚgetÚDEFAULT_XAI_BASE_URLÚstripÚrstrip)Úcredsr<   s     r8   Ú_resolve_xai_credentialsrF   C   sl   € ô
 Ð4°bÐ>bÔcÒ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ÐPó    c                ó(   — d| › �dt        dd«      dœS )NzBearer zapplication/jsonÚhermes_xai_user_agentzhermes-agent/video_gen)ÚAuthorizationzContent-Typez
User-Agent©r9   )r=   s    r8   Ú_xai_headersrL   M   s'   € Ø& w iÐ0ÐBTÜ#Ð$;Ð=UÓVñXð XrG   c                ó$   — t        | |d|||¬«      S )NÚxai©r   Ú
error_typeÚproviderÚmodelÚpromptÚaspect_ratio)r   )r   rP   rS   rR   rT   s        r8   Ú
_xai_errorrU   R   s$   € Ü °*ÀuÐTYÐbhð  xDô  Eð  ErG   c               ó8  — | xs dj                  «       }t        |«      j                  «       }|r;|j                  «       j	                  t
        d|› d�fz   «      s|j                  «       s|S 	 ddlm}  ||«       t        j                  |j                  «      d   xs |}|j	                  |› d�«      r8d|› dt        j                   |j#                  «       «      j%                  d	«      › �S |S # t        $ r }t        j                  d|«       Y d}~Œ˜d}~ww xY w)
aW  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.r>   zdata:r?   r   )Úraise_if_read_blockedz*xAI media input read guard unavailable: %sNz;base64,Úascii)rC   r   Ú
expanduserÚlowerÚ
startswithÚ_REMOTE_PREFIXESÚis_fileÚagent.file_safetyrW   r1   r2   r3   Ú	mimetypesÚ
guess_typeÚnameÚbase64Ú	b64encodeÚ
read_bytesÚdecode)ÚvalueÚkindÚfallback_mimeÚrefÚpathrW   r7   Úmimes           r8   Ú_media_ref_to_xai_urlrl   V   s  € ð Š;�B×
Ñ
Ó
€CÜ�‹9×ÑÓ!€DÙ�#—)‘)“+×(Ñ(Ô)9¸uÀTÀFÈ!¸_Ð<NÑ)NÔOÐW[×WcÑWcÔWeØˆ
ð#Ý;ñ 	˜cÔ"Ü×Ñ §	¡	Ó*¨1Ñ-Ò>°€DØZ^×ZiÑZiÐmqÐlrÐrsÐjtÔZuˆU�4�&˜¤×!1Ñ!1°$·/±/Ó2CÓ!D×!KÑ!KÈGÓ!TÐ UÐVÐ~Ð{~Ð~øô ò HÜ�‰ÐAÀ3×GÑGûðHús   Á.C0 Ã0	DÃ9DÄDc                óz   — t        | dd¬«      }|r*|j                  «       j                  t        dz   «      rd|iS d S )Nr$   zapplication/octet-stream©rg   rh   )zdata:image/Úurl)rl   rZ   r[   r\   )rf   ri   s     r8   Ú_image_ref_to_xai_inputrp   h   s=   € Ü
 ¨GÐC]Ô
^€CÙ 3§9¡9£;×#9Ñ#9Ô:JÐM]Ñ:]Ô#^ˆE�3ˆ<ÐhÐdhÐhrG   c             ƒ  óö   K  — | xs dj                  «       }|r7t        |«      j                  «       j                  «       rdt	        |dd¬«      iS |j                  «       j                  t        «      rd|iS dS ­w)zHBuild xAI ``video`` input using a public HTTPS URL (``url`` field only).r>   ro   Úvideoz	video/mp4rn   N)rC   r   rY   r]   rl   rZ   r[   r\   )rf   r=   r<   ri   s       r8   Ú_video_input_from_public_urlrs   m   sk   è ø€ àŠ;�B×
Ñ
Ó
€CÙ
Œt�C‹y×#Ñ#Ó%×-Ñ-Ô/ØÔ,¨S°wÈkÔZÐ[Ð[ØŸ9™9›;×1Ñ1Ô2BÔCˆE�3ˆ<ÐMÈÐMùs   ‚A7A9Fé   )Úhas_reference_imagesÚmax_secondsÚdefaultc          	     óZ   — t        t        dt        || �| n|«      «      |rd«      S |«      S )zKClamp to ``[1, max_seconds]``; reference-to-video additionally caps at 10s.é   é
   )ÚminÚmax)Údurationru   rv   rw   s       r8   Ú_clamp_durationr~   u   sC   € ô Œs�1”c˜+°8Ð3G¡xÈWÓUÓVÑ^rÐXZó  Eð  Eð  yDó  Eð  ErG   c               óŠ   — | xs dj                  «       }|r|r|S |dk(  rt        S |t        k(  xs |t        v }|s|st        S |S )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.r>   r$   )rC   ÚDEFAULT_IMAGE_TO_VIDEO_MODELÚ _IMAGE_TO_VIDEO_COMPAT_MODEL_IDSÚDEFAULT_TEXT_TO_VIDEO_MODEL)rR   ÚmodalityÚexplicit_modelÚ	requestedÚ	is_i2v_ids        r8   Ú_resolve_model_for_modalityr‡   {   sU   € ð ’˜"×#Ñ#Ó%€IÙ™)ØÐØ�7ÒÜ+Ð+ØÔ9Ñ9Òj¸YÔJjÐ=j€IÙ*3¹9Ô&ÐSÈ)ÐSrG   c            
      óŒ   — e Zd ZdZdZdZdd„Zdd„Zdd„Zdd„Z	dd„Z
d	d	d	d	eed	d	d	d
œ		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zy	)ÚXAIVideoGenProviderzxAI Grok Imagine video backend.rN   ÚxAIc                ó   — t        «       S ©N)Úhas_xai_video_credentials©Úselfs    r8   Úis_availablez XAIVideoGenProvider.is_available�   s   € Ü(Ó*Ð*rG   c                ód   — t         j                  «       D ��cg c]  \  }}d|i|¥‘Œ c}}S c c}}w )NÚid)r*   Úitems)r�   ÚmidÚmetas      r8   Úlist_modelszXAIVideoGenProvider.list_models�   s*   € Ü5<·]±]³_×E©	¨¨T��sÐ#˜dÒ#ÓEÐEùÓEs   ˜,c                ó   — t         S rŒ   )ÚDEFAULT_MODELrŽ   s    r8   Údefault_modelz!XAIVideoGenProvider.default_model“   s   € ÜÐrG   c                óD   — t        ddd«      }d|rd|› �ndz   }dd|g dd	œS )
NÚxai_storage_notice_textr>   Ú	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. zxAI Grok ImagineÚpaidÚxai_grok)ra   ÚbadgeÚtagÚenv_varsÚ
post_setuprK   )r�   Ústorage_noticer    s      r8   Úget_setup_schemaz$XAIVideoGenProvider.get_setup_schema–   sE   € ô #Ð#<¸bÀ+ÓNˆðtá-;�b˜Ð(Ñ)ÀñEˆð +°VÀCÐUWÐgqÑrÐrrG   c                ó\   — ddgt        t        «      t        t        «      ddddddt        dœ
S )Nr#   r$   rt   ry   FT)
r)   Úaspect_ratiosÚresolutionsÚmax_durationÚmin_durationÚsupports_audioÚsupports_negative_promptÚsupports_seedÚsupports_upscaleÚmax_reference_images)ÚsortedÚVALID_ASPECT_RATIOSÚVALID_RESOLUTIONSÚMAX_REFERENCE_IMAGESrŽ   s    r8   Úcapabilitiesz XAIVideoGenProvider.capabilitiesŸ   sF   € Ø% wÐ/Ä&ÔI\ÓB]Ôntô  vGó  oHØ "°AÈÐlqð  EIØ$)ÔCWñYð 	YrG   N)	rR   Ú	image_urlÚreference_image_urlsr}   rT   Ú
resolutionÚnegative_promptÚaudioÚseedc       	        ó4   — t        dt        ||d|||||¬«
      S )NÚ
generationF©rS   rR   r„   r´   rµ   r}   rT   r¶   )Ú_run_xai_videoÚ_generate_xai_video_async)r�   rS   rR   r´   rµ   r}   rT   r¶   r·   r¸   r¹   Úkwargss               r8   ÚgeneratezXAIVideoGenProvider.generate¤   s,   € ô àÔ3¸FÈ%Ð`eÐqzØ!5ÀÐWcÐpzô
ð 	
rG   ©ÚreturnÚbool)rÂ   zList[Dict[str, Any]])rÂ   úOptional[str])rÂ   úDict[str, Any])rS   r@   rR   rÄ   r´   rÄ   rµ   úOptional[List[str]]r}   úOptional[int]rT   r@   r¶   r@   r·   rÄ   r¸   zOptional[bool]r¹   rÇ   r¿   r   rÂ   rÅ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ra   Údisplay_namer�   r–   r™   r¤   r³   ÚDEFAULT_ASPECT_RATIOÚDEFAULT_RESOLUTIONrÀ   © rG   r8   r‰   r‰   ‡   sÀ   „ Ù)à€DØ€Ló+óFóósóYð 6:ÐVZØ48ÐTXð  oCØ,ÈtÐmqØ"ñ	

Øð

Ø%2ð

ØFSð

à1ð

àDQð

àhkð

ð ð

ð @Mð

ð ]kð

ð ð	

ð /2ð	

ð
 
ô

rG   r‰   c                 ó.   — t        t        «       d   «      S )Nr   )rÃ   rF   rÏ   rG   r8   r�   r�   ±   s   € ÜÔ(Ó*¨1Ñ-Ó.Ð.rG   ©rR   c           
     ó8   — t        dt        | ||ddt        ¬«      S )NÚeditÚedits©rS   Ú	video_urlrR   ÚendpointÚ	operationr}   )r½   Ú_mutate_xai_video_asyncÚDEFAULT_DURATION)rS   rÖ   rR   s      r8   Úrun_xai_video_editrÛ   µ   s&   € Ü˜&Ô"9À&ÐT]ÐejØ#*°fÔGWôYð YrG   )r}   rR   c                óP   — t        dt        | ||ddt        |dt        ¬«      ¬«      S )NÚextendÚ
extensionsrz   )rv   rw   rÕ   )r½   rÙ   r~   ÚDEFAULT_EXTEND_DURATION)rS   rÖ   r}   rR   s       r8   Úrun_xai_video_extendrà   º   s0   € Ü˜(Ô$;ÀFÐV_ÐglØ#/¸8Ü#2°8ÈÔUlÔ#môoð orG   c               ó´  — |d   |d   }}t        «       \  }}|st        t        d|«      S 	 t        t	        j
                  «       «      5 }|j                   |d||dœ|¤Ž«      cddd«       S # 1 sw Y   yxY w# t        $ rU}t        j                  d| |d¬«       t        d	| › d
|› �d||xs t        |j                  dt        «      ¬«      cY d}~S d}~ww xY w)u   Resolve credentials, then drive ``flow(api_key=, base_url=, **kwargs)`` on a fresh event loop; escaped exception â†’ api_error.rS   rR   Úauth_required©r=   r<   Nú#xAI video %s unexpected failure: %sT©Úexc_infoú
xAI video ú	 failed: Ú	api_errorrT   )rR   rT   rÏ   )rF   rU   Ú_AUTH_REQUIRED_MSGr   ÚasyncioÚnew_event_loopÚrun_until_completer1   r2   Úwarningr˜   rA   rÍ   )	ÚlabelÚflowr¿   rS   rR   r=   r<   Úloopr7   s	            r8   r½   r½   À   sä   € à˜8Ñ$ f¨W¡oˆE€FÜ0Ó2Ñ€GˆXÙÜÔ,¨o¸vÓFÐFðwÜ”W×+Ñ+Ó-Ó.ð 	_°$Ø×*Ñ*©4Ð+]¸È(Ñ+]ÐV\Ñ+]Ó^÷	_÷ 	_ò 	_ûäò wÜ�‰Ð<¸eÀSÐSWˆÔXÜ˜J u g¨Y°s°eÐ<¸kÈ6Ø %Ò 6¬ÀVÇZÁZÐP^Ô`tÓEuôwõ 	wûðwús<   ¬A9 Á	A-Á#	A9 Á-A6Á2A9 Á6A9 Á9	CÂA
CÃCÃCc        
      ƒ  óÚ  K  — |xs dj                  «       |xs dj                  «       }}|rt        |«      nd }
|xs g D �cg c]0  }|xs dj                  «       sŒt        |j                  «       «      ‘Œ2 }}|xr |
 dt        › �dft        |«       dt        › �df| ddft	        |«      t
        kD  dt
        › d	�d
f|
xr |ddffD ]  \  }}}|sŒ
t        |||«      c S  |xs t        j                  «       }|t        v r|nt        }|	xs t        j                  «       j                  «       }	|	t        v r|	nt        }	|rdn|
rdnd}t        |||¬«      }|r*|t        k7  r!|rt        dt        › d|› �d||¬«      S t        }t        |t        |«      ¬«      }|||||	dœd|
fd|ffD ��ci c]  \  }}|sŒ	||“Œ c}}¥}t!        | |d||d|||	¬«	      ƒ d {  –—† S c c}w c c}}w 7 Œ­w)Nr>   z1image_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_modelrÑ   )ru   )rR   rS   r}   rT   r¶   Úreference_imagesÚgenerationsrÀ   )rƒ   rØ   rT   r}   r¶   )rC   rp   Ú_PUBLIC_URL_HINTÚallÚlenr²   rU   rÍ   r°   rÎ   rZ   r±   r‡   r‚   r~   rÃ   Ú_submit_xai_video_payload)r=   r<   rS   rR   r„   r´   rµ   r}   rT   r¶   Úimage_inputro   ÚrefsÚbadÚmessagerP   Úmodality_usedÚresolved_modelÚclamped_durationÚkÚvÚpayloads                         r8   r¾   r¾   Ï   st  è ø€ ð  š 2×,Ñ,Ó.°²¸b×0GÑ0GÓ0IˆI€FÙ8AÔ)¨)Ô4Àt€KØ<PÒ<VÐTVÖn°SÐ[^Ò[dÐbd×ZkÑZkÕZmÔ# C§I¡I£KÕ0Ðn€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ð%ò ;Ñ ˆˆW�jò Ü˜g z°6Ó:Ò:ð;ð !Ò8Ô$8×?Ñ?ÓA€LØ#/Ô3FÑ#F‘<ÔL`€LØÒ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Ðhtð  EOñ _Ø%,¨kÐ$:Ð=OÐQUÐ<VÐ#W×]™4˜1˜aÒ[\�!�Q‘$Ó]ð_€Gä*¨7°H¸mÈWÐ_lð  yCØ8DÐO_Ðlvôx÷ xð xùò5 oùó2 ^ðxús>   ‚A G+ÁGÁGÁ7AG+ÃCG+Æ-
G#Æ8G#Æ=G+ÇG)ÇG+c           
   ƒ  ó4  K  — |xs dj                  «       }t        |xs d| |¬«      ƒ d{  –—† }|st        dd|«      S |st        dd|«      S t        |dt	        |«      ¬	«      ||d
œ|dk(  rd|ini ¥}	t        | |||	||t        |¬«      ƒ d{  –—† S 7 Œg7 Œ­w)zNEdit or extend using a public HTTPS ``video_url`` input (``url`` on the wire).r>   rã   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_videor#   rù   )rR   rS   rr   rÞ   r}   )rƒ   rØ   rT   r}   )rC   rs   rU   r‡   rÃ   r   rÍ   )
r=   r<   rS   rÖ   rR   r×   rØ   r}   Úvideo_inputr
  s
             r8   rÙ   rÙ   ò   sÝ   è ø€ ð Šl˜×!Ñ!Ó#€FÜ4°Y²_À"ÈgÐ`hÔi×i€KÙÜÐHÐJZÐ\bÓcÐcÙÜÐ{ð  ~Mð  OUó  Vð  	VÜ(CÀEÐTZÔkoÐpuÓkvÔ(wð  DJØ(3ñuØRZÐ^jÒRj¸ÀXÑ8NÐprðu€Gä*¨7°H¸hÈÐZcÐoxÜ8LÐW_ôa÷ að að jøðaús"   ‚*B¬B­A"BÂBÂBÂB)r¶   c          
   ƒ  ó	  K  — |d   |d   }
}		 ddl m}m}m}  |ddd¬«      } |d«      } |d«      }|�||d<   t        | «      }t        j                  «       4 ƒd	{  –—† }	 |j                  |› d|› �i |¥dt        t        j                  «       «      i¥|d¬«      ƒ d	{  –—† }|j                  «        |j%                  «       j'                  d«      }|st)        d«      ‚ddi }}}|t*        k  r¡|j'                  |› d|› �|d¬«      ƒ d	{  –—† }|j                  «        |j%                  «       }|j'                  d«      xs dj-                  «       }|t.        v rn\t1        j2                  t4        «      ƒ d	{  –—†  |t4        z  }|t*        k  rŒ¡t!        dt*        › d�d |	|
¬«      cd	d	d	«      ƒd	{  –—†  S d	d	d	«      ƒd	{  –—†  d!k7  rRj'                  d"i «      xs i j'                  d#«      xs |j'                  d#«      }t!        |xs d$|› d%�d&|› �|	|
¬«      S t7        j'                  d'«      t8        «      r|j'                  d'«      ni }t7        |j'                  d(«      t8        «      r|j'                  d(«      ni }d)„ |j'                  d*«      |j'                  d+«      fD «       \  }}|xs |xs d}|s"t!        d,d-|	|j'                  d«      xs |
¬«      S |t;        |j'                  d
«      «      d.œ} | j=                  d/|fd0|fd*|fd1|xr	 ||k7  xr |ffD �!�"ci c]
  \  }!}"|"r|!|"“Œ c}"}!«        | j<                  d2D �!ci c]  }!|!|v r|!||!   “Œ c}!fi |j'                  d3«      rd3|d3   ini ¤Ž t?        ||j'                  d«      xs |
|	|||j'                  d4«      xs |d5| ¬6«      S # t        $ r d	d	d
di}}}Y �Œ–w xY w7 �Œp7 �Œ/# t        j                  $ ru}	 |j                  j                  d	d }n# t        $ r d}Y nw xY wt!        d|j                  j"                  › d|xs |› �d|	|
¬«      cY d	}~cd	d	d	«      ƒd	{  –—†7   S d	}~ww xY w7 �ŒQ7 �Œç7 �Œ°7 �Œ¢# 1 ƒd	{  –—†7  sw Y   �Œ³xY wc c}"}!w c c}!w ­w)7zsPOST ``payload`` to ``/videos/{endpoint}``, poll ``/videos/{request_id}`` to a terminal status, shape the response.rS   rR   r   )Ú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Útimeoutiô  r>   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  r   r   r  z%xAI video request ended with status 'ú'Úxai_rr   Úfile_outputc              3  ó`   K  — | ]&  }t        |t        «      r|j                  «       nd –— Œ( y ­wrŒ   )Ú
isinstancer@   rC   )Ú.0r	  s     r8   ú	<genexpr>z,_submit_xai_video_payload.<locals>.<genexpr>1  s*   è ø€ ò   FÈa¬Z¸¼3Ô-? §¡¤	ÀTÓ Iñ   Fùs   ‚,.Ú
public_urlro   z/xAI video request completed without a video URLÚempty_response)r  rØ   Ústorage_enabledr¶   r£   Útemporary_url)ÚfilenameÚ
expires_atÚpublic_url_expires_atÚpublic_url_errorÚstorage_errorÚusager}   rN   )rr   rR   rS   rƒ   rT   r}   rQ   Úextra) r.   r  r  r  r1   rL   ÚhttpxÚAsyncClientÚpostr@   ÚuuidÚuuid4Úraise_for_statusÚHTTPStatusErrorÚresponser#   rU   Ústatus_coder  rA   ÚRuntimeErrorÚDEFAULT_TIMEOUT_SECONDSrZ   Ú_TERMINAL_POLL_STATUSESrë   ÚsleepÚDEFAULT_POLL_INTERVAL_SECONDSr$  ÚdictrÃ   Úupdater   )#r=   r<   r×   r
  rƒ   rØ   rT   r}   r¶   rS   r  r  r  r  r  r£   Ústorage_cfgr  Úclientr9  r7   Údetailr  Úelapsedr  Úbodyr  rr   r"  Ústored_publicÚ	temporaryÚpublic_video_urlr1  r  r	  s#                                      r8   r   r     sv  è ø€ ð % XÑ.°¸Ñ0@ˆN€FðV÷ 	Bñ  	BÙ3°KÐQcÐotÔuˆÙ;¸KÓHˆÙ5°kÓBˆð Ð"Ø%4ˆÐ!Ñ"Ü˜7Ó#€GÜ× Ñ Ó"÷ 4ð 4 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4÷ 4÷ 4÷ 4ñ 4ð6 �ÒØ—8‘8˜G RÓ(Ò.¨B×3Ñ3°IÓ>ÒUÀ$Ç(Á(È9ÓBUˆÜ˜'ÒVÐ'LÈVÈHÐTUÐ%VÐZ^Ð_eÐ^fÐXgÐioð  xFô  Gð  	GÜ!+¨D¯H©H°WÓ,=¼tÔ!DˆD�H‰H�WÔÈ"€Eô /9¸¿¹À=Ó9QÔSWÔ.X�%—)‘)˜MÔ*Ð^`€Kñ  FÐT_×TcÑTcÐdpÓTqÐsx×s|Ñs|ð  ~Có  tDð  TEô   FÑ€M�9Ø$Ò7¨	Ò7°RÐÙÜÐKÐM]Ð_eÐmq×muÑmuÐv}Óm~ò  nQð  CQô  Rð  	RØ+5ÀIÔ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È	ÐUbÑHbÒ6pÐgpÐ$qð$s÷ y™4˜1˜aÙvwð �Q‘$ó yô zà€E‡L�Lð  .Fö '¨Ø˜+Ñ%ð �[ ‘^Ñ#ò 'ñ cØGKÇxÁxÐPWÔGX¨G°T¸'±]Ñ+CÐ^`òcäÐ"2¸$¿(¹(À7Ó:KÒ:]È~ÐflÐwØ)5ÀÇ	Á	È*Ó@UÒ@aÐYaÐlqÐy~ô@ð @øôa ò VØ7;¸TÀIÈuÐCU¨˜‹ðVúð
4ùðCúô ×$Ñ$ò 	MðØŸ™×*Ñ*¨4¨CÐ0‘øÜò Ø’ðúäÐ 3°C·L±L×4LÑ4LÐ3MÈSÐQWÒQ^Ð[^ÐP_Ð`ÐbmÐouð  ~Lô  Mô  M÷4÷ 4ò 4ûð
	Múð hùð ?ùð-4ùð 4ù÷ 4÷ 4ò 4üóNyùò'ùs-  ‚RŽ%N5 ³*RÁOÁRÁ!Q*Á#>OÂ!OÂ"OÂ6AQ*ÄQÄA,Q*Å:Q!Å;Q*ÆQ*Æ(RÆ4Q$Æ5RÇQ'ÇERÌ$R 
Ì3RÍRÍARÎ5O
ÏRÏ	O
Ï
RÏOÏQÏ'PÐ QÐPÐQÐPÐ/QÐ>QÐ?Q*ÑRÑQÑRÑQÑQ*Ñ!Q*Ñ$RÑ'RÑ*Q=Ñ0Q3Ñ1Q=Ñ8Rc                ó6   — | j                  t        «       «       y)uF   Plugin entry point â€” wire ``XAIVideoGenProvider`` into the registry.N)Úregister_video_gen_providerr‰   )Úctxs    r8   ÚregisterrM  >  s   € à×#Ñ#Ô$7Ó$9Õ:rG   c                óD   — t        t        | |||||||¬«      d|| |¬«      S )Nr¼   r»   )Úoperation_labelrR   rS   rT   )Ú_run_xai_video_coroutiner¾   r¼   s           r8   Úrun_xai_video_generationrQ  H  s?   € ô $Ü!ØØØ)ØØ!5ØØ%Ø!ô		
ð %ØØØ!ôð rG   c          	     ó6  — 	 t        j                  «       }	 |j                  | «      |j                  «        S # |j                  «        w xY w# t        $ rB}t
        j                  d||d¬«       t        d|› d|› �dd|xs t        ||¬«      cY d }~S d }~ww xY w)	Nrä   Trå   rç   rè   ré   rN   rO   )	rë   rì   rí   Úcloser1   r2   rî   r   r˜   )ÚcororO  rR   rS   rT   rñ   r7   s          r8   rP  rP  d  s’   € ð
Ü×%Ñ%Ó'ˆð	Ø×*Ñ*¨4Ó0à�J‰J�LøˆD�J‰J�LûÜò 	
Ü�‰Ð<¸oÈsÐ]aˆÔbÜØ˜Ð/¨y¸¸Ð>Ø"ØØÒ(œ=ØØ%ô
õ 	
ûð	
ús1   ‚A —8 §A ¸A
Á
A Á	BÁ7BÂBÂB)
r4   r@   r5   r   r6   r   r,   rÄ   rÂ   r   )rÂ   zTuple[str, str])r=   r@   rÂ   zDict[str, str])r>   r>   )r   r@   rP   r@   rS   r@   rR   r@   rT   r@   rÂ   rÅ   )rf   r@   rg   r@   rh   r@   rÂ   r@   )rf   r@   rÂ   úOptional[Dict[str, str]])rf   r@   r=   r@   r<   r@   rÂ   rU  )
r}   rÇ   ru   rÃ   rv   Úintrw   rV  rÂ   rV  )rR   rÄ   rƒ   r@   r„   rÃ   rÂ   r@   rÁ   )rS   r@   rÖ   r@   rR   rÄ   rÂ   rÅ   )
rS   r@   rÖ   r@   r}   rÇ   rR   rÄ   rÂ   rÅ   )rï   r@   r¿   r   rÂ   rÅ   )r=   r@   r<   r@   rS   r@   rR   rÄ   r„   rÃ   r´   rÄ   rµ   rÆ   r}   rÇ   rT   r@   r¶   r@   rÂ   rÅ   )r=   r@   r<   r@   rS   r@   rÖ   r@   rR   rÄ   r×   r@   rØ   r@   r}   rV  rÂ   rÅ   )r=   r@   r<   r@   r×   r@   r
  rÅ   rƒ   r@   rØ   r@   rT   r@   r}   rV  r¶   rÄ   rÂ   rÅ   )rÂ   ÚNone)rS   r@   rR   rÄ   r„   rÃ   r´   rÄ   rµ   rÆ   r}   rÇ   rT   r@   r¶   r@   rÂ   rÅ   )
rO  r@   rR   rÄ   rS   r@   rT   r@   rÂ   rÅ   )BrË   Ú
__future__r   rë   rb   Úloggingr_   r5  Ú
contextlibr   Úpathlibr   Útypingr   r   r   r	   r
   r2  Úagent.video_gen_providerr   r   r   Ú	getLoggerrÈ   r2   rB   r‚   r˜   r€   rÚ   rß   rÍ   rÎ   r<  r?  r°   r±   r²   r\   r=  r�   rê   rý   r*   Ú__annotations__r9   rF   rL   rU   rl   rp   rs   r~   r‡   r‰   r�   rÛ   rà   r½   r¾   rÙ   r   rM  rQ  rP  rÏ   rG   r8   ú<module>r`     så  ðòõ #ã Û Û Û Û Ý Ý ß 3Õ 3ã ç WÑ Wà	ˆ×	Ñ	˜8Ó	$€à,Ð Ø.BÐ BÐ ˜mØ7Ð Ø,0Ñ )Ð Ð)Ø+9Ñ (Ð Ð(Ø9?Ñ 6Ð Ð6âIÐ Ø˜VÐ$Ð ØÐ à*Ð ÚMÐ Ø$DÐFiÐ#jÐ  ð^Ð àPÐ ð (°*ÐK{ØMÐ^dÐfmÐ]nñð
 ,°jÐOqØ;ÈGÈ9ññ	&€Ð	"ó 	ð LPõ óQóXô
Eóó$ió
Nð NSÐgiØ#3ñEØ ðEØ8;óEó	Tô'
Ð*ô '
óT/ð OSõ Yð
 TXÐptõ oówð xØð xØ"ð xØ,/ð xØ8Eð xØW[ð xØhuð xà-ð xà9Fð xàVYð xàgjð xào}ó xðFaØ-0ðaØ<?ðaØDRóað  cgñ:@Ø25ð:@ØADð:@ØR_ð:@Økyó:@óz;ðàðð ðð ð	ð
 ðð .ðð ðð ðð ðð óð8
ð ð
ð ð	
ð
 ð
ð ð
ð ô
rG   