+
    jHàj°5  ã                  óŽ  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HtHt ^ RIHtHtHtHtHt ]P,                  ! ]4      tRRRR	R
R/tR]R&   RtRtRRRRRRRRR/RRRRRRRRR/RRRRRRR RR!//tR"]R#&   R$tR%t]
R&] ]!]	3,          3,          t"R' R( lt#R[R) R* llt$R+RR,R-R.RR/R0/R1 R2 llt%R[R3 R4 llt&R\R5R/R6 R7 lllt'R8 R9 lt( ! R: R;]4      t)R<R=R>R=/R? R@ llt*RA RB lt+RC RD lt,RE RF lt-RG]RHR/RI RJ llt.RG]RKR/RL RM llt/RN RO lt0] ! RP RQ4      4       t1RRR/RS RT llt2RU RV lt3RW]0RXR0/RY RZ llt4R# )]zóShared helpers for the bundled ``image_gen`` provider plugins. Providers are loaded by path
(``hermes_plugins.image_gen__<name>``) and resolve this via the repo root on ``sys.path``;
not a plugin itself (the scanner only looks at directories).)ÚannotationsN)Ú	dataclass)ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚTuple)ÚImageGenProviderÚerror_responseÚnormalize_reference_imagesÚsave_b64_imageÚsave_url_imageÚ	landscapeÚ	1536x1024ÚsquareÚ	1024x1024ÚportraitÚ	1024x1536údict[str, str]ÚOPENAI_SIZESzgpt-image-2zgpt-image-2-mediumzgpt-image-2-lowÚdisplayzGPT Image 2 (Low)Úspeedz~15sÚ	strengthszFast iteration, lowest costÚqualityÚlowzGPT Image 2 (Medium)z~40su   Balanced â€” defaultÚmediumzgpt-image-2-highzGPT Image 2 (High)z~2minz,Highest fidelity, strongest prompt adherenceÚhighúdict[str, dict[str, Any]]ÚGPT_IMAGE_2_TIERSz1Prompt is required and must be a non-empty stringz8openai Python package not installed (pip install openai).c               ó    € V ^8„  d   QhRRRR/# )é   ÚaspectÚstrÚreturn© )Úformats   "Ú>/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/_common.pyÚ__annotate__r)   2   s   € ÷ <ñ <�Sð <˜Sñ <ó    c                óD   € \         P                  V \         R,          4      # )zCOpenAI ``size`` string for a semantic aspect (square when unknown).r   )r   Úget)r#   s   &r(   Úsize_forr-   2   s   € ä×Ñ˜F¤L°Õ$:Ó;Ð;r*   c               ó    € V ^8„  d   QhRRRR/# )r"   ÚsubúOptional[str]r%   údict[str, Any]r&   )r'   s   "r(   r)   r)   7   s   € ÷ ñ ˜}ð ¸ñ r*   c                ót  € V f   RMRV  2p ^ RI Hp V! 4       p\        V\        4      '       d   VP	                  R4      MRpV e*   \        V\        4      '       d   VP	                  V 4      MRp\        V\        4      '       d   V# / #   \
         d#   p\        P                  RY4       / u Rp?# Rp?ii ; i)zTRead ``image_gen`` (or ``image_gen.<sub>``) from config.yaml; ``{}`` on any failure.NÚ	image_genz
image_gen.)Úload_configzCould not load %s config: %s)Úhermes_cli.configr4   Ú
isinstanceÚdictr,   Ú	ExceptionÚloggerÚdebug)r/   Úlabelr4   ÚcfgÚsectionÚexcs   &     r(   Úload_image_gen_configr?   7   s›   € àš;‰K¨j¸¸Ð,>€Eð
Ý1á‹mˆÜ*4°S¼$×*?Ò*?�#—'‘'˜+Ô&ÀTˆØŠ?Ü*4°W¼d×*CÒ*C�g—k‘k #Ô&ÈˆGÜ$ W¬d×3Ò3ˆwÐ;¸Ð;øÜô Ü�‰Ð3°UÔ@Ø�	ûðús$   �A:B
 ÂB
 Â
B7ÂB2Â,B7Â2B7ÚexplicitÚinclude_top_levelTÚconfigÚpassthroughFc               ó<   € V ^8„  d   QhRRRRRRRRRRR	R
RRRR
RR/	# )r"   Úmodelsr   Údefaultr$   Úenv_varÚ
config_keyr@   r0   rA   ÚboolrB   zOptional[dict[str, Any]]rC   r%   ztuple[str, dict[str, Any]]r&   )r'   s   "r(   r)   r)   G   sZ   € ÷ $ñ $Ø%ð$Ø03ð$ØADð$ØRUð$àð$à7;ð$ð %ð$ð ;?ð$ð  ñ	$r*   c               óÜ  € \        V\        4      '       d<   VP                  4       V 9   d'   VP                  4       WP                  4       ,          3# \        P                  P                  V4      pV'       d   W€9   d   W€V,          3# Vf   \        4       MTp	V	P                  V4      p
\        V
\        4      '       d   V
P                  R4      MR.pV'       d!   VP                  V	P                  R4      4       V F-  p\        V\        4      '       g   K  WÀ9   g   K#  WÀV,          3u # 	  V'       d.   \        R W‹^ ,          3 4       R4      pV'       d   VRVRVRR/3# WV,          3# )u.  ``(model_id, meta)`` from a fixed catalog; first *known* id wins (unknown ids fall through):
explicit â†’ ``env_var`` â†’ ``image_gen.<config_key>.model`` â†’ ``image_gen.model`` â†’ ``default``.

``passthrough``: an unknown id from ``env_var`` or the provider-scoped ``image_gen.<config_key>.model``
is sent verbatim as the API model with no ``quality`` (OpenAI-compatible gateways serve their own
image model names and reject unknown enum values, #97928). The shared top-level ``image_gen.model``
never passes through â€” it may hold another provider's id.NÚmodelc              3  ó¢   "  € T FE  p\        V\        4      '       g   K  VP                  4       '       g   K3  VP                  4       x € KG  	  R # 5i©N)r6   r$   Ústrip)Ú.0Úcs   & r(   Ú	<genexpr>Ú'resolve_static_model.<locals>.<genexpr>a   s5   é € ÐlÑ*G QÌ:ÐVWÔY\×K]”yÐbc×biÑbi×bk”y�q—w‘w—y�yÓ*Gùs   ‚AŸA·AÚ r   Ú	api_modelr   )
r6   r$   rN   ÚosÚenvironr,   r?   r7   ÚappendÚnext)rE   rF   rG   rH   r@   rA   rB   rC   Úenv_overrider<   ÚscopedÚ
candidatesÚ	candidateÚcustoms   &&$$$$$$      r(   Úresolve_static_modelr^   G   s*  € ô �(œC× Ò  X§^¡^Ó%5¸Ô%?Ø�~‰~Ó ¯©Ó(8Õ!9Ð9Ð9Ü—:‘:—>‘> 'Ó*€Lß˜Ô.Ø LÕ1Ð1Ð1Ø%+¢^Ô
Ô
!¸€CØ�W‰W�ZÓ €FÜ)3°F¼D×)AÒ)A�&—*‘*˜WÔ%ÀtÐL€JßØ×Ñ˜#Ÿ'™' 'Ó*Ô+Ûˆ	Ü�i¤×%Ô%¨)Ö*=Ø YÕ/Ð/Ò/ñ  ÷ ÜÑl¨<ÀA½Ñ*GÓlÐnpÓqˆßØ˜I v¨{¸FÀIÈtÐTÐTÐTØ˜7•OÐ#Ð#r*   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r"   Ú	image_urlr0   Úreference_image_urlszOptional[list[str]]ÚlimitzOptional[int]r%   z	list[str]r&   )r'   s   "r(   r)   r)   g   s,   € ÷ =ñ =Øð=Ø4Gð=ØP]ð=àñ=r*   c                óú   € . p\        V \        4      '       d6   V P                  4       '       d    VP                  V P                  4       4       TP	                  \        V4      ;'       g    . 4       Ve   VRV # T# )zNPrimary ``image_url`` first, then normalized references, clamped to ``limit``.N)r6   r$   rN   rW   Úextendr   )r`   ra   rb   Úsourcess   &&& r(   Úcollect_source_imagesrf   g   sf   € ð €GÜ�)œS×!Ò! i§o¡o×&7Ò&7Ø�‰�y—‘Ó(Ô)Ø‡N�NÔ-Ð.BÓC×IÐIÀrÔJØ#Ò/ˆ7�6�Eˆ?Ð<°WÐ<r*   Úpricec               ó(   € V ^8„  d   QhRRRRRRRR/# )	r"   rE   r   ÚfieldszIterable[str]rg   r0   r%   úlist[dict[str, Any]]r&   )r'   s   "r(   r)   r)   r   s0   € ÷ ñ Ø%ðàðð ðð ñ	r*   c               óÀ   € . pV P                  4        FG  w  rERV/pV F  pTP                  YwR8X  d   TMR4      Wg&   K!  	  Ve   W&R&   VP                  V4       KI  	  V# )u`   Picker rows: ``id`` + ``fields`` (missing ``display`` â†’ id, else ``""``); ``price`` overrides.Úidr   rS   rg   )Úitemsr,   rW   )rE   ri   rg   ÚrowsÚmodel_idÚmetaÚrowÚfields   &&$     r(   Úcatalog_rowsrs   r   sh   € ð €DØ Ÿ,™,ž.‰ˆØ# XÐ.ˆÛˆEØŸ™ %¸iÔ5G©ÈRÓPˆC‹Jñ àÒØ �‰LØ�‰�CÖñ )ð €Kr*   c               ó4   € V ^8„  d   QhRRRRRRRRRRRRRR	/# )
r"   Únamer$   ÚbadgeÚtagÚkeyÚpromptÚurlr%   r1   r&   )r'   s   "r(   r)   r)   ƒ   sD   € ÷ ñ Ø
ðØðØ #ðØ-0ðØ:=ðØDGðàñr*   c               ó$   € RV RVRVRRVRVRV/./# )zH``get_setup_schema()`` dict for a provider authenticated by one env var.ru   rv   rw   Úenv_varsrx   ry   rz   r&   )ru   rv   rw   rx   ry   rz   s   &&&$$$r(   Úapi_key_setup_schemar}   ƒ   s2   € ð
 	��g˜u e¨S°*ÀÀsÈHÐV\Ð^cÐehÐ?iÐ>jðð r*   c                  óÆ   € ] tR t^Œt$ RtR]R&   R]R&   / tR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   / t
R]R&   ]R R l4       t]R R l4       tR R ltR R ltR R ltRtR# )ÚStaticImageGenProvidera  Identity + picker surface from class attributes: ``provider_id``/``label``; fixed catalog via
``models`` (+ ``default_model_id``, ``price``, ``catalog_fields``); single-env-var auth via
``setup`` (kwargs for :func:`api_key_setup_schema`). Dynamic providers override methods.r$   Úprovider_idr;   r   rE   Nr0   Údefault_model_idrg   ztuple[str, ...]Úcatalog_fieldsr1   Úsetupc               ó   € V ^8„  d   QhRR/# ©r"   r%   r$   r&   )r'   s   "r(   r)   Ú#StaticImageGenProvider.__annotate__š   s   € ÷  ñ  �cñ  r*   c                	ó   € V P                   # rM   )r€   ©Úselfs   &r(   ru   ÚStaticImageGenProvider.name™   s   € à×ÑÐr*   c               ó   € V ^8„  d   QhRR/# r…   r&   )r'   s   "r(   r)   r†   ž   s   € ÷ ñ ˜cñ r*   c                	ó   € V P                   # rM   )r;   rˆ   s   &r(   Údisplay_nameÚ#StaticImageGenProvider.display_name�   s   € à�z‰zÐr*   c               ó   € V ^8„  d   QhRR/# )r"   r%   rj   r&   )r'   s   "r(   r)   r†   ¡   s   € ÷ Pñ PÐ1ñ Pr*   c                	óZ   € \        V P                  V P                  V P                  R 7      # ))rg   )rs   rE   r‚   rg   rˆ   s   &r(   Úlist_modelsÚ"StaticImageGenProvider.list_models¡   s   € Ü˜DŸK™K¨×)<Ñ)<ÀDÇJÁJÔOÐOr*   c               ó   € V ^8„  d   QhRR/# )r"   r%   r0   r&   )r'   s   "r(   r)   r†   ¤   s   € ÷ %ñ %˜}ñ %r*   c                	ó   € V P                   # rM   )r�   rˆ   s   &r(   Údefault_modelÚ$StaticImageGenProvider.default_model¤   s   € Ø×$Ñ$Ð$r*   c               ó   € V ^8„  d   QhRR/# )r"   r%   r1   r&   )r'   s   "r(   r)   r†   §   s   € ÷ 2ñ 2 .ñ 2r*   c                	ó,   € \        R/ V P                  B # )Nr&   )r}   rƒ   rˆ   s   &r(   Úget_setup_schemaÚ'StaticImageGenProvider.get_setup_schema§   s   € Ü#Ñ1 d§j¡jÑ1Ð1r*   r&   ©r   r   r   rg   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__rE   r�   rg   r‚   rƒ   Úpropertyru   r�   r‘   r•   r™   Ú__static_attributes__r&   r*   r(   r   r   Œ   s„   ‡ ñ`ð ÓØƒJØ(*€FÐ%Ó*Ø&*Ð�mÓ*Ø€Eˆ=ÓØ&P€N�OÓPØ€Eˆ>Óàô ó ð ð ôó ðõPõ%÷2ñ 2r*   r   rK   rS   ry   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r"   Úproviderr$   r#   rK   ry   r%   ÚErrorFnr&   )r'   s   "r(   r)   r)   «   s0   € ÷ ñ ˜Cð ¨ð ¸ð È#ð ÐW^ñ r*   c               ó&   a aaa€ R VVVV 3R llpV# )zPReturn ``fail(error, error_type, **override)`` pre-bound to this call's context.c               ó(   € V ^8„  d   QhRRRRRRRR/# )r"   Úerrorr$   Ú
error_typeÚoverrider   r%   r1   r&   )r'   s   "r(   r)   Ú#error_factory.<locals>.__annotate__®   s.   € ÷ Lñ L�Cð L Sð L°cð L¸nñ Lr*   c                ób   <€ \        SSSSR 7      pVP                  V4       \        RRV RV/VB # ))r¥   rK   ry   Úaspect_ratior©   rª   r&   )r7   Úupdater   )r©   rª   r«   Úkwargsr#   rK   ry   r¥   s   &&, €€€€r(   ÚfailÚerror_factory.<locals>.fail®   s8   ø€ Ü˜x¨u¸VÐRXÔYˆØ�‰�hÔÜÑK EÐK°jÐKÀFÑKÐKr*   r&   )r¥   r#   rK   ry   r±   s   ffdd r(   Úerror_factoryr³   «   s   û€ ÷Ló Lð
 €Kr*   c               ó$   € V ^8„  d   QhRRRRRR/# )r"   r¥   r$   r#   r%   r1   r&   )r'   s   "r(   r)   r)   ¶   s&   € ÷ Pñ P Cð P°ð P¸ñ Pr*   c                ó.   € \        W4      ! \        R 4      # )Úinvalid_argument)r³   ÚPROMPT_REQUIRED)r¥   r#   s   &&r(   Úprompt_required_errorr¸   ¶   s   € Ü˜Ô*¬?Ð<NÓOÐOr*   c               ó   € V ^8„  d   QhRR/# )r"   r%   rI   r&   )r'   s   "r(   r)   r)   º   s   € ÷ 0ñ 0˜4ñ 0r*   c                 ó,   € \        R R 4      ^ ,          RJ# )rS   N)Úimport_openair&   r*   r(   Úopenai_importabler¼   º   s   € Ü˜˜RÓ  Õ#¨4Ð/Ð/r*   c               ó$   € V ^8„  d   QhRRRRRR/# )r"   r¥   r$   r#   r%   z$tuple[Any, Optional[dict[str, Any]]]r&   )r'   s   "r(   r)   r)   ¾   s"   € ÷ ñ ˜Cð ¨ð Ð1Uñ r*   c                óf   €  ^ RI pVR3#   \         d    R\        Y4      ! \        R4      3u # i ; i)zIReturn ``(openai_module, None)`` or ``(None, missing_dependency error)``.NÚmissing_dependency)ÚopenaiÚImportErrorr³   ÚOPENAI_MISSING)r¥   r#   rÀ   s   && r(   r»   r»   ¾   sB   € ð[Ûð �4ˆ<Ðøô ô [Ø”] 8Ô4´^ÐEYÓZÐZÒZð[ús   ‚
 Š#0¯0ÚlogÚon_url_failc               óD   € 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/# )r"   Úb64r0   rz   Úprefixr$   r;   r¥   rK   ry   r#   rÃ   úlogging.LoggerrÄ   ú%Optional[Callable[[Exception], None]]r%   z.tuple[Optional[str], Optional[dict[str, Any]]]r&   )r'   s   "r(   r)   r)   Ç   su   € ÷ `ñ `Ø	ð`Ø*ð`Ø7:ð`ØCFð`ØRUð`Ø^að`àð`àð`à#1ð`ð 7ð`ð 4ñ	`r*   c               óô   € \        WGWVR7      p
V '       d    \        \        WR7      4      R3# V'       d   \	        WW8V	R7      R3# RV
! V R2R4      3#   \         d   pRT
! RT 2R4      3u Rp?# Rp?ii ; i)	u¿   ``(image_ref, None)`` or ``(None, error)`` for a ``(b64_json, url)`` pair. Base64 is always
cached (write failure â†’ ``io_error``); a URL is cached best-effort, falling back to the bare URL.)rK   ry   ©rÇ   NzCould not save image to cache: Úio_error)rÇ   r;   rÃ   Úon_failz, response contained neither b64_json nor URLÚempty_response)r³   r$   r   r8   Úcache_url_best_effort)rÆ   rz   rÇ   r;   r¥   rK   ry   r#   rÃ   rÄ   r±   r>   s   &&$$$$$$$$  r(   Úmaterialize_imagerÐ   Ç   s’   € ô ˜°ÔF€Dß
ð	SÜ”~ cÔ9Ó:¸DÐ@Ð@÷ Ü$ S¸uÐWbÔcÐeiÐiÐiØ‘˜˜ÐKÐLÐN^Ó_Ð_Ð_øô	 ô 	SØ™Ð ?À¸uÐEÀzÓRÐRÕRûð	Sús   —A ÁA7ÁA2Á,A7Á2A7rÍ   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r"   rz   r$   rÇ   r;   rÃ   rÈ   rÍ   rÉ   r%   r&   )r'   s   "r(   r)   r)   Ù   s>   € ÷ ñ Ø	ðØðØ%(ðØ/=ðà2ðð 	ñr*   c               ó¢   €  \        \        WR7      4      #   \         d-   pTe
   T! T4       MTP                  RY T4       T u Rp?# Rp?ii ; i)zUCache ``url`` locally; on failure warn (or call ``on_fail``) and return the bare URL.rË   NzC%s image URL %s could not be cached (%s); falling back to bare URL.)r$   r   r8   Úwarning)rz   rÇ   r;   rÃ   rÍ   r>   s   &$$$$ r(   rÏ   rÏ   Ù   sL   € ð
Ü”> #Ô5Ó6Ð6øÜô ØÒÙ�C�Là�K‰KÐ]Ð_dÐknÔoØ�
ûðús   ‚ —A¢!A	ÁAÁ	Ac               ó$   € V ^8„  d   QhRRRRRR/# )r"   Úresponser   r>   r8   r%   r$   r&   )r'   s   "r(   r)   r)   è   s&   € ÷ Iñ I Sð I¨yð I¸Sñ Ir*   c                óð   €  V P                  4       P                  R/ 4      P                  RV P                  R,          4      #   \         d(    T e   T P                  R,          u # \	        T4      u # i ; i)zJ``error.message`` from an HTTP error body, else the first 300 chars of it.r©   Úmessage:Ni,  N)Újsonr,   Útextr8   r$   )rÕ   r>   s   &&r(   Úrequests_error_messagerÚ   è   se   € ðIØ�}‰}‹×"Ñ" 7¨BÓ/×3Ñ3°I¸x¿}¹}ÈTÕ?RÓSÐSøÜô IØ&.Ò&:ˆx�}‰}˜TÕ"ÒHÄÀCÃÒHðIús   ‚A A Á"A5Á'A5Á4A5c                  ód   € ] tR t^ðt$ RtR]R&   R]R&   R]R&   ^ tR]R&   RtR]R	&   R
tR]R&   Rt	R
# )ÚHttpFailureuB  One failed ``post_json`` attempt as ``(error, error_type)``. ``kind`` âˆˆ http / timeout /
unreachable (DNS failure or refused connection: nothing was sent) / connection (dropped
after connecting) / request / invalid_json; ``message`` = HTTP error text or decode error;
``status`` / ``response`` are set for ``http`` only.r$   Úkindr©   rª   ÚintÚstatusrS   r×   Nr   rÕ   r&   )
rœ   r�   rž   rŸ   r    r¡   rß   r×   rÕ   r£   r&   r*   r(   rÜ   rÜ   ð   s5   ‡ ñ<ð
 ƒIØƒJØƒOØ€FˆCƒOØ€GˆSÓØ€Hˆc×r*   rÜ   Úbase_urlc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r"   Úusager   rK   r$   r¥   rà   r0   r%   ÚNoner&   )r'   s   "r(   r)   r)   ÿ   s7   € ÷ mñ m˜cð m¨Sð m¸Cð mÈ=ð mÐdhñ mr*   c               óV   € V '       g   R# ^ RI Hp ^ RIHp V! V! WR7      RW#R7       R# )a'  Record a token-billed image call against the ambient session as task ``image_generation``.

Token-metered image models (OpenRouter chat-image and Image API models, OpenAI ``gpt-image``)
bill exactly like a chat completion, so they get a ``session_model_usage`` row through the
same chokepoint as auxiliary calls. ``usage`` is the response's usage block (dict or SDK
object). Per-image backends (FAL, xAI, Krea, ...) return no token usage and never call this;
a body without tokens is a no-op inside ``record_aux_usage``, as is running outside a turn.
N)ÚSimpleNamespace)Úrecord_aux_usage)rK   râ   Úimage_generation)r¥   rà   )Útypesrå   Úagent.aux_accountingræ   )râ   rK   r¥   rà   rå   ræ   s   &$$$  r(   Úrecord_token_usagerê   ÿ   s'   € ÷ ÙÝ%å5áÙ˜eÔ1Ð3EÐPX÷mr*   c               ó    € V ^8„  d   QhRRRR/# )r"   r>   r8   r%   rI   r&   )r'   s   "r(   r)   r)     s   € ÷ Iñ I˜)ð I¨ñ Ir*   c                ó¼   € ^ RI HpHpHp V P                  '       d   V P                  ^ ,          MRp\        WA4      '       d   VP                  MTp\        WSV34      # )z©True when the last connection attempt never connected, so no server accepted the request body
(a redirect hop may have answered earlier, but a redirect accepts nothing).)ÚMaxRetryErrorÚNameResolutionErrorÚNewConnectionErrorN)Úurllib3.exceptionsrí   rî   rï   Úargsr6   Úreason)r>   rí   rî   rï   Úcauserò   s   &     r(   Ú_never_connectedrô     sH   € ÷ ZÑYàŸ8Ÿ8˜8ˆC�H‰H�QŽK¨€EÜ'¨×=Ò=ˆU�\Š\À5€FÜ�fÐ3FÐGÓHÐHr*   Úerror_messageÚcatch_request_exceptionc               ó8   € V ^8„  d   QhRRRRRRRRR	RR
RRRRR/# )r"   rz   r$   Úheadersr   Úpayloadr1   Útimeoutr   r;   rõ   zCallable[[Any, Exception], str]rö   rI   r%   z+tuple[Optional[Any], Optional[HttpFailure]]r&   )r'   s   "r(   r)   r)     sP   € ÷ $
ñ $
Ø	ð$
Ø(ð$
Ø3Að$
ØLOð$
ØX[ð$
à2ð$
ð "ð$
ð 1ñ	$
r*   c               ó2  € ^ RI p\        V\        4      '       d
   V^,          MTp VP                  WW#R7      p	V	P	                  4         T	P                  4       R3#   TP
                   dK   p
T
P                  pTe   TP                  M^ pT! Yº4      pR\        RT RT RT 2RYÍTR7      3u Rp
?
# Rp
?
iTP                   d"    R\        RT R	\        T4       R
2R4      3u # TP                   d3   p
\        T
4      '       d   RMRpR\        Yä RT
 2R4      3u Rp
?
# Rp
?
iTP                   d(   p
T'       g   h R\        RT RT
 2R4      3u Rp
?
# Rp
?
ii ; i  \         d*   p
R\        RT RT
 2R\!        T
4      R7      3u Rp
?
# Rp
?
ii ; i)uâ   POST ``payload`` â†’ ``(json_body, None)`` or ``(None, failure)``. ``timeout`` goes to ``requests``
verbatim (message reports the read component); ``error_message(response, exc)`` extracts the
backend-specific HTTP error text.N)rø   rØ   rú   Úhttpz image generation failed (z): Ú	api_error)rß   r×   rÕ   rú   z image generation timed out (zs)ÚunreachableÚ
connectionz connection error: Úconnection_errorÚrequestz request failed: Úinvalid_jsonz returned invalid JSON: Úinvalid_response)r×   )Úrequestsr6   ÚtupleÚpostÚraise_for_statusÚ	HTTPErrorrÕ   Ústatus_coderÜ   ÚTimeoutrÞ   ÚConnectionErrorrô   ÚRequestExceptionrØ   r8   r$   )rz   rø   rù   rú   r;   rõ   rö   r  Úread_timeoutrÕ   r>   Úresprß   r×   rÝ   s   &$$$$$$        r(   Ú	post_jsonr    sÅ  € ó ä!+¨G´U×!;Ò!;�7˜1–:À€Lð[Ø—=‘= ¸G�=ÓUˆØ×!Ñ!Ô#ð$
Ø�}‰}‹ Ð$Ð$øð% ×Ñô ;Ø�|‰|ˆØ%)Ò%5�×!Ò!¸1ˆÙ Ó*ˆØ”[Ø�u�gÐ7¸°x¸sÀ7À)ÐLÈkØ°Tô;ð ;õ 	;ûð ×Ñô `Ø”[Ø˜%˜Ð =¼cÀ,Ó>OÐ=PÐPRÐSÐU^ó`ð `ò 	`à×#Ñ#ô _Ü 0°× 5Ò 5‰}¸<ˆØ”[ ¨Ð0CÀCÀ5Ð'IÐK]Ó^Ð^Õ^ûØ×$Ñ$ô [ß&ØØ”[ ¨u¨gÐ5FÀsÀeÐ,LÈkÓZÐZÕZûð[ûô ô 
Ø”[Ø˜u˜gÐ%=¸c¸UÐCÐEWÔadÐehÓaiô
ð 
õ 	
ûð
úsw   §#A ÁE" ÁEÁ.?B3Â-EÂ3EÃEÃ'EÃ6EÃ7'D$ÄEÄ$EÄ7EÄ8EÅEÅEÅ"FÅ-FÆFÆFrM   )r›   )5Ú__conditional_annotations__r    Ú
__future__r   ÚloggingrU   Údataclassesr   Útypingr   r   r   r   r   r	   r
   Úagent.image_gen_providerr   r   r   r   r   Ú	getLoggerrœ   r9   r   r¡   ÚGPT_IMAGE_2_API_MODELÚGPT_IMAGE_2_DEFAULTr    r·   rÂ   r7   r$   r¦   r-   r?   r^   rf   rs   r}   r   r³   r¸   r¼   r»   rÐ   rÏ   rÚ   rÜ   rê   rô   r  )r  s   @r(   Ú<module>r     s   øðô@õ #ã Û 	Ý !ß G× GÑ G÷bõ bð 
×	Ò	˜8Ó	$€ð !,¨[¸(ÀKÐQ[Ð]hÐi€ˆnÓ ið &Ð Ø*Ð àØÐ&Ø�ØÐ2Ø�5ð	ð ØÐ)Ø�ØÐ+Ø�8ð	ð ØÐ'Ø�ØÐCØ�6ð	ð0Ð Ð,ó ð* F€ØK€à
�3˜˜S #˜X�Ð&Õ
'€õ<÷
ð $à"ð$à>Bð$ð (,ð$ð BG÷$÷@=ñð  ÷ð õ"ô2Ð-ô 2ð>¸bð ÐPR÷ õPõ0õð`à4:ð`ð :>÷`ð$Ø@Fðà59÷õIð ÷ð ó ððmÐ[_÷ mõ&Ið$
à5Kð$
ð %*÷$
ñ $
r*   