
    +Vjp%                       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h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   1k2k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        </root/.hermes/hermes-agent/plugins/image_gen/xai/__init__.py_load_xai_configr0   L   s    	111111kmm*4S$*?*?I#''+&&&T,6w,E,EOgkk%(((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   r0   r%   strDEFAULT_MODEL)env_overrider+   	candidates      r/   _resolve_modelr;   Z   s    :>>"344L 3//W\222


C$.swww/?/?$E$EO   4I -Y'))'),,,'-000    r7   c                     t                      } t          |                     d          t                    r|                     d          nd}|r|t          v r|S t
          S )zGet configured resolution.
resolutionN)r0   r%   r'   r7   _XAI_RESOLUTIONSDEFAULT_RESOLUTION)r+   ress     r/   _resolve_resolutionrB   h   s\    


C#-cggl.C.CS#I#I
S#'',


tC
 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   r7   c                    dS )Nr#    selfs    r/   namezXAIImageGenProvider.namey   s    ur<   c                    dS )N
xAI (Grok)rF   rG   s    r/   display_namez XAIImageGenProvider.display_name}   s    |r<   boolc                D    t          t          j        d                    S )NXAI_API_KEY)rM   r5   getenvrG   s    r/   is_availablez XAIImageGenProvider.is_available   s    BIm,,---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      r/   
<listcomp>z3XAIImageGenProvider.list_models.<locals>.<listcomp>   sk     
 
 
 $ 88Ix88'2..!XXk266	 
 
 
r<   )r   itemsrG   s    r/   list_modelszXAIImageGenProvider.list_models   s-    
 
 #*--//
 
 
 	
r<   r   c                    dddddddgdS )	NrK   paidz2Native xAI image generation via grok-imagine-imagerO   zxAI API keyzhttps://console.x.ai/)keyprompturl)rI   badgetagenv_varsrF   rG   s    r/   get_setup_schemaz$XAIImageGenProvider.get_setup_schema   s4     G )+2 	
 
 	
r<   r`   aspect_ratiokwargsr   c           	        t          j        dd                                          }|st          ddd|          S t	                      \  }}t          |          }t                              |d          }t                      }	|	t          v r|	nt          }
t          |||
d}d	| d
t                      d}t          j        d          pd                                                    d          }	 t          j        | d||d          }|                                 n4# t          j        $ r}|j        }||j        nd}	 |                                                    di                               d|j        dd                   }n0# t,          $ r# ||j        dd         nt/          |          }Y nw xY wt0                              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	 t9          |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}t;          ||||d|-          S ).z1Generate an image using xAI's grok-imagine-image.rO   rU   z5XAI_API_KEY not set. Get one at https://console.x.ai/missing_api_keyr#   )error
error_typeproviderrf   r   )r4   r`   rf   r>   zBearer zapplication/json)AuthorizationzContent-Typez
User-AgentXAI_BASE_URLzhttps://api.x.ai/v1/z/images/generationsx   )headersjsontimeoutNr   rj   messagei,  zxAI image gen failed (%d): %szxAI image generation failed (z): 	api_error)rj   rk   rl   r4   r`   rf   z%xAI image generation timed out (120s)rs   zxAI connection error: connection_errorzxAI returned invalid JSON: invalid_responsedatazxAI returned no image dataempty_responseb64_jsonra   xai_)prefixzCould not save image to cache: io_errorz/xAI response contained neither b64_json nor URLr>   )imager4   r`   rf   rl   extra)r5   rP   stripr   r;   r   _XAI_ASPECT_RATIOSr'   rB   r?   r@   	API_MODELr   rstriprequestspostraise_for_status	HTTPErrorresponsestatus_coderr   textr(   r7   r)   rj   TimeoutConnectionErrorr   r   )rH   r`   rf   rg   api_keyrX   rY   aspectxai_arr>   xai_respayloadrq   base_urlr   r.   statuserr_msgresultrx   firstb64ra   
saved_path	image_refr   s                             r/   generatezXAIImageGenProvider.generate   s3    )M2..4466 	!M,)	    ())$%l33#''66(**
 *.> > >**DV "!	#
 #
 1w00./11
 
 In--F1FMMOOVVWZ[[)	}000	  H %%''''! 	 	 	|H-5-AX))qFT"--//--gr::>>y(-X\Y\X\J]^^ T T T191E(---3s88TLL8&'JJJ!JfJJJJ&#          	 	 	!=$#      ' 	 	 	!4s44-#        	
	]]__FF 	 	 	!9C99-#        	 zz&"%% 	!2+#    Qii
##ii 	
+C8Ix8I8IJJJ

   %ACAA)""!!'         JII 
	II!G+#    '!
  
 
 
 	
s   5/D& &I5G>A	FG>*F?<G>>F??9G>8I>'I'I5IIII0 0
J:JJJL 
M L=7M=MNr   r7   )r   rM   )r   rR   r   r   )r`   r7   rf   r7   rg   r   r   r   )__name__
__module____qualname____doc__propertyrI   rL   rQ   r\   re   r	   r   rF   r<   r/   rD   rD   v   s        --   X    X. . . .	
 	
 	
 	

 
 
 
" 1P
 P
 P
 P
 P
 P
 P
r<   rD   ctxr   Nonec                H    |                      t                                 dS )z3Register this provider with the image gen registry.N)register_image_gen_providerrD   )r   s    r/   registerr   5  s#    ##$7$9$9:::::r<   r   )r   r1   r   )r   r   r   r   )$r   
__future__r   loggingr5   typingr   r   r   r   r   r   agent.image_gen_providerr	   r
   r   r   r   r   tools.xai_httpr   	getLoggerr   r)   r   r   __annotations__r8   r   r?   r@   r0   r;   rB   rD   r   rF   r<   r/   <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   w
 w
 w
 w
 w
* w
 w
 w
~; ; ; ; ; ;r<   