+
    iHàjð  ã            
      óx  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIHt ^ RIH	t	H
t
HtHtHt ^ RIHt ^ RIHt ]P$                  ! ]4      tR2tR]R	&   Rt ! R
 R]4      tR R ltR R lt]P6                   R2tRRRR/R R lltRRRRRRRRRR/tRRRR R!R3/R" R# lltR$R%R&R/R' R( llt R)R*R+R,R-R,R.R,R/]/R0 R1 llt!R# )4a„  Image generation provider ABC.

Providers register via ``PluginContext.register_image_gen_provider()`` (from
``<repo>/plugins/image_gen/<name>/`` or ``~/.hermes/plugins/image_gen/<name>/``);
the one selected by ``image_gen.provider`` services every ``image_generate`` call.
One tool covers text-to-image and editing: ``image_url`` / ``reference_image_urls``
route to the provider's edit endpoint, otherwise text-to-image. Mirrors
``agent/video_gen_provider.py``. Response dicts come from :func:`success_response`
/ :func:`error_response` (``success, image, model, prompt, aspect_ratio, modality,
provider`` + ``error, error_type`` on failure).
)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)Úprovider_media)ÚCatalogProviderBaseÚ	landscapeztuple[str, ...]ÚVALID_ASPECT_RATIOSc                  ób   € ] tR t^tRtR R lt]P                  ]3RRRR/R R lll4       t	R	t
R# )
ÚImageGenProviderzÂAbstract base class for an image generation backend. Subclasses implement
:attr:`name` and :meth:`generate`; ``list_models`` entries may add
``speed`` / ``strengths`` / ``price`` for the picker.c               ó   € V ^8„  d   QhRR/# )é   Úreturnúdict[str, Any]© )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/agent/image_gen_provider.pyÚ__annotate__ÚImageGenProvider.__annotate__#   s   € ÷ 	Cñ 	C˜nñ 	Có    c                ó   € RR.R^ /# )al  ``modalities`` (``"text"`` and/or ``"image"``) and ``max_reference_images``; optionally
``supports_upscale`` (bool), ``creative_controls`` (names from the tool's creative-control
vocabulary: ``creativity``, ``intensity``, ``complexity``, ``movement``, ``thinking``,
``resolution``) and
``source_image_role`` (``"style"`` when image inputs set the look and are not edited). Surfaced in the
dynamic tool schema so the model knows when ``image_url`` / ``upscale`` / each control is
honored, and only declared controls are passed to :meth:`generate`; the text-only default
keeps non-overriding providers backward compatible.Ú
modalitiesÚtextÚmax_reference_imagesr   )Úselfs   &r   ÚcapabilitiesÚImageGenProvider.capabilities#   s   € ð ˜v˜hÐ(>ÀÐBÐBr   Ú	image_urlNÚreference_image_urlsc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   ÚpromptÚstrÚaspect_ratior    úOptional[str]r!   úOptional[list[str]]Úkwargsr   r   r   r   )r   s   "r   r   r   /   sN   € ÷ Wñ WàðWð ðWð
 !ðWð 2ðWð ðWð 
ñWr   c               ó   € R# )a‹  Generate an image, or edit ``image_url`` (``reference_image_urls`` are extra
style/composition refs, clamped to ``max_reference_images``); any source image
routes to the edit endpoint. Return :func:`success_response` / :func:`error_response`.
Unknown ``kwargs`` MUST be ignored (forward compat); ``upscale`` (bool) is a
post-generation high-res pass, reported as ``upscaled: True`` in ``extra``.Nr   )r   r#   r%   r    r!   r(   s   &&&$$,r   ÚgenerateÚImageGenProvider.generate.   s   ‚ r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚabcÚabstractmethodÚDEFAULT_ASPECT_RATIOr*   Ú__static_attributes__r   r   r   r   r      sD   † ñ=õ	Cð 	×Ñð 1ñWð
 $(ðWð 59÷Wó ôWr   r   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer&   r   r$   r   )r   s   "r   r   r   ?   s   € ÷ Cñ C ð C°#ñ Cr   c                ó”   € \        V \        4      '       d   V P                  4       P                  4       MRpV\        9   d   V# \
        # )z�Clamp to :data:`VALID_ASPECT_RATIOS`; invalid values coerce to landscape so
the tool surface forgives agent mistakes instead of rejecting them.Ú )Ú
isinstancer$   ÚstripÚlowerr   r3   )r6   Úvs   & r   Úresolve_aspect_ratior=   ?   s:   € ô ",¨E´3×!7Ò!7ˆ�‰‹×ÑÔ¸R€AØÔ(Ô(ˆ1ÐBÔ.BÐBr   c               ó    € V ^8„  d   QhRRRR/# )r   r6   r   r   r'   r   )r   s   "r   r   r   F   s   € ÷ ^ñ ^ cð ^Ð.Añ ^r   c                ó.  € \        V \        4      '       d   V .p \        V \        \        34      '       g   R# V  Uu. uFC  p\        V\        4      '       g   K  VP	                  4       '       g   K3  VP	                  4       NKE  	  up;'       g    R# u upi )z�Coerce a str or list into a clean list of non-blank strings; ``None`` when
nothing usable remains so providers treat "no refs" as one sentinel.N)r9   r$   ÚlistÚtupler:   )r6   Úitems   & r   Únormalize_reference_imagesrC   F   sh   € ô �%œ×ÒØ�ˆÜ�eœd¤E˜]×+Ò+ÙÙ%*ÓU¡U˜T¬j¸¼s×.CŒLÈÏ
É
ÏŒLˆD�J‰JŽL¡UÑU×]Ð]ÐY]Ð]ùÒUs   ¼BÁBÁ1Bz/imagesÚprefixÚimageÚ	extensionÚpngc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úb64_datar$   rD   rF   r   r   r   )r   s   "r   r   r   S   s/   € ÷ hñ h˜Sð h¨Sð hÀsð hÐW[ñ hr   c               ó<   € \         P                  ! \        WVR7      # )zXDecode base64 image data into ``$HERMES_HOME/cache/generated/images/``; return the path.)rD   rF   )r	   Úsave_b64Ú_GENERATED_IMAGE_KIND)rI   rD   rF   s   &$$r   Úsave_b64_imagerM   S   s   € ä×"Ò"Ô#8¸(Ð]fÔgÐgr   z	image/pngz
image/jpegÚjpgz	image/jpgz
image/webpÚwebpz	image/gifÚgifÚtimeoutg      N@Ú	max_bytesc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   Úurlr$   rD   rQ   ÚfloatrR   Úintr   r   r   )r   s   "r   r   r   ]   s4   € ÷ 
ñ 
Ø	ð
Øð
Ø16ð
ØJMð
à	ñ
r   c               óP   € \         P                  ! \        WW#R\        RRRRR7      # )z³Download an (often ephemeral) image URL into ``$HERMES_HOME/cache/generated/images/``. Raises on
network / HTTP / oversize / empty errors so callers can fall back to the bare URL.rG   ÚImagez3Image at {url} returned 0 bytes; refusing to cache.)	rD   rQ   rR   Ú
chunk_sizeÚcontent_typesÚurl_extensionsÚdefault_extensionÚlabelÚempty_errori   )rG   rN   ÚjpegrO   rP   )r	   Úsave_urlrL   Ú_URL_IMAGE_CONTENT_TYPES)rT   rD   rQ   rR   s   &$$$r   Úsave_url_imagerb   ]   s0   € ô
 ×"Ò"Ü˜s¸7ØÔ,DØ<ÐPUØÐ#Xô	ð r   Úmodalityr   Úextrac               ó8   € V ^8„  d   QhRRRRRRRRRRRRRR	R
R/# )r   rE   r$   Úmodelr#   r%   Úproviderrc   rd   zOptional[dict[str, Any]]r   r   r   )r   s   "r   r   r   j   sZ   € ÷ ñ àðð ðð ð	ð
 ðð ðð ðð $ðð ñr   c                óŽ   € RRRV RVRVRVRVRV/pT;'       g    / P                  4        F  w  r‰VP                  W‰4       K  	  V# )	zPUniform success dict; ``extra`` keys are added without overriding standard ones.ÚsuccessTrE   rf   r#   r%   rc   rg   )ÚitemsÚ
setdefault)
rE   rf   r#   r%   rg   rc   rd   ÚpayloadÚkr<   s
   $$$$$$$   r   Úsuccess_responsern   j   sY   € ð 	�4˜ %¨°%¸À6Ø˜ j°(¸JÈð€Gð —�˜"×#Ñ#Ö%‰ˆØ×Ñ˜1Ö ñ &à€Nr   Ú
error_typeÚprovider_errorrg   r8   rf   r#   r%   c               ó4   € V ^8„  d   QhRRRRRRRRRRRRRR	/# )
r   Úerrorr$   ro   rg   rf   r#   r%   r   r   r   )r   s   "r   r   r   ~   sP   € ÷ ñ àðð ðð ð	ð
 ðð ðð ðð ñr   c                ó&   € RRRRRV RVRVRVR	VR
V/# )z$Build a uniform error response dict.ri   FrE   Nrr   ro   rf   r#   r%   rg   r   )rr   ro   rg   rf   r#   r%   s   $$$$$$r   Úerror_responsert   ~   s1   € ð 	�5˜' 4¨°%¸ÀzØ�˜ &¨.¸,È
ÐT\ðð r   )r   ÚsquareÚportraiti  �)"Ú__conditional_annotations__r0   Ú
__future__r   r1   ÚloggingÚpathlibr   Útypingr   r   r   r   r   Úagentr	   Úagent.provider_baser
   Ú	getLoggerr,   Úloggerr   Ú__annotations__r3   r   r=   rC   ÚGENERATED_SUBDIRrL   rM   ra   rb   rn   rt   )rw   s   @r   Ú<module>r‚      s$  øðô
õ #ã 
Û Ý ß 3Õ 3å  Ý 3à	×	Ò	˜8Ó	$€ð (KÐ �_Ó JØ"Ð ôWÐ*ô WõBCõ^ð *×:Ñ:Ð;¸7ÐCÐ ðh°7ð hÈU÷ hð �˜ e¨[¸%ÀÈvÐWbÐdiðÐ ð

Ø&ð
Ø9=ð
ØP`÷
ðð ðð '+÷ð(ð 'ðð ð	ð
 ðð ðð -÷ñ r   