§
    ‰eîiK%  ã                  ó  — U d Z ddlmZ ddlZddl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mZmZmZ ddlmZ  ej        e¦  «        ZdZddd	d
dœiZded<   dZddddddddœZdddœZdZd'd„Zd(d„Z d)d „Z! G d!„ d"e¦  «        Z"d*d&„Z#dS )+až  xAI image generation backend.

Exposes xAI's ``grok-imagine-image`` model as an
:class:`ImageGenProvider` implementation.

Features:
- Text-to-image generation
- Multiple aspect ratios (1:1, 16:9, 9:16, etc.)
- Multiple resolutions (1K, 2K)
- Base64 output saved to cache

Selection precedence (first hit wins):
1. ``XAI_IMAGE_MODEL`` env var
2. ``image_gen.xai.model`` in ``config.yaml``
3. :data:`DEFAULT_MODEL`
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚTuple)ÚDEFAULT_ASPECT_RATIOÚImageGenProviderÚerror_responseÚresolve_aspect_ratioÚsave_b64_imageÚsuccess_response)Úhermes_xai_user_agentzgrok-imagine-imagezGrok Imagine Imagez~5-10szFast, high-quality)ÚdisplayÚspeedÚ	strengthszDict[str, Dict[str, Any]]Ú_MODELSz16:9ú1:1z9:16ú4:3ú3:4ú3:2ú2:3)Ú	landscapeÚsquareÚportraitr   r   r   r   Ú1024Ú2048)Ú1kÚ2kr   ÚreturnúDict[str, Any]c                 ón  — 	 ddl m}   | ¦   «         }t          |t          ¦  «        r|                     d¦  «        nd}t          |t          ¦  «        r|                     d¦  «        nd}t          |t          ¦  «        r|ni S # t
          $ r'}t                               d|¦  «         i cY d}~S d}~ww xY w)z(Read ``image_gen.xai`` from config.yaml.r   )Úload_configÚ	image_genNÚxaiz'Could not load image_gen.xai config: %s)Úhermes_cli.configr#   Ú
isinstanceÚdictÚgetÚ	ExceptionÚloggerÚdebug)r#   ÚcfgÚsectionÚxai_sectionÚexcs        ú@/home/div/.hermes/hermes-agent/plugins/image_gen/xai/__init__.pyÚ_load_xai_configr2   O   sÊ   € ð	Ø1Ð1Ð1Ð1Ð1Ð1àˆk‰mŒmˆÝ*4°S½$Ñ*?Ô*?ÐI�#—'’'˜+Ñ&Ô&Ð&ÀTˆÝ,6°wÅÑ,EÔ,EÐO�g—k’k %Ñ(Ô(Ð(È4ˆÝ(¨µdÑ;Ô;ÐCˆ{ˆ{ÀÐCøÝð ð ð Ý�ŠÐ>ÀÑDÔDÐDØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs   ‚B B Â
B4ÂB/Â)B4Â/B4úTuple[str, Dict[str, Any]]c                 ót  — t           j                             d¦  «        } | r| t          v r| t          |          fS t	          ¦   «         }t          |                     d¦  «        t          ¦  «        r|                     d¦  «        nd}|r|t          v r|t          |         fS t          t          t                   fS )z:Decide which model to use and return ``(model_id, meta)``.ÚXAI_IMAGE_MODELÚmodelN)ÚosÚenvironr)   r   r2   r'   ÚstrÚDEFAULT_MODEL)Úenv_overrider-   Ú	candidates      r1   Ú_resolve_modelr=   ]   s¦   € å”:—>’>Ð"3Ñ4Ô4€LØð 3˜­Ð/Ð/Ø�W \Ô2Ð2Ð2å
Ñ
Ô
€CÝ$.¨s¯wªw°wÑ/?Ô/?ÅÑ$EÔ$EÐO�—’˜Ñ Ô Ð È4€IØð -�Y¥'Ð)Ð)Ø�' )Ô,Ð,Ð,å�'¥-Ô0Ð0Ð0ó    r9   c                 óÄ   — t          ¦   «         } t          |                      d¦  «        t          ¦  «        r|                      d¦  «        nd}|r|t          v r|S t
          S )zGet configured resolution.Ú
resolutionN)r2   r'   r)   r9   Ú_XAI_RESOLUTIONSÚDEFAULT_RESOLUTION)r-   Úress     r1   Ú_resolve_resolutionrD   k   s\   € å
Ñ
Ô
€CÝ#-¨c¯gªg°lÑ.CÔ.CÅSÑ#IÔ#IÐ
Sˆ#�'Š'�,Ñ
Ô
Ð
Èt€CØ
ð ˆsÕ&Ð&Ð&Øˆ
ÝÐr>   c                  óf   — e Zd ZdZedd„¦   «         Zedd„¦   «         Zdd„Zdd	„Zdd„Z	e
fdd„ZdS )ÚXAIImageGenProviderz#xAI ``grok-imagine-image`` backend.r    r9   c                ó   — dS )Nr%   © ©Úselfs    r1   ÚnamezXAIImageGenProvider.name|   s   € àˆur>   c                ó   — dS )Nú
xAI (Grok)rH   rI   s    r1   Údisplay_namez XAIImageGenProvider.display_name€   s   € àˆ|r>   Úboolc                óD   — t          t          j        d¦  «        ¦  «        S )NÚXAI_API_KEY)rO   r7   ÚgetenvrI   s    r1   Úis_availablez XAIImageGenProvider.is_available„   s   € Ý•B”I˜mÑ,Ô,Ñ-Ô-Ð-r>   úList[Dict[str, Any]]c                óH   — d„ t                                ¦   «         D ¦   «         S )Nc           	     óš   — g | ]H\  }}||                      d |¦  «        |                      dd¦  «        |                      dd¦  «        dœ‘ŒIS )r   r   Ú r   )Úidr   r   r   )r)   )Ú.0Úmodel_idÚmetas      r1   ú
<listcomp>z3XAIImageGenProvider.list_models.<locals>.<listcomp>ˆ   sk   € ð 
ð 
ð 
ñ �˜$ð ØŸ8š8 I¨xÑ8Ô8ØŸš '¨2Ñ.Ô.Ø!ŸXšX k°2Ñ6Ô6ð	ð ð
ð 
ð 
r>   )r   ÚitemsrI   s    r1   Úlist_modelszXAIImageGenProvider.list_models‡   s-   € ð
ð 
õ #*§-¢-¡/¤/ð
ñ 
ô 
ð 	
r>   r!   c                ó   — dddddddœgdœS )	NrM   Úpaidz2Native xAI image generation via grok-imagine-imagerQ   zxAI API keyzhttps://console.x.ai/)ÚkeyÚpromptÚurl)rK   ÚbadgeÚtagÚenv_varsrH   rI   s    r1   Úget_setup_schemaz$XAIImageGenProvider.get_setup_schema’   s4   € à ØØGð )Ø+Ø2ðð ðð	
ð 
ð 	
r>   rb   Úaspect_ratioÚkwargsr   c           	     óP  — t          j        dd¦  «                             ¦   «         }|st          ddd|¬¦  «        S t	          ¦   «         \  }}t          |¦  «        }t                               |d¦  «        }t          ¦   «         }	t                               |	d¦  «        }
t          |||
d	œ}d
|› �dt          ¦   «         dœ}t          j        d¦  «        pd                     ¦   «                              d¦  «        }	 t          j        |› d�||d¬¦  «        }|                     ¦   «          �nK# t          j        $ rå}|j        r|j        j        nd}	 |j                             ¦   «                              di ¦  «                             d|j        j        dd…         ¦  «        }n:# t*          $ r- |j        r|j        j        dd…         nt-          |¦  «        }Y nw xY wt.                               d||¦  «         t          d|› d|› �dd|||¬¦  «        cY d}~S d}~wt          j        $ r t          ddd|||¬¦  «        cY S t          j        $ r"}t          d|› �d d|||¬¦  «        cY d}~S d}~ww xY w	 |                     ¦   «         }n/# t*          $ r"}t          d!|› �d"d|||¬¦  «        cY d}~S d}~ww xY w|                     d#g ¦  «        }|st          d$d%d|||¬¦  «        S |d         }|                     d&¦  «        }|                     d'¦  «        }|rU	 t7          |d(|› �¬)¦  «        }n/# t*          $ r"}t          d*|› �d+d|||¬¦  «        cY d}~S d}~ww xY wt-          |¦  «        }n|r|}nt          d,d%d|||¬¦  «        S d-|
i}t9          ||||d|¬.¦  «        S )/z1Generate an image using xAI's grok-imagine-image.rQ   rW   z5XAI_API_KEY not set. Get one at https://console.x.ai/Úmissing_api_keyr%   )ÚerrorÚ
error_typeÚproviderrh   r   r   )r6   rb   rh   r@   zBearer zapplication/json)ÚAuthorizationzContent-Typez
User-AgentÚXAI_BASE_URLzhttps://api.x.ai/v1ú/z/images/generationséx   )ÚheadersÚjsonÚtimeoutr   rl   ÚmessageNi,  zxAI image gen failed (%d): %szxAI image generation failed (z): Ú	api_error)rl   rm   rn   r6   rb   rh   z%xAI image generation timed out (120s)ru   zxAI connection error: Úconnection_errorzxAI returned invalid JSON: Úinvalid_responseÚdatazxAI returned no image dataÚempty_responseÚb64_jsonrc   Úxai_)ÚprefixzCould not save image to cache: Úio_errorz/xAI response contained neither b64_json nor URLr@   )Úimager6   rb   rh   rn   Úextra)r7   rR   Ústripr   r=   r   Ú_XAI_ASPECT_RATIOSr)   rD   rA   Ú	API_MODELr   ÚrstripÚrequestsÚpostÚraise_for_statusÚ	HTTPErrorÚresponseÚstatus_codert   Útextr*   r9   r+   rl   ÚTimeoutÚConnectionErrorr   r   )rJ   rb   rh   ri   Úapi_keyrZ   r[   ÚaspectÚxai_arr@   Úxai_resÚpayloadrs   Úbase_urlrŠ   r0   ÚstatusÚerr_msgÚresultrz   ÚfirstÚb64rc   Ú
saved_pathÚ	image_refr�   s                             r1   ÚgeneratezXAIImageGenProvider.generate    s>  € õ ”)˜M¨2Ñ.Ô.×4Ò4Ñ6Ô6ˆØð 	Ý!ØMØ,ØØ)ð	ñ ô ð õ (Ñ)Ô)‰ˆ�$Ý% lÑ3Ô3ˆÝ#×'Ò'¨°Ñ6Ô6ˆÝ(Ñ*Ô*ˆ
Ý"×&Ò& z°6Ñ:Ô:ˆõ ØØ"Ø!ð	#
ð #
ˆð 1 wÐ0Ð0Ø.Ý/Ñ1Ô1ð
ð 
ˆõ ”I˜nÑ-Ô-ÐFÐ1F×MÒMÑOÔO×VÒVÐWZÑ[Ô[ˆð(	Ý”}ØÐ0Ð0Ð0ØØØð	ñ ô ˆHð ×%Ò%Ñ'Ô'Ð'Ñ'øÝÔ!ð 	ð 	ð 	Ø14´ÐD�S”\Ô-Ð-À1ˆFðPØœ,×+Ò+Ñ-Ô-×1Ò1°'¸2Ñ>Ô>×BÒBÀ9ÈcÌlÔN_Ð`dÐadÐ`dÔNeÑfÔf��øÝð Pð Pð PØ58´\ÐO˜#œ,Ô+¨D¨S¨DÔ1Ð1ÅsÈ3ÁxÄx���ðPøøøå�LŠLÐ8¸&À'ÑJÔJÐJÝ!ØJ°fÐJÐJÀÐJÐJØ&ØØØØ#ðñ ô ð ð ð ð ð ð øøøøõ Ôð 	ð 	ð 	Ý!Ø=Ø$ØØØØ#ðñ ô ð ð ð õ Ô'ð 	ð 	ð 	Ý!Ø4¨sÐ4Ð4Ø-ØØØØ#ðñ ô ð ð ð ð ð ð øøøøð	øøøð
	Ø—]’]‘_”_ˆFˆFøÝð 	ð 	ð 	Ý!Ø9°CÐ9Ð9Ø-ØØØØ#ðñ ô ð ð ð ð ð ð øøøøð	øøøð �zŠz˜& "Ñ%Ô%ˆØð 	Ý!Ø2Ø+ØØØØ#ðñ ô ð ð �Q”ˆØ�iŠi˜
Ñ#Ô#ˆØ�iŠi˜ÑÔˆàð 	ð
Ý+¨CÐ8I¸xÐ8IÐ8IÐJÑJÔJ�
�
øÝð ð ð Ý%ØA¸CÐAÐAØ)Ø"Ø"Ø!Ø!'ðñ ô ð ð ð ð ð ð øøøøðøøøõ ˜J™œˆIˆIØð 
	ØˆIˆIå!ØGØ+ØØØØ#ðñ ô ð ð ˜'ð!
ˆõ  ØØØØØØð
ñ 
ô 
ð 	
s—   Ã>/D/ Ä/I7Ä>HÅAF(Æ'HÆ(4GÇHÇGÇ9HÈI7È'I7ÉI7ÉI2É,I7É2I7É;J Ê
J<ÊJ7Ê1J<Ê7J<Ì!L6 Ì6
M"Í MÍM"ÍM"N©r    r9   )r    rO   )r    rT   ©r    r!   )rb   r9   rh   r9   ri   r   r    r!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpropertyrK   rN   rS   r^   rg   r	   rœ   rH   r>   r1   rF   rF   y   s¹   € € € € € Ø-Ð-àðð ð ñ „Xðð ðð ð ñ „Xðð.ð .ð .ð .ð	
ð 	
ð 	
ð 	
ð
ð 
ð 
ð 
ð" 1ðO
ð O
ð O
ð O
ð O
ð O
ð O
r>   rF   Úctxr   ÚNonec                óH   — |                       t          ¦   «         ¦  «         dS )z3Register this provider with the image gen registry.N)Úregister_image_gen_providerrF   )r¤   s    r1   Úregisterr¨   7  s#   € à×#Ò#Õ$7Ñ$9Ô$9Ñ:Ô:Ð:Ð:Ð:r>   rž   )r    r3   r�   )r¤   r   r    r¥   )$r¢   Ú
__future__r   Úloggingr7   Útypingr   r   r   r   r   r†   Úagent.image_gen_providerr	   r
   r   r   r   r   Útools.xai_httpr   Ú	getLoggerrŸ   r+   r„   r   Ú__annotations__r:   rƒ   rA   rB   r2   r=   rD   rF   r¨   rH   r>   r1   ú<module>r°      só  ððð ð ð" #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 1Ð 0Ð 0Ð 0Ð 0Ð 0à	ˆÔ	˜8Ñ	$Ô	$€ð !€	ð Ø'ØØ)ðð ð&€ð ð ð ñ ð %€ð ØØØØØØðð Ð ð Ø
ðð Ð ð
 Ð ðð ð ð ð1ð 1ð 1ð 1ðð ð ð ðv
ð v
ð v
ð v
ð v
Ð*ñ v
ô v
ð v
ð|;ð ;ð ;ð ;ð ;ð ;r>   