
    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        C/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/xai/__init__.py_load_xai_configr2   O   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   r2   r'   strDEFAULT_MODEL)env_overrider-   	candidates      r1   _resolve_modelr=   ]   s    :>>"344L 3//W\222


C$.swww/?/?$E$EO   4I -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#-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    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    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      r1   
<listcomp>z3XAIImageGenProvider.list_models.<locals>.<listcomp>   sk     
 
 
 $ 88Ix88'2..!XXk2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/generationsx   )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>    )M2..4466 	!M,)	    ())$%l33#''66(**
"&&z6:: "!	#
 #
 1w00./11
 
 In--F1FMMOOVVWZ[[(	}000	  H %%''''! 	 	 	14DS\--1FP,++--11'2>>BB9clN_`dad`dNeff P P P58\O#,+DSD11s3xxP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   >/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>   