
    Fi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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save_url_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        C/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/xai/__init__.py_load_xai_configr3   P   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   r3   r(   strDEFAULT_MODEL)env_overrider.   	candidates      r2   _resolve_modelr>   ^   s    :>>"344L 3//W\222


C$.swww/?/?$E$EO   4I -Y'))'),,,'-000    r:   c                     t                      } t          |                     d          t                    r|                     d          nd}|r|t          v r|S t
          S )zGet configured resolution.
resolutionN)r3   r(   r*   r:   _XAI_RESOLUTIONSDEFAULT_RESOLUTION)r.   ress     r2   _resolve_resolutionrE   l   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!   r:   c                    dS )Nr&    selfs    r2   namezXAIImageGenProvider.name}   s    ur?   c                    dS )Nz
xAI (Grok)rI   rJ   s    r2   display_namez XAIImageGenProvider.display_name   s    |r?   boolc                b    t                      }t          |                    d                    S )Napi_key)r   rO   r*   )rK   credss     r2   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      r2   
<listcomp>z3XAIImageGenProvider.list_models.<locals>.<listcomp>   sk     
 
 
 $ 88Ix88'2..!XXk266	 
 
 
r?   )r   itemsrJ   s    r2   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)rL   badgetagenv_vars
post_setuprI   rJ   s    r2   get_setup_schemaz$XAIImageGenProvider.get_setup_schema   s"     /]$
 
 	
r?   promptaspect_ratiokwargsr   c           	     z   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          |          }nq|rZ	 t7          |d(| )          }t          |          }nJ# t*          $ r(}t,                              d,||           |}Y d}~nd}~ww xY wt	          d-d%d|||	          S d.|i}t;          ||||	d|/          S )0z1Generate an image using xAI's grok-imagine-image.rQ   rW   providerr&   zSNo xAI credentials found. Configure xAI OAuth in `hermes model` or set XAI_API_KEY.missing_api_key)error
error_typerk   rh   r   )r7   rg   rh   rA   zBearer zapplication/json)AuthorizationzContent-Typez
User-Agentbase_urlzhttps://api.x.ai/v1/z/images/generationsx   )headersjsontimeoutNr   rm   messagei,  zxAI image gen failed (%d): %szxAI image generation failed (z): 	api_error)rm   rn   rk   r7   rg   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_jsonurlxai_)prefixzCould not save image to cache: io_errorzDxAI image URL %s could not be cached (%s); falling back to bare URL.z/xAI response contained neither b64_json nor URLrA   )imager7   rg   rh   rk   extra)r   r:   r*   stripr   r>   r   _XAI_ASPECT_RATIOSrE   rB   rC   r   rstriprequestspostraise_for_status	HTTPErrorresponsestatus_codert   textr+   r,   rm   TimeoutConnectionErrorr   r   warningr   )rK   rg   rh   ri   rR   rQ   provider_namerZ   r[   aspectxai_arrA   xai_respayloadrs   rp   r   r1   statuserr_msgresultrz   firstb64r}   
saved_path	image_refr   s                               r2   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 	
,+C8Ix8I8IJJJ
  
OO		       Z  
  						  "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 6O 
P$PPNr!   r:   )r!   rO   )r!   rT   r!   r"   )rg   r:   rh   r:   ri   r   r!   r"   )__name__
__module____qualname____doc__propertyrL   rN   rS   r^   rf   r	   r   rI   r?   r2   rG   rG   z   s        --   X    X* * * *	
 	
 	
 	

 
 
 
  1c
 c
 c
 c
 c
 c
 c
r?   rG   ctxr   Nonec                H    |                      t                                 dS )z3Register this provider with the image gen registry.N)register_image_gen_providerrG   )r   s    r2   registerr   L  s#    ##$7$9$9:::::r?   r   )r!   r4   r   )r   r   r!   r   )%r   
__future__r   loggingr8   typingr   r   r   r   r   r   agent.image_gen_providerr	   r
   r   r   r   r   r   tools.xai_httpr   r   	getLoggerr   r,   r   __annotations__r;   r   rB   rC   r3   r>   rE   rG   r   rI   r?   r2   <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   J
 J
 J
 J
 J
* J
 J
 J
d; ; ; ; ; ;r?   