
    PL
j'                        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mZ  ej        e          Zddd	d
dddd
d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_agentresolve_xai_http_credentialszGrok Imagine Imagez~5-10szFast, high-quality)displayspeed	strengthszGrok Imagine Image (Quality)z~10-20sz9Higher fidelity / detail; slower than the standard model.)grok-imagine-imagezgrok-imagine-image-qualityzDict[str, Dict[str, Any]]_MODELSr   z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        B/home/kuhnn/.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 )Nz
xAI (Grok)rH   rI   s    r1   display_namez XAIImageGenProvider.display_name   s    |r>   boolc                b    t                      }t          |                    d                    S )Napi_key)r   rN   r)   )rJ   credss     r1   is_availablez XAIImageGenProvider.is_available   s'    ,..EIIi(()))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g ddS )NzxAI Grok Imagine (image)paiduH   grok-imagine-image — text-to-image; uses xAI Grok OAuth or XAI_API_KEYxai_grok)rK   badgetagenv_vars
post_setuprH   rI   s    r1   get_setup_schemaz$XAIImageGenProvider.get_setup_schema   s"     /]$
 
 	
r>   promptaspect_ratiokwargsr   c           	        t                      }t          |                    d          pd                                          }t          |                    d          pd                                          pd}|st	          dd||          S t                      \  }}t          |          }	t                              |	d          }
t                      }|t          v r|nt          }|||
|d	}d
| dt                      d}t          |                    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t,                              d||           t	          d| d| d||||	          cY d}~S d}~wt          j        $ r t	          dd||||	          cY S t          j        $ r"}t	          d| d ||||	          cY d}~S d}~ww xY w	 |                                }n/# t*          $ r"}t	          d!| d"||||	          cY d}~S d}~ww xY w|                    d#g           }|st	          d$d%||||	          S |d         }|                    d&          }|                    d'          }|rU	 t5          |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}t7          ||||	d|.          S )/z1Generate an image using xAI's grok-imagine-image.rP   rV   providerr%   zSNo xAI credentials found. Configure xAI OAuth in `hermes model` or set XAI_API_KEY.missing_api_key)error
error_typerj   rg   r   )r6   rf   rg   r@   zBearer zapplication/json)AuthorizationzContent-Typez
User-Agentbase_urlzhttps://api.x.ai/v1/z/images/generationsx   )headersjsontimeoutNr   rl   messagei,  zxAI image gen failed (%d): %szxAI image generation failed (z): 	api_error)rl   rm   rj   r6   rf   rg   z%xAI image generation timed out (120s)rt   zxAI connection error: connection_errorzxAI returned invalid JSON: invalid_responsedatazxAI returned no image dataempty_responseb64_jsonurlxai_)prefixzCould not save image to cache: io_errorz/xAI response contained neither b64_json nor URLr@   )imager6   rf   rg   rj   extra)r   r9   r)   stripr   r=   r   _XAI_ASPECT_RATIOSrD   rA   rB   r   rstriprequestspostraise_for_status	HTTPErrorresponsestatus_coders   textr*   r+   rl   TimeoutConnectionErrorr   r   )rJ   rf   rg   rh   rQ   rP   provider_namerY   rZ   aspectxai_arr@   xai_respayloadrr   ro   r   r0   statuserr_msgresultry   firstb64r|   
saved_path	image_refr   s                               r1   generatezXAIImageGenProvider.generate   s    -..eii	**0b117799EIIj11:U;;AACCLu 	!k,&)	    ())$%l33#''66(**
 *.> > >**DV "!	#
 #
 1w00./11
 
 uyy,,E0EFFLLNNUUVYZZ)	}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   /F J5I&A	G0/I0*HIH9IJ5'J5J5J0*J50J59K 
K:K5/K:5K:M4 4
N >NN N Nr    r9   )r    rN   )r    rS   r    r!   )rf   r9   rg   r9   rh   r   r    r!   )__name__
__module____qualname____doc__propertyrK   rM   rR   r]   re   r	   r   rH   r>   r1   rF   rF   y   s        --   X    X* * * *	
 	
 	
 	

 
 
 
  1R
 R
 R
 R
 R
 R
 R
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   :  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   r   	getLoggerr   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                 O N N N N N N N		8	$	$ ()  2P# #& &     %    $<     1 1 1 1   y
 y
 y
 y
 y
* y
 y
 y
B; ; ; ; ; ;r>   