+
    kHàjv)  ã                  ó^  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
Ht ^ RIHtHt ^ RIHtHtHt ^ RIHtHtHtHtHtHtHtHtHtHtH t H!t!H"t"H#t# ]PH                  ! ]%4      t&/ ]PN                  ! 4        U Uu/ uF  w  rV / VCR]/CbK  	  upp CR! UUUUUu/ uF?  w  r#rER" F3  pVR8X  d   TMV R	V 2R
RV RVPQ                  4        R2RVRVRVRV/bK5  	  KA  	  upppppCt)R R lt*R R lt+R R lt,R R lt-R R lt.R R lt/ ! R R]4      t0R R  lt1R# u upp i u upppppi )#uè  OpenAI GPT Image 2 and 2.5 Flare/Sunburst quality tiers;
base64 output â†’ image cache. Selection: ``OPENAI_IMAGE_MODEL`` â†’ ``image_gen.openai.model`` â†’
``image_gen.model`` â†’ :data:`DEFAULT_MODEL`; an id outside the catalog is sent verbatim.
Endpoint: ``image_gen.openai.base_url`` â†’ the named endpoint ``image_gen.openai.provider`` â†’
``OPENAI_BASE_URL`` â†’ SDK default; key: env named by ``image_gen.openai.key_env`` â†’ the named
endpoint's credential â†’ ``OPENAI_API_KEY``.)ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚTuple)Ú
get_secretÚget_secret_str)ÚDEFAULT_ASPECT_RATIOÚresolve_aspect_ratioÚsuccess_response)ÚGPT_IMAGE_2_API_MODELÚGPT_IMAGE_2_DEFAULTÚGPT_IMAGE_2_TIERSÚStaticImageGenProviderÚcollect_source_imagesÚerror_factoryÚimport_openaiÚload_image_gen_configÚmaterialize_imageÚopenai_importableÚprompt_required_errorÚrecord_token_usageÚresolve_static_modelÚsize_forÚ	api_modelÚautoÚ-ÚdisplayzGPT Image 2.5 z (Ú)ÚspeedÚ	strengthsÚqualityc               ó   € V ^8„  d   QhRR/# )é   Úreturnztuple[str, dict[str, Any]]© )Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/openai/__init__.pyÚ__annotate__r)   -   s   € ÷ dñ dÐ2ñ dó    c                 ó2   € \        \        \        R RRR7      # )ÚOPENAI_IMAGE_MODELÚopenaiT)Úenv_varÚ
config_keyÚpassthrough)r   ÚMODELSÚDEFAULT_MODELr&   r*   r(   Ú_resolve_modelr3   -   s   € ÜÜ”Ð';ÈÐ^bôdð dr*   c               ó    € V ^8„  d   QhRRRR/# )r$   ÚnameÚstrr%   útuple[str, str]r&   )r'   s   "r(   r)   r)   2   s   € ÷ Iñ I˜#ð I /ñ Ir*   c                óú  € ^ RI Hp V! V 4      pV'       g   \        P                  RV 4       R	# \	        VP                  R4      ;'       g    R4      P                  4       p\	        VP                  R4      ;'       g    R4      P                  4       ;'       g     V'       d   \        V4      MR;'       g    Rp\	        VP                  R4      ;'       g    R4      P                  4       P                  R4      V3# )
u  ``(base_url, api_key)`` of the user-declared custom endpoint *name* (``providers:`` /
``custom_providers:``), so image generation reuses a chat endpoint's URL and credential without
duplicating the key into OpenAI variables (#83080). Unknown name â†’ ``("", "")`` with a warning.)Ú_get_named_custom_providerzEimage_gen.openai.provider %r matches no custom endpoint in providers:Ú Úkey_envÚapi_keyNÚbase_urlÚ/©r:   r:   )	Úhermes_cli.runtime_providerr9   ÚloggerÚwarningr6   ÚgetÚstripr   Úrstrip)r5   r9   Úentryr;   r<   s   &    r(   Ú_named_endpointrG   2   sÃ   € õ Gá& tÓ,€EßÜ�‰Ð^Ð`dÔeØˆÜ�%—)‘)˜IÓ&×,Ð,¨"Ó-×3Ñ3Ó5€GÜ�%—)‘)˜IÓ&×,Ð,¨"Ó-×3Ñ3Ó5×iÐi×QX¼*ÀWÔ:MÐ^b×iÐiÐgi€GÜˆu�y‰y˜Ó$×*Ð*¨Ó+×1Ñ1Ó3×:Ñ:¸3Ó?ÀÐHÐHr*   c               ó   € V ^8„  d   QhRR/# )r$   r%   r7   r&   )r'   s   "r(   r)   r)   A   s   € ÷ ñ ˜?ñ r*   c                 ód  € \        R4      p \        V P                  R4      ;'       g    R4      P                  4       pV'       d   \	        V4      MR
w  r#\        V P                  R4      ;'       g    R4      P                  4       P                  R4      ;'       g$    T;'       g    \        R4      P                  4       p\        V P                  R4      ;'       g    R4      P                  4       pV'       d   \        V4      MR;'       g     T;'       g    \        R	4      ;'       g    RpWF3# )u0  ``(base_url, api_key)`` â€” ``image_gen.openai.base_url`` â†’ ``OPENAI_BASE_URL`` â†’ ``""`` (SDK default);
the env var named by ``image_gen.openai.key_env`` â†’ ``OPENAI_API_KEY``. Only the var NAME lives in
config.yaml; ``is_available()`` and ``generate()`` share this so they cannot disagree (#65309).r-   Úproviderr:   r=   r>   ÚOPENAI_BASE_URLr;   NÚOPENAI_API_KEYr?   )r   r6   rC   rD   rG   rE   r	   r   )ÚcfgÚnamedÚ
named_baseÚ	named_keyr=   r;   r<   s          r(   Ú_resolve_endpointrQ   A   s÷   € ô   Ó
)€CÜ�—‘˜
Ó#×)Ð) rÓ*×0Ñ0Ó2€Eß6;œO¨EÔ2ÀÑ€JÜ�C—G‘G˜JÓ'×-Ð-¨2Ó.×4Ñ4Ó6×=Ñ=¸cÓB÷ =ð =Àj÷ =ð =Ü!Ð"3Ó4×:Ñ:Ó<ð ä�#—'‘'˜)Ó$×*Ð*¨Ó+×1Ñ1Ó3€Gß&-Œz˜'Ô"°4×kÐk¸I×kÐkÌÐTdÓIe×kÐkÐik€GØÐÐr*   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   r-   r   r=   r6   r<   r%   r&   )r'   s   "r(   r)   r)   O   s(   € ÷ #ñ #˜#ð #¨ð #°sð #¸sñ #r*   c                óz   € ^ RI Hp RVRRR//pV'       d   WR&   V! V4      pVe   WTR&   V P                  ! R/ VB # )	al  ``openai.OpenAI`` on Hermes' env-only-proxy httpx client, so a local/custom endpoint never
routes through a macOS system proxy whose ExceptionsList httpx cannot see (#64888). The project
header is blanked: an ``OPENAI_PROJECT_ID`` set for chat makes ``/images/generations`` 403 on
projects with a model allow-list, and the key already carries the project (#60748).)Úbuild_keepalive_http_clientr<   Údefault_headerszOpenAI-Projectr:   r=   Úhttp_clientr&   )Úagent.process_bootstraprT   ÚOpenAI)r-   r=   r<   rT   ÚkwargsrV   s   &&&   r(   Ú_build_clientrZ   O   sS   € õ
 Dà'¨Ð2CÐFVÐXZÐE[Ð\€FßØ%ˆzÑÙ-¨hÓ7€KØÒØ +ˆ}ÑØ�=Š=Ñ"˜6Ñ"Ð"r*   c               ó    € V ^8„  d   QhRRRR/# )r$   Úrefr6   r%   ztuple[bytes, str]r&   )r'   s   "r(   r)   r)   _   s   € ÷ 6ñ 6˜3ð 6Ð#4ñ 6r*   c                óê  € V P                  4       p V P                  4       pVP                  R4      '       d©   ^ RIHpHp V! V 4      '       g   \        RV  24      hV! ^<RR7      ;_uu_ 4       pVP                  V 4      pRRR4       XP                  4        V P                  R^4      ^ ,          P                  R^4      R,          ;'       g    RpVP                  V3# VP                  R	4      '       dr   ^ RIpV P                  R
4      w  r‰p
RV9   d1   VP                  R^4      ^,          P                  R^4      ^ ,          MR;'       g    RpVP                  V
4      RV 23# ^ RIHp V! V 4       \#        V R4      ;_uu_ 4       pVP%                  4       pRRR4       X\&        P(                  P+                  V 4      ;'       g    R3#   + '       g   i     ELW; i  + '       g   i     LO; i)zYLoad ``(data, filename)`` from a URL, data URI or local path; raises on IO/network error.)Úcreate_ssrf_safe_clientÚis_safe_urlz2Image reference URL failed the SSRF safety check: T)ÚtimeoutÚfollow_redirectsNÚ?r>   z	image.pngzdata:Ú,zimage/Ú;r:   Úpngzimage.)Úraise_if_read_blockedÚrb)zhttp://zhttps://éÿÿÿÿ)rD   ÚlowerÚ
startswithÚtools.url_safetyr^   r_   Ú
ValueErrorrC   Úraise_for_statusÚsplitÚrsplitÚcontentÚbase64Ú	partitionÚ	b64decodeÚagent.file_safetyrf   ÚopenÚreadÚosÚpathÚbasename)r\   ri   r^   r_   ÚclientÚrespr5   rq   ÚheaderÚ_Úb64Úextrf   ÚfhÚdatas   &              r(   Ú_load_image_bytesr‚   _   s”  € à
�)‰)‹+€CØ�I‰I‹K€EØ×ÑÐ/×0Ò0ßIá˜3×ÒÜÐQÐRUÐQVÐWÓXÐXÙ$¨RÀ$×GÕGÈ6Ø—:‘:˜c“?ˆD÷ Hà×ÑÔØ�y‰y˜˜aÓ  Õ#×*Ñ*¨3°Ó2°2Õ6×EÐE¸+ˆØ�|‰|˜TÐ!Ð!Ø×Ñ˜× Ò ÛàŸ™ sÓ+‰ˆ�3Ø@HÈFÔ@Rˆv�|‰|˜H aÓ(¨Õ+×1Ñ1°#°qÓ9¸!Ö<ÐXZ×dÐdÐ_dˆØ×Ñ Ó$¨¨s¨e nÐ4Ð4Ý7á˜#ÔÜ	ˆc�4�Œ˜BØ�w‰w‹yˆ÷ 
à”—‘×!Ñ! #Ó&×5Ð5¨+Ð5Ð5÷! H×GÐGú÷ 
�ús   Á.GÆ
G"ÇG	Ç"G2	c               ó    € V ^8„  d   QhRRRR/# )r$   r\   r6   r%   z
io.BytesIOr&   )r'   s   "r(   r)   r)   {   s   € ÷ ñ ˜ð  ñ r*   c                óX   € \        V 4      w  r\        P                  ! V4      pW#n        V# )zH``images.edit()`` expects named file-like objects for correct multipart.)r‚   ÚioÚBytesIOr5   )r\   r�   ÚfnameÚbios   &   r(   Ú_named_bytes_ior‰   {   s&   € ä# CÓ(�K€DÜ
�*Š*�TÓ
€CØ„HØ€Jr*   c            	      ó€   € ] tR t^ƒtRtRtRt]t]	t
Rt]! RRRRRR	R
7      tR R ltR R lt]3RRRR/R R llltRtR# )ÚOpenAIImageGenProviderzPOpenAI ``images.generate`` / ``images.edit`` backend with selectable API models.r-   rX   ÚvariesÚpaiduH   GPT Image 2 / 2.5 Flare / 2.5 Sunburst â€” text-to-image & image editingrL   zOpenAI API keyz$https://platform.openai.com/api-keys)r5   ÚbadgeÚtagÚkeyÚpromptÚurlc               ó   € V ^8„  d   QhRR/# )r$   r%   Úboolr&   )r'   s   "r(   r)   Ú#OpenAIImageGenProvider.__annotate__�   s   € ÷ Dñ D˜dñ Dr*   c                	óZ   € \        \        4       ^,          4      ;'       d    \        4       # )é   )r”   rQ   r   ©Úselfs   &r(   Úis_availableÚ#OpenAIImageGenProvider.is_available�   s"   € ÜÔ%Ó'¨Õ*Ó+×CÐCÔ0AÓ0CÐCr*   c               ó   € V ^8„  d   QhRR/# )r$   r%   údict[str, Any]r&   )r'   s   "r(   r)   r•   “   s   € ÷ Mñ M˜nñ Mr*   c                	ó   € R RR.R^/# )Ú
modalitiesÚtextÚimageÚmax_reference_imagesr&   r˜   s   &r(   ÚcapabilitiesÚ#OpenAIImageGenProvider.capabilities“   s   € à˜v wÐ/Ð1GÈÐLÐLr*   Ú	image_urlNÚreference_image_urlsc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r$   r‘   r6   Úaspect_ratior¥   zOptional[str]r¦   zOptional[list[str]]rY   r   r%   r�   r&   )r'   s   "r(   r)   r•   —   sP   € ÷ @Bñ @BØð@BØ),ð@Bà ð@Bà?Rð@Bð ð@Bð 
ñ	@Br*   c               	ó†  € T;'       g    R P                  4       p\        V4      pV'       g   \        RV4      # \        4       w  rxV'       g   \	        RV4      ! RR4      # \        RV4      w  ršV
'       d   V
# \        4       w  r¼\        V4      p\        W4^R7      p\        V4      p\	        RWkVR7      p\        W—V4      p\        VR,          W^R7      pVR,          e   VR,          VR&   V'       d:    V Uu. uF  p\        V4      NK  	  pp\        T4      ^8”  d   TMT^ ,          TR&   V'       d   RVP                  P                   3MRVP                  P"                  3w  pp V! R$/ VB p\)        \+        TRR	4      TR,          RR7       \+        TRR	4      ;'       g    . pT'       g
   T! RR4      # T^ ,          p\-        \+        TRR	4      \+        TRR	4      RT 2RRY±T\$        R7	      w  pp
T
'       d   T
# R TRTR,          /p\+        TR!R	4      '       d   TP.                  TR!&   \1        TY±TRT'       d	   RTR#7      # R"TR#7      # u upi   \         d   pT! R
T 2R4      u R	p?# R	p?ii ; i  \         d<   p\$        P'                  RTRR7       T! RT'       d   RMR RT 2R4      u R	p?# R	p?ii ; i)%r:   r-   u·   OPENAI_API_KEY not set (or the variable named by image_gen.openai.key_env is empty). Run `hermes tools` â†’ Image Generation â†’ OpenAI to configure, or `hermes setup` to add the key.Úauth_required)Úlimit)Úmodelr‘   r   )r¬   r‘   ÚsizeÚnr"   Nz)Could not load source image for editing: Úio_errorr¡   ÚeditÚ
generationzOpenAI image %s failedT)Úexc_infozOpenAI image Úeditingz	 failed: Ú	api_errorÚusage)r¬   rJ   r�   zOpenAI returned no image dataÚempty_responseÚb64_jsonr’   Úopenai_rX   )ÚprefixÚlabelrJ   r¬   r‘   ÚaspectÚlogr­   Úrevised_promptr    )r¡   r¬   r‘   r¨   rJ   ÚmodalityÚextrar&   )rD   r   r   rQ   r   r   r3   r   r   r”   rZ   Údictr‰   Ú	ExceptionÚlenÚimagesr°   ÚgeneraterA   Údebugr   Úgetattrr   r½   r   )r™   r‘   r¨   r¥   r¦   rY   r»   r=   r<   r-   ÚerrÚtier_idÚmetar­   ÚsourcesÚis_editÚfailrz   Úrequestr\   ÚfilesÚexcÚverbÚcallÚresponser�   ÚfirstÚ	image_refr¿   s   &&&$$,                       r(   rÄ   ÚOpenAIImageGenProvider.generate—   sÐ  € ð
 —,�,˜B×%Ñ%Ó'ˆÜ% lÓ3ˆßÜ(¨°6Ó:Ð:Ü-Ó/ÑˆßÜ  ¨6Ô2ð"ð  ó	!ð !ô $ H¨fÓ5‰ˆßØˆJÜ&Ó(‰ˆÜ˜ÓˆÜ'¨	ÈrÔRˆÜ�w“-ˆÜ˜X vÀVÔLˆÜ˜v°Ó9ˆô
 #'¨T°+Õ->ÀvÐ\]Ô"^ˆØ�	�?Ò&Ø!% i¥ˆG�IÑßð[Ù9@ÓA¹°#œ¨Ö-¹�ÐAô ),¨E«
°Q¬™u¸EÀ!½HˆG�GÑß5<�f˜fŸm™m×0Ñ0Ñ1À<ÐQW×Q^ÑQ^×QgÑQgÐBh‰
ˆˆdð	mÙ‘˜g‘ˆHô 	œ7 8¨W°dÓ;À4ÈÕCTÐ_gÕhÜ�x ¨Ó.×4Ð4°"ˆßÙÐ7Ð9IÓJÐJØ�Q•ˆÜ*Ü�E˜: tÓ,¬g°e¸UÀDÓ.IØ˜W˜IÐ&¨hÀØ°¼VôE‰ˆ	�3÷ ØˆJØ!'¨¨y¸$¸y½/Ð JˆÜ�5Ð*¨D×1Ò1Ø&+×&:Ñ&:ˆEÐ"Ñ#ÜØ 7ÈÐYaß '�W¸5ôBð 	Bà-3¸5ôBð 	Bùò7 BøÜô [ÙÐGÈÀuÐMÈzÓZÕZûð[ûô ô 	mÜ�L‰LÐ1°4À$ˆLÔGÙ˜-·W©	À,Ð'OÈyÐY\ÐX]Ð^Ð`kÓlÕlûð	músN   Ã7I Ã;IÄI Å+I: ÉI ÉI7É!I2É,I7É2I7É:K Ê0J;Ê5K Ê;K r&   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úprovider_idrº   r1   Úmodelsr2   Údefault_model_idÚpricerÀ   Úsetuprš   r£   r
   rÄ   Ú__static_attributes__r&   r*   r(   r‹   r‹   ƒ   so   † ÙZà€KØ€EØ€FØ$ÐØ€EÙØ˜VØVØÐ%5Ð;aôc€Eõ
DõMð
 0Dñ@Bà#'ð@BàUY÷@Bô @Br*   r‹   c               ó   € V ^8„  d   QhRR/# )r$   r%   ÚNoner&   )r'   s   "r(   r)   r)   Ú   s   € ÷ >ñ >�Tñ >r*   c                ó8   € V P                  \        4       4       R# )uI   Plugin entry point â€” wire ``OpenAIImageGenProvider`` into the registry.N)Úregister_image_gen_providerr‹   )Úctxs   &r(   Úregisterræ   Ú   s   € à×#Ñ#Ô$:Ó$<Ö=r*   ))zgpt-image-2.5-flareÚFlareÚFastz%Everyday image generation and editing)zgpt-image-2.5-sunburstÚSunburstÚSlowerz Precision generation and editing)r   ÚlowÚmediumÚhighÚxhighÚmax)2rÚ   Ú
__future__r   r…   Úloggingrw   Útypingr   r   r   r   r   Úagent.secret_scoper   r	   Úagent.image_gen_providerr
   r   r   Úplugins.image_gen._commonr   Ú	API_MODELr   r2   r   r   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerrÖ   rA   ÚitemsÚtitler1   r3   rG   rQ   rZ   r‚   r‰   r‹   ræ   )r�   rÉ   r¬   r5   r    r!   r"   s   0000000r(   Ú<module>rú      sX  ðñ1õ #ã 	Û Û 	ß 3Õ 3ç 9ß aÑ a÷÷ ÷ ÷ ð 
×	Ò	˜8Ó	$€ð
Ø>O×>UÒ>UÔ>WÔXÑ>W±°€sÐ,ˆtÐ,�[ )Ñ,Ò,Ñ>WÒXð
ñ.
÷ñ.
Ñ)ˆE˜ó IˆGð ˜FÔ"‰¨5¨'°°7°)Ð(<Ø˜¨ v¨R°·±³Ð/@ÀÐBØ�UØ˜Ø˜Ø�wð?
ò 	
ñ Iñ 	=ñ.
õð
€õ&dõ
Iõõ#õ 6õ8ôTBÐ3ô TB÷n>ùó Yùös   Á<D ÂAD&