Ë
    âß²jºa  ã            	      óø  — U d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZmZmZ  ej<                  e«      Z dZ!d	d
dddddœdddddddœdddddddœdœZ"de#d<    e$e"«      Z%dZ&ddd d!œZ'd"Z(d#Z)d$Z*h d%£Z+d&Z,d'Z-d(Z.d)Z/ e$h d*£«      Z0h d+£Z1d,Z2d-Z3d.Z4d/d0„ fd1d2„ fd3d4„ fd1d5„ fd6œZ5d7e#d8<   d9Z6dTd:„Z7dTd;„Z8dUdVd<„Z9d=„ Z:dWd>„Z;dXd?„Z<dYd@„Z=dZdA„Z>d[dB„Z?e/ddCœ	 	 	 	 	 	 	 	 	 	 	 d\dD„Z@d]dE„ZA	 	 	 	 	 	 	 	 	 	 	 	 d^dF„ZB	 	 	 	 	 	 	 	 d_dG„ZC	 	 	 	 	 	 	 	 	 	 	 	 d`dH„ZD	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dadI„ZE	 	 	 	 	 	 	 	 dbdJ„ZFdcdK„ZG G dL„ dMe«      ZHdddN„ZIddlJZJdOdPdQdRœZKdS„ ZLy)euÙ  Krea image generation backend (``Krea 2`` Medium / Large / Medium Turbo).

Krea's API is asynchronous: submit returns a ``job_id`` polled at ``GET
/jobs/{job_id}``; ``generate()`` hides that (submit, poll every 2s with light
backoff, cache the result URL locally). Selection: ``model`` kwarg â†’
``KREA_IMAGE_MODEL`` â†’ ``image_gen.krea.model`` â†’ ``image_gen.model`` (when one
of our IDs) â†’ :data:`DEFAULT_MODEL`. Docs: https://docs.krea.ai/developers/krea-2/overview
é    )ÚannotationsN)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Ú
get_secret)ÚDEFAULT_ASPECT_RATIOÚresolve_aspect_ratioÚsave_url_imageÚsuccess_response)ÚErrorFnÚStaticImageGenProviderÚcollect_source_imagesÚerror_factoryÚload_image_gen_configÚ	post_jsonÚprompt_required_errorÚresolve_static_modelzhttps://api.krea.aizKrea 2 Mediumz~15-25szCIllustration, anime, painting, expressive styles. Faster + cheaper.z9$0.030 (text) / $0.035 (style refs) / $0.040 (moodboards)ÚmediumF)ÚdisplayÚspeedÚ	strengthsÚpriceÚpathÚupscalezKrea 2 Largez~25-60szIPhotorealism, raw textured looks (motion blur, grain), expressive styles.z9$0.060 (text) / $0.065 (style refs) / $0.070 (moodboards)ÚlargezKrea 2 Medium Turboz~8-15su:   Fastest Krea 2 â€” medium quality at lower latency / cost.z$$0.015 (text) / $0.0175 (style refs)zmedium-turbo)úkrea-2-mediumzkrea-2-largezkrea-2-medium-turbozDict[str, Dict[str, Any]]Ú_MODELSr   z16:9ú1:1z9:16)Ú	landscapeÚsquareÚportraitÚ1Kg333333ã?é
   >   ÚlowÚrawÚhighr   g       @g      @gÍÌÌÌÌÌô?g     €f@>   é˜  é™  é©  éö  é÷  éø  é­  éô  >   ÚfailedÚ	cancelledÚ	completedz/generate/enhance/krea/enhanceé   z!Hermes-Agent/1.0 (krea-image-gen)Ú	api_errorc                ó   — d|› d| › �S )NzKrea poll failed (z
) for job © ©Újob_idÚdetails     úD/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/krea/__init__.pyú<lambda>r=   N   s   € Ð3EÀfÀXÈZÐX^ÐW_Ð1`€ ó    Útimeoutc                ó   — d| › d|› �S )NzKrea poll timed out for job z: r8   r9   s     r<   r=   r=   O   s   € Ð4PÐQWÐPXÐXZÐ[aÐZbÐ2c€ r>   Úinvalid_responsec                ó   — d|› �S )Nz!Krea poll returned invalid JSON: r8   r9   s     r<   r=   r=   P   s   € ÐBcÐdjÐckÐ@l€ r>   c                ó<   — d| › dt        t        «      › d|xs d› d�S )Nú	Krea job z did not complete within zs (last status: Úunknownú))ÚintÚ_POLL_TIMEOUT_SECONDSr9   s     r<   r=   r=   Q   s2   € Ø
�F�8Ð4ÜÔ$Ó%Ð
&Ð&6°vÒ7JÀÐ6KÈ1ð	Nð r>   )Úhttpr?   Úinvalid_jsonÚdeadlinez0Dict[str, Tuple[str, Callable[[str, Any], str]]]Ú_POLL_FAILURES))ztrained styles (LoRAs)Ústyles)Ú
moodboardsrN   c                 ó   — t        «       S )zERead ``image_gen`` (the krea section lives under ``image_gen.krea``).)r   r8   r>   r<   Ú_load_krea_configrP   Y   s   € ä Ó"Ð"r>   c                 ó\   — t        «       j                  d«      } t        | t        «      r| S i S )NÚkrea)rP   ÚgetÚ
isinstanceÚdict)Úsections    r<   Ú_krea_sectionrW   ^   s)   € ÜÓ!×%Ñ% fÓ-€GÜ  ¬$Ô/ˆ7Ð7°RÐ7r>   c           	     óD   — t        t        t        dd| t        «       ¬«      S )NÚKREA_IMAGE_MODELrR   )Úenv_varÚ
config_keyÚexplicitÚconfig)r   r    ÚDEFAULT_MODELrP   )r\   s    r<   Ú_resolve_modelr_   c   s"   € ÜÜ”Ð(:ÀvÐX`Ü Ó"ô$ð $r>   c                 óB  — 	 ddl m}  ddlm}m} 	  |d«      }|�||k7  ry|€t        d«      ry	  | d«      S # t
        $ r }t        j                  d|«       Y d}~yd}~ww xY w# t
        $ r d}Y ŒXw xY w# t
        $ r }t        j                  d	|«       Y d}~yd}~ww xY w)
a  Managed gateway config on the managed path, else ``None``. Managed when the stored
    ``image_gen`` selection is ``nous`` (or legacy ``use_gateway: true``), or never-configured with
    no ``KREA_API_KEY``; an explicit vendor selection pins direct. Never raises (discovery scans).r   )Úresolve_managed_tool_gateway)ÚNOUS_MANAGED_PROVIDERÚread_selectionz/Managed Krea gateway resolution unavailable: %sNÚ	image_genÚKREA_API_KEYrR   z*Managed Krea gateway resolution failed: %s)	Útools.managed_tool_gatewayra   Útools.tool_backend_helpersrb   rc   Ú	ExceptionÚloggerÚdebugr
   )ra   rb   rc   ÚexcÚselecteds        r<   Ú_resolve_managed_krea_gatewayrm   i   s«   € ðÝKßTðÙ! +Ó.ˆð Ð Ð,AÒ AØØÐœJ ~Ô6ØðÙ+¨FÓ3Ð3øô ò Ü�‰ÐFÈÔLÜûðûô
 ò ØŠðûô ò Ü�‰ÐAÀ3ÔGÜûðús=   ‚8 ‘A$ °A5 ¸	A!ÁAÁA!Á$A2Á1A2Á5	BÁ>BÂBc                 óP   — 	 ddl m}  t         | d«      «      S # t        $ r Y yw xY w)z<Cheap, offline-friendly probe for managed Krea availability.r   ©Úis_managed_tool_gateway_readyrR   F)rf   rp   Úboolrh   ro   s    r<   Ú_managed_krea_gateway_readyrr   ‚   s-   € ðÝLäÑ1°&Ó9Ó:Ð:øÜò Ùðús   ‚ ™	%¤%c                óî   — | t        «       j                  d«      fD ]W  }t        |t        «      sŒ|j	                  «       j                  «       t        v sŒ9|j	                  «       j                  «       c S  y)zTCoerce ``creativity`` kwarg (then config) to a valid Krea value; default ``medium``.Ú
creativityr   )rW   rS   rT   ÚstrÚstripÚlowerÚ_VALID_CREATIVITY)ÚvalueÚ	candidates     r<   Ú_resolve_creativityr{   Œ   s`   € àœ]›_×0Ñ0°Ó>Ð?ò -ˆ	Ü�i¤Õ%¨)¯/©/Ó*;×*AÑ*AÓ*CÔGXÒ*XØ—?‘?Ó$×*Ñ*Ó,Ò,ð-ð r>   c               óp   — d| › �t         dœ}|rd|d<   |r t        t        j                  «       «      |d<   |S )NzBearer )ÚAuthorizationz
User-Agentzapplication/jsonzContent-Typezx-idempotency-key)Ú_USER_AGENTru   ÚuuidÚuuid4)Ú
auth_tokenÚmanagedÚ	json_bodyÚheaderss       r<   Ú_headersr…   ”   s>   € Ø")¨*¨Ð 6ÄkÑR€GÙØ"4ˆ�ÑÙä'*¬4¯:©:«<Ó'8ˆÐ#Ñ$Ø€Nr>   c                ó@  — | �| j                   d d n
t        |«      }	 | �| j                  «       ni }|j                  d«      }t	        |t
        «      r|j                  d«      }n$|j                  d«      xs |j                  d«      }|xs |S # t        $ r |cY S w xY w)Ni,  ÚerrorÚmessager;   )Útextru   ÚjsonrS   rT   rU   rh   )Úresprk   ÚfallbackÚbodyr‡   rˆ   s         r<   Ú_submit_error_messagerŽ   ž   s”   € Ø"&Ð"2ˆt�y‰y˜˜#‰¼¸C»€Hð	Ø"Ð.ˆt�y‰yŒ{°BˆØ—‘˜Ó!ˆÜ�eœTÔ"Ø—i‘i 	Ó*‰Gà—h‘h˜yÓ)Ò?¨T¯X©X°hÓ-?ˆGØÒ"˜(Ð"øÜò ØŠðús   žA0B ÂBÂBc                óŒ   — t        | t        «      xr3 | j                  d«      t        v xs t	        | j                  d«      «      S )už   ``completed_at`` is a backstop terminal marker for unfamiliar ``status`` enums (Krea adds
    pending states â€” backlogged/scheduled/sampling â€” over time).ÚstatusÚcompleted_at)rT   rU   rS   Ú_TERMINAL_STATESrq   )Újobs    r<   Ú_is_terminalr”   ¬   s<   € ô �cœ4Ó Òm c§g¡g¨hÓ&7Ô;KÐ&KÒ&lÌtÐTW×T[ÑT[Ð\jÓTkÓOlÐmr>   )Útimeout_secondsÚon_errorc          	     ó`  ‡— | › d|› �}t        |dd¬«      }t        }t        j                  «       |z   }d}	‰du }
dˆfd„}	 t        j                  |«       t        |t        z  t        «      }	 t        j                  ||d¬«      }|j                  «        	 |j+                  «       }t-        |t.        «      r$t-        |j                  d«      t0        «      r|d   }	t3        |«      r|S t        j                  «       |k\  r |d|	d|t5        |«      «      S ŒÔ# t        j                  $ rx}|j                  �|j                  j                  nd}|
st        j                  d	||«       |t         vst        j                  «       |k\  r |d
|d||«      cY d}~S Y d}~�Œ[d}~wt        j"                  t        j$                  f$ rL}|
st        j'                  d||«       t        j                  «       |k\  r |d|d||«      cY d}~S Y d}~�ŒÈd}~wt(        $ rA}|
s‚ t        j                  «       |k\  rt        j'                  d||«       Y d}~yY d}~�Œd}~ww xY w# t(        $ rL}|
st        j'                  d||«       t        j                  «       |k\  r |d|d||«      cY d}~S Y d}~�Œhd}~ww xY w)uu  Poll ``/jobs/{job_id}`` until terminal; returns the job dict or ``None`` when it gave up.

    With ``on_error(kind, detail)`` (main path) a fatal poll failure returns that callback's
    result; without it (best-effort Enhance) failures only log. ``kind`` âˆˆ ``http`` (detail =
    status) / ``timeout`` / ``invalid_json`` / ``deadline`` (detail = last status seen).
    z/jobs/F©r‚   rƒ   Nc                óH   •— ‰€t        j                  |g|¢­Ž  y  ‰| |«      S ©N)ri   Úwarning)Úkindr;   r›   Ú	warn_argsr–   s       €r<   Úgive_upz_poll_krea_job.<locals>.give_upÃ   s*   ø€ ØÐÜ�N‰N˜7Ð/ YÓ/ØÙ˜˜fÓ%Ð%r>   é   )r„   r?   r   z Krea poll failed (%d) for job %srI   z(Krea enhance poll failed (%d) for job %sz(Krea poll transient error for job %s: %sr?   z(Krea enhance poll gave up for job %s: %sz.Krea poll returned invalid JSON for job %s: %srJ   r�   rK   z)Krea enhance job %s did not finish in %ds)
rœ   ru   r;   r   r›   ru   r�   r   Úreturnr   )r…   Ú_POLL_INITIAL_INTERVALÚtimeÚ	monotonicÚsleepÚminÚ_POLL_BACKOFFÚ_POLL_MAX_INTERVALÚrequestsrS   Úraise_for_statusÚ	HTTPErrorÚresponseÚstatus_coderi   r‡   Ú_RETRYABLE_POLL_STATUSESÚTimeoutÚConnectionErrorr›   rh   rŠ   rT   rU   ru   r”   rG   )Úbase_urlr�   r:   r•   r–   Újob_urlr„   ÚintervalrK   Úlast_statusÚenhancerž   r‹   rk   r�   r“   s       `           r<   Ú_poll_krea_jobrµ   ²   s^  ø€ ð �
˜&  Ð)€GÜ�z¨5¸EÔB€GÜ%€HÜ�~‰~Ó /Ñ1€HØ!%€KØ˜$Ð€Gõ&ð Ü�
‰
�8ÔÜ�x¤-Ñ/Ô1CÓDˆð	Ü—<‘< °À"ÔEˆDØ×!Ñ!Ô#ð.	Ø—)‘)“+ˆCô �cœ4Ô ¤Z°·±¸Ó0AÄ3Ô%GØ˜h™-ˆKÜ˜ÔØˆJÜ�>‰>Ó˜xÒ'ÙØ˜KØ;¸VÄSÈÓEYó[ð [ðU øô ×!Ñ!ò 	Ø14·±Ð1I�S—\‘\×-Ò-ÈqˆFÙÜ—‘Ð?ÀÈÔPàÔ5Ñ5¼¿¹Ó9IÈXÒ9UÙ˜v vÐ/YÐ[aÐciÓjÕjÝûÜ× Ñ ¤(×":Ñ":Ð;ò 	ÙÜ—‘ÐIÈ6ÐSVÔWÜ�~‰~Ó 8Ò+Ù˜y¨#Ð/YÐ[aÐcfÓgÕgÝûÜò 	ÙØÜ�~‰~Ó 8Ò+Ü—‘ÐIÈ6ÐSVÔWÜÝûð	ûô ò 	ÙÜ—‘ÐOÐQWÐY\Ô]Ü�~‰~Ó 8Ò+Ù˜~¨sÐ4^Ð`fÐhkÓlÕlÝûð	ús[   Á.(D ÂI ÄIÄ(A'FÆIÆ&IÇ;HÇ<IÈIÈ1IÉIÉ	J-É!;J(ÊJ-Ê(J-c                óL  — t        | t        «      r| j                  d«      nd}t        |t        «      sy|j                  d«      }g t        |t        «      r|ng ¢|j                  d«      ‘D ]5  }t        |t        «      sŒ|j                  «       sŒ%|j                  «       c S  y)zMFirst result URL: ``result.urls[]`` per Krea's job docs, else ``result.url``.ÚresultNÚurlsÚurl)rT   rU   rS   Úlistru   rv   )r“   r·   r¸   rz   s       r<   Ú_extract_result_urlr»   ø   sˆ   € ä",¨S´$Ô"7ˆS�W‰W�XÔ¸T€FÜ�fœdÔ#ØØ�:‰:�fÓ€DØS¤
¨4´Ô 6™¸BÐSÀÇÁÈEÓARÐSò %ˆ	Ü�i¤Õ%¨)¯/©/Õ*;Ø—?‘?Ó$Ò$ð%ð r>   c               ó$  — |t         |dœ}	 t        j                  | › t        › �t	        ||d¬«      |d¬«      }|j                  «        |j                  «       xs i j                  d«      }t        |t        «      r|st        j                  d	«       yt        | ||«      }	t        |	t        «      r|	j                  d
«      dv rt        j                  d|«       yt        |	«      S # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)u¥   Krea Enhance on ``image_url`` â†’ enhanced URL, or ``None`` on any failure (best-effort: an
    upscale failure must never destroy an already-successful generation).)Ú	image_urlÚimage_scaling_factorÚpromptTr˜   rŸ   )r„   rŠ   r?   r:   zKrea Enhance submit failed: %sNz+Krea Enhance submit response missing job_idr�   >   r2   r3   z1Krea Enhance job %s did not complete successfully)Ú_ENHANCE_SCALE_FACTORr¨   ÚpostÚ_ENHANCE_PATHr…   r©   rŠ   rS   rh   ri   r›   rT   ru   rµ   rU   r»   )
r°   r�   r½   r¿   r‚   Úpayloadr‹   r:   rk   r“   s
             r<   Ú_enhance_imagerÄ     só   € ð &Ô?TÐ`fÑg€GðÜ�}‰}Øˆjœ˜Ð(´(¸:ÈwÐbfÔ2gØ "ô&ˆð 	×ÑÔØ—)‘)“+Ò# ×(Ñ(¨Ó2ˆô �fœcÔ"©&Ü�‰ÐDÔEØÜ
˜ :¨vÓ
6€CÜ�cœ4Ô  C§G¡G¨HÓ$5Ð9PÑ$PÜ�‰ÐJÈFÔSØÜ˜sÓ#Ð#øô ò Ü�‰Ð7¸Ô=Üûðús   ŒA C& Ã&	DÃ/D
Ä
Dc                óœ  — t        | |«      }t        |t        «      r|ng D ]W  }t        |t        «      r1|j	                  «       sŒ$|j                  |j	                  «       «       ŒD|sŒG|j                  |«       ŒY t        «       }g }|D ]9  }t        |t        «      r||v rŒ|j                  |«       |j                  |«       Œ; |dt         S )zµ``image_url`` + ``reference_image_urls`` first, then legacy ``image_style_references``
    (URL strings or Krea ref objects, passed through); strings deduped in order; capped at 10.N)	r   rT   rº   ru   rv   ÚappendÚsetÚaddÚ_MAX_STYLE_REFERENCES)r½   Úreference_image_urlsÚlegacy_refsÚrefsÚrefÚseenÚdedupedÚrs           r<   Ú_collect_style_refsrÑ     s¸   € ô
 ,¨IÐ7KÓL€DÜ(¨´dÔ;‰{Àò ˆÜ�cœ3ÔØ�y‰y�{Ø—‘˜CŸI™I›KÕ(ÚØ�K‰K˜Õðô “€DØ€GØò ˆÜ�aœÔØ�D‰yØØ�H‰H�QŒKØ�‰�qÕðð Ð)Ô)Ð*Ð*r>   c                óv  — | |t         |dœ}t        |j                  d«      t        «      r|d   |d<   |j                  d«      |j                  d«      }}t        |t        «      r|r||d<   |r,|D �cg c]  }t        |t
        «      r	|t        dœn|‘Œ c}|d<   t        |t        «      r
|r|d d |d<   |S c c}w )N)r¿   Úaspect_ratioÚ
resolutionrt   ÚseedrM   rN   )r¹   ÚstrengthÚimage_style_referencesé   )ÚDEFAULT_RESOLUTIONrT   rS   rG   rº   ru   Ú!_DEFAULT_STYLE_REFERENCE_STRENGTH)	r¿   Úkrea_arrt   Ú
style_refsÚkwargsrÃ   rM   rN   rÍ   s	            r<   Ú_build_payloadrÞ   5  sÍ   € ð ¨'ÔASÐcmñ€Gô �&—*‘*˜VÓ$¤cÔ*Ø  ™.ˆ�‰ØŸ™ HÓ-¨v¯z©z¸,Ó/GˆJ€FÜ�&œ$Ô¡FØ"ˆ�ÑÙð "ö-
àô LVÐVYÔ[^ÔK_�CÔ%FÒGÐehÑhò-
ˆÐ(Ñ)ô �*œdÔ#©
Ø *¨2¨A ˆ�ÑØ€Nùò-
s   Á2"B6c                óŠ  — t        | › d|› �t        ||d¬«      |ddt        ¬«      \  }}|�ç|j                  dk(  rx|j                  |j
                  }
}	t        j                  d	|	|
«       |r2d
|	cxk  rdk  r'n n$|	dk(  rdnd|› d�}d |d|› d|	› d|
› d|› �d«      fS d ||j                  d«      fS |j                  dk(  rd |dd«      fS |j                  dk(  rd |d|j
                  › �d«      fS d ||j                  |j                  «      fS |j                  d«      }t        |t        «      r|sd |dd«      fS |dfS )zEPOST the generation request; ``(job_id, None)`` or ``(None, error)``.z/generate/image/krea/krea-2/Tr˜   rŸ   ÚKrea)r„   rÃ   r?   ÚlabelÚerror_messageNrI   zKrea submit failed (%d): %si�  r1   r0   u<   Krea's shared-key concurrency cap was hit â€” retry shortly.zModel 'u¨   ' may not be enabled/priced on the Nous Portal's Krea gateway. Set KREA_API_KEY to use Krea directly, or pick a different model via `hermes tools` â†’ Image Generation.z)Nous Subscription Krea gateway rejected 'z' (HTTP z): z. r6   r?   zKrea submit timed out (30s)rJ   z&Krea returned invalid JSON on submit: rA   r:   z#Krea submit response missing job_id)r   r…   rŽ   rœ   r�   rˆ   ri   r‡   Ú
error_typerS   rT   ru   )r°   r�   Ú
model_pathrÃ   r‚   Úmodel_idÚfailÚsubmit_bodyÚfailurer�   Úerr_msgÚhintr:   s                r<   Ú_submit_jobrë   K  s“  € ô
 %Øˆ*Ð0°°Ð=Ü˜¨WÀÔEØ ¨6ÔAVôXÑ€K�ð ÐØ�<‰<˜6Ò!Ø%Ÿn™n¨g¯o©o�GˆFÜ�L‰LÐ6¸ÀÔHá˜3 &Ô.¨3Õ.àV\Ð`cÒVcÑRØ˜h˜Zð (;ð ;ð ð
 ™TØ?À¸zð JØ#˜H C¨ y°°4°&ð:àó!ð !ð !ð ™˜gŸm™m¨[Ó9Ð9Ð9Ø�<‰<˜9Ò$Ø™Ð;¸YÓGÐGÐGØ�<‰<˜>Ò)Ø™Ð FÀwÇÁÐFWÐXÐZlÓmÐmÐmØ‘T˜'Ÿ-™-¨×);Ñ);Ó<Ð<Ð<Ø�_‰_˜XÓ&€FÜ�fœcÔ"©&Ø‘TÐ?ÐASÓTÐTÐTØ�4ˆ<Ðr>   c                óp  — | j                  d«      }| j                  d«      dk(  r8t        |t        «      r|j                  d«      nd}d |d|› d|xs d› �d	«      fS | j                  d«      d
k(  rd |d|› d�d
«      fS t        |t        «      sd |dd«      fS t        | «      }|€d |dd«      fS |dfS )zCResult URL of a terminal job; ``(url, None)`` or ``(None, error)``.r·   r�   r2   r‡   NrD   z	 failed: zunknown errorr6   r3   z was cancelledz)Krea job completed but result was missingÚempty_responsez"Krea result contained no image URL)rS   rT   rU   r»   )r“   r:   ræ   r·   ÚerrÚresult_image_urls         r<   Ú_terminal_result_urlrð   o  sÜ   € ð �W‰W�XÓ€FØ
‡w�wˆxÓ˜HÒ$Ü%/°¼Ô%=ˆf�j‰j˜Ô!À4ˆØ‘T˜I f X¨Y°sÒ7M¸oÐ6NÐOÐQ\Ó]Ð]Ð]Ø
‡w�wˆxÓ˜KÒ'Ø‘T˜I f X¨^Ð<¸kÓJÐJÐJÜ�fœdÔ#Ø‘TÐEÐGWÓXÐXÐXÜ*¨3Ó/ÐØÐØ‘TÐ>Ð@PÓQÐQÐQØ˜TÐ!Ð!r>   c                ó²   — t        | t        «      r| S t        «       j                  d«      }t        |t        «      r|S t        |j                  dd«      «      S )z[Precedence: explicit kwarg > ``image_gen.krea.upscale`` config > per-model catalog default.r   F)rT   rq   rW   rS   )r\   ÚmetaÚcfg_upscales      r<   Ú_upscale_requestedrô   �  sH   € ä�(œDÔ!ØˆÜ“/×%Ñ% iÓ0€KÜ$ [´$Ô7ˆ;Ð]¼TÀ$Ç(Á(È9ÐV[ÓB\Ó=]Ð]r>   c                  óv   — e Zd ZdZdZdZeZeZ	 e
dddddd¬	«      Zdd
„Zdd„Zefdddœ	 	 	 	 	 	 	 	 	 	 	 dd„Zy)ÚKreaImageGenProviderz@Krea ``Krea 2`` foundation image model backend (Medium + Large).rR   rà   Úpaidu»   Krea 2 foundation model â€” Medium ($0.03), Large ($0.06), Medium Turbo ($0.015). Style transfer, moodboards, reference-guided generation. Direct key or managed Nous Subscription gateway.re   zKrea API keyz'https://www.krea.ai/settings/api-tokens)ÚnameÚbadgeÚtagÚkeyr¿   r¹   c                óB   — t        t        d«      «      xs
 t        «       S )Nre   )rq   r
   rr   ©Úselfs    r<   Úis_availablez!KreaImageGenProvider.is_available•  s   € ä”J˜~Ó.Ó/ÒPÔ3NÓ3PÐPr>   c                ó   — ddgt         ddœS )Nr‰   ÚimageT)Ú
modalitiesÚmax_reference_imagesÚsupports_upscale)rÉ   rý   s    r<   Úcapabilitiesz!KreaImageGenProvider.capabilities™  s   € à! 7Ð+ÔEZØ $ñ
ð 	
r>   N)r½   rÊ   c          	     ó   ‡‡‡— |xs dj                  «       }t        |«      }t        j                  |d«      }t	        |||j                  d«      «      }|st        d|«      S t        «       }	|	�(|	j                  j                  d«      }
|	j                  }n&t        }
t        d«      }|s t        d|«      dd«      S t        |j                  d	«      «      \  }}t        |j                  d
«      «      }t        d|||¬«      Št        |||||«      }|	�$t         D ]  \  }}||v sŒ ‰d|› d|› d�d«      c S  t#        |
||d   ||	d u|‰«      \  Š}|�|S g Šd$ˆˆˆfd„}t%        |
|‰|¬«      }‰r‰d   S t'        |t(        «      s	 ‰dd«      S t+        |‰‰«      \  }}|�|S d}t-        |j                  d«      |«      r.t/        |
||||	d u¬«      }|r|}d}nt0        j3                  d«       	 t5        t7        |d|› �¬«      «      }|t:        |‰|dœ}|r	t<        |d<   t'        |j                  d «      t4        «      r|d    |d <   t?        ||||d|rd!|¬#«      S d"|¬#«      S # t8        $ r#}t0        j3                  d||«       |}Y d }~Œ�d }~ww xY w)%NÚ r!   r×   rR   ú/re   uß   KREA_API_KEY not set. Run `hermes tools` â†’ Image Generation â†’ Krea to configure, get a key at https://www.krea.ai/settings/api-tokens, or sign in to a Nous account with the managed Krea gateway enabled (`hermes setup`).Úauth_requiredÚmodelrt   )r
  r¿   z2Managed Krea (Nous Subscription) does not support z2. Set KREA_API_KEY to use Krea directly, or omit `z`.Úunsupported_argumentr   c                óŒ   •— t         j                  | t         d   «      \  }}‰j                   ‰ |‰|«      |«      «       ‰d   S )NrK   éÿÿÿÿ)rL   rS   rÆ   )rœ   r;   rã   Úbuildræ   r:   Úpoll_errorss       €€€r<   Ú
poll_errorz1KreaImageGenProvider.generate.<locals>.poll_errorÕ  sE   ø€ Ü .× 2Ñ 2°4¼È
Ñ9SÓ TÑˆJ˜Ø×Ñ™t¡E¨&°&Ó$9¸:ÓFÔGØ˜r‘?Ð"r>   )r–   r   zKrea returned non-dict job bodyrA   Fr   )r‚   Tu>   Krea Enhance pass failed â€” returning native-resolution imageÚkrea_)ÚprefixzEKrea image URL %s could not be cached (%s); falling back to bare URL.)Úkrea_aspect_ratiorÔ   rt   r:   ÚupscaledÚupscale_factorr‘   r  r‰   )r  r
  r¿   rÓ   ÚproviderÚmodalityÚextra)rœ   ru   r;   r   r    úDict[str, Any]) rv   r   Ú_ASPECT_MAPrS   rÑ   r   rm   Úgateway_originÚrstripÚnous_user_tokenÚBASE_URLr
   r   r_   r{   rÞ   Ú_MANAGED_UNSUPPORTEDrë   rµ   rT   rU   rð   rô   rÄ   ri   r›   ru   r   rh   rÙ   rÀ   r   )rþ   r¿   rÓ   r½   rÊ   rÝ   ÚaspectrÛ   rÜ   r‚   r°   r�   rå   rò   rt   rÃ   ÚwhatÚargrî   r  r“   rï   r  Úenhanced_urlÚ	image_refrk   r  ræ   r:   r  s                              @@@r<   ÚgeneratezKreaImageGenProvider.generateŸ  s  ú€ ð
 ’,˜B×%Ñ%Ó'ˆÜ% lÓ3ˆÜ—/‘/ &¨%Ó0ˆÜ(ØÐ+¨V¯Z©ZÐ8PÓ-QóSˆ
áÜ(¨°Ó8Ð8ô 0Ó1ˆØÐØ×-Ñ-×4Ñ4°SÓ9ˆHØ ×0Ñ0‰JäˆHÜ# NÓ3ˆJÙØ4”} V¨VÓ4ð(ð
 $ó%ð %ô (¨¯
©
°7Ó(;Ó<‰ˆ�$Ü(¨¯©°LÓ)AÓBˆ
Ü˜V V°8ÀFÔKˆÜ  ¨°*¸jÈ&ÓQˆð ÐÜ1ò 0‘	��cØ˜'’>ÙØLÈTÈFð SKØKNÈ%ÈrðSà.ó0ò 0ð0ô "Ø�j $ v¡,°¸ÈÐ9LÈhÐX\ó^‰ˆ�àˆ?ØˆJð -/ˆ÷	#ô
 ˜X z°6ÀJÔOˆÙØ˜q‘>Ð!Ü˜#œtÔ$ÙÐ9Ð;MÓNÐNô !5°S¸&À$Ó GÑÐ˜#Øˆ?ØˆJð ˆÜ˜fŸj™j¨Ó3°TÔ:Ü)Ø˜*Ð&6¸ÈÐW[ÐH[ô]ˆLáØ#/Ð Ø‘ä—‘Ð_Ô`ð	)äœNÐ+;ÀeÈHÈ:ÐDVÔWÓXˆIð ")Ô8JÐZdØ¨(ñ!
ˆñ Ü&;ˆEÐ"Ñ#Ü�c—g‘g˜nÓ-¬sÔ3Ø$'¨Ñ$7ˆE�.Ñ!ÜØ 8°FÈÐZ`Ù *�W¸eôEð 	Eà06¸eôEð 	Eøô ò 	)Ü�N‰NØWÐYiÐknôð )�Iûð		)ús   Ç.I! É!	JÉ*JÊJ©r    rq   ©r    r  )r¿   ru   rÓ   ru   r½   úOptional[str]rÊ   úOptional[List[str]]rÝ   r   r    r  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úprovider_idrá   r    Úmodelsr^   Údefault_model_idrU   Úsetuprÿ   r  r   r%  r8   r>   r<   rö   rö   ‰  s�   „ ÙJà€KØ€EØ€FØ$ÐÙØ˜6ð JØ >Ð7`ôb€Eó
Qó
ð 0DðdEà#'ÐUYñdEØðdEØ),ðdEà ðdEà?RðdEð ðdEð 
ô	dEr>   rö   c                ó6   — | j                  t        «       «       y)uG   Plugin entry point â€” wire ``KreaImageGenProvider`` into the registry.N)Úregister_image_gen_providerrö   )Úctxs    r<   Úregisterr5    s   € à×#Ñ#Ô$8Ó$:Õ;r>   )úagent.image_gen_providerÚImageGenProvider)r6  Úerror_response)r6  Únormalize_reference_images)r7  r8  r9  c                óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncerØ   )	Ú_PLUGIN_COMPAT_LAZYrS   ÚAttributeErrorr*  Ú	importlibÚhermes_cli.plugin_compatr;  ÚgetattrÚimport_module)rø   Útargetr>  r;  s       r<   Ú__getattr__rC    se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr>   r'  rš   )r\   r(  r    zTuple[str, Dict[str, Any]]r&  )ry   r(  r    ru   )r�   ru   r‚   rq   rƒ   rq   r    zDict[str, str])r‹   r   rk   rh   r    ru   )r“   r   r    rq   )r°   ru   r�   ru   r:   ru   r•   Úfloatr–   zOptional[Any]r    r   )r“   zOptional[Dict[str, Any]]r    r(  )r°   ru   r�   ru   r½   ru   r¿   ru   r‚   rq   r    r(  )r½   r(  rÊ   r)  rË   r   r    ú	List[Any])r¿   ru   rÛ   ru   rt   ru   rÜ   rE  rÝ   r  r    r  )r°   ru   r�   ru   rä   ru   rÃ   r  r‚   rq   rå   ru   ræ   r   r    ú.Tuple[Optional[str], Optional[Dict[str, Any]]])r“   r  r:   ru   ræ   r   r    rF  )r\   r   rò   r  r    rq   )r    ÚNone)Mr-  Ú
__future__r   Úloggingr¢   r   Útypingr   r   r   r   r   r	   r¨   Úagent.secret_scoper
   Úagent.image_gen_providerr   r   r   r   Úplugins.image_gen._commonr   r   r   r   r   r   r   r   Ú	getLoggerr*  ri   r  r    Ú__annotations__Ú	frozensetÚKREA_MODEL_IDSr^   r  rÙ   rÚ   rÉ   rx   r¡   r§   r¦   rH   r­   r’   rÂ   rÀ   r~   rL   r  rP   rW   r_   rm   rr   r{   r…   rŽ   r”   rµ   r»   rÄ   rÑ   rÞ   rë   rð   rô   rö   r5  Úosr<  rC  r8   r>   r<   ú<module>rS     s  ðòõ #ã Û Û ß =× =ã å )ß qÓ q÷1÷ 1ó 1ð 
ˆ×	Ñ	˜8Ó	$€à €ð #¨YØZØLØ Uñ	ð "¨IØ`ØLØ Eñ	ð )°8ØQØ7ÀÐ\aññ&€Ð	"ó ñ& ˜7Ó#€à€ð #¨eÀÑH€ØÐ à$'Ð !ØÐ Ú4Ð ð Ð ØÐ Ø€ØÐ á$Ò%MÓNÐ Ú7Ð ð 1€ØÐ Ø1€ð Ñ`ÐaØÑcÐdØ'Ñ)lÐmØñ Oð Pñ	D€Ð@ó ð \Ð ó#ó
8ô
$òó2óóóónð NcØ"ñC[ØðC[Ø"ðC[Ø,/ðC[ØEJðC[àðC[ð 	óC[óL	ð$Øð$Ø"ð$Ø/2ð$Ø<?ð$ØMQð$àó$ð4+Øð+Ø4Gð+ØVYð+àó+ð.ØðØðØ+.ðØ<EðØO]ðàóð,!Øð!Ø"ð!Ø03ð!Ø>Lð!ØW[ð!Øgjð!à
ð!ð 4ó!ðH"Ø	ð"Ø!$ð"Ø,3ð"à3ó"ó$^ôzEÐ1ô zEóz<ó 
ð IØDØ"\ñÐ óBr>   