+
    kHàjà5  ã                  óÌ  € R t ^ RIHt ^ RIt^ RIt^ RI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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  ]PB                  ! ]"4      t#Rt$^t%R*t&]'! 0 R+m4      t(R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 lt0R R lt1R R lt2R R lt3R R lt4RR/R  R! llt5RR/R" R# llt6R$ R% lt7 ! R& R']4      t8R( R) lt9R# ),u  OpenAI image generation â€” ChatGPT/Codex OAuth variant.

Same catalog/tiers as the ``openai`` plugin (``gpt-image-2`` low/medium/high), posted to the
Codex backend's native ``images/generations`` and ``images/edits`` endpoints, the same route the
official Codex client uses (``codex-rs/ext/image-generation``). No ``OPENAI_API_KEY`` is needed.

There is deliberately NO chat/host model here. An earlier version rode a Responses call with a
hosted ``image_generation`` tool on a pinned chat model (``gpt-5.5``): when OpenAI withdrew that id
from an account cohort every image call 404'd while chat kept working (#105398, #107076), and the
host model was free to answer in text instead of calling the tool. The native route has neither
failure mode.

The backend does not enforce ``model``/``quality``/``size`` â€” it accepts unknown model ids and
returns its own quality/size (#107233). We send the catalog values and report what came back
(``reported_quality``/``reported_size``) so a request that was not honoured is diagnosable.
)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)ÚDEFAULT_ASPECT_RATIOÚresolve_aspect_ratioÚsave_b64_imageÚsuccess_response)	ÚGPT_IMAGE_2_API_MODELÚGPT_IMAGE_2_DEFAULTÚGPT_IMAGE_2_TIERSÚStaticImageGenProviderÚcollect_source_imagesÚerror_factoryÚprompt_required_errorÚresolve_static_modelÚsize_foriô  uz   No Codex/ChatGPT OAuth credentials available. Run `hermes auth add openai-codex` (or `hermes setup` â†’ Codex) to sign in.c               ó    € V ^8„  d   QhRRRR/# )é   ÚbodyÚstrÚreturn© )Úformats   "ÚL/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/openai-codex/__init__.pyÚ__annotate__r   0   s   € ÷ (ñ ( ð (¨ñ (ó    c                ó²  € T ;'       g    Rp \         P                  ! V4      p\        V\        4      '       d   VP	                  R4      MRp\        V\        4      '       d   VP	                  R4      MRp\        V\
        4      '       d.   VP                  4       '       d   VP                  4       R\         # TR\         #   \        \        3 d     Li ; i)zZBounded summary preferring parsed ``error.message`` (Codex bodies carry leading metadata).Ú ÚerrorNÚmessage)
ÚjsonÚloadsÚ
isinstanceÚdictÚgetr   ÚstripÚ_MAX_ERROR_BODY_CHARSÚ	TypeErrorÚ
ValueError)r   ÚtextÚpayloadr"   r#   s   &    r   Ú_summarize_error_bodyr/   0   s®   € à�:ˆ:�2€DðÜ—*’*˜TÓ"ˆÜ(2°7¼D×(AÒ(A�—‘˜GÔ$ÀtˆÜ*4°U¼D×*AÒ*A�%—)‘)˜IÔ&ÀtˆÜ�gœs×#Ò#¨¯©¯ªØ—=‘=“?Ð#9Ô$9Ð:Ð:ð Ð&Ô&Ð'Ð'øô ”zÐ"ô Ùðús   ŽBC Â"C ÃCÃCc               ó   € V ^8„  d   QhRR/# )r   r   útuple[str, dict[str, Any]]r   )r   s   "r   r   r   >   s   € ÷ cñ cÐ2ñ cr   c                 ó0   € \        \        \        R RR7      # )ÚOPENAI_IMAGE_MODELúopenai-codex)Úenv_varÚ
config_key)r   r   ÚDEFAULT_MODELr   r   r   Ú_resolve_modelr8   >   s   € ÜÜœ=Ð2FÐSaôcð cr   c               ó   € V ^8„  d   QhRR/# )r   r   z#tuple[Optional[str], Optional[str]]r   )r   s   "r   r   r   C   s   € ÷ ñ Ð Cñ r   c                 ó  €  ^ RI Hp  V ! 4       w  r\        V\        4      '       d)   VP	                  4       '       d   VP	                  4       V3# R#   \
         d#   p\        P                  RT4       Ru Rp?# Rp?ii ; i)a.  ``(token, base_url)`` from one resolution (``agent.auxiliary_client`` owns expiry/pool/JWT):
the image request goes to the host the token's credential routes to (pool row /
``model.base_url`` / profile override), never a default it does not belong to (#121486).
``(None, None)`` without a usable token.)Ú"_resolve_codex_credential_and_baseNz&Could not resolve Codex credential: %s)NN)Úagent.auxiliary_clientr;   r&   r   r)   Ú	ExceptionÚloggerÚdebug)r;   ÚtokenÚbase_urlÚexcs       r   Ú_read_codex_credentialrC   C   sg   € ð
	ÝMá<Ó>‰ˆÜ�eœS×!Ò! e§k¡k§m¢mØ—;‘;“= (Ð*Ð*ØÐøÜô Ü�‰Ð=¸sÔCØÕûðús(   ‚:A ½A ÁA ÁA>ÁA9Á3A>Á9A>c               ó   € V ^8„  d   QhRR/# ©r   r   Úboolr   )r   s   "r   r   r   T   s   € ÷ ñ ˜$ñ r   c                 ó4   €  ^ RI p R#   \         d     R# i ; i)é    NFT)ÚhttpxÚImportError)rI   s    r   Ú_httpx_availablerK   T   s#   € ðÛñ øô ô Úðús   ‚ ˆ–c               ó    € V ^8„  d   QhRRRR/# ©r   ÚrawÚbytesr   úOptional[str]r   )r   s   "r   r   r   \   s   € ÷ :ñ :˜5ð : ]ñ :r   c                ó<   € ^ RI Hp V! V 4      pV\        9   d   V# R# )rH   )Ú_sniff_mime_from_bytesN)Úagent.image_routingrR   Ú_ACCEPTED_INPUT_MIME)rN   rR   Úmimes   &  r   Ú_sniff_image_mimerV   \   s"   € Ý:á! #Ó&€DØÔ/Ô/ˆ4Ð9°TÐ9r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rN   rO   Útoo_bigr   Úunsupportedr   r   )r   s   "r   r   r   c   s.   € ÷ Iñ I˜Uð I¨Sð I¸sð IÀsñ Ir   c                óÊ   € \        V 4      \        8”  d   \        V4      h\        V 4      pVf   \        V4      hRV R\        P
                  ! V 4      P                  R4       2# )zLSize- and MIME-check raw image bytes, then return a canonical ``data:`` URL.údata:z;base64,Úascii)ÚlenÚ_MAX_INPUT_IMAGE_BYTESr,   rV   Úbase64Ú	b64encodeÚdecode)rN   rX   rY   rU   s   &&& r   Ú_encode_input_imagerb   c   s^   € ä
ˆ3ƒxÔ(Ô(Ü˜Ó!Ð!Ü˜SÓ!€DØ‚|Ü˜Ó%Ð%Ø�4�&˜¤×!1Ò!1°#Ó!6×!=Ñ!=¸gÓ!FÐ GÐHÐHr   c               ó    € V ^8„  d   QhRRRR/# ©r   Úvaluer   r   r   )r   s   "r   r   r   m   s   € ÷ 
Añ 
A¨ð 
A°ñ 
Ar   c                ó  € R V 9  d   \        R4      hV P                  R ^4      w  rVP                  4       pVP                  R4      '       d   RV9  d   \        R4      h\	        \
        P                  ! VRR7      RR4      # )	Ú,z+Image data URL is missing a comma separatorzdata:image/z;base64z?Only base64 data:image URLs are supported as Codex image inputsT)ÚvalidatezImage data URL exceeds 25MB capz5Image data URL does not contain supported image bytes)r,   ÚsplitÚlowerÚ
startswithrb   r_   Ú	b64decode)re   ÚheaderÚdataÚ	header_lcs   &   r   Ú_data_url_to_input_image_urlrp   m   s|   € Ø
�%ÔÜÐFÓGÐGØ—;‘;˜s AÓ&�L€FØ—‘“€IØ×Ñ ×.Ò.°)À9Ô2LÜÐZÓ[Ð[ÜÜ×Ò˜¨Ô-Ø)Ø?óAð Ar   c               ó    € V ^8„  d   QhRRRR/# rd   r   )r   s   "r   r   r   z   s   € ÷ @ñ @ Sð @¨Sñ @r   c                ó"  € ^ RI HpHp V! V 4      '       g   \        RV  24      hV! RRR7      ;_uu_ 4       pVP	                  V 4      pRRR4       XP                  4        \        VP                  RV  2RV  24      #   + '       g   i     L=; i)	zWThe edit endpoint takes inline data URLs only (as the official client sends), so fetch.)Úcreate_ssrf_safe_clientÚis_safe_urlz(Image URL failed the SSRF safety check: ç      N@T)ÚtimeoutÚfollow_redirectsNzImage URL exceeds 25MB cap: z,Image URL did not return a supported image: )Útools.url_safetyrs   rt   r,   r(   Úraise_for_statusrb   Úcontent)re   rs   rt   ÚclientÚresponses   &    r   Ú_remote_image_to_data_urlr}   z   sˆ   € çEá�u×ÒÜÐCÀEÀ7ÐKÓLÐLÙ	 ¨À×	EÕ	EÈØ—:‘:˜eÓ$ˆ÷ 
Fà×ÑÔÜØ×ÑØ
& u gÐ.Ø
6°u°gÐ>ó@ð @÷ 
F×	Eús   ·A>Á>B	c               ó    € V ^8„  d   QhRRRR/# rd   r   )r   s   "r   r   r   ‰   s   € ÷ ?ñ ? Cð ?¨Cñ ?r   c                ó”  € ^ RI Hp V! V 4      pV'       d   \        V4      h\        \        P
                  P                  V 4      4      P                  4       pVP                  4       '       g   \        RV  24      hVP                  4       P                  ^ 8:  d   \        RV  24      h\        VP                  4       RV  2RV  24      # )rH   )Úget_read_block_errorz2Image input path does not exist or is not a file: zImage input path is empty: z#Image input path exceeds 25MB cap: z+Image input path is not a supported image: )Úagent.file_safetyr€   r,   r   ÚosÚpathÚ
expanduserÚresolveÚis_fileÚstatÚst_sizerb   Ú
read_bytes)re   r€   Úblockedrƒ   s   &   r   Ú_local_image_to_data_urlr‹   ‰   s¯   € Ý6á" 5Ó)€GßÜ˜Ó!Ð!Ü”—‘×"Ñ" 5Ó)Ó*×2Ñ2Ó4€DØ�<‰<�>Š>ÜÐMÈeÈWÐUÓVÐVØ‡y�yƒ{×Ñ˜aÔÜÐ6°u°gÐ>Ó?Ð?ÜØ�‰ÓØ
-¨e¨WÐ5Ø
5°e°WÐ=ó?ð ?r   c               ó    € V ^8„  d   QhRRRR/# )r   re   r   r   zdict[str, str]r   )r   s   "r   r   r   š   s   € ÷ $ñ $˜3ð $ >ñ $r   c                ó2  € T ;'       g    RP                  4       pV'       g   \        R4      hVP                  4       pVP                  R4      '       d   \	        V4      pRV/# VP                  R4      '       d   \        V4      pRV/# \        V4      pRV/# )zRConvert a URL/data URL/local path into an ``images[]`` entry for ``images/edits``.r!   zBlank image inputr[   Ú	image_url)zhttp://zhttps://)r)   r,   rj   rk   r}   rp   r‹   )re   Ú	candidateÚloweredrŽ   s   &   r   Ú_to_input_imager‘   š   s›   € à—�˜"×#Ñ#Ó%€IßÜÐ,Ó-Ð-Ø�o‰oÓ€GØ×ÑÐ1×2Ò2Ü-¨iÓ8ˆ	ð
 ˜Ð#Ð#ð	 
×	Ñ	˜G×	$Ò	$Ü0°Ó;ˆ	ð ˜Ð#Ð#ô -¨YÓ7ˆ	Ø˜Ð#Ð#r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rŽ   rP   Úreference_image_urlsúOptional[list[str]]r   zlist[dict[str, str]]r   )r   s   "r   r   r   ©   s$   € ÷ 8ñ 8Øð8Ø4Gð8àñ8r   c                ód   € \        W\        R 7      pV Uu. uF  p\        V4      NK  	  up# u upi ))Úlimit)r   Ú_MAX_REFERENCE_IMAGESr‘   )rŽ   r“   Úvaluesre   s   &&  r   Ú_normalize_input_imagesr™   ©   s.   € ô # 9ÔJ_Ô`€FÙ06Ó7± uŒO˜EÖ"±Ñ7Ð7ùÒ7s   –-Úinput_imagesc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Úpromptr   ÚsizeÚqualityrš   úOptional[list[dict[str, str]]]r   r1   r   )r   s   "r   r   r   °   s4   € ÷ &ñ &Øð&Øð&Ø(+ð&Ø;Yð&àñ&r   c                óN   € RV R\         R^RVRVRR/pV'       d	   W4R&   R	V3# R
V3# )uÅ   ``(endpoint_path, json_body)`` â€” ``images/edits`` when sources are present, else
``images/generations``. Field set mirrors the official client's ``ImageGenerationRequest`` /
``ImageEditRequest``.rœ   ÚmodelÚnrž   r�   Ú
backgroundÚopaqueÚimageszimages/editszimages/generations)Ú	API_MODEL)rœ   r�   rž   rš   r   s   $$$$ r   Ú_build_image_requestr§   °   sH   € ð 	�&˜'¤9¨c°1°iÀÈ&ÐRVØ�hð€D÷ Ø%ˆX‰Ø˜tÐ#Ð#Ø Ð%Ð%r   c               ó4   € V ^8„  d   QhRRRRRRRRRRRRR	R
/# )r   r@   r   rœ   r�   rž   rš   rŸ   rA   r   údict[str, Any]r   )r   s   "r   r   r   À   sF   € ÷ ñ ØðØðØ&)ðØ47ðØGeðàðð ñr   c               óØ  € ^ RI p^ RIHp VP                  4       P	                  R4      pV! WR7      pVP                  RRV  2RRR	\        \        P                  ! 4       4      /4       \        WW4R
7      w  ršVP                  RRRRRR7      pVP                  W¸R7      ;_uu_ 4       pVP                  V RV	 2V
R7      pRRR4       XP                  R8¼  d/   \        RVP                   R\        VP                   4       24      hVP#                  4       p\%        V\&        4      '       g   \        R4      hVP(                  P+                  R4      VR&   V#   + '       g   i     L ; i)zîPOST to the native Codex images endpoint; return the decoded JSON body plus
``imagegen_request_id`` (backend correlation id, for support tickets).

``base_url`` must come from the same resolution as ``token`` (``_read_codex_credential``).N)Úcodex_cloudflare_headersÚ/)rA   ÚAuthorizationzBearer zContent-Typezapplication/jsonzx-codex-image-turn-id)rœ   r�   rž   rš   g     Àr@g      >@ru   )ÚconnectÚreadÚwriteÚpool)rv   Úheaders)r$   i�  zCodex images API returned HTTP z: z+Codex images API returned a non-object bodyzx-codex-imagegen-request-idÚimagegen_request_id)rI   Úagent.codex_headersr«   r)   ÚrstripÚupdater   ÚuuidÚuuid4r§   ÚTimeoutÚClientÚpostÚstatus_codeÚRuntimeErrorr/   r-   r$   r&   r'   r²   r(   )r@   rœ   r�   rž   rš   rA   rI   r«   r²   rƒ   r   rv   Úhttpr|   r.   s   &$$$$$         r   Ú_post_image_requestr¿   À   sK  € ó Ý<à�~‰~Ó×&Ñ& sÓ+€HÙ& uÔ@€GØ‡N�NØ˜7 5 'Ð*ØÐ*Ø¤¤T§Z¢Z£\Ó!2ðô ô
 &¨VÈÔk�J€DØ�m‰m˜E¨4°eÀ4ÈdˆmÓS€GØ	�‰˜gˆ×	7Ô	7¸4Ø—9‘9 ˜z¨¨4¨&Ð1¸�9Ó=ˆ÷ 
8à×Ñ˜sÔ"ÜØ-¨h×.BÑ.BÐ-CÀ2Ü$ X§]¡]Ó3Ð4ð6ó7ð 	7ð �m‰m‹o€GÜ�gœt×$Ò$ÜÐHÓIÐIØ%-×%5Ñ%5×%9Ñ%9Ð:WÓ%X€GÐ!Ñ"Ø€N÷ 
8×	7ús   Â(EÅE)	c               ó    € V ^8„  d   QhRRRR/# rM   r   )r   s   "r   r   r   á   s   € ÷ ñ ˜ð  =ñ r   c                óª   € ^ RI p\        V 4      ^8  g   V R,          R8w  g   V R,          R8w  d   R# VP                  RV R,          4      w  r#V RV 2# )	z;``"{w}x{h}"`` for a PNG payload, or None if not a PNG IHDR.N:Né   Ns   ‰PNG

:é   é   Ns   IHDRz>II:rÄ   é   NÚx)Ústructr]   Úunpack)rN   rÇ   ÚwidthÚheights   &   r   Ú_png_pixel_sizerË   á   sQ   € ãä
ˆ3ƒx�"„}˜˜B�Ð#7Ô7¸3¸u½:ÈÔ;PÙØ—M‘M %¨¨U­Ó4�M€EØˆW�A�f�XÐÐr   c                  óp   € ] tR t^ëtRtRtRt]t]	t
RtR R ltR R ltR	 R
 lt]3RRRR/R R llltRtR# )ÚOpenAICodexImageGenProviderzEgpt-image-2 routed through ChatGPT/Codex OAuth instead of an API key.r4   úOpenAI (Codex auth)Úvariesc               ó   € V ^8„  d   QhRR/# rE   r   )r   s   "r   r   Ú(OpenAICodexImageGenProvider.__annotate__ô   s   € ÷ Hñ H˜dñ Hr   c                	óZ   € \        \        4       ^ ,          4      ;'       d    \        4       # )rH   )rF   rC   rK   ©Úselfs   &r   Úis_availableÚ(OpenAICodexImageGenProvider.is_availableô   s"   € ÜÔ*Ó,¨QÕ/Ó0×GÐGÔ5EÓ5GÐGr   c               ó   € V ^8„  d   QhRR/# ©r   r   r©   r   )r   s   "r   r   rÑ   ÷   s   € ÷ 
ñ 
 .ñ 
r   c                	ó   € R RRRRRR. RRR	R
/# )ÚnamerÎ   ÚbadgeÚfreeÚtagu[   gpt-image-2 via ChatGPT/Codex OAuth â€” no API key required; supports text and image inputsÚenv_varsÚ
post_setupÚopenai_codexÚpost_setup_hintut   Sign in with `hermes auth add openai-codex` (or `hermes setup` â†’ Codex) if you haven't already. No API key needed.r   rÓ   s   &r   Úget_setup_schemaÚ,OpenAICodexImageGenProvider.get_setup_schema÷   s1   € àÐ)Ø�VØÐpØ˜ð ˜.Øð=ð
ð 	
r   c               ó   € V ^8„  d   QhRR/# rØ   r   )r   s   "r   r   rÑ     s   € ÷ `ñ `˜nñ `r   c                	ó   € R RR.R\         /# )Ú
modalitiesr-   ÚimageÚmax_reference_images)r—   rÓ   s   &r   ÚcapabilitiesÚ(OpenAICodexImageGenProvider.capabilities  s   € Ø˜v wÐ/Ð1GÔI^Ð_Ð_r   rŽ   Nr“   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   rœ   r   Úaspect_ratiorŽ   rP   r“   r”   Úkwargsr   r   r©   r   )r   s   "r   r   rÑ     s@   € ÷ 2ñ 2Øð2Ø),ð2à ð2à?Rð2ð ð2ð 
ñ	2r   c               	ó  € T;'       g    R P                  4       p\        V4      pV'       g   \        RV4      # \        4       w  rxV'       g   \	        RV4      ! \
        R4      # \        4       '       g   \	        RV4      ! RR4      # \        4       w  rš\        V4      p\	        RWiVR7      p \        W44      p \        YqYºR	,          T;'       g    RTR
7      pTP                  R4      p\        T\         4      '       d>   T'       d6   \        T^ ,          \"        4      '       d   T^ ,          P                  R4      MRp\        T\$        4      '       d	   T'       g
   T! RR4      #  \'        \(        P*                  ! T4      4      p\-        TRT	 2R7      p\/        \%        T4      Y‘TRT'       d   RMRRTR	T
R	,          R\1        T4      RTRTRTP                  R	4      RTP                  R4      R TP                  R 4      /R!7      #   \         d   pT! RT 2R4      u Rp?# Rp?ii ; i  \         d.   p\        P                  RRR7       T! RT 2R4      u Rp?# Rp?ii ; i  \         d   pT! RT 2R4      u Rp?# Rp?ii ; i)"r!   r4   Úauth_requiredz6httpx Python package not installed (pip install httpx)Úmissing_dependency)r¡   rœ   z-Invalid image input for Codex image editing: Úinvalid_image_inputNrž   )rœ   r�   rž   rš   rA   zCodex image generation failedT)Úexc_infoz/OpenAI image generation via Codex auth failed: Ú	api_errorrn   Úb64_jsonz1Codex images API response contained no image dataÚempty_responseÚopenai_codex_)ÚprefixzCould not save image to cache: Úio_errorrç   r-   r�   Úinput_image_countÚrequested_sizeÚ
pixel_sizeÚreported_qualityÚreported_sizer³   )rç   r¡   rœ   rì   ÚproviderÚmodalityÚextra)r)   r
   r   rC   r   Ú_NO_AUTHrK   r8   r   r™   r=   r¿   r>   r?   r(   r&   Úlistr'   r   rË   r_   rl   r   r   r]   )rÔ   rœ   rì   rŽ   r“   rí   Úaspectr@   rA   Útier_idÚmetar�   Úfailrš   rB   r.   rn   Úb64rû   Ú
saved_paths   &&&$$,              r   ÚgenerateÚ$OpenAICodexImageGenProvider.generate  sg  € ð
 —,�,˜B×%Ñ%Ó'ˆÜ% lÓ3ˆßÜ(¨¸Ó@Ð@Ü0Ó2‰ˆßÜ  °Ô8¼À?ÓSÐSÜ×!Ò!Ü  °Ô8ØHÐJ^ó`ð `ô 'Ó(‰ˆÜ˜ÓˆÜ˜^¨VÈ6ÔRˆð	fÜ2°9ÓSˆLð	^Ü)Ø¨4¸i½ÐWc×WkÐWkÐgkØ!ô#ˆGð �{‰{˜6Ó"ˆÜ)3°D¼$×)?Ò)?ÇDÌZÐX\Ð]^ÕX_Ôae×MfÒMfˆd�1�g�k‰k˜*Ô%ÐlpˆÜ˜#œs×#Ò#¯3ÙÐKÐM]Ó^Ð^ð	MÜ(¬×)9Ò)9¸#Ó)>Ó?ˆJÜ'¨°mÀGÀ9Ð4MÔNˆJô  Ü�j“/¨ÈfØ#¿©gÈ6à˜˜i¨¨i­Ð:MÌsÐS_ÓO`Ø  $¨°jØ" G§K¡K°	Ó$:¸OÈWÏ[É[ÐY_ÓM`Ø% w§{¡{Ð3HÓ'Ið	ôð 	øô+ ô 	fÙÐGÈÀuÐMÐOdÓeÕeûð	fûô ô 	^Ü�L‰LÐ8À4ˆLÔHÙÐIÈ#ÈÐOÐQ\Ó]Õ]ûð	^ûô ô 	MÙÐ9¸#¸Ð?ÀÓLÕLûð	MúsZ   Â.H Â: H, Å(/I' ÈH)ÈH$ÈH)È$H)È,I$È7"IÉI$ÉI$É'JÉ2JÉ=JÊJr   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úprovider_idÚlabelr   Úmodelsr7   Údefault_model_idÚpricerÕ   râ   ré   r	   r	  Ú__static_attributes__r   r   r   rÍ   rÍ   ë   sP   † ÙOà €KØ!€EØ€FØ$ÐØ€EõHõ
õ`ð 0Dñ2à#'ð2àUY÷2ô 2r   rÍ   c               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   r   =  s   € ÷ Cñ C�Tñ Cr   c                ó8   € V P                  \        4       4       R# )uD   Plugin entry point â€” register the Codex-backed image-gen provider.N)Úregister_image_gen_providerrÍ   )Úctxs   &r   Úregisterr  =  s   € à×#Ñ#Ô$?Ó$AÖBr   i  �>   ú	image/gifú	image/pngú
image/jpegú
image/webp):r  Ú
__future__r   r_   r$   Úloggingr‚   r·   Úpathlibr   Útypingr   r   r   r   r   Úagent.image_gen_providerr	   r
   r   r   Úplugins.image_gen._commonr   r¦   r   r7   r   r   r   r   r   r   r   Ú	getLoggerr  r>   r*   r—   r^   Ú	frozensetrT   r  r/   r8   rC   rK   rV   rb   rp   r}   r‹   r‘   r™   r§   r¿   rË   rÍ   r  r   r   r   Ú<module>r(     sè   ðñõ" #ã Û Û Û 	Û Ý ß 3Õ 3ç qÓ q÷$÷ $õ $ð
 
×	Ò	˜8Ó	$€àÐ àÐ Ø)Ð á Ò!WÓXÐ ðOð 	õ
(õcõ
õ"õ:õIõ
Aõ@õ?õ"$õ8ð&Ø\`÷&ð Øhl÷õBôOÐ"8ô O÷dCr   