§
    Úä}j�ó ã            '       óV2  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZmZ erddlm Z  da!ee"         e#d<   d	e"fd
„Z$ G d„ d¦  «        Z% e%¦   «         Z ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4  ej5        e6¦  «        Z7 e8¦   «         Z9e8e#d<    e8¦   «         Z:e8e#d<    e8¦   «         Z;e8e#d<    e8¦   «         Z<e8e#d<   dee=         d	efd„Z>da?ddœdee=         de@d	ee=ef         fd„ZAde=de=ded	efd„ZB ejC        ¦   «         ZD G d„ d eE¦  «        ZFd	e@fd!„ZGd	e@fd"„ZHejI        	 	 	 �dd$e@fd%„¦   «         ZJd	eeg ef                  fd&„ZKd'eg ef         d	e@fd(„ZL G d)„ d*¦  «        ZM ejC        ¦   «         ZN�dd+„ZOd	e@fd,„ZPejI        d-„ ¦   «         ZQd.eeRe=ef         gef         deRe=ef         d	efd/„ZSd0ed1ed	e@fd2„ZTd3e=fd4„ZUdaVi d5d6“d7d6“d8d6“d9d:“d;d:“d<d:“d=d>“d?d>“d@d>“dAd>“dBdC“dDdC“dEdF“dGdF“dHdI“dJdI“dKdL“i dMdL“dNdL“dOdP“dQdP“dRdS“dTdS“dUdV“dWdV“dXdV“dYdV“dZd[“d\d[“d]d^“d_d^“d`d^“dad^“¥ZWdbee=         d	e=fdc„ZX eY¦   «         ZZeYe#dd<   deee=         d	e@fdf„Z[deee=         d	e@fdg„Z\dhZ]diZ^�ddeee=         dbee=         d	e@fdj„Z_�ddeee=         dbee=         d	e@fdk„Z`	 �ddeee=         dee=         d	dlfdm„Za	 �dd#dnœdeee=         dbee=         doe@d	eeb         fdp„ZcdqZdeee#dr<   dsZfeee#dt<    e
jg        du¦  «        Zhdve=d	eefdw„Zidxe=d	e=fdy„Zjddzœdxe=d{e@d	e=fd|„Zkd}d~dd€dd�d‚dƒd„d…d†d‡dˆd‰œZlee=e=f         e#dŠ<   elZmee=e=f         e#d‹<    endŒh¦  «        Zoene#d�<   dŽd�d�œZpee=e=f         e#d‘<   dbe=d	ee=         fd’„Zq endCdFh¦  «        Zrene#d“<   d”d•d–d—œZs enh d˜£¦  «        Ztd™eRdz  d	eRdz  fdš„Zu�dd›eRdz  d	eRfdœ„Zvd�džiZwde=dz  d	eRfdŸ„Zxdd lymzZ{ d”d•d¡e{› �d¢œZ|dd£l}m~Z d	eRfd¤„Z€ e€¦   «         Z�da‚e@e#d¥<   d†Zƒd†Z„d¦Z…d§Z† e,¦   «         d¨z  Z‡d©Zˆdªe=d	ee=e=f         fd«„Z‰de=d	e=fd¬„ZŠdbe=d	ee@ee         f         fd­„Z‹dbe=d	ee         fd®„ZŒd¯ed	e=fd°„Z��dd¯ed²e=d	e=fd³„ZŽ end´h¦  «        Z�d3e=d	e@fdµ„Z�d	e‘fd¶„Z’d·e=d	e=fd¸„Z“ G d¹„ dº¦  «        Z” G d»„ d¼¦  «        Z• G d½„ d¾¦  «        Z– G d¿„ dÀ¦  «        Z— G dÁ„ dÂ¦  «        Z˜ G dÃ„ dÄ¦  «        Z™ G dÅ„ dÆ¦  «        Zš G dÇ„ dÈ¦  «        Z› G dÉ„ dÊ¦  «        Zœ G dË„ dÌ¦  «        Z� G dÍ„ dÎ¦  «        Zž G dÏ„ dÐ¦  «        ZŸ G dÑ„ dÒ¦  «        Z  G dÓ„ dÔ¦  «        Z¡ G dÕ„ dÖ¦  «        Z¢ G d×„ dØ¦  «        Z£ G dÙ„ dÚ¦  «        Z¤ G dÛ„ dÜ¦  «        Z¥de=d	e@fdÝ„Z¦	 �ddÞedee=de=de=dßee=         d	efdà„Z§d	eeR         fdá„Z¨dbeRd	e=fdâ„Z©d	e=fdã„Zªddäœdåe@d	eeee=e=f                  fdæ„Z«ddäœdåe@d	eeee=e=f                  fdç„Z¬d	eee=e=f                  fdè„Z­d	ee=         fdé„Z®d	eee          ee=         f         fdê„Z¯ e8¦   «         Z°e8e#dë<   deee=         d	e@fdì„Z±d	ee@e=f         fdí„Z²dee=d	dfdî„Z³�d	dïe=dee=d	eee          ee=         f         fdð„Z´d	e=fdñ„Zµ�d
dòe@d	eee          ee=         f         fdó„Z¶dòe@dôee=         d	ee=         fdõ„Z·d	e=fdö„Z¸d	e=fd÷„Z¹d	e=fdø„Zºd	e=fdù„Z»dúee=         d	eee=         ee=         f         fdû„Z¼d	e=fdü„Z½dýe=d	e=fdþ„Z¾d±a¿e=e#dÿ<   d±aÀe=e#�d <   d±aÁe=e#�d<   d±aÂee#�d<   d±aÃe=e#�d<   d±aÄe=e#�d<    ejÅ        �dd�¬¦  «        ZÆejÅ        eee=ef                           e#�d<    ejÅ        �dd�¬¦  «        ZÇejÅ        eee=ef                           e#�d	<   �d
„ ZÈ�d„ ZÉdbe=dz  dee=dz  dße=dz  d	df�d„ZÊdd�dœdbe=dz  dße=dz  d	eee=e=eRe=ef         f         dz  f�d„ZËddd�dœ�dedeRe=ef         dbe=dz  dße=dz  �deeRe=ef         gef         dz  d	ef�d„ZÌddd�dœ�dedeRe=ef         dbe=dz  dße=dz  �deeRe=ef         gef         dz  d	ef�d„ZÍdd�dœ�dedeRe=ef         dbe=dz  dße=dz  d	ef
�d„ZÎ�daÏee�df         e#�d<    ejÐ        ¦   «         ZÑd	eee=ef                  f�d„ZÒ�de=d	ef�d„ZÓd±d±d±d±d±d±�dœdbe=dee=�de=de=dedße=�de=�de=d	ejÔ        f�d„ZÕ�d ejÔ        d	df�d!„ZÖejI        �d"eee=ef                  f�d#„¦   «         Z×�d�d$„ZØd	eee=         ee=         ee=         f         f�d%„ZÙd	e=f�d&„ZÚ�d�d'„ZÛde=d	df�d(„ZÜd	eee         ee=         f         f�d)„ZÝdee=d	eee         ee=         f         f�d*„ZÞdee=d	eee         ee=         f         f�d+„Zßdddd�d,œdeee=         dïee=         �d-ee=         dßee=         d	eee         ee=         f         f
�d.„Zà�ddïe=d	eee         ee=         f         f�d/„Zá�d0�d1�d2�d3�d4œZâ�d5Zãeã�d6z   Zä�d"eee=ef                  d	ee=ef         f�d7„Zåd	eee         f�d8„Zæ�d9Zçi Zèee=ebf         e#�d:<   i Zéee=ebf         e#�d;<   �d0�d1�d2�d2�d<�d<�d=œZêdbe=d	e=f�d>„Zë�ddbe=�d?eeb         d	df�d@„Zì�dAe=d	e@f�dB„Zí�d�dAe=�dCee=         d	df�dD„Zî�d�dE„Zï�dFeðd	e@f�dG„Zñd	e@f�dH„Zò�dFeðd	e@f�dI„Zó�dFeðd	e@f�dJ„Zô�dFeðd	e@f�dK„Zõ�dFeðd	e@f�dL„Zö�dMZ÷�dNZød	e‘f�dO„Zù�dFeðd	e@f�dP„Zú�dFeð�dQe=d	e@f�dR„Zû�dFeðd	e@f�dS„Zü�dFeðd	e@f�dT„Zý�dFeðd	e@f�dU„Zþ�dFeðd	e@f�dV„Zÿdbe=d	df�dW„�Z �dXed	e@f�dY„�Zd�dZœdbe=�d"eee=ef                  d	e=f�d[„�Z�dFeðd	ee=ef         f�d\„�Z	 �d�d]e=�de�d"eee=ef                  d	ee=         f�d^„�Zd±�d_œdbe=�dFeð�d`e=d	e@f�da„�Zd�dbœ�dCee=         �d]e=�dcee=         �ddee=         �deee=         �dfee=         �d"eee=ef                  �dgee=         �dh�e�dieeb         �djee‘         �dke�e         �dleb�dmeR�dneeR         �doeee=e=f                  d	ef"�dp„�Zd�dbœ�dCee=         �d]e=�dcee=         �ddee=         �deee=         �dfee=         �dgee=         �dh�e�dieeb         �djee‘         �dke�e         �dleb�dmeR�dneeR         �doeee=e=f                  d	ef �dq„�Zdbe=d	e@f�dr„�Z	�d]ee=         �dse=d	e=f�dt„�Z
�dCee=         �due=d	eee=ef                  f�dv„�Z�dCee=         �due=d	eeb         f�dw„�Z�dAe=d	e=f�dx„�Z G �dy„ �dze¦  «        �Zdbe=de=dßee=         deee=         d	�ef
�d{„�Zd¯ee=ef         �d|e�d}ee=         d	�ef�d~„�Z�dCee=         �d|e�d}ee=         �due=d	�ef
�d„�Z�dh�e�dke�e         �d€�ed	ee�e�ef         f�d�„�Z�d|e�d}ee=         �due=�dCee=         �dh�e�dieeb         �djee‘         �dke�e         �dleb�dmeR�dneeR         d	ee         f�d‚„�Z�d|e�d}ee=         �due=�dCee=         �dh�e�dieeb         �djee‘         �dke�e         �dleb�dmeR�dneeR         d	ee         f�dƒ„�Z	 	 �d�d…e=�dCe=�d†e=d	eee         ee=         e=f         f�d‡„�Z	 	 	 �d�d…e=�dCe=�d†e=�d‰ee=         d	eee         ee=         e=f         f
�dŠ„�Z�dCee=         d	ee‘         f�d‹„�Z	 	 �ddbe=dee=de=de=d	ee‘         f
�dŒ„�Z	 	 �d�dCe=�d…e=�d†e=�d‰ee=         d	eee         ee=         e=f         f
�d�„�Z�dCee=         �d…e=d	eee         ee=         e=f         f�dŽ„�Zd¯ee=ef         d	ee=         f�d�„�Zd¯ee=ef         d	eee         ee=         f         f�d�„�Z	 	 �d�dCee=         �d…e=�d†e=d	eee         ee=         e=f         f�d‘„�Z	 	 	 �ddbe=deee=         dee=         dee=         d	ee         f
�d’„�Z	 	 �d	�d"eee=ef                  �dCee=         d	eee          ee=         e=f         f�d“„�Z	 	 �d	�d"eee=ef                  �dCee=         d	eee          ee=         f         f�d”„�Z �dedbe=d	df�d•„�Z!�ded²e=d	e=f�d–„�Z"�d
dee=�d—e@f�d˜„�Z#�d™ee=         dbe=d	ee=         f�dš„�Z$	 	 	 	 	 	 	 	 	 �ddbe=dee=de@�d›e@�d-e=dïe=dße=�d"eee=ef                  �d—e@�dCee=         d	eee         ee=         f         f�dœ„�Z%	 �dd�dZœ�dCe=�d"eee=ef                  d	eee          ee=         f         f�d�„�Z&�dd�dZœ�dCe=�d"eee=ef                  f�dž„�Z'�dŸ�Z(dbe=deee=         d	e@f�d „�Z)dbee=         d	e=f�d¡„�Z*	 �ddbe=deee=         d	eee         ee=         f         f�d¢„�Z+dbe=d	e@f�d£„�Z,d	ee=         f�d¤„�Z-	 	 �d	dddd�d¥œdbee=         deee=         dee=         dee=         de@�d"eee=ef                  d	eee=         ee         ee=         f         f�d¦„�Z.d	eRf�d§„�Z/d�d¨œ�d©e‘deee=         d	eRf�dª„�Z0i �Z1eeeeef         e#�d«<    ejÐ        ¦   «         �Z2�d¬�Z3 G �d­„ �d®¦  «        �Z4�de=�d©ed	ef�d¯„�Z5ddddddd�d°œdbe=de@dee=         dee=         dßee=         �d"eee=ef                  �d—e@�dCee=         deee=         d	eef�d±„�Z6d�d²œ�d³ee�de�d´ee=         �dµed	df
�d¶„�Z7ddddd�d·œ�d¸e=deee=         de@dee=         dee=         dßee=         �d"eee=ef                  �d—e@d	eee         ee=         f         f�d¹„�Z8�d�dº„�Z9�ded	df�d»„�Z:�ded	df�d¼„�Z;�d�d½„�Z<�d�d¾„�Z=�ded	e@f�d¿„�Z>�de�dÀee=         d	e@f�dÁ„�Z?�dedeee=         �dÀee=         d	ee=         f�dÂ„�Z@	 	 	 	 	 	 	 	 �ddbe=dee=de@de=de=dße=�d"eee=ef                  �d—e@�dCee=         d	eee         ee=         f         f�dÃ„�ZA�dÄ�dÅi�ZBee=e=f         e#�dÆ<   	 	 	 	 	 �d�dCe=dbe=dee=dee=         dee=         d	ee=ee=         ee=         ee=         ee=         f         f�dÇ„�ZC�dÈ�ZD�dÉ�ZE�dCe=d	ee=ef         f�dÊ„�ZF�eDf�dCe=�dËebd	ebf�dÌ„�ZG�dCe=�dÍeeb         d	ebf�dÎ„�ZH�dCe=d	ee=ef         f�dÏ„�ZIi �ZJee=ee‘e�jK        f         f         e#�dÐ<   i �ZLeee=e‘f         ee‘ef         f         e#�dÑ<    ejÐ        ¦   «         �ZM�dCee=         d	ee‘         f�dÒ„�ZN�dCee=         d	ee�jK                 f�dÓ„�ZO�dCee=         f�dÔ„�ZP�d�dÕ„�ZQ enh �dÖ£¦  «        �ZRdbe=de=d	e@f�d×„�ZS�dh�ed	�ef�dØ„�ZTh �dÙ£�ZU�d©ed	e@f�dÚ„�ZV	 	 	 	 	 	 	 	 �ddbe=dee=�dh�e�dieeb         �djee‘         �dke�e         �dÍeb�dÛeeR         �dneeR         dee=         �dCee=         d	eRf�dÜ„�ZW	 	 	 �d�dÝe�dCee=         dbee=         dee=         d	ef
�dÞ„�ZX�dß�dàœ�dáe=d	df�dâ„�ZY�dÝed	df�dã„�ZZ�d�dä„�Z[�dÝed	ee         f�då„�Z\�dÝed	e=f�dæ„�Z]�dd0e�dçe=�dËed	ef�dè„�Z^�dé�Z_�dê�Z`�dleeb         d	ebf�dë„�Za�ded	e@f�dì„�Zb�dFeðd	e@f�dí„�Zcdbe=dee=         d	e@f�dî„�Zd	 �dd�dïœ�dedee=ef         �dCee=         �dðe@d	ef
�dñ„�Zed±d�dòœ�dóedee=�dôeeb         d	ef�dõ„�Zf G �dö„ �d÷¦  «        �Zgd±d�dòœ�dóedee=�dôeeb         d	ef�dø„�Zh	 �d�dedee=ef         �dCee=         d	ef�dù„�ZieÈ	 �dddddddddddddddd�dúœ�dCe=dbe=dee=de=de=�d"eee=ef                  �dh�e�dieeb         �dje‘�dk�e�dÍeb�dÛeR�dneeR         �doeee=e=f                  dße=�dûe@�düeRd	ef$�dý„¦   «         �Zj�dûe�dþe�jK        f�dÿ„�Zk	 �dddddddddddddddd�dúœ�dCe=dbe=dee=de=de=�d"eee=ef                  �dh�e�dieeb         �dje‘�dk�e�dÍeb�dÛeR�dneeR         �doeee=e=f                  dße=�dûe@�düeRd	ef$�d „�Zld	e=f�d„�ZmeÉ	 �dddddddddddd�dœ�dCe=dbe=dee=de=de=�d"eee=ef                  �dh�e�dieeb         �dje‘�dk�e�dÍeb�dÛeR�dneeR         d	ef�d„¦   «         �Zn	 �dddddddddddd�dœ�dCe=dbe=dee=de=de=�d"eee=ef                  �dh�e�dieeb         �dje‘�dk�e�dÍeb�dÛeR�dneeR         d	ef�d„�ZodS (  u€  Shared auxiliary client router for side tasks.

Provides a single resolution chain so every consumer (context compression,
session search, web extraction, vision analysis, browser vision) picks up
the best available backend without duplicating fallback logic.

Resolution order for text tasks (auto mode):
  1. User's main provider + main model (used regardless of provider type â€”
     aggregators, direct API-key providers, native Anthropic, Codex, etc.)
  2. OpenRouter  (OPENROUTER_API_KEY)
  3. Nous Portal (~/.hermes/auth.json active provider)
  4. Custom endpoint (config.yaml model.base_url + OPENAI_API_KEY)
  5. Native Anthropic
  6. Direct API-key providers (z.ai/GLM, Kimi/Moonshot, MiniMax, MiniMax-CN)
  7. None

OpenRouter fallback cost guard: ``auxiliary.free_only: true`` restricts the
step-2 fallback to ``:free`` SKUs; ``auxiliary.openrouter_model`` overrides
the default. A one-time WARNING is logged for non-``:free`` models.

Resolution order for vision/multimodal tasks (auto mode):
  1. Selected main provider, if it is one of the supported vision backends below
  2. OpenRouter
  3. Nous Portal
  4. Native Anthropic
  5. Custom endpoint (for local vision models: Qwen-VL, LLaVA, Pixtral, etc.)
  6. None

Codex OAuth (ChatGPT-account auth) is intentionally NOT in either
fallback chain: OpenAI gates this endpoint behind an undocumented,
shifting model allow-list, so "just try Codex with a hardcoded model"
rots on its own.  Codex is used only when the user's main provider *is*
openai-codex (Step 1 above) or when a caller explicitly requests it with
a model (auxiliary.<task>.provider + auxiliary.<task>.model).

Per-task overrides are configured in config.yaml under the ``auxiliary:`` section
(e.g. ``auxiliary.vision.provider``, ``auxiliary.compression.model``).
Default "auto" follows the chains above.

Payment / credit exhaustion fallback:
  When a resolved provider returns HTTP 402 or a credit-related error,
  call_llm() automatically retries with the next available provider in the
  auto-detection chain.  This handles the common case where a user depletes
  their OpenRouter balance but has Codex OAuth or another provider available.
é    N)ÚPath)ÚSimpleNamespace)ÚAnyÚCallableÚDictÚListÚ
NamedTupleÚOptionalÚTupleÚTYPE_CHECKING)ÚurlparseÚparse_qsÚ
urlunparse©ÚOpenAIÚ_OPENAI_CLS_CACHEÚreturnc                  ó.   — t           €ddlm}  | a t           S )z#Import and cache ``openai.OpenAI``.Nr   r   )r   Úopenair   )Ú_clss    ú</home/ragecks/.hermes/hermes-agent/agent/auxiliary_client.pyÚ_load_openai_clsr   T   s(   € õ Ð Ø)Ð)Ð)Ð)Ð)Ð)Ø ÐÝÐó    c                   ó(   — e Zd ZdZdZd„ Zd„ Zd„ ZdS )Ú_OpenAIProxyzÏModule-level proxy that looks like the ``openai.OpenAI`` class.

    Forwards ``OpenAI(...)`` calls and ``isinstance(x, OpenAI)`` checks to the
    real SDK class, importing the SDK lazily on first use.
    © c                 ó*   —  t          ¦   «         |i |¤ŽS ©N)r   )ÚselfÚargsÚkwargss      r   Ú__call__z_OpenAIProxy.__call__f   s   € Ø!ÕÑ!Ô! 4Ð2¨6Ð2Ð2Ð2r   c                 ó:   — t          |t          ¦   «         ¦  «        S r   )Ú
isinstancer   )r   Úobjs     r   Ú__instancecheck__z_OpenAIProxy.__instancecheck__i   s   € Ý˜#Õ/Ñ1Ô1Ñ2Ô2Ð2r   c                 ó   — dS )Nz<lazy openai.OpenAI proxy>r   ©r   s    r   Ú__repr__z_OpenAIProxy.__repr__l   s   € Ø+Ð+r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r"   r&   r)   r   r   r   r   r   ]   sR   € € € € € ðð ð €Ið3ð 3ð 3ð3ð 3ð 3ð,ð ,ð ,ð ,ð ,r   r   )Ú	load_pool)ÚMINIMUM_CONTEXT_LENGTHÚget_model_context_length)Úget_hermes_home)ÚOPENROUTER_BASE_URL)Úbase_url_host_matchesÚbase_url_hostnameÚ	env_floatÚ"model_forces_max_completion_tokensÚnormalize_proxy_env_varsÚ_LOGGED_UNKNOWN_PROVIDER_KEYSÚ_LOGGED_UNHANDLED_AUTHTYPE_KEYSÚ _LOGGED_UNSUPPORTED_EXTPROC_KEYSÚ_LOGGED_UNSUPPORTED_OAUTH_KEYSÚbase_urlc                 ó  — 	 ddl m} ddlm}m}  |t          | pd¦  «         |¦   «         ¬¦  «        } ||                     d¦  «        |                     d¦  «        t          | pd¦  «        ¬¦  «        S # t          $ r Y d	S w xY w)
a•  Resolve httpx ``verify`` for an auxiliary-client base_url.

    Mirrors the main client's TLS resolution so auxiliary calls (compression,
    vision, web_extract, title generation, etc.) honor per-provider
    ``ssl_ca_cert`` / ``ssl_verify`` config and the ``HERMES_CA_BUNDLE`` /
    ``SSL_CERT_FILE`` env conventions. Best-effort: any failure falls back to
    the httpx/certifi default (``True``).
    r   )Úresolve_httpx_verify)Ú get_custom_provider_tls_settingsÚload_config_readonlyÚ )ÚconfigÚssl_ca_certÚ
ssl_verify)Ú	ca_bundlerE   r=   T)Úagent.ssl_verifyr?   Úhermes_cli.configr@   rA   ÚstrÚgetÚ	Exception)r=   r?   r@   rA   Útlss        r   Ú_resolve_aux_verifyrM   �   sâ   € ðØ9Ð9Ð9Ð9Ð9Ð9ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 /Ð.Ý��˜BÑÔÐ(<Ð(<Ñ(>Ô(>ð
ñ 
ô 
ˆð $Ð#Ø—g’g˜mÑ,Ô,Ø—w’w˜|Ñ,Ô,Ý˜˜ RÑ(Ô(ð
ñ 
ô 
ð 	
øõ
 ð ð ð Øˆtˆtðøøøs   ‚A4A7 Á7
BÂBF©Ú
async_moderO   c                óî   — 	 ddl m}  |t          | pd¦  «        |t          | ¦  «        ¬¦  «        }n<# t          t
          f$ r( t          sdat                               d¦  «         d}Y nw xY w|€i S d|iS )	zKInject keepalive httpx client with env-only proxy (not macOS system proxy).r   )Úbuild_keepalive_http_clientrB   )rO   ÚverifyTuä   agent.process_bootstrap.build_keepalive_http_client is unavailable â€” mixed/stale install detected (#64333). Falling back to the SDK default HTTP client. Run `hermes update` (or reinstall the Desktop app) to resync the runtime.NÚhttp_client)	Úagent.process_bootstraprQ   rI   rM   ÚImportErrorÚAttributeErrorÚ_WARNED_KEEPALIVE_IMPORT_SKEWÚloggerÚwarning)r=   rO   rQ   Úclients       r   Ú_openai_http_client_kwargsr[   ¬   s¿   € ðØGÐGÐGÐGÐGÐGØ,Ð,Ý��˜BÑÔØ!Ý& xÑ0Ô0ð
ñ 
ô 
ˆˆøõ
 �Ð(ð ð ð õ -ð 	Ø,0Ð)Ý�NŠNðDñô ð ð ˆˆˆð'øøøð* €~Øˆ	Ø˜6Ð"Ð"s   ‚03 ³6A,Á+A,Úapi_keyr!   c                 ór   — i t          |¦  «        ¥|¥}|                     dd¦  «         t          d| |dœ|¤ŽS )NÚmax_retriesr   ©r\   r=   r   )r[   Ú
setdefaultr   )r\   r=   r!   s      r   Ú_create_openai_clientra   Ò   sM   € Ø?Õ*¨8Ñ4Ô4Ð?¸Ð?€Fð ×Ò�m QÑ'Ô'Ð'ÝÐ?˜'¨HÐ?Ð?¸Ð?Ð?Ð?r   c                   ó(   ‡ — e Zd ZdZdZdˆ fd„Zˆ xZS )ÚAuxiliaryExplicitCancellationaÐ  Frozen signal that an auxiliary attempt was explicitly hard-cancelled.

    This deliberately follows ``asyncio.CancelledError`` and inherits directly
    from ``BaseException``: provider retry/fallback code catches ``Exception``
    broadly and must never reinterpret an explicit host stop as a transport
    failure. ``cause`` is immutable class data so downstream compression code
    does not re-query a mutable host Event after the transport has unwound.
    Úexplicit_host_cancelr   Nc                 óJ   •— t          ¦   «                              d¦  «         d S )Nz.auxiliary request explicitly cancelled by host)ÚsuperÚ__init__)r   Ú	__class__s    €r   rg   z&AuxiliaryExplicitCancellation.__init__û   s"   ø€ Ý‰Œ×ÒÐIÑJÔJÐJÐJÐJr   ©r   N)r*   r+   r,   r-   Úcauserg   Ú__classcell__)rh   s   @r   rc   rc   ï   sX   ø€ € € € € ðð ð #€EðKð Kð Kð Kð Kð Kð Kð Kð Kð Kr   rc   c                  óH   — t          t          t          dd¦  «        ¦  «        S )NÚactiveF)ÚboolÚgetattrÚ_aux_interrupt_protectionr   r   r   Ú_aux_interrupt_protectedrq   ÿ   s   € Ý•Õ1°8¸UÑCÔCÑDÔDÐDr   c                  ó¨  — t          t          dd¦  «        } | �O	 t          |                      ¦   «         ¦  «        S # t          $ r  t
                               dd¬¦  «         Y dS w xY wt          t          dd¦  «        }t          |¦  «        sdS 	 t           |¦   «         ¦  «        S # t          $ r  t
                               dd¬¦  «         Y dS w xY w)	z@Return whether an explicit host cancel overrides aux protection.Úcancel_eventNz'aux interrupt cancel event check failedT©Úexc_infoFÚcancel_checkz!aux interrupt cancel check failed)ro   rp   rn   Úis_setrK   rX   ÚdebugÚcallable)ÚeventÚchecks     r   Ú_aux_interrupt_cancel_requestedr|     så   € åÕ-¨~¸tÑDÔD€EØÐð	Ý˜Ÿš™œÑ'Ô'Ð'øÝð 	ð 	ð 	Ý�LŠLÐBÈTˆLÑRÔRÐRØ�5�5ð	øøøõ Õ-¨~¸tÑDÔD€EÝ�E‰?Œ?ð ØˆuðÝ�E�E‘G”G‰}Œ}ÐøÝð ð ð Ý�ŠÐ8À4ˆÑHÔHÐHØˆuˆuðøøøs!   š ; »&A%Á$A%ÂB' Â'&CÃCTrm   c              #   óØ  K  — t          t          dd¦  «        }t          t          dd¦  «        }t          t          dd¦  «        }| t          _        t          |¦  «        r|t          _        |�*t          t          |dd¦  «        ¦  «        r|t          _        	 dV — |t          _        |t          _        |t          _        dS # |t          _        |t          _        |t          _        w xY w)aÊ  Mark the current thread's auxiliary LLM call as interrupt-protected.

    Used by atomic aux tasks (compression) so a mid-flight gateway interrupt
    doesn't abort the call and trigger a degraded fallback. Re-entrant-safe:
    restores the previous value on exit. ``cancel_check`` lets the host retain
    an explicit hard-cancel path; ``cancel_event`` is preferred when the host
    already owns an Event. Nested protection scopes inherit both values.
    rm   Frv   Nrs   rw   )ro   rp   rm   ry   rv   rs   )rm   rv   rs   ÚprevÚprev_cancel_checkÚprev_cancel_events         r   Úaux_interrupt_protectionr�     sä   è è € õ Õ,¨h¸Ñ>Ô>€DÝÕ 9¸>È4ÑPÔPÐÝÕ 9¸>È4ÑPÔPÐØ'-ÕÔ$Ý�ÑÔð >Ø1=Õ!Ô.ØÐ¥H­W°\À8ÈTÑ-RÔ-RÑ$SÔ$SÐØ1=Õ!Ô.ðCØˆˆˆà+/Õ!Ô(Ø1BÕ!Ô.Ø1BÕ!Ô.Ð.Ð.øð ,0Õ!Ô(Ø1BÕ!Ô.Ø1BÕ!Ô.ÐBÐBÐBÐBs   ÂC Ã&C)c                  óÄ   — t          t          dd¦  «        } t          | dd¦  «        }t          |¦  «        r|S t          t          dd¦  «        }t          |¦  «        r|S dS )zHCapture the current explicit-cancel source on the owning request thread.rs   Nrw   rv   )ro   rp   ry   )rz   rw   r{   s      r   Ú_capture_aux_cancel_checkrƒ   4  sf   € åÕ-¨~¸tÑDÔD€EÝ�U˜H dÑ+Ô+€FÝ�ÑÔð ØˆÝÕ-¨~¸tÑDÔD€EÝ��„ð ð ˆØˆ4r   rv   c                 óŒ   — 	 t           | ¦   «         ¦  «        S # t          $ r  t                               dd¬¦  «         Y dS w xY w)zGRead a request-thread cancellation source without leaking its failures.z captured aux cancel check failedTrt   F)rn   rK   rX   rx   ©rv   s    r   Ú_captured_aux_cancel_requestedr†   B  sT   € ðÝ�L�L‘N”NÑ#Ô#Ð#øÝð ð ð Ý�ŠÐ7À$ˆÑGÔGÐGØˆuˆuðøøøs   ‚ ™&AÁAc                   óJ   — e Zd ZdZdeg ef         ddfd„Zdefd„Zdefd„Z	dS )Ú_AuxiliaryCancellationDecisionzHAtomically choose explicit cancellation or provider timeout per attempt.Úsource_cancel_checkr   Nc                 óR   — || _         t          j        ¦   «         | _        d| _        d S )Nrm   )Ú_source_cancel_checkÚ	threadingÚLockÚ_lockÚ_outcome)r   r‰   s     r   rg   z'_AuxiliaryCancellationDecision.__init__N  s$   € Ø$7ˆÔ!Ý”^Ñ%Ô%ˆŒ
Ø ˆŒˆˆr   c                 óþ   — | j         5  | j        dk    r	 d d d ¦  «         dS | j        dk    r	 d d d ¦  «         dS t          | j        ¦  «        rd| _        	 d d d ¦  «         dS 	 d d d ¦  «         dS # 1 swxY w Y   d S )NÚ	cancelledTÚ	timed_outF©rŽ   r�   r†   r‹   r(   s    r   r"   z'_AuxiliaryCancellationDecision.__call__S  s,  € ØŒZð 	ð 	ØŒ} Ò+Ð+Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð Œ} Ò+Ð+Øð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ
 .¨dÔ.GÑHÔHð Ø +�”Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s!   ˆA2¢A2»A2Á$A2Á2A6Á9A6c                 ó¶   — | j         5  | j        dk    r#t          | j        ¦  «        rd| _        nd| _        | j        dk    cddd¦  «         S # 1 swxY w Y   dS )z@Return whether timeout won and destructive cleanup is permitted.rm   r‘   r’   Nr“   r(   s    r   Úbegin_timeout_cleanupz4_AuxiliaryCancellationDecision.begin_timeout_cleanup^  s¨   € àŒZð 	0ð 	0ØŒ} Ò(Ð(Ý1°$Ô2KÑLÔLð 0Ø$/�D”M�Mà$/�D”MØ”= KÒ/ð	0ð 	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð 	0ð 	0s   ˆ9AÁAÁA)
r*   r+   r,   r-   r   r   rg   rn   r"   r•   r   r   r   rˆ   rˆ   K  s{   € € € € € ØRÐRð!¨H°R¸°WÔ,=ð !À$ð !ð !ð !ð !ð
	˜$ð 	ð 	ð 	ð 	ð0 tð 0ð 0ð 0ð 0ð 0ð 0r   rˆ   c                  óª   — t          t          dd¦  «        } | €dS 	  | ¦   «          dS # t          $ r  t                               dd¬¦  «         Y dS w xY w)z?Tick the installed forward-progress hook, if any. Never raises.ÚhookNzaux progress hook failedTrt   )ro   Ú_aux_progressrK   rX   rx   )r—   s    r   Ú_notify_aux_progressr™   w  sq   € å•= &¨$Ñ/Ô/€DØ€|Øˆð@Øˆ‰ŒˆˆˆøÝð @ð @ð @Ý�ŠÐ/¸$ˆÑ?Ô?Ð?Ð?Ð?Ð?ð@øøøs   œ
( ¨&AÁAc                  ó2   — t          t          dd ¦  «        d uS )Nr—   )ro   r˜   r   r   r   Ú_aux_progress_activer›   ‚  s   € Ý•= &¨$Ñ/Ô/°tÐ;Ð;r   c              #   ó´   K  — t          t          dd¦  «        }t          | ¦  «        r| n|t          _        	 dV — |t          _        dS # |t          _        w xY w)zÕInstall *hook* as the current thread's aux forward-progress callback.

    ``hook=None`` is a no-op passthrough so callers can wire it
    unconditionally. Re-entrant-safe: restores the previous hook on exit.
    r—   N)ro   r˜   ry   r—   )r—   r~   s     r   Úaux_progress_hookr�   †  s`   è è € õ •= &¨$Ñ/Ô/€DÝ!)¨$¡¤Ð9˜˜°T…MÔð"Øˆˆˆà!�ÔÐÐø˜T�ÔÐ!Ð!Ð!Ð!s   ·A	 Á	AÚcallbackc                 ó¸  ‡ ‡‡‡‡‡	— t          ¦   «         }t          ¦   «         rt          |¦  «        s ‰ ‰¦  «        S t          |¦  «        Š ‰¦   «         rt	          ¦   «         ‚t          t          dd¦  «        Š	t          j        ¦   «         }t          j
        ¦   «         Ši Šdˆ ˆˆˆˆˆ	fd„}t          j        |j        |fdd¬¦  «                             ¦   «          	 t          ‰¦  «        rt	          ¦   «         ‚‰                     d¦  «        sŒ4t          ‰¦  «        rt	          ¦   «         ‚‰                     d	¦  «        }|�|‚‰                     d
¦  «        S )a;  Run one protected provider callback in an attempt-isolated daemon.

    A hard cancel must release the compression-owning thread promptly, but
    auxiliary clients are process-shared and cannot safely be closed or evicted
    to wake one request.  Only protected calls with a captured hard-cancel source
    use this seam.  Their provider callback (including stream aggregation) runs
    in a daemon worker while the owner polls cancellation.  On cancel the owner
    unwinds immediately; the worker is left to finish under the provider timeout
    already present in ``kwargs``.  It owns no transcript or compressor commit
    state and never holds the session lock.

    Ordinary auxiliary calls, and protected calls without a cancellation source,
    retain the historical direct synchronous path with no extra thread.
    r—   Nr   c                  óX  •— 	 t          ‰¦  «        5  t          ‰¬¦  «        5   ‰‰¦  «        ‰d<   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   n# t          $ r} | ‰d<   Y d } ~ nd } ~ ww xY w‰                     ¦   «          d S # ‰                     ¦   «          w xY w)Nr…   ÚresultÚ	exception)r�   r�   ÚBaseExceptionÚset)Úexcrž   rv   Údoner!   ÚoutcomeÚprogress_hooks    €€€€€€r   Ú_provider_workerz;_run_protected_sync_provider_call.<locals>._provider_worker¸  sN  ø€ ð	Ý" =Ñ1Ô1ð 5ð 5Õ3KØ)ð4ñ 4ô 4ð 5ð 5ð %- H¨VÑ$4Ô$4�˜Ñ!ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð 5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5øøõ ð 	'ð 	'ð 	'Ø#&ˆG�KÑ Ð Ð Ð Ð Ð øøøøð	'øøøð �HŠH‰JŒJˆJˆJˆJøˆD�HŠH‰JŒJˆJˆJøøøsr   ƒA! ’A£>²A¾A	ÁAÁA	ÁAÁ	A! ÁAÁA! ÁAÁA! Á B Á!
A:Á+A5Á0B Á5A:Á:B ÂB)zhermes-protected-aux-providerT)Útargetr    ÚnameÚdaemong{®Gáz”?r¢   r¡   ri   )rƒ   rq   ry   rˆ   rc   ro   r˜   ÚcontextvarsÚcopy_contextrŒ   ÚEventÚThreadÚrunÚstartr†   ÚwaitrJ   )
rž   r!   r‰   Úprovider_contextr©   r¢   rv   r¦   r§   r¨   s
   ``    @@@@r   Ú!_run_protected_sync_provider_callrµ   •  s�  øøøøøø€ õ$ 4Ñ5Ô5ÐÝ#Ñ%Ô%ð  ­XÐ6IÑ-JÔ-Jð  Øˆx˜ÑÔÐõ
 2Ð2EÑFÔF€Là€|�~„~ð .Ý+Ñ-Ô-Ð-å�M¨6°4Ñ8Ô8€MÝ"Ô/Ñ1Ô1ÐÝŒ?ÑÔ€DØ €Gð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ ÔØÔ#ØÐ Ø,Øð	ñ ô ÷
 ‚e�g„g€gð%õ *¨,Ñ7Ô7ð 	2Ý/Ñ1Ô1Ð1Ø�yŠy˜‰Œð 	ØÝ)¨,Ñ7Ô7ð 	2Ý/Ñ1Ô1Ð1Ø—K’K Ñ,Ô,ˆ	ØÐ ØˆOØ�{Š{˜8Ñ$Ô$Ð$r   r%   Ú
maybe_typec                 óF   — 	 t          | |¦  «        S # t          $ r Y dS w xY w)zDReturn False instead of raising when a patched symbol is not a type.F)r$   Ú	TypeError)r%   r¶   s     r   Ú_safe_isinstancer¹   Ú  s9   € ðÝ˜#˜zÑ*Ô*Ð*øÝð ð ð Øˆuˆuðøøøs   ‚ ’
 Ÿ Úurlc                 óä   — t          | ¦  «        }|j        rWt          |                     d¬¦  «        ¦  «        }d„ t	          |j        ¦  «                             ¦   «         D ¦   «         }||fS | dfS )zNExtract query params from URL, return (clean_url, default_query dict or None).rB   )Úqueryc                 ó&   — i | ]\  }}||d          “ŒS ©r   r   ©Ú.0ÚkÚvs      r   ú
<dictcomp>z-_extract_url_query_params.<locals>.<dictcomp>ç  s"   € ÐEÐEÐE™d˜a �!�Q�q”TÐEÐEÐEr   N)r   r¼   r   Ú_replacer   Úitems)rº   ÚparsedÚcleanÚparamss       r   Ú_extract_url_query_paramsrÉ   â  so   € å�c‰]Œ]€FØ„|ð Ý˜6Ÿ?š?°˜?Ñ4Ô4Ñ5Ô5ˆØEÐE¥h¨v¬|Ñ&<Ô&<×&BÒ&BÑ&DÔ&DÐEÑEÔEˆØ�fˆ}ÐØ�ˆ9Ðr   ÚgoogleÚgeminiúgoogle-geminiúgoogle-ai-studiozx-aiÚxaiúx.aiÚgrokÚglmÚzaizz-aizz.aiÚzhipuÚkimiúkimi-codingÚmoonshotzkimi-cnúkimi-coding-cnzmoonshot-cnz	gmi-cloudÚgmiÚgmicloudzactual-computerÚactualÚactualcomputerÚacizminimax-chinaú
minimax-cnÚ
minimax_cnÚclaudeÚ	anthropiczclaude-codeÚgithubÚcopilotzgithub-copilotzgithub-modelzgithub-modelszgithub-copilot-acpúcopilot-acpzcopilot-acp-agentÚtencentútencent-tokenhubÚtokenhubztencent-cloudÚtencentmaasÚproviderc                 ó´  — | pd                      ¦   «                              ¦   «         }|                     d¦  «        r4|                     dd¦  «        d                               ¦   «         }|sdS |}|dk    rdS |dk    r?t	          ¦   «         pd	                      ¦   «                              ¦   «         }|r|d
vr|}ndS t
                               ||¦  «        S )NÚautoúcustom:ú:é   ÚcustomÚcodexúopenai-codexÚmainrB   >   rB   rê   rñ   )ÚstripÚlowerÚ
startswithÚsplitÚ_read_main_providerÚ_PROVIDER_ALIASESrJ   )rè   Ú
normalizedÚsuffixÚ	main_provs       r   Ú_normalize_aux_providerrû     sì   € ØÐ$˜f×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5€JØ×Ò˜YÑ'Ô'ð Ø×!Ò! # qÑ)Ô)¨!Ô,×2Ò2Ñ4Ô4ˆØð 	Ø�8Øˆ
Ø�WÒÐØˆ~Ø�VÒÐõ )Ñ*Ô*Ð0¨b×7Ò7Ñ9Ô9×?Ò?ÑAÔAˆ	Øð 	˜Ð*>Ð>Ð>Ø"ˆJˆJà�8Ý× Ò  ¨ZÑ8Ô8Ð8r   ÚOMIT_TEMPERATUREÚmodelc                 ó¼   — | pd                      ¦   «                              ¦   «                              dd¦  «        d         }|                     d¦  «        p|dk    S )zHTrue for any Kimi / Moonshot model that manages temperature server-side.rB   ú/rí   éÿÿÿÿzkimi-rÔ   ©rò   ró   Úrsplitrô   ©rý   Úbares     r   Ú_is_kimi_modelr  0  sS   € àˆK�R×ÒÑ Ô ×&Ò&Ñ(Ô(×/Ò/°°QÑ7Ô7¸Ô;€DØ�?Š?˜7Ñ#Ô#Ð5 t¨v¢~Ð5r   c                 ó’   — | pd                      ¦   «                              ¦   «                              dd¦  «        d         }|dk    S )zATrue for Arcee Trinity Large Thinking (direct or via OpenRouter).rB   rÿ   rí   r   ztrinity-large-thinking©rò   ró   r  r  s     r   Ú_is_arcee_trinity_thinkingr  6  sD   € àˆK�R×ÒÑ Ô ×&Ò&Ñ(Ô(×/Ò/°°QÑ7Ô7¸Ô;€DØÐ+Ò+Ð+r   g333333ë?gffffffæ?c                 ó  — |pd                      ¦   «                              ¦   «         }|dk    rdS | pd                      ¦   «                              ¦   «                              dd¦  «        d         }|dk    p‰|                     d¦  «        pt|                     d	¦  «        p_|d
k    pY|                     d¦  «        pD|                     d¦  «        p/|dk    p)|                     d¦  «        p|                     d¦  «        S )uŠ  True for gpt-5.4 / gpt-5.5 / gpt-5.6 on the ChatGPT Codex OAuth backend.

    Matches only the Codex OAuth route (provider ``openai-codex``), not the
    direct OpenAI API, OpenRouter, or GitHub Copilot paths â€” those expose a
    larger context window for the same slug and must keep the user's default
    compaction threshold. ``-pro`` variants and dated snapshots are matched
    via prefix so the override tracks every 272K-capped family (5.4, 5.5,
    5.6 sol/terra/luna incl. their ``-pro`` modes) without re-listing every
    variant. (Name kept for backward compatibility with the
    ``compression.codex_gpt55_autoraise`` config key.)
    rB   rð   Frÿ   rí   r   zgpt-5.4zgpt-5.4-zgpt-5.4.zgpt-5.5zgpt-5.5-zgpt-5.5.zgpt-5.6zgpt-5.6-zgpt-5.6.r  ©rý   rè   Úprovr  s       r   Ú_is_codex_gpt54_or_gpt55r  T  s  € ð ˆN˜×!Ò!Ñ#Ô#×)Ò)Ñ+Ô+€DØˆ~ÒÐØˆuØˆK�R×ÒÑ Ô ×&Ò&Ñ(Ô(×/Ò/°°QÑ7Ô7¸Ô;€Dà�	Òð 	'Ø�?Š?˜:Ñ&Ô&ð	'à�?Š?˜:Ñ&Ô&ð	'ð �9Òð	'ð �?Š?˜:Ñ&Ô&ð		'ð
 �?Š?˜:Ñ&Ô&ð	'ð �9Òð	'ð �?Š?˜:Ñ&Ô&ð	'ð �?Š?˜:Ñ&Ô&ð
r   c                 óò   — |pd                      ¦   «                              ¦   «         }|dk    rdS | pd                      ¦   «                              ¦   «                              dd¦  «        d         }|dk    S )u'  True for ``gpt-5.3-codex-spark`` on the ChatGPT Codex OAuth backend.

    The model is Codex-OAuth-only (ChatGPT Pro entitlement) with a native
    128K context window.  Only the Codex OAuth route (provider
    ``openai-codex``) is matched â€” the slug is not available on other
    routes.
    rB   rð   Frÿ   rí   r   zgpt-5.3-codex-sparkr  r
  s       r   Ú_is_codex_sparkr  q  sw   € ð ˆN˜×!Ò!Ñ#Ô#×)Ò)Ñ+Ô+€DØˆ~ÒÐØˆuØˆK�R×ÒÑ Ô ×&Ò&Ñ(Ô(×/Ò/°°QÑ7Ô7¸Ô;€DØÐ(Ò(Ð(r   zOptional[float] | objectc                 óŠ   — t          | ¦  «        r"t                               d| ¦  «         t          S t	          | ¦  «        rdS dS )uÿ  Return a temperature directive for models with strict contracts.

    Returns:
        ``OMIT_TEMPERATURE`` â€” caller must remove the ``temperature`` key so the
            provider chooses its own default.  Used for all Kimi / Moonshot
            models whose gateway selects temperature server-side.
        ``float`` â€” a specific value the caller must use (reserved for future
            models with fixed-temperature contracts).
        ``None`` â€” no override; caller should use its own default.
    z7Omitting temperature for Kimi model %r (server-managed)g      à?N)r  rX   rx   rü   r  )rý   r=   s     r   Ú_fixed_temperature_for_modelr  €  sJ   € õ �eÑÔð  Ý�ŠÐNÐPUÑVÔVÐVÝÐÝ! %Ñ(Ô(ð ØˆsØˆ4r   )Úallow_codex_gpt55_autoraiser  c                óˆ   — t          | ¦  «        rdS |rt          | |¦  «        rt          S t          | |¦  «        rt          S dS )u  Return a context-compression threshold override for specific models.

    The threshold is the fraction of the model's context window that must be
    consumed before Hermes triggers summarization.  Higher values delay
    compression and preserve more raw context.

    Per-model/route overrides:
      - Arcee Trinity Large Thinking â†’ 0.75 (preserve reasoning context).
      - gpt-5.4 / gpt-5.5 / gpt-5.6 on the Codex OAuth route â†’ 0.85, because
        Codex caps all three families at 272K and the default 50% trigger
        would compact at ~136K. Gated by ``allow_codex_gpt55_autoraise``
        (historical config-key name kept for backward compatibility) so the
        user can opt back down to the global default (the caller passes the
        config flag through here).
      - gpt-5.3-codex-spark on the Codex OAuth route â†’ 0.70, because the model
        has a native 128K window and the default 50% trigger would compact at
        ~64K â€” wasting half the usable context. Not gated by the gpt-5.5
        opt-out flag: 128K is the model's native window, so the raise is
        unambiguously correct.

    Returns a float in (0, 1] to override the global ``compression.threshold``
    config value, or ``None`` to leave the user's config value unchanged.
    g      è?N)r  r  Ú'_CODEX_GPT54_GPT55_COMPACTION_THRESHOLDr  Ú!_CODEX_SPARK_COMPACTION_THRESHOLD)rý   rè   r  s      r   Ú _compression_threshold_for_modelr  –  sV   € õ: " %Ñ(Ô(ð ØˆtØ"ð 7Õ'?ÀÀxÑ'PÔ'Pð 7Ý6Ð6Ý�u˜hÑ'Ô'ð 1Ý0Ð0Øˆ4r   )zgpt-mini-latestzgpt-nano-latestzclaude-haiku-latestzgemini-flash-latestzgpt-5.4-nanozgpt-5.4-miniz
gpt-5-miniz	haiku-4.5úgemini-3.6-flashz
flash-litez-nanoz-miniz-flashÚhaikuÚ_FAST_MODEL_FAMILIES)ÚthinkingÚreasonz-r1Úminilmz:batchú:freezo1-zo3-zo4-rï   Úaudioz-vlÚembedz-ttsz-transcribez	-realtimez-imagez-search-previewÚ_FAST_MODEL_EXCLUDEz(\d+(?:\.\d+)?)Úmodel_idc                 ó  — g }t          t                               |                      ¦   «         ¦  «        ¦  «        D ]7\  }}|sŒ|                     |dz  rdt          |¦  «        dfndd|f¦  «         Œ8t          |¦  «        S )uŸ  Sort key that puts a family's newest release first (descending).

    The rungs at the bottom of ``_FAST_MODEL_FAMILIES`` are bare family names â€”
    ``-mini``, ``-flash``, ``haiku`` â€” and a provider serves every generation of
    those it hasn't retired. Compared as plain strings, the oldest wins:
    ``gpt-3.5-mini`` sorts before ``gpt-5.4-mini``, and ``claude-3-haiku`` before
    ``claude-haiku-4.5``. So the rung meant to keep us current on a provider's
    small tier was pinning us to its most obsolete member.

    Splitting digit runs out and comparing them as numbers fixes both the
    generation order and the 9-vs-10 cliff a string sort walks off.
    é   rí   rB   r   ç        )Ú	enumerateÚ_VERSION_CHUNK_RErõ   ró   ÚappendÚfloatÚtuple)r   ÚchunksÚindexÚparts       r   Ú_model_recency_keyr,  ï  sŒ   € ð €FÝ Õ!2×!8Ò!8¸¿ºÑ9IÔ9IÑ!JÔ!JÑKÔKð Mð M‰ˆˆtØð 	Øà�Š¨e°a©iÐK�q�% ™+œ+ rÐ*Ð*¸aÀÀd¸^ÑLÔLÐLÐLÝ�‰=Œ=Ðr   Úprovider_idc                 ó¨  ‡— 	 ddl m} ddlm} ddlm} d\  }}	  || ¦  «        pi }t          |                     dd¦  «        ¦  «                             ¦   «         }t          |                     dd¦  «        ¦  «                             ¦   «         }n-# t          $ r  t                               d	| d
¬¦  «         Y nw xY w|s)t          t           || ¦  «        dd¦  «        pd¦  «        }|                     d¦  «        }|sdS |                     d¦  «        r
|dd…         } ||pd|d¬¦  «        pi }n.# t          $ r! t                               d| d
¬¦  «         Y dS w xY wt          d„ |D ¦   «         t           d
¬¦  «        }t"          D ]E}	|D ]@}
|
                     ¦   «         Š|	‰v r&t'          ˆfd„t(          D ¦   «         ¦  «        s|
c c S ŒAŒFdS )uÛ  Pick the fastest small model the provider ACTUALLY serves right now.

    Reads the provider's live (cached) ``/v1/models`` catalog and returns the
    newest ``_FAST_MODEL_FAMILIES`` match. Returns "" when the catalog is
    unavailable or holds no small model, so the caller falls through to the
    provider's curated default. Never raises and never blocks on a cold
    network path â€” the underlying fetch is memory+disk cached with a
    last-known-good fallback.
    r   )Ú$resolve_api_key_provider_credentials)Úfetch_models_with_pricing©Úget_provider_profile©rB   rB   r\   rB   r=   zNo credentials for %s catalogTrt   rÿ   ú/v1Néýÿÿÿg      @)r\   r=   Útimeoutz'Fast-model catalog lookup failed for %sc              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )rI   )rÀ   Úms     r   ú	<genexpr>z+_fast_model_from_catalog.<locals>.<genexpr>1  s(   è è € Ð*Ð*˜Q•#�a‘&”&Ð*Ð*Ð*Ð*Ð*Ð*r   )ÚkeyÚreversec              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )rÀ   ÚxÚlowereds     €r   r9  z+_fast_model_from_catalog.<locals>.<genexpr>5  s'   øè è € Ð,WÐ,W¸a¨Q°'¨\Ð,WÐ,WÐ,WÐ,WÐ,WÐ,Wr   )Úhermes_cli.authr/  Úhermes_cli.modelsr0  Ú	providersr2  rI   rJ   rò   rK   rX   rx   ro   ÚrstripÚendswithÚsortedr,  r  ró   Úanyr  )r-  r/  r0  r2  r\   r=   ÚcredsÚcatalogÚidsÚfamilyr   r>  s              @r   Ú_fast_model_from_catalogrJ    sv  ø€ ð ØHÐHÐHÐHÐHÐHØ?Ð?Ð?Ð?Ð?Ð?Ø2Ð2Ð2Ð2Ð2Ð2ð #Ñˆ�ð	VØ8Ð8¸ÑEÔEÐKÈˆEÝ˜%Ÿ)š) I¨rÑ2Ô2Ñ3Ô3×9Ò9Ñ;Ô;ˆGÝ˜5Ÿ9š9 Z°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=ˆHˆHøÝð 	Vð 	Vð 	Võ �LŠLÐ8¸+ÐPTˆLÑUÔUÐUÐUÐUð	Vøøøð
 ð 	]Ý�7Ð#7Ð#7¸Ñ#DÔ#DÀjÐRTÑUÔUÐ[ÐY[Ñ\Ô\ˆHØ—?’? 3Ñ'Ô'ˆØð 	Ø�2à×Ò˜UÑ#Ô#ð 	%Ø   ”}ˆHØ+Ð+Ø�O˜t¨hÀð
ñ 
ô 
ð àð 	ˆøõ ð ð ð Ý�ŠÐ>ÀÐVZˆÑ[Ô[Ð[Øˆrˆrðøøøõ Ð*Ð* 'Ð*Ñ*Ô*Õ0BÈDÐ
QÑ
QÔ
Q€CÝ&ð  ð  ˆØð 	 ð 	 ˆHØ—n’nÑ&Ô&ˆGØ˜Ð Ð ­Ð,WÐ,WÐ,WÐ,WÕCVÐ,WÑ,WÔ,WÑ)WÔ)WÐ Ø�����øð	 ð ˆ2s<   ƒD6 ›A7B ÂD6 Â'B=Â:D6 Â<B=Â=AD6 Ä1D6 Ä6'E!Å E!©Úprefer_fastrL  c                ó^  — d}	 ddl m}  || ¦  «        }n# t          $ r Y nw xY w|r\t          | ¦  «        }|r|S |�G	 |                     ¦   «         }|r|S n-# t          $ r  t
                               d| d¬¦  «         Y nw xY w|�|j        r|j        S t           	                    | d¦  «        S )u¡  Return the cheap auxiliary model for a provider.

    Resolution ladder, fastest-and-most-live first:

    1. ``prefer_fast`` only â€” a family match against the provider's LIVE
       ``/v1/models`` catalog, preferring rolling ``-latest`` aliases. This is
       both rot-proof and latency-ordered.
    2. ``prefer_fast`` only â€” the provider's own recommendation hook
       (``ProviderProfile.resolve_aux_model``). Live, but tuned for *quality*
       on long-context side tasks (Nous returns its compaction pick), so it
       ranks below the catalog match for latency-critical work.
    3. ``ProviderProfile.default_aux_model`` â€” curated, hardcoded, may rot.
    4. The legacy hardcoded dict, for providers predating the profiles system.

    ``prefer_fast`` is opt-in so this only changes latency-critical tasks
    (titling). Every other auxiliary caller keeps the existing static
    behaviour and its cache keys.
    Nr   r1  zresolve_aux_model failed for %sTrt   rB   )
rA  r2  rK   rJ  Úresolve_aux_modelrX   rx   Údefault_aux_modelÚ%_API_KEY_PROVIDER_AUX_MODELS_FALLBACKrJ   )r-  rL  Úprofiler2  Úcatalog_pickÚlives         r   Ú_get_aux_model_for_providerrT  ;  s  € ð& €GðØ2Ð2Ð2Ð2Ð2Ð2Ø&Ð& {Ñ3Ô3ˆˆøÝð ð ð Øˆðøøøð ð 
\Ý/°Ñ<Ô<ˆØð 	 ØÐØÐð\Ø×0Ò0Ñ2Ô2�Øð  Ø�Kð øåð \ð \ð \Ý—’Ð>ÀÐVZ�Ñ[Ô[Ð[Ð[Ð[ð\øøøð Ð˜wÔ8ÐØÔ(Ð(Ý0×4Ò4°[À"ÑEÔEÐEs   „ –
#¢#¾A Á'BÂ Br  zglm-4.5-flashzkimi-k2-turbo-previewzstep-3.5-flashz$google/gemini-3.1-flash-lite-previewúclaude-haiku-4-5-20251001zgoogle/gemini-3-flashzgemini-3-flashzglm-5zgoogle/gemini-3.6-flashznemotron-3-nano:30bzhy3-preview)rË   rÒ   rÕ   Ústepfunr×   rØ   rà   z
ai-gatewayzopencode-zenzopencode-goÚkilocodezollama-cloudrå   rP  Ú_API_KEY_PROVIDER_AUX_MODELSÚtitle_generationÚ_FAST_MODEL_TASKSz	mimo-v2.5zglm-5v-turbo)ÚxiaomirÒ   Ú_PROVIDER_VISION_MODELSc                 óÚ   — t                                | ¦  «        }|r|S 	 ddlm}  || ¦  «        }n# t          $ r Y dS w xY w|€dS 	 |                     ¦   «         S # t          $ r Y dS w xY w)u  Return the provider's preferred default vision model id, or None.

    Static entries in :data:`_PROVIDER_VISION_MODELS` win first (xiaomi /
    zai have dedicated vision-only model names that don't live in any
    discoverable catalog). Otherwise the provider's :class:`ProviderProfile`
    gets a chance to supply one via its ``default_vision_model()`` hook â€”
    that's where catalog-backed providers (DeepInfra) resolve a live default,
    keeping the discovery logic inside their plugin instead of a name-check
    branch here.
    r   r1  N)r\  rJ   rA  r2  rK   Údefault_vision_model)rè   Ústaticr2  rQ  s       r   Ú _resolve_provider_vision_defaultr`  “  s²   € õ %×(Ò(¨Ñ2Ô2€FØð ØˆðØ2Ð2Ð2Ð2Ð2Ð2Ø&Ð& xÑ0Ô0ˆˆøÝð ð ð Øˆtˆtðøøøà€ØˆtðØ×+Ò+Ñ-Ô-Ð-øÝð ð ð Øˆtˆtðøøøs     2 ²
A ¿A ÁA Á
A*Á)A*Ú_PROVIDERS_WITHOUT_VISIONz%https://hermes-agent.nousresearch.comzHermes Agentzproductivity,cli-agent)úHTTP-RefererúX-TitlezX-OpenRouter-Categories>   Ú1ÚonÚyesÚtrueÚheadersc                 ó
  — 	 ddl m}m}  |¦   «         } ||dd¦  «        } ||dd¦  «        }t          |t          ¦  «        rE|rCi }t          |t          ¦  «        r|                     |¦  «         |                     |¦  «         |}n# t          $ r | cY S w xY wt          |t          ¦  «        r|s| S t	          | pi ¦  «        }|                     ¦   «         D ]'\  }}	|	€Œt          |	¦  «        |t          |¦  «        <   Œ(|p| S )u×  Merge user-configured ``model.default_headers`` onto resolved headers.

    User values take precedence over provider/SDK defaults, mirroring the main
    agent client (``AIAgent._apply_user_default_headers``). This lets a
    ``custom`` OpenAI-compatible endpoint behind a gateway/WAF that rejects the
    OpenAI SDK's identifying headers (``User-Agent: OpenAI/Python ...``,
    ``X-Stainless-*``) override them for auxiliary calls too â€” otherwise the
    main turn would succeed but title/compression/vision calls to the same
    endpoint would still fail. (#40033)

    Returns the merged dict, or the original ``headers`` (possibly ``None``)
    when nothing is configured. No allocation when there are no overrides.
    r   ©Úcfg_getÚload_configrý   Údefault_headersÚextra_headers)	rH   rk  rl  r$   ÚdictÚupdaterK   rÅ   rI   )
rh  rk  rl  Ú_cfgÚuser_headersÚalias_headersÚmerged_userÚmergedr:  Úvalues
             r   Ú_apply_user_default_headersrw  É  sO  € ðØ:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Øˆ{‰}Œ}ˆØ�w˜t WÐ.?Ñ@Ô@ˆð
  ˜  g¨Ñ?Ô?ˆÝ�m¥TÑ*Ô*ð 	'¨}ð 	'Ø "ˆKÝ˜,­Ñ-Ô-ð 1Ø×"Ò" <Ñ0Ô0Ð0Ø×Ò˜}Ñ-Ô-Ð-Ø&ˆLøøÝð ð ð Øˆˆˆðøøøå�l¥DÑ)Ô)ð °ð ØˆÝ�'�-˜RÑ Ô €FØ"×(Ò(Ñ*Ô*ð &ð &‰
ˆˆUØˆ=ØÝ˜u™:œ:ˆ�s�3‰xŒxÑÐØÐ�WÐs   ‚BB	 Â	BÂBÚ	or_configc                 ó6  — t          t          ¦  «        }| €8	 ddlm}  |¦   «                              di ¦  «        } n# t
          $ r i } Y nw xY wt          j                             dd¦  «                             ¦   «          	                    ¦   «         }|r
|t          v }n|                      dd¦  «        }|s|S d	|d
<   t          j                             dd¦  «                             ¦   «         }|rF|                     ¦   «         r1t          |¦  «        }d|cxk    rdk    rn ntt          |¦  «        |d<   na|                      dd¦  «        }t          |t          t          f¦  «        r/d|cxk    rdk    r"n nt          t          |¦  «        ¦  «        |d<   |S )u¸  Build OpenRouter headers, optionally including response-cache headers.

    Precedence for response cache: env var > config.yaml > default (enabled).

    Environment variables:
        ``HERMES_OPENROUTER_CACHE`` â€” truthy (``1``/``true``/``yes``/``on``)
            enables caching; ``0``/``false``/``no``/``off`` disables.
            Overrides ``openrouter.response_cache`` in config.yaml.
        ``HERMES_OPENROUTER_CACHE_TTL`` â€” integer seconds (1-86400).
            Overrides ``openrouter.response_cache_ttl`` in config.yaml.

    *or_config* is the ``openrouter`` section from config.yaml.  When *None*,
    falls back to reading config from disk via ``load_config_readonly()``.
    Nr   ©rA   Ú
openrouterÚHERMES_OPENROUTER_CACHErB   Úresponse_cacheFrg  zX-OpenRouter-CacheÚHERMES_OPENROUTER_CACHE_TTLrí   i€Q zX-OpenRouter-Cache-TTLÚresponse_cache_ttli,  )ro  Ú_OR_HEADERS_BASErH   rA   rJ   rK   ÚosÚenvironrò   ró   Ú_TRUTHY_ENV_VALUESÚisdigitÚintrI   r$   r'  )rx  rh  rA   Ú	env_cacheÚcache_enabledÚenv_ttlÚttls          r   Úbuild_or_headersrŠ  ò  sÊ  € õ Õ#Ñ$Ô$€Gð Ðð	Ø>Ð>Ð>Ð>Ð>Ð>Ø,Ð,Ñ.Ô.×2Ò2°<ÀÑDÔDˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøõ ”
—’Ð8¸"Ñ=Ô=×CÒCÑEÔE×KÒKÑMÔM€IØð ?Ø!Õ%7Ð7ˆˆà!ŸšÐ&6¸Ñ>Ô>ˆàð Øˆà$*€GÐ Ñ!õ Œj�nŠnÐ:¸BÑ?Ô?×EÒEÑGÔG€GØð >Ø�?Š?ÑÔð 	=Ý�g‘,”,ˆCØ�CÐ Ð Ò Ð ˜5Ò Ð Ð Ð Ð Ý47¸±H´H�Ð0Ñ1øà�mŠmÐ0°#Ñ6Ô6ˆÝ�c�C¥˜<Ñ(Ô(ð 	>¨Q°#Ð->Ð->Ò->Ð->¸Ò->Ð->Ð->Ð->Ð->Ý03µC¸±H´H±´ˆGÐ,Ñ-à€Ns   ˜$= ½AÁAzX-BILLING-INVOKE-ORIGINÚHermesAgentc                 ól   — t          t          | pd¦  «        d¦  «        rt          t          ¦  «        S i S )zIReturn NVIDIA NIM cloud attribution headers for build.nvidia.com traffic.rB   úintegrate.api.nvidia.com)r4   rI   ro  Ú_NVIDIA_NIM_CLOUD_HEADERS)r=   s    r   Úbuild_nvidia_nim_headersr�  -  s5   € å�S  ¨RÑ0Ô0Ð2LÑMÔMð /ÝÕ-Ñ.Ô.Ð.Ø€Ir   )Ú__version__zHermesAgent/)rb  rc  ú
User-Agent)Únous_portal_tagsc                  ó"   — dt          ¦   «         iS )z¸Return a fresh Nous Portal ``extra_body`` dict.

    Computed at call time so a hot-reloaded ``hermes_cli.__version__`` is
    reflected without restarting long-running processes.
    Útags)Ú_nous_portal_tagsr   r   r   Ú_nous_extra_bodyr–  I  s   € ð Õ%Ñ'Ô'Ð(Ð(r   Úauxiliary_is_nousz)https://inference-api.nousresearch.com/v1zhttps://api.anthropic.comz	auth.jsonz%https://chatgpt.com/backend-api/codexÚaccess_tokenc                 ó  — dddœ}t          | t          ¦  «        r|                      ¦   «         s|S 	 ddl}|                      d¦  «        }t          |¦  «        dk     r|S |d         d	t          |d         ¦  «         d
z  z  z   }t          j        |                     |¦  «        ¦  «        }| 	                    di ¦  «         	                    d¦  «        }t          |t          ¦  «        r|r||d<   n# t          $ r Y nw xY w|S )uÏ  Headers required to avoid Cloudflare 403s on chatgpt.com/backend-api/codex.

    The Cloudflare layer in front of the Codex endpoint whitelists a small set of
    first-party originators (``codex_cli_rs``, ``codex_vscode``, ``codex_sdk_ts``,
    anything starting with ``Codex``). Requests from non-residential IPs (VPS,
    server-hosted agents) that don't advertise an allowed originator are served
    a 403 with ``cf-mitigated: challenge`` regardless of auth correctness.

    We pin ``originator: codex_cli_rs`` to match the upstream codex-rs CLI, set
    ``User-Agent`` to a codex_cli_rs-shaped string (beats SDK fingerprinting),
    and extract ``ChatGPT-Account-ID`` (canonical casing, from codex-rs
    ``auth.rs``) out of the OAuth JWT's ``chatgpt_account_id`` claim.

    Malformed tokens are tolerated â€” we drop the account-ID header rather than
    raise, so a bad token still surfaces as an auth error (401) instead of a
    crash at client construction.
    z!codex_cli_rs/0.0.0 (Hermes Agent)Úcodex_cli_rs)r‘  Ú
originatorr   Nú.r"  rí   Ú=é   zhttps://api.openai.com/authÚchatgpt_account_idzChatGPT-Account-ID)r$   rI   rò   Úbase64rõ   ÚlenÚjsonÚloadsÚurlsafe_b64decoderJ   rK   )r˜  rh  r   ÚpartsÚpayload_b64ÚclaimsÚacct_ids          r   Ú_codex_cloudflare_headersr©  m  s%  € ð& :Ø$ðð €Gõ �l¥CÑ(Ô(ð °×0BÒ0BÑ0DÔ0Dð ØˆðØˆˆˆØ×"Ò" 3Ñ'Ô'ˆÝˆu‰:Œ:˜Š>ˆ>ØˆNØ˜A”h ­¨U°1¬X©¬¨¸Ñ(:Ñ!;Ñ;ˆÝ”˜F×4Ò4°[ÑAÔAÑBÔBˆØ—*’*Ð:¸BÑ?Ô?×CÒCÐDXÑYÔYˆÝ�g�sÑ#Ô#ð 	4¨ð 	4Ø,3ˆGÐ(Ñ)øøÝð ð ð Øˆðøøøà€Ns   ²-C2 Á BC2 Ã2
C?Ã>C?c                 ó  — t          | pd¦  «                             ¦   «                              d¦  «        }|                     d¦  «        rzd|v sd|v r9|dt	          d¦  «         …         dz   }t
                               d||¦  «         |S |dt	          d¦  «         …         d	z   }t
                               d
||¦  «         |S d|v r8|                     d¦  «        r#|d	z   }t
                               d||¦  «         |S |S )u¼  Normalize an Anthropic-style base URL to OpenAI-compatible format.

    Some providers (MiniMax, MiniMax-CN) expose an ``/anthropic`` endpoint for
    the Anthropic Messages API and a separate ``/v1`` endpoint for OpenAI chat
    completions.  The auxiliary client uses the OpenAI SDK, so it must hit the
    ``/v1`` surface.  Passing the raw ``inference_base_url`` causes requests to
    land on ``/anthropic/chat/completions`` â€” a 404.
    rB   rÿ   ú
/anthropiczopen.bigmodel.cnÚbigmodelNz/paas/v4u0   Auxiliary client: rewrote ZAI base URL %s â†’ %sr4  u,   Auxiliary client: rewrote base URL %s â†’ %súapi.kimi.comú/codingu1   Auxiliary client: rewrote Kimi base URL %s â†’ %s)rI   rò   rB  rC  r¡  rX   rx   )r=   rº   Ú	rewrittens      r   Ú_to_openai_base_urlr°  ”  s  € õ ˆhˆn˜"Ñ
Ô
×
#Ò
#Ñ
%Ô
%×
,Ò
,¨SÑ
1Ô
1€CØ
‡|‚|�LÑ!Ô!ð 	ð  Ð$Ð$¨
°cÐ(9Ð(9ØÐ0�s <Ñ0Ô0Ð0Ð0Ô1°JÑ>ˆIÝ�LŠLÐKÈSÐR[Ñ\Ô\Ð\ØÐØÐ,�3˜|Ñ,Ô,Ð,Ð,Ô-°Ñ5ˆ	Ý�ŠÐCÀSÈ)ÑTÔTÐTØÐØ˜ÐÐ §¢¨iÑ!8Ô!8Ðð ˜%‘Kˆ	Ý�ŠÐHÈ#ÈyÑYÔYÐYØÐØ€Jr   c                 óR  — 	 t          | ¦  «        }n4# t          $ r'}t                               d| |¦  «         Y d}~dS d}~ww xY w|r|                     ¦   «         sdS 	 d|                     ¦   «         fS # t          $ r'}t                               d| |¦  «         Y d}~dS d}~ww xY w)z2Return (pool_exists_for_provider, selected_entry).z0Auxiliary client: could not load pool for %s: %sN©FNTz8Auxiliary client: could not select pool entry for %s: %s)TN)r/   rK   rX   rx   Úhas_credentialsÚselect)rè   Úpoolr¥   s      r   Ú_select_pool_entryr¶  ²  sÙ   € ðÝ˜Ñ"Ô"ˆˆøÝð ð ð Ý�ŠÐGÈÐSVÑWÔWÐWØˆ{ˆ{ˆ{ˆ{ˆ{øøøøðøøøð ð �t×+Ò+Ñ-Ô-ð Øˆ{ðØ�T—[’[‘]”]Ð"Ð"øÝð ð ð Ý�ŠÐOÐQYÐ[^Ñ_Ô_Ð_Øˆzˆzˆzˆzˆzøøøøðøøøs*   ‚ ’
Aœ>¾AÁA5 Á5
B&Á?B!Â!B&c                 óÚ  — 	 t          | ¦  «        }n4# t          $ r'}t                               d| |¦  «         Y d}~dS d}~ww xY w|r|                     ¦   «         sdS 	 t          |dd¦  «        }t          |¦  «        r |¦   «         }|�|S t          |dd¦  «        }t          |¦  «        r
 |¦   «         S n3# t          $ r&}t                               d| |¦  «         Y d}~nd}~ww xY wdS )zEBest-effort current/next pool entry without mutating selection order.z7Auxiliary client: could not load pool for %s (peek): %sNÚcurrentÚpeekz6Auxiliary client: could not peek pool entry for %s: %s)r/   rK   rX   rx   r³  ro   ry   )rè   rµ  r¥   Ú
current_fnr¸  Úpeek_fns         r   Ú_peek_pool_entryr¼  Â  s;  € ðÝ˜Ñ"Ô"ˆˆøÝð ð ð Ý�ŠÐNÐPXÐZ]Ñ^Ô^Ð^Øˆtˆtˆtˆtˆtøøøøðøøøð ð �t×+Ò+Ñ-Ô-ð Øˆtð
^Ý˜T 9¨dÑ3Ô3ˆ
Ý�JÑÔð 	Ø �j‘l”lˆGØÐ"Ø�Ý˜$ ¨Ñ-Ô-ˆÝ�GÑÔð 	Ø�7‘9”9Ðð	øåð ^ð ^ð ^Ý�ŠÐMÈxÐY\Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]øøøøð^øøøàˆ4s0   ‚ ’
Aœ>¾AÁ-B8 Â)B8 Â8
C(ÃC#Ã#C(Úentryc                 ó”   — | €dS t          | dd ¦  «        pt          | dd¦  «        }t          |pd¦  «                             ¦   «         S )NrB   Úruntime_api_keyr˜  )ro   rI   rò   )r½  r:  s     r   Ú_pool_runtime_api_keyrÀ  Ù  sN   € Ø€}Øˆrõ �%Ð*¨DÑ
1Ô
1Ð
WµW¸UÀNÐTVÑ5WÔ5W€CÝˆsˆy�b‰>Œ>×ÒÑ!Ô!Ð!r   rB   Úfallbackc                 óš  — | €6t          |pd¦  «                             ¦   «                              d¦  «        S t          | dd ¦  «        dk    rddlm}  |¦   «         }|r|S t          | dd ¦  «        p#t          | dd ¦  «        pt          | d	d ¦  «        p|}t          |pd¦  «                             ¦   «                              d¦  «        S )
NrB   rÿ   rè   Únousr   )Ú_nous_inference_env_overrideÚruntime_base_urlÚinference_base_urlr=   )rI   rò   rB  ro   r?  rÄ  )r½  rÁ  rÄ  Úenv_urlrº   s        r   Ú_pool_runtime_base_urlrÈ  â  sð   € Ø€}Ý�8�>˜rÑ"Ô"×(Ò(Ñ*Ô*×1Ò1°#Ñ6Ô6Ð6Ýˆu�j $Ñ'Ô'¨6Ò1Ð1ð 	AÐ@Ð@Ð@Ð@Ð@à.Ð.Ñ0Ô0ˆØð 	ØˆNõ 	�Ð)¨4Ñ0Ô0ð 	Ý�5Ð.°Ñ5Ô5ð	å�5˜* dÑ+Ô+ð	ð ð	 õ ˆsˆy�b‰>Œ>×ÒÑ!Ô!×(Ò(¨Ñ-Ô-Ð-r   úapi.anthropic.comc                 óÞ   — | sdS 	 ddl m}  || ¦  «        j        pd                     ¦   «                              ¦   «                              d¦  «        }|t          v S # t          $ r Y dS w xY w)zRReturn True if ``url``'s hostname is an Anthropic endpoint we trust for aux calls.Fr   ©r   rB   rœ  )Úurllib.parser   Úhostnamerò   ró   rB  Ú_ANTHROPIC_COMPATIBLE_HOSTSrK   )rº   r   Úhosts      r   Ú_is_anthropic_compatible_hostrÐ    s�   € àð ØˆuðØ)Ð)Ð)Ð)Ð)Ð)Ø�˜‘”Ô&Ð,¨"×3Ò3Ñ5Ô5×;Ò;Ñ=Ô=×DÒDÀSÑIÔIˆØÕ2Ð2Ð2øÝð ð ð Øˆuˆuðøøøs   †AA Á
A,Á+A,c            	      ó”   — 	 t          dt          t          j        dd¦  «        ¦  «        ¦  «        S # t          t
          f$ r Y dS w xY w)Né<   ÚHERMES_NOUS_MIN_KEY_TTL_SECONDSÚ1800i  )Úmaxr…  r�  Úgetenvr¸   Ú
ValueErrorr   r   r   Ú_nous_min_key_ttl_secondsrØ    sS   € ðÝ�2•s�2œ9Ð%FÈÑOÔOÑPÔPÑQÔQÐQøÝ•zÐ"ð ð ð Øˆtˆtðøøøs   ‚/2 ²AÁAr«   c                 óä   — | sdS 	 ddl m}m} 	  || ¦  «        pd                     ¦   «         S # |$ r Y nw xY wn# t          $ r Y nw xY wt          j        | ¦  «        pd                     ¦   «         S )u·  Read a provider API key env var through the profile secret scope.

    Auxiliary-client resolution runs both inside agent turns (secret scope
    installed â€” its verdict is authoritative under multiplex, so a scoped
    miss must NOT borrow another profile's process-env key) and on unscoped
    startup/CLI probe paths, which keep the legacy ``os.environ`` read via
    the ``UnscopedSecretError`` fallback (Slack pattern, #59739).
    rB   r   )ÚUnscopedSecretErrorÚ
get_secret)Úagent.secret_scoperÚ  rÛ  rò   rK   r�  rÖ  )r«   rÚ  rÛ  s      r   Ú_scoped_key_envrÝ    s¶   € ð ð ØˆrðØFÐFÐFÐFÐFÐFÐFÐFð	Ø�J˜tÑ$Ô$Ð*¨×1Ò1Ñ3Ô3Ð3øØ"ð 	ð 	ð 	ØˆDð	øøøØøÝð ð ð ØˆðøøøåŒI�d‰OŒOÐ!˜r×(Ò(Ñ*Ô*Ð*s#   †: �. ®6³: µ6¶: º
AÁAc                   ó.   — e Zd ZdZdedefd„Zdefd„ZdS )Ú_CodexCompletionsAdapterzyDrop-in shim that accepts chat.completions.create() kwargs and
    routes them through the Codex Responses streaming API.Úreal_clientrý   c                 ó"   — || _         || _        d S r   )Ú_clientÚ_model)r   rà  rý   s      r   rg   z!_CodexCompletionsAdapter.__init__6  s   € Ø"ˆŒØˆŒˆˆr   r   c                 ó|  ‡ ‡8‡9‡:‡;‡<‡=‡>‡?‡@— |                      dg ¦  «        }|                      d‰ j        ¦  «        }ddlm} ddlm} d}g }|D ]q}|                      dd¦  «        }	|                      d	¦  «        pd
}
|	dk    r't          |
t          ¦  «        r|
nt          |
¦  «        }Œ\|                     |¦  «         Œrt          t          ‰ j
        dd
¦  «        pd
¦  «        } ||d¦  «        } |||¬¦  «        }|||pdd
dœgddœ}|                      d¦  «        }|�||d<   |                      d¦  «        pi }t          |t          ¦  «        ro|                      d¦  «        }t          |t          ¦  «        rE|                      d¦  «        du rn-|                      d¦  «        pd}|dk    rd}|ddœ|d<   dg|d<   |                      d¦  «        }|�r	 dd l}ddlm}m} |                     t#          |¦  «        ¦  «        } ||¦  «        \  }} ||¦  «        \  }}n2# t$          $ r%}t&                               d |¦  «         Y d }~nd }~ww xY wg }|D ]‰}t          |t          ¦  «        r|                      d!i ¦  «        ni }|                      d"¦  «        }|sŒG|                     d!||                      d#d
¦  «        |                      d$i ¦  «        d%œ¦  «         ŒŠ|r||d<   	 dd&lm}m}m} ddlm} t          t          ‰ j
        dd
¦  «        pd
¦  «        }  || d'¦  «        p || d(¦  «        }! || d¦  «        p || d)¦  «        }"|!sE|"sCd*|vr? |t3          d+¦  «        ¦  «        }# |||                      d¦  «        |#¦  «        }$|$r|$|d*<   d,|vr ||| ¦  «        }%|%r|%|d,<   n,# t$          $ r t&                               d-d.¬/¦  «         Y nw xY wg }&g }'d }(t          |t6          t8          f¦  «        r|dk    r|nd Š@‰@r#t;          j        ¦   «         t9          ‰@¦  «        z   nd Š=t?          j         ¦   «         Š?d })tC          ¦   «         rtE          ¦   «         nd Š>t?          j#        ¦   «         Š<g Š;d0t          fˆ@fd1„Š:dWˆ;ˆ<ˆ>ˆ ˆ?fd2„Š9dWˆ9ˆ:ˆ=ˆ?fd3„Š8	 ‰@r=t?          j$        t9          ‰@¦  «        ‰9¦  «        })d.|)_%        |) &                    ¦   «           ‰8¦   «          dd4l'm(}* t          |¦  «        }+d.|+d5<   d6tR          d0d fˆ8fd7„}, ‰ j
        j*        j+        dXi |+¤Ž}-‰<5  ‰;                     |-¦  «         d d d ¦  «         n# 1 swxY w Y   ‰? ,                    ¦   «         rvt[          ‰>¦  «        rgt]          ‰>¦  «        rXt          |-d8d ¦  «        }.t[          |.¦  «        r8	  |.¦   «          n,# t$          $ r t&                               d9d.¬/¦  «         Y nw xY w	 t_          |-d:¦  «        r|-}/n0 |*|-t          |                      d¦  «        p|¦  «        |,¬;¦  «        }/t          |-d8d ¦  «        }.t[          |.¦  «        r	  |.¦   «          n# t$          $ r Y nw xY w‰<5  ‰; 0                    ¦   «          d d d ¦  «         n# 1 swxY w Y   no# t          |-d8d ¦  «        }.t[          |.¦  «        r	  |.¦   «          n# t$          $ r Y nw xY w‰<5  ‰; 0                    ¦   «          d d d ¦  «         w # 1 swxY w Y   w xY w|/€tc          d<¦  «        ‚dYd=tR          d>t          d?tR          d0tR          fd@„}0t          |/d:d ¦  «        pg D ]±}1 |0|1dA¦  «        }2|2dBk    rB |0|1d	¦  «        pg D ]2}3 |0|3dA¦  «        }4|4dCv r |&                      |0|3dDd
¦  «        ¦  «         Œ3ŒV|2dEk    rU|'                     te           |0|1dFd
¦  «        d!te           |0|1d"d
¦  «         |0|1dGdH¦  «        ¬I¦  «        ¬J¦  «        ¦  «         Œ²t          |/dKd ¦  «        }5|5rÆte          t          |5dLd¦  «        p,t          |5t          ¦  «        r|5                      dLd¦  «        ndt          |5dMd¦  «        p,t          |5t          ¦  «        r|5                      dMd¦  «        ndt          |5dNd¦  «        p,t          |5t          ¦  «        r|5                      dNd¦  «        nd¬O¦  «        }(nZ# t$          $ rM}‰? ,                    ¦   «         rtg           ‰:¦   «         ¦  «        |‚t&                               dP|¦  «         ‚ d }~ww xY w|)�|) 4                    ¦   «          n# |)�|) 4                    ¦   «          w w xY wd
 5                    |&¦  «         6                    ¦   «         pd }
te          dQ|
|'pd ¬R¦  «        }6te          d|6|'sdSndT¬U¦  «        }7te          |7g||(¬V¦  «        S )ZNÚmessagesrý   r   )Ú!_chat_messages_to_responses_input)r4   zYou are a helpful assistant.ÚroleÚuserÚcontentrB   Úsystemr=   úgithubcopilot.com)Úis_github_responses)rç  ré  F)rý   ÚinstructionsÚinputÚstorer6  Ú
extra_bodyÚ	reasoningÚenabledÚeffortÚmediumÚminimalÚlowrê   )ró  Úsummaryzreasoning.encrypted_contentÚincludeÚtools)Ústrip_pattern_and_formatÚstrip_slash_enumzRAuxiliary client: failed to sanitize tool schemas for Codex/xAI Responses path: %sÚfunctionr«   ÚdescriptionÚ
parameters)Útyper«   rý  rþ  )Ú_cache_scope_from_session_idÚ_content_cache_keyÚ+_default_prompt_cache_retention_for_requestrÏ   úapi.x.aizmodels.github.aiÚprompt_cache_keyÚ
session_idÚprompt_cache_retentionz4Codex auxiliary: prompt_cache_key derivation skippedTrt   r   c                  ó,   •— dt          ‰ ¦  «        d›d�S )Nz*Codex auxiliary Responses stream exceeded z.1fzs total timeout)r'  )Útotal_timeouts   €r   Ú_timeout_messagez9_CodexCompletionsAdapter.create.<locals>._timeout_message  s   ø€ ØiÅÀmÑ@TÔ@TÐiÐiÐiÐiÐir   c                  ó   •— t          ‰dd ¦  «        } t          | ¦  «        rt           | ¦   «         ¦  «        }nt          ‰¦  «        ot          ‰¦  «         }‰	                     ¦   «          |s€‰5  ‰r‰d         nd }d d d ¦  «         n# 1 swxY w Y   t          |dd ¦  «        }t          |¦  «        r8	  |¦   «          n,# t
          $ r t                               dd¬¦  «         Y nw xY wd S t          ‰j        dd ¦  «        }t          |¦  «        r8	  |¦   «          n,# t
          $ r t                               dd¬¦  «         Y nw xY w	 t          ‰j        ¦  «         d S # t
          $ r  t                               dd¬¦  «         Y d S w xY w)	Nr•   r   ÚclosezECodex auxiliary: cancelled attempt stream close during timeout failedTrt   z3Codex auxiliary: client close during timeout failedz1Codex auxiliary: cache eviction on timeout failed)
ro   ry   rn   r†   r¤   rK   rX   rx   râ  Ú_evict_cached_client_instance)
r•   Útimeout_wonÚstreamÚclose_streamr  Úattempt_streamÚattempt_stream_lockÚprotected_cancel_checkr   r’   s
        €€€€€r   Ú_close_client_on_timeoutzA_CodexCompletionsAdapter.create.<locals>._close_client_on_timeout  sW  ø€ Ý$+Ø&Ð(?Àñ%ô %Ð!õ Ð-Ñ.Ô.ð Ý"Ð#8Ð#8Ñ#:Ô#:Ñ;Ô;��õ Ð3Ñ4Ô4ð OÝ6Ð7MÑNÔNð�ð �MŠM‰OŒOˆOØð ð )ð Kð KØ2@ÐJ˜^¨AÔ.Ð.Àd�FðKð Kð Kñ Kô Kð Kð Kð Kð Kð Kð Køøøð Kð Kð Kð Kå& v¨w¸Ñ=Ô=�Ý˜LÑ)Ô)ð ðØ$˜™œ˜˜øÝ$ð ð ð ÝŸšð4à%)ð %ñ ô ð ð ð ðøøøð �Ý˜DœL¨'°4Ñ8Ô8ˆEÝ˜‰Œð gðgØ�E‘G”G�G�GøÝ ð gð gð gÝ—L’LÐ!VÐae�LÑfÔfÐfÐfÐfðgøøøðaÝ-¨d¬lÑ;Ô;Ð;Ð;Ð;øÝð að að aÝ—’ÐPÐ[_�Ñ`Ô`Ð`Ð`Ð`Ð`ðaøøøsH   Á1B
Â
BÂBÂ6
C Ã&C*Ã)C*Ä
D  Ä &E	ÅE	ÅE# Å#&FÆFc                  ó€  •— ‰�Lt          j        ¦   «         ‰k    r5‰                     ¦   «         s
 ‰¦   «          t           ‰¦   «         ¦  «        ‚	 ddlm}  t          ¦   «         rt          ¦   «         ‚ | ¦   «         rt          ¦   «         st          d¦  «        ‚d S d S # t          t          f$ r ‚ t          $ r Y d S w xY w)Nr   )Úis_interruptedz,Codex auxiliary Responses stream interrupted)ÚtimeÚ	monotonicrw   ÚTimeoutErrorÚtools.interruptr  r|   rc   rq   ÚInterruptedErrorrK   )r  r  r	  Údeadliner’   s    €€€€r   Ú_check_cancelledz9_CodexCompletionsAdapter.create.<locals>._check_cancelled8  s  ø€ ØÐ#­¬Ñ(8Ô(8¸HÒ(DÐ(DØ ×'Ò'Ñ)Ô)ð /Ø,Ð,Ñ.Ô.Ð.Ý"Ð#3Ð#3Ñ#5Ô#5Ñ6Ô6Ð6ðØ:Ð:Ð:Ð:Ð:Ð:õ 3Ñ4Ô4ð :Ý7Ñ9Ô9Ð9Ø!�>Ñ#Ô#ð [Õ,DÑ,FÔ,Fð [Ý*Ð+YÑZÔZÐZð[ð [ð [ð [øå$Õ&CÐDð ð ð ØÝð ð ð ð ��ðøøøs   ÁA	B ÂB=Â<B=)Ú_consume_codex_event_streamr  Ú_eventc                 ó8   •— t          ¦   «           ‰¦   «          d S r   ©r™   )r  r  s    €r   Ú_on_each_eventz7_CodexCompletionsAdapter.create.<locals>._on_each_evente  s&   ø€ õ %Ñ&Ô&Ð&Ø Ð Ñ"Ô"Ð"Ð"Ð"r   r  z;Codex auxiliary: late cancelled attempt stream close failedÚoutput)rý   Úon_eventz@Codex auxiliary Responses stream did not return a final responser%   r:  Údefaultc                 óŠ   — t          | |d ¦  «        }|€+t          | t          ¦  «        r|                      ||¦  «        }|�|n|S r   ©ro   r$   ro  rJ   )r%   r:  r$  Úvals       r   Ú	_item_getz2_CodexCompletionsAdapter.create.<locals>._item_get   sG   € Ý˜c 3¨Ñ-Ô-�Ø�;¥:¨cµ4Ñ#8Ô#8�;ØŸ'š' # wÑ/Ô/�CØ!˜o�s�s°7Ð:r   rÿ  Úmessage>   ÚtextÚoutput_textr*  Úfunction_callÚcall_idÚ	argumentsz{}©r«   r.  ©Úidrÿ  rü  ÚusageÚinput_tokensÚoutput_tokensÚtotal_tokens©Úprompt_tokensÚcompletion_tokensr5  z-Codex auxiliary Responses API call failed: %sÚ	assistant)rç  ré  Ú
tool_callsÚstopr:  ©r*  r)  Úfinish_reason©Úchoicesrý   r2  ri   r   r   )7rJ   rã  Úagent.codex_responses_adapterræ  Úutilsr4   r$   rI   r&  ro   râ  ro  ÚcopyÚtools.schema_sanitizerrú  rû  ÚdeepcopyÚlistrK   rX   rY   Úagent.transports.codexr   r  r  Ú_runtime_main_valuerx   r…  r'  r  r  rŒ   r¯   rq   rƒ   r�   ÚTimerr¬   r²   Úagent.codex_runtimer  r   Ú	responsesÚcreaterw   ry   r†   ÚhasattrÚclearÚRuntimeErrorr   r  ÚcancelÚjoinrò   )Ar   r!   rå  rý   ræ  r4   rí  Úreplay_messagesÚmsgrç  ré  Ú_host_for_inputÚ_is_github_for_inputÚinput_itemsÚresp_kwargsr6  rð  Úreasoning_cfgró  rù  Ú_copyrú  rû  Ú_r¥   Ú	convertedÚtÚfnr«   r   r  r  Ú	_host_srcÚ_is_xaiÚ
_is_githubÚ_scopeÚ
_cache_keyÚ_cache_retentionÚ
text_partsÚtool_calls_rawr2  Útimeout_timerr  Ústream_kwargsr!  Úevent_streamÚclose_fnÚfinalr(  ÚitemÚ	item_typer+  ÚptypeÚ
resp_usager)  Úchoicer  r  r	  r  r  r  r  r’   r  sA   `                                                       @@@@@@@@@r   rK  z_CodexCompletionsAdapter.create:  s3  øøøøøøøøøø€ Ø—:’:˜j¨"Ñ-Ô-ˆØ—
’
˜7 D¤KÑ0Ô0ˆð 	TÐSÐSÐSÐSÐSØ/Ð/Ð/Ð/Ð/Ð/à5ˆØ02ˆØð 	,ð 	,ˆCØ—7’7˜6 6Ñ*Ô*ˆDØ—g’g˜iÑ(Ô(Ð.¨BˆGØ�xÒÐÝ*4°W½cÑ*BÔ*BÐT˜w˜wÍÈGÉÌ��à×&Ò& sÑ+Ô+Ð+Ð+õ �g d¤l°JÀÑCÔCÐIÀrÑJÔJˆØ4Ð4°_ÐFYÑZÔZÐØ7Ð7ØÐ1Eð
ñ 
ô 
ˆð
 Ø(Ø ÐE¨fÀÐ%DÐ%DÐ$EØð	'
ð '
ˆð —*’*˜YÑ'Ô'ˆØÐØ%,ˆK˜	Ñ"ð —Z’Z Ñ-Ô-Ð3°ˆ
Ý�j¥$Ñ'Ô'ð 	MØ&ŸNšN¨;Ñ7Ô7ˆMÝ˜-­Ñ.Ô.ð MØ ×$Ò$ YÑ/Ô/°5Ð8Ð8ð
 ð +×.Ò.¨xÑ8Ô8ÐD¸H�Fð  Ò*Ð*Ø!&˜à"(Ø#)ð0ð 0�K Ñ,ð /LÐ-L�K 	Ñ*ð —
’
˜7Ñ#Ô#ˆØñ %	1ðØ$Ð$Ð$Ð$ðð ð ð ð ð ð ð ð Ÿš¥t¨E¡{¤{Ñ3Ô3�Ø3Ð3°EÑ:Ô:‘��qØ+Ð+¨EÑ2Ô2‘��q�qøÝð ð ð Ý—’ð3Ø47ñô ð ð ð ð ð ð øøøøðøøøð
 ˆIØð 
ð 
�Ý.8¸½DÑ.AÔ.AÐI�Q—U’U˜: rÑ*Ô*Ð*Àr�Ø—v’v˜f‘~”~�Øð ØØ× Ò Ø&Ø Ø#%§6¢6¨-¸Ñ#<Ô#<Ø"$§&¢&¨°rÑ":Ô":ð	"ð "ñ ô ð ð ð ð 1Ø'0�˜GÑ$ð$	ðð ð ð ð ð ð ð ð ð ð
 4Ð3Ð3Ð3Ð3Ð3å�G D¤L°*¸bÑAÔAÐGÀRÑHÔHˆIØ+Ð+¨I°vÑ>Ô>ÐnÐBWÐBWÐXaÐcmÑBnÔBnˆGà%Ð% iÐ1DÑEÔEð HØ(Ð(¨Ð4FÑGÔGð ð ð A :ð AÐ2DÈKÐ2WÐ2Wð 6Ð5Õ6IÈ,Ñ6WÔ6WÑXÔX�Ø/Ð/°¸k¿oºoÈgÑ>VÔ>VÐX^Ñ_Ô_�
Øð AØ6@�KÐ 2Ñ3Ø'¨{Ð:Ð:Ø#NÐ#NØØñ$ô $Ð ð $ð MØ<L�KÐ 8Ñ9øøÝð 	ð 	ð 	Ý�LŠLØFÐQUð ñ ô ð ð ð ð	øøøð !#ˆ
Ø$&ˆØˆÝ#-¨g½½U°|Ñ#DÔ#DÐ^ÈÐSTÊÈ˜˜ÐZ^ˆØ>KÐU•4”>Ñ#Ô#¥e¨MÑ&:Ô&:Ñ:Ð:ÐQUˆÝ”OÑ%Ô%ˆ	Ø37ˆõ ,DÑ+EÔ+EÐOÕ%Ñ'Ô'Ð'È4ð 	õ (œnÑ.Ô.ÐØ$&ˆð	j¥#ð 	jð 	jð 	jð 	jð 	jð 	jð0	að 0	að 0	að 0	að 0	að 0	að 0	að 0	að 0	að 0	aðd	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð.y	'Øð &Ý )¤µ°mÑ0DÔ0DÐF^Ñ _Ô _�Ø'+�Ô$Ø×#Ò#Ñ%Ô%Ð%ØÐÑÔÐð HÐGÐGÐGÐGÐGå  Ñ-Ô-ˆMØ&*ˆM˜(Ñ#ð#¥sð #¨tð #ð #ð #ð #ð #ð #ð 9˜4œ<Ô1Ô8ÐIÐI¸=ÐIÐIˆLØ$ð 4ð 4Ø×%Ò% lÑ3Ô3Ð3ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð × Ò Ñ"Ô"ðåÐ3Ñ4Ô4ðõ 3Ð3IÑJÔJðõ
 # <°¸$Ñ?Ô?�Ý˜HÑ%Ô%ð ðØ ˜™
œ
˜
˜
øÝ$ð ð ð ÝŸšØYØ%)ð %ñ ô ð ð ð ðøøøð
+õ ˜<¨Ñ2Ô2ð Ø(�E�Eà7Ð7Ø$Ý! +§/¢/°'Ñ":Ô":Ð"C¸eÑDÔDØ!/ðñ ô �Eõ # <°¸$Ñ?Ô?�Ý˜HÑ%Ô%ð ðØ ˜™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøà(ð +ð +Ø"×(Ò(Ñ*Ô*Ð*ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +øøõ # <°¸$Ñ?Ô?�Ý˜HÑ%Ô%ð ðØ ˜™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøà(ð +ð +Ø"×(Ò(Ñ*Ô*Ð*ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð +øøøð ˆ}Ý"Ð#eÑfÔfÐfð
;ð ;�sð ;­ð ;µsð ;Åcð ;ð ;ð ;ð ;õ ! ¨°$Ñ7Ô7Ð=¸2ð ð �Ø%˜I d¨FÑ3Ô3�	Ø 	Ò)Ð)Ø!* ¨4°Ñ!;Ô!;Ð!A¸rð Kð K˜Ø ) 	¨$°Ñ 7Ô 7˜Ø Ð$;Ð;Ð;Ø&×-Ò-¨i¨i¸¸fÀbÑ.IÔ.IÑJÔJÐJøðKð  /Ò1Ð1Ø"×)Ò)­/Ø$˜9 T¨9°bÑ9Ô9Ø'Ý!0Ø!* ¨4°¸Ñ!<Ô!<Ø&/ i°°kÀ4Ñ&HÔ&Hð"ñ "ô "ð+ñ +ô +ñ ô ð øõ ! ¨°Ñ6Ô6ˆJØð Ý'Ý")¨*°nÀaÑ"HÔ"Hð #fÝAKÈJÕX\ÑA]ÔA]Ðd˜JŸNšN¨>¸1Ñ=Ô=Ð=ÐcdÝ&-¨j¸/È1Ñ&MÔ&Mð 'gÝBLÈZÕY]ÑB^ÔB^Ðe˜JŸNšN¨?¸AÑ>Ô>Ð>ÐdeÝ!(¨°^ÀQÑ!GÔ!Gð "fÝAKÈJÕX\ÑA]ÔA]Ðd˜JŸNšN¨>¸1Ñ=Ô=Ð=Ðcdðñ ô �øøõ ð 	ð 	ð 	Ø×ÒÑ!Ô!ð @Ý"Ð#3Ð#3Ñ#5Ô#5Ñ6Ô6¸CÐ?Ý�LŠLÐHÈ#ÑNÔNÐNØøøøøð		øøøð Ð(Ø×$Ò$Ñ&Ô&Ð&øøð Ð(Ø×$Ò$Ñ&Ô&Ð&Ð&ð )øøøð —'’'˜*Ñ%Ô%×+Ò+Ñ-Ô-Ð5°ˆõ "ØØØ%Ð-¨ð
ñ 
ô 
ˆõ
 !ØØØ(6ÐH˜&˜&¸Lð
ñ 
ô 
ˆõ
 Ø�HØØð
ñ 
ô 
ð 	
sK  ÇA
H& È&
IÈ0IÉIË.CN2 Î2&OÏOÒBc Ô%UÔ;c ÕUÕc ÕUÕAc Ö%
V0 Ö/c Ö0&W×c ×W×c ×AZ Ø  c Ù
Y Ùc Ù
YÙc ÙYÙc ÙY?Ù3c Ù?ZÚc ÚZÚc Ú![7Ú-
Z8Ú7[7Ú8
[Û[7Û[Û[7Û
[+Û[7Û+[/Û/[7Û2[/Û3[7Û7Gc ã
d< ã
d"ãAdäd"ä"d< ä<eN)	r*   r+   r,   r-   r   rI   rg   r   rK  r   r   r   rß  rß  2  sb   € € € € € ð>ð >ð Fð °3ð ð ð ð ða
 #ð a
ð a
ð a
ð a
ð a
ð a
r   rß  c                   ó   — e Zd ZdZdefd„ZdS )Ú_CodexChatShimz>Wraps the adapter to provide client.chat.completions.create().Úadapterc                 ó   — || _         d S r   ©Úcompletions©r   rq  s     r   rg   z_CodexChatShim.__init__á  ó   € Ø"ˆÔÐÐr   N)r*   r+   r,   r-   rß  rg   r   r   r   rp  rp  Þ  s6   € € € € € ØHÐHð#Ð 8ð #ð #ð #ð #ð #ð #r   rp  c                   ó(   — e Zd ZdZdedefd„Zd„ ZdS )ÚCodexAuxiliaryClientzçOpenAI-client-compatible wrapper that routes through Codex Responses API.

    Consumers can call client.chat.completions.create(**kwargs) as normal.
    Also exposes .api_key and .base_url for introspection by async wrappers.
    rà  rý   c                 óŒ   — || _         t          ||¦  «        }t          |¦  «        | _        |j        | _        |j        | _        d S r   )Ú_real_clientrß  rp  Úchatr\   r=   )r   rà  rý   rq  s       r   rg   zCodexAuxiliaryClient.__init__ì  s@   € Ø'ˆÔÝ*¨;¸Ñ>Ô>ˆÝ" 7Ñ+Ô+ˆŒ	Ø"Ô*ˆŒØ#Ô,ˆŒˆˆr   c                 ó8   — | j                              ¦   «          d S r   )rz  r  r(   s    r   r  zCodexAuxiliaryClient.closeó  s   € ØÔ×ÒÑ!Ô!Ð!Ð!Ð!r   N)r*   r+   r,   r-   r   rI   rg   r  r   r   r   rx  rx  å  sO   € € € € € ðð ð- Fð -°3ð -ð -ð -ð -ð"ð "ð "ð "ð "r   rx  c                   ó*   — e Zd ZdZdefd„Zdefd„ZdS )Ú_AsyncCodexCompletionsAdapterz±Async version of the Codex Responses adapter.

    Wraps the sync adapter via asyncio.to_thread() so async consumers
    (web_tools, session_search) can await it as normal.
    Úsync_adapterc                 ó   — || _         d S r   ©Ú_sync©r   r  s     r   rg   z&_AsyncCodexCompletionsAdapter.__init__þ  ó   € Ø!ˆŒ
ˆ
ˆ
r   r   c              ‹   óJ   K  — dd l } |j        | j        j        fi |¤Žƒ d {V —†S ©Nr   ©ÚasyncioÚ	to_threadr‚  rK  ©r   r!   rˆ  s      r   rK  z$_AsyncCodexCompletionsAdapter.create  óA   è è € ØˆˆˆØ&�WÔ& t¤zÔ'8ÐCÐC¸FÐCÐCÐCÐCÐCÐCÐCÐCÐCr   N)r*   r+   r,   r-   rß  rg   r   rK  r   r   r   r~  r~  ÷  s\   € € € € € ðð ð"Ð%=ð "ð "ð "ð "ðD¨ð Dð Dð Dð Dð Dð Dr   r~  c                   ó   — e Zd Zdefd„ZdS )Ú_AsyncCodexChatShimrq  c                 ó   — || _         d S r   rs  ru  s     r   rg   z_AsyncCodexChatShim.__init__  rv  r   N)r*   r+   r,   r~  rg   r   r   r   r�  r�    s0   € € € € € ð#Ð =ð #ð #ð #ð #ð #ð #r   r�  c                   ó   — e Zd ZdZdd„ZdS )ÚAsyncCodexAuxiliaryClientzHAsync-compatible wrapper matching AsyncOpenAI.chat.completions.create().Úsync_wrapperrx  c                 ó¬   — |j         j        }t          |¦  «        }t          |¦  «        | _         |j        | _        |j        | _        |j        | _        d S r   )r{  rt  r~  r�  r\   r=   rz  ©r   r‘  r  Úasync_adapters       r   rg   z"AsyncCodexAuxiliaryClient.__init__  sP   € Ø#Ô(Ô4ˆÝ5°lÑCÔCˆÝ'¨Ñ6Ô6ˆŒ	Ø#Ô+ˆŒØ$Ô-ˆŒð )Ô5ˆÔÐÐr   N)r‘  rx  )r*   r+   r,   r-   rg   r   r   r   r�  r�    s.   € € € € € ØRÐRð6ð 6ð 6ð 6ð 6ð 6r   r�  c            
       óB   — e Zd ZdZ	 	 ddededededz  fd„Zd	efd
„ZdS )Ú_AnthropicCompletionsAdapterz<OpenAI-client-compatible adapter for Anthropic Messages API.FNrà  rý   Úis_oauthr=   c                 óø   — || _         || _        || _        |pd | _        | j        sRt	          t          |dd¦  «        pd¦  «        pd }|r0	 ddlm}  ||¦  «        r	|| _        d S d S # t          $ r Y d S w xY wd S d S )Nr=   rB   r   )Ú_is_nous_portal_endpoint)	râ  rã  Ú	_is_oauthÚ	_base_urlrI   ro   Úagent.anthropic_adapterr™  rK   )r   rà  rý   r—  r=   Ú	candidater™  s          r   rg   z%_AnthropicCompletionsAdapter.__init__!  sÑ   € ð #ˆŒØˆŒØ!ˆŒð "Ð) TˆŒØŒ~ð 		Ý�G K°¸RÑ@Ô@ÐFÀBÑGÔGÐOÈ4ˆIØð ðØPÐPÐPÐPÐPÐPà/Ð/°	Ñ:Ô:ð 3Ø)2˜œ˜˜ð3ð 3øå ð ð ð Ø�D�Dðøøøð		ð 		ðð s   ÁA' Á'
A5Á4A5r   c           
      ó&  — ddl m}m} ddlm} |                     dg ¦  «        }|                     d| j        ¦  «        }|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }	|                     d	d
¦  «        }
|
rd }n*|                     d¦  «        p|                     d¦  «        }|                     d¦  «        }d }t          |t          ¦  «        r|}n€t          |t          ¦  «        rkt          |                     dd¦  «        ¦  «                             ¦   «         }|dk    r*|                     di ¦  «                             d¦  «        }n|dv r|}|	}|€V|                     d¦  «        }t          |t          ¦  «        r,|                     d¦  «        }t          |t          ¦  «        r|} |||||||| j        | j        ¬¦  «        }|�ddl m}  ||¦  «        s||d<   |                     d¦  «        }|rlt          |t          ¦  «        rWd„ |                     ¦   «         D ¦   «         }|r7|                     d¦  «        pi }t          |t          ¦  «        si }i |¥|¥|d<    || j        |t#          ¦   «         rd„ nd ¬¦  «        } |d¦  «        }|                     || j        ¬¦  «        }t'          |j        |j        |j        ¬¦  «        }|j        }d }t1          |d¦  «        rd|j        r]t5          |j        dd¦  «        pd}t5          |j        dd¦  «        pd}t5          |j        d d¦  «        p||z   }t'          |||¬!¦  «        }t'          d||¬"¦  «        } t'          | g||¬#¦  «        S )$Nr   )Úbuild_anthropic_kwargsÚcreate_anthropic_message)Úget_transportrå  rý   rù  Útool_choiceÚ_reasoning_configÚ_skip_zai_max_tokensFÚ
max_tokensÚmax_completion_tokensÚtemperaturerÿ  rB   rü  r«   >   rê   ÚnoneÚrequiredrð  rñ  )rý   rå  rù  r¥  Úreasoning_configr¢  r—  r=   ©Ú_forbids_sampling_paramsc                 ój   — i | ]0\  }}|d k    ¯t          |¦  «                             d¦  «        °-||“Œ1S )rñ  rY  )rI   rô   r¿   s      r   rÃ   z7_AnthropicCompletionsAdapter.create.<locals>.<dictcomp>‹  sL   € ð ð ð Ù˜˜AØ˜Ò#Ð#­C°©F¬F×,=Ò,=¸cÑ,BÔ,BÐ#ð �1Ø#Ð#Ð#r   c                 ó   — t          ¦   «         S r   r   )r  s    r   ú<lambda>z5_AnthropicCompletionsAdapter.create.<locals>.<lambda>�  s   € Õ 4Ñ 6Ô 6€ r   )Úon_stream_eventÚanthropic_messages)Ústrip_tool_prefix)ré  r:  rñ  r2  r3  r4  r5  r6  r<  r>  )rœ  rŸ  r   Úagent.transportsr¡  rJ   rã  Úpopr$   rI   ro  ró   rš  r›  r¬  rÅ   râ  r›   Únormalize_responser   ré  r:  rñ  r=  rL  r2  ro   )!r   r!   rŸ  r   r¡  rå  rý   rù  r¢  rª  Ú_skip_mtr¥  r§  Únormalized_tool_choiceÚchoice_typeÚ_reasoning_cfgÚ_ebÚ_rcÚanthropic_kwargsr¬  Úcaller_extra_bodyÚpassthroughÚexistingÚresponseÚ
_transportÚ_nrÚassistant_messager=  r2  r7  r8  r5  rn  s!                                    r   rK  z#_AnthropicCompletionsAdapter.create<  s[  € Ø\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø2Ð2Ð2Ð2Ð2Ð2à—:’:˜j¨"Ñ-Ô-ˆØ—
’
˜7 D¤KÑ0Ô0ˆØ—
’
˜7Ñ#Ô#ˆØ—j’j Ñ/Ô/ˆØ!Ÿ:š:Ð&9Ñ:Ô:Ðð —:’:Ð4°eÑ<Ô<ˆØð 	YØˆJˆJàŸš LÑ1Ô1ÐX°V·Z²ZÐ@WÑ5XÔ5XˆJØ—j’j Ñ/Ô/ˆà!%ÐÝ�k¥3Ñ'Ô'ð 	5Ø%0Ð"Ð"Ý˜¥TÑ*Ô*ð 	5Ý˜kŸošo¨f°bÑ9Ô9Ñ:Ô:×@Ò@ÑBÔBˆKØ˜jÒ(Ð(Ø)4¯ª¸ÀRÑ)HÔ)H×)LÒ)LÈVÑ)TÔ)TÐ&Ð&ØÐ <Ð<Ð<Ø)4Ð&ð *ˆØÐ!Ø—*’*˜\Ñ*Ô*ˆCÝ˜#�tÑ$Ô$ð )Ø—g’g˜kÑ*Ô*�Ý˜c¥4Ñ(Ô(ð )Ø%(�Nà1Ð1ØØØØ!Ø+Ø.Ø”^ð
 ”^ð
ñ 
ô 
Ðð" Ð"ØHÐHÐHÐHÐHÐHØ+Ð+¨EÑ2Ô2ð >Ø2=Ð  Ñ/ð #ŸJšJ |Ñ4Ô4ÐØð 		M¥Ð,=½tÑ!DÔ!Dð 		Mðð Ø!2×!8Ò!8Ñ!:Ô!:ðñ ô ˆKð ð MØ+×/Ò/°Ñ=Ô=ÐCÀ�Ý! (­DÑ1Ô1ð "Ø!�HØ1L°HÐ1LÀÐ1LÐ  Ñ.à+Ð+ØŒLØõ (Ñ)Ô)ð4Ð6Ð6Ð6Ø/3ð
ñ 
ô 
ˆð #�]Ð#7Ñ8Ô8ˆ
Ø×+Ò+Ø¨¬ð ,ñ 
ô 
ˆõ ,Ø”KØ”~Ø”mð
ñ 
ô 
Ðð
 Ô)ˆàˆÝ�8˜WÑ%Ô%ð 	¨(¬.ð 	Ý# H¤N°NÀAÑFÔFÐKÈ!ˆMÝ '¨¬¸ÈÑ KÔ KÐ PÈqÐÝ" 8¤>°>À1ÑEÔEÐlÈ-ÐZkÑJkˆLÝ#Ø+Ø"3Ø)ðñ ô ˆEõ !ØØ%Ø'ð
ñ 
ô 
ˆõ
 Ø�HØØð
ñ 
ô 
ð 	
r   r²  )	r*   r+   r,   r-   r   rI   rn   rg   rK  r   r   r   r–  r–    s‡   € € € € € ØFÐFð Ø#ðð àðð ðð ð	ð
 ˜‘*ðð ð ð ð6G
 #ð G
ð G
ð G
ð G
ð G
ð G
r   r–  c                   ó   — e Zd Zdefd„ZdS )Ú_AnthropicChatShimrq  c                 ó   — || _         d S r   rs  ru  s     r   rg   z_AnthropicChatShim.__init__Ç  rv  r   N)r*   r+   r,   r–  rg   r   r   r   rÅ  rÅ  Æ  s0   € € € € € ð#Ð <ð #ð #ð #ð #ð #ð #r   rÅ  c                   ó6   — e Zd ZdZddededededef
d„Zd	„ Zd
S )ÚAnthropicAuxiliaryClientz@OpenAI-client-compatible wrapper over a native Anthropic client.Frà  rý   r\   r=   r—  c                 ó~   — || _         t          ||||¬¦  «        }t          |¦  «        | _        || _        || _        d S )N)r—  r=   )rz  r–  rÅ  r{  r\   r=   )r   rà  rý   r\   r=   r—  rq  s          r   rg   z!AnthropicAuxiliaryClient.__init__Î  sJ   € Ø'ˆÔÝ.Ø˜¨¸Hð
ñ 
ô 
ˆõ ' wÑ/Ô/ˆŒ	ØˆŒØ ˆŒˆˆr   c                 óh   — t          | j        dd ¦  «        }t          |¦  «        r |¦   «          d S d S )Nr  )ro   rz  ry   )r   rh  s     r   r  zAnthropicAuxiliaryClient.close×  s?   € Ý˜4Ô,¨g°tÑ<Ô<ˆÝ�HÑÔð 	ØˆH‰JŒJˆJˆJˆJð	ð 	r   N©F)	r*   r+   r,   r-   r   rI   rn   rg   r  r   r   r   rÈ  rÈ  Ë  sf   € € € € € ØJÐJð!ð ! Cð !°ð !¸cð !ÈSð !Ð\`ð !ð !ð !ð !ðð ð ð ð r   rÈ  c                   ó&   — e Zd Zdefd„Zdefd„ZdS )Ú!_AsyncAnthropicCompletionsAdapterr  c                 ó   — || _         d S r   r�  rƒ  s     r   rg   z*_AsyncAnthropicCompletionsAdapter.__init__Þ  r„  r   r   c              ‹   óJ   K  — dd l } |j        | j        j        fi |¤Žƒ d {V —†S r†  r‡  rŠ  s      r   rK  z(_AsyncAnthropicCompletionsAdapter.createá  r‹  r   N)r*   r+   r,   r–  rg   r   rK  r   r   r   rÍ  rÍ  Ý  sR   € € € € € ð"Ð%Að "ð "ð "ð "ðD¨ð Dð Dð Dð Dð Dð Dr   rÍ  c                   ó   — e Zd Zdefd„ZdS )Ú_AsyncAnthropicChatShimrq  c                 ó   — || _         d S r   rs  ru  s     r   rg   z _AsyncAnthropicChatShim.__init__ç  rv  r   N)r*   r+   r,   rÍ  rg   r   r   r   rÑ  rÑ  æ  s0   € € € € € ð#Ð Að #ð #ð #ð #ð #ð #r   rÑ  c                   ó   — e Zd Zdd„ZdS )ÚAsyncAnthropicAuxiliaryClientr‘  rÈ  c                 ó¬   — |j         j        }t          |¦  «        }t          |¦  «        | _         |j        | _        |j        | _        |j        | _        d S r   )r{  rt  rÍ  rÑ  r\   r=   rz  r“  s       r   rg   z&AsyncAnthropicAuxiliaryClient.__init__ì  sP   € Ø#Ô(Ô4ˆÝ9¸,ÑGÔGˆÝ+¨MÑ:Ô:ˆŒ	Ø#Ô+ˆŒØ$Ô-ˆŒð )Ô5ˆÔÐÐr   N)r‘  rÈ  ©r*   r+   r,   rg   r   r   r   rÔ  rÔ  ë  s(   € € € € € ð6ð 6ð 6ð 6ð 6ð 6r   rÔ  c                   ó.   — e Zd ZdZdedefd„Zdefd„ZdS )Ú_BedrockCompletionsAdapterzGTranslates ``chat.completions.create(**kwargs)`` into Bedrock Converse.Úregionrý   c                 ó"   — || _         || _        d S r   )Ú_regionrã  )r   rÙ  rý   s      r   rg   z#_BedrockCompletionsAdapter.__init__ú  s   € ØˆŒØˆŒˆˆr   r   c                 óÈ  — ddl m} |                     dg ¦  «        }|                     d| j        ¦  «        }|                     d¦  «        p|                     d¦  «        }|                     d¦  «        }t	          |t
          ¦  «        r|g}|                     d¦  «        �.t                               d	|                     d¦  «        ¦  «         |                     d
¦  «        rt                               d|¦  «          || j        |||                     d¦  «        |rt          |¦  «        nd|                     d¦  «        |                     d¦  «        |¬¦  «        S )Nr   )Úcall_converserå  rý   r¥  r¦  r;  r¢  uV   BedrockAuxiliaryClient: tool_choice=%r not supported by the Converse shim â€” ignored.r  u›   BedrockAuxiliaryClient: stream=True requested for %s â€” returning a complete response (Converse shim does not stream); caller downgrades to non-streaming.rù  i   r§  Útop_p)rÙ  rý   rå  rù  r¥  r§  rÞ  Ústop_sequences)
Úagent.bedrock_adapterrÝ  rJ   rã  r$   rI   rX   rx   rÛ  r…  )r   r!   rÝ  rå  rý   r¥  r;  s          r   rK  z!_BedrockCompletionsAdapter.createþ  sg  € Ø7Ð7Ð7Ð7Ð7Ð7à—:’:˜j¨"Ñ-Ô-ˆØ—
’
˜7 D¤KÑ0Ô0ˆØ—Z’Z Ñ-Ô-ÐT°·²Ð<SÑ1TÔ1Tˆ
à�zŠz˜&Ñ!Ô!ˆÝ�d�CÑ Ô ð 	Ø�6ˆDØ�:Š:�mÑ$Ô$Ð0õ �LŠLð-Ø.4¯jªj¸Ñ.GÔ.Gñô ð ð �:Š:�hÑÔð 		õ �LŠLð?ð ñ	ô ð ð ˆ}Ø”<ØØØ—*’*˜WÑ%Ô%Ø*4Ð>•s˜:‘”�¸$ØŸ
š
 =Ñ1Ô1Ø—*’*˜WÑ%Ô%Øð	
ñ 	
ô 	
ð 		
r   N)r*   r+   r,   r-   rI   rg   r   rK  r   r   r   rØ  rØ  ÷  sW   € € € € € ØQÐQð˜sð ¨3ð ð ð ð ð%
 #ð %
ð %
ð %
ð %
ð %
ð %
r   rØ  c                   ó   — e Zd Zdd„ZdS )Ú_BedrockChatShimrq  rØ  c                 ó   — || _         d S r   rs  ru  s     r   rg   z_BedrockChatShim.__init__'  rv  r   N)rq  rØ  rÖ  r   r   r   râ  râ  &  s(   € € € € € ð#ð #ð #ð #ð #ð #r   râ  c                   ó(   — e Zd ZdZdedefd„Zd„ ZdS )ÚBedrockAuxiliaryClientz?OpenAI-client-compatible wrapper over AWS Bedrock Converse API.rÙ  rý   c                 óŽ   — || _         || _        t          ||¦  «        }t          |¦  «        | _        d| _        d|› d�| _        d S )Núaws-sdkúhttps://bedrock-runtime.ú.amazonaws.com)rÛ  rã  rØ  râ  r{  r\   r=   )r   rÙ  rý   rq  s       r   rg   zBedrockAuxiliaryClient.__init__.  sK   € ØˆŒØˆŒÝ,¨V°UÑ;Ô;ˆÝ$ WÑ-Ô-ˆŒ	Ø ˆŒØI°6ÐIÐIÐIˆŒˆˆr   c                 ó   — d S r   r   r(   s    r   r  zBedrockAuxiliaryClient.close6  s   € Øˆr   N)r*   r+   r,   r-   rI   rg   r  r   r   r   rå  rå  +  sQ   € € € € € ØIÐIðJ˜sð J¨3ð Jð Jð Jð Jðð ð ð ð r   rå  c                   ó&   — e Zd Zdefd„Zdefd„ZdS )Ú_AsyncBedrockCompletionsAdapterr  c                 ó   — || _         d S r   r�  rƒ  s     r   rg   z(_AsyncBedrockCompletionsAdapter.__init__;  r„  r   r   c              ‹   óJ   K  — dd l } |j        | j        j        fi |¤Žƒ d {V —†S r†  r‡  rŠ  s      r   rK  z&_AsyncBedrockCompletionsAdapter.create>  r‹  r   N)r*   r+   r,   rØ  rg   r   rK  r   r   r   rì  rì  :  sR   € € € € € ð"Ð%?ð "ð "ð "ð "ðD¨ð Dð Dð Dð Dð Dð Dr   rì  c                   ó   — e Zd Zdefd„ZdS )Ú_AsyncBedrockChatShimrq  c                 ó   — || _         d S r   rs  ru  s     r   rg   z_AsyncBedrockChatShim.__init__D  rv  r   N)r*   r+   r,   rì  rg   r   r   r   rð  rð  C  s0   € € € € € ð#Ð ?ð #ð #ð #ð #ð #ð #r   rð  c                   ó   — e Zd Zdd„ZdS )ÚAsyncBedrockAuxiliaryClientr‘  rå  c                 ó”   — |j         j        }t          |¦  «        }t          |¦  «        | _         |j        | _        |j        | _        d S r   )r{  rt  rì  rð  r\   r=   r“  s       r   rg   z$AsyncBedrockAuxiliaryClient.__init__I  sA   € Ø#Ô(Ô4ˆÝ7¸ÑEÔEˆÝ)¨-Ñ8Ô8ˆŒ	Ø#Ô+ˆŒØ$Ô-ˆŒˆˆr   N)r‘  rå  rÖ  r   r   r   ró  ró  H  s(   € € € € € ð.ð .ð .ð .ð .ð .r   ró  c                 óp  — | pd                      ¦   «                              ¦   «                              d¦  «        }|sdS t          |¦  «        j                             d¦  «        }|                     d¦  «        s|                     d¦  «        rdS t          |¦  «        }|dk    rdS |dk    rd	|v rdS dS )
u¢  True if the endpoint at ``base_url`` speaks the Anthropic Messages
    protocol instead of OpenAI chat.completions.

    Mirrors ``hermes_cli.runtime_provider._detect_api_mode_for_url`` so the
    auxiliary client and the main agent stay in sync on transport selection.
    Covers:

    - Any URL ending in ``/anthropic`` (MiniMax, Zhipu GLM, LiteLLM proxies,
      Anthropic-compatible gateways).
    - ``api.kimi.com/coding`` (Kimi Coding Plan â€” the /coding route only
      speaks Claude-Code's native Anthropic shape; ``chat.completions``
      returns 404 on Anthropic-only model aliases like ``kimi-for-coding``).
    - ``api.anthropic.com`` (native Anthropic).
    rB   rÿ   Fr«  z/anthropic/v1TrÉ  r­  r®  )rò   ró   rB  r   ÚpathrC  r5   )r=   rø   rö  rÍ  s       r   Ú#_endpoint_speaks_anthropic_messagesr÷  Q  sÇ   € ð �.˜b×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1×8Ò8¸Ñ=Ô=€JØð ØˆuÝ�JÑÔÔ$×+Ò+¨CÑ0Ô0€DØ‡}‚}�\Ñ"Ô"ð  d§m¢m°OÑ&DÔ&Dð ØˆtÝ  Ñ,Ô,€HØÐ&Ò&Ð&ØˆtØ�>Ò!Ð! i°:Ð&=Ð&=ØˆtØˆ5r   Ú
client_objÚapi_modec                 óè  — t          | t          ¦  «        r| S t          | t          ¦  «        r| S t          | t          ¦  «        r| S 	 ddlm} t          | |¦  «        r| S n# t          $ r Y nw xY w	 ddlm} t          | |¦  «        r| S n# t          $ r Y nw xY w|r|dk    r| S |dk    pt          |¦  «        }|s| S 	 ddl
m} n-# t          $ r  t                               d|¦  «         | cY S w xY w	  |||¦  «        }	n5# t          $ r(}
t                               d||
¦  «         | cY d}
~
S d}
~
ww xY wt                               d	||r
|dd
…         nd|pd¦  «         t          |	|||d¬¦  «        S )aî  Rewrap a plain OpenAI client in ``AnthropicAuxiliaryClient`` when
    the endpoint actually speaks Anthropic Messages.

    This is the single chokepoint for aux-client transport correction.
    Runs at the end of every ``resolve_provider_client`` branch so that
    api_key providers (Kimi Coding Plan), the ``custom`` endpoint, and
    future /anthropic gateways all land on the right wire format
    regardless of which branch built the client.

    Returns ``client_obj`` unchanged when:

    - It's already an Anthropic/Codex/Gemini/CopilotACP wrapper.
    - The endpoint is an OpenAI-wire endpoint.
    - ``api_mode`` is explicitly set to a non-Anthropic transport.
    - The ``anthropic`` SDK is not installed (falls back to OpenAI wire).
    r   )ÚGeminiNativeClient©ÚCopilotACPClientr±  ©Úbuild_anthropic_clientu   Endpoint %s speaks Anthropic Messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire (will likely 404).uT   Failed to build Anthropic client for %s (%s) â€” falling back to OpenAI-wire client.NzeAuxiliary transport: wrapping client in AnthropicAuxiliaryClient (model=%s, base_url=%s, api_mode=%s)rÒ  rB   úauto-detectedF©r—  )r¹   rÈ  rå  rx  Úagent.gemini_native_adapterrû  rU   Úagent.copilot_acp_clientrý  r÷  rœ  rÿ  rX   rY   rK   rx   )rø  rý   r\   r=   rù  rû  rý  Úshould_wraprÿ  rà  r¥   s              r   Ú_maybe_wrap_anthropicr  n  ss  € õ0 ˜
Õ$<Ñ=Ô=ð ØÐÝ˜
Õ$:Ñ;Ô;ð ØÐå˜
Õ$8Ñ9Ô9ð ØÐðØBÐBÐBÐBÐBÐBÝ˜JÐ(:Ñ;Ô;ð 	ØÐð	øåð ð ð ØˆðøøøðØ=Ð=Ð=Ð=Ð=Ð=Ý˜JÐ(8Ñ9Ô9ð 	ØÐð	øåð ð ð Øˆðøøøð ð �HÐ 4Ò4Ð4ØÐð 	Ð(Ò(ð 	9Ý.¨xÑ8Ô8ð ð ð ØÐðØBÐBÐBÐBÐBÐBÐBøÝð ð ð Ý�ŠðOàñ	
ô 	
ð 	
ð
 ÐÐÐðøøøðØ,Ð,¨W°hÑ?Ô?ˆˆøÝð ð ð Ý�Šð"Ø#+¨Sñ	
ô 	
ð 	
ð ÐÐÐÐÐÐøøøøðøøøõ ‡L‚Lð	/à Ð0ˆx˜˜˜Œ}ˆ}¨b°(Ð2M¸oñô ð õ
 $Ø�U˜G X¸ðñ ô ð sT   ÁA  Á 
A-Á,A-Á1B
 Â

BÂBÂ>C Ã'C/Ã.C/Ã3D  Ä 
D2Ä
D-Ä'D2Ä-D2c                  ó   — t          d¦  «        \  } }| rŒ|€dS t          |dd¦  «        t          |dd¦  «        t          |dd¦  «        t          |t          ¦  «        t          |dd¦  «        t          |dd¦  «        t          |d	d¦  «        t          |d
d¦  «        ddœ	S 	 t                               ¦   «         sdS t          j        t                               d¬¦  «        ¦  «        }| 	                    d¦  «        dk    rdS | 	                    di ¦  «         	                    di ¦  «        }| 	                    d¦  «        s| 	                    d¦  «        sdS |S # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)zŸRead and validate ~/.hermes/auth.json for an active Nous provider.

    Returns the provider state dict if Nous is active with tokens,
    otherwise None.
    rÃ  Nr˜  rB   Úrefresh_tokenÚ	agent_keyÚportal_base_urlÚ	client_idÚscopeÚ
token_typeÚBearerrµ  )	r˜  r  r  rÆ  r	  r
  r  r  Úsourcez	utf-8-sig)ÚencodingÚactive_providerrA  zCould not read Nous auth: %s)r¶  ro   rÈ  Ú_NOUS_DEFAULT_BASE_URLÚ_AUTH_JSON_PATHÚis_filer¢  r£  Ú	read_textrJ   rK   rX   rx   )Úpool_presentr½  Údatarè   r¥   s        r   Ú_read_nous_authr  Â  s¢  € õ -¨VÑ4Ô4Ñ€L�%Øð 
Øˆ=Ø�4å# E¨>¸2Ñ>Ô>Ý$ U¨O¸TÑBÔBÝ  ¨°TÑ:Ô:Ý"8¸Õ@VÑ"WÔ"WÝ& uÐ.?ÀÑFÔFÝ  ¨°TÑ:Ô:Ý˜U G¨TÑ2Ô2Ý! %¨°xÑ@Ô@Øð

ð 

ð 
	
ðÝ×&Ò&Ñ(Ô(ð 	Ø�4ÝŒz�/×3Ò3¸[Ð3ÑIÔIÑJÔJˆØ�8Š8Ð%Ñ&Ô&¨&Ò0Ð0Ø�4Ø—8’8˜K¨Ñ,Ô,×0Ò0°¸Ñ<Ô<ˆà�|Š|˜KÑ(Ô(ð 	°·²¸nÑ1MÔ1Mð 	Ø�4ØˆøÝð ð ð Ý�ŠÐ3°SÑ9Ô9Ð9Øˆtˆtˆtˆtˆtøøøøðøøøs,   Â"E Â=AE ÄAE ÅE Å
FÅ'FÆFc                 ó  — ddl m} dD ]|\  }}|                      |¦  «        }t          |t          ¦  «        r|                     ¦   «         sŒD |||                      d¦  «        |                      |¦  «        ¬¦  «        r|c S Œ}dS )z;Extract a usable Nous inference JWT from stored auth state.r   )Ú_nous_invoke_jwt_is_usable))r  Úagent_key_expires_at)r˜  Ú
expires_atr  )r  r  rB   )r?  r  rJ   r$   rI   rò   )rè   r  Ú	token_keyÚ
expiry_keyÚtokens        r   Ú_nous_api_keyr  è  s³   € à:Ð:Ð:Ð:Ð:Ð:ð"ð ð Ñˆ	�:ð —’˜YÑ'Ô'ˆÝ˜%¥Ñ%Ô%ð 	¨U¯[ª[©]¬]ð 	ØØ%Ð%ØØ—,’,˜wÑ'Ô'Ø—|’| JÑ/Ô/ð
ñ 
ô 
ð 	ð
 ˆLˆLˆLð	ð ˆ2r   c                  ó6   — t          j        dt          ¦  «        S )z8Resolve the Nous inference base URL from env or default.ÚNOUS_INFERENCE_BASE_URL)r�  rÖ  r  r   r   r   Ú_nous_base_urlr"  ü  s   € åŒ9Ð.Õ0FÑGÔGÐGr   ©Úforce_refreshr$  c           	      óœ  — 	 ddl m} t          d¦  «        }n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w|r|                     ¦   «         sdS 	 |                     ¦   «         }n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w|€dS t          |dd¦  «        t          |dd¦  «        t          |d	d¦  «        d
œ}| s ||t          ¦   «         ¦  «        sP	 | 
                    ¦   «         }n4# t          $ r'}t                               d|¦  «         d}Y d}~nd}~ww xY w|€dS |}t          |dd¦  «        t          |dd¦  «        t          |dd¦  «        t          |dd¦  «        t          |d	d¦  «        dœ}t          |¦  «        }t          |t          ¦  «        }	|r|	sdS ||	fS )z@Resolve Nous auxiliary credentials from the selected pool entry.r   )Ú_agent_key_is_usablerÃ  z4Auxiliary Nous pool credential resolution failed: %sNz(Auxiliary Nous pool selection failed: %sr  r  r  )r  r  r  z&Auxiliary Nous pool refresh failed: %sr˜  r  )r  r  r˜  r  r  )r?  r&  r/   rK   rX   rx   r³  r´  ro   rØ  Útry_refresh_currentr  rÈ  r  )
r$  r&  rµ  r¥   r½  ÚstateÚ	refreshedrè   r\   r=   s
             r   Ú_resolve_nous_pool_runtime_apir*  	  sS  € ðØ8Ð8Ð8Ð8Ð8Ð8å˜Ñ Ô ˆˆøÝð ð ð Ý�ŠÐKÈSÑQÔQÐQØˆtˆtˆtˆtˆtøøøøðøøøð ð �t×+Ò+Ñ-Ô-ð ØˆtðØ—’‘”ˆˆøÝð ð ð Ý�ŠÐ?ÀÑEÔEÐEØˆtˆtˆtˆtˆtøøøøðøøøð €}Øˆtõ ˜U K°Ñ6Ô6Ý '¨Ð/EÀtÑ LÔ LÝ˜ ¨Ñ.Ô.ðð €Eð
 ð Ð0Ð0°Õ8QÑ8SÔ8SÑTÔTð ð	Ø×0Ò0Ñ2Ô2ˆIˆIøÝð 	ð 	ð 	Ý�LŠLÐAÀ3ÑGÔGÐGØˆIˆIˆIˆIˆIˆIøøøøð	øøøð ÐØ�4Øˆõ ˜U K°Ñ6Ô6Ý '¨Ð/EÀtÑ LÔ LÝ  ~°tÑ<Ô<Ý˜e \°4Ñ8Ô8Ý˜ ¨Ñ.Ô.ðð €Hõ ˜HÑ%Ô%€GÝ% eÕ-CÑDÔD€HØð ˜(ð ØˆtØ�HÐÐsD   ‚ ˜
A¢AÁAÁ$A9 Á9
B)ÂB$Â$B)Ã>D Ä
EÄD?Ä?Ec                 óè  — t          | ¬¦  «        }|�|S 	 ddlm}  |t          dd¦  «        | ¬¦  «        }n3# t          $ r&}t
                               d|¦  «         Y d}~dS d}~ww xY wt          |                     d	¦  «        pd
¦  «         	                    ¦   «         }t          |                     d¦  «        pd
¦  «         	                    ¦   «          
                    d¦  «        }|r|sdS ||fS )a9  Return fresh Nous runtime credentials when available.

    This mirrors the main agent's 401 recovery path and keeps auxiliary
    clients aligned with the singleton auth store + JWT refresh flow instead of
    relying only on whatever raw tokens happen to be sitting in auth.json
    or the credential pool.
    r#  Nr   ©Ú resolve_nous_runtime_credentialsÚHERMES_NOUS_TIMEOUT_SECONDSé   ©Útimeout_secondsr$  z7Auxiliary Nous runtime credential resolution failed: %sr\   rB   r=   rÿ   )r*  r?  r-  r6   rK   rX   rx   rI   rJ   rò   rB  )r$  Úpooledr-  rF  r¥   r\   r=   s          r   Ú_resolve_nous_runtime_apir3  4	  s'  € õ ,¸-ÐHÑHÔH€FØÐØˆð	ØDÐDÐDÐDÐDÐDà0Ð0Ý%Ð&CÀRÑHÔHØ'ð
ñ 
ô 
ˆˆøõ ð ð ð Ý�ŠÐNÐPSÑTÔTÐTØˆtˆtˆtˆtˆtøøøøðøøøõ �%—)’)˜IÑ&Ô&Ð,¨"Ñ-Ô-×3Ò3Ñ5Ô5€GÝ�5—9’9˜ZÑ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7×>Ò>¸sÑCÔC€HØð ˜(ð ØˆtØ�HÐÐs   –!8 ¸
A(ÁA#Á#A(c            	      ó:  — 	 ddl m} m} t          d¦  «        }|�r€|                     ¦   «         �rk|                     ¦   «         }|��Tt          t          |dd¦  «        pt          |dd¦  «        pd¦  «                             ¦   «         } |t          j
        dd¦  «                             ¦   «                              d	¦  «        pÃt          j
        d
d¦  «                             ¦   «                              d	¦  «        p‰t          t          |dd¦  «        pd¦  «                             ¦   «                              d	¦  «        pDt          t          |dd¦  «        pd¦  «                             ¦   «                              d	¦  «        | ¬¦  «        }|r|r||fS n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w	 ddl m}  |¦   «         }n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY wt          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «                              d	¦  «        }|r|sdS ||fS )aW  Resolve a fresh xAI OAuth (api_key, base_url) for auxiliary clients.

    Prefer the credential pool, matching the main runtime/provider status
    path.  Some xAI OAuth logins live only as pool entries; falling straight
    to the singleton auth-store resolver would make auxiliary tasks such as
    compression report "no provider configured" even though ``hermes auth
    status`` shows xAI OAuth as logged in.

    Falls back to ``hermes_cli.auth``'s singleton runtime resolver for older
    auth-store-only logins. Returns ``None`` if the user is not authenticated
    with xAI Grok OAuth.
    r   )ÚDEFAULT_XAI_OAUTH_BASE_URLÚ _xai_validate_inference_base_urlú	xai-oauthNr¿  r˜  rB   ÚHERMES_XAI_BASE_URLrÿ   ÚXAI_BASE_URLrÅ  r=   )rÁ  z9Auxiliary xAI OAuth pool credential resolution failed: %s©Ú%resolve_xai_oauth_runtime_credentialsz<Auxiliary xAI OAuth runtime credential resolution failed: %sr\   )r?  r5  r6  r/   r³  r´  rI   ro   rò   r�  rÖ  rB  rK   rX   rx   r;  rJ   )	r5  r6  rµ  r½  r\   r=   r¥   r;  rF  s	            r   Ú_resolve_xai_oauth_for_auxr<  R	  sù  € ðWð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ
 ˜Ñ%Ô%ˆØñ 	-�D×(Ò(Ñ*Ô*ñ 	-Ø—K’K‘M”MˆEØÑ ÝÝ˜EÐ#4°dÑ;Ô;ð Ý˜u n°bÑ9Ô9ðàñô ÷ ’%‘'”'ð	 ð
 <Ð;Ý”IÐ3°RÑ8Ô8×>Ò>Ñ@Ô@×GÒGÈÑLÔLð WÝ”y °Ñ4Ô4×:Ò:Ñ<Ô<×CÒCÀCÑHÔHðWå�7 5Ð*<¸dÑCÔCÐIÀrÑJÔJ×PÒPÑRÔR×YÒYÐZ]Ñ^Ô^ðWõ �7 5¨*°dÑ;Ô;ÐA¸rÑBÔB×HÒHÑJÔJ×QÒQÐRUÑVÔVØ7ðñ ô �ð ð -˜xð -Ø" HÐ,Ð,øøÝð Wð Wð WÝ�ŠÐPÐRUÑVÔVÐVÐVÐVÐVÐVÐVøøøøðWøøøðØIÐIÐIÐIÐIÐIà5Ð5Ñ7Ô7ˆˆøÝð ð ð Ý�ŠÐSÐUXÑYÔYÐYØˆtˆtˆtˆtˆtøøøøðøøøõ �%—)’)˜IÑ&Ô&Ð,¨"Ñ-Ô-×3Ò3Ñ5Ô5€GÝ�5—9’9˜ZÑ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7×>Ò>¸sÑCÔC€HØð ˜(ð ØˆtØ�HÐÐs0   ‚FF Æ
GÆ'GÇGÇG! Ç!
HÇ+HÈHc                  ó&  — t          d¦  «        \  } }| rt          |¦  «        }|r|S 	 ddlm}  |¦   «         }|                     di ¦  «        }|                     d¦  «        }t          |t          ¦  «        r|                     ¦   «         sdS 	 ddl}| 	                    d¦  «        d         }|d	t          |¦  «         d
z  z  z  }t          j        |                     |¦  «        ¦  «        }	|	                     dd¦  «        }
|
r4t          j        ¦   «         |
k    rt                               d|
¦  «         dS n# t"          $ r Y nw xY w|                     ¦   «         S # t"          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)a›  Read a valid, non-expired Codex OAuth access token from Hermes auth store.

    If a credential pool exists but currently has no selectable runtime entry
    (for example all pool slots are marked exhausted), fall back to the
    profile's auth.json token instead of hard-failing. This keeps explicit
    fallback-to-Codex working when the pool state is stale but the stored OAuth
    token is still valid.
    rð   r   )Ú_read_codex_tokensÚtokensr˜  Nrœ  rí   r�  rž  Úexpz-Codex access token expired (exp=%s), skippingz2Could not read Codex auth for auxiliary client: %s)r¶  rÀ  r?  r>  rJ   r$   rI   rò   r   rõ   r¡  r¢  r£  r¤  r  rX   rx   rK   )r  r½  r  r>  r  r?  r˜  r   Úpayloadr§  r@  r¥   s               r   Ú_read_codex_access_tokenrB  ‰	  sÅ  € õ -¨^Ñ<Ô<Ñ€L�%Øð Ý% eÑ,Ô,ˆØð 	ØˆLðØ6Ð6Ð6Ð6Ð6Ð6Ø!Ð!Ñ#Ô#ˆØ—’˜( BÑ'Ô'ˆØ—z’z .Ñ1Ô1ˆÝ˜,­Ñ,Ô,ð 	°L×4FÒ4FÑ4HÔ4Hð 	Ø�4ð
	ØˆMˆMˆMØ"×(Ò(¨Ñ-Ô-¨aÔ0ˆGØ�s�s 7™|œ|˜m¨aÑ/Ñ0Ñ0ˆGÝ”Z × 8Ò 8¸Ñ AÔ AÑBÔBˆFØ—*’*˜U AÑ&Ô&ˆCØð •t”y‘{”{ SÒ(Ð(Ý—’ÐLÈcÑRÔRÐRØ�tøøÝð 	ð 	ð 	ØˆDð	øøøð ×!Ò!Ñ#Ô#Ð#øÝð ð ð Ý�ŠÐIÈ3ÑOÔOÐOØˆtˆtˆtˆtˆtøøøøðøøøs=   ©A$E  ÂB)D< Ä;E  Ä<
E	ÅE  ÅE	Å	E  Å 
FÅ*FÆFc                  ó¼  — 	 ddl m} m} n+# t          $ r t                               d¦  «         Y dS w xY w|                      ¦   «         D �]\  }}|j        dk    rŒt          |¦  «        rt                               d|¦  «         Œ=|dk    r4	 ddl m	}  |d¦  «        sŒVn# t          $ r Y nw xY wt          ¦   «         c S t          |¦  «        \  }}|�r�t          |¦  «        }|sŒžt          ||j        ¦  «        p|j        }t          |¦  «        }	t!          |¦  «        pd	}
|
€ŒÝt                               d
|j        |
¦  «         |dk    r$ddlm}m}  ||	¦  «        r |||	¬¦  «        |
fc S i }t+          |	d¦  «        rddi|d<   nŠt+          |	d¦  «        rddlm}  |¦   «         |d<   nft+          |	d¦  «        rt1          |	¦  «        |d<   nC	 ddlm}  ||¦  «        }|r|j        rt9          |j        ¦  «        |d<   n# t:          $ r Y nw xY wt=          |                     d¦  «        ¦  «        }|r||d<   tA          d||	dœ|¤Ž}tC          ||
||¦  «        }||
fc S  ||¦  «        }tE          |                     dd¦  «        ¦  «         #                    ¦   «         }|s�Œ`tE          |                     dd¦  «        ¦  «         #                    ¦   «          $                    d¦  «        p|j        }t          |¦  «        }	t!          |¦  «        pd	}
|
€�ŒÓt                               d|j        |
¦  «         |dk    r$ddlm}m}  ||	¦  «        r |||	¬¦  «        |
fc S i }t+          |	d¦  «        rddi|d<   nŠt+          |	d¦  «        rddlm}  |¦   «         |d<   nft+          |	d¦  «        rt1          |	¦  «        |d<   nC	 ddlm}  ||¦  «        }|r|j        rt9          |j        ¦  «        |d<   n# t:          $ r Y nw xY wt=          |                     d¦  «        ¦  «        }|r||d<   tA          d||	dœ|¤Ž}tC          ||
||¦  «        }||
fc S dS )z»Try each API-key provider in PROVIDER_REGISTRY order.

    Returns (client, model) for the first provider with usable runtime
    credentials, or (None, None) if none are configured.
    r   )ÚPROVIDER_REGISTRYr/  z7Could not import PROVIDER_REGISTRY for API-key fallback©NNr\   z2Auxiliary api-key chain: %s is unhealthy, skippingrà   )Ú!is_provider_explicitly_configuredNz'Auxiliary text client: %s (%s) via poolrË   ©rû  Úis_native_gemini_base_urlr_   r­  r‘  úclaude-code/0.1.0rm  rë  )Úcopilot_default_headersr�  r1  rB   r=   rÿ   zAuxiliary text client: %s (%s)r   )%r?  rD  r/  rU   rX   rx   rÅ   Ú	auth_typeÚ_is_provider_unhealthyrF  Ú_try_anthropicr¶  rÀ  rÈ  rÆ  r°  rT  r«   r  rû  rH  r4   r@  rJ  r�  rA  r2  rm  ro  rK   rw  rJ   ra   r  rI   rò   rB  )rD  r/  r-  ÚpconfigrF  r  r½  r\   Úraw_base_urlr=   rý   rû  rH  ÚextrarJ  Ú_gpf_auxÚ_ph_auxÚ_merged_auxrâ  rF  Ú	_gpf_aux2Ú_ph_aux2Ú_merged_aux2s                          r   Ú_resolve_api_key_providerrW  ´	  sý  € ðØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[øÝð ð ð Ý�ŠÐNÑOÔOÐOØˆzˆzðøøøð !2× 7Ò 7Ñ 9Ô 9ð añ aÑˆ�WØÔ 	Ò)Ð)ØÝ! +Ñ.Ô.ð 	Ý�LŠLÐMÈ{Ñ[Ô[Ð[ØØ˜+Ò%Ð%ðØMÐMÐMÐMÐMÐMØ8Ð8¸ÑEÔEð Øðøåð ð ð Ø�ðøøøå!Ñ#Ô#Ð#Ð#Ð#å0°Ñ=Ô=Ñˆ�eØñ &	"Ý+¨EÑ2Ô2ˆGØð Øå1°%¸Ô9SÑTÔTÐrÐX_ÔXrˆLÝ*¨<Ñ8Ô8ˆHÝ/°Ñ<Ô<ÐDÀˆEØˆ}ØÝ�LŠLÐBÀGÄLÐRWÑXÔXÐXØ˜hÒ&Ð&ØeÐeÐeÐeÐeÐeÐeÐeà,Ð,¨XÑ6Ô6ð YØ-Ð-°gÈÐQÑQÔQÐSXÐXÐXÐXÐXØˆEÝ$ X¨~Ñ>Ô>ð Ø,8Ð:MÐ+N�Ð'Ñ(Ð(Ý& xÐ1DÑEÔEð ØEÐEÐEÐEÐEÐEà+BÐ+BÑ+DÔ+D�Ð'Ñ(Ð(Ý& xÐ1KÑLÔLð 	Ý+CÀHÑ+MÔ+M�Ð'Ñ(Ð(ðØJÐJÐJÐJÐJÐJØ&˜h {Ñ3Ô3�GØð Q 7Ô#:ð QÝ37¸Ô8OÑ3PÔ3P˜Ð/Ñ0øøÝ ð ð ð Ø�Dðøøøå5°e·i²iÐ@QÑ6RÔ6RÑSÔSˆKØð 7Ø+6�Ð'Ñ(Ý+ÐX°GÀhÐXÐXÐRWÐXÐXˆGÝ+¨G°U¸GÀ\ÑRÔRˆGØ˜E�>Ð!Ð!Ð!à4Ð4°[ÑAÔAˆÝ�e—i’i 	¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7ˆØð 	Ùå˜5Ÿ9š9 Z°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=×DÒDÀSÑIÔIÐgÈWÔMgˆÝ& |Ñ4Ô4ˆÝ+¨KÑ8Ô8Ð@¸DˆØˆ=ÙÝ�ŠÐ5°w´|ÀUÑKÔKÐKØ˜(Ò"Ð"ØaÐaÐaÐaÐaÐaÐaÐaà(Ð(¨Ñ2Ô2ð UØ)Ð)°'ÀHÐMÑMÔMÈuÐTÐTÐTÐTØˆÝ  ¨>Ñ:Ô:ð 	Ø(4Ð6IÐ'JˆEÐ#Ñ$Ð$Ý" 8Ð-@ÑAÔAð 	ØAÐAÐAÐAÐAÐAà'>Ð'>Ñ'@Ô'@ˆEÐ#Ñ$Ð$Ý" 8Ð-GÑHÔHð 		Ý'?ÀÑ'IÔ'IˆEÐ#Ñ$Ð$ðØGÐGÐGÐGÐGÐGØ$˜9 [Ñ1Ô1�Øð N Ô 8ð NÝ/3°HÔ4LÑ/MÔ/M�EÐ+Ñ,øøÝð ð ð Ø�ðøøøå2°5·9²9Ð=NÑ3OÔ3OÑPÔPˆØð 	4Ø'3ˆEÐ#Ñ$Ý'ÐT°À(ÐTÐTÈeÐTÐTˆÝ'¨°¸ÀÑNÔNˆØ˜ˆ~ÐÐÐàˆ:sB   ‚ ‹$3²3ÂB!Â!
B.Â-B.Ç1HÈ
HÈHÏ
1O<Ï<
P	ÐP	Ú_paid_lane_warnedc                 óˆ   — t          | ¦  «        o3t          | ¦  «                             ¦   «                              d¦  «        S )zATrue when ``model`` is an OpenRouter free SKU (``:free`` suffix).r  )rn   rI   rò   rC  ©rý   s    r   Ú_is_free_modelr[  ,
  s3   € å�‰;Œ;Ð?�3˜u™:œ:×+Ò+Ñ-Ô-×6Ò6°wÑ?Ô?Ð?r   c                  ó<  — 	 ddl m} m}  |¦   «         }t           | |ddd¬¦  «        ¦  «        } | |dd¦  «        }t	          |t
          ¦  «        r(|                     ¦   «         r|                     ¦   «         nt          }||fS # t          $ r dt          fcY S w xY w)u©   Read free_only and openrouter_model from config in one pass.

    Returns (free_only, model) â€” defaults (False, _OPENROUTER_MODEL) on any
    config-read failure.
    r   )rk  rA   Ú	auxiliaryÚ	free_onlyF©r$  Úopenrouter_model)	rH   rk  rA   rn   r$   rI   rò   Ú_OPENROUTER_MODELrK   )rk  rA   Úcfgr^  r'  rý   s         r   Ú_aux_openrouter_settingsrc  1
  sÇ   € ð	(ØCÐCÐCÐCÐCÐCÐCÐCà"Ð"Ñ$Ô$ˆÝ˜˜  k°;ÈÐNÑNÔNÑOÔOˆ	Øˆg�c˜;Ð(:Ñ;Ô;ˆÝ)¨#­sÑ3Ô3ÐZ¸¿	º	¹¼ÐZ�—	’	‘”�ÕIZˆØ˜%ÐÐøÝð (ð (ð (ØÕ'Ð'Ð'Ð'Ð'ð(øøøs   ‚BB ÂBÂBc                 ó†   — | t           v rdS t                                | ¦  «         t                               d| ¦  «         dS )zELog a WARNING the first time a non-:free OpenRouter model is engaged.Nu  Auxiliary client: PAID lane engaged for auxiliary task â€” OpenRouter fallback model %r is not a :free SKU and may incur real spend. Set auxiliary.free_only: true to restrict auxiliary fallbacks to free models, or auxiliary.openrouter_model to a :free model.)rX  ÚaddrX   rY   rZ  s    r   Ú_warn_paid_lane_oncerf  C
  sR   € àÕ!Ð!Ð!ØˆÝ×Ò˜%Ñ Ô Ð Ý
‡N‚Nð	Bð 	ñô ð ð ð r   Úexplicit_api_keyc                 óÞ  — t          ¦   «         \  }}|p|}|r=t          |¦  «        s.t                               d|¦  «         t	          dd¬¦  «         dS t          |¦  «        st          |¦  «         t          d¦  «        \  }}|rƒ| pt          |¦  «        }|rVt          |t          ¦  «        pt          }t           
                    d¦  «         t          ||t          ¦   «         ¬¦  «        |fS t           
                    d¦  «         | pt          d	¦  «        }|st	          dd¬¦  «         dS t           
                    d
¦  «         t          |t          t          ¦   «         ¬¦  «        |fS )Nu  Auxiliary client: auxiliary.free_only is enabled but the OpenRouter fallback model %r is not a :free SKU â€” skipping the OpenRouter fallback. Set auxiliary.openrouter_model to a :free model (e.g. nvidia/nemotron-3-ultra-550b-a55b:free) or disable auxiliary.free_only.r{  rÒ  ©r‰  rE  z%Auxiliary client: OpenRouter via pool©r\   r=   rm  zFAuxiliary client: OpenRouter pool exhausted, trying OPENROUTER_API_KEYÚOPENROUTER_API_KEYzAuxiliary client: OpenRouter)rc  r[  rX   rY   Ú_mark_provider_unhealthyrf  r¶  rÀ  rÈ  r3   rx   ra   rŠ  rÝ  )	rg  rý   r^  Ú	cfg_modelÚor_modelr  r½  Úor_keyr=   s	            r   Ú_try_openrouterrp  Q
  s£  € Ý3Ñ5Ô5Ñ€IˆyØÐ!˜	€HØð 
�¨Ñ1Ô1ð 
Ý�Šð#ð
 ñ	
ô 	
ð 	
õ 	! °2Ð6Ñ6Ô6Ð6ØˆzÝ˜(Ñ#Ô#ð 'Ý˜XÑ&Ô&Ð&å,¨\Ñ:Ô:Ñ€L�%Øð 	_Ø!ÐAÕ%:¸5Ñ%AÔ%AˆØð 	IÝ-¨eÕ5HÑIÔIÐ`ÕM`ˆHÝ�LŠLÐ@ÑAÔAÐAÝ(°À(Ý+;Ñ+=Ô+=ð?ñ ?ô ?Ø@HðIð Iõ 	�ŠÐ]Ñ^Ô^Ð^àÐF¥Ð1EÑ!FÔ!F€FØð Ý  °2Ð6Ñ6Ô6Ð6ØˆzÝ
‡L‚LÐ/Ñ0Ô0Ð0Ý ¨Õ:MÝ#3Ñ#5Ô#5ð7ñ 7ô 7Ø8@ðAð Ar   c                  óz   — t          d¦  «        \  } }| r|€dS t          |¦  «        sdS t          d¦  «        sdS dS )z>Return a more precise OpenRouter auth failure reason for logs.r{  NzOOpenRouter credential pool has no usable entries (credentials may be exhausted)z=OpenRouter credential pool entry is missing a runtime API keyrk  zOPENROUTER_API_KEY not setz&no usable OpenRouter credentials found)r¶  rÀ  rÝ  )r  r½  s     r   Ú _describe_openrouter_unavailablerr  w
  s\   € å,¨\Ñ:Ô:Ñ€L�%Øð SØˆ=ØdÐdÝ$ UÑ+Ô+ð 	SØRÐRÝÐ/Ñ0Ô0ð ,Ø+Ð+Ø3Ð3r   Úvisionc                 ó4  — 	 ddl m}  |¦   «         }|�4|dk    r.t                               d|¦  «         t	          d|¬¦  «         dS n# t
          $ r Y nw xY wt          ¦   «         }t          d¬¦  «        }|€/|s-t                               d	¦  «         t	          dd
¬¦  «         dS |€|rt                               d¦  «         da	t                               d¦  «         t          }	 ddlm}  || ¬¦  «        }|r#|}t                               d| rdnd|¦  «         n t                               d| rdnd|¦  «         n8# t
          $ r+}t                               d| rdnd||¦  «         Y d }~nd }~ww xY w|�|\  }	}
n…t          |pi ¦  «        }	|	s-t                               d¦  «         t	          dd
¬¦  «         dS t          |pi                      d¦  «        pt!          ¦   «         ¦  «                             d¦  «        }
t%          |	|
¬¦  «        |fS )Nr   )Únous_rate_limit_remainingz?Auxiliary: skipping Nous Portal (rate-limited, resets in %.0fs)rÃ  ri  rE  Fr#  zSAuxiliary Nous client unavailable: no Nous authentication found (run: hermes auth).rÒ  zLAuxiliary Nous: runtime JWT refresh failed; checking stored auth.json token.TzAuxiliary client: Nous Portal©Úget_nous_recommended_aux_model©rs  z/Auxiliary/%s: using Portal-recommended model %srs  r*  z:Auxiliary/%s: no Portal recommendation, falling back to %szGAuxiliary/%s: recommended-models lookup failed (%s); falling back to %sz]Auxiliary Nous client unavailable: no usable inference JWT found (run: hermes auth add nous).rÆ  rÿ   r_   )Úagent.nous_rate_guardru  rX   rx   rl  rK   r  r3  rY   r—  Ú_NOUS_MODELr@  rw  r  rI   rJ   r"  rB  ra   )rs  ru  Ú
_remainingrÃ  Úruntimerý   rw  Úrecommendedr¥   r\   r=   s              r   Ú	_try_nousr~  „
  sâ  € ðØCÐCÐCÐCÐCÐCØ.Ð.Ñ0Ô0ˆ
ØÐ! j°1¢n nÝ�LŠLØQØñô ð õ % V°Ð<Ñ<Ô<Ð<Ø�:øøÝð ð ð Øˆðøøøõ ÑÔ€DÝ'°eÐ<Ñ<Ô<€GØ€˜t€Ý�Šð"ñ	
ô 	
ð 	
õ 	! ¨RÐ0Ñ0Ô0Ð0ØˆzØ€˜4€Ý�Šðñ	
ô 	
ð 	
ð
 ÐÝ
‡L‚LÐ0Ñ1Ô1Ð1õ €Eð
ØDÐDÐDÐDÐDÐDØ4Ð4¸FÐCÑCÔCˆØð 
	ØˆEÝ�LŠLØAØ"Ð.��¨°ñô ð ð õ
 �LŠLØLØ"Ð.��¨°ñô ð øøõ ð 
ð 
ð 
Ý�Šð!àÐ*ˆHˆH F¨C°ñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøð ÐØ#Ñˆ��å  
¨Ñ+Ô+ˆØð 	Ý�NŠNð/ñô ð õ % V°Ð4Ñ4Ô4Ð4Ø�:Ý˜˜
 ×'Ò'Ð(<Ñ=Ô=ÐQÅÑAQÔAQÑRÔR×YÒYÐZ]Ñ^Ô^ˆåØØð	
ñ 	
ô 	
ð 	ðð s+   ‚AA	 Á	
AÁAÃ*AE Å
E7Å!E2Å2E7Ústale_modelc                 ó¼  — |pd                      ¦   «                              ¦   «         }d}	 ddlm}  || d¬¦  «        }n8# t          $ r+}t
                               d|t          ¦  «         Y d}~nd}~ww xY w|r,|                      ¦   «                              ¦   «         |k    r|S t                                ¦   «                              ¦   «         |k    rt          S dS )u·  Re-fetch the Nous Portal's recommended model after a stale-model 404.

    Long-lived processes (gateway, watchers) cache the Portal's
    ``recommended-models`` payload for 10 minutes and, in practice, can pin a
    model for the whole process lifetime. When that model is later dropped from
    the Nous â†’ OpenRouter catalog, every auxiliary call 404s with
    "model does not exist". This forces a fresh Portal fetch and returns a
    model name to retry with:

      * the Portal's current recommendation for the task, if it differs from
        the model that just failed; otherwise
      * ``_NOUS_MODEL`` (google/gemini-3-flash-preview), the known-good default,
        if it too differs from the failed model.

    Returns ``None`` when no usable alternative is available (e.g. the Portal
    still recommends the exact model that just 404'd and the default also
    matches it) â€” callers should then let the original error propagate.
    rB   Nr   rv  T)rs  r$  z<Nous recommended-model refresh failed (%s); using default %s)rò   ró   r@  rw  rK   rX   rx   rz  )rs  r  ÚstaleÚfreshrw  r¥   s         r   Ú_refresh_nous_recommended_modelrƒ  Ø
  s  € ð* Ð˜B×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/€EØ€Eð
ØDÐDÐDÐDÐDÐDà.Ð.°fÈDÐQÑQÔQˆˆøÝð 
ð 
ð 
Ý�ŠØJØ•ñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøð
 ð �—’‘”×$Ò$Ñ&Ô&¨%Ò/Ð/Øˆõ ×ÒÑÔ× Ò Ñ"Ô" eÒ+Ð+ÝÐØˆ4s   ¬A  Á 
A5Á
!A0Á0A5c                  óX  — t          d¦  «        } t          | t          ¦  «        r(|                      ¦   «         r|                      ¦   «         S 	 ddlm}  |¦   «         }|                     di ¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S t          |t          ¦  «        rS|                     dd¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S n# t          $ r Y nw xY wdS )a6  Read the user's configured main model from config.yaml.

    config.yaml model.default is the single source of truth for the active
    model. Environment variables are no longer consulted.

    Runtime override: when an AIAgent is active with a CLI/gateway-provided
    model that differs from config.yaml, ``set_runtime_main()`` records the
    override in a process-local global. This is consulted FIRST so tools
    that gate on "the active main model" (e.g. ``vision_analyze``'s native
    fast path) see the live runtime, not the persisted config default.
    rý   r   rz  r$  rB   )	rG  r$   rI   rò   rH   rA   rJ   ro  rK   )ÚoverriderA   rb  Ú	model_cfgr$  s        r   Ú_read_main_modelr‡    s)  € õ # 7Ñ+Ô+€HÝ�(�CÑ Ô ð   X§^¢^Ñ%5Ô%5ð  Ø�~Š~ÑÔÐðØ:Ð:Ð:Ð:Ð:Ð:Ø"Ð"Ñ$Ô$ˆØ—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ%Ô%ð 	%¨)¯/ª/Ñ*;Ô*;ð 	%Ø—?’?Ñ$Ô$Ð$Ý�i¥Ñ&Ô&ð 	'Ø—m’m I¨rÑ2Ô2ˆGÝ˜'¥3Ñ'Ô'ð '¨G¯MªM©O¬Oð 'Ø—}’}‘”Ð&øøÝð ð ð Øˆðøøøàˆ2s   ÁA"D Â1A'D Ä
D'Ä&D'c                  ó&  — t          d¦  «        } t          | t          ¦  «        r:|                      ¦   «         r&|                      ¦   «                              ¦   «         S 	 ddlm}  |¦   «         }|                     di ¦  «        }t          |t          ¦  «        re|                     dd¦  «        }t          |t          ¦  «        r:|                     ¦   «         r&|                     ¦   «                              ¦   «         S n# t          $ r Y nw xY wdS )u  Read the user's configured main provider from config.yaml.

    Returns the lowercase provider id (e.g. "alibaba", "openrouter") or ""
    if not configured.

    Runtime override: see ``_read_main_model`` â€” same mechanism for the
    provider half of the runtime tuple.
    rè   r   rz  rý   rB   )
rG  r$   rI   rò   ró   rH   rA   rJ   ro  rK   )r…  rA   rb  r†  rè   s        r   rö   rö     s  € õ # :Ñ.Ô.€HÝ�(�CÑ Ô ð ( X§^¢^Ñ%5Ô%5ð (Ø�~Š~ÑÔ×%Ò%Ñ'Ô'Ð'ð	Ø:Ð:Ð:Ð:Ð:Ð:Ø"Ð"Ñ$Ô$ˆØ—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ&Ô&ð 	0Ø —}’} Z°Ñ4Ô4ˆHÝ˜(¥CÑ(Ô(ð 0¨X¯^ª^Ñ-=Ô-=ð 0Ø—~’~Ñ'Ô'×-Ò-Ñ/Ô/Ð/øøÝð ð ð Øˆðøøøàˆ2s   Á BD Ä
DÄDc                  óÞ  — t          d¦  «        } t          | t          ¦  «        r(|                      ¦   «         r|                      ¦   «         S 	 ddlm}  |¦   «         }|                     di ¦  «        }t          |t          ¦  «        rS|                     dd¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S n# t          $ r Y nw xY wdS )a:  Read the user's main model API key from the runtime override or config.

    Mirrors ``_read_main_model`` / ``_read_main_provider``: checks the
    process-local ``_RUNTIME_MAIN_API_KEY`` override first (set by
    ``set_runtime_main`` when an AIAgent is active), then falls back to
    ``model.api_key`` in config.yaml.

    Used by the ``custom`` provider fallback chain so that auxiliary tasks
    configured with an explicit ``base_url`` but empty ``api_key`` inherit
    the main model's credentials instead of falling to ``no-key-required``
    (issue #9318).
    r\   r   ©rl  rý   rB   ©	rG  r$   rI   rò   rH   rl  rJ   ro  rK   )r…  rl  rb  r†  r:  s        r   Ú_read_main_api_keyrŒ  8  só   € õ # 9Ñ-Ô-€HÝ�(�CÑ Ô ð   X§^¢^Ñ%5Ô%5ð  Ø�~Š~ÑÔÐð	Ø1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆØ—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ&Ô&ð 	#Ø—-’- 	¨2Ñ.Ô.ˆCÝ˜#�sÑ#Ô#ð #¨¯	ª	©¬ð #Ø—y’y‘{”{Ð"øøÝð ð ð Øˆðøøøàˆ2ó   ÁBC Ã
C*Ã)C*c                  óÞ  — t          d¦  «        } t          | t          ¦  «        r(|                      ¦   «         r|                      ¦   «         S 	 ddlm}  |¦   «         }|                     di ¦  «        }t          |t          ¦  «        rS|                     dd¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S n# t          $ r Y nw xY wdS )zŠRead the main model's base_url from the runtime override or config.

    Same override-then-config pattern as ``_read_main_api_key``.
    r=   r   rŠ  rý   rB   r‹  )r…  rl  rb  r†  Úbases        r   Ú_read_main_base_urlr�  U  só   € õ
 # :Ñ.Ô.€HÝ�(�CÑ Ô ð   X§^¢^Ñ%5Ô%5ð  Ø�~Š~ÑÔÐð	Ø1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆØ—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ&Ô&ð 	$Ø—=’= ¨RÑ0Ô0ˆDÝ˜$¥Ñ$Ô$ð $¨¯ª©¬ð $Ø—z’z‘|”|Ð#øøÝð ð ð Øˆðøøøàˆ2r�  Úpreset_namec                 ó  — 	 ddl m} ddlm}  | |¦   «                              d¦  «        pi | pd¦  «        }|                     d¦  «        pi }t          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d	¦  «        pd¦  «                             ¦   «         }|r|r|                     ¦   «         dk    r||fS n-# t          $ r  t           
                    d
| d¬¦  «         Y nw xY wdS )uÝ  Resolve a MoA preset to its aggregator (provider, model) pair.

    "moa" is a virtual provider â€” the acting model of a preset is its
    aggregator slot, and there is no real "moa" HTTP endpoint. Auxiliary
    tasks (title generation, compression, vision, commit messages, â€¦) don't
    need the reference fan-out, so every aux resolution layer maps
    provider="moa"/model=<preset> to the aggregator's real provider+model
    through this single helper (shared by ``_resolve_auto``,
    ``_resolve_task_provider_model``, and ``resolve_provider_client`` so the
    preset lookup and validation cannot drift between paths).

    Args:
        preset_name: The MoA preset name (usually carried in the "model"
            field), or None/"" to resolve the user's default preset.

    Returns:
        (aggregator_provider, aggregator_model), or (None, None) when the
        preset cannot be resolved (missing config, renamed/deleted preset,
        or a malformed aggregator slot).
    r   rŠ  )Úresolve_moa_presetÚmoaNÚ
aggregatorrè   rB   rý   z.MoA aggregator resolution failed for preset %rTrt   rE  )rH   rl  Úhermes_cli.moa_configr“  rJ   rI   rò   ró   rK   rX   rx   )r‘  rl  r“  ÚpresetÚaggÚagg_providerÚ	agg_models          r   Ú_resolve_moa_aggregatorr›  j  sF  € ð*
Ø1Ð1Ð1Ð1Ð1Ð1Ø<Ð<Ð<Ð<Ð<Ð<à#Ð# K K¡M¤M×$5Ò$5°eÑ$<Ô$<Ð$BÀÀKÐDWÐSWÑXÔXˆØ�jŠj˜Ñ&Ô&Ð,¨"ˆÝ˜3Ÿ7š7 :Ñ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ˆÝ˜Ÿš Ñ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7ˆ	Øð 	+˜Ið 	+¨,×*<Ò*<Ñ*>Ô*>À%Ò*GÐ*GØ Ð*Ð*øøÝð 
ð 
ð 
Ý�ŠØ<¸kÐTXð 	ñ 	
ô 	
ð 	
ð 	
ð 	
ð
øøøð ˆ:s   ‚CC Ã'DÄDc                  ó¾   — t          ¦   «         } t          ¦   «         pd                     ¦   «                              ¦   «         dk    rt	          | ¦  «        \  }}|pdS | S )uD  Main model with MoA presets unwrapped to the aggregator's model.

    When the main provider is ``moa``, ``_read_main_model()`` returns a MoA
    *preset name* (e.g. "opus-gpt") â€” never a valid wire model id on any
    provider. Auxiliary fallback chains that pre-fill a missing model from
    the main model must use this reader instead, so unset aux models default
    to the preset's acting (aggregator) model. Returns "" when the main
    provider is moa but the preset cannot be resolved â€” sending nothing is
    strictly better than sending a preset name that 400s.
    rB   r”  )r‡  rö   rò   ró   r›  )rý   rY  rš  s      r   Ú_read_main_model_for_auxr�  �  s]   € õ ÑÔ€EÝÑÔÐ# ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4¸Ò=Ð=Ý.¨uÑ5Ô5‰ˆˆ9Øˆ˜BÐØ€Lr   Úaux_base_urlc                 óŽ   — t          | ¦  «        }|sdS t          t          ¦   «         ¦  «        }|r||k    rdS t          ¦   «         S )uú  Return the main api_key only when *aux_base_url* points at the same
    host as the main model's base_url.

    The #9318 use case is an auxiliary task sharing the main model's
    self-hosted gateway (same host, different model) with an empty per-task
    api_key. Inheriting unconditionally would send the main credential to
    ANY host a misconfigured aux base_url names â€” a cross-host credential
    leak. A host mismatch keeps the previous fail-safe behavior
    (``no-key-required`` â†’ 401).
    rB   )r5   r�  rŒ  )rž  Úaux_hostÚ	main_hosts      r   Ú_read_main_api_key_if_same_hostr¢  ¢  sU   € õ ! Ñ.Ô.€HØð ØˆrÝ!Õ"5Ñ"7Ô"7Ñ8Ô8€IØð ˜ IÒ-Ð-ØˆrÝÑÔÐr   Ú_RUNTIME_MAIN_PROVIDERÚ_RUNTIME_MAIN_MODELÚ_RUNTIME_MAIN_BASE_URLÚ_RUNTIME_MAIN_API_KEYÚ_RUNTIME_MAIN_API_MODEÚ_RUNTIME_MAIN_AUTH_MODEÚauxiliary_runtime_mainr_  Ú_RUNTIME_MAIN_CONTEXTÚauxiliary_relay_callÚ_RELAY_AUX_CALL_CONTEXTc                 óF   ‡ — t          j        ‰ ¦  «        ˆ fd„¦   «         }|S )zHGive every physical retry in one auxiliary call a shared Relay identity.c            
      ó”  •— | r| d         n|                      d¦  «        }t                               t          |pd¦  «        dt	          j        ¦   «         j        › �dddd ddœ¦  «        }	  ‰| i |¤Žt                               |¦  «         S # t          $ r t          ¦   «          ‚ w xY w# t                               |¦  «         w xY w©Nr   ÚtaskÚunknownzaux-rB   Úchat_completions)r°  Ú
request_idÚattempt_countrè   rý   Úresponse_modelrù  ©
rJ   r¬  r¤   rI   ÚuuidÚuuid4ÚhexÚresetr£   Ú_fail_relay_auxiliary_call©r    r!   r°  r  rž   s       €r   Úwrappedz&_relay_auxiliary_call.<locals>.wrappedË  sì   ø€ àÐ6ˆt�AŒwˆw F§J¢J¨vÑ$6Ô$6ˆÝ'×+Ò+Ý˜Ð) 	Ñ*Ô*Ø3¥¤¡¤Ô!1Ð3Ð3ØØØØ"Ø*ð-
ð -
ñ ô ˆð	1Ø�8˜TÐ, VÐ,Ð,õ
 $×)Ò)¨%Ñ0Ô0Ð0Ð0øõ	 ð 	ð 	ð 	Ý&Ñ(Ô(Ð(Øð	øøøøõ $×)Ò)¨%Ñ0Ô0Ð0Ð0øøøs   Á,B ÂB(Â(B+ Â+C©Ú	functoolsÚwraps©rž   r½  s   ` r   Ú_relay_auxiliary_callrÂ  È  ó:   ø€ õ „_�XÑÔð1ð 1ð 1ð 1ñ Ôð1ð& €Nr   c                 óF   ‡ — t          j        ‰ ¦  «        ˆ fd„¦   «         }|S )z3Async counterpart to :func:`_relay_auxiliary_call`.c            
   Ÿ   ó¦  •K  — | r| d         n|                      d¦  «        }t                               t          |pd¦  «        dt	          j        ¦   «         j        › �dddd ddœ¦  «        }	  ‰| i |¤Žƒ d {V —†	 t                               |¦  «         S # t          $ r t          ¦   «          ‚ w xY w# t                               |¦  «         w xY wr¯  r¶  r¼  s       €r   r½  z,_relay_auxiliary_call_async.<locals>.wrappedå  s  øè è € àÐ6ˆt�AŒwˆw F§J¢J¨vÑ$6Ô$6ˆÝ'×+Ò+Ý˜Ð) 	Ñ*Ô*Ø3¥¤¡¤Ô!1Ð3Ð3ØØØØ"Ø*ð-
ð -
ñ ô ˆð	1Ø!˜ 4Ð2¨6Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2õ
 $×)Ò)¨%Ñ0Ô0Ð0Ð0øõ	 ð 	ð 	ð 	Ý&Ñ(Ô(Ð(Øð	øøøøõ $×)Ò)¨%Ñ0Ô0Ð0Ð0øøøs   Á.B ÂB1Â1B4 Â4Cr¾  rÁ  s   ` r   Ú_relay_auxiliary_call_asyncrÆ  â  rÃ  r   c                 óÂ   — t                                ¦   «         }|€d S t          | pd¦  «        |d<   t          |pd¦  «        |d<   d |d<   t          |pd¦  «        |d<   d S )Nr]  rè   r±  rý   rµ  r²  rù  )r¬  rJ   rI   )rè   rý   rù  Úcontexts       r   Ú_set_relay_auxiliary_routerÉ  ü  sv   € õ
 &×)Ò)Ñ+Ô+€GØ€ØˆÝ˜hÐ5¨+Ñ6Ô6€GˆJÑÝ˜5Ð- IÑ.Ô.€GˆGÑØ $€GÐÑÝ˜hÐ<Ð*<Ñ=Ô=€GˆJÑÐÐr   ©rè   rù  c           
      óä  — t                                ¦   «         }|€d S t          |                     d¦  «        pd¦  «        }|dz   |d<   t          | p|                     d¦  «        pd¦  «        }t          |                     d¦  «        pd¦  «        }||t          |p|                     d¦  «        pd	¦  «        t          |d
         ¦  «        d|d         › �|t          |d         ¦  «        dœfS )Nr´  r   rí   rè   r]  rý   r±  rù  r²  r³  z
auxiliary:r°  )rù  Úapi_request_idÚ	call_roleÚretry_countÚauxiliary_task)r¬  rJ   r…  rI   )rè   rù  rÈ  r´  Úprovider_nameÚ
model_names         r   Ú_relay_auxiliary_metadatarÒ  
  sù   € õ
 &×)Ò)Ñ+Ô+€GØ€ØˆtÝ˜Ÿš OÑ4Ô4Ð9¸Ñ:Ô:€MØ,¨qÑ0€GˆOÑÝ˜ÐJ G§K¢K°
Ñ$;Ô$;ÐJ¸{ÑKÔK€MÝ�W—[’[ Ñ)Ô)Ð6¨YÑ7Ô7€JØ˜*Ý˜ÐQ G§K¢K°
Ñ$;Ô$;ÐQÐ?QÑRÔRÝ˜g lÔ3Ñ4Ô4Ø3 '¨&¤/Ð3Ð3Ø$Ý˜g fœoÑ.Ô.ð'ð 'ð ð r   ©rè   rù  rK  rZ   rK  c          
      óò   ‡ ‡
— |pˆ fd„Š
t          ||¬¦  «        }|€t          ‰
|¦  «        S |\  }}}ddlm}	 |	                     |ˆ
fd„|t          |                     d¦  «        p|¦  «        |d¬¦  «        S )	Nc                 ó2   •—  ‰j         j        j        di | ¤ŽS ©Nr   ©r{  rt  rK  ©ÚrequestrZ   s    €r   r¯  z(_relay_sync_completion.<locals>.<lambda>'  ó    ø€ Ð*H¨&¬+Ô*AÔ*HÐ*SÐ*SÈ7Ð*SÐ*S€ r   rÊ  r   ©Ú	relay_llmc                 ó$   •— t          ‰| ¦  «        S r   )rµ   )rÙ  rž   s    €r   r¯  z(_relay_sync_completion.<locals>.<lambda>3  s   ø€ Õ9¸(ÀGÑLÔL€ r   rý   T©r«   rÑ  ÚmetadataÚdefer_logical_completion)rÒ  rµ   ÚagentrÜ  Úexecute_currentrI   rJ   )rZ   r!   rè   rù  rK  ÚrouterÐ  Úfallback_modelrß  rÜ  rž   s   `         @r   Ú_relay_sync_completionrå    s²   øø€ ð ÐTÐSÐSÐSÐS€HÝ%¨xÀ(ÐKÑKÔK€Eð €}Ý0°¸6ÑBÔBÐBØ.3Ñ+€M�> 8ØÐÐÐÐÐà×$Ò$ØØLÐLÐLÐLØÝ�v—z’z 'Ñ*Ô*Ð<¨nÑ=Ô=ØØ!%ð %ñ ô ð r   c          
   ƒ   óü   ‡ K  — |pˆ fd„}t          ||¬¦  «        }|€ ||¦  «        ƒ d {V —†S |\  }}}	ddlm}
 |
                     |||t	          |                     d¦  «        p|¦  «        |	d¬¦  «        ƒ d {V —†S )Nc                 ó2   •—  ‰j         j        j        di | ¤ŽS rÖ  r×  rØ  s    €r   r¯  z)_relay_async_completion.<locals>.<lambda>C  rÚ  r   rÊ  r   rÛ  rý   TrÞ  )rÒ  rá  rÜ  Úexecute_current_asyncrI   rJ   )rZ   r!   rè   rù  rK  rž   rã  rÐ  rä  rß  rÜ  s   `          r   Ú_relay_async_completionré  ;  sÚ   øè è € ð ÐTÐSÐSÐSÐS€HÝ%¨xÀ(ÐKÑKÔK€EØ€}Ø�X˜fÑ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø.3Ñ+€M�> 8ØÐÐÐÐÐà×0Ò0ØØØÝ�v—z’z 'Ñ*Ô*Ð<¨nÑ=Ô=ØØ!%ð 1ñ ô ð ð ð ð ð ð ð r   c          
      óþ   ‡ — t          ||¬¦  «        }|€ ‰ j        j        j        di |¤ŽS |\  }}}ddlm} |                     |ˆ fd„|t          |                     d¦  «        p|¦  «        t          |d„ ¬¦  «        S )	NrÊ  r   rÛ  c                 ó2   •—  ‰j         j        j        di | ¤ŽS rÖ  r×  rØ  s    €r   r¯  z$_relay_sync_stream.<locals>.<lambda>c  s    ø€ Ð6˜œÔ/Ô6ÐAÐA¸ÐAÐA€ r   rý   c                 ó"   — t          | d¦  «        S )Nr?  )rL  )rv  s    r   r¯  z$_relay_sync_stream.<locals>.<lambda>h  s   € µ7¸5À)Ñ3LÔ3L€ r   )r«   rÑ  Ú	finalizerrß  Úcompleted_response_predicater   )
rÒ  r{  rt  rK  rá  rÜ  Ústream_currentrI   rJ   ro  )	rZ   r!   rè   rù  rã  rÐ  rä  rß  rÜ  s	   `        r   Ú_relay_sync_streamrð  T  s¯   ø€ õ &¨xÀ(ÐKÑKÔK€EØ€}Ø-ˆvŒ{Ô&Ô-Ð7Ð7°Ð7Ð7Ð7Ø.3Ñ+€M�> 8ØÐÐÐÐÐà×#Ò#ØØAÐAÐAÐAØÝ�v—z’z 'Ñ*Ô*Ð<¨nÑ=Ô=ÝØØ%LÐ%Lð $ñ ô ð r   ©rB   rB   rB   rB   rB   rB   .Ú_RUNTIME_MAIN_COMPAT_SNAPSHOTc                  óü   — t          j        ¦   «         t          j        ¦   «         urdS t          t          t
          t          t          t          f} | t          k    rdS t          t          t          | ¦  «        ¦  «        S )a{  Expose deliberately patched legacy globals in a single main context.

    ``set_runtime_main`` mirrors values into the old module attributes for
    introspection, but those mirrors must never become runtime inputs. A direct
    patch is recognized only when it differs from the mirrored snapshot and
    only on the main thread, keeping concurrent session workers isolated.
    N)rŒ   Úcurrent_threadÚmain_threadr£  r¤  r¥  r¦  r§  r¨  rò  ro  ÚzipÚ_MAIN_RUNTIME_FIELDS)Úvaluess    r   Ú_compat_runtime_mainrù  n  sk   € õ ÔÑ!Ô!­Ô)>Ñ)@Ô)@Ð@Ð@ØˆtåÝÝÝÝÝð€Fð Õ.Ò.Ð.ØˆtÝ•Õ(¨&Ñ1Ô1Ñ2Ô2Ð2r   Úfieldc                 ó´   — t                                ¦   «         }|€t          ¦   «         }t          |t          ¦  «        r|                     | ¦  «        }|r|S dS )zERead one runtime field through context-local/controlled legacy state.NrB   )rª  rJ   rù  r$   ro  )rú  r|  rv  s      r   rG  rG  …  sX   € å#×'Ò'Ñ)Ô)€GØ€Ý&Ñ(Ô(ˆÝ�'�4Ñ Ô ð Ø—’˜EÑ"Ô"ˆØð 	ØˆLØˆ2r   )Úrequested_providerr=   r\   rù  Ú	auth_moder  rü  rý  r  c          	      óü  ‡	— | pd                      ¦   «                              ¦   «         |pd                      ¦   «                              ¦   «         |pd                      ¦   «         |pd                      ¦   «         t          |t          ¦  «        r|                      ¦   «         nt	          |¦  «        r|nd|pd                      ¦   «         |pd                      ¦   «                              ¦   «         |pd                      ¦   «         dœŠ	t
                               ‰	¦  «        }t          5  ˆ	fd„t          D ¦   «         \  a	a
aaaat          ˆ	fd„t          D ¦   «         ¦  «        addd¦  «         n# 1 swxY w Y   |S )zãRecord the current context's live main runtime for auxiliary routing.

    Context-local state prevents concurrent gateway sessions from overwriting
    one another while retaining compatibility mirrors for legacy readers.
    rB   )rè   rü  rý   r=   r\   rù  rý  r  c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   ©rÀ   rú  r|  s     €r   r9  z#set_runtime_main.<locals>.<genexpr>½  s'   øè è € Ð>Ð> ˆW�UŒ^Ð>Ð>Ð>Ð>Ð>Ð>r   c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   r   s     €r   r9  z#set_runtime_main.<locals>.<genexpr>¾  s8   øè è € ð .
ð .
Ø$ˆG�EŒNð.
ð .
ð .
ð .
ð .
ð .
r   N)rò   ró   r$   rI   ry   rª  r¤   Ú_RUNTIME_MAIN_COMPAT_LOCKr÷  r£  r¤  r¥  r¦  r§  r¨  r(  rò  )
rè   rý   rü  r=   r\   rù  rý  r  r  r|  s
            @r   Úset_runtime_mainr  ‘  sÎ  ø€ ð( �^ ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4Ø1Ð7°R×>Ò>Ñ@Ô@×FÒFÑHÔHØ�+˜2×$Ò$Ñ&Ô&Ø�^ ×*Ò*Ñ,Ô,õ ˜'¥3Ñ'Ô'ð6ˆG�MŠM‰OŒOˆOå$ WÑ-Ô-Ð5��°2à�^ ×*Ò*Ñ,Ô,Ø�o 2×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6Ø!Ð' R×.Ò.Ñ0Ô0ðð €Gõ  "×%Ò% gÑ.Ô.€EÝ	"ð 
ð 
ð ?Ð>Ð>Ð>Õ)=Ð>Ñ>Ô>ñ	
Ø"ØØ"Ø!Ø"Ø#å(-ð .
ð .
ð .
ð .
Ý(<ð.
ñ .
ô .
ñ )
ô )
Ð%ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð €Ls   Ä*;E1Å1E5Å8E5r  c                 ót   — | €dS 	 t                                | ¦  «         dS # t          t          f$ r Y dS w xY w)z:Restore the runtime binding that preceded one scoped turn.N)rª  rº  rN  r×  )r  s    r   Úreset_runtime_mainr  Ä  sT   € à€}ØˆðÝ×#Ò# EÑ*Ô*Ð*Ð*Ð*øÝ�*Ð%ð ð ð ð 	ˆˆðøøøs   †" ¢7¶7Úmain_runtimec              #   óÜ   K  — t          | ¦  «        }t                               |pd¦  «        }	 |V — t                               |¦  «         dS # t                               |¦  «         w xY w)zETemporarily bind an explicit runtime without touching legacy mirrors.N)Ú_normalize_main_runtimerª  r¤   rº  )r  r|  r  s      r   Úscoped_runtime_mainr	  Ð  so   è è € õ & lÑ3Ô3€GÝ!×%Ò% g o°Ñ6Ô6€Eð+Øˆˆˆå×#Ò# EÑ*Ô*Ð*Ð*Ð*øÕ×#Ò# EÑ*Ô*Ð*Ð*øøøs   ¯A ÁA+c                  ó–   — t                                d¦  «         t          5  dadadadadadada	ddd¦  «         dS # 1 swxY w Y   dS )z2Clear the runtime override in the current context.NrB   rñ  )
rª  r¤   r  r£  r¤  r¥  r¦  r§  r¨  rò  r   r   r   Úclear_runtime_mainr  Û  sÀ   € õ
 ×Ò˜dÑ#Ô#Ð#Ý	"ð Að AØ!#ÐØ ÐØ!#ÐØ "ÐØ!#ÐØ"$ÐØ(@Ð%ðAð Að Añ Aô Að Að Að Að Að Að Að Aøøøð Að Að Að Að Að As   ¢>¾AÁAc                  ó€  — 	 ddl m}   | d¬¦  «        }n4# t          $ r'}t                               d|¦  «         d}Y d}~nd}~ww xY wt          |t          ¦  «        sRt          j        dd¦  «         	                    ¦   «          
                    d	¦  «        }t          d
¦  «        }|sdS ||dœ}|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }t          |t          ¦  «        r| 	                    ¦   «         sdS | 	                    ¦   «          
                    d	¦  «        }t          |d¦  «        rdS t          |t          ¦  «        r| 	                    ¦   «         sd}t          |t          ¦  «        r| 	                    ¦   «         sd}|| 	                    ¦   «         |fS )z÷Resolve the active custom/main endpoint the same way the main CLI does.

    This covers both env-driven OPENAI_BASE_URL setups and config-saved custom
    endpoints where the base URL lives in config.yaml instead of the live
    environment.
    r   ©Úresolve_runtime_providerrî   )Ú	requestedz6Auxiliary client: custom runtime resolution failed: %sNÚOPENAI_BASE_URLrB   rÿ   ÚOPENAI_API_KEY©NNN©r=   r\   r=   r\   rù  úopenrouter.aiúno-key-required)Úhermes_cli.runtime_providerr  rK   rX   rx   r$   ro  r�  rÖ  rò   rB  rÝ  rJ   rI   r4   )r  r|  r¥   Úopenai_baseÚ
openai_keyÚcustom_baseÚ
custom_keyÚcustom_modes           r   Ú_resolve_custom_runtimer  ë  sç  € ðØHÐHÐHÐHÐHÐHà*Ð*°XÐ>Ñ>Ô>ˆˆøÝð ð ð Ý�ŠÐMÈsÑSÔSÐSØˆˆˆˆˆˆøøøøðøøøõ �g�tÑ$Ô$ð 
Ý”iÐ 1°2Ñ6Ô6×<Ò<Ñ>Ô>×EÒEÀcÑJÔJˆÝ$Ð%5Ñ6Ô6ˆ
Øð 	$Ø#Ð#à#Ø!ð
ð 
ˆð
 —+’+˜jÑ)Ô)€KØ—’˜YÑ'Ô'€JØ—+’+˜jÑ)Ô)€KÝ�k¥3Ñ'Ô'ð  ¨{×/@Ò/@Ñ/BÔ/Bð  ØÐà×#Ò#Ñ%Ô%×,Ò,¨SÑ1Ô1€KÝ˜[¨/Ñ:Ô:ð  ð  Ðõ �j¥#Ñ&Ô&ð '¨j×.>Ò.>Ñ.@Ô.@ð 'Ø&ˆ
å�k¥3Ñ'Ô'ð ¨{×/@Ò/@Ñ/BÔ/Bð Øˆà˜
×(Ò(Ñ*Ô*¨KÐ7Ð7s   ‚ •
AŸAÁAc                  ó.   — t          ¦   «         \  } }}| pdS ©NrB   )r  )r  rY  s     r   Ú_current_custom_base_urlr    s   € Ý/Ñ1Ô1Ñ€K��AØÐ˜"Ðr   c            	      óD  — ddl m}  t          ¦   «          dD ]ˆ}t          t          j                             |¦  «        pd¦  «                             ¦   «         }|sŒE	  | |¦  «        }|j        r|j	        }Œ`# t          $ r}t          d|› d|›d�¦  «        |‚d}~ww xY wdS )	a‡  Fail fast with a clear error when proxy env vars have malformed URLs.

    Common cause: shell config (e.g. .zshrc) with a typo like
    ``export HTTP_PROXY=http://127.0.0.1:6153export NEXT_VAR=...``
    which concatenates 'export' into the port number.  Without this
    check the OpenAI/httpx client raises a cryptic ``Invalid port``
    error that doesn't name the offending env var.
    r   rË  )ÚHTTPS_PROXYÚ
HTTP_PROXYÚ	ALL_PROXYÚhttps_proxyÚ
http_proxyÚ	all_proxyrB   z%Malformed proxy environment variable r�  z1. Fix or unset your proxy settings and try again.N)rÌ  r   r8   rI   r�  r‚  rJ   rò   ÚschemeÚportr×  rN  )r   r:  rv  rÆ   rY  r¥   s         r   Ú_validate_proxy_env_urlsr)  "  sö   € ð &Ð%Ð%Ð%Ð%Ð%åÑÔÐð:ð ð ˆå•B”J—N’N 3Ñ'Ô'Ð-¨2Ñ.Ô.×4Ò4Ñ6Ô6ˆØð 	Øð	Ø�X˜e‘_”_ˆFØŒ}ð  Ø”K�øøÝð 	ð 	ð 	ÝðB¸ð Bð B¸eð Bð Bð Bñô ð ðøøøøð	øøøðð s   ÁA7Á7
BÂBÂBc                 ó  — ddl m} t          | pd¦  «                             ¦   «         }|r|                     d¦  «        rdS 	  ||¦  «        }|j        dv r	|j        }dS dS # t          $ r}t          d|›d�¦  «        |‚d}~ww xY w)	zEReject obviously broken custom endpoint URLs before they reach httpx.r   rË  rB   zacp://N>   ÚhttpÚhttpszMalformed custom endpoint URL: zJ. Run `hermes setup` or `hermes model` and enter a valid http(s) base URL.)	rÌ  r   rI   rò   rô   r'  r(  r×  rN  )r=   r   r�  rÆ   rY  r¥   s         r   Ú_validate_base_urlr-  ?  sØ   € à%Ð%Ð%Ð%Ð%Ð%å�H�N Ñ#Ô#×)Ò)Ñ+Ô+€IØð ˜	×,Ò,¨XÑ6Ô6ð ØˆðØ�˜)Ñ$Ô$ˆØŒ=Ð-Ð-Ð-Ø”ˆAˆAˆAð .Ð-øåð ð ð ÝðW¨ið Wð Wð Wñ
ô 
ð ð	øøøøðøøøs   ÁA# Á#
BÁ-BÂBc                  ó  — t          ¦   «         } t          | ¦  «        dk    r| \  }}d }n| \  }}}|r|sdS |                     ¦   «                              t                               ¦   «         ¦  «        rdS t          ¦   «         pd}t                               d||pd¦  «         t          |¦  «        \  }}|rd|ini }t          d ¦  «        }|r||d<   |dk    r!t          d||d	œ|¤Ž}	t          |	|¦  «        |fS |d
k    re	 ddlm}
  |
||¦  «        }	n;# t          $ r. t                               d¦  «         t          d||d	œ|¤Ž|fcY S w xY wt!          |	|||d¬¦  «        |fS t          d||d	œ|¤Ž}t#          |||||¦  «        }||fS )Nr"  rE  úgpt-4o-miniz3Auxiliary client: custom endpoint (%s, api_mode=%s)r²  Údefault_queryrm  Úcodex_responsesr_   r±  r   rþ  u|   Custom endpoint declares api_mode=anthropic_messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire.Fr  r   )r  r¡  ró   rô   Ú_CODEX_AUX_BASE_URLr�  rX   rx   rÉ   rw  ra   rx  rœ  rÿ  rU   rY   rÈ  r  )r|  r  r  r  rý   Ú_clean_baseÚ_dqÚ_extraÚ_custom_headersrà  rÿ  Ú_fallback_clients               r   Ú_try_custom_endpointr8  Q  s=  € Ý%Ñ'Ô'€GÝ
ˆ7�|„|�qÒÐØ")Ñˆ�ZØˆˆà/6Ñ,ˆ�Z Øð ˜jð ØˆzØ×ÒÑÔ×%Ò%Õ&9×&?Ò&?Ñ&AÔ&AÑBÔBð ØˆzÝ$Ñ&Ô&Ð7¨-€EÝ
‡L‚LÐFÈÈ{ÐOpÐ^pÑqÔqÐqÝ0°Ñ=Ô=Ñ€K�Ø'*Ð2ˆo˜sÐ#Ð#°€Fõ
 2°$Ñ7Ô7€OØð 4Ø$3ˆÐ Ñ!ØÐ'Ò'Ð'Ý+Ð_°JÈÐ_Ð_ÐX^Ð_Ð_ˆÝ# K°Ñ7Ô7¸Ð>Ð>ØÐ*Ò*Ð*ð	dØFÐFÐFÐFÐFÐFØ0Ð0°¸[ÑIÔIˆKˆKøÝð 	dð 	dð 	dÝ�NŠNðRñô ð õ )Ð\°ÀkÐ\Ð\ÐU[Ð\Ð\Ð^cÐcÐcÐcÐcð	døøøõ % [°%¸À[Ð[`ÐaÑaÔaØð
ð 	
õ -Ð`°ZÈ+Ð`Ð`ÐY_Ð`Ð`ÐÝ,Ø˜% ¨[¸+ñô Ðð ˜UÐ"Ð"s   ÄD Ä5EÅEc                 ó  — | st                                d¦  «         dS t          ¦   «         }|€dS |\  }}t                                d| ¦  «         ddlm} t          || |¦   «         ¬¦  «        }t          || ¦  «        | fS )u  Build a CodexAuxiliaryClient for an xAI Grok OAuth-authenticated session.

    xAI's ``/v1/responses`` endpoint speaks the OpenAI Responses API, so we
    wrap a plain ``OpenAI`` client in ``CodexAuxiliaryClient`` to translate
    ``chat.completions.create()`` calls into ``responses.stream()`` requests.

    The caller must pass an explicit model â€” pinning a default for Grok
    would silently rot when xAI's allowlist drifts.  Returns ``(None, None)``
    when the user has not authenticated with xAI Grok OAuth.
    zuAuxiliary client: xai-oauth requested without a model; pass model explicitly (auxiliary.<task>.model in config.yaml).rE  Nz2Auxiliary client: xAI OAuth (%s via Responses API)r   ©Úhermes_xai_default_headersrj  )rX   rY   r<  rx   Útools.xai_httpr;  ra   rx  )rý   Úresolvedr\   r=   r;  rà  s         r   Ú_build_xai_oauth_aux_clientr>  „  s³   € ð ð Ý�ŠðMñ	
ô 	
ð 	
ð ˆzÝ)Ñ+Ô+€HØÐØˆzØ Ñ€GˆXÝ
‡L‚LÐEÀuÑMÔMÐMØ9Ð9Ð9Ð9Ð9Ð9å'ØØØ2Ð2Ñ4Ô4ðñ ô €Kõ
   ¨UÑ3Ô3°UÐ:Ð:r   c                 óÀ  — | st                                d¦  «         dS t          d¦  «        \  }}|rHt          |¦  «        }|rt	          |t
          ¦  «        pt
          }n3t          ¦   «         }|sdS t
          }nt          ¦   «         }|sdS t
          }t                                d| ¦  «         t          ||t          |¦  «        ¬¦  «        }t          || ¦  «        | fS )aÛ  Build a CodexAuxiliaryClient for an explicitly-requested model.

    There is no auto-selection of the Codex model: the ChatGPT-account
    Codex endpoint's accepted model list is an undocumented, drifting
    allow-list, so any hardcoded default we pick goes stale.  The caller
    is responsible for passing the model (e.g. from the user's own
    ``model.model`` or ``auxiliary.<task>.model`` config).

    Returns (None, None) when no Codex OAuth token is available.
    zxAuxiliary client: openai-codex requested without a model; pass model explicitly (auxiliary.<task>.model in config.yaml).rE  rð   z4Auxiliary client: Codex OAuth (%s via Responses API)rj  )rX   rY   r¶  rÀ  rÈ  r2  rB  rx   ra   r©  rx  )rý   r  r½  Úcodex_tokenr=   rà  s         r   Ú_build_codex_clientrA  ¤  s  € ð ð Ý�ŠðMñ	
ô 	
ð 	
ð ˆzÝ,¨^Ñ<Ô<Ñ€L�%Øð 'Ý+¨EÑ2Ô2ˆØð 	+Ý-¨eÕ5HÑIÔIÐ`ÕM`ˆHˆHå2Ñ4Ô4ˆKØð "Ø!�zÝ*ˆHˆHå.Ñ0Ô0ˆØð 	Ø�:Ý&ˆÝ
‡L‚LÐGÈÑOÔOÐOÝ'ØØÝ1°+Ñ>Ô>ðñ ô €Kõ
   ¨UÑ3Ô3°UÐ:Ð:r   ©rý   rg  Úexplicit_base_urlrù  rC  c                 ól  — 	 ddl m} ddlm} ddlm} n# t          $ r Y dS w xY w	  |¦   «         }t          |t          ¦  «        r| 	                    d¦  «        ni }t          |t          ¦  «        si }n# t          $ r i }Y nw xY w	  |d|||| ¬¦  «        }	n\# |$ r&}
t                               d	|
¦  «         Y d
}
~
dS d
}
~
wt          $ r&}
t                               d|
¦  «         Y d
}
~
dS d
}
~
ww xY w|	 	                    d¦  «        }t          |	 	                    dd¦  «        pd¦  «        }|p|	 	                    d¦  «        pd}t          |¦  «        st          |¦  «        nd}|r|sdS t!          | p#t          | 	                    d¦  «        pd¦  «        d¦  «        }|s1t                               d| | 	                    d¦  «        ¦  «         dS i }t#          |¦  «        \  }}|r||d<   t%          d||dœ|¤Ž}|dk    rt'          ||¦  «        |fS |dk    rt)          |||||¦  «        |fS ||fS )uª  Resolve an Azure Foundry auxiliary client via the runtime resolver.

    Mirrors the ``_try_anthropic`` / ``_try_nous`` shape but delegates to
    :func:`hermes_cli.runtime_provider._resolve_azure_foundry_runtime` â€”
    the same resolver the main agent uses â€” so:

    * ``auth_mode: api_key`` (default) gets the static
      ``AZURE_FOUNDRY_API_KEY`` string.
    * ``auth_mode: entra_id`` gets a callable bearer-token provider
      (``Callable[[], str]`` from
      :mod:`agent.azure_identity_adapter`).
    * Per-model ``api_mode`` auto-routing for GPT-5.x / o-series /
      codex models works.
    * ``model.entra.{tenant_id,client_id,authority,scope}`` config
      fields propagate.
    * Non-default ``model.base_url`` overrides are honored.

    The OpenAI SDK accepts both shapes for ``api_key`` so the caller
    can forward the result without coercion.

    Returns ``(client, model)`` or ``(None, None)`` on failure.
    r   )Ú_resolve_azure_foundry_runtime)Ú	AuthErrorrz  rE  rý   úazure-foundry)rü  r†  rg  rC  Útarget_modelzAuxiliary azure-foundry: %sNz)Auxiliary azure-foundry runtime error: %sr\   r=   rB   rù  r²  Tr$  zAAuxiliary azure-foundry: no model resolved (model=%r, default=%r)r0  r_   r1  r±  r   )r  rE  r?  rF  rH   rA   rU   r$   ro  rJ   rK   rX   rx   rI   ry   rn   Ú_normalize_resolved_modelrÉ   ra   rx  r  )rý   rg  rC  rù  rE  rF  rA   rb  r†  r|  r¥   r\   r=   Úruntime_api_modeÚ_has_keyÚfinal_modelrP  r3  r4  rZ   s                       r   Ú_try_azure_foundryrM  Í  s  € ð:ØNÐNÐNÐNÐNÐNØ-Ð-Ð-Ð-Ð-Ð-Ø:Ð:Ð:Ð:Ð:Ð:Ð:øÝð ð ð ØˆzˆzðøøøðØ"Ð"Ñ$Ô$ˆÝ(2°3½Ñ(=Ô(=ÐE�C—G’G˜GÑ$Ô$Ð$À2ˆ	Ý˜)¥TÑ*Ô*ð 	ØˆIøøÝð ð ð Øˆ	ˆ	ˆ	ðøøøðØ0Ð0Ø.ØØ-Ø/Øð
ñ 
ô 
ˆˆøð ð ð ð Ý�ŠÐ2°CÑ8Ô8Ð8ØˆzˆzˆzˆzˆzøøøøÝð ð ð Ý�ŠÐ@À#ÑFÔFÐFØˆzˆzˆzˆzˆzøøøøðøøøð �kŠk˜)Ñ$Ô$€GÝ�7—;’;˜z¨2Ñ.Ô.Ð4°"Ñ5Ô5€HØÐP 7§;¢;¨zÑ#:Ô#:ÐPÐ>PÐõ
 %-¨WÑ$5Ô$5Ð?�t�G‰}Œ}ˆ}¸4€HØð ˜8ð Øˆzå+ØÐ4•�Y—]’] 9Ñ-Ô-Ð3°Ñ4Ô4Øñô €Kð ð õ 	�ŠØOØ�9—=’= Ñ+Ô+ñ	
ô 	
ð 	
ð ˆzð
 €EÝ0°Ñ:Ô:Ñ€K�Ø
ð %Ø!$ˆˆoÑå"ÐR¨7¸[ÐRÐRÈEÐRÐR€FàÐ,Ò,Ð,õ $ F¨KÑ8Ô8¸+ÐEÐEàÐ/Ò/Ð/õ
 %Ø�K ØÐ&ñ
ô 
ð ðð 	ð �;ÐÐsB   ‚ •
#¢#§AA5 Á5BÂBÂB ÂC2ÂB?Â?C2ÃC-Ã-C2c                 ó¢  — 	 ddl m}m} n# t          $ r Y dS w xY wt	          d¦  «        \  }}|r|�| pt          |¦  «        }nd }| p	 |¦   «         }|sdS |rt          |t          ¦  «        nt          }	 ddlm	}  |¦   «         }| 
                    d¦  «        }	t          |	t          ¦  «        r�t          |	 
                    d¦  «        pd¦  «                             ¦   «                              ¦   «         }
|
dk    rO|	 
                    d	¦  «        pd                     ¦   «                              d
¦  «        }|rt#          |¦  «        r|}n# t$          $ r Y nw xY wddl m}  ||¦  «        }t)          d¦  «        pd}t*                               d|||¦  «         	  |||¦  «        }n# t          $ r Y dS w xY wt/          |||||¬¦  «        |fS )Nr   )rÿ  Úresolve_anthropic_tokenrE  rà   rz  rý   rè   rB   r=   rÿ   )Ú_is_oauth_tokenrU  z8Auxiliary client: Anthropic native (%s) at %s (oauth=%s)r  )rœ  rÿ  rO  rU   r¶  rÀ  rÈ  Ú_ANTHROPIC_DEFAULT_BASE_URLrH   rA   rJ   r$   ro  rI   rò   ró   rB  rÐ  rK   rP  rT  rX   rx   rÈ  )rg  rÿ  rO  r  r½  r  r=   rA   rb  r†  Úcfg_providerÚcfg_base_urlrP  r—  rý   rà  s                   r   rM  rM  ?  sj  € ðØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[øÝð ð ð Øˆzˆzðøøøõ -¨[Ñ9Ô9Ñ€L�%Øð >˜Ð)Ø Ð@Õ$9¸%Ñ$@Ô$@ˆˆð ˆØ Ð=Ð$;Ð$;Ñ$=Ô$=ˆØð Øˆzð NZÐzÕ% eÕ-HÑIÔIÐIÕ_z€HðØ:Ð:Ð:Ð:Ð:Ð:Ø"Ð"Ñ$Ô$ˆØ—G’G˜GÑ$Ô$ˆ	Ý�i¥Ñ&Ô&ð 	,Ý˜yŸ}š}¨ZÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔG×MÒMÑOÔOˆLØ˜{Ò*Ð*Ø )§¢¨jÑ 9Ô 9Ð ?¸R×FÒFÑHÔH×OÒOÐPSÑTÔT�Øð ,Õ$AÀ,Ñ$OÔ$Oð ,Ø+�HøøÝð ð ð Øˆðøøøð 8Ð7Ð7Ð7Ð7Ð7Øˆ˜uÑ%Ô%€HÝ'¨Ñ4Ô4ÐSÐ8S€EÝ
‡L‚LÐKÈUÐT\Ð^fÑgÔgÐgðØ,Ð,¨U°HÑ=Ô=ˆˆøÝð ð ð ð ˆzˆzð	øøøõ
 $ K°¸¸xÐRZÐ[Ñ[Ô[Ð]bÐbÐbs1   ‚ ‹
˜Á5CE Å
EÅEÆF* Æ*
F8Æ7F8r{  rÃ  úlocal/customúapi-key©rp  r~  r8  rW  )rè   rý   r=   r\   rù  rý  )rü  c                 ó8  — | €)t                                ¦   «         } | €t          ¦   «         } t          | t          ¦  «        si S i }t
          D ]‡}|                      |¦  «        }|dk    r*t          |¦  «        rt          |t          ¦  «        s|||<   ŒGt          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         ||<   ŒˆdD ]C}|                     |¦  «        }t          |t          ¦  «        r| 	                    ¦   «         ||<   ŒD|S )u™  Return a sanitized copy of a live main-runtime override.

    Most fields are stripped strings. ``api_key`` may legitimately be a
    zero-arg callable (Azure Foundry Entra ID token provider) â€” preserve
    those as-is so auxiliary clients inherit the same authentication
    surface as the main agent. The OpenAI SDK accepts ``Callable[[], str]``
    for ``api_key`` and calls it before every request.
    Nr\   )rè   rü  )
rª  rJ   rù  r$   ro  Ú_MAIN_RUNTIME_CONTEXT_FIELDSry   rI   rò   ró   )r  rø   rú  rv  Úidentity_fieldÚidentitys         r   r  r  ‰  s  € ð Ðõ
 -×0Ò0Ñ2Ô2ˆØÐÝ/Ñ1Ô1ˆLÝ�l¥DÑ)Ô)ð Øˆ	Ø!#€JÝ-ð .ð .ˆØ× Ò  Ñ'Ô'ˆà�IÒÐ¥(¨5¡/¤/Ð½*ÀUÍCÑ:PÔ:PÐØ %ˆJ�uÑØÝ�e�SÑ!Ô!ð 	. e§k¢k¡m¤mð 	.Ø %§¢¡¤ˆJ�uÑøØ<ð :ð :ˆØ—>’> .Ñ1Ô1ˆÝ�h¥Ñ$Ô$ð 	:Ø)1¯ªÑ)9Ô)9ˆJ�~Ñ&øØÐr   c                  óF   — dt           fdt          fdt          fdt          fgS )aB  Return the ordered provider detection chain.

    Built at call time (not module level) so that test patches
    on the ``_try_*`` functions are picked up correctly.

    NOTE: ``openai-codex`` is deliberately NOT in this chain.  The
    ChatGPT-account Codex endpoint only accepts a shifting, undocumented
    allow-list of model IDs, so falling back to it with a guessed model
    fails more often than not.  Codex is used only when the user's main
    provider *is* openai-codex (see Step 1 of ``_resolve_auto``) or when
    a caller explicitly requests it with a model.
    r{  rÃ  rT  rU  rV  r   r   r   Ú_get_provider_chainr\  ¬  s0   € ð 
•Ð'Ø	•ÐØ	Õ-Ð.Ø	Õ-Ð.ð	ð r   éX  Ú_aux_unhealthy_untilÚ_aux_unhealthy_logged_atrð   )r{  rÃ  rî   rT  rð   rï   c                 ó¦   — | sdS t          | ¦  «                             ¦   «                              ¦   «         }t                               ||¦  «        S )a  Normalize a resolved_provider value to a chain label used by
    ``_get_provider_chain()``. Falls back to the lowercased input for
    direct API-key providers (deepseek, alibaba, minimax, etc.) which
    each report their own provider name from the api-key chain.
    rB   )rI   rò   ró   Ú_AUX_UNHEALTHY_LABEL_ALIASESrJ   )rè   Úps     r   Ú_normalize_chain_labelrc  æ  sJ   € ð ð ØˆrÝˆH‰Œ×ÒÑÔ×#Ò#Ñ%Ô%€AÝ'×+Ò+¨A¨qÑ1Ô1Ð1r   r‰  c                 ó.  — t          | ¦  «        }|sdS t          j        ¦   «         |�|nt          z   }|t          |<   t                               d|t          |�|nt          ¦  «        t          j        dt          j        |¦  «        ¦  «        ¦  «         dS )zÑMark ``provider`` as recently-402'd, hidden from chain iteration
    until the TTL expires. Called from the payment-fallback branches in
    ``call_llm`` and ``acall_llm`` after a confirmed payment error.
    NzsAuxiliary: marking %s unhealthy for %ds (payment / credit error). Subsequent auxiliary calls will skip it until %s.z%H:%M:%S)	rc  r  Ú_AUX_UNHEALTHY_TTL_SECONDSr^  rX   rY   r…  ÚstrftimeÚ	localtime)rè   r‰  Úlabelr  s       r   rl  rl  ò  s—   € õ
 # 8Ñ,Ô,€EØð ØˆÝ”‘” s   Õ<VÑW€JØ",Õ˜ÑÝ
‡N‚Nð	<àÝ�3�?ˆCˆCÕ(BÑCÔCÝŒ�j¥$¤.°Ñ"<Ô"<Ñ=Ô=ñô ð ð ð r   rh  c                 óè   — | sdS t                                | ¦  «        }|€dS t          j        ¦   «         |k    r8t                                | d¦  «         t                               | d¦  «         dS dS )z‰True iff ``label`` is in the unhealthy cache and the TTL hasn't expired.
    Lazily evicts expired entries so the cache stays small.
    FNT)r^  rJ   r  r´  r_  )rh  r  s     r   rL  rL    sv   € ð ð ØˆuÝ%×)Ò)¨%Ñ0Ô0€JØÐØˆuÝ„y�{„{�jÒ Ð Ý× Ò  ¨Ñ-Ô-Ð-Ý ×$Ò$ U¨DÑ1Ô1Ð1ØˆuØˆ4r   r°  c                 ó<  — t          j         ¦   «         }t                               | d¦  «        }||z
  dk    rd|t          | <   t                               | |¦  «        }t                               d|pd| t          dt          ||z
  ¦  «        ¦  «        ¦  «         dS dS )z¨Emit a single info-level log per minute when we skip an unhealthy
    provider. Avoids spamming the log on bursty sessions while still
    giving the user a trail.
    r#  rÒ  zIAuxiliary %s: skipping %s (recently returned payment error, retry in %ds)Úcallr   N)r  r_  rJ   r^  rX   ÚinforÕ  r…  )rh  r°  ÚnowÚlastr  s        r   Ú_log_skip_unhealthyro    s    € õ
 Œ)‰+Œ+€CÝ#×'Ò'¨¨sÑ3Ô3€DØ
ˆT�z�RÒÐØ*-Õ  Ñ'Ý)×-Ò-¨e°SÑ9Ô9ˆ
Ý�ŠØWØˆN�F˜E¥3 q­#¨j¸3Ñ.>Ñ*?Ô*?Ñ#@Ô#@ñ	
ô 	
ð 	
ð 	
ð 	
ð Ðr   c                  ój   — t                                ¦   «          t                               ¦   «          dS )zvClear the unhealthy cache. Used by tests and by a future explicit
    user trigger (e.g. ``hermes config aux reset``).N)r^  rM  r_  r   r   r   Ú_reset_aux_unhealthy_cacherq  %  s.   € õ ×ÒÑ Ô Ð Ý×"Ò"Ñ$Ô$Ð$Ð$Ð$r   r¥   c                 ó¾   ‡— t          | dd¦  «        }|dk    rdS t          | ¦  «                             ¦   «         Š|dv rt          ˆfd„dD ¦   «         ¦  «        rdS dS )	u
  Detect payment/credit/quota exhaustion errors.

    Returns True for HTTP 402 (Payment Required) and for 429/other errors
    whose message indicates billing exhaustion or daily quota exhaustion
    rather than transient rate limiting.

    Daily token quota errors (e.g. Bedrock "Too many tokens per day",
    Vertex AI "quota exceeded") are functionally equivalent to credit
    exhaustion â€” the provider cannot serve the request until the quota
    resets â€” and should trigger the same provider-fallback logic.
    Ústatus_codeNé’  T>   Nrt  é“  é”  é­  c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ©rÀ   ÚkwÚ	err_lowers     €r   r9  z$_is_payment_error.<locals>.<genexpr>A  s7   øè è € ð ð  2ˆr�Yˆð ð ð ð ð ð r   )Úcreditsúinsufficient fundsúcan only affordÚbillingúpayment requiredúout of fundsúrun out of fundsÚbalance_depletedúno usable creditsÚ model_not_supported_on_free_tierúnot available on the free tierzrequires a subscriptionzupgrade for accesszupgrade for higher limitsz reached your session usage limitzquota exceededÚquota_exceededztoo many tokens per dayzdaily limitztokens per dayzdaily quotazresource exhaustedzweekly usage limitzweekly limitF©ro   rI   ró   rE  ©r¥   Ústatusr{  s     @r   Ú_is_payment_errorr‹  ,  s�   ø€ õ �S˜-¨Ñ.Ô.€FØ�‚}€}ØˆtÝ�C‘”—’Ñ Ô €Ið
 Ð+Ð+Ð+Ýð ð ð ð ð *
ð ñ ô ñ ô ð 	ð" �4Øˆ5r   c                  ó    — 	 ddl m}   | d¬¦  «        }|j        du S # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)zMReturn True only when the fresh Nous account API says paid access is allowed.r   )Úget_nous_portal_account_infoT)Úforce_freshz8Auxiliary Nous paid-entitlement refresh check failed: %sNF)Úhermes_cli.nous_accountr�  Úpaid_service_accessrK   rX   rx   )r�  Úaccount_infor¥   s      r   Ú*_nous_portal_account_has_fresh_paid_accessr’  V  s|   € ðØHÐHÐHÐHÐHÐHà3Ð3ÀÐEÑEÔEˆØÔ/°4Ð7Ð7øÝð ð ð Ý�ŠÐOÐQTÑUÔUÐUØˆuˆuˆuˆuˆuøøøøðøøøs   ‚ �
A§AÁAc                 ó   ‡— t          | dd¦  «        }t          | ¦  «                             ¦   «         Št          | ¦  «        j        dk    rdS |dk    r:t          ˆfd„dD ¦   «         ¦  «        rdS t          ˆfd„d	D ¦   «         ¦  «        sdS d
S )aH  Detect rate-limit errors that warrant provider fallback.

    Returns True for HTTP 429 errors whose message indicates rate limiting
    (as opposed to billing/quota exhaustion, which _is_payment_error handles).
    Also catches OpenAI SDK RateLimitError instances that may not set
    .status_code on the exception object.
    rs  NÚRateLimitErrorTrw  c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z'_is_rate_limit_error.<locals>.<genexpr>u  s7   øè è € ð ð  2ˆr�Yˆð ð ð ð ð ð r   )ú
rate limitÚ
rate_limitztoo many requestsz	try againzretry afterz	resets inc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z'_is_rate_limit_error.<locals>.<genexpr>{  s7   øè è € ð ð  r�2˜�?ð ð ð ð ð ð r   )r|  r}  r  r€  r~  r�  r‚  rƒ  r„  r…  r†  F)ro   rI   ró   rÿ  r*   rE  r‰  s     @r   Ú_is_rate_limit_errorr™  b  sÙ   ø€ õ �S˜-¨Ñ.Ô.€FÝ�C‘”—’Ñ Ô €Iõ ˆC�y„yÔÐ-Ò-Ð-Øˆtà�‚}€}õ ð ð ð ð ð *
ð ñ ô ñ ô ð 	ð �4åð ð ð ð ð .
ð ñ ô ñ ô ð 	ð �4Øˆ5r   c                 óÌ   — 	 ddl m} t          | |¦  «        rdS n# t          $ r Y nw xY wdt	          | ¦  «        j        v rdS dt          | ¦  «                             ¦   «         v S )uµ  Detect a request timeout â€” the full-budget stall, distinct from a fast
    connection drop.

    A timeout burns the entire configured ``timeout`` before surfacing, so a
    same-provider retry on the critical compression path doubles the
    user-visible wall time (issue #54465). A streaming-close / dropped
    connection, by contrast, fails fast and is cheap to retry â€” those stay on
    the retry path even for compression.
    r   )ÚAPITimeoutErrorTÚTimeoutú	timed out)r   r›  r$   rU   rÿ  r*   rI   ró   )r¥   r›  s     r   Ú_is_timeout_errorrž  ‡  s‰   € ðØ*Ð*Ð*Ð*Ð*Ð*Ý�c˜?Ñ+Ô+ð 	Ø�4ð	øåð ð ð Øˆðøøøà•D˜‘I”IÔ&Ð&Ð&ØˆtØ�#˜c™(œ(Ÿ.š.Ñ*Ô*Ð*Ð*s   ‚ ›
(§(c                 óD  ‡‡— 	 ddl m}m} t          | ||f¦  «        rdS n# t          $ r Y nw xY wt          | ¦  «        j        Št          ˆfd„dD ¦   «         ¦  «        rdS t          | ¦  «         	                    ¦   «         Št          ˆfd„dD ¦   «         ¦  «        rdS dS )	aE  Detect connection/network errors that warrant provider fallback.

    Returns True for errors indicating the provider endpoint is unreachable
    (DNS failure, connection refused, TLS errors, timeouts).  These are
    distinct from API errors (4xx/5xx) which indicate the provider IS
    reachable but returned an error.
    r   )ÚAPIConnectionErrorr›  Tc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )rÀ   rz  Úerr_types     €r   r9  z'_is_connection_error.<locals>.<genexpr>¬  s'   øè è € Ð
LÐ
L˜bˆ2�ˆ>Ð
LÐ
LÐ
LÐ
LÐ
LÐ
Lr   )Ú
Connectionrœ  ÚDNSÚSSLc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z'_is_connection_error.<locals>.<genexpr>¯  s7   øè è € ð ð ˜rˆ2�ˆ?ð ð ð ð ð ð r   )zconnection refusedzname or service not knownzno route to hostznetwork is unreachabler�  zconnection resetzincomplete chunked readzpeer closed connectionzresponse ended prematurelyzunexpected eofÚremoteprotocolerrorÚlocalprotocolerrorF)
r   r   r›  r$   rU   rÿ  r*   rE  rI   ró   )r¥   r   r›  r{  r¢  s      @@r   Ú_is_connection_errorr©  œ  sù   øø€ ðØ>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ý�cÐ.°Ð@ÑAÔAð 	Ø�4ð	øåð ð ð Øˆðøøøõ �C‰yŒyÔ!€HÝ
Ð
LÐ
LÐ
LÐ
LÐ$KÐ
LÑ
LÔ
LÑLÔLð ØˆtÝ�C‘”—’Ñ Ô €IÝ
ð ð ð ð ð &ð ñ ô ñ ô ð ð ˆtØˆ5s   „! ¡
.­.c                 óÜ   — t          | ¦  «        rdS t          | dd¦  «        pt          t          | dd¦  «        dd¦  «        }t          |t          ¦  «        o|dk    pd|cxk    odk     nc S )a(  Return True for a one-off transport blip worth retrying ON the
    same provider before any provider/model fallback.

    Covers connection/streaming-close errors (via the canonical
    ``_is_connection_error`` detector, shared so the two cannot drift) plus a
    pure 5xx/408 HTTP status. Deliberately narrow: this is the "retry the
    same target once" gate, distinct from ``_is_payment_error`` /
    ``_is_auth_error`` / ``_is_rate_limit_error`` which the except-chain
    handles by switching provider, refreshing creds, or rotating the pool.
    Trs  NrÀ  i˜  iô  r]  )r©  ro   r$   r…  )r¥   rŠ  s     r   Ú_is_transient_transport_errorr«  Â  sŠ   € õ ˜CÑ Ô ð ØˆtÝ�S˜-¨Ñ.Ô.ð µ'Ý��Z Ñ&Ô&¨°tñ3ô 3€Fõ �f�cÑ"Ô"ÐM¨°#ªÐ(L¸ÀÐ9LÐ9LÒ9LÐ9LÈÒ9LÐ9LÐ9LÐ9LÐMr   r"  g      ð?c                  óØ   — 	 ddl m} m}  |  |¦   «         dd¦  «        }|€t          S t	          |¦  «        }t          dt          |d¦  «        ¦  «        S # t          $ r
 t          cY S w xY w)u  Number of same-provider retries for a transient transport blip.

    Read from ``auxiliary.transient_retries`` in config.yaml (default 2 â†’
    3 total attempts). Clamped to [0, 6] to bound worst-case wall time. A
    connection blip to a pinned auxiliary target (e.g. a MoA reference
    advisor) has no meaningful provider fallback, so a couple of retries with
    backoff is the difference between recovering and silently losing the call.
    Best-effort: any config-read failure falls back to the default.
    r   rj  r]  Útransient_retriesNé   )rH   rk  rl  Ú_DEFAULT_TRANSIENT_RETRIESr…  rÕ  ÚminrK   )rk  rl  r'  Úns       r   Ú_transient_retry_countr²  Û  sŽ   € ð	*Ø:Ð:Ð:Ð:Ð:Ð:Ð:Ð:àˆg�k�k‘m”m [Ð2EÑFÔFˆØˆ;Ý-Ð-Ý�‰HŒHˆÝ�1•c˜!˜Q‘i”iÑ Ô Ð øÝð *ð *ð *Ý)Ð)Ð)Ð)ð*øøøs   ‚%A ¨,A ÁA)Á(A)c                 ó  — t          | dd¦  «        }|dk    rdS t          | ¦  «                             ¦   «         }d|v s(dt          | ¦  «        j                             ¦   «         v rdS |dk    rd|v rdS d	|v rd|v rdS d
S )zCDetect auth failures that should trigger provider-specific refresh.rs  Né‘  Tzerror code: 401Úauthenticationerrorru  zbad-credentialsÚunauthenticatedF)ro   rI   ró   rÿ  r*   r‰  s      r   Ú_is_auth_errorr·  ñ  s¡   € å�S˜-¨Ñ.Ô.€FØ�‚}€}ØˆtÝ�C‘”—’Ñ Ô €IØ˜IÐ%Ð%Ð)>Å$ÀsÁ)Ä)ÔBT×BZÒBZÑB\ÔB\Ð)\Ð)\Øˆtð �‚}€}Ð*¨iÐ7Ð7ØˆtØ˜IÐ%Ð%Ð*;¸yÐ*HÐ*HØˆtØˆ5r   Úparamc                 ó¼   ‡— |pd                      ¦   «         }|sdS t          | ¦  «                              ¦   «         Š|‰vrdS t          ˆfd„dD ¦   «         ¦  «        S )a/  Detect provider 400s for an unsupported request parameter.

    Different OpenAI-compatible endpoints phrase the same class of error a few
    ways: ``Unsupported parameter: X``, ``unsupported_parameter`` with a
    ``param`` field, ``X is not supported``, ``unknown parameter: X``,
    ``unrecognized request argument: X``.  We match on both the parameter
    name and a generic "unsupported/unknown/unrecognized parameter" marker so
    call sites can reactively retry without the offending key instead of
    surfacing a noisy auxiliary failure.

    Generalizes the temperature-specific detector that originally shipped
    with PR #15621 so the same retry strategy can cover ``max_tokens``,
    ``seed``, ``top_p``, and any future quirk. Credit @nicholasrae (PR #15416)
    for the generalization pattern.
    rB   Fc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   )rÀ   Úmarkerr{  s     €r   r9  z2_is_unsupported_parameter_error.<locals>.<genexpr>  s8   øè è € ð 	ð 	 vˆv˜Ð"ð 	ð 	ð 	ð 	ð 	ð 	r   )zunsupported parameterÚunsupported_parameterúnot supportedzdoes not supportzunknown parameterzunrecognized request argumentzunrecognized parameterzinvalid parameter)ró   rI   rE  )r¥   r¸  Úparam_lowerr{  s      @r   Ú_is_unsupported_parameter_errorr¿    s†   ø€ ð  �;˜B×%Ò%Ñ'Ô'€KØð ØˆuÝ�C‘”—’Ñ Ô €IØ˜)Ð#Ð#ØˆuÝð 	ð 	ð 	ð 	ð 	2ð 	ñ 	ô 	ñ 	ô 	ð 	r   c                 ó"   — t          | d¦  «        S )zíBack-compat wrapper: detect API errors where the model rejects ``temperature``.

    Delegates to :func:`_is_unsupported_parameter_error`; kept as a separate
    public symbol because existing tests and call sites import it by name.
    r§  )r¿  )r¥   s    r   Ú!_is_unsupported_temperature_errorrÁ  %  s   € õ +¨3°Ñ>Ô>Ð>r   c                 óä   ‡— t          | dd¦  «        }t          | ¦  «                             ¦   «         Št          ˆfd„dD ¦   «         ¦  «        rdS |dvrdS t          ˆfd„dD ¦   «         ¦  «        S )	u!  Detect "the requested model doesn't exist" errors (404 / invalid model).

    This fires when a resolved model name is no longer served by the endpoint
    â€” most commonly when a long-lived process pinned a Portal-recommended model
    that has since been dropped from the Nous â†’ OpenRouter catalog. The Nous
    proxy returns 404 with a body like::

        Model 'gpt-5.4-mini' not found. The requested model does not exist
        in our configuration or OpenRouter catalog.

    Distinct from :func:`_is_payment_error` (which also matches some 404s for
    free-tier/credit language) â€” this one keys on "does not exist / not found /
    not a valid model" phrasing, and explicitly excludes the billing keywords
    that the payment path already owns so the two predicates don't overlap.
    rs  Nc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z,_is_model_not_found_error.<locals>.<genexpr>A  s7   øè è € ð ð ˜rˆ2�ˆ?ð ð ð ð ð ð r   )	r|  r}  r  r�  rƒ  r„  ú	free tierú	free-tierr†  F>   Né�  rv  c              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z,_is_model_not_found_error.<locals>.<genexpr>I  s7   øè è € ð 
ð 
 2ˆr�Yˆð 
ð 
ð 
ð 
ð 
ð 
r   )	zmodel does not existz#does not exist in our configurationzopenrouter catalogzis not a valid modelzno such modelzmodel not foundzthe model `Úmodel_not_foundzunknown modelrˆ  r‰  s     @r   Ú_is_model_not_found_errorrÉ  .  s·   ø€ õ  �S˜-¨Ñ.Ô.€FÝ�C‘”—’Ñ Ô €Iå
ð ð ð ð ð &ð ñ ô ñ ô ð ð
 ˆuØÐ%Ð%Ð%ØˆuÝð 
ð 
ð 
ð 
ð 
*ð 
ñ 
ô 
ñ 
ô 
ð 
r   c                 ó  ‡— t          | dd¦  «        }|dvrdS t          | ¦  «                             ¦   «         Št          | ¦  «        rdS t	          ˆfd„dD ¦   «         ¦  «        rdS t	          ˆfd„dD ¦   «         ¦  «        S )	u  Detect "this route cannot serve this model" 400s (capability mismatch).

    Distinct from :func:`_is_model_not_found_error` (the model does not exist
    anywhere): here the model name is valid but the *current provider/account*
    is structurally unable to run it. The canonical case is a configured
    fallback that cannot run the main model â€” e.g. an ``openai-codex`` /
    ChatGPT-account fallback asked to compress a ``glm-5.2`` conversation::

        Error code: 400 - {'detail': "The 'glm-5.2' model is not supported
        when using Codex with a ChatGPT account."}

    The candidate authenticates fine and builds a client, so the auth and
    payment predicates don't fire and the call would otherwise raise and
    abort the whole auxiliary task (commonly compression â€” which then drops
    middle turns and churns the session, destroying the prompt cache).
    Treating it as a fallback-worthy capability error lets the chain skip the
    incapable route and continue to the next candidate, mirroring the
    context-window feasibility screen (#52392).

    Billing/quota 400s belong to :func:`_is_payment_error`; "model does not
    exist" 400s belong to :func:`_is_model_not_found_error`. This predicate
    explicitly excludes both so the three don't overlap.
    rs  N>   NrÆ  Fc              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z/_is_model_incompatible_error.<locals>.<genexpr>z  s7   øè è € ð ð ˜rˆ2�ˆ?ð ð ð ð ð ð r   )r|  r}  r  r�  rƒ  r„  r€  rÄ  rÅ  r†  r…  Úquotac              3   ó    •K  — | ]}|‰v V — Œ	d S r   r   ry  s     €r   r9  z/_is_model_incompatible_error.<locals>.<genexpr>�  s7   øè è € ð ð  2ˆr�Yˆð ð ð ð ð ð r   )zis not supported when usingzmodel is not supportedznot supported with thisznot supported for this accountÚmodel_not_supportedzdoes not support this modelzunsupported model)ro   rI   ró   rÉ  rE  r‰  s     @r   Ú_is_model_incompatible_errorrÏ  V  sÍ   ø€ õ0 �S˜-¨Ñ.Ô.€FØ�[Ð Ð ØˆuÝ�C‘”—’Ñ Ô €Iõ ! Ñ%Ô%ð ØˆuÝ
ð ð ð ð ð &ð ñ ô ñ ô ð ð ˆuÝð ð ð ð ð *ð ñ ô ñ ô ð r   c                 óŠ   — t          | t          ¦  «        sdS t          | ¦  «                             ¦   «         }d|v od|v od|v S )aº  Detect provider responses that authenticated but cannot serve aux shape.

    Some OpenAI-compatible routes return HTTP 200 with an empty/malformed
    ChatCompletion instead of a normal provider error.  That is still a
    provider/model capability failure for auxiliary tasks: downstream callers
    need ``choices[0].message`` and should be able to continue through the
    same fallback path as explicit model-incompatibility errors.
    Fz
auxiliary zllm returned invalid responsezchoices[0].message)r$   rN  rI   ró   )r¥   rR  s     r   Ú_is_invalid_aux_response_errorrÑ  Œ  sW   € õ �c�<Ñ(Ô(ð ØˆuÝ
ˆc‰(Œ(�.Š.Ñ
Ô
€Cà˜Ðð 	(Ø+¨sÐ2ð	(à  CÐ'ðr   c                 ó2  ‡— t          | ¦  «        Št          5  ˆfd„t          D ¦   «         }|D ]O}t                               |d¦  «        d         }|�t	          |¦  «         t                               |d¦  «         ŒP	 ddd¦  «         dS # 1 swxY w Y   dS )zEDrop cached auxiliary clients for a provider so fresh creds are used.c                 ó`   •— g | ]*}t          t          |d          ¦  «        ¦  «        ‰k    ¯(|‘Œ+S r¾   )rû   rI   )rÀ   r:  rø   s     €r   ú
<listcomp>z)_evict_cached_clients.<locals>.<listcomp>£  s@   ø€ ð 
ð 
ð 
ØÝ&¥s¨3¨q¬6¡{¤{Ñ3Ô3°zÒAÐAð ØAÐAÐAr   r  r   N)rû   Ú_client_cache_lockÚ_client_cacherJ   Ú_close_cached_clientr´  )rè   Ú
stale_keysr:  rZ   rø   s       @r   Ú_evict_cached_clientsrÙ  Ÿ  s   ø€ å(¨Ñ2Ô2€JÝ	ð 	)ð 	)ð
ð 
ð 
ð 
Ý(ð
ñ 
ô 
ˆ
ð ð 	)ð 	)ˆCÝ"×&Ò& sÐ,>Ñ?Ô?ÀÔBˆFØÐ!Ý$ VÑ,Ô,Ð,Ý×Ò˜c 4Ñ(Ô(Ð(Ð(ð		)ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð 	)ð 	)s   ˜A&BÂBÂBrª   c                 ó:  — | €dS d}t           5  t          t                               ¦   «         ¦  «        D ]M}t                               |¦  «        }|€Œ|d         }|€Œ*t          |dd¦  «        }|| u s|| u r
t          |= d}ŒN	 ddd¦  «         n# 1 swxY w Y   |S )u@  Drop the cache entry whose stored client is *target*.

    Used when a specific cached client has been poisoned (closed httpx
    transport after a timeout, broken streaming session, etc.) so the next
    auxiliary call rebuilds rather than reusing the dead instance.

    Walks both sync and async wrappers (``CodexAuxiliaryClient``,
    ``AnthropicAuxiliaryClient``, ``AsyncCodexAuxiliaryClient``, etc.) via
    their ``_real_client`` attribute so a timeout that closes the underlying
    ``OpenAI`` (or native provider) client evicts every cached shim that
    exposed it. Async wrappers must mirror their sync sibling's
    ``_real_client`` for this to work â€” otherwise the sync entry is evicted
    but the async entry survives and keeps reusing the dead transport.

    Returns True when at least one entry was evicted.
    NFr   rz  T)rÕ  rE  rÖ  ÚkeysrJ   ro   )rª   Úevictedr:  r½  ÚcachedÚreals         r   r  r  ®  sû   € ð" €~ØˆuØ€GÝ	ð ð Ý�×*Ò*Ñ,Ô,Ñ-Ô-ð 
	ð 
	ˆCÝ!×%Ò% cÑ*Ô*ˆEØˆ}ØØ˜1”XˆFØˆ~ØÝ˜6 >°4Ñ8Ô8ˆDØ˜ÐÐ 4¨6 > >Ý! #Ð&Ø�øð
	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð €Ns   ŽA5BÂBÂB©r  c                óV  — t          | ¦  «        }|dk    r?t          |¦  «        }t          |                     d¦  «        pt          ¦   «         ¦  «        }|dv rdS t	          |¦  «        }|€dS t          t          |dd¦  «        pd¦  «                             ¦   «         }|sdS |› d|› �S )z9Return a stable cache discriminator for pooled providers.rê   rè   >   rB   rê   rî   rB   Nr1  rì   )rû   r  rJ   rö   r¼  rI   ro   rò   )rè   r  rø   r|  r½  Úentry_ids         r   Ú_pool_cache_hintrâ  Ñ  sÁ   € õ )¨Ñ2Ô2€JØ�VÒÐÝ)¨,Ñ7Ô7ˆÝ,¨W¯[ª[¸Ñ-DÔ-DÐ-]ÕH[ÑH]ÔH]Ñ^Ô^ˆ
ØÐ+Ð+Ð+ØˆrÝ˜ZÑ(Ô(€EØ€}ØˆrÝ•7˜5 $¨Ñ+Ô+Ð1¨rÑ2Ô2×8Ò8Ñ:Ô:€HØð ØˆrØÐ%Ð%˜8Ð%Ð%Ð%r   c                 óX   — t          | dd ¦  «        }dt          | ¦  «        i}|�||d<   |S )Nrs  r)  )ro   rI   )r¥   rŠ  rA  s      r   Ú_pool_error_contexträ  æ  s8   € Ý�S˜-¨Ñ.Ô.€FØ(­#¨c©(¬(Ð3€GØÐØ!'ˆ�ÑØ€Nr   Úresolved_providerc                 óö  — t          | ¦  «        }|dvr|S t          t          |dd¦  «        pd¦  «        }t          |d¦  «        rdS t          |d¦  «        rdS t          |d¦  «        rd	S t          |d
¦  «        rdS t          |d¦  «        rdS t          |d¦  «        rdS t          |d¦  «        rdS |rÃt	          |¦  «        }|                     dd¦  «        }|rœ|dvr˜	 ddlm} |                     |¦  «        }|rit          |dd¦  «        dk    rTt          t          |dd¦  «        pd¦  «                             d¦  «        }	|	rt          |t          |	¦  «        ¦  «        r|S n# t          $ r Y nw xY wdS )zCInfer which provider pool can recover the current auxiliary client.>   rB   rê   rî   r=   rB   úchatgpt.comrð   r  r{  úinference-api.nousresearch.comrÃ  rÉ  rà   rë  râ   r­  rÕ   r  r7  rè   r   )rD  rK  Nr\   rÆ  rÿ   )rû   rI   ro   r4   r  rJ   r?  rD  rB  r5   rK   )
rå  rZ   r  rø   r�  ÚrtÚrt_providerrD  rN  Úrt_bases
             r   Ú_recoverable_pool_providerrì  î  sê  € õ )Ð):Ñ;Ô;€JØÐ/Ð/Ð/ØÐÝ�w�v˜z¨2Ñ.Ô.Ð4°"Ñ5Ô5€DÝ˜T =Ñ1Ô1ð Øˆ~Ý˜T ?Ñ3Ô3ð Øˆ|Ý˜TÐ#CÑDÔDð ØˆvÝ˜TÐ#6Ñ7Ô7ð Øˆ{Ý˜TÐ#6Ñ7Ô7ð ØˆyÝ˜T >Ñ2Ô2ð Øˆ}Ý˜T :Ñ.Ô.ð Øˆ{ð ð Ý$ \Ñ2Ô2ˆØ—f’f˜Z¨Ñ,Ô,ˆØð 		˜;Ð.DÐDÐDðØ=Ð=Ð=Ð=Ð=Ð=Ø+×/Ò/°Ñ<Ô<�Øð +�w w°¸TÑBÔBÀiÒOÐOÝ!¥'¨'Ð3GÈÑ"LÔ"LÐ"RÐPRÑSÔS×ZÒZÐ[^Ñ_Ô_�GØð +Õ#8¸Õ?PÐQXÑ?YÔ?YÑ#ZÔ#Zð +Ø*Ð*øøÝð ð ð Ø�ðøøøàˆ4s   Ã"BE) Å)
E6Å5E6©Úfailed_api_keyrî  c                ó´  — t          | ¦  «        }	 t          |¦  «        }n4# t          $ r'}t                               d||¦  «         Y d}~dS d}~ww xY w|r|                     ¦   «         sdS t          |dd¦  «        }t          |¦  «        }|pd}t          |¦  «        rX| 	                    ¦   «         }	|	�t          |¦  «         dS |                     |�|nd||¬¦  «        }
|
�t          |¦  «         dS dS t          |¦  «        st          |¦  «        rBt          |¦  «        rdnd	}|                     |�|n|||¬¦  «        }
|
�t          |¦  «         dS dS )
av  Try same-provider credential-pool recovery for auxiliary calls.

    ``failed_api_key`` is the API key that was actually used for the failing
    request.  Passing it lets mark_exhausted_and_rotate identify the correct
    pool entry even when another process has already rotated the pool (which
    would leave current() as None, causing the wrong entry to be marked).
    z9Auxiliary client: could not load pool for %s recovery: %sNFrs  Tr´  )rs  Úerror_contextÚapi_key_hintrt  rw  )rû   r/   rK   rX   rx   r³  ro   rä  r·  r'  rÙ  Úmark_exhausted_and_rotater‹  r™  )rè   r¥   rî  rø   rµ  Úload_excrs  rð  Úhintr)  Ú
next_entryÚfallback_statuss               r   Ú_recover_provider_poolr÷    s¼  € õ )¨Ñ2Ô2€JðÝ˜Ñ$Ô$ˆˆøÝð ð ð Ý�ŠÐPÐR\Ð^fÑgÔgÐgØˆuˆuˆuˆuˆuøøøøðøøøð ð �t×+Ò+Ñ-Ô-ð Øˆuå˜#˜}¨dÑ3Ô3€KÝ'¨Ñ,Ô,€MØÐ!˜T€Då�cÑÔð Ø×,Ò,Ñ.Ô.ˆ	ØÐ Ý! *Ñ-Ô-Ð-Ø�4Ø×3Ò3Ø'2Ð'>˜˜ÀCØ'Øð 4ñ 
ô 
ˆ
ð
 Ð!Ý! *Ñ-Ô-Ð-Ø�4Øˆuå˜ÑÔð 	Õ!5°cÑ!:Ô!:ð 	Ý!2°3Ñ!7Ô!7Ð@˜#˜#¸SˆØ×3Ò3Ø'2Ð'>˜˜ÀOØ'Øð 4ñ 
ô 
ˆ
ð
 Ð!Ý! *Ñ-Ô-Ð-Ø�4Øˆ5s   ‘! ¡
A«AÁA)rn  Úresolved_modelÚresolved_base_urlÚresolved_api_keyÚresolved_api_moderL  rå  r§  r¥  rù  Úeffective_timeoutÚeffective_extra_bodyrª  rn  c                 óþ  — | dk    rt          ||||d¬¦  «        \  }}}n(t          ||||||¬¦  «        \  }}t          ||¦  «        }|€t          d| pd› d|› d�¦  «        ‚t	          t          |d	d
¦  «        pd
¦  «        }t          |p||p|||	|
|||||p|| ¬¦  «        }|rt          |¦  «        |d<   t          ||¦  «        rt          |d         ¦  «        |d<   t          t          ||||¬¦  «        | ¦  «        S )Nrs  F©rè   rý   r=   r\   rO   )r=   r\   rù  r  ú
Auxiliary rk  ú: provider ú$ could not be rebuilt after recoveryr=   rB   ©r§  r¥  rù  r6  rð  rª  r=   r°  rn  rå  rÊ  )Úresolve_vision_provider_clientÚ_get_cached_clientÚ_effective_provider_for_clientrN  rI   ro   Ú_build_call_kwargsro  Ú_is_anthropic_compat_endpointÚ#_convert_openai_images_to_anthropicÚ_validate_llm_responserå  )r°  rå  rø  rù  rú  rû  r  rL  rå  r§  r¥  rù  rü  rý  rª  rn  Úeffective_providerÚretry_clientÚretry_modelÚ
retry_baseÚretry_kwargss                        r   Ú_retry_same_provider_syncr  J  s™  € ð& ˆxÒÐÝ8VØ&ØØ&Ø$Øð9
ñ 9
ô 9
Ñ5Ð˜L¨+¨+õ %7ØØØ&Ø$Ø&Ø%ð%
ñ %
ô %
Ñ!ˆ�kõ <ØÐ+ñ
ô 
Ðð ÐÝØk˜˜ ÐkÐkÐ4EÐkÐkÐkñ
ô 
ð 	
õ •W˜\¨:°rÑ:Ô:Ð@¸bÑAÔA€JÝ%ØÐ/Ð/ØÐ"�{ØØØØØ!Ø'Ø)ØÐ0Ð0Øðñ ô €Lð  ð <Ý(,¨]Ñ(;Ô(;ˆ�_Ñ%Ý$Ð%6¸
ÑCÔCð aÝ#FÀ|ÐT^ÔG_Ñ#`Ô#`ˆ�ZÑ Ý!ÝØØØ&Ø&ð		
ñ 	
ô 	
ð 	ñô ð r   c              ƒ   ó  K  — | dk    rt          ||||d¬¦  «        \  }}}n(t          ||d|||¬¦  «        \  }}t          ||¦  «        }|€t          d| pd› d|› d�¦  «        ‚t	          t          |d	d
¦  «        pd
¦  «        }t          |p||p||||	|
||||p|| ¬¦  «        }|rt          |¦  «        |d<   t          ||¦  «        rt          |d         ¦  «        |d<   t          t          ||||¬¦  «        ƒ d {V —†| ¦  «        S )Nrs  Trÿ  )rO   r=   r\   rù  r   rk  r  r  r=   rB   r  rn  rå  rÊ  )r  r  r  rN  rI   ro   r  ro  r  r	  r
  ré  )r°  rå  rø  rù  rú  rû  rL  rå  r§  r¥  rù  rü  rý  rª  rn  r  r  r  r  r  s                       r   Ú_retry_same_provider_asyncr  –  s»  è è € ð$ ˆxÒÐÝ8VØ&ØØ&Ø$Øð9
ñ 9
ô 9
Ñ5Ð˜L¨+¨+õ %7ØØØØ&Ø$Ø&ð%
ñ %
ô %
Ñ!ˆ�kõ <ØÐ+ñ
ô 
Ðð ÐÝØk˜˜ ÐkÐkÐ4EÐkÐkÐkñ
ô 
ð 	
õ •W˜\¨:°rÑ:Ô:Ð@¸bÑAÔA€JÝ%ØÐ/Ð/ØÐ"�{ØØØØØ!Ø'Ø)ØÐ0Ð0Øðñ ô €Lð ð <Ý(,¨]Ñ(;Ô(;ˆ�_Ñ%Ý$Ð%6¸
ÑCÔCð aÝ#FÀ|ÐT^ÔG_Ñ#`Ô#`ˆ�ZÑ Ý!Ý%ØØØ&Ø&ð	
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	ñô ð r   c                 ó„  — t          | ¦  «        }	 |dk    ryddlm}m}m}m}  |¦   «         \  }}t          |pd¦  «                             ¦   «         sdS |                      ||¦  «        d¦  «          ||¦  «         t          |¦  «         dS |dk    r\dd	l
m}  |d¬
¦  «        }	t          |	                     dd¦  «        pd¦  «                             ¦   «         sdS t          |¦  «         dS |dk    rkddl
m}
  |
t          dd¦  «        d¬¦  «        }	t          |	                     dd¦  «        pd¦  «                             ¦   «         sdS t          |¦  «         dS |dk    r®ddlm}m}m}  |¦   «         }	t'          |	t(          ¦  «        r |	                     d¦  «        r ||	¦  «        nd}t          |pd¦  «                             ¦   «         s
 |¦   «         }t          |pd¦  «                             ¦   «         sdS t          |¦  «         dS |dk    rît+          |¦  «        }|r�|                     ¦   «         rm|                     ¦   «          |                     ¦   «         }|�Ct          t3          |dd¦  «        pd¦  «                             ¦   «         rt          |¦  «         dS ddl
m}  |d¬
¦  «        }	t          |	                     dd¦  «        pd¦  «                             ¦   «         sdS t          |¦  «         dS |dk    rzddlm}  |¦   «         \  }}t'          |t          ¦  «        r|                     ¦   «         sdS t'          |t          ¦  «        r|                     ¦   «         sdS t          |¦  «         dS n4# t:          $ r'}t<                               d||¦  «         Y d}~dS d}~ww xY wdS )zERefresh short-lived credentials for OAuth-backed auxiliary providers.râ   r   )Ú
_jwt_cacheÚ_token_fingerprintÚexchange_copilot_tokenÚresolve_copilot_tokenrB   FNTrð   )Ú!resolve_codex_runtime_credentialsr#  r\   rÃ  r,  r.  r/  r0  rà   )Úread_claude_code_credentialsÚ_refresh_oauth_tokenrO  ÚrefreshTokenr7  r¿  r:  Úvertex)Úget_vertex_configz7Auxiliary provider credential refresh failed for %s: %s) rû   Úhermes_cli.copilot_authr  r  r  r  rI   rò   r´  rÙ  r?  r  rJ   r-  r6   rœ  r  r  rO  r$   ro  r/   r³  r´  r'  ro   r;  Úagent.vertex_adapterr  rK   rX   rx   )rè   rø   r  r  r  r  Ú	raw_tokenÚ_sourcer  rF  r-  r  r  rO  r  rµ  r)  r;  r  r=   r¥   s                        r   Ú_refresh_provider_credentialsr"  à  sž  € å(¨Ñ2Ô2€JðTØ˜Ò"Ð"ðð ð ð ð ð ð ð ð ð ð ð ð "7Ð!6Ñ!8Ô!8ÑˆI�wÝ�y� BÑ'Ô'×-Ò-Ñ/Ô/ð Ø�uØ�NŠNÐ-Ð-¨iÑ8Ô8¸$Ñ?Ô?Ð?Ø"Ð" 9Ñ-Ô-Ð-Ý! *Ñ-Ô-Ð-Ø�4Ø˜Ò'Ð'ØIÐIÐIÐIÐIÐIà5Ð5ÀDÐIÑIÔIˆEÝ�u—y’y ¨BÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>ð Ø�uÝ! *Ñ-Ô-Ð-Ø�4Ø˜ÒÐØHÐHÐHÐHÐHÐHà4Ð4Ý )Ð*GÈÑ LÔ LØ"ðñ ô ˆEõ �u—y’y ¨BÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>ð Ø�uÝ! *Ñ-Ô-Ð-Ø�4Ø˜Ò$Ð$Ø{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{à0Ð0Ñ2Ô2ˆEÝ3=¸eÅTÑ3JÔ3JÐrÈuÏyÊyÐYgÑOhÔOhÐrÐ(Ð(¨Ñ/Ô/Ð/ÐnrˆEÝ�u�{ Ñ#Ô#×)Ò)Ñ+Ô+ð 2Ø/Ð/Ñ1Ô1�Ý�u�{ Ñ#Ô#×)Ò)Ñ+Ô+ð Ø�uÝ! *Ñ-Ô-Ð-Ø�4Ø˜Ò$Ð$õ ˜ZÑ(Ô(ˆDØð  ˜×,Ò,Ñ.Ô.ð  à—’‘”�Ø ×4Ò4Ñ6Ô6�	ØÐ(­Sµ¸ÐDUÐWYÑ1ZÔ1ZÐ1`Ð^`Ñ-aÔ-a×-gÒ-gÑ-iÔ-iÐ(Ý)¨*Ñ5Ô5Ð5Ø˜4ØMÐMÐMÐMÐMÐMà9Ð9ÈÐMÑMÔMˆEÝ�u—y’y ¨BÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>ð Ø�uÝ! *Ñ-Ô-Ð-Ø�4Ø˜Ò!Ð!ð ?Ð>Ð>Ð>Ð>Ð>à/Ð/Ñ1Ô1‰OˆE�8Ý˜e¥SÑ)Ô)ð °·²±´ð Ø�uÝ˜h­Ñ,Ô,ð °H·N²NÑ4DÔ4Dð Ø�uÝ! *Ñ-Ô-Ð-Ø�4ð# "øõ$ ð ð ð Ý�ŠÐNÐPZÐ\_Ñ`Ô`Ð`Øˆuˆuˆuˆuˆuøøøøðøøøð ˆ5sl   ‘AN Á9N ÂAN Ã!N Ã2AN ÅN Å#B!N ÈN ÈBN Ê/A	N Ë:N ÌAN Í)N Í:N Î
N=ÎN8Î8N=Úclient_base_urlc                 óÈ   — t          | ¦  «        }|r|dk    r|S t          |d¦  «        rdS t          |d¦  «        rdS t          |d¦  «        rdS t          |d¦  «        rd	S |S )
ud  Return the provider whose short-lived credentials should be refreshed.

    Auto-routed auxiliary calls keep ``resolved_provider == "auto"`` even
    after _get_cached_client() selects a concrete backend. Infer the backend
    from the selected client's base URL so auth refresh works for auto â†’
    Copilot/Codex/Anthropic/Nous routes too. (#20832)
    rê   úapi.githubcopilot.comrâ   rç  rð   rÉ  rà   rè  rÃ  )rû   r4   )rå  r#  rø   s      r   Ú _auth_refresh_provider_for_router&  ;  s�   € õ )Ð):Ñ;Ô;€JØð �j FÒ*Ð*ØÐÝ˜_Ð.EÑFÔFð ØˆyÝ˜_¨mÑ<Ô<ð Øˆ~Ý˜_Ð.AÑBÔBð Øˆ{Ý˜_Ð.NÑOÔOð ØˆvØÐr   Úfb_labelc                 óZ  — | r|sdS t          j        d|¦  «        }|sdS 	 t          | ¦  «                             d¦  «        }t	          |t
          ¦  «        r(|t          |                     d¦  «        ¦  «                 nd}n# t          $ r Y dS w xY wt	          |t          ¦  «        r|ndS )a[  Resolve the configured ``fallback_chain`` entry a label points at.

    Labels minted by :func:`_try_configured_fallback_chain` carry the entry
    index in our own stable format (``fallback_chain[<i>](<provider>)``).
    Returns ``None`` when the label is not a configured-chain candidate or
    the index no longer resolves to a dict entry.
    Nzfallback_chain\[(\d+)\]Úfallback_chainrí   )
ÚreÚmatchÚ_get_auxiliary_task_configrJ   r$   rE  r…  ÚgrouprK   ro  )r°  r'  r8  Úchainr½  s        r   Ú_fallback_chain_entryr/  T  sÃ   € ð ð �xð ØˆtÝ
ŒÐ+¨XÑ6Ô6€AØð ØˆtðÝ*¨4Ñ0Ô0×4Ò4Ð5EÑFÔFˆÝ*4°U½DÑ*AÔ*AÐK�•c˜!Ÿ'š' !™*œ*‘o”oÔ&Ð&ÀtˆˆøÝð ð ð Øˆtˆtðøøøå˜u¥dÑ+Ô+Ð5ˆ5ˆ5°Ð5s   ¡A!B Â
BÂBc                 óä   — t          | |¦  «        }|r|                     d¦  «        nd}t          |t          t          f¦  «        r*t          |t
          ¦  «        s|dk    rt	          |¦  «        S dS )u,  Resolve a per-entry ``timeout`` for a configured fallback candidate.

    A fallback candidate previously inherited the exact timeout the primary
    provider was called with. When that deadline was tuned for the primary
    (or the primary simply consumed its whole budget before failing over),
    the fallback aborted on the same clock even when independently healthy â€”
    a 163k-token compression that needs ~90s on the fallback died at the
    primary's 30s deadline every turn (#62452).

    Entries in ``auxiliary.<task>.fallback_chain`` may declare their own
    ``timeout`` (seconds). Returns ``None`` when the label is not a
    configured-chain candidate, the entry has no ``timeout``, or the value
    is invalid â€” callers then keep the task-level timeout, preserving
    existing behavior.
    r6  Nr   )r/  rJ   r$   r…  r'  rn   )r°  r'  r½  Úraws       r   Ú_fallback_entry_timeoutr2  i  sn   € õ  " $¨Ñ1Ô1€EØ"'Ð
1ˆ%�)Š)�IÑ
Ô
Ð
¨T€CÝ�#��U�|Ñ$Ô$ð ­Z¸½TÑ-BÔ-Bð ÀsÈQÂwÀwÝ�S‰zŒzÐØˆ4r   c                 óÈ   — t          j        d| pd¦  «        }|r'|                     d¦  «                             ¦   «         n"t	          | pd¦  «                             ¦   «         S )z>Recover the provider identifier from a fallback display label.z0(?:fallback_chain\[\d+\]|main-agent)\(([^)]+)\)$rB   rí   )r*  r+  r-  rò   rI   )rh  r+  s     r   Ú_fallback_provider_from_labelr4  €  sW   € åŒHÐHÈ%È+ÐSUÑVÔV€EØ%*ÐHˆ5�;Š;�q‰>Œ>×ÒÑ!Ô!Ð!µ°E°K¸RÑ0@Ô0@×0FÒ0FÑ0HÔ0HÐHr   c                   óP   — e Zd ZU eed<   eed<   ee         ed<   ee         ed<   dS )Ú_FallbackDestinationrè   r=   rù  rý   N)r*   r+   r,   rI   Ú__annotations__r
   r   r   r   r6  r6  †  sD   € € € € € € Ø€M€M�MØ€M€M�MØ�sŒmÐÐÑØ�CŒ=ÐÐÑÐÐr   r6  c                 ó  — |stt          |¦  «        rd}nb	 ddlm}  || |pd |pd¬¦  «        }t          |                     d¦  «        pd¦  «                             ¦   «         pd }n# t          $ r Y nw xY wt          | |||¦  «        S )Nr±  r   r  rB   )r  rC  rH  rù  )r÷  r  r  rI   rJ   rò   rK   r6  )rè   r=   rù  rý   r  r|  s         r   Ú_complete_fallback_destinationr9  �  sÊ   € ð ð Ý.¨xÑ8Ô8ð 	Ø+ˆHˆHð
ØPÐPÐPÐPÐPÐPà2Ð2Ø&Ø&.Ð&6°$Ø!& ¨"ðñ ô �õ
 ˜wŸ{š{¨:Ñ6Ô6Ð<¸"Ñ=Ô=×CÒCÑEÔEÐMÈ��øÝð ð ð Ø�ðøøøå ¨(°H¸eÑDÔDÐDs   –AA' Á'
A4Á3A4Ú	fb_clientÚfb_modelc                 ó.  — t          |                      d¦  «        pd¦  «                             ¦   «         }t          |                      d¦  «        pt          |dd¦  «        pd¦  «                             ¦   «         }t          |                      d¦  «        p|                      d¦  «        pd¦  «                             ¦   «         pd }|p7t          |                      d¦  «        pd¦  «                             ¦   «         pd }t	          ||||¦  «        S )Nrè   rB   r=   rù  Ú	transportrý   )rI   rJ   rò   ro   r9  )r½  r:  r;  rè   r=   rù  rý   s          r   Ú _fallback_destination_from_entryr>  ¥  s  € õ
 �5—9’9˜ZÑ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7€HÝØ�	Š	�*ÑÔÐI¥¨°JÀÑ!CÔ!CÐIÀrñô ç‚e�g„gð õ Ø�	Š	�*ÑÔÐ= §¢¨;Ñ!7Ô!7Ð=¸2ñô ç‚e�g„gðàð ð ÐE�˜EŸIšI gÑ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ÐEÀ€EÝ)¨(°H¸hÈÑNÔNÐNr   c                 ó"  — t          |dd¦  «        }t          |t          ¦  «        r|S t          |¦  «        }t	          t          |dd¦  «        pd¦  «        }d}|}t          | |¦  «        }	|	�t          |	||¦  «        S t          ||||¦  «        S )z>Return the resolved route identity used by a fallback request.Ú_hermes_fallback_destinationNr=   rB   )ro   r$   r6  r4  rI   r/  r>  r9  )
r°  r:  r;  r'  Úattachedrè   r=   rù  rý   r½  s
             r   Ú_fallback_destinationrB  µ  sž   € õ �yÐ"@À$ÑGÔG€HÝ�(Õ0Ñ1Ô1ð Øˆå,¨XÑ6Ô6€HÝ•7˜9 j°"Ñ5Ô5Ð;¸Ñ<Ô<€HØ€HØ€Eå! $¨Ñ1Ô1€EØÐÝ/°°yÀ(ÑKÔKÐKå)¨(°H¸hÈÑNÔNÐNr   Údestinationc                ó`   — ddl m}  || ||j        |j        |j        pd|j        pd¬¦  «        S )zEStrip source decoration and plan one synchronous destination locally.r   )Ú#plan_cache_sections_for_destinationrB   )rè   r=   rù  rý   )Úagent.agent_runtime_helpersrE  rè   r=   rù  rý   )rå  rù  rC  rE  s       r   Ú"_replan_synchronous_cache_sectionsrG  Ì  sY   € ð PÐOÐOÐOÐOÐOà.Ð.ØØØÔ%ØÔ%ØÔ%Ð+¨ØÔÐ% 2ðñ ô ð r   c                ó‚  — t          ||¦  «        }|�(||k    r"t                               d|pd|||¦  «         |}t          || ||¦  «        }t	          |||¬¦  «        \  }}t          |j        |j        ||||||	|
|j        |¬¦  «        }	 t          t          | ||j        |j        ¬¦  «        |¦  «        S # t          $ �r|}t          |¦  «        s‚ t          |j        |j        ¦  «        }|dv�rt          |¦  «        �rt!          ||j        |j        pd|j        ¬¦  «        \  }}|�Ùt#          ||j        pt%          t'          |d	d
¦  «        pd
¦  «        |j        |p|j        ¦  «        }t	          |||¬¦  «        \  }}t          |j        |j        ||||||	|
|j        |¬¦  «        }	 t          t          |||j        |j        ¬¦  «        |¦  «        cY d}~S # t          $ r}t          |¦  «        s‚ Y d}~nd}~ww xY wt)          |p|¦  «         t                               d|pd||¦  «         Y d}~dS d}~ww xY w)u5  Call one fallback candidate with stale-credential recovery.

    A fallback candidate can itself carry a stale credential (e.g. an expired
    ``ANTHROPIC_TOKEN`` picked up by ``_try_anthropic``). Before this helper,
    such a 401 propagated out of the fallback site and aborted the auxiliary
    task (for compression: a 60s cooldown + context marker) even though other
    healthy candidates remained. Live case: a Codex-timeout â†’ Anthropic
    fallback 401-looped five times in one session (mattalachia debug dump,
    Jul 2026).

    On an auth error: refresh the candidate's provider credentials and retry
    once with a rebuilt client; if the retry also auth-fails (non-refreshable
    expired token), mark the provider unhealthy and return ``None`` so the
    caller can continue to the next fallback layer. Non-auth errors raise.

    ``effective_timeout`` is the task-level deadline; a configured-chain
    candidate with its own ``timeout`` entry gets that instead, so a
    fallback tuned differently from the primary is allowed its own budget
    (#62452).
    NúJAuxiliary %s: %s using its configured timeout %.0fs (task-level was %.0fs)rk  ©rC  r  rÊ  >   NrB   rê   )r=   rù  r=   rB   uk   Auxiliary %s: fallback candidate %s has a stale/unrefreshable credential (%s) â€” skipping to next fallback)r2  rX   rl  rB  rG  r  rè   rý   r=   r
  rå  rù  rK   r·  r&  r"  r  r6  rI   ro   rl  rY   ©r:  r;  r'  r°  rå  r§  r¥  rù  rü  rý  rª  Ú
fb_timeoutrC  Úfallback_messagesÚfallback_toolsÚ	fb_kwargsÚfb_errÚfb_providerr  r  Úretry_destinationÚretry_messagesÚretry_toolsr  Ú	retry_errs                            r   Ú_call_fallback_candidate_syncrV  ß  sS  € õD )¨¨xÑ8Ô8€JØÐ *Ð0AÒ"AÐ"AÝ�Šð%àˆN�F˜H jÐ2Cñ	
ô 	
ð 	
ð
 'ÐÝ'¨¨i¸À8ÑLÔL€KÝ(JØØØð)ñ )ô )Ñ%Ð�~õ
 #ØÔ˜kÔ/Ð1BØ¨JØÐ&7Ø'Ð:JØÔ%¨Dð2ñ 2ô 2€IðDÝ%Ý"ØØØ$Ô-Ø$Ô-ð	ñ ô ð ñ
ô 
ð 	
øõ ð :ñ :ð :Ý˜fÑ%Ô%ð 	ØÝ6ØÔ  +Ô"6ñ
ô 
ˆð Ð0Ð0Ñ0Õ5RÐS^Ñ5_Ô5_Ñ0Ý(:ØØÔ!Ø$Ô-Ð5°Ø$Ô-ð	)ñ )ô )Ñ%ˆL˜+ð Ð'Ý$8ØØÔ(ð HÝ�7 <°¸RÑ@Ô@ÐFÀBÑGÔGØÔ(ØÐ4 ;Ô#4ñ%ô %Ð!õ /QØØØ 1ð/ñ /ô /Ñ+� õ
  2Ø%Ô.Ø%Ô+Ø"Ø +¸
Ø%Ð/@Ø3Ø%5Ø.Ô7¸dð Dñ  Dô  D�ðÝ1Ý.Ø(Ø(Ø%6Ô%?Ø%6Ô%?ð	ñ ô ð ñô ð ð ð ð ð ð øõ !ð ð ð Ý)¨)Ñ4Ô4ð Øðð ð ð ð øøøøðøøøõ 	! Ð!8°Ñ9Ô9Ð9Ý�Šð<àˆN�F˜H fñ	
ô 	
ð 	
ð
 ˆtˆtˆtˆtˆtøøøøðu:øøøsC   Â*B7 Â7H>ÃC)H9Æ,*GÇH>Ç
H Ç&G;Ç6H9Ç;H È 3H9È9H>c             ƒ   ó   K  — t          ||¦  «        }|�(||k    r"t                               d|pd|||¦  «         |}t          || ||¦  «        }t	          |||¬¦  «        \  }}t          |j        |j        ||||||	|
|j        |¬¦  «        }	 t          t          | ||j        |j        ¬¦  «        ƒ d{V —†|¦  «        S # t          $ �rƒ}t          |¦  «        s‚ t          |j        |j        ¦  «        }|dv�rt          |¦  «        �r	t!          ||j        d|j        pd|j        ¬	¦  «        \  }}|�ßt#          ||j        pt%          t'          |d
d¦  «        pd¦  «        |j        |p|j        ¦  «        }t	          |||¬¦  «        \  }}t          |j        |j        ||||||	|
|j        |¬¦  «        }	 t          t          |||j        |j        ¬¦  «        ƒ d{V —†|¦  «        cY d}~S # t          $ r}t          |¦  «        s‚ Y d}~nd}~ww xY wt)          |p|¦  «         t                               d|pd||¦  «         Y d}~dS d}~ww xY w)z6Async mirror of :func:`_call_fallback_candidate_sync`.NrI  rk  rJ  r  rÊ  >   NrB   rê   T)rO   r=   rù  r=   rB   us   Auxiliary %s (async): fallback candidate %s has a stale/unrefreshable credential (%s) â€” skipping to next fallback)r2  rX   rl  rB  rG  r  rè   rý   r=   r
  ré  rù  rK   r·  r&  r"  r  r6  rI   ro   rl  rY   rK  s                            r   Ú_call_fallback_candidate_asyncrX  \  s•  è è € õ )¨¨xÑ8Ô8€JØÐ *Ð0AÒ"AÐ"AÝ�Šð%àˆN�F˜H jÐ2Cñ	
ô 	
ð 	
ð
 'ÐÝ'¨¨i¸À8ÑLÔL€KÝ(JØØØð)ñ )ô )Ñ%Ð�~õ
 #ØÔ˜kÔ/Ð1BØ¨JØÐ&7Ø'Ð:JØÔ%¨Dð2ñ 2ô 2€IðAÝ%Ý)ØØØ$Ô-Ø$Ô-ð	ñ ô ð ð ð ð ð ð ð ñ
ô 
ð 	
øõ ð 7ñ 7ð 7Ý˜fÑ%Ô%ð 	ØÝ6ØÔ  +Ô"6ñ
ô 
ˆð Ð0Ð0Ñ0Õ5RÐS^Ñ5_Ô5_Ñ0Ý(:ØØÔ!ØØ$Ô-Ð5°Ø$Ô-ð)ñ )ô )Ñ%ˆL˜+ð Ð'Ý$8ØØÔ(ð HÝ�7 <°¸RÑ@Ô@ÐFÀBÑGÔGØÔ(ØÐ4 ;Ô#4ñ%ô %Ð!õ /QØØØ 1ð/ñ /ô /Ñ+� õ
  2Ø%Ô.Ø%Ô+Ø"Ø +¸
Ø%Ð/@Ø3Ø%5Ø.Ô7¸dð Dñ  Dô  D�ðÝ1Ý5Ø(Ø(Ø%6Ô%?Ø%6Ô%?ð	ñ ô ð ð ð ð ð ð ð ñô ð ð ð ð ð ð øõ !ð ð ð Ý)¨)Ñ4Ô4ð Øðð ð ð ð øøøøðøøøõ 	! Ð!8°Ñ9Ô9Ð9Ý�Šð<àˆN�F˜H fñ	
ô 	
ð 	
ð
 ˆtˆtˆtˆtˆtøøøøðo7øøøsC   Â0B? Â?IÃ
C*IÆ50G+Ç%IÇ+
HÇ5H
ÈIÈ
HÈ3IÉIúpayment errorÚfailed_providerr  c           	      óÊ  ‡— |                       ¦   «                              ¦   «         }t          ¦   «         }|h}|r=|                      ¦   «         |v r'|                     |                      ¦   «         ¦  «         dddddddœŠˆfd„|D ¦   «         }g }t	          ¦   «         D ]�\  }}	||v rŒ
t          |¦  «        r)t          ||¦  «         |                     |› d�¦  «         ŒB |	¦   «         \  }
}|
�*t           	                    d	|pd
|| ||pd¦  «         |
||fc S |                     |¦  «         Œ‘t           
                    d|pd
|| d                     |¦  «        ¦  «         dS )züTry alternative providers after a payment/credit or connection error.

    Iterates the standard auto-detection chain, skipping the provider that
    failed.

    Returns:
        (client, model, provider_label) or (None, None, "") if no fallback.
    r{  rÃ  rð   rT  )r{  rÃ  rð   rï   rî   rT  c                 ó<   •— h | ]}‰                      ||¦  «        ’ŒS r   )rJ   )rÀ   ÚsÚ_alias_to_labels     €r   ú	<setcomp>z(_try_payment_fallback.<locals>.<setcomp>Ü  s)   ø€ ÐHÐHÐH°q˜×,Ò,¨Q°Ñ2Ô2ÐHÐHÐHr   ú (unhealthy)Nu2   Auxiliary %s: %s on %s â€” falling back to %s (%s)rk  r$  z<Auxiliary %s: %s on %s and no fallback available (tried: %s)ú, ©NNrB   )ró   rò   rö   re  r\  rL  ro  r&  rX   rl  rY   rP  )rZ  r°  r  ÚskipÚmain_providerÚskip_labelsÚskip_chain_labelsÚtriedrh  Útry_fnrZ   rý   r^  s               @r   Ú_try_payment_fallbackri  Ã  s¼  ø€ ð × Ò Ñ"Ô"×(Ò(Ñ*Ô*€Dõ (Ñ)Ô)€MØ�&€KØð /˜×,Ò,Ñ.Ô.°$Ð6Ð6Ø�Š˜×+Ò+Ñ-Ô-Ñ.Ô.Ð.à%1¸6Ø'5ÀØ!/ÀðQð Q€Oð IÐHÐHÐH¸KÐHÑHÔHÐà€EÝ,Ñ.Ô.ð ð ‰ˆˆvØÐ%Ð%Ð%ØÝ! %Ñ(Ô(ð 	Ý  tÑ,Ô,Ð,Ø�LŠL˜EÐ/Ð/Ð/Ñ0Ô0Ð0ØØ˜™œ‰ˆ�ØÐÝ�KŠKØDØ�˜ ¨¸ÀÐ@RÈñô ð ð ˜5 %Ð'Ð'Ð'Ð'Ø�Š�UÑÔÐÐå
‡N‚NØFØˆ�˜ °·²¸5Ñ1AÔ1Añô ð ð ˆ>r   ÚerrorÚfailed_modelc                 ó   — t          ¦   «         pd                     ¦   «         }t          ¦   «         pd                     ¦   «         }|                     ¦   «         dk    rt	          |¦  «        \  }}|r|sdS ||}}|r|r|                     ¦   «         dv rdS ddlm}m}	m}
 |pd                     ¦   «                              ¦   «         pd} |
| 	                    ||¬¦  «        | 	                    | |¬¦  «        |r|	j
        n|	j        ¦  «        rdS t          |¦  «        rt          ||¦  «         dS 	 t          ||¬¦  «        \  }}n# t          $ r d	\  }}Y nw xY w|€dS d
|› d�}t                                d|pd|| ||p|¦  «         ||p||fS )ué  Last-resort fallback to the user's main agent provider + model.

    Used after the configured fallback_chain is exhausted (or empty) for
    users with an explicit auxiliary provider.  This is the "safety net"
    layer: if nothing the user asked for can serve the request, try the
    main chat model before giving up.

    ``failed_model`` narrows the same-provider skip to the exact
    (provider, model) pair that just failed, mirroring
    :func:`_try_configured_fallback_chain`.  This matters for self-hosted /
    custom endpoints serving several models behind one provider label: the
    aux compression model timing out says nothing about the health of the
    main agent model deployed on the same URL (real incident: aux
    ``glm-5.2`` hung and timed out while main ``macaron-v1-venti`` on the
    identical endpoint was serving 448K-token turns fine â€” the
    provider-label skip discarded the one fallback that would have worked).

    - Model-specific runtime failures (timeout, connection, rate limit,
      model-incompatible, invalid response) pass ``failed_model``: skip the
      main model only when it IS the exact model that failed.
    - Provider-wide failures (auth 401, payment 402) and legacy callers
      leave ``failed_model`` as None, keeping the whole-provider skip â€”
      the shared credentials/account are broken, so the main model on the
      same provider cannot help either.

    Returns:
        (client, model, provider_label) or (None, None, "") if no fallback.
    rB   r”  rb  >   rB   rê   r   ©ÚBackendIdentityÚFailureScopeÚshould_skip_candidateN©rè   rý   rE  zmain-agent(ú)uC   Auxiliary %s: %s on %s â€” falling back to main agent model %s (%s)rk  )rö   rò   r‡  ró   r›  Úagent.backend_identityrn  ro  rp  ÚbuildÚMODELÚ
CREDENTIALrL  ro  Úresolve_provider_clientrK   rX   rl  )rZ  r°  r  rk  rd  Ú
main_modelÚ_agg_providerÚ
_agg_modelrn  ro  rp  Ú
skip_modelrZ   rø  rh  s                  r   Ú_try_main_agent_model_fallbackr|  ö  s7  € õD )Ñ*Ô*Ð0¨b×7Ò7Ñ9Ô9€MÝ"Ñ$Ô$Ð*¨×1Ò1Ñ3Ô3€JØ×ÒÑÔ Ò%Ð%õ %<¸JÑ$GÔ$GÑ!ˆ�zØð 	" Jð 	"Ø!�>Ø$1°:�zˆØð  
ð ¨m×.AÒ.AÑ.CÔ.CÀ|Ð.SÐ.SØˆ~ð
ð ð ð ð ð ð ð ð ð ð Ð$ "×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5Ð=¸€JØÐØ×Ò }¸JÐÑGÔGØ×Ò ¸jÐÑIÔIØ(ÐEˆÔÐ¨lÔ.Eñô ð ð ˆ~Ý˜mÑ,Ô,ð Ý˜M¨4Ñ0Ô0Ð0Øˆ~ð,Ý!8Ø"¨*ð"
ñ "
ô "
Ñˆ��øõ ð ,ð ,ð ,Ø!+Ñˆ���ð,øøøð €~Øˆ~à*˜-Ð*Ð*Ð*€EÝ
‡K‚KØMØˆ�˜ °¸Ð8TÈ*ñô ð ð �>Ð/ Z°Ð6Ð6s   Ä2E ÅEÅEc                 ó(   — | sdS | dk    rt           S dS )uj  Return the minimum context length required for an auxiliary task.

    Only ``compression`` carries an explicit minimum today (the same
    ``MINIMUM_CONTEXT_LENGTH`` (64K) floor that
    ``check_compression_model_feasibility`` already enforces at startup).
    Other tasks (``vision``, ``title_generation``, ``web_extract``,
    ``skills_hub``, ``mcp``, ``session_search``) return ``None`` â€” they
    have no per-task context floor and the runtime chain must remain
    permissive for them.

    Returns ``None`` for an empty/``None`` task name so the helper is a
    safe no-op when called from generic sites.
    NÚcompression)r0   )r°  s    r   Ú_task_minimum_context_lengthr  _  s'   € ð ð ØˆtØˆ}ÒÐÝ%Ð%Øˆ4r   c                 óÜ   — |sdS 	 t          |||| ¬¦  «        }n5# t          $ r(}t                               d| ||¦  «         Y d}~dS d}~ww xY wt	          |t
          ¦  «        r|dk    r|S dS )u9  Resolve the effective context window for a fallback candidate.

    Thin wrapper around :func:`agent.model_metadata.get_model_context_length`
    that swallows probe failures (returns ``None``). Callers treat
    ``None`` as "unknown â€” pass through" so the existing fallback
    surface is preserved when the context-length resolver chain cannot
    determine a value (custom endpoints, models not in the registry,
    offline endpoints).

    Best-effort, never raises â€” the runtime fallback chain must keep
    moving even if the resolver hits a probe error.
    N)r=   r\   rè   zBAuxiliary fallback: could not resolve context window for %s/%s: %sr   )r1   rK   rX   rx   r$   r…  )rè   rý   r=   r\   Úctxr¥   s         r   Ú_candidate_context_windowr‚  t  s®   € ð$ ð ØˆtðÝ&ØØØØð	
ñ 
ô 
ˆˆøõ ð ð ð Ý�ŠØPØ�e˜Sñ	
ô 	
ð 	
ð ˆtˆtˆtˆtˆtøøøøðøøøõ �#•sÑÔð   a¢ Øˆ
Øˆ4s   † š
A¤AÁAc                 ó’  — | sdS t          | ¦  «        }|                     d¦  «        }|rt          |t          ¦  «        sdS |pd                     ¦   «                              ¦   «         pd}ddlm}m}m	}	 | 
                    ||¬¦  «        }
|r|j        n|j        }g }t          | ¦  «        }t          |¦  «        D �]×\  }}t          |t          ¦  «        sŒt!          |                     dd¦  «        ¦  «                             ¦   «         }|sŒTt!          |                     d	d¦  «        ¦  «                             ¦   «         } |	| 
                    ||t!          |                     d
¦  «        pd¦  «        ¬¦  «        |
|¦  «        rŒÏ|pd}d|› d|› d�}	 t#          |¦  «        \  }}n# t$          $ r d\  }}Y nw xY w|�»|��|r‹t'          ||t!          |                     d
¦  «        pd¦  «        t)          |¦  «        pd¬¦  «        }|�E||k     r?t*                               d| ||||¦  «         |                     |› d|› d|› d�¦  «         �Œ–t*                               d| ||||p|pd¦  «         ||p||fc S |                     |¦  «         �ŒÙ|r/t*                               d| d                     |¦  «        ¦  «         dS )uë  Try user-configured fallback_chain for a specific auxiliary task.

    Reads auxiliary.<task>.fallback_chain from config.yaml and tries each
    entry in order.  Each entry must have at least ``provider``; ``model``,
    ``base_url``, and ``api_key`` are optional.

    ``failed_model`` narrows the skip check to the exact (provider, model)
    pair that just failed, rather than the whole provider. Without it every
    entry sharing the failed provider is skipped (the original behaviour).
    Callers pass it only when a sibling model on the same provider could
    plausibly recover:

    - Model-specific runtime failures (timeout, connection, rate limit,
      model-incompatible, invalid response) pass ``failed_model`` so a
      chain that intentionally lists several models under the same provider
      â€” e.g. two more NVIDIA NIM models after the primary NIM model times
      out â€” is not skipped wholesale. Only the exact model that failed is
      skipped; the siblings still run instead of jumping straight to the
      main-agent-model safety net.
    - Provider-wide failures (auth 401, payment 402) and "no client could
      be built" callers leave ``failed_model`` as None, keeping the whole
      provider skipped â€” the shared credentials/account behind every model
      on that provider are broken, so a sibling can't help and the
      main-agent-model safety net should be reached instead.

    Returns:
        (client, model, provider_label) or (None, None, "") if no fallback.
    rb  r)  rB   Nr   rm  rq  rè   rý   r=   )rè   rý   r=   zfallback_chain[ú](rr  rE  r  zDAuxiliary %s: skipping %s (%s context=%d < min=%d), continuing chainú (context too small: Ú<u9   Auxiliary %s: %s on %s â€” configured fallback to %s (%s)r$  z=Auxiliary %s: configured fallback_chain exhausted (tried: %s)ra  )r,  rJ   r$   rE  rò   ró   rs  rn  ro  rp  rt  ru  rv  r  r$  ro  rI   Ú_resolve_fallback_entryrK   r‚  Ú_fallback_entry_api_keyrX   rl  r&  rx   rP  )r°  rZ  r  rk  Útask_configr.  r{  rn  ro  rp  Úfailed_identÚfailure_scoperg  Úmin_ctxÚir½  rQ  Úfb_model_rawr;  rh  r:  rø  Úfb_ctxs                          r   Ú_try_configured_fallback_chainr�  ž  s–  € ðD ð Øˆ~å,¨TÑ2Ô2€KØ�OŠOÐ,Ñ-Ô-€EØð �
 5­$Ñ/Ô/ð Øˆ~àÐ$ "×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5Ð=¸€Jðð ð ð ð ð ð ð ð ð ð #×(Ò(Ø ¨
ð )ñ ô €Lð )ÐEˆÔÐ¨lÔ.Eð ð €EÝ*¨4Ñ0Ô0€Gå˜eÑ$Ô$ð .ñ .‰ˆˆ5Ý˜%¥Ñ&Ô&ð 	ØÝ˜%Ÿ)š) J°Ñ3Ô3Ñ4Ô4×:Ò:Ñ<Ô<ˆØð 	ØÝ˜5Ÿ9š9 W¨bÑ1Ô1Ñ2Ô2×8Ò8Ñ:Ô:ˆØ Ð Ø×!Ò!Ø$Ø"Ý˜UŸYšY zÑ2Ô2Ð8°bÑ9Ô9ð "ñ ô ð
 Øñ
ô 
ð 		ð ØÐ' 4ˆà5 !Ð5Ð5 {Ð5Ð5Ð5ˆð	3Ý(?ÀÑ(FÔ(FÑ%ˆI�~�~øÝð 	3ð 	3ð 	3Ø(2Ñ%ˆI�~�~�~ð	3øøøð Ð ØÐ" ~Ð"Ý2ØØ"Ý  §¢¨:Ñ!6Ô!6Ð!<¸"Ñ=Ô=Ý3°EÑ:Ô:Ð@¸bð	ñ ô �ð Ð%¨&°7Ò*:Ð*:Ý—K’KØ^Ø˜e ^°V¸Wñô ð ð —L’L EÐ!SÐ!SÀÐ!SÐ!SÈÐ!SÐ!SÐ!SÑTÔTÐTÙÝ�KŠKØKØ�f˜o¨u°nÐ6]ÈÐ6]ÐT]ñô ð ð ˜nÐ8°¸%Ð?Ð?Ð?Ð?Ø�Š�UÑÔÐÑàð 
Ý�ŠØKØ�$—)’)˜EÑ"Ô"ñ	
ô 	
ð 	
ð ˆ>s   ÆF-Æ-F?Æ>F?c                 óŠ   — |pd                      ¦   «                              ¦   «         }| r|r|dv rdS t          | |d¬¦  «        S )a¦  Try task fallback_chain when an explicit aux provider cannot build.

    This covers the "no client" case before any request is sent: missing
    raw env key, unavailable OAuth/pool credentials, or provider resolver
    returning ``(None, None)``.  It deliberately stops at the configured
    per-task fallback chain; the main-agent model remains the last-resort
    runtime fallback for request-time capacity errors.
    rB   >   rê   rb  zprovider unavailable©r  )rò   ró   r�  )r°  rZ  Úexplicits      r   Ú/_try_configured_fallback_for_unavailable_clientr”    sd   € ð  Ð% 2×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6€HØð �xð  8¨xÐ#7Ð#7Øˆ~Ý)ØØØ%ðñ ô ð r   c                 ó$   — ddl m}  || ¦  «        S )a3  Resolve inline or env-backed API key from a fallback-chain entry.

    Delegates to the centralized, secret-scope-aware resolver so this path
    doesn't leak another profile's credential via a raw ``os.getenv`` under
    gateway multiplexing (see ``hermes_cli.fallback_config.resolve_entry_api_key``).
    r   )Úresolve_entry_api_key)Úhermes_cli.fallback_configr–  )r½  r–  s     r   rˆ  rˆ  +  s(   € ð AÐ@Ð@Ð@Ð@Ð@à Ð  Ñ'Ô'Ð'r   c                 óœ  — t          |                      d¦  «        pd¦  «                             ¦   «         }t          |                      d¦  «        pd¦  «                             ¦   «         pd}|r|sdS t          |                      d¦  «        pd¦  «                             ¦   «         pd}t          | ¦  «        }t          |                      d¦  «        p|                      d¦  «        pd¦  «                             ¦   «         pd}t	          |||||¬	¦  «        \  }}|�(	 t          | ||¦  «        |_        n# t          $ r Y nw xY w||fS )
z?Resolve one fallback entry through the central provider router.rè   rB   rý   NrE  r=   rù  r=  )rý   rC  rg  rù  )rI   rJ   rò   rˆ  rw  r>  r@  rK   )r½  rè   rý   r=   r\   rù  rZ   rø  s           r   r‡  r‡  7  sj  € å�5—9’9˜ZÑ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7€HÝ�—	’	˜'Ñ"Ô"Ð( bÑ)Ô)×/Ò/Ñ1Ô1Ð9°T€EØð ˜5ð ØˆzÝ�5—9’9˜ZÑ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7Ð?¸4€HÝ% eÑ,Ô,€GÝ�5—9’9˜ZÑ(Ô(ÐH¨E¯IªI°kÑ,BÔ,BÐHÀbÑIÔI×OÒOÑQÔQÐYÐUY€HÝ4ØØØ"Ø Øðñ ô Ñ€FˆNð Ðð	Ý2RØ�v˜~ñ3ô 3ˆFÔ/Ð/øõ ð 	ð 	ð 	ØˆDð	øøøà�>Ð!Ð!s   Ä#D: Ä:
EÅEc           
      ó‚  — 	 ddl m} ddlm}  | |¦   «         ¦  «        }n6# t          $ r)}t
                               d| pd|¦  «         Y d}~dS d}~ww xY w|sdS |pd                     ¦   «                              ¦   «         }t          ¦   «         pd                     ¦   «                              ¦   «         }d	„ ||d
fD ¦   «         }	g }
t          | ¦  «        }t          |¦  «        D �]#\  }}t          |t          ¦  «        sŒt          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «         }|r|sŒ�|                     ¦   «         }d|› d|› d�}||	v r|
                     |› d�¦  «         ŒÇt#          |¦  «        r)t%          || ¦  «         |
                     |› d�¦  «         Œÿ	 t'          |¦  «        \  }}n;# t          $ r.}t
                               d| pd||¦  «         d\  }}Y d}~nd}~ww xY w|�¾|�Žt)          ||p|t          |                     d¦  «        pd¦  «        t+          |¦  «        pd¬¦  «        }|�F||k     r@t
                               d| pd|||¦  «         |
                     |› d|› d|› d�¦  «         �Œàt
                               d| pd||pd
||p|¦  «         ||p||fc S |
                     |¦  «         �Œ%|
r1t
                               d| pdd                     |
¦  «        ¦  «         dS )a¦  Try the top-level main-agent fallback chain for an auxiliary call.

    ``provider: auto`` auxiliary tasks should respect the user's declared
    main fallback policy before dropping into Hermes' built-in discovery
    chain. The top-level chain is read through ``get_fallback_chain`` so
    both modern ``fallback_providers`` and legacy ``fallback_model`` entries
    participate in the same order as the main agent.
    r   rz  )Úget_fallback_chainz4Auxiliary %s: could not load main fallback chain: %srk  Nrb  rB   c                 ó   — h | ]}|¯|’ŒS r   r   )rÀ   rb  s     r   r_  z+_try_main_fallback_chain.<locals>.<setcomp>l  s   € Ð=Ð=Ð=�!¸1Ð=ˆAÐ=Ð=Ð=r   rê   rè   rý   zfallback_providers[r„  rr  z
 (skipped)r`  z4Auxiliary %s: main fallback %s failed to resolve: %srE  r=   r  zAAuxiliary %s: skipping %s (context=%d < min=%d), continuing chainr…  r†  u9   Auxiliary %s: %s on %s â€” main fallback chain to %s (%s)z7Auxiliary %s: main fallback chain exhausted (tried: %s)ra  )rH   rA   r—  rš  rK   rX   rx   rò   ró   rö   r  r$  r$   ro  rI   rJ   r&  rL  ro  r‡  r‚  rˆ  rl  rP  )r°  rZ  r  rA   rš  r.  r¥   Úfailed_normÚ	main_normrc  rg  rŒ  r�  r½  rQ  r;  Úfb_normrh  r:  rø  r�  s                        r   Ú_try_main_fallback_chainrŸ  Q  s  € ðØ:Ð:Ð:Ð:Ð:Ð:ØAÐAÐAÐAÐAÐAà"Ð"Ð#7Ð#7Ñ#9Ô#9Ñ:Ô:ˆˆøÝð ð ð Ý�ŠÐKÈTÈ^ÐU[Ð]`ÑaÔaÐaØˆ~ˆ~ˆ~ˆ~ˆ~øøøøðøøøð ð Øˆ~à"Ð( b×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9€KÝ$Ñ&Ô&Ð,¨"×3Ò3Ñ5Ô5×;Ò;Ñ=Ô=€IØ=Ð=˜ Y°Ð7Ð=Ñ=Ô=€DØ€EÝ*¨4Ñ0Ô0€Gå˜eÑ$Ô$ð *ñ *‰ˆˆ5Ý˜%¥Ñ&Ô&ð 	ØÝ˜%Ÿ)š) JÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>ˆÝ�u—y’y Ñ)Ô)Ð/¨RÑ0Ô0×6Ò6Ñ8Ô8ˆØð 	 (ð 	ØØ×#Ò#Ñ%Ô%ˆØ9 aÐ9Ð9¨;Ð9Ð9Ð9ˆØ�dˆ?ˆ?Ø�LŠL˜EÐ-Ð-Ð-Ñ.Ô.Ð.ØÝ! 'Ñ*Ô*ð 	Ý ¨Ñ.Ô.Ð.Ø�LŠL˜EÐ/Ð/Ð/Ñ0Ô0Ð0Øð	3Ý(?ÀÑ(FÔ(FÑ%ˆI�~�~øÝð 	3ð 	3ð 	3Ý�LŠLÐOÐQUÐQ_ÐY_ÐafÐhkÑlÔlÐlØ(2Ñ%ˆI�~�~�~�~�~�~øøøøð	3øøøð Ð ØÐ"Ý2ØØ"Ð. hÝ  §¢¨:Ñ!6Ô!6Ð!<¸"Ñ=Ô=Ý3°EÑ:Ô:Ð@¸bð	ñ ô �ð Ð%¨&°7Ò*:Ð*:Ý—K’KØ[Ø˜ ¨¨v°wñô ð ð —L’L EÐ!SÐ!SÀÐ!SÐ!SÈÐ!SÐ!SÐ!SÑTÔTÐTÙÝ�KŠKØKØ�˜ ¨Ð(A¸6À5ØÐ* (ñô ð ð
 ˜nÐ8°¸+ÐEÐEÐEÐEØ�Š�UÑÔÐÑàð 
Ý�ŠØEØˆN�F˜DŸIšI eÑ,Ô,ñ	
ô 	
ð 	
ð ˆ>s,   ‚" ¢
A¬AÁAÇ'G:Ç:
H2È$H-È-H2c                 ó2   — t          | |||¬¦  «        \  }}|S )z—Resolve a single provider entry from fallback_chain to an OpenAI client.

    Uses the existing provider resolution infrastructure where possible.
    )rè   rý   rC  rg  )rw  )rè   rý   r=   r\   rZ   rø  s         r   Ú_resolve_single_providerr¡  ¤  s0   € õ 5ØØØ"Ø ð	ñ ô Ñ€FˆNð €Mr   c           	      ó   — da t          | ¦  «        }|                     dd¦  «        }t          |                     d¦  «        pd¦  «        }t          |                     d¦  «        pd¦  «        }|                     dd¦  «        }t          |                     d¦  «        pd¦  «        }t          stt          j        dd¦  «                             ¦   «         }|pt          ¦   «         }	|r;|	r9|	d	k    r3|	 	                    d
¦  «        st                               d||	¦  «         dat          |pt          ¦   «         pd¦  «        }
t          |pt          ¦   «         pd¦  «        }|t          v r>|
r<|
dvr8t          |
d¬¦  «        }|r%||k    rt                               d|||¦  «         |}|
dk    r t!          |¦  «        \  }}|r|r
|}
|}d}d}d}|
ræ|rä|
dvrà|
}|pd}d}|r|
d	k    r	d	}|}|pd}nW|
 	                    d
¦  «        r>d}	 ddlm}  ||
¦  «        du}n# t&          $ r Y nw xY w|r|
}d}n|r	d	}|}|pd}n	|r|}n|r|}t)          |¦  «        }|rt+          |¦  «        rt-          |¦  «         n@t/          |||||pd¬¦  «        \  }}|�%t                               d|
|p|¦  «         ||p||fS |r,t3          ||
pdd¬¦  «        \  }}}|�||t5          |¦  «        fS t7          ||
pdd¬¦  «        \  }}}|�|||fS g }t9          ¦   «         D ]º\  }}t+          |¦  «        r(t-          |¦  «         |                     |› d�¦  «         Œ< |¦   «         \  }}|�Z|r3t                               d||pdd                     |¦  «        ¦  «         nt                               d||pd¦  «         |||fc S |                     |¦  «         Œ»t                               dd                     |¦  «        ¦  «         dS ) uì  Full auto-detection chain, including the selected provider identity.

    Priority:
      1. User's main provider + main model, regardless of provider type.
         This means auxiliary tasks (compression, vision, web extraction,
         session search, etc.) use the same model the user configured for
         chat.  Users on OpenRouter/Nous get their chosen chat model; users
         on DeepSeek/ZAI/Alibaba get theirs; etc.  Running aux tasks on the
         user's picked model keeps behavior predictable â€” no surprise
         switches to a cheap fallback model for side tasks.
      2. OpenRouter â†’ Nous â†’ custom â†’ Codex â†’ API-key providers (fallback
         chain, only used when the main provider has no working client).
    Frè   rB   rý   r=   r\   rù  r  rî   rë   zºOPENAI_BASE_URL is set (%s) but model.provider is '%s'. Auxiliary clients may route to the wrong endpoint. Run: hermes model to reconfigure, or remove OPENAI_BASE_URL from ~/.hermes/.envT>   rB   rê   rK  z>Auxiliary task %s: preferring fast model %s over main model %sr”  Nr   ©Ú_get_named_custom_provider)rC  rg  rù  z2Auxiliary auto-detect: using main provider %s (%s)rê   zmain provider unavailabler’  r`  u4   Auxiliary auto-detect: using %s (%s) â€” skipped: %sr$  ra  z$Auxiliary auto-detect: using %s (%s)z·Auxiliary auto-detect: no provider available (tried: %s). Compression, summarization, and memory flush will not work. Set OPENROUTER_API_KEY or configure a local model in config.yaml.rb  )r—  r  rJ   rI   Ú_stale_base_url_warnedr�  rÖ  rò   rö   rô   rX   rY   r‡  rZ  rT  rx   r›  r  r¤  rU   rc  rL  ro  rw  rl  r�  r4  rŸ  r\  r&  rP  )r  r°  r|  Úruntime_providerÚruntime_modelrÅ  r¿  rJ  Ú	_env_baseÚ_cfg_providerrd  rx  Ú
fast_modelry  rz  rå  rC  rg  Ú_has_named_entryr¤  Úmain_chain_labelrZ   r=  r:  r;  r'  rg  rh  rh  rý   s                                 r   Ú_resolve_auto_router­  ·  s¶  € ð$ ÐÝ% lÑ3Ô3€GØ—{’{ :¨rÑ2Ô2ÐÝ˜Ÿš GÑ,Ô,Ð2°Ñ3Ô3€MÝ˜7Ÿ;š; zÑ2Ô2Ð8°bÑ9Ô9ÐØ—k’k )¨RÑ0Ô0€OÝ˜7Ÿ;š; zÑ2Ô2Ð8°bÑ9Ô9Ðõ "ð *Ý”IÐ/°Ñ4Ô4×:Ò:Ñ<Ô<ˆ	Ø(ÐAÕ,?Ñ,AÔ,AˆØð 
	*˜-ð 
	*Ø! XÒ-Ð-Ø%×0Ò0°Ñ;Ô;ð .å�NŠNð6ð ˜=ñô ð ð &*Ð"õ Ð(ÐGÕ,?Ñ,AÔ,AÐGÀRÑHÔH€MÝ�]Ð>Õ&6Ñ&8Ô&8Ð>¸BÑ?Ô?€Jð Õ Ð Ð  ]Ð °}ÈLÐ7XÐ7XÝ0°ÈDÐQÑQÔQˆ
Øð 	$˜*¨
Ò2Ð2Ý�LŠLØPØ�j *ñô ð ð $ˆJð ˜ÒÐÝ$;¸JÑ$GÔ$GÑ!ˆ�zØð 		"˜Zð 		"Ø)ˆMØ#ˆJð
  "ÐØ ˆOØ!Ðàð @I˜*ð @IØ \Ð1Ð1Ø)ÐØ,Ð4°ÐØÐØð '	/ °Ò 9Ð 9ð !)ÐØ 0ÐØ.Ð6°$ÐÐØ×%Ò% iÑ0Ô0ð !	/à$ÐðØRÐRÐRÐRÐRÐRØ#=Ð#=¸mÑ#LÔ#LÐTXÐ#XÐ Ð øÝð ð ð Ø�ðøøøàð 3ð %2Ð!Ø$(Ð!Ð!Ø!ð 3ð %-Ð!Ø$4Ð!Ø#2Ð#:°dÐ Ð Ø ð 3Ø#2Ð øØð 	/ð  /Ðõ 2Ð2CÑDÔDÐØð 	IÕ 6Ð7GÑ HÔ Hð 	IÝÐ 0Ñ1Ô1Ð1Ð1å6Ø!ØØ"3Ø!1Ø)Ð1¨Tð ñ  ô  ÑˆF�Hð Ð!Ý—’ÐPØ)¨8Ð+A°zñCô Cð Cà˜xÐ5¨:Ð7HÐHÐHð ð PÝ(FØ�-Ð) 6Ð2Mð)Oñ )Oô )OÑ%ˆ	�8˜XàÐ Ø˜hÕ(EÀhÑ(OÔ(OÐOÐOÝ$<ØˆmÐ%˜vÐ.Ið%Kñ %Kô %KÑ!€Iˆx˜àÐØ˜( HÐ,Ð,ð €EÝ,Ñ.Ô.ð ð ‰ˆˆvÝ! %Ñ(Ô(ð 	Ý Ñ&Ô&Ð&Ø�LŠL˜EÐ/Ð/Ð/Ñ0Ô0Ð0ØØ˜™œ‰ˆ�ØÐØð _Ý—’ÐRØ! 5Ð#5¨I°t·y²yÀÑ7GÔ7GñIô Ið Ið Iõ —’ÐBÀEÈ5ÐK]ÐT]Ñ^Ô^Ð^Ø˜5 %Ð'Ð'Ð'Ð'Ø�Š�UÑÔÐÐÝ
‡N‚Nð Wð —9’9˜UÑ#Ô#ñ%ô %ð %ð ˆ>s   È	H È
H*È)H*c                 ó4   — t          | |¬¦  «        \  }}}||fS )zJBackward-compatible auto resolver for callers that only need client/model.©r  r°  )r­  )r  r°  rZ   rý   Ú	_providers        r   Ú_resolve_autor±  ~  s(   € õ
  3ÀÐSWÐXÑXÔXÑ€FˆE�9Ø�5ˆ=Ðr   c                 óÂ   — | �|sdS 	 t          | d|¦  «         dS # t          t          f$ r2 t                               dt          | ¦  «        j        |¦  «         Y dS w xY w)zERetain auto-routing identity on the client that survives cache reuse.NÚ_hermes_aux_effective_providerz7Auxiliary client %s cannot retain effective provider %s)ÚsetattrrV   r¸   rX   rx   rÿ  r*   )rZ   rè   s     r   Ú_tag_effective_providerrµ  ‡  s„   € à€~˜X€~Øˆð
Ý�Ð8¸(ÑCÔCÐCÐCÐCøÝ�IÐ&ð 
ð 
ð 
Ý�ŠØEÝ�‰LŒLÔ! 8ñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð
øøøs   ˆ ›?AÁAc                 óx   — t          | dd¦  «        }t          |t          ¦  «        r|r|S t          |pd¦  «        S )z@Return the concrete provider selected for an auto-routed client.r³  rB   )ro   r$   rI   )rZ   rÁ  r  s      r   r  r  ”  sH   € å  Ð)IÈ2ÑNÔNÐÝÐ$¥cÑ*Ô*ð "Ð/Að "Ø!Ð!Ýˆxˆ~˜2ÑÔÐr   Ú	is_visionc                 óÐ  — ddl m} t          | t          ¦  «        rt	          | ¦  «        |fS t          | t
          ¦  «        rt          | ¦  «        |fS t          | t          ¦  «        rt          | ¦  «        |fS 	 ddl	m
}m} t          | |¦  «        r || ¦  «        |fS n# t          $ r Y nw xY w	 ddlm} t          | |¦  «        r| |fS n# t          $ r Y nw xY w| j        t!          | j        ¦  «        dœ}t!          | j        ¦  «        }t%          |d¦  «        rt'          ¦   «         |d<   nÜt%          |d¦  «        rdd	lm}	  |	d
|¬¦  «        |d<   nµt%          |d¦  «        rddi|d<   n�t%          |d¦  «        rt-          |¦  «        |d<   nzt%          |d¦  «        rddlm}
  |
¦   «         |d<   nV	 ddlm} ddlm}  ||¦  «        }|r+ ||¦  «        }|r|j        rt=          |j        ¦  «        |d<   n# t>          $ r Y nw xY wtA          | !                    d¦  «        ¦  «        }|r||d<   i tE          |d
¬¦  «        ¥|¥}| #                    dd¦  «          |di |¤Ž|fS )aa  Convert a sync client to its async counterpart, preserving Codex routing.

    When ``is_vision=True`` and the underlying base URL is Copilot, the
    resulting async client carries the ``Copilot-Vision-Request: true``
    header so the request is routed to Copilot's vision-capable
    infrastructure (otherwise vision payloads silently time out).
    r   )ÚAsyncOpenAI)rû  ÚAsyncGeminiNativeClientrü  r_   r  rm  rë  ©Úcopilot_request_headersT©Úis_agent_turnr·  r­  r‘  rI  r�  rÏ   r:  )Ú_infer_provider_from_urlr1  rN   r^   r   )$r   r¹  r$   rx  r�  rÈ  rÔ  rå  ró  r  rû  rº  rU   r  rý  r\   rI   r=   r4   rŠ  r  r¼  r�  r<  r;  Úagent.model_metadatar¿  rA  r2  rm  ro  rK   rw  rJ   r[   r`   )Úsync_clientrý   r·  r¹  rû  rº  rý  Úasync_kwargsÚsync_base_urlr¼  r;  r¿  Ú
_gpf_asyncÚ	_inferredÚ	_ph_asyncÚ_merged_asyncs                   r   Ú_to_async_clientrÈ  §  s   € ð #Ð"Ð"Ð"Ð"Ð"å�+Õ3Ñ4Ô4ð =Ý(¨Ñ5Ô5°uÐ<Ð<Ý�+Õ7Ñ8Ô8ð AÝ,¨[Ñ9Ô9¸5Ð@Ð@Ý�+Õ5Ñ6Ô6ð ?Ý*¨;Ñ7Ô7¸Ð>Ð>ðØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[å�kÐ#5Ñ6Ô6ð 	?Ø*Ð*¨;Ñ7Ô7¸Ð>Ð>ð	?øåð ð ð ØˆðøøøðØ=Ð=Ð=Ð=Ð=Ð=Ý�kÐ#3Ñ4Ô4ð 	&Ø Ð%Ð%ð	&øåð ð ð Øˆðøøøð Ô&Ý˜Ô,Ñ-Ô-ðð €Lõ ˜Ô,Ñ-Ô-€MÝ˜]¨OÑ<Ô<ð Ý*:Ñ*<Ô*<ˆÐ&Ñ'Ð'Ý	˜}Ð.AÑ	BÔ	Bð ØCÐCÐCÐCÐCÐCà*AÐ*AØ¨)ð+
ñ +
ô +
ˆÐ&Ñ'Ð'õ 
˜}¨nÑ	=Ô	=ð Ø+7Ð9LÐ*MˆÐ&Ñ'Ð'Ý	˜}Ð.HÑ	IÔ	Ið Ý*BÀ=Ñ*QÔ*QˆÐ&Ñ'Ð'Ý	˜}¨fÑ	5Ô	5ð Ø=Ð=Ð=Ð=Ð=Ð=à*DÐ*DÑ*FÔ*FˆÐ&Ñ'Ð'ð
		ØEÐEÐEÐEÐEÐEØDÐDÐDÐDÐDÐDØ0Ð0°Ñ?Ô?ˆIØð VØ&˜J yÑ1Ô1�	Øð V Ô!:ð VÝ6:¸9Ô;TÑ6UÔ6U�LÐ!2Ñ3øøÝð 	ð 	ð 	ØˆDð	øøøå/°×0@Ò0@ÐARÑ0SÔ0SÑTÔT€MØð 8Ø*7ˆÐ&Ñ'ðÝ
$ ]¸tÐ
DÑ
DÔ
Dðà
ð€Lð ×Ò˜M¨1Ñ-Ô-Ð-Øˆ;Ð&Ð&˜Ð&Ð&¨Ð-Ð-s7   Á:$B  Â 
B-Â,B-Â1C Ã
CÃCÆ5AG: Ç:
HÈHrÑ  c                 óT   — | s| S 	 ddl m}  || |¦  «        S # t          $ r | cY S w xY w)zANormalize a resolved model for the provider that will receive it.r   )Únormalize_model_for_provider)Úhermes_cli.model_normalizerÊ  rK   )rÑ  rè   rÊ  s      r   rI  rI  õ  sa   € àð ØÐðØKÐKÐKÐKÐKÐKà+Ð+¨J¸ÑAÔAÐAøÝð ð ð ØÐÐÐðøøøs   † ˜'¦'Ú	raw_codexc
                 óh+  ‡ ‡‡‡a— t          ¦   «          ‰ pd                     ¦   «                              ¦   «         }
t          ‰ ¦  «        Š ‰ dk    r‡t	          |¦  «        \  }}|rs|rq|                     ¦   «                              ¦   «         }
t          |¦  «        Š |}|r8t          |¦  «                             ¦   «                              d¦  «        rd}d}‰ dk    o|}|s'‰ dk    r!|st          ‰ ¦  «        pt          ¦   «         p|}dt
          dt
          d	t          fˆˆ ˆfd
„Ša	 	 d{dt
          dt
          dt
          fˆaˆfd„}‰ dk    rvt          ||	¬¦  «        \  }}}|€dS |r(d|v r$|r"d|vrt                               d||¦  «         d}|p|}|rt          |||¬¦  «        n||f\  }}t          ||¦  «         ||fS ‰ dk    rht          |¬¦  «        \  }}|€)t                               dt#          ¦   «         ¦  «         dS t%          |p|‰ ¦  «        }|rt          |||¬¦  «        n||fS ‰ dk    �r|pF|t&                               ¦   «         v p+|pd                     ¦   «                              ¦   «         dk    }t+          |¬¦  «        \  }}|€t                               d¦  «         dS t%          |p|‰ ¦  «        }ddlm}  ||¦  «        }t          t1          |dd¦  «        pd¦  «        }t          t1          |dd¦  «        pd¦  «        }t3          |||||¦  «        }|rt          |||¬¦  «        n||fS ‰ dk    rÞ|st                               d¦  «         dS ‰rdt5          ¦   «         }|st                               d¦  «         dS t%          |‰ ¦  «        }t7          |t8          t;          |¦  «        ¬ ¦  «        }||fS t=          |¦  «        \  }}|€t                               d¦  «         dS t%          |p|‰ ¦  «        }|rt          |||¬¦  «        n||fS ‰ d!k    rZt?          |¦  «        \  }}|€t                               d"¦  «         dS t%          |p|‰ ¦  «        }|rt          |||¬¦  «        n||fS ‰ d#k    �r2d}d}|rvtA          |¦  «                             ¦   «         }|pd                     ¦   «         ptC          d$¦  «        ptE          |¦  «        pd%}|st                               d&¦  «         dS n‰|r‡t          | #                    d¦  «        pd¦  «                             ¦   «          $                    d¦  «        }t          | #                    d¦  «        pd¦  «                             ¦   «         } |r| r|}| }|�rL|�rIt%          |p|r| #                    d'¦  «        ndpd(‰ ¦  «        }i }!tK          |¦  «        \  }"}#|#r|#|!d)<   tM          |d*¦  «        rd+d,i|!d-<   n�tM          |d.¦  «        rdd/l'm(}$  |$d0|¬1¦  «        |!d-<   nftM          |d2¦  «        rtS          |¦  «        |!d-<   nC	 dd3l*m+}%  |%‰ ¦  «        }&|&r|&j,        rt[          |&j,        ¦  «        |!d-<   n# t\          $ r Y nw xY wt_          |! #                    d-¦  «        ¦  «        }'|'r|'|!d-<   t7          d|||"d4œ|!¤Ž} |||||¦  «        }|rt          |||¬¦  «        n||fS t`          tb          fD ]³}( |(¦   «         \  }}|�¢t%          |p|‰ ¦  «        }t          t1          |dd¦  «        pd¦  «        })t1          |dd¦  «        }*te          |*¦  «        rtg          |*t
          ¦  «        sdnt          |*pd¦  «        }+ ||||)|+¦  «        }|rt          |||¬¦  «        n||fc S Œ´t                               d5¦  «         dS 	 dd6l4m5}, d}-|
r|
‰ k    r |,|
¦  «        }-|-€ |,‰ ¦  «        }-|-�r>|- #                    d¦  «        pd                     ¦   «         }|- #                    d¦  «        pd                     ¦   «         }|- #                    d7¦  «        p|- #                    d8¦  «        pd                     ¦   «         }.|s|.rtC          |.¦  «        }|pd%}|d%k    r0t                               d9|- #                    d:¦  «        p‰ ¦  «         ‰p|- #                    d;¦  «        pd                     ¦   «         }/|�rt%          |p=|- #                    d'¦  «        p(|r| #                    d'¦  «        ndpt          ¦   «         pd(‰ ¦  «        }|/d<k    r|}0|}1ntA          |¦  «        }0|}1tK          |0¦  «        \  }2}3|3rd)|3ini }4t_          |4 #                    d-¦  «        ¦  «        }5|5r|5|4d-<   t                               d=‰ ||/pd>¦  «         |/d<k    rã	 dd?l6m7}6  |6||¦  «        }7n¤# tp          $ r— t                               d@‰ ¦  «         tA          |¦  «        }8tK          |8¦  «        \  }9}:|:rd)|:ini };t_          |; #                    d-¦  «        ¦  «        }<|<r|<|;d-<   t7          d|||9d4œ|;¤Ž}|rt          |||¬¦  «        n||fcY S w xY wts          |7|||dA¬B¦  «        }=|rtu          |=¦  «        |fS |=|fS t7          d|||2d4œ|4¤Ž}|/dCk    r&tg          |tv          ¦  «        stw          ||¦  «        }n ||||1|¦  «        }|rt          |||¬¦  «        n||fS t                               dD‰ ¦  «         dS n# tp          $ r Y nw xY w‰ dEk    r^ty          |||‰¬F¦  «        \  }}>|€t                               dG¦  «         dS t%          |p|>‰ ¦  «        }|rt          |||¬¦  «        n||fS 	 ddHl=m>}?m?}@m@}A n,# tp          $ r t                               dI‰ ¦  «         Y dS w xY w|? #                    ‰ ¦  «        }B|B€@‰ t‚          vr5t‚           B                    ‰ ¦  «         t                               dJ‰ ¦  «         dS |BjC        dk    �rM‰ dKk    r[t‰          |¬¦  «        \  }}>|€t                               dL¦  «         dS t%          |p|>‰ ¦  «        }|rt          |||¬¦  «        n||fS  |@‰ ¦  «        }Ct          |C #                    dd¦  «        ¦  «                             ¦   «         }D|r|                     ¦   «         p|D}Dt          |C #                    dd¦  «        ¦  «                             ¦   «          $                    d¦  «        p|BjE        }E|r'|                     ¦   «          $                    d¦  «        }E‰ dMk    r6	 ddNl=mF}FmG}GmH}H  |H|E¦  «        }E|Ds |G|E¦  «        r|F}Dn# t\          $ r Y nw xY w|Ds`t“          |BjJ        ¦  «        }I‰ dOk    r|I K                    dP¦  «         t                               dQ‰ dR L                    |I¦  «        ¦  «         dS tA          |E¦  «        }J|r4tA          |                     ¦   «          $                    d¦  «        ¦  «        }Jt          ‰ ¦  «        }>t%          |p|>‰ ¦  «        }‰ dSk    rTddTlMmN}KmO}L  |L|J¦  «        rA |K|D|J¬4¦  «        }t                               dU‰ |¦  «         |rt          |||¬¦  «        n||fS i }MtM          |Jd*¦  «        rd,|Md+<   nätM          |Jd.¦  «        r'dd/l'm(}$ |M P                     |$d0|¬1¦  «        ¦  «         n­tM          |Jd2¦  «        r#|M P                    tS          |J¦  «        ¦  «         nztM          |JdV¦  «        r$ddWlQmR}N |M P                     |N¦   «         ¦  «         nF	 dd3l*m+}O  |O‰ ¦  «        }P|Pr!|Pj,        r|M P                    |Pj,        ¦  «         n# t\          $ r Y nw xY wt_          |M¦  «        }Q|Qr|Q}Mt7          d||D|Jd4œ|Mrd-|Mini ¤Ž}‰ dOk    rR|rP‰sN	 ddXlSmT}R  |R|¦  «        r+t                               dY|¦  «         tw          ||¦  «        }n# tp          $ r Y nw xY w ||||E|D¦  «        }t                               dU‰ |¦  «         |rt          |||¬¦  «        n||fS |BjC        dZk    �rÕ |A‰ ¦  «        }Ct%          |p&|r| #                    d'¦  «        ndpt          ¦   «         ‰ ¦  «        }‰ d[k    �rLt          |C #                    dd¦  «        ¦  «                             ¦   «         }Dt          |C #                    dd¦  «        ¦  «                             ¦   «         }Jt          |C #                    d\d¦  «        ¦  «                             ¦   «         pd}St“          |C #                    d]¦  «        pg ¦  «        }T|st                               d^¦  «         dS |Dr|Jst                               d_¦  «         dS dd`lUmV}U  |U|D|J|S|T¬a¦  «        }t                               dU‰ |¦  «         |rt          |||¬¦  «        n||fS ‰ t®          vr5t®           B                    ‰ ¦  «         t                               db‰ ¦  «         dS |BjC        dck    �r	 dddlXmY}VmZ}W n+# tp          $ r t                               de¦  «         Y dS w xY w |W¦   «         st                               df¦  «         dS  |V¦   «         \  }X}J|Xr|Jst                               dg¦  «         dS dh}>t%          |p|>‰ ¦  «        }	 ddil[m\}Y  |Y|X|J¬4¦  «        }n3# t\          $ r&}Zt                               dj|Z¦  «         Y d}Z~ZdS d}Z~Zww xY wt                               dk|¦  «         |rt          |||¬¦  «        n||fS |BjC        dlk    �rF	 ddml]m^}[m_}\m`}] ddnl6ma}^ n+# tp          $ r t                               do¦  «         Y dS w xY w |[¦   «         st                               dp¦  «         dS  |]¦   «         }_dq}>t%          |p|>‰ ¦  «        }dr|_› ds�}J |\|¦  «        rp	  |^|_¦  «        }7n3# tp          $ r&}Zt                               dt|Z¦  «         Y d}Z~ZdS d}Z~Zww xY wts          |7|du|J¬4¦  «        }t                               dv||_¦  «         n,tÅ          |_|¦  «        }t                               dw||_¦  «         |rt          |||¬¦  «        n||fS |BjC        dxv r…‰ dk    rtÇ          d||¦  «        S ‰ dk    rtÇ          d||¦  «        S ‰ d!k    rtÇ          d!||¦  «        S ‰ tÈ          vr5tÈ           B                    ‰ ¦  «         t                               dy‰ ¦  «         dS |BjC        ‰ f}`|`tÊ          vr;tÊ           B                    |`¦  «         t                               dz|BjC        ‰ ¦  «         dS )}uä  Central router: given a provider name and optional model, return a
    configured client with the correct auth, base URL, and API format.

    The returned client always exposes ``.chat.completions.create()`` â€” for
    Codex/Responses API providers, an adapter handles the translation
    transparently.

    Args:
        provider: Provider identifier.  One of:
            "openrouter", "nous", "openai-codex" (or "codex"),
            "zai", "kimi-coding", "minimax", "minimax-cn",
            "custom" (OPENAI_BASE_URL + OPENAI_API_KEY),
            "auto" (full auto-detection chain).
        model: Model slug override.  If None, uses the provider's default
               auxiliary model.
        async_mode: If True, return an async-compatible client.
        raw_codex: If True, return a raw OpenAI client for Codex providers
            instead of wrapping in CodexAuxiliaryClient.  Use this when
            the caller needs direct access to responses.stream() (e.g.,
            the main agent loop).
        explicit_base_url: Optional direct OpenAI-compatible endpoint.
        explicit_api_key: Optional API key paired with explicit_base_url.
        api_mode: API mode override.  One of "chat_completions",
            "codex_responses", or None (auto-detect).  When set to
            "codex_responses", the client is wrapped in
            CodexAuxiliaryClient to route through the Responses API.

    Returns:
        (client, resolved_model) or (None, None) if auth is unavailable.
    rB   r”  zmoa://NrÃ  rê   Úbase_url_strÚ	model_strr   c                 óÐ   •— t          | t          ¦  «        rdS ‰rdS ‰dk    rdS ‰dk    rdS ‰r‰dk    rdS t          |¦  «        dk    r|pd                     ¦   «         }d|v rdS dS )a(  Decide if a plain OpenAI client should be wrapped for Responses API.

        Returns True when api_mode is explicitly "codex_responses", or when
        auto-detection (api.openai.com + codex-family model) suggests it.
        Already-wrapped clients (CodexAuxiliaryClient) are skipped.
        FrÚ   Tr1  úapi.openai.comrB   rï   )r$   rx  r5   ró   )rø  rÎ  rÏ  Úmodel_lowerrù  rè   rÌ  s       €€€r   Ú_needs_codex_wrapz2resolve_provider_client.<locals>._needs_codex_wrap}  s¡   ø€ õ �jÕ"6Ñ7Ô7ð 	Ø�5Øð 	Ø�5Ø�xÒÐØ�4ØÐ(Ò(Ð(Ø�4àð 	˜Ð$5Ò5Ð5Ø�5Ý˜\Ñ*Ô*Ð.>Ò>Ð>Ø$˜?¨×1Ò1Ñ3Ô3ˆKØ˜+Ð%Ð%Ø�tØˆur   Úfinal_model_strÚapi_key_strc                 óº   •—  ‰| ||¦  «        r;t                                d‰pd||r
|dd…         nd¦  «         t          | |¦  «        S t          | |||‰¦  «        S )a@  Wrap a plain OpenAI client in the correct transport adapter.

        Handles two cases:
        - ``CodexAuxiliaryClient`` when the endpoint needs the Responses API
          (explicit ``api_mode=codex_responses`` or api.openai.com + codex
          model name).
        - ``AnthropicAuxiliaryClient`` when the endpoint speaks Anthropic
          Messages (explicit ``api_mode=anthropic_messages``, any ``/anthropic``
          suffix, ``api.kimi.com/coding``, or ``api.anthropic.com``).

        Clients that are already specialized wrappers pass through unchanged.
        zeresolve_provider_client: wrapping client in CodexAuxiliaryClient (api_mode=%s, model=%s, base_url=%s)r   NrÒ  rB   )rX   rx   rx  r  )rø  rÔ  rÎ  rÕ  rÓ  rù  s       €€r   Ú_wrap_if_neededz0resolve_provider_client.<locals>._wrap_if_needed•  s‰   ø€ ð Ð˜Z¨°ÑGÔGð 	EÝ�LŠLð7àÐ+˜O¨_Ø%1Ð9�˜S˜b˜SÔ!Ð!°rñ	;ô ;ð ;õ
 (¨
°OÑDÔDÐDõ %Ø˜¨°lÀHñ
ô 
ð 	
r   r¯  rE  rÿ   z\Dropping OpenRouter-format model %r for non-OpenRouter auxiliary provider (using %r instead)©r·  r{  )rg  z4resolve_provider_client: openrouter requested but %szmimo-v2-omnirx  zYresolve_provider_client: nous requested but Nous Portal not configured (run: hermes auth)r   ©Únous_api_moder\   r=   rð   z¬resolve_provider_client: openai-codex requested without a model; pass model explicitly (e.g. model.model in config.yaml or auxiliary.<task>.model for per-task aux routing).zbresolve_provider_client: openai-codex requested but no Codex OAuth token found (run: hermes model)rj  r7  uˆ   resolve_provider_client: xai-oauth requested but no xAI OAuth token found (run: hermes model -> xAI Grok OAuth â€” SuperGrok / Premium+)rî   r  r  zQresolve_provider_client: explicit custom endpoint requested but base_url is emptyrý   r/  r0  r­  r‘  rI  rm  rë  r»  Tr½  r�  r1  r_   zPresolve_provider_client: custom/main requested but no endpoint credentials foundr£  Úkey_envÚapi_key_envu­   resolve_provider_client: named custom provider %r has no resolvable api_key â€” request will be sent with placeholder no-key-required and will 401 on auth-required endpointsr«   rù  r±  zCresolve_provider_client: named custom provider %r (%s, api_mode=%s)r²  rþ  u…   Named custom provider %r declares api_mode=anthropic_messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire.Fr  r1  zAresolve_provider_client: named custom provider %r has no base_urlrG  rB  zsresolve_provider_client: azure-foundry requested but runtime resolution failed (run: hermes doctor for diagnostics))rD  r/  Ú-resolve_external_process_provider_credentialsz-hermes_cli.auth not available for provider %sz,resolve_provider_client: unknown provider %rrà   zOresolve_provider_client: anthropic requested but no Anthropic credentials foundrÚ   )ÚACTUAL_LOCAL_NOAUTH_PLACEHOLDERÚis_actual_local_base_urlÚnormalize_actual_base_urlrâ   zgh auth tokenzJresolve_provider_client: provider %s has no API key configured (tried: %s)ra  rË   rG  z resolve_provider_client: %s (%s)rÏ   r:  )Ú!_should_use_copilot_responses_apiud   resolve_provider_client: copilot model %s needs Responses API â€” wrapping with CodexAuxiliaryClientÚexternal_processrã   Úcommandr    zVresolve_provider_client: copilot-acp requested but no model was provided or configuredz^resolve_provider_client: copilot-acp requested but external process credentials are incompleterü  )r\   r=   rã  r    zLresolve_provider_client: external-process provider %s not directly supportedr  )r  Úhas_vertex_credentialszGresolve_provider_client: vertex requested but google-auth not installedzFresolve_provider_client: vertex requested but no GCP credentials foundzTresolve_provider_client: vertex requested but could not mint token / resolve projectzgoogle/gemini-3-flash-previewr   z8resolve_provider_client: cannot create Vertex client: %sz$resolve_provider_client: vertex (%s)Úaws_sdk)Úhas_aws_credentialsÚis_anthropic_bedrock_modelÚresolve_bedrock_region)Úbuild_anthropic_bedrock_clientzSresolve_provider_client: bedrock requested but boto3 or anthropic SDK not installedzGresolve_provider_client: bedrock requested but no AWS credentials foundz(anthropic.claude-haiku-4-5-20251001-v1:0rè  ré  z9resolve_provider_client: cannot create Bedrock client: %srç  z3resolve_provider_client: bedrock anthropic (%s, %s)z2resolve_provider_client: bedrock converse (%s, %s)>   Úoauth_externalÚoauth_device_codezMresolve_provider_client: OAuth provider %s not directly supported, try 'auto'z6resolve_provider_client: unhandled auth_type %s for %sr3  r   )fr)  rò   ró   rû   r›  rI   rô   rT  r�  rn   r­  rX   rx   rÈ  rµ  rp  rY   rr  rI  r\  rø  r~  Úhermes_cli.providersrÚ  ro   r  rB  ra   r2  r©  rA  r>  r°  rÝ  r¢  rJ   rB  rÉ   r4   r  r¼  r�  rA  r2  rm  ro  rK   rw  r8  rW  ry   r$   r  r¤  rœ  rÿ  rU   rÈ  rÔ  rx  rM  r?  rD  r/  rÝ  r9   re  rK  rM  rÆ  rÞ  rß  rà  rE  Úapi_key_env_varsr&  rP  r  rû  rH  rp  r<  r;  r@  rá  r  rý  r;   r  r  rä  r   r   rà  ræ  rç  rè  ré  rå  rw  r<   r:   )brè   rý   rO   rÌ  rC  rg  rù  r  r·  r°  Úoriginal_providerry  rz  Ú_nous_portal_visionr×  rZ   r=  r  rL  Úrouted_clientÚrouted_modelr$  Ú
_is_visionrÚ  Úportal_moderÕ  rÎ  r@  Ú
raw_clientr  r  Ú
_main_baseÚ	_main_keyrP  r3  r4  r¼  Ú_gpf_customÚ
_ph_customÚ_merged_customrh  Ú_cbaseÚ	_raw_ckeyÚ_ckeyr¤  Úcustom_entryÚcustom_key_envÚentry_api_moder  Úraw_base_for_wrapÚ_clean_base2Ú_dq2Ú_extra2Ú	_headers2rÿ  rà  Ú_fallback_baseÚ	_fb_cleanÚ_fb_dqÚ	_fb_extraÚ_fb_headersÚsync_anthropicÚdefault_modelrD  r/  rÝ  rN  rF  r\   rO  rÞ  rß  rà  Útried_sourcesr=   rû  rH  rh  r;  Ú	_gpf_mainÚ_ph_mainÚ_merged_mainrá  rã  r    rý  r  rä  r  r   r¥   ræ  rç  rè  ré  rÙ  Ú_auth_dedup_keyrÓ  sb   `  `  `                                                                                          @r   rw  rw    s�  øøøø€ õT ÑÔÐð "˜ R×.Ò.Ñ0Ô0×6Ò6Ñ8Ô8Ðå& xÑ0Ô0€Hð �5ÒÐÝ$;¸EÑ$BÔ$BÑ!ˆ�zØð 	(˜Zð 	(Ø -× 3Ò 3Ñ 5Ô 5× ;Ò ;Ñ =Ô =ÐÝ.¨}Ñ=Ô=ˆHØˆEð !ð (¥SÐ):Ñ%;Ô%;×%AÒ%AÑ%CÔ%C×%NÒ%NÈxÑ%XÔ%Xð (Ø$(Ð!Ø#'Ð ðb # fÒ,Ð:°ÐØð ]�X Ò'Ð'Ð0CÐ'Ý+¨HÑ5Ô5Ð\Õ9QÑ9SÔ9SÐ\ÐW\ˆðµCð ÅCð ÍDð ð ð ð ð ð ð ð ð0 OQØ+-ð
ð 
µSð 
Íð 
Ý%(ð
ð 
ð 
ð 
ð 
ð 
ð 
ð8 �6ÒÐÝ/BØ%Øð0
ñ 0
ô 0
Ñ,ˆ�Ð,ð ˆ>Ø�:ð
 ð 	�S˜E�\�\ h�\°3¸hÐ3FÐ3FÝ�LŠLð8Ø9>ÀñJô Jð Jð ˆEØÐ'˜xˆð ð5Õ˜V [¸IÐFÑFÔFÐFØ &¨Ð4ñ 	$ˆ�|õ 	  Ð/AÑBÔBÐBØ˜lÐ*Ð*ð �<ÒÐÝ)Ð;KÐLÑLÔL‰ˆ�Øˆ>Ý�NŠNØFÝ0Ñ2Ô2ñô ð ð �:Ý/°Ð0@¸À(ÑKÔKˆØNXð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð �6ÒÑð ð ?ØÕ/×6Ò6Ñ8Ô8Ð8ð?à�˜×"Ò"Ñ$Ô$×*Ò*Ñ,Ô,°Ò>ð 	õ
 $¨:Ð6Ñ6Ô6‰ˆ�Øˆ>Ý�NŠNð Oñ Pô Pð Pà�:Ý/°Ð0@¸À(ÑKÔKˆð 	7Ð6Ð6Ð6Ð6Ð6à#�m KÑ0Ô0ˆÝ�' &¨)°RÑ8Ô8Ð>¸BÑ?Ô?ˆÝ�7 6¨:°rÑ:Ô:Ð@¸bÑAÔAˆÝ&Ø�K ¨l¸Kñ
ô 
ˆð OYð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð �>Ò!Ð!Øð 	Ý�NŠNðGñô ð ð
 �:Øð 	-õ 3Ñ4Ô4ˆKØð "Ý—’ð  Tñ Uô Uð Uà!�zÝ3°E¸8ÑDÔDˆKÝ.Ø#Ý,Ý 9¸+Ñ FÔ Fðñ ô ˆJð
  Ð,Ð,å-¨eÑ4Ô4‰ˆ�Øˆ>Ý�NŠNð Pñ Qô Qð Qà�:Ý/°Ð0@¸À(ÑKÔKˆØNXð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð �;ÒÐÝ5°eÑ<Ô<‰ˆ�Øˆ>Ý�NŠNðcñô ð ð �:Ý/°Ð0@¸À(ÑKÔKˆØNXð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð �8ÒÑØˆØˆ
Øð 	'Ý-Ð.?Ñ@Ô@×FÒFÑHÔHˆKà!Ð' R×.Ò.Ñ0Ô0ð %Ý"Ð#3Ñ4Ô4ð%å2°;Ñ?Ô?ð%ð %ð	 ð ð "Ý—’ð,ñô ð ð "�zð"ð ð 	'õ ˜\×-Ò-¨jÑ9Ô9Ð?¸RÑ@Ô@×FÒFÑHÔH×OÒOÐPSÑTÔTˆJÝ˜L×,Ò,¨YÑ7Ô7Ð=¸2Ñ>Ô>×DÒDÑFÔFˆIØð '˜ið 'Ø(�Ø&�
Øñ "	0˜:ñ "	0Ý3ØÐ_°|ÐM˜,×*Ò*¨7Ñ3Ô3Ð3ÈÐ_ÐR_Øñô ˆKð ˆEÝ8¸ÑEÔEÑˆK˜Øð -Ø),��oÑ&Ý$ [°.ÑAÔAð Ø,8Ð:MÐ+N�Ð'Ñ(Ð(Ý& {Ð4GÑHÔHð ØKÐKÐKÐKÐKÐKØ+BÐ+BØ"&°)ð,ñ ,ô ,�Ð'Ñ(Ð(õ ' {Ð4NÑOÔOð Ý+CÀKÑ+PÔ+P�Ð'Ñ(Ð(ðØMÐMÐMÐMÐMÐMØ!, ¨XÑ!6Ô!6�JØ!ð T jÔ&@ð TÝ37¸
Ô8RÑ3SÔ3S˜Ð/Ñ0øøÝ ð ð ð Ø�Dðøøøå8¸¿ºÐCTÑ9UÔ9UÑVÔVˆNØð :Ø+9�Ð'Ñ(Ý*Ð]°:ÈÐ]Ð]ÐW\Ð]Ð]ˆFØ$�_ V¨[¸+ÀzÑRÔRˆFØR\ð /Õ$ V¨[ÀIÐNÑNÔNÐNØ  +Ð.ð0õ ,Õ-FÐGð 	4ð 	4ˆFØ$˜f™hœh‰OˆF�GØÐ!Ý7¸Ð8HÀÈ(ÑSÔS�Ý�W V¨Z¸Ñ<Ô<ÐBÀÑCÔC�õ $ F¨I°rÑ:Ô:�	Ý'¨	Ñ2Ô2Ðp½:ÀiÕQTÑ;UÔ;UÐp˜˜Õ\_Ð`iÐ`oÐmoÑ\pÔ\p�Ø(˜¨°¸fÀeÑLÔL�ØV`ð 3Õ(¨°È	ÐRÑRÔRÐRØ$ kÐ2ð4ð 4ð 4ð "õ 	�Šð ;ñ 	<ô 	<ð 	<àˆzðkØJÐJÐJÐJÐJÐJð ˆØð 	IÐ!2°hÒ!>Ð!>Ø5Ð5Ð6GÑHÔHˆLØÐØ5Ð5°hÑ?Ô?ˆLØñ [	Ø'×+Ò+¨JÑ7Ô7Ð=¸2×DÒDÑFÔFˆKØ&×*Ò*¨9Ñ5Ô5Ð;¸×BÒBÑDÔDˆJØ*×.Ò.¨yÑ9Ô9Ðb¸\×=MÒ=MÈmÑ=\Ô=\ÐbÐ`b×iÒiÑkÔkˆNØð = .ð =Ý,¨^Ñ<Ô<�
Ø#Ð8Ð'8ˆJØÐ.Ò.Ð.Ý—’ð>ð !×$Ò$ VÑ,Ô,Ð8°ñ	ô ð ð 'ÐL¨,×*:Ò*:¸:Ñ*FÔ*FÐLÈ"×SÒSÑUÔUˆNØñ F4Ý7Øð %Ø#×'Ò'¨Ñ0Ô0ð%à5AÐK˜×(Ò(¨Ñ1Ô1Ð1Àtð%õ 0Ñ1Ô1ð%ð %Øñô �ð "Ð%9Ò9Ð9Ø"-�KØ(3Ð%Ð%å"5°kÑ"BÔ"B�KØ(3Ð%Ý%>¸{Ñ%KÔ%KÑ"�˜dØ59ÐA˜?¨DÐ1Ð1¸r�Ý7¸¿ºÐDUÑ8VÔ8VÑWÔW�	Øð ;Ø1:�GÐ-Ñ.Ý—’ØYØ˜k¨>Ð+OÐ=OñQô Qð Qð "Ð%9Ò9Ð9ð<ØRÐRÐRÐRÐRÐRØ&<Ð&<¸ZÈÑ&UÔ&U˜˜øÝ&ð <ð <ð <ÝŸšðIð %ñ	ô ð õ *=¸[Ñ)IÔ)I˜Ý,EÀnÑ,UÔ,UÑ)˜	 6ØAGÐ$O _°fÐ$=Ð$=ÈR˜	Ý&AÀ)Ç-Â-ÐPaÑBbÔBbÑ&cÔ&c˜Ø&ð GØ;F˜IÐ&7Ñ8Ý!6Ð!k¸zÐT]Ð!kÐ!kÐajÐ!kÐ!k˜Ø^hð !;Õ 0°¸ÐPYÐ ZÑ ZÔ ZÐ ZØ&,¨kÐ%:ð<ð <ð <ð!<øøøõ$ &>Ø# [°*¸kÐTYð&ñ &ô &�Nð "ð ZÝ<¸^ÑLÔLÈkÐYÐYØ)¨;Ð6Ð6Ý.Ðd°zÈLÐdÐdÐ\cÐdÐd�ð
 "Ð%6Ò6Ð6½zØÕ0ñ@ô @Ð6õ 2°&¸+ÑFÔF�F�Fà,˜_¨V°[ÐBSÐU_Ñ`Ô`�FØV`ð 3Õ(¨°È	ÐRÑRÔRÐRØ$ kÐ2ð4å�NŠNØSØñô ð ð �:ðw[	øõx ð ð ð Øˆðøøøð& �?Ò"Ð"Ý 2ØØ-Ø/Øð	!
ñ !
ô !
Ñˆ�ð ˆ>Ý�NŠNðñô ð ð
 �:Ý/°Ð0F¸ÈÑQÔQˆØNXð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ
 ð ð ð Ý�ŠÐDÀhÑOÔOÐOØˆzˆzðøøøð  ×#Ò# HÑ-Ô-€GØ€ð Õ8Ð8Ð8Ý)×-Ò-¨hÑ7Ô7Ð7Ý�LŠLÐGÈÑRÔRÐRØˆzàÔ˜IÒ%Ñ%Ø�{Ò"Ð"Ý$2ÐDTÐ$UÑ$UÔ$UÑ!ˆF�MØˆ~Ý—’ÐpÑqÔqÐqØ!�zÝ3°EÐ4J¸]ÈHÑUÔUˆKØR\ÐwÕ$ V¨[ÀIÐNÑNÔNÐNÐciÐkvÐbwÐxà4Ð4°XÑ>Ô>ˆÝ�e—i’i 	¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7ˆð
 ð 	:Ø&×,Ò,Ñ.Ô.Ð9°'ˆGÝ˜5Ÿ9š9 Z°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=×DÒDÀSÑIÔIÐgÈWÔMgˆØð 	AØ,×2Ò2Ñ4Ô4×;Ò;¸CÑ@Ô@ˆLØ�xÒÐððð ð ð ð ð ð ð ð ð ð  9Ð8¸ÑFÔF�Øð >Ð#;Ð#;¸LÑ#IÔ#Ið >Ø=�GøøÝð ð ð Ø�ðøøøàð 	Ý  Ô!9Ñ:Ô:ˆMØ˜9Ò$Ð$Ø×$Ò$ _Ñ5Ô5Ð5Ý�LŠLð 6à! 4§9¢9¨]Ñ#;Ô#;ñ=ô =ð =ð �:å& |Ñ4Ô4ˆð ð 	RÝ*Ð+<×+BÒ+BÑ+DÔ+D×+KÒ+KÈCÑ+PÔ+PÑQÔQˆHå3°HÑ=Ô=ˆÝ/°Ð0F¸ÈÑQÔQˆà�xÒÐØaÐaÐaÐaÐaÐaÐaÐaà(Ð(¨Ñ2Ô2ð 4Ø+Ð+°GÀhÐOÑOÔO�Ý—’Ð?ÀÈ;ÑWÔWÐWØV`ð 3Õ(¨°È	ÐRÑRÔRÐRØ$ kÐ2ð4ð ˆÝ  ¨>Ñ:Ô:ð 	Ø$7ˆG�LÑ!Ð!Ý" 8Ð-@ÑAÔAð 	ØGÐGÐGÐGÐGÐGà�NŠNÐ2Ð2Ø"¨iðñ ô ñ ô ð ð õ # 8Ð-GÑHÔHð 	Ø�NŠNÕ3°HÑ=Ô=Ñ>Ô>Ð>Ð>Ý" 8¨VÑ4Ô4ð 	ØAÐAÐAÐAÐAÐAà�NŠNÐ5Ð5Ñ7Ô7Ñ8Ô8Ð8Ð8ðØGÐGÐGÐGÐGÐGØ$˜9 XÑ.Ô.�Øð = Ô 8ð =Ø—N’N 8Ô#;Ñ<Ô<Ð<øøÝð ð ð Ø�ðøøøå2°7Ñ;Ô;ˆØð 	#Ø"ˆGÝ&ð M¨wÀð Mð MØ;BÐJÐ-¨wÐ7Ð7ÈðMð Mˆð �yÒ Ð  [Ð ¸Ð ð	ØOÐOÐOÐOÐOÐOØ4Ð4°[ÑAÔAð GÝ—L’LðOà#ñ%ô %ð %õ 2°&¸+ÑFÔF�FøøÝð ð ð Ø�ðøøøð !� ¨°lÀGÑLÔLˆå�ŠÐ7¸À;ÑOÔOÐOØNXð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð ÔÐ.Ò.Ñ.Ø=Ð=¸hÑGÔGˆÝ/Øð *Ø-9ÐC�× Ò  Ñ)Ô)Ð)¸tð*å'Ñ)Ô)Øñ	
ô 
ˆð �}Ò$Ñ$Ý˜%Ÿ)š) I¨rÑ2Ô2Ñ3Ô3×9Ò9Ñ;Ô;ˆGÝ˜5Ÿ9š9 Z°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=ˆHÝ˜%Ÿ)š) I¨rÑ2Ô2Ñ3Ô3×9Ò9Ñ;Ô;ÐC¸tˆGÝ˜Ÿ	š	 &Ñ)Ô)Ð/¨RÑ0Ô0ˆDØð "Ý—’ð1ñô ð ð "�zØð " (ð "Ý—’ð9ñô ð ð "�zØAÐAÐAÐAÐAÐAà%Ð%ØØ!ØØð	ñ ô ˆFõ �LŠLÐ;¸XÀ{ÑSÔSÐSØR\ð /Õ$ V¨[ÀIÐNÑNÔNÐNØ  +Ð.ð0àÕ;Ð;Ð;Ý,×0Ò0°Ñ:Ô:Ð:Ý�LŠLð .Ø/7ñ9ô 9ð 9àˆzà	Ô	˜hÒ	&Ñ	&ð
	ØVÐVÐVÐVÐVÐVÐVÐVÐVøÝð 	ð 	ð 	Ý�NŠNð 7ñ 8ô 8ð 8à�:�:ð	øøøð
 &Ð%Ñ'Ô'ð 	Ý�LŠLð 4ñ 5ô 5ð 5à�:à+Ð+Ñ-Ô-‰ˆˆxØð 	˜Hð 	Ý�NŠNð Dñ Eô Eð Eà�:à7ˆÝ/°Ð0F¸ÈÑQÔQˆð	Ø%Ð%Ð%Ð%Ð%Ð%Ø�V E°HÐ=Ñ=Ô=ˆFˆFøÝð 	ð 	ð 	Ý�NŠNð (Ø),ñ.ô .ð .à�:�:�:�:�:øøøøð	øøøõ 	�ŠÐ;¸[ÑIÔIÐIØNXð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð 
Ô	˜iÒ	'Ñ	'ð
	ðð ð ð ð ð ð ð ð ð ð
 OÐNÐNÐNÐNÐNÐNøÝð 	ð 	ð 	Ý�NŠNð Bñ Cô Cð Cà�:�:ð	øøøð
 #Ð"Ñ$Ô$ð 	Ý�LŠLð 4ñ 5ô 5ð 5à�:à'Ð'Ñ)Ô)ˆØBˆÝ/°Ð0F¸ÈÑQÔQˆØD¨fÐDÐDÐDˆà%Ð% kÑ2Ô2ð 	.ð"Ø<Ð<¸VÑDÔD��øÝð "ð "ð "Ý—’ð  ,Ø-0ñ2ô 2ð 2à!�z�z�z�z�zøøøøð"øøøõ .Ø˜[°)Ø!ðñ ô ˆFõ �LŠLÐNØ$ fñ.ô .ð .ð .õ ,¨F°KÑ@Ô@ˆFÝ�LŠLÐMØ$ fñ.ô .ð .ð OYð +Õ  ¨À	ÐJÑJÔJÐJØ˜kÐ*ð	,ð 
Ô	ÐEÐ	EÐ	Eà�vÒÐÝ*¨6°5¸*ÑEÔEÐEØ�~Ò%Ð%Ý*¨>¸5À*ÑMÔMÐMØ�{Ò"Ð"Ý*¨;¸¸zÑJÔJÐJàÕ9Ð9Ð9Ý*×.Ò.¨xÑ8Ô8Ð8Ý�LŠLð :Ø;CñEô Eð Eàˆzð
 Ô(¨(Ð3€OØÕ=Ð=Ð=Ý'×+Ò+¨OÑ<Ô<Ð<Ý�ŠÐMØÔ&¨ñ	2ô 	2ð 	2àˆ:s  Ø<1Y. Ù.
Y;Ù:Y;Þ;Hl% çg çl% çBi8é5l% é7i8é8)l% ê"l% ê&A l% ìl% ì%
l2ì1l2î
n% î%%oïoõ,$v ö
vövý:4~/ þ/
~<þ;~<ÿ2<A@/ Á@/
A@<Á@;A@<ÁI/AI8 ÁI8$AJ ÁJAJ ÁLAL ÁL
AMÁL)AM
ÁM
AMÁNAN# ÁN#$AOÁO
AOÁP$AP0 ÁP0
AQ ÁP:AQÁQAQ c                óZ   — t          | pd¦  «        \  }}}}}t          ||||||¬¦  «        S )aR  Return (client, default_model_slug) for text-only auxiliary tasks.

    Args:
        task: Optional task name ("compression", "web_extract") to check
              for a task-specific provider override.

    Callers may override the returned model via config.yaml
    (e.g. auxiliary.compression.model, auxiliary.web_extract.model).
    N)rý   rC  rg  rù  r  ©Ú_resolve_task_provider_modelrw  ©r°  r  rè   rý   r=   r\   rù  s          r   Úget_text_auxiliary_clientr  4  sM   € õ 4PÐPTÐP\ÐX\Ñ3]Ô3]Ñ0€Hˆe�X˜w¨Ý"ØØØ"Ø ØØ!ðñ ô ð r   c          	      ó\   — t          | pd¦  «        \  }}}}}t          ||d||||¬¦  «        S )a  Return (async_client, model_slug) for async consumers.

    For standard providers returns (AsyncOpenAI, model). For Codex returns
    (AsyncCodexAuxiliaryClient, model) which wraps the Responses API.
    Returns (None, None) when no provider is available.
    NT©rý   rO   rC  rg  rù  r  r  r  s          r   Úget_async_text_auxiliary_clientr  M  sP   € õ 4PÐPTÐP\ÐX\Ñ3]Ô3]Ñ0€Hˆe�X˜w¨Ý"ØØØØ"Ø ØØ!ðñ ô ð r   )r{  rÃ  Ú	deepinfrac                 ó¶   — 	 ddl m} ddlm} n# t          $ r Y dS w xY w	  || | |¦   «         ¦  «        }n# t
          $ r Y dS w xY w|€dS t          |¦  «        S )u½  Return True when ``provider``/``model`` is known to accept image input.

    Used by the vision auto-detect chain to skip the user's main provider
    when it's known to be text-only (e.g. DeepSeek, gpt-oss without vision).
    Without this guard, ``resolve_vision_provider_client(provider="auto")``
    would happily return the main-provider client and any subsequent image
    payload would surface as a cryptic provider-side error
    (``unknown variant `image_url`, expected `text```, #31179).

    Returns True when capability lookup is unknown â€” preserves the historical
    behaviour of attempting the call, so providers we haven't catalogued yet
    don't silently regress to text-only.
    r   )Ú_lookup_supports_visionrz  T)Úagent.image_routingr  rH   rA   rU   rK   rn   )rè   rý   r  rA   Úsupportss        r   Ú_main_model_supports_visionr  g  s°   € ðØ?Ð?Ð?Ð?Ð?Ð?Ø:Ð:Ð:Ð:Ð:Ð:Ð:øÝð ð ð ØˆtˆtðøøøðØ*Ð*¨8°UÐ<PÐ<PÑ<RÔ<RÑSÔSˆˆøÝð ð ð ØˆtˆtðøøøàÐð ˆtÝ�‰>Œ>Ðs   ‚ �
œ¡7 ·
AÁAc                 ó    — t          | ¦  «        S r   )rû   ©rè   s    r   Ú_normalize_vision_providerr!  †  s   € Ý" 8Ñ,Ô,Ð,r   c                 ó¾  — t          | ¦  «        } | dk    rt          d|d¬¦  «        S | dk    rt          |¬¦  «        S | dk    rt          d|d¬¦  «        S | dk    rt          d|d¬¦  «        S | dk    rt          ¦   «         S | d	k    rA|pt	          d	¦  «        }|st
                               d
¦  «         dS t          d	|d¬¦  «        S | dk    rt          ¦   «         S dS )Nrâ   TrØ  r{  rZ  rÃ  rð   rà   r  ub   Vision auto-detect: deepinfra catalog unreachable or returned no vision-tagged models â€” skippingrE  rî   )r!  rw  rp  rM  r`  rX   rx   r8  )rè   rý   Úvision_models      r   Ú_resolve_strict_vision_backendr$  Š  s$  € õ *¨(Ñ3Ô3€HØ�9ÒÐÝ& y°%À4ÐHÑHÔHÐHØ�<ÒÐÝ UÐ+Ñ+Ô+Ð+Ø�6ÒÐõ ' v¨uÀÐEÑEÔEÐEØ�>Ò!Ð!õ ' ~°uÈÐMÑMÔMÐMØ�;ÒÐÝÑÔÐØ�;ÒÐð ÐMÕ @ÀÑ MÔ MˆØð 	Ý�LŠLð@ñô ð ð �:Ý& {°LÈDÐQÑQÔQÐQØ�8ÒÐÝ#Ñ%Ô%Ð%Øˆ:r   c                 ó0   — t          | ¦  «        d         d uS r†  )r$  r   s    r   Ú _strict_vision_backend_availabler&  ³  s   € Ý)¨(Ñ3Ô3°AÔ6¸dÐBÐBr   c                  ó^  — g } t          ¦   «         }|rh|dvrd|t          v r%t          |¦  «        r|                      |¦  «         n6t	          |t          ¦   «         ¦  «        \  }}|�|                      |¦  «         t          D ]*}|| vr$t          |¦  «        r|                      |¦  «         Œ+| S )uø   Return the currently available vision backends in auto-selection order.

    Order: active provider â†’ OpenRouter â†’ Nous â†’ stop.  This is the single
    source of truth for setup, tool gating, and runtime auto-routing of
    vision tasks.
    >   rB   rê   )rö   Ú_VISION_AUTO_PROVIDER_ORDERr&  r&  rw  r‡  )Ú	availablerd  rZ   rY  rb  s        r   Úget_available_vision_backendsr*  ·  sÎ   € ð €Iå'Ñ)Ô)€MØð 0˜¨lÐ:Ð:ØÕ7Ð7Ð7Ý/°Ñ>Ô>ð 0Ø× Ò  Ñ/Ô/Ð/øå/°Õ?OÑ?QÔ?QÑRÔR‰IˆF�AØÐ!Ø× Ò  Ñ/Ô/Ð/å(ð  ð  ˆØ�IÐÐÕ"BÀ1Ñ"EÔ"EÐØ×Ò˜QÑÔÐøØÐr   )r=   r\   rO   r  c                óÆ  ‡‡#— t          |¦  «        }t          d| |||¦  «        \  }Š#}}	}
t          |¦  «        }dt          dt          dt
          t                   fˆˆ#fd„}|r/|r|dvr|nd}t          |‰#‰||	|
|¬¦  «        \  }}|€|d	d	fS |||fS |d
k    �r›t          |                     d¦  «        pt          ¦   «         ¦  «        }t          |                     d¦  «        pt          ¦   «         ¦  «        }| 
                    ¦   «                              ¦   «         dk    r8t          |¦  «        \  }}|r$|r"||}}t          |¦  «        }d|d<   d|d<   d|d<   |�r†|dv�r�t          |¦  «        }|p|}|dk    rFt          |‰#p|¦  «        \  }}|�-t                                d||p‰#p|¦  «          ||||¦  «        S �n"|t$          v rt                                d|¦  «         nýt)          ||¦  «        st                                d|¦  «         nÑd	}d	}|
}|dk    s|                     d¦  «        rh|                     d¦  «        }|r3|}|                     d¦  «        pd	}|
p|                     d¦  «        pd	}nt-          ¦   «         \  }}}|r
|}|}|
p|pd	}t          ||||||d¬¦  «        \  }}|�-t                                d||p|¦  «          ||||p|¦  «        S t.          D ],} | |k    rŒ	t          | ¦  «        \  }}|� || ||¦  «        c S Œ-t                                d¦  «         dS |t.          v r t          |‰#¦  «        \  }} ||||¦  «        S |dk    r\|sZddg}!|!D ]/}"t1          |‰#‰|"|	pd	d|d¬ ¦  «        \  }}|� ||||¦  «        c S Œ0t1          |‰#‰|
|d¬!¦  «        \  }}|€|d	d	fS |||fS t1          |‰#‰|
|d¬!¦  «        \  }}|€|d	d	fS |||fS )"ar  Resolve the client actually used for vision tasks.

    Direct endpoint overrides take precedence over provider selection. Explicit
    provider overrides still use the generic provider router for non-standard
    backends, so users can intentionally force experimental providers. Auto mode
    stays conservative and only tries vision backends known to work today.
    rs  rå  rÁ  r  c                 ó\   •— |€| d d fS ‰p|}‰rt          ||d¬¦  «        \  }}| ||fS | ||fS )NTrØ  )rÈ  )rå  rÁ  r  rL  Úasync_clientÚasync_modelrO   rø  s         €€r   Ú	_finalizez1resolve_vision_provider_client.<locals>._finalizeæ  s]   ø€ ØÐØ$ d¨DÐ0Ð0Ø$Ð5¨ˆØð 	@Ý(8¸ÀkÐ]aÐ(bÑ(bÔ(bÑ%ˆL˜+Ø$ l°KÐ?Ð?Ø  +¨{Ð:Ð:r   >   rB   rê   rî   r  Nrê   rè   rý   r”  rB   r=   r\   rù  >   rB   r”  rê   rÃ  z/Vision auto-detect: using main provider %s (%s)ui   Vision auto-detect: skipping main provider %s (no vision support) â€” falling through to aggregator chainut   Vision auto-detect: skipping main provider %s (reports no vision capability) â€” falling through to aggregator chainrë   T)rù  rC  rg  r  r·  z'Auxiliary vision client: none availabler  rÒ   z$https://open.bigmodel.cn/api/paas/v4zhttps://api.z.ai/api/paas/v4r²  ©r=   r\   rù  r  r·  )rù  r  r·  )r  r  r!  rI   r   r
   rw  rJ   rö   r‡  rò   ró   r›  ro  r`  r$  rX   rl  ra  rx   r  rô   r  r(  r  )$rè   rý   r=   r\   rO   r  r|  r  rù  rú  rû  r/  Úprovider_for_base_overriderZ   rL  rd  rx  ry  rz  Úprovider_vision_defaultr#  rÁ  r  Úrpc_base_urlÚrpc_api_keyÚrpc_api_moderÅ  r  r  r  Ú
rpc_clientÚ	rpc_modelr�  Úzai_openai_urlsÚ_zai_urlrø  s$       `                              @r   r  r  Ð  sü  øø€ õ  & lÑ3Ô3€GÝXtØ�(˜E 8¨WñYô YÑU€Iˆ~Ð0Ð2BÐDUõ +¨9Ñ5Ô5€Ið;¥Sð ;µsð ;Í8ÕTWÌ=ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ð ?à"ÐR y¸Ð'DÐ'DˆIˆIÈ(ð 	#õ 6Ø&Ø Ø!Ø/Ø-Ø&Ø ð
ñ 
ô 
Ñˆ�ð ˆ>Ø-¨t°TÐ9Ð9Ø)¨6°;Ð>Ð>à�FÒÑõ$ ˜GŸKšK¨
Ñ3Ô3ÐLÕ7JÑ7LÔ7LÑMÔMˆÝ˜Ÿš WÑ-Ô-ÐCÕ1AÑ1CÔ1CÑDÔDˆ
Ø×ÒÑ Ô ×&Ò&Ñ(Ô(¨EÒ1Ð1õ )@À
Ñ(KÔ(KÑ%ˆM˜:Øð ) ð )Ø,9¸:˜z�õ ˜w™-œ-�Ø&(�˜
Ñ#Ø%'�˜	Ñ"Ø&(�˜
Ñ#Øñ c	N˜]Ð2EÐEÑEõ 'GÀ}Ñ&UÔ&UÐ#Ø2Ð@°jˆLØ Ò&Ð&õ .LØ! >Ð#LÐ5Lñ.ô .Ñ*�˜]ð Ð*Ý—K’KØIØ% }Ð'T¸Ð'TÈ*ñô ð ð %˜9 ]°KÀÑOÔOÐOñ +ð Õ";Ð;Ð;õ —’ðNà!ñô ð ð õ
 1°ÀÑMÔMð <Nõ —’ð'ð "ñ	ô ð ð ð  $�Ø"�Ø0�Ø  HÒ,Ð,°×0HÒ0HÈÑ0SÔ0SÐ,Ø'.§{¢{°:Ñ'>Ô'>Ð$Ø'ð TØ'7˜Ø&-§k¢k°)Ñ&<Ô&<Ð&DÀ˜à-ð $Ø&Ÿ{š{¨:Ñ6Ô6ð$à#ð %˜õ @WÑ?XÔ?XÑ<˜ Z°Ø&ð TØ+6˜LØ*4˜KØ+<Ð+SÀÐ+SÈt˜LÝ(?Ø! <Ø)Ø&2Ø%0Ø!(Ø"ð)$ñ )$ô )$Ñ%�
˜Ið Ð)Ý—K’KØIØ% yÐ'@°Lñô ð ð %˜9Ø% z°9Ð3LÀñNô Nð Nõ
 5ð 	Hð 	HˆIØ˜MÒ)Ð)ØÝ)GÈ	Ñ)RÔ)RÑ&ˆK˜ØÐ&Ø �y ¨K¸ÑGÔGÐGÐGÐGð 'õ 	�ŠÐ>Ñ?Ô?Ð?ØÐàÕ/Ð/Ð/Ý%CØ�~ñ&
ô &
Ñ"ˆ�]ð ˆy˜ K°Ñ?Ô?Ð?ð �EÒÐÐ"3Ðà2Ø*ð
ˆð (ð 
	Að 
	AˆHÝ"4Ø˜>¨:Ø!Ø(Ð0¨DØ+Ø$Øð#ñ #ô #ÑˆF�Kð Ð!Ø �y ¨F°KÑ@Ô@Ð@Ð@Ð@ð "õ 1°¸NÈJØ:KØ>EØ;?ðAñ Aô AÑˆ�ð ˆ>Ø˜d DÐ(Ð(Ø˜& +Ð-Ð-å,¨Y¸È
Ø6GØ:AØ7;ð=ñ =ô =Ñ€FˆKð €~Ø˜$ Ð$Ð$Ø�f˜kÐ)Ð)r   c                  ó0   — t           rt          ¦   «         ni S )z·Return extra_body kwargs for auxiliary API calls.
    
    Includes Nous Portal product tags when the auxiliary client is backed
    by Nous Portal. Returns empty dict otherwise.
    )r—  r–  r   r   r   Úget_auxiliary_extra_bodyr;  Â  s   € õ "3Ð:ÕÑÔÐ¸Ð:r   rZ  rv  c                óö   — t          ¦   «         }t          d¦  «        }t          |¦  «        pd}|s3t          ¦   «         €%|dk    s|dk    s|                     d¦  «        rd| iS t          |¦  «        rd| iS d| iS )	u  Return the correct max tokens kwarg for the auxiliary client's provider.

    OpenRouter and local models use 'max_tokens'. Direct OpenAI with newer
    models (gpt-4o, gpt-4.1, gpt-5+, o-series) requires 'max_completion_tokens'.
    The Codex adapter translates max_tokens internally, so we use max_tokens
    for it as well. Pass ``model`` so third-party OpenAI-compatible endpoints
    fronting the newer families are also recognised â€” URL-only detection
    misses the case where a custom base URL serves e.g. ``gpt-5.4``.
    rk  rB   NrÑ  r%  z.githubcopilot.comr¦  r¥  )r  rÝ  r5   r  rC  r7   )rv  rý   r  ro  Ú_custom_hosts        r   Úauxiliary_max_tokens_paramr>  Ë  s§   € õ +Ñ,Ô,€KÝÐ1Ñ2Ô2€Fõ % [Ñ1Ô1Ð7°R€LØð 0ÝÑ!Ô!Ð)àÐ 0Ò0Ð0ØÐ#:Ò:Ð:Ø×(Ò(Ð)=Ñ>Ô>ð ;ð (¨Ð/Ð/å)¨%Ñ0Ô0ð 0Ø'¨Ð/Ð/Ø˜%Ð Ð r   rÖ  é@   c                   óN   — e Zd ZdZdZdeddfd„Zdefd„Zde	de
fd	„Zdefd
„ZdS )Ú_CallableCacheDiscriminatorzBHash a credential callback by identity without exposing its state.©Ú	_callbackrž   r   Nc                 ó   — || _         d S r   rB  )r   rž   s     r   rg   z$_CallableCacheDiscriminator.__init__  s   € à!ˆŒˆˆr   c                 ó*   — t          | j        ¦  «        S r   )r1  rC  r(   s    r   Ú__hash__z$_CallableCacheDiscriminator.__hash__  s   € Ý�$”.Ñ!Ô!Ð!r   Úotherc                 óH   — t          |t          ¦  «        o| j        |j        u S r   )r$   rA  rC  )r   rG  s     r   Ú__eq__z"_CallableCacheDiscriminator.__eq__  s&   € å�uÕ9Ñ:Ô:ð 2Ø” %¤/Ð1ð	
r   c                 ó   — dS )Nz<callable-api-key>r   r(   s    r   r)   z$_CallableCacheDiscriminator.__repr__  s   € Ø#Ð#r   )r*   r+   r,   r-   r.   r   rg   r…  rF  Úobjectrn   rI  rI   r)   r   r   r   rA  rA  ÿ  s™   € € € € € ØLÐLà€Ið" ð "¨ð "ð "ð "ð "ð"˜#ð "ð "ð "ð "ð
˜Fð 
 tð 
ð 
ð 
ð 
ð$˜#ð $ð $ð $ð $ð $ð $r   rA  c                 ó  — | dk    rt          |¦  «        rt          |¦  «        S | dk    rVt          |t          ¦  «        rA|r?t	          j        |                     d¦  «        d¬¦  «                             ¦   «         }d|fS |S )z;Return a hashable, secret-safe runtime cache-key component.r\   zutf-8é   )Údigest_sizezapi-key-digest)ry   rA  r$   rI   ÚhashlibÚblake2bÚencodeÚdigest)rú  rv  rR  s      r   Ú_runtime_cache_discriminatorrS    s�   € à�	ÒÐ�h u™oœoÐÝ*¨5Ñ1Ô1Ð1Ø�	ÒÐ�j¨µÑ4Ô4Ð¸ÐÝ” §¢¨gÑ!6Ô!6ÀBÐGÑGÔG×NÒNÑPÔPˆØ  &Ð)Ð)Ø€Lr   )r=   r\   rù  r  r·  r°  rý   c          
      ó   ‡— t          |¦  «        Š| dk    r t          ˆfd„t          D ¦   «         ¦  «        nd}	| dk    r|pdnd}
t          | |¬¦  «        }|p‰                     dd¦  «        }t          d|pd¦  «        }| ||pd||pd|	||
||f
S )Nrê   c              3   ó`   •K  — | ](}t          |‰                     |d ¦  «        ¦  «        V — Œ)dS ©rB   N)rS  rJ   r   s     €r   r9  z$_client_cache_key.<locals>.<genexpr>,  sO   øè è € ð ð àõ 	% U¨G¯KªK¸¸rÑ,BÔ,BÑCÔCðð ð ð ð ð r   r   rB   rß  rý   r\   )r  r(  r÷  râ  rJ   rS  )rè   rO   r=   r\   rù  r  r·  r°  rý   Úruntime_keyÚtask_keyÚ	pool_hintÚ	model_keyÚapi_key_keyr|  s                 @r   Ú_client_cache_keyr\    së   ø€ õ & lÑ3Ô3€Gð 
�VÒ	Ð	õ ð ð ð ð å)ðñ ô ñ ô ð ð "$ð ð  (¨6Ò1Ð1��
˜ø°r€HÝ  ¸ÐEÑEÔE€Ið Ð1˜Ÿš W¨bÑ1Ô1€IÝ.¨y¸'¸-ÀRÑHÔH€KØ�j ( .¨b°+¸x¸~È2È{Ð\eÐgoÐqzð  }Fð  Gð  Gr   ©Ú
bound_loopÚ	cache_keyr  r^  c                óÖ   — t           5  t                               | ¦  «        }|�|d         |urt          |d         ¦  «         |||ft          | <   d d d ¦  «         d S # 1 swxY w Y   d S r†  )rÕ  rÖ  rJ   r×  )r_  rZ   r  r^  Ú	old_entrys        r   Ú_store_cached_clientrb  C  sÊ   € Ý	ð Gð GÝ!×%Ò% iÑ0Ô0ˆ	ØÐ  Y¨q¤\¸Ð%?Ð%?Ý  ¨1¤Ñ.Ô.Ð.Ø$*¨M¸:Ð#F��iÑ ð	Gð Gð Gñ Gô Gð Gð Gð Gð Gð Gð Gð Gøøøð Gð Gð Gð Gð Gð Gs   ˆA	AÁA"Á%A"r0  Úcache_providerc           
      óJ  — t          d¬¦  «        }|€d|fS |\  }	}
t          |	|
¬¦  «        }|}d}|rB	 ddl}|                     ¦   «         }n# t          $ r Y nw xY wt          ||pd|¬¦  «        \  }}n|}t          | |||||||¬¦  «        }t          ||||¬	¦  «         ||fS )
zLRefresh Nous runtime creds, rebuild the client, and replace the cache entry.Tr#  Nr_   r   rB   rØ  )rO   r=   r\   rù  r  r·  rý   r]  )r3  ra   rˆ  Úget_event_looprN  rÈ  r\  rb  )rc  rý   rO   r=   r\   rù  r  r·  r|  Ú	fresh_keyÚfresh_base_urlrÁ  rL  Úcurrent_loopÚ_aiorZ   r_  s                    r   Ú_refresh_nous_auxiliary_clientrj  K  s  € õ (°dÐ;Ñ;Ô;€GØ€Ø�Uˆ{Ðà 'Ñ€Iˆ~Ý'°	ÀNÐSÑSÔS€KØ€Kà€LØð ð	Ø"Ð"Ð"Ð"Ø×.Ò.Ñ0Ô0ˆLˆLøÝð 	ð 	ð 	ØˆDð	øøøå.¨{¸KÐ<MÈ2ÐYbÐcÑcÔcÑˆ��àˆå!ØØØØØØ!ØØð	ñ 	ô 	€Iõ ˜ F¨KÀLÐQÑQÔQÐQØ�;ÐÐs   ´A Á
AÁAc                  óT   — 	 ddl m}  d„ | _        dS # t          t          f$ r Y dS w xY w)a  Monkey-patch ``AsyncHttpxClientWrapper.__del__`` to be a no-op.

    The OpenAI SDK's ``AsyncHttpxClientWrapper.__del__`` schedules
    ``self.aclose()`` via ``asyncio.get_running_loop().create_task()``.
    When an ``AsyncOpenAI`` client is garbage-collected while
    prompt_toolkit's event loop is running (the common CLI idle state),
    the ``aclose()`` task runs on prompt_toolkit's loop but the
    underlying TCP transport is bound to a *different* loop (the worker
    thread's loop that the client was originally created on).  If that
    loop is closed or its thread is dead, the transport's
    ``self._loop.call_soon()`` raises ``RuntimeError("Event loop is
    closed")``, which prompt_toolkit surfaces as "Unhandled exception
    in event loop ... Press ENTER to continue...".

    Neutering ``__del__`` is safe because:
    - Cached clients are explicitly cleaned via ``_force_close_async_httpx``
      on stale-loop detection and ``shutdown_cached_clients`` on exit.
    - Uncached clients' TCP connections are cleaned up by the OS when the
      process exits.
    - The OpenAI SDK itself marks this as a TODO (``# TODO(someday):
      support non asyncio runtimes here``).

    Call this once at CLI startup, before any ``AsyncOpenAI`` clients are
    created.
    r   ©ÚAsyncHttpxClientWrapperc                 ó   — d S r   r   r(   s    r   r¯  z(neuter_async_httpx_del.<locals>.<lambda>”  s   € °t€ r   N)Úopenai._base_clientrm  Ú__del__rU   rV   rl  s    r   Úneuter_async_httpx_delrq  x  sR   € ð4Ø?Ð?Ð?Ð?Ð?Ð?Ø*;Ð*;ÐÔ'Ð'Ð'øÝ�Ð(ð ð ð Øˆˆðøøøs   ‚ ’'¦'c                 óž   — 	 ddl m} t          | dd¦  «        }|�t          |dd¦  «        s|j        |_        dS dS dS # t
          $ r Y dS w xY w)uÁ  Mark the httpx AsyncClient inside an AsyncOpenAI client as closed.

    This prevents ``AsyncHttpxClientWrapper.__del__`` from scheduling
    ``aclose()`` on a (potentially closed) event loop, which causes
    ``RuntimeError: Event loop is closed`` â†’ prompt_toolkit's
    "Press ENTER to continue..." handler.

    We intentionally do NOT run the full async close path â€” the
    connections will be dropped by the OS when the process exits.
    r   )ÚClientStaterâ  NÚ	is_closedT)Úhttpx._clientrs  ro   ÚCLOSEDÚ_staterK   )rZ   rs  Úinners      r   Ú_force_close_async_httpxry  ™  s   € ðØ-Ð-Ð-Ð-Ð-Ð-Ý˜ 	¨4Ñ0Ô0ˆØÐ¥W¨U°KÀÑ%FÔ%FÐØ&Ô-ˆEŒLˆLˆLð ÐÐÐøåð ð ð Øˆˆðøøøs   ‚6> ¾
AÁAc                 óÔ   — | €dS t          | ¦  «         	 t          | dd¦  «        }t          |¦  «        r t          j        |¦  «        s |¦   «          dS dS dS # t
          $ r Y dS w xY w)zBApply the canonical best-effort close policy to one cached client.Nr  )ry  ro   ry   ÚinspectÚiscoroutinefunctionrK   )rZ   rh  s     r   r×  r×  ­  s—   € à€~ØˆÝ˜VÑ$Ô$Ð$ðÝ˜6 7¨DÑ1Ô1ˆÝ�HÑÔð 	¥gÔ&AÀ(Ñ&KÔ&Kð 	ØˆH‰JŒJˆJˆJˆJð	ð 	ð 	ð 	øåð ð ð Øˆˆðøøøs   •>A Á
A'Á&A'c                  ó  — t           5  t          t                               ¦   «         ¦  «        D ]\  } }|d         }|€Œt	          |¦  «         Œ t                               ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )zÜClose all cached clients (sync and async) to prevent event-loop errors.

    Call this during CLI shutdown, *before* the event loop is closed, to
    avoid ``AsyncHttpxClientWrapper.__del__`` raising on a dead loop.
    r   N)rÕ  rE  rÖ  rÅ   r×  rM  )r:  r½  rZ   s      r   Úshutdown_cached_clientsr~  º  sÉ   € õ 
ð ð Ý�}×2Ò2Ñ4Ô4Ñ5Ô5ð 	)ð 	)‰JˆC�Ø˜1”XˆFØˆ~ØÝ  Ñ(Ô(Ð(Ð(Ý×ÒÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ˆA A5Á5A9Á<A9c                  ó$  — t           5  g } t                               ¦   «         D ]E\  }}|\  }}}|�8|                     ¦   «         r$t	          |¦  «         |                      |¦  «         ŒF| D ]
}t          |= Œ	 ddd¦  «         dS # 1 swxY w Y   dS )uK  Force-close cached async clients whose event loop is closed.

    Call this after each agent turn to proactively clean up stale clients
    before GC can trigger ``AsyncHttpxClientWrapper.__del__`` on them.
    This is defense-in-depth â€” the primary fix is ``neuter_async_httpx_del``
    which disables ``__del__`` entirely.
    N)rÕ  rÖ  rÅ   rt  ry  r&  )rØ  r:  r½  rZ   Ú_defaultÚcached_loops         r   Úcleanup_stale_async_clientsr‚  É  s÷   € õ 
ð #ð #Øˆ
Ý'×-Ò-Ñ/Ô/ð 	'ð 	'‰JˆC�Ø,1Ñ)ˆF�H˜kØÐ&¨;×+@Ò+@Ñ+BÔ+BÐ&Ý(¨Ñ0Ô0Ð0Ø×!Ò! #Ñ&Ô&Ð&øØð 	#ð 	#ˆCÝ˜cÐ"Ð"ð	#ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #s   ˆA/BÂB	ÂB	c           
      ó¸   — | t          | dd ¦  «        t          | dd ¦  «        fD ]5}|r1t          t          t          |dd¦  «        pd¦  «        d¦  «        r dS Œ6dS )Nrâ  rZ   r=   rB   r  TF)ro   r4   rI   )rZ   r%   s     r   Ú_is_openrouter_clientr„  Ü  sr   € Ø� ¨	°4Ñ8Ô8½'À&È(ÐTXÑ:YÔ:YÐZð ð ˆØð 	Õ(­­W°S¸*ÀbÑ-IÔ-IÐ-OÈRÑ)PÔ)PÐRaÑbÔbð 	Ø�4�4øØˆ5r   Úcached_defaultc                 óJ   — t          | ¦  «        rdS t          |od|v ¦  «        S )zFBest-effort check for cached clients that accept ``vendor/model`` IDs.Trÿ   )r„  rn   )rZ   r…  s     r   Ú#_cached_client_accepts_slash_modelsr‡  ã  s/   € å˜VÑ$Ô$ð ØˆtÝ�Ð8 3¨.Ð#8Ñ9Ô9Ð9r   c                 ó:   — |rd|v rt          | |¦  «        s|S |p|S )z Keep slash-bearing model IDs only for cached clients that support them.

    Mirrors the guard in resolve_provider_client() which is skipped on cache hits.
    rÿ   )r‡  )rZ   rý   r…  s      r   Ú_compat_modelr‰  ê  s5   € ð
 ð �˜��Õ&IÈ&ÐR`Ñ&aÔ&a�ØÐØÐ"�NÐ"r   c	                 ó>  — d}	|r*	 ddl }
|
                     ¦   «         }	n# t          $ r Y nw xY wt          |¦  «        }t	          | ||||||||¬¦	  «	        }t
          5  |t          v rŒt          |         \  }}}|rX|duo||	u o|                     ¦   «          }|r!t          |||¦  «        }||fcddd¦  «         S t          |¦  «         t          |= n!t          |||¦  «        }||fcddd¦  «         S ddd¦  «         n# 1 swxY w Y   |}|s1t          t          | ¦  «        ¦  «        }|�t          |¦  «        }|r|}t          | ||||||||¬¦	  «	        \  }}|�½|	}t
          5  |t          vrqt          t          ¦  «        t          k    rFt!          t#          t          ¦  «        ¦  «        }t          |= t          t          ¦  «        t          k    °F|||ft          |<   n"|}t          |         \  }}}t%          |¦  «         ddd¦  «         n# 1 swxY w Y   ||p|fS )a  Get or create a cached client for the given provider.

    Async clients (AsyncOpenAI) use httpx.AsyncClient internally, which
    binds to the event loop that was current when the client was created.
    Using such a client on a *different* loop causes deadlocks or
    RuntimeError.  To prevent cross-loop issues, the cache validates on
    every async hit that the cached loop is the *current, open* loop.
    If the loop changed (e.g. a new gateway worker-thread loop), the stale
    entry is replaced in-place rather than creating an additional entry.

    This keeps cache size bounded to one entry per unique provider config,
    preventing the fd-exhaustion that previously occurred in long-running
    gateways where recycled worker threads created unbounded entries (#10200).
    Nr   )rO   r=   r\   rù  r  r·  r°  rý   )rC  rg  rù  r  r·  r°  )rˆ  re  rN  r  r\  rÕ  rÖ  rt  r‰  ry  r¼  rû   rÀ  rw  r¡  Ú_CLIENT_CACHE_MAX_SIZEÚnextÚiterr×  )rè   rý   rO   r=   r\   rù  r  r·  r°  rh  ri  r|  r_  Úcached_clientr…  r�  Úloop_okÚ	effectiveÚeffective_api_keyÚ_peÚ_pkrZ   r  r^  Ú	evict_keyÚbuilt_clientrY  s                              r   r  r  ô  sr  € ð> €LØð ð	Ø"Ð"Ð"Ð"Ø×.Ò.Ñ0Ô0ˆLˆLøÝð 	ð 	ð 	ØˆDð	øøøå% lÑ3Ô3€GÝ!ØØØØØØ!ØØØð
ñ 
ô 
€Iõ 
ð 0ð 0Ø�Ð%Ð%Ý9FÀyÔ9QÑ6ˆM˜>¨;Øð 0ð
   tÐ+ð 4Ø# |Ð3ð4à'×1Ò1Ñ3Ô3Ð3ð ð
 ð 4Ý -¨m¸UÀNÑ SÔ S�IØ(¨)Ð3ð0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0õ  )¨Ñ7Ô7Ð7Ý! )Ð,Ð,å)¨-¸ÀÑOÔO�	Ø$ iÐ/ð)0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð6  ÐØð (ÝÕ6°xÑ@Ô@ÑAÔAˆØˆ?Ý'¨Ñ,Ô,ˆCØð (Ø$'Ð!Ý3ØØØØ"Ø*ØØØØð
ñ 
ô 
Ñ€FˆMð Ðð "ˆ
Ýð 	3ð 	3Ø¥Ð-Ð-õ �-Ñ(Ô(Õ,BÒBÐBÝ $¥T­-Ñ%8Ô%8Ñ 9Ô 9�IÝ% iÐ0õ �-Ñ(Ô(Õ,BÒBÐBð -3°MÀ:Ð+N•˜iÑ(Ð(à%�Ý+8¸Ô+CÑ(�˜ qõ % \Ñ2Ô2Ð2ð#	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð$ �5Ð)˜MÐ)Ð)s8   † Ÿ
,«,ÁAC?Â:,C?Ã?DÄDÅ%BHÈHÈHr   zhttps://api.openai.com/v1Ú_AUX_DIRECT_API_BASE_URLSc           	      óÚ  — d}d}d}d}d}	| �r‚t          | ¦  «        }
t          |
                     dd¦  «        ¦  «                             ¦   «         pd}t          |
                     dd¦  «        ¦  «                             ¦   «         pd}t          |
                     dd¦  «        ¦  «                             ¦   «         pd}t          |
                     dd¦  «        ¦  «                             ¦   «         pd}|s^t          |
                     d¦  «        p|
                     d¦  «        pd¦  «                             ¦   «         }|rt	          |¦  «        pd}t          |
                     d	d¦  «        ¦  «                             ¦   «         pd}	|r|                     ¦   «         d
k    rd}|r|                     ¦   «         d
k    rd}|p|}|	}dt          dt          t                   dt          t          t          t                   f         fd„}|ret          |¦  «                             ¦   «                              ¦   «         dk    r. |||¦  «        \  }}|r|                     ¦   «         dk    rd}d}nh|rft          |¦  «                             ¦   «                              ¦   «         dk    r/ |||¦  «        \  }}|r|                     ¦   «         dk    r|}d}d}dt          t                   dt          t                   dt          t          t                   t          t                   f         fd„}dt          t                   dt          fd„}|r |||¦  «        \  }}|r |||¦  «        \  }}|r|d
k    r|s|r|d|fv r|}|s|}|r ||¦  «        r|||||fS |rd||||fS |r|||||fS | r2|r	|rd||||fS |r|r|d
k    r|||d|fS |r|d
k    r|||||fS d
|dd|fS d
|dd|fS )ad  Determine provider + model for a call.

    Priority:
      1. Explicit provider/model/base_url/api_key args (always win)
      2. Config file (auxiliary.{task}.provider/model/base_url)
      3. "auto" (full auto-detection chain)

    Returns (provider, model, base_url, api_key, api_mode) where model may
    be None (use provider default). A bare base_url is treated as custom, but
    a first-class provider plus base_url keeps the provider identity so its
    auth, transport, and request-shaping behavior still apply. api_mode is one
    of "chat_completions", "codex_responses", or None (auto-detect).
    Nrè   rB   rý   r=   r\   rÛ  rÜ  rù  rê   r  Úmdlr   c                 óš   — |                       ¦   «                              ¦   «         dk    r| |fS t          |¦  «        \  }}|r|r||fS | |fS )Nr”  )rò   ró   r›  )r  r˜  r™  rš  s       r   Ú_unwrap_moa_providerz:_resolve_task_provider_model.<locals>._unwrap_moa_providerÈ  sa   € Ø�:Š:‰<Œ<×ÒÑÔ 5Ò(Ð(Ø˜�9ÐÝ"9¸#Ñ">Ô">Ñˆ�iØð 	+˜Ið 	+Ø Ð*Ð*Ø�SˆyÐr   r”  Úexisting_basec                 ó¢   — | s| |fS t                                |                      ¦   «                              ¦   «         ¦  «        }|€| |fS d|p|fS )Nrî   )r–  rJ   rò   ró   )r  r›  Útarget_bases      r   Ú_expand_direct_api_aliasz>_resolve_task_provider_model.<locals>._expand_direct_api_aliasæ  s]   € Øð 	'Ø˜Ð&Ð&Ý/×3Ò3°D·J²J±L´L×4FÒ4FÑ4HÔ4HÑIÔIˆØÐØ˜Ð&Ð&Ø˜Ð5¨+Ð5Ð5r   c                 óò   — t          | pd¦  «                             ¦   «                              ¦   «         }|dv s|                     d¦  «        rdS 	 ddlm}  ||¦  «        d uS # t          $ r |dv cY S w xY w)NrB   >   rB   rê   rî   rë   Fr   )Úget_provider>   ú
qwen-oauthrÃ  râ   rà   r7  rã   rð   úminimax-oauth)rI   rò   ró   rô   rì  r   rK   )r  rø   r   s      r   Ú _preserve_provider_with_base_urlzF_resolve_task_provider_model.<locals>._preserve_provider_with_base_urlî  s²   € Ý˜˜ ‘_”_×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4ˆ
ØÐ/Ð/Ð/°:×3HÒ3HÈÑ3SÔ3SÐ/Ø�5ð	Ø9Ð9Ð9Ð9Ð9Ð9à�< 
Ñ+Ô+°4Ð7Ð7øÝð 	ð 	ð 	ð ð 	"ð 	ð 	ð 	ð 	ð	øøøs   ÁA% Á%A6Á5A6rî   )	r,  rI   rJ   rò   rÝ  ró   r
   r   rn   )r°  rè   rý   r=   r\   rR  rm  rS  Úcfg_api_keyÚcfg_api_moder‰  Úcfg_key_envrø  rû  rš  rž  r£  s                    r   r  r  }  sè  € ð( €LØ€IØ€LØ€KØ€Làñ LÝ0°Ñ6Ô6ˆÝ˜;Ÿ?š?¨:°rÑ:Ô:Ñ;Ô;×AÒAÑCÔCÐKÀtˆÝ˜Ÿš¨°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=ÐEÀˆ	Ý˜;Ÿ?š?¨:°rÑ:Ô:Ñ;Ô;×AÒAÑCÔCÐKÀtˆÝ˜+Ÿ/š/¨)°RÑ8Ô8Ñ9Ô9×?Ò?ÑAÔAÐIÀTˆàð 	CÝØ—’ 	Ñ*Ô*ÐR¨k¯oªo¸mÑ.LÔ.LÐRÐPRñô çŠe‰gŒgð ð ð CÝ-¨kÑ:Ô:ÐB¸d�Ý˜;Ÿ?š?¨:°rÑ:Ô:Ñ;Ô;×AÒAÑCÔCÐKÀtˆð  ð �—’‘” &Ò(Ð(ØˆØð �Y—_’_Ñ&Ô&¨&Ò0Ð0Øˆ	àÐ'˜i€NØ$Ðð¥3ð ­Xµc¬]ð ½uÅSÍ(ÕSVÌ-ÐEWÔ?Xð ð ð ð ð ð •C˜‘M”M×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1°UÒ:Ð:Ø#7Ð#7¸À.Ñ#QÔ#QÑ ˆ�.ð
 ð 	˜ŸšÑ(Ô(¨EÒ1Ð1ØˆHØˆGøØ	ð �#˜lÑ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;¸uÒDÐDØ"6Ð"6°|À^Ñ"TÔ"TÑˆ�iØð 	˜L×.Ò.Ñ0Ô0°EÒ9Ð9Ø&ˆNØˆLØˆKð6¥xµ¤}ð 6ÅXÍcÄ]ð 6ÕW\Õ]eÕfiÔ]jÕltÕuxÔlyÐ]yÔWzð 6ð 6ð 6ð 6ð­x½¬}ð Åð ð ð ð ð, ð JØ5Ð5°hÀÑIÔIÑˆ�(Øð ZØ%=Ð%=¸lÈLÑ%YÔ%YÑ"ˆ�lð ð "�H Ò&Ð&¨xÐ&¸LÐ&È\Ð^bÐdlÐ]mÐMmÐMmØˆØð 	"Ø!ˆGàð NÐ4Ð4°XÑ>Ô>ð NØ˜¨°7Ð<MÐMÐMØð NØ˜¨°7Ð<MÐMÐMØð NØ˜¨°7Ð<MÐMÐMàð Eàð 	Z˜Kð 	Zà˜^¨\¸;ÐHYÐYÐYØð 	W˜Lð 	W¨\¸VÒ-CÐ-Cð   °¸tÐEVÐVÐVØð 	^˜L¨FÒ2Ð2Ø °¸{ÐL]Ð]Ð]à�~ t¨TÐ3DÐDÐDà�> 4¨Ð/@Ð@Ð@r   ç      >@g     Àr@c                 ó`  — | si S 	 ddl m}  |¦   «         }n# t          $ r i cY S w xY wt          |t          ¦  «        r|                     di ¦  «        ni }t          |t          ¦  «        r|                     | i ¦  «        ni }t          |t          ¦  «        si }	 ddlm}  |¦   «         D ]q}|                     d¦  «        | k    rV|                     d¦  «        pi }t          |t          ¦  «        r(t	          |¦  «        }|                     |¦  «         |c S  nŒrn# t          $ r Y nw xY w|S )uÔ  Return the config dict for auxiliary.<task>, or {} when unavailable.

    For plugin-registered auxiliary tasks (see
    :meth:`hermes_cli.plugins.PluginContext.register_auxiliary_task`) the
    plugin's declared *defaults* are layered underneath the user's config
    so an unconfigured plugin task still works:

        plugin defaults  â†�  config.yaml auxiliary.<task>  (user wins)

    Built-in tasks ignore this path (their defaults live in DEFAULT_CONFIG).
    r   rz  r]  )Úget_plugin_auxiliary_tasksr:  Údefaults)
rH   rA   rU   r$   ro  rJ   Úhermes_cli.pluginsr©  rp  rK   )	r°  rA   rC   Úauxr‰  r©  Ú_entryÚ	_defaultsru  s	            r   r,  r,  <  sŠ  € ð ð Øˆ	ðØ:Ð:Ð:Ð:Ð:Ð:Ø%Ð%Ñ'Ô'ˆˆøÝð ð ð Øˆ	ˆ	ˆ	ðøøøå)3°F½DÑ)AÔ)AÐ
Iˆ&�*Š*�[ "Ñ
%Ô
%Ð
%Àr€CÝ'1°#µtÑ'<Ô'<ÐD�#—'’'˜$ Ñ#Ô#Ð#À"€KÝ�k¥4Ñ(Ô(ð Øˆð
ØAÐAÐAÐAÐAÐAØ0Ð0Ñ2Ô2ð 	ð 	ˆFØ�zŠz˜%Ñ Ô  DÒ(Ð(Ø"ŸJšJ zÑ2Ô2Ð8°b�	Ý˜i­Ñ.Ô.ð "Ý! )™_œ_�FØ—M’M +Ñ.Ô.Ð.Ø!�M�M�MØ�ð )øøõ ð ð ð àˆðøøøð Ðs%   † —&¥&ÂA>D ÄD Ä
D+Ä*D+r$  c                 ó¨   — | s|S t          | ¦  «        }|                     d¦  «        }|�'	 t          |¦  «        S # t          t          f$ r Y nw xY w|S )zPRead timeout from auxiliary.{task}.timeout in config, falling back to *default*.r6  )r,  rJ   r'  r×  r¸   )r°  r$  r‰  r1  s       r   Ú_get_task_timeoutr°  h  sm   € àð ØˆÝ,¨TÑ2Ô2€KØ
�/Š/˜)Ñ
$Ô
$€CØ
€ð	Ý˜‘:”:ÐøÝ�IÐ&ð 	ð 	ð 	ØˆDð	øøøà€Ns   ¬; »AÁAr6  c                 óf   — |�|nt          | ¦  «        }|€| dk    rt          |t          ¦  «        }|S )uV  Resolve the effective timeout for an auxiliary LLM call.

    Uses the caller-provided ``timeout`` when given; otherwise reads
    ``auxiliary.{task}.timeout`` from config via :func:`_get_task_timeout`.
    For the ``compression`` task only, applies a bounded floor so a reasoning
    model summarising a large context is not cut off by the default timeout
    (#54915).  The floor is intentionally skipped when the caller passes an
    explicit ``timeout=`` â€” explicit per-call deadlines are always honoured â€”
    and it is a minimum (``max``), so a config value already above it is kept.
    Nr~  )r°  rÕ  Ú"_COMPRESSION_TIMEOUT_FLOOR_SECONDS)r°  r6  r�  s      r   Ú_effective_aux_timeoutr³  v  s@   € ð #Ð.��Õ4EÀdÑ4KÔ4K€IØ€˜4 =Ò0Ð0Ý˜	Õ#EÑFÔFˆ	ØÐr   c                 óˆ  — t          | ¦  «        }|                     d¦  «        }t          |t          ¦  «        rt          |¦  «        ni }d|vrs|                     d¦  «        }|�\|dk    rV| dv rt                               d| ¦  «         |S dd	lm}  ||¦  «        }|�||d<   nt                               d
| |¦  «         |S )u¾  Read auxiliary.<task>.extra_body and return a shallow copy when valid.

    Also folds in ``auxiliary.<task>.reasoning_effort`` as an
    ``extra_body.reasoning`` config dict ({"enabled": ..., "effort": ...})
    when set. An explicit ``extra_body.reasoning`` in config wins over the
    ``reasoning_effort`` shorthand (it is the more specific wire control).
    Downstream, each wire already translates ``extra_body.reasoning``:
    chat.completions passes it through, the Codex Responses adapter maps it
    to top-level ``reasoning``/``include``, and the Anthropic auxiliary
    client maps it to ``build_anthropic_kwargs(reasoning_config=...)``.

    MoA tasks are excluded by design: reasoning depth for MoA is a per-slot
    setting in the MoA preset (``moa.presets.<name>.reference_models[].
    reasoning_effort`` / ``aggregator.reasoning_effort``), not an
    auxiliary-task knob â€” an ensemble-wide value would override the
    per-slot ones.
    rð  rñ  Úreasoning_effortNrB   )Úmoa_referenceÚmoa_aggregatoruÉ   auxiliary.%s.reasoning_effort is not supported â€” MoA reasoning depth is per-slot: set reasoning_effort on the preset's reference_models entries / aggregator instead (moa.presets.<name>...). Ignoring.r   )Úparse_reasoning_effortux   auxiliary.%s.reasoning_effort %r is not a valid level (none, minimal, low, medium, high, xhigh, max, ultra) â€” ignoring)r,  rJ   r$   ro  rX   rY   Úhermes_constantsr¸  )r°  r‰  r1  r¡   ró  r¸  rÆ   s          r   Ú_get_task_extra_bodyrº  ‡  sû   € õ$ -¨TÑ2Ô2€KØ
�/Š/˜,Ñ
'Ô
'€CÝ$ S­$Ñ/Ô/Ð7�T�#‰YŒYˆY°R€FØ˜&Ð Ð Ø—’Ð!3Ñ4Ô4ˆØÐ &¨B¢, ,ØÐ:Ð:Ð:Ý—’ð9ð ñô ð ð �Ø?Ð?Ð?Ð?Ð?Ð?Ø+Ð+¨FÑ3Ô3ˆFØÐ!Ø&,��{Ñ#Ð#å—’ðYà˜&ñô ð ð
 €Mr   Ú_aux_sync_semaphoresÚ_aux_async_semaphoresc                 óÈ   — | r| dk    rdS t          | ¦  «                             d¦  «        }|€dS 	 t          |¦  «        }n# t          t          f$ r Y dS w xY w|dk    r|ndS )zGReturn ``auxiliary.<task>.max_concurrency`` as a positive int, or None.rs  NÚmax_concurrencyr   )r,  rJ   r…  r¸   r×  )r°  r1  rv  s      r   Ú_get_task_max_concurrencyr¿  Ã  sŒ   € àð �4˜8Ò#Ð#ð ˆtÝ
$ TÑ
*Ô
*×
.Ò
.Ð/@Ñ
AÔ
A€CØ
€{ØˆtðÝ�C‘”ˆˆøÝ•zÐ"ð ð ð Øˆtˆtðøøøà˜A’I�Iˆ5ˆ5 4Ð's   ²A ÁAÁAc                 ó&  — t          | ¦  «        }|€dS t          5  t                               | ¦  «        }|�|d         |k    r.t	          j        |¦  «        }||ft          | <   |cddd¦  «         S |d         cddd¦  «         S # 1 swxY w Y   dS )zCGet a per-task sync semaphore, rebuilding it after a config change.Nr   rí   )r¿  Ú_aux_sem_lockr»  rJ   rŒ   ÚBoundedSemaphore)r°  Úlimitr½  Ú	semaphores       r   Ú_acquire_sync_aux_semaphorerÅ  Ó  sý   € å% dÑ+Ô+€EØ€}ØˆtÝ	ð ð Ý$×(Ò(¨Ñ.Ô.ˆØˆ=˜E !œH¨Ò-Ð-Ý!Ô2°5Ñ9Ô9ˆIØ*/°Ð);Õ  Ñ&Øðð ð ð ñ ô ð ð ð �QŒxðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ›A
BÁ2BÂB
ÂB
c                 ó   — t          | ¦  «        }|€dS ddl}	 |                     ¦   «         }n# t          $ r Y dS w xY w| t	          |¦  «        f}t
          5  t                               |¦  «        }|�|d         |k    r/|                     |¦  «        }||ft          |<   |cddd¦  «         S |d         cddd¦  «         S # 1 swxY w Y   dS )zCGet a per-task, per-event-loop async semaphore after config lookup.Nr   rí   )	r¿  rˆ  Úget_running_looprN  r1  rÁ  r¼  rJ   Ú	Semaphore)r°  rÃ  rˆ  Úloopr:  r½  rÄ  s          r   Ú_acquire_async_aux_semaphorerÊ  á  sS  € å% dÑ+Ô+€EØ€}ØˆtØ€N€N€NðØ×'Ò'Ñ)Ô)ˆˆøÝð ð ð Øˆtˆtðøøøà•�D‘”Ð
€CÝ	ð ð Ý%×)Ò)¨#Ñ.Ô.ˆØˆ=˜E !œH¨Ò-Ð-Ø×)Ò)¨%Ñ0Ô0ˆIØ*/°Ð);Õ! #Ñ&Øðð ð ð ñ ô ð ð ð �QŒxðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s%   ™. ®
<»<ÁACÂ/CÃCÃ
Cc                  óª   — t           5  t                               ¦   «          t                               ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z%Drop cached semaphores (test helper).N)rÁ  r»  rM  r¼  r   r   r   Ú_reset_aux_semaphoresrÌ  õ  s�   € å	ð &ð &Ý×"Ò"Ñ$Ô$Ð$Ý×#Ò#Ñ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &s   ˆ3AÁAÁA>   ÚminimaxrÝ   r¢  c                 óL   — | t           v rdS |pd                     ¦   «         }d|v S )zÌDetect if an endpoint expects Anthropic-format content blocks.

    Returns True for known Anthropic-compatible providers (MiniMax) and
    any endpoint whose URL contains ``/anthropic`` in the path.
    TrB   r«  )Ú_ANTHROPIC_COMPAT_PROVIDERSró   )rè   r=   Ú	url_lowers      r   r  r    s5   € ð Õ.Ð.Ð.ØˆtØ�˜R×&Ò&Ñ(Ô(€IØ˜9Ð$Ð$r   c           	      óÌ  — g }| D �]]}|                      d¦  «        }t          |t          ¦  «        s|                     |¦  «         ŒCg }d}|D �]ó}|                      d¦  «        dk    rÔ|                      d¦  «        pi                       dd¦  «        }|                     d¦  «        rv|                     d¦  «        \  }}	}
d	}d
|v r:d|v r6|                     d
d¦  «        d                              dd¦  «        d         }|                     dd||
dœdœ¦  «         n|                     dd|dœdœ¦  «         d}Œð|                      d¦  «        dk    rÕ|                      d¦  «        pi                       dd¦  «        }|                     d¦  «        rv|                     d¦  «        \  }}	}
d}d
|v r:d|v r6|                     d
d¦  «        d                              dd¦  «        d         }|                     dd||
dœdœ¦  «         n|                     dd|dœdœ¦  «         d}�ŒÞ|                     |¦  «         �Œõ|                     |ri |¥d|i¥n|¦  «         �Œ_|S )as  Convert OpenAI ``image_url``/``video_url`` blocks to Anthropic format.

    Converts:
    - ``image_url`` blocks to Anthropic ``image`` blocks
    - ``video_url`` blocks to Anthropic ``video`` blocks (MiniMax M3 compat)

    Only touches messages that have list-type content with ``image_url`` or
    ``video_url`` blocks; plain text messages pass through unchanged.
    ré  Frÿ  Ú	image_urlrº   rB   zdata:Ú,z	image/pngrì   ú;rí   r   Úimager   )rÿ  Ú
media_typer  )rÿ  r  )rÿ  rº   TÚ	video_urlz	video/mp4Úvideo)rJ   r$   rE  r&  rô   Ú	partitionrõ   )rå  rZ  rR  ré  Únew_contentÚchangedÚblockÚimage_url_valÚheaderrY  Úb64datarÖ  Úvideo_url_vals                r   r	  r	    s  € ð €IØð ENñ ENˆØ—'’'˜)Ñ$Ô$ˆÝ˜'¥4Ñ(Ô(ð 	Ø×Ò˜SÑ!Ô!Ð!ØØˆØˆØð =	*ñ =	*ˆEØ�yŠy˜Ñ Ô  KÒ/Ð/Ø!&§¢¨;Ñ!7Ô!7Ð!=¸2× BÒ BÀ5È"Ñ MÔ M�Ø ×+Ò+¨GÑ4Ô4ð à)6×)@Ò)@ÀÑ)EÔ)EÑ&�F˜A˜wØ!,�JØ˜f�}�}¨°¨¨Ø%+§\¢\°#°qÑ%9Ô%9¸!Ô%<×%BÒ%BÀ3ÈÑ%JÔ%JÈ1Ô%M˜
Ø×&Ò&Ø 'à$,Ø*4Ø$+ð#ð #ð(ð (ñ ô ð ð ð  ×&Ò&Ø 'à$)Ø#0ð#ð #ð(ð (ñ ô ð ð ��Ø—’˜6Ñ"Ô" kÒ1Ð1ð "'§¢¨;Ñ!7Ô!7Ð!=¸2× BÒ BÀ5È"Ñ MÔ M�Ø ×+Ò+¨GÑ4Ô4ð à)6×)@Ò)@ÀÑ)EÔ)EÑ&�F˜A˜wØ!,�JØ˜f�}�}¨°¨¨Ø%+§\¢\°#°qÑ%9Ô%9¸!Ô%<×%BÒ%BÀ3ÈÑ%JÔ%JÈ1Ô%M˜
Ø×&Ò&Ø 'à$,Ø*4Ø$+ð#ð #ð(ð (ñ ô ð ð ð  ×&Ò&Ø 'à$)Ø#0ð#ð #ð(ð (ñ ô ð ð �‘à×"Ò" 5Ñ)Ô)Ð)Ñ)Ø×Ò¸GÐLÐ8˜CÐ8 ¨KÐ8Ð8Ð8ÈÑMÔMÐMÑMØÐr   >
   Úthinkr  rñ  Ú	verbosityÚthinkingbudgetÚthinkingconfigÚenable_thinkingÚthinking_budgetÚthinking_configrµ  c                 ó
  — t          | t          ¦  «        sdS |                      ¦   «         D ]V\  }}t          |¦  «                             ¦   «                              ¦   «         }|t          v r dS t          |¦  «        r dS ŒWdS )zCReturn whether a profile payload contains a reasoning wire control.FT)r$   ro  rÅ   rI   rò   ró   Ú_PROFILE_REASONING_KEYSÚ"_contains_profile_reasoning_fields)rv  r:  Únestedrø   s       r   rê  rê  s  s‰   € å�e�TÑ"Ô"ð ØˆuØ—{’{‘}”}ð ð ‰ˆˆVÝ˜‘X”X—^’^Ñ%Ô%×+Ò+Ñ-Ô-ˆ
ØÕ0Ð0Ð0Ø�4�4Ý-¨fÑ5Ô5ð 	Ø�4�4ð	àˆ5r   rð  c                 ó¸	  — |||dœ}t          ||	¦  «        }|t          u rd}n|�|}|�ddlm}  ||¦  «        rd}|�||d<   |��|	p| dk    rt	          ¦   «         nd}t          | pd¦  «                             ¦   «                              ¦   «         }|dv pt          |d	¦  «        }t          |
¦  «        ot          |
¦  «        d
k    }|dv }|s%|r#	 ddl
m}  ||¦  «        }n# t          $ r Y nw xY wd}|dv rddlm}  ||¦  «        dk    }t          | |¦  «        s|s|s|s|r$|                     t#          ||¬¦  «        ¦  «         |r•t%          ¦   «         }g }|D ]}}|                     d¦  «        pi                      dd¦  «        }|r"||v rt(                               d|| |¦  «         ŒQ|r|                     |¦  «         |                     |¦  «         Œ~||d<   |	p| dk    rt	          ¦   «         nd}i }i }i }d}	 ddlm} ddlm}   |t          | pd¦  «                             ¦   «                              ¦   «         ¦  «        }!|!�ˆ|!                     |||¬¦  «        pi }|!                     ||du||¬¦  «        \  }}|pi }|pi }t=          |!¦  «        j        | j        up,t?          |¦  «        pt?          |¦  «        pt?          |¦  «        }n3# t          $ r&}"t(                                d| |"¦  «         Y d}"~"nd}"~"ww xY w|                     |¦  «         tC          |pi ¦  «        }#|#                     |¦  «         |#                     |¦  «         |rUtE          |tB          ¦  «        r@|s>|                     d¦  «        du rddi|#d<   n|                     d¦  «        pd}$d|$d œ|#d<   t          | pd¦  «                             ¦   «                              ¦   «         }%|%dv rDd!|#vrtG          ¦   «         |#d!<   d"|#vr+	 dd#l$m%}&  |&¦   «         }'n# t          $ r d}'Y nw xY w|'r|'|#d"<   |#r|#|d$<   |r¢tE          |tB          ¦  «        r�t          | pd¦  «                             ¦   «                              ¦   «         }(|	pd}d}|(dv rddlm}  ||¦  «        dk    }|(d%k    s!|stM          |¦  «        st          |(|¦  «        rtC          |¦  «        |d&<   |S )'zLBuild kwargs for .chat.completions.create() with model/provider adjustments.)rý   rå  r6  Nr   r«  r§  rî   rB   >   ú
nvidia-nimúbuild-nvidiaÚnimÚnvidiaÚnemotronr�  r¶  >   rË   rÊ   rÌ   rÍ   )rH  F>   únous-portalrÃ  ÚnousresearchrÙ  r±  rZ  rü  r«   zK_build_call_kwargs: duplicate tool name '%s' removed (provider=%s model=%s)rù  r1  )ÚProviderProfile)rý   r=   rª  )rª  Úsupports_reasoningrý   r=   zA_build_call_kwargs: provider profile projection failed for %s: %srò  rñ  ró  rô  T)rò  ró  r”  r  )Úget_conversation_contextrð  rà   r£  )'r  rü   rœ  r¬  r  rI   rò   ró   r4   rn   r  rH  rK   rì  rÚ  r  rp  r>  r¤   rJ   rX   rY   re  r&  rA  r2  Úproviders.baserô  Úbuild_extra_bodyÚbuild_api_kwargs_extrasrÿ  rê  rx   ro  r$   r•  Úagent.portal_tagsrö  r÷  ))rè   rý   rå  r§  r¥  rù  r6  rð  rª  r=   r°  r!   Úfixed_temperaturer¬  Ú_effective_baseÚ_provider_normÚ_is_nvidia_nimÚ_is_moaÚ_is_gemini_nativerH  Ú_nous_on_messagesrÚ  Ú_seenÚ_dedupedÚ_tÚ_tnameÚeffective_baseÚprofile_bodyÚprofile_reasoning_extraÚprofile_top_levelÚprofile_handles_reasoningr2  rô  rQ  r¥   Úmerged_extraró  Ú_provider_for_portalrö  Ú
sticky_keyÚprovider_norms)                                            r   r  r  €  s/  € ð ØØðð €Fõ 5°U¸HÑEÔEÐØÕ,Ð,Ð,ØˆˆØ	Ð	&Ø'ˆð ÐØDÐDÐDÐDÐDÐDØ#Ð# EÑ*Ô*ð 	ØˆKàÐØ +ˆˆ}ÑàÑð( #ð 
Ø*2°hÒ*>Ð*>Õ$Ñ&Ô&Ð&ÀBð 	õ ˜X˜^¨Ñ,Ô,×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<ˆàÐYÐYð RÝ$ _Ð6PÑQÔQð 	õ �t‘*”*Ð=¥ T¡¤¨oÒ!=ˆð +ð /
ð 
Ðð !ð 	 _ð 	ðØQÐQÐQÐQÐQÐQØ$=Ð$=¸oÑ$NÔ$NÐ!Ð!øÝð ð ð Ø�ðøøøà!ÐØÐDÐDÐDØ:Ð:Ð:Ð:Ð:Ð:à - ¨eÑ 4Ô 4Ð8LÒ LÐå)¨(°OÑDÔDð
	Oà ð
	Oð ð
	Oð ð	
	Oð
 !ð
	Oð �MŠMÕ4°ZÀuÐMÑMÔMÑNÔNÐNàð #õ ‘U”UˆØˆØð 	 ð 	 ˆBØ—f’f˜ZÑ(Ô(Ð.¨B×3Ò3°F¸BÑ?Ô?ˆFØð ˜& E˜/˜/Ý—’ð-à˜H eñô ð ð
 Øð "Ø—	’	˜&Ñ!Ô!Ð!Ø�OŠO˜BÑÔÐÐØ"ˆˆw‰ð ð Ø&.°(Ò&:Ð&:Õ Ñ"Ô"Ð"Àð ð $&€LØ.0ÐØ(*ÐØ %Ðð!
Ø2Ð2Ð2Ð2Ð2Ð2Ø2Ð2Ð2Ð2Ð2Ð2à&Ð&¥s¨8¨>°rÑ':Ô':×'@Ò'@Ñ'BÔ'B×'HÒ'HÑ'JÔ'JÑKÔKˆØÐØ"×3Ò3ØØ'Ø!1ð 4ñ ô ð ð ð	 ð ×/Ò/Ø%5Ø'7¸tÐ'CØØ+ð	 0ñ ô ñ 7Ð#Ð%6ð '>Ð&CÀÐ#Ø 1Ð 7°RÐå�W‘”Ô5Ø&Ô>ð?ð Iå5°lÑCÔCðIõ 6Ð6MÑNÔNðIõ 6Ð6GÑHÔHð &øøõ ð 
ð 
ð 
Ý�ŠØOØØñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøð ‡M‚MÐ#Ñ$Ô$Ð$Ý˜
Ð( bÑ)Ô)€LØ×Ò˜Ñ%Ô%Ð%Ø×ÒÐ/Ñ0Ô0Ð0àð	LåÐ'­Ñ.Ô.ð	Lð *ð	Lð
 ×Ò 	Ñ*Ô*¨eÐ3Ð3Ø)2°EÐ(:ˆL˜Ñ%Ð%à%×)Ò)¨(Ñ3Ô3Ð?°xˆFØ48ÀFÐ(KÐ(KˆL˜Ñ%õ ˜x˜~¨2Ñ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ÐØÐFÐFÐFØ˜Ð%Ð%Ý#4Ñ#6Ô#6ˆL˜Ñ Ø˜|Ð+Ð+ð"ØFÐFÐFÐFÐFÐFà5Ð5Ñ7Ô7�
�
øÝð "ð "ð "Ø!�
�
�
ð"øøøàð 8Ø-7�˜\Ñ*Øð ,Ø+ˆˆ|Ñð ð A�JÐ'7½Ñ>Ô>ð AÝ˜H˜N¨Ñ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;ˆØ!˜ RˆØ!ÐØÐCÐCÐCØ:Ð:Ð:Ð:Ð:Ð:à - ¨eÑ 4Ô 4Ð8LÒ LÐà˜[Ò(Ð(Ø ð )å2°>ÑBÔBð )õ -¨]¸NÑKÔKð )õ
 +/Ð/?Ñ*@Ô*@ˆFÐ&Ñ'à€Ms=   ÃC$ Ã$
C1Ã0C1ÈCK Ë
LË"LÌLÐP ÐP%Ð$P%rÀ  c           
      ó.  — | €t          d|pd› d�¦  «        ‚ddlm}  || |||¬¦  «         	 | j        }|rt	          |d         d¦  «        st          d	¦  «        ‚n›# t
          t          t          f$ r�}t          | ¦  «        }|�$t          | ¦  «         t          ¦   «          |cY d}~S t          | ¦  «        j        }t          | ¦  «        dd
…         }	t          d|pd› d|› d|	›d�¦  «        |‚d}~ww xY wt          | ¦  «         t          ¦   «          | S )u<  Validate that an LLM response has the expected .choices[0].message shape.

    Fails fast with a clear error instead of letting malformed payloads
    propagate to downstream consumers where they crash with misleading
    AttributeError (e.g. "'str' object has no attribute 'choices'").

    See #7264.

    Also the single accounting chokepoint for auxiliary usage: every
    successful non-streaming aux response passes through here exactly once,
    so token usage is recorded against the ambient session context published
    by the agent loop (``agent.aux_accounting``, issue #23270). Recording is
    best-effort and never affects validation. *provider*/*base_url* are
    optional accounting hints â€” fallback-path calls omit them and the row
    keeps the model (read from the response itself) with an empty route.
    Nr   rk  z: LLM returned None responser   )Úrecord_aux_usage©rè   r=   r)  zmissing choices[0].messageéx   z&: LLM returned invalid response (type=z): ug   . Expected object with .choices[0].message â€” check provider adapter or custom endpoint compatibility.)rN  Úagent.aux_accountingr  r?  rL  rV   r¸   Ú
IndexErrorÚ_recover_aux_response_messageÚ&_record_relay_auxiliary_response_modelÚ_complete_relay_auxiliary_callrÿ  r*   rI   )
rÀ  r°  rè   r=   r  r?  r¥   Ú	recoveredÚresponse_typeÚresponse_previews
             r   r
  r
  e   s‘  € ð, ÐÝØE˜˜ ÐEÐEÐEñ
ô 
ð 	
ð 6Ð5Ð5Ð5Ð5Ð5ØÐ�X˜t¨hÀÐJÑJÔJÐJðØÔ"ˆØð 	?�g g¨a¤j°)Ñ<Ô<ð 	?Ý Ð!=Ñ>Ô>Ð>ð	?øå�I¥zÐ2ð ð ð Ý1°(Ñ;Ô;ˆ	ØÐ Ý2°8Ñ<Ô<Ð<Ý*Ñ,Ô,Ð,ØÐÐÐÐÐÐÝ˜X™œÔ/ˆÝ˜x™=œ=¨¨#¨Ô.ÐÝð9˜˜ ð 9ð 9Ø"ð9ð 9Ø'7ð9ð 9ð 9ñ
ô 
ð
 ð	øøøøðøøøõ +¨8Ñ4Ô4Ð4Ý"Ñ$Ô$Ð$Ø€Os$   ®.A ÁC5Á4/C0Â#C5Â)AC0Ã0C5Úsuccess©r§   r§   c           
      ór  — t                                ¦   «         }|€dS ddlm} |                     t          |                     d¦  «        pd¦  «        | t          |                     d¦  «        pd¦  «        t          |                     d¦  «        pd	¦  «        |                     d
¦  «        ¬¦  «         dS )zFClose one auxiliary logical call after acceptance or terminal failure.Nr   rÛ  r³  rB   rý   r±  rè   r]  rµ  )r§   rÑ  rÐ  Úresponse_model_name)r¬  rJ   rá  rÜ  Úcomplete_logical_callrI   )r§   rÈ  rÜ  s      r   r  r  š   s½   € å%×)Ò)Ñ+Ô+€GØ€ØˆØÐÐÐÐÐà×#Ò#ÝˆG�KŠK˜Ñ%Ô%Ð+¨Ñ,Ô,ØÝ�w—{’{ 7Ñ+Ô+Ð8¨yÑ9Ô9Ý˜'Ÿ+š+ jÑ1Ô1Ð@°[ÑAÔAØ#ŸKšKÐ(8Ñ9Ô9ð $ñ ô ð ð ð r   c                 ó  — t                                ¦   «         }|€dS t          | t          ¦  «        r|                      d¦  «        }nt	          | dd¦  «        }t          |t
          ¦  «        r|                     ¦   «         r	||d<   dS dS dS )zBRetain the provider-reported model for terminal route attribution.Nrý   rµ  )r¬  rJ   r$   ro  ro   rI   rò   )rÀ  rÈ  rý   s      r   r  r  ª   s™   € å%×)Ò)Ñ+Ô+€GØ€ØˆÝ�(�DÑ!Ô!ð 1Ø—’˜WÑ%Ô%ˆˆå˜ '¨4Ñ0Ô0ˆÝ�%�ÑÔð * %§+¢+¡-¤-ð *Ø$)ˆÐ Ñ!Ð!Ð!ð*ð *ð *ð *r   c                  ó‚   — 	 t          d¬¦  «         dS # t          $ r  t                               dd¬¦  «         Y dS w xY w)zDClose a terminally failed call without replacing its original error.Úfailedr  z+Relay auxiliary failure finalization failedTrt   N)r  rK   rX   rY   r   r   r   r»  r»  ·   si   € ð
Ý&¨xÐ8Ñ8Ô8Ð8Ð8Ð8øÝð 
ð 
ð 
Ý�ŠØ9Øð 	ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð
øøøs   ‚ ”&>½>c                 ó`  — t          | ¦  «        }|sdS t          t          |¬¦  «        t          | dd¦  «        pd¬¦  «        }	 |g| _        | S # t          $ rT t          t          | dd¦  «        t          | dd¦  «        t          | d	d
¦  «        |gt          | dd¦  «        ¬¦  «        cY S w xY w)a,  Synthesize chat-completions shape from Responses-style text fields.

    Auxiliary callers consume ``choices[0].message``.  Some compatible
    endpoints return text outside ``choices`` (for example ``output_text`` or
    ``output`` items).  Preserve that response before declaring it malformed.
    N)ré  r=  r;  )r)  r=  r1  rB   rý   rK  úchat.completionr2  ©r1  rý   rK  r?  r2  )Ú_extract_aux_response_textr   ro   r?  rK   )rÀ  r*  rn  s      r   r  r  Â   sæ   € õ & hÑ/Ô/€DØð ØˆtåÝ¨Ð-Ñ-Ô-Ý˜h¨¸Ñ>Ô>ÐHÀ&ðñ ô €Fð

Ø"˜8ˆÔØˆøÝð 
ð 
ð 
ÝÝ�x  rÑ*Ô*Ý˜( G¨RÑ0Ô0Ý˜8 XÐ/@ÑAÔAØ�HÝ˜( G¨TÑ2Ô2ð
ñ 
ô 
ð 	
ð 	
ð 	
ð
øøøs   Á	A ÁAB-Â,B-c                 óŠ  — t          | d¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S t          | d¦  «        }t          |t          ¦  «        sdS g }|D ]¤}t          |d¦  «        }|r|dk    rŒt          |d¦  «        pg D ]v}t          |d¦  «        }|dv r`t          |d¦  «        }t          |t          ¦  «        r;|                     ¦   «         r'|                     |                     ¦   «         ¦  «         ŒwŒ¥d	                     |¦  «                             ¦   «         S )
Nr+  r"  rB   rÿ  r)  ré  >   Nr*  r+  r*  Ú
)Ú_obj_getr$   rI   rò   rE  r&  rP  )	rÀ  r+  r"  r¥  rj  rk  r+  Ú	part_typer*  s	            r   r&  r&  Þ   sO  € Ý˜8 ]Ñ3Ô3€KÝ�+�sÑ#Ô#ð #¨×(9Ò(9Ñ(;Ô(;ð #Ø× Ò Ñ"Ô"Ð"å�h Ñ)Ô)€FÝ�f�dÑ#Ô#ð Øˆrà€EØð 	/ð 	/ˆÝ˜T 6Ñ*Ô*ˆ	Øð 	˜ iÒ/Ð/ØÝ˜d IÑ.Ô.Ð4°"ð 	/ð 	/ˆDÝ   vÑ.Ô.ˆIØÐ9Ð9Ð9Ý  fÑ-Ô-�Ý˜d¥CÑ(Ô(ð /¨T¯ZªZ©\¬\ð /Ø—L’L §¢¡¤Ñ.Ô.Ð.øð	/ð �9Š9�UÑÔ×!Ò!Ñ#Ô#Ð#r   r:  c                 ó†   — t          | ||¦  «        }||u r+t          | t          ¦  «        r|                      ||¦  «        }|S r   r&  )r%   r:  r$  rv  s       r   r)  r)  õ   sE   € Ý�C˜˜gÑ&Ô&€EØ�ÐÐ�J s­DÑ1Ô1ÐØ—’˜˜WÑ%Ô%ˆØ€Lr   g     À‚@g      @c                 ó˜   — 	 | �t          | ¦  «        nd}n# t          t          f$ r d}Y nw xY wt          t          t
          |z  ¦  «        S )uà   Absolute wall-clock bound for a progress-hooked streamed aux call.

    Generous by design â€” the idle timeout is the real guard; this only stops
    a degenerate stream that trickles one token per idle window forever.
    Nr#  )r'  r¸   r×  rÕ  Ú!_AUX_STREAM_CEILING_FLOOR_SECONDSÚ_AUX_STREAM_CEILING_MULTIPLIER)rü  r6  s     r   Ú_aux_stream_total_ceilingr/  !  sh   € ðØ.?Ð.K•%Ð)Ñ*Ô*Ð*ÐQTˆˆøÝ•zÐ"ð ð ð ØˆˆˆðøøøåÕ0Ý-°Ñ7ñ9ô 9ð 9s   ‚ –,«,c                 óF   — t          | t          t          t          f¦  «        S )a  Wire adapters that consume a stream inside .create() already tick the
    progress hook themselves (Codex per SSE event, Anthropic per stream
    event); Bedrock's Converse shim cannot stream at all. None of them
    accept chat-completions ``stream=True`` semantics from us.)r$   rx  rÈ  rå  )rZ   s    r   Ú_client_streams_internallyr1  !  s&   € õ
 �fÝÝ Ýðñ ô ð r   c                 óx   — t          | ¦  «                             ¦   «         }d|v rdS d|v od|v pd|v pd|v pd|v S )z@Provider explicitly refused a streamed chat.completions request.Ústream_optionsTr  r½  Úunsupportedznot allowedÚdisabled)rI   ró   )r¥   Úerrs     r   Ú_is_streaming_rejected_errorr7  )!  si   € å
ˆc‰(Œ(�.Š.Ñ
Ô
€CØ˜3ÐÐØˆtØ�sˆ?ð Ø˜3Ðð 	Ø˜CÐð	à˜CÐð	ð ˜Ðð	r   c                 ó   — t          |pd¦  «                             ¦   «         }|sdS t          |d¦  «        rdS 	 ddlm}  |¦   «         pi                      di ¦  «        }|                     d¦  «        pg }t          |t          t          f¦  «        rY|D ]V}t          |t           ¦  «        r?| 	                    ¦   «         r+| 	                    ¦   «                              ¦   «         |v r dS ŒWn# t          $ r Y nw xY wdS )	uR  Detect providers that only accept streaming (non-stream = HTTP 400).

    Some OpenAI-compatible endpoints reject non-streaming chat requests
    outright â€” e.g. Tencent Copilot returns
    ``{"code": 11101, "msg": "Non-stream chat request is currently not
    supported"}``. The main conversation loop already streams, so interactive
    chat works; auxiliary tasks (title generation, compression, web extract)
    used the non-streaming path and failed on every call. When this returns
    True the auxiliary client sends ``stream=True`` and aggregates the chunks
    itself (see :func:`_aggregate_chat_stream`). Credit @kudi88 (PR #60686).

    Beyond the known-host list, users can mark ANY custom endpoint as
    stream-only via ``auxiliary.stream_only_base_urls`` in config.yaml
    (list of substrings matched against the endpoint URL).
    rB   Fzcopilot.tencent.comTr   rŠ  r]  Ústream_only_base_urls)rI   ró   r4   rH   rl  rJ   r$   rE  r(  rò   rK   )rè   r=   Ú_urlrl  Úaux_cfgÚmarkersr»  s          r   Ú_provider_requires_streamr=  6!  s)  € õ  ˆxˆ~˜2ÑÔ×$Ò$Ñ&Ô&€DØð Øˆuå˜TÐ#8Ñ9Ô9ð Øˆtð
Ø1Ð1Ð1Ð1Ð1Ð1Ø�;‘=”=Ð& B×+Ò+¨K¸Ñ<Ô<ˆØ—+’+Ð5Ñ6Ô6Ð<¸"ˆÝ�g¥¥e˜}Ñ-Ô-ð 	 Ø!ð  ð  �Ý˜f¥cÑ*Ô*ð  ¨v¯|ª|©~¬~ð  À&Ç,Â,Á.Ä.×BVÒBVÑBXÔBXÐ\`ÐB`ÐB`Ø˜4˜4øøøÝð ð ð àˆðøøøð ˆ5s   »B/C. Ã,C. Ã.
C;Ã:C;©Úforce_streamr?  c                óô  — t          ¦   «          t          ¦   «         s|rt          | ¦  «        r | j        j        j        di |¤ŽS t          |                     d¦  «        ¦  «        }t          |¦  «        }d|d<   ddi|d<   	  | j        j        j        di |¤Ž}n‹# t          $ r~}|s<t          |¦  «        s-t          |¦  «        st          |¦  «        st          |¦  «        r‚ t                               d|pd|¦  «          | j        j        j        di |¤ŽcY d}~S d}~ww xY wt!          |d	¦  «        rt          ¦   «          |S t#          |t%          |                     d
¦  «        pd¦  «        |¬¦  «        S )u  chat.completions.create() that streams when a progress hook is active
    or the provider only accepts streamed requests.

    Behavior is byte-for-byte identical to a plain ``create(**kwargs)`` when
    neither trigger applies (every existing caller/task) or when the client's
    wire adapter streams internally. With a hook + a chunk-capable client,
    the request is sent with ``stream=True`` and aggregated, ticking the hook
    per chunk â€” so the configured ``timeout`` acts per stream read (idle)
    rather than as a total budget, and outer liveness watchdogs see tokens
    moving. ``force_stream=True`` (stream-only providers such as Tencent
    Copilot â€” credit @kudi88, PR #60686) takes the same streamed path even
    without a hook. Providers that reject the streamed request fall back to
    the plain non-streaming call â€” except under ``force_stream``, where a
    stream-only provider rejects the plain call by definition, so the
    original error is surfaced to the normal recovery chains instead.
    r6  Tr  Úinclude_usager3  zBAuxiliary %s: streamed request failed (%s); retrying non-streamingrk  Nr?  rý   rB   ©rý   Útotal_ceilingr   )r™   r›   r1  r{  rt  rK  r/  rJ   ro  rK   r«  r·  r‹  r™  rX   rx   rL  Ú_aggregate_chat_streamrI   )rZ   r!   r°  r?  rC  rf  r)  r¥   s           r   Ú_create_with_progressrE  Z!  sÛ  € õ. ÑÔÐÝ Ñ"Ô"ð 8¨<ð 8Õ<VÐW]Ñ<^Ô<^ð 8Ø-ˆvŒ{Ô&Ô-Ð7Ð7°Ð7Ð7Ð7å-¨f¯jªj¸Ñ.CÔ.CÑDÔD€MÝ˜‘L”L€MØ"€M�(ÑØ'6¸Ð&=€MÐ"Ñ#ð8Ø/�”Ô(Ô/Ð@Ð@°-Ð@Ð@ˆˆøÝð 8ð 8ð 8ð ð	å,¨SÑ1Ô1ð	õ ˜cÑ"Ô"ð	õ ! Ñ%Ô%ð		õ
 $ CÑ(Ô(ð	ð õ
 	�ŠðØ!˜^ V¨Sñ	
ô 	
ð 	
ð .ˆvŒ{Ô&Ô-Ð7Ð7°Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð+8øøøõ2 ˆv�yÑ!Ô!ð ÝÑÔÐØˆÝ!Ø•c˜&Ÿ*š* WÑ-Ô-Ð3°Ñ4Ô4ÀMðñ ô ð s   ÂB Â
D#Â%A3DÄD#ÄD#rB  r)  rC  c                ó€  — t          ||¬¦  «        }	 | D ]}|                     |¦  «         Œ	 t          | dd¦  «        }t          |¦  «        r	  |¦   «          nR# t          $ r Y nFw xY wnA# t          | dd¦  «        }t          |¦  «        r	  |¦   «          w # t          $ r Y w w xY ww xY w|                     ¦   «         S )u¿  Consume a chat.completions chunk stream into a complete response.

    Ticks the thread-local aux progress hook on every chunk. Raises
    TimeoutError when *total_ceiling* seconds elapse before the stream
    finishes â€” phrased with "timed out" so existing timeout classification
    (``_is_timeout_error``) treats it exactly like a request timeout.
    Accumulation is shared with the async mirror via
    :class:`_ChatStreamAccumulator`.
    rB  r  N)Ú_ChatStreamAccumulatorÚfeedro   ry   rK   Úfinish)r)  rý   rC  ÚaccÚchunkrh  s         r   rD  rD  œ!  s  € õ ! u¸MÐ
JÑ
JÔ
J€Cð	Øð 	ð 	ˆEØ�HŠH�U‰OŒOˆOˆOð	õ ˜6 7¨DÑ1Ô1ˆÝ�HÑÔð 	ðØ�‘
”
�
�
øÝð ð ð Ø�ðøøøð	øõ ˜6 7¨DÑ1Ô1ˆÝ�HÑÔð 	ðØ�‘
”
�
�
øÝð ð ð Ø�ðøøøð	øøøð
 �:Š:‰<Œ<ÐsA   “A+ Á
A Á
A'Á&A'Á+!B)Â
BÂB)Â
B%Â"B)Â$B%Â%B)c                   óL   — e Zd ZdZddedee         fd„Zdeddfd	„Z	defd
„Z
dS )rG  a"  Shared per-chunk accumulation for sync and async stream aggregation.

    Mirrors :func:`_aggregate_chat_stream`'s chunk handling so the async
    consumer below cannot drift from the sync one (same content/reasoning/
    tool-call delta reassembly, same "timed out" ceiling phrasing).
    rB   Nrý   rC  c                 óª   — t          j        ¦   «         | _        || _        g | _        g | _        i | _        d | _        d | _        d| _	        |pd| _
        d S r  )r  r  Ú_startedÚ_total_ceilingÚcontent_partsÚreasoning_partsÚtool_calls_accr=  r2  Úresp_idÚ
resp_model)r   rý   rC  s      r   rg   z_ChatStreamAccumulator.__init__Á!  sV   € ÝœÑ(Ô(ˆŒØ+ˆÔØ(*ˆÔØ*,ˆÔØ9;ˆÔØ!ˆÔØˆŒ
ØˆŒØ˜+ 2ˆŒˆˆr   rK  r   c                 óx  — t          ¦   «          | j        �=t          j        ¦   «         | j        z
  | j        k    rt          d| j        d›d�¦  «        ‚t          |dd ¦  «        p| j        | _        t          |dd ¦  «        p| j        | _        t          |dd ¦  «        }|r|| _	        t          |dd ¦  «        pg }|sd S |d         }t          |d	d ¦  «        p| j
        | _
        t          |d
d ¦  «        }|€d S t          |dd ¦  «        }|r| j                             |¦  «         t          |dd ¦  «        pt          |dd ¦  «        }|r/t          |t          ¦  «        r| j                             |¦  «         t          |dd ¦  «        pg D ]®}t          |dd¦  «        pd}	| j                             |	ddg dœ¦  «        }
t          |dd ¦  «        r
|j        |
d<   t          |dd ¦  «        }|�Lt          |dd ¦  «        r
|j        |
d<   t          |dd ¦  «        r |
d                              |j        ¦  «         Œ¯d S )Nz(Auxiliary streamed call timed out after z.0fz3s total ceiling (stream still open but over budget)r1  rý   r2  r?  r   r=  Údeltaré  rñ  Úreasoning_contentr:  r*  rB   )r1  r«   r.  rü  r«   r.  )r™   rO  r  r  rN  r  ro   rS  rT  r2  r=  rP  r&  r$   rI   rQ  rR  r`   r1  r«   r.  )r   rK  Úchunk_usager?  rn  rV  ÚpieceÚreasoning_pieceÚtcÚidxrJ  r\  s               r   rH  z_ChatStreamAccumulator.feedÌ!  s—  € ÝÑÔÐàÔÐ+Ý”Ñ!Ô! D¤MÑ1°dÔ6IÒIÐIåðD¸4Ô;NÐVð Dð Dð Dñô ð õ ˜u d¨DÑ1Ô1ÐA°T´\ˆŒÝ! %¨°$Ñ7Ô7ÐJ¸4¼?ˆŒÝ˜e W¨dÑ3Ô3ˆØð 	%Ø$ˆDŒJÝ˜% ¨DÑ1Ô1Ð7°RˆØð 	ØˆFØ˜”ˆÝ$ V¨_¸dÑCÔCÐYÀtÔGYˆÔÝ˜ ¨Ñ.Ô.ˆØˆ=ØˆFÝ˜˜y¨$Ñ/Ô/ˆØð 	-ØÔ×%Ò% eÑ,Ô,Ð,å�E˜;¨Ñ-Ô-ð 9Ý�uÐ1°4Ñ8Ô8ð 	ð ð 	9�z¨/½3Ñ?Ô?ð 	9ØÔ ×'Ò'¨Ñ8Ô8Ð8Ý˜5 ,°Ñ5Ô5Ð;¸ð 	:ð 	:ˆBÝ˜"˜g qÑ)Ô)Ð.¨QˆCØÔ%×0Ò0Ø˜B¨¸Ð<Ð<ñô ˆCõ �r˜4 Ñ&Ô&ð "ØœE��D‘	Ý˜˜Z¨Ñ.Ô.ˆBØˆ~Ý˜2˜v tÑ,Ô,ð *Ø"$¤'�C˜‘KÝ˜2˜{¨DÑ1Ô1ð :Ø˜Ô$×+Ò+¨B¬LÑ9Ô9Ð9øð	:ð 	:r   c                 óx  — d }| j         r0d„ t          | j                              ¦   «         ¦  «        D ¦   «         }t          dd                     | j        ¦  «        |d                     | j        ¦  «        pd ¬¦  «        }t          d|| j        pd¬¦  «        }t          | j        | j	        d|g| j
        ¬	¦  «        S )
Nc                 ó    — g | ]K\  }}t          |d          dt          |d         d                     |d         ¦  «        ¬¦  «        ¬¦  «        ‘ŒLS )r1  rü  r«   rB   r.  r/  r0  )r   rP  )rÀ   Ú_idxrJ  s      r   rÔ  z1_ChatStreamAccumulator.finish.<locals>.<listcomp>ý!  st   € ð 
ð 
ð 
ñ �D˜#õ  Ø˜4”yØ#Ý,Ø  œ[Ø"$§'¢'¨#¨kÔ*:Ñ";Ô";ðñ ô ðñ ô ð
ð 
ð 
r   r9  rB   )rç  ré  r:  rñ  r   r;  r<  r$  r%  )rR  rD  rÅ   r   rP  rP  rQ  r=  rS  rT  r2  )r   r:  r)  rn  s       r   rI  z_ChatStreamAccumulator.finishú!  så   € Øˆ
ØÔð 	ð
ð 
õ "(¨Ô(;×(AÒ(AÑ(CÔ(CÑ!DÔ!Dð
ñ 
ô 
ˆJõ "ØØ—G’G˜DÔ.Ñ/Ô/Ø!Ø—g’g˜dÔ2Ñ3Ô3Ð;°tð	
ñ 
ô 
ˆõ !ØØØÔ,Ð6°ð
ñ 
ô 
ˆõ
 ØŒ|Ø”/Ø$Ø�HØ”*ð
ñ 
ô 
ð 	
r   rV  )r*   r+   r,   r-   rI   r
   r'  rg   r   rH  rI  r   r   r   rG  rG  ¹!  s‡   € € € € € ðð ð	&ð 	&˜cð 	&°xÀ´ð 	&ð 	&ð 	&ð 	&ð,:˜#ð ,: $ð ,:ð ,:ð ,:ð ,:ð\
˜ð 
ð 
ð 
ð 
ð 
ð 
r   rG  c             ƒ   óF  K  — t          ||¬¦  «        }	 | 2 3 d{V —†}|                     |¦  «         Œ6 	 t          | dd¦  «        pt          | dd¦  «        }t          |¦  «        r8	  |¦   «         }t	          j        |¦  «        r|ƒ d{V —† n€# t          $ r Y ntw xY wno# t          | dd¦  «        pt          | dd¦  «        }t          |¦  «        r9	  |¦   «         }t	          j        |¦  «        r	|ƒ d{V —† w w # t          $ r Y w w xY ww xY w|                     ¦   «         S )u
  Async mirror of :func:`_aggregate_chat_stream` (``async for`` consumer).

    The AsyncOpenAI stream contract is an async iterator â€” consuming it with
    the sync helper raises. Same accumulation and ceiling semantics via
    :class:`_ChatStreamAccumulator`.
    rB  Nr  Úaclose)rG  rH  ro   ry   r{  ÚisawaitablerK   rI  )r)  rý   rC  rJ  rK  rh  r¡   s          r   Ú_aggregate_chat_stream_asyncrc  "  s•  è è € õ ! u¸MÐ
JÑ
JÔ
J€CðØ!ð 	ð 	ð 	ð 	ð 	ð 	ð 	�%Ø�HŠH�U‰OŒOˆOˆOð "˜6õ ˜6 7¨DÑ1Ô1ÐTµW¸VÀXÈtÑ5TÔ5TˆÝ�HÑÔð 	ðØ!˜™œ�ÝÔ& vÑ.Ô.ð !Ø �L�L�L�L�L�L�LøøÝð ð ð Ø�ðøøøð	øõ ˜6 7¨DÑ1Ô1ÐTµW¸VÀXÈtÑ5TÔ5TˆÝ�HÑÔð 	ðØ!˜™œ�ÝÔ& vÑ.Ô.ð !Ø �L�L�L�L�L�L�L�Lð!øåð ð ð Ø�ðøøøð	øøøð �:Š:‰<Œ<ÐsJ   •B  —4�B  Á(&B Â
BÂBÂ 2DÃ&C;Ã9DÃ;
DÄDÄDÄDc              ƒ   óR  K  — t          |                     d¦  «        ¦  «        }t          |¦  «        }d|d<   ddi|d<    | j        j        j        di |¤Žƒ d{V —†}t          |d¦  «        r|S t          |t          |                     d¦  «        pd	¦  «        |¬
¦  «        ƒ d{V —†S )u  Async chat.completions.create() for stream-only providers.

    Sends ``stream=True`` and aggregates the async chunk stream into a
    complete response (credit @kudi88, PR #60686 â€” async contract fixed to
    ``async for`` and tool-call deltas preserved per sweeper review).
    r6  Tr  rA  r3  Nr?  rý   rB   rB  r   )	r/  rJ   ro  r{  rt  rK  rL  rc  rI   )rZ   r!   r°  rC  rf  r)  s         r   Ú_acreate_with_streamre  8"  sá   è è € õ .¨f¯jªj¸Ñ.CÔ.CÑDÔD€MÝ˜‘L”L€MØ"€M�(ÑØ'6¸Ð&=€MÐ"Ñ#Ø1�6”;Ô*Ô1ÐBÐB°MÐBÐBÐBÐBÐBÐBÐBÐB€Fåˆv�yÑ!Ô!ð ØˆÝ-Ø•c˜&Ÿ*š* WÑ-Ô-Ð3°Ñ4Ô4ÀMðñ ô ð ð ð ð ð ð ð r   )rè   rý   r=   r\   r  r§  r¥  rù  r6  rð  rª  rn  rù  r  r3  r  r3  c                ó�  — t          | ¦  «        }|�|                     ¦   «          	 t          di d| “d|“d|“d|“d|“d|“d|“d	|“d
|“d|	“d|
“d|“d|“d|“d|“d|“d|“Ž}|r-|�+|}d}t          ||¦  «        |�|                     ¦   «          S S ||�|                     ¦   «          S S # |�|                     ¦   «          w w xY w)zARun an auxiliary LLM request, applying the configured task limit.Nr°  rè   rý   r=   r\   r  rå  r§  r¥  rù  r6  rð  rª  rn  rù  r  r3  r   )rÅ  ÚacquireÚ_call_llm_implÚ$_release_sync_semaphore_after_streamÚrelease)r°  rè   rý   r=   r\   r  rå  r§  r¥  rù  r6  rð  rª  rn  rù  r  r3  rÄ  rÀ  Ústream_semaphores                       r   Úcall_llmrl  P"  sž  € õ, ,¨DÑ1Ô1€IØÐØ×ÒÑÔÐð Ý!ð 
ð 
ð 
Ø�ð
à�Xð
ð �%ð
ð �Xð	
ð
 �Gð
ð &˜ð
ð �Xð
ð $˜ð
ð "�zð
ð �%ð
ð �Gð
ð "�zð
ð .Ð-ð
ð (˜-ð
ð �Xð
ð  �6ð!
ð" *˜>ð#
ˆð& ð 	T�iÐ+Ø(ÐØˆIÝ7¸ÐBRÑSÔSð Ð Ø×ÒÑÔÐÐð !ð àÐ Ø×ÒÑÔÐÐð !øˆ9Ð Ø×ÒÑÔÐÐð !øøøs   §AB, ÂB, Â,CrÄ  c              #   ó†  K  — 	 | E d{V —† 	 t          | dd¦  «        }t          |¦  «        r
 |¦   «          |                     ¦   «          dS # |                     ¦   «          w xY w# 	 t          | dd¦  «        }t          |¦  «        r
 |¦   «          |                     ¦   «          w # |                     ¦   «          w xY wxY w)zGRelease a permit only after a streaming response is consumed or closed.Nr  )ro   ry   rj  )r  rÄ  r  s      r   ri  ri  ‡"  sâ   è è € ð ØÐÐÐÐÐÐÐð	 Ý˜F G¨TÑ2Ô2ˆEÝ˜‰Œð Ø�‘”�à×ÒÑÔÐÐÐøˆI×ÒÑÔÐÐøøøøð	 Ý˜F G¨TÑ2Ô2ˆEÝ˜‰Œð Ø�‘”�à×ÒÑÔÐÐøˆI×ÒÑÔÐÐøøøøøøs.   „A& �*A ÁA#Á&C Á(*B'ÂC Â'B=Â=C c                óÚ  ‡ ‡<‡=‡>‡?— t          |¦  «        }t          ‰ ||||¦  «        \  }}Š?}}|r|}t          ‰ ¦  «        }|                     |pi ¦  «         |}‰ dk    r�t	          |dk    r|n||p|‰?p||p|d|¬¦  «        \  }Š=}‰=€:|dk    r4‰?s2t
                               d|¦  «         t	          d|d|¬¦  «        \  }Š=}‰=€t          d‰ › d	|› d
�¦  «        ‚|p|}�nt          ||‰?|||‰ ¬¦  «        \  Š=}t          ‰=|¦  «        }‰=€¿|pd 
                    ¦   «                              ¦   «         }|rN|dvrJt          ‰ |¦  «        \  }}}|�||cŠ=}|p|}|}n(t          d|› d|                     ¦   «         › d�¦  «        ‚‰=€E‰?sCt
                               d‰ pd|¦  «         t          d|‰ ¬¦  «        \  Š=}t          ‰=d¦  «        }‰=€t          d‰ › d	|› d
�¦  «        ‚t          ‰ |
¦  «        }|p|Š>t!          ‰>||¦  «         |                     d¦  «        }t%          |t&          ¦  «        rB|                     d¦  «        dk    r)dt)          t+          ‰=dd¦  «        pd¦  «        v rddi|d<   t)          t+          ‰=d‰?¦  «        pd¦  «        Š<‰ r-t
                               d‰ ‰>pd|pd‰<r	d‰<vrd‰<› �nd¦  «         t-          ‰>|||||	|||‰<p‰?‰ ¬¦  «        }|rt'          |¦  «        |d<   t)          t+          ‰=dd¦  «        pd¦  «        }t/          ‰>|¦  «        rt1          |d          ¦  «        |d <   |rQd!|d"<   |r||d#<   ‰ d$k    r,t%          ‰=t2          ¦  «        r ‰=j        j        j        dai |¤ŽS t;          ‰=|‰>|¬%¦  «        S 	 	 t=          t?          ‰=|‰>|ˆ<ˆ=ˆ>ˆ?ˆ fd&„¬'¦  «        ‰ ‰>‰<¬(¦  «        S # t@          $ �r} tC          | ¦  «        s‚ ‰ d)k    r+tE          | ¦  «        rt
                               d*| ¦  «         ‚ tG          ¦   «         }!| }"tI          d+|!d+z   ¦  «        D ]®}#tK          tL          d,|#d+z
  z  z  d-¦  «        }$t
                               d.‰ pd|#|!|$|"¦  «         tO          j(        |$¦  «         	 t=          t?          ‰=|‰>|ˆ<ˆ=ˆ>ˆ?ˆ fd/„¬'¦  «        ‰ ¦  «        c cY d} ~ S # t@          $ r}%tC          |%¦  «        s‚ |%}"Y d}%~%Œ§d}%~%ww xY w|"‚d} ~ ww xY w# t@          $ �	r{}&d0|v rØtS          |&¦  «        rÉt'          |¦  «        }'|' *                    d0d¦  «         t
                               d1‰ pd¦  «         	 t=          t?          ‰=|'||¬%¦  «        ‰ ¦  «        cY d}&~&S # t@          $ rS}(t)          |(¦  «        })tW          |(¦  «        s'tY          |(¦  «        st[          |(¦  «        s	d2|)v sd3|)v s‚ |(}&|'}Y d}(~(nd}(~(ww xY wt)          |&¦  «        }*d4|*v od5t)          t+          ‰=dd¦  «        ¦  «        v }+|�´d2|*v sd3|*v st]          |&d2¦  «        s|+rš| *                    d2d¦  «         | *                    d6d¦  «         	 t=          t?          ‰=|||¬%¦  «        ‰ ¦  «        cY d}&~&S # t@          $ r:}(tW          |(¦  «        stY          |(¦  «        st_          |(¦  «        s‚ |(}&Y d}(~(nd}(~(ww xY w|d7k    pta          ‰<d8¦  «        },tc          |&¦  «        r¼|,rºte          ‰ dk    |                     d9¦  «        ¬:¦  «        }-|-r�|-|                     d9¦  «        k    rwt
                               d;‰ pd|                     d9¦  «        |-¦  «         |-|d9<   	 t=          t?          ‰=|||¬%¦  «        ‰ ¦  «        cY d}&~&S # t@          $ r}(|(}&Y d}(~(nd}(~(ww xY w|d7k    pta          ‰<d8¦  «        }.tW          |&¦  «        rì|.rêtg          ¦   «         rÜti          |pd7|d‰?|||‰ dk    ¬<¦  «        \  }/}0|/�ºt
                               d=‰ pd¦  «         |0r|0|                     d9¦  «        k    r|0|d9<   	 t=          t?          |/|||¬%¦  «        ‰ ¦  «        cY d}&~&S # t@          $ rI}(t[          |(¦  «        s.tW          |(¦  «        stY          |(¦  «        st_          |(¦  «        s‚ |(}&Y d}(~(nd}(~(ww xY wt[          |&¦  «        r‡|.r…ti          |pd7|d‰?|||‰ dk    ¬<¦  «        \  }/}0|/�ct
                               d>‰ pd¦  «         |0r|0|                     d9¦  «        k    r|0|d9<   t=          t?          |/|||¬%¦  «        ‰ ¦  «        cY d}&~&S tk          |‰<¦  «        }1t[          |&¦  «        r–|1d?vr’|.s�tm          |1¦  «        r�|1to          |¦  «        k    rtq          |¦  «         t
                               d@‰ pd|1¦  «         ts          dai dA‰ “dB|1“dC|p|“dD‰?“dE|“dF|“dG|“dH|“d |“d0|“d2|“dI|	“dJ|“dK|“dL|“d|“ŽcY d}&~&S tu          |‰=|¬M¦  «        }2t)          t+          ‰=dNd¦  «        pd¦  «        }3|2�r—t[          |&¦  «        stW          |&¦  «        st_          |&¦  «        �ri|&}4t_          |&¦  «        r}tW          |&¦  «        sn	 t=          t?          ‰=|||¬%¦  «        ‰ ¦  «        cY d}&~&S # t@          $ r:}(t[          |(¦  «        stW          |(¦  «        st_          |(¦  «        s‚ |(}4Y d}(~(nd}(~(ww xY wtw          |2|4|3¬O¦  «        rÉt
                               dP‰ pd|2ty          |4¦  «        j=        ¦  «         	 ts          dai dA‰ “dB|“dC|“dD‰?“dE|“dF|“dG|“dH|“d |“d0|“d2|“dI|	“dJ|“dK|“dL|“d|“ŽcY d}&~&S # t@          $ rK}5tW          |5¦  «        st[          |5¦  «        st_          |5¦  «        rtw          |2|5¦  «         |5}&n‚ Y d}5~5nd}5~5ww xY wt[          |&¦  «        pJtW          |&¦  «        p;tY          |&¦  «        p,t_          |&¦  «        pt}          |&¦  «        pt          |&¦  «        }6|d?v }7tW          |&¦  «        p;tY          |&¦  «        p,t_          |&¦  «        pt}          |&¦  «        pt          |&¦  «        }8|6�r¯|7s|8�rªt[          |&¦  «        rdQ}9nktW          |&¦  «        r$dR}9t�          tu          |‰=|¬M¦  «        p|¦  «         n8t_          |&¦  «        rdS}9n&t}          |&¦  «        rdT}9nt          |&¦  «        rdU}9ndV}9t
                               dW‰ pd|9||&¦  «         |9dXv rdn|}:dY\  }}}|7rLtƒ          ‰ |pd|9|:¬Z¦  «        \  }}}|€t…          ‰ |pd|9¬[¦  «        \  }}}|€t‡          |‰ |9¬[¦  «        \  }}}n2tƒ          ‰ |pd|9|:¬Z¦  «        \  }}}|€t‰          |‰ |9|:¬Z¦  «        \  }}}|�^t‹          |||‰ ||||	|||¬\¦  «        };|;�|;cY d}&~&S t‡          |‰ d]¬[¦  «        \  }}}|�#t‹          |||‰ ||||	|||¬\¦  «        };|;�|;cY d}&~&S t
                               d^‰ pd|9|¦  «         tY          |&¦  «        r=	 t�          ‰=¦  «         n,# t@          $ r t
           G                    d_d!¬`¦  «         Y nw xY w‚ d}&~&ww xY w)bu  Centralized synchronous LLM call.

    Resolves provider + model (from task config, explicit args, or auto-detect),
    handles auth, request formatting, and model-specific arg adjustments.

    Args:
        task: Auxiliary task name ("compression", "vision", "web_extract",
              "session_search", "skills_hub", "mcp", "title_generation").
              Reads provider:model from config/env. Ignored if provider is set.
        provider: Explicit provider override.
        model: Explicit model override.
        api_mode: Explicit API mode override (e.g. "codex_responses",
              "anthropic_messages"). Takes precedence over task config.
        messages: Chat messages list.
        temperature: Sampling temperature (None = provider default).
        max_tokens: Max output tokens (handles max_tokens vs max_completion_tokens).
        tools: Tool definitions (for function calling).
        timeout: Request timeout in seconds (None = read from auxiliary.{task}.timeout config).
        extra_body: Additional request body fields.
        reasoning_config: Optional Hermes reasoning config for direct model calls
              such as MoA reference/aggregator slots.
        extra_headers: Additional per-request HTTP headers. These override
            client-level defaults for providers that gate capabilities on
            request attribution (for example Copilot's ``x-initiator``).
        stream: When True, return the raw SDK streaming iterator instead of a
            validated complete response. The caller is responsible for consuming
            chunks (and for any fallback). Used by the MoA aggregator so its
            output can stream to the user.
        stream_options: Passed through to the request when stream is True
            (e.g. {"include_usage": True}).

    Returns:
        Response object with .choices[0].message.content, OR â€” when stream=True â€”
        the raw streaming iterator from client.chat.completions.create().

    Raises:
        RuntimeError: If no provider is configured.
    rs  rê   F©rè   rý   r=   r\   rO   r  NúDVision provider %s unavailable, falling back to auto vision backends©rè   rý   rO   r  ú$No LLM provider configured for task=ú
 provider=ú. Run: hermes setup)r=   r\   rù  r  r°  rB   >   rê   rî   r{  ú
Provider 'ú:' is set in config.yaml but no API key was found. Set the úU_API_KEY environment variable, or switch to a different provider with `hermes model`.úBAuxiliary %s: provider %s unavailable, trying auto-detection chainrk  r¯  Úresponse_formatrÿ  Újson_schemaúapi.deepseek.comr=   Újson_objectzAuxiliary %s: using %s (%s)%sr$  r{  z at r  rn  rå  Tr  r3  r·  rÊ  c           	      óJ   •— t          ‰| ‰t          ‰‰p‰¦  «        ¬¦  «        S ©Nr>  ©rE  r=  ©rÙ  Ú
_base_inforZ   Úrequest_providerrù  r°  s    €€€€€r   r¯  z _call_llm_impl.<locals>.<lambda>�#  s8   ø€ Õ+@ØØØÝ%>Ø,¨jÐ.MÐ<Mñ&ô &ð	,ñ ,ô ,€ r   rÓ  r  r~  zfAuxiliary compression: timeout on the critical path; skipping same-provider retry and falling back: %srí   g       @g       @zoAuxiliary %s: transient transport error (attempt %d/%d); retrying same provider after %.1fs before fallback: %sc           	      óJ   •— t          ‰| ‰t          ‰‰p‰¦  «        ¬¦  «        S r~  r  r€  s    €€€€€r   r¯  z _call_llm_impl.<locals>.<lambda>¿#  s9   ø€ Õ3HØ &Ø 'Ø $Ý-FØ$4Ø$.Ð$CÐ2Cñ."ô ."ð	4ñ 4ô 4€ r   r§  zEAuxiliary %s: provider rejected temperature; retrying once without itr¥  r¼  Ú1210r¬  r¦  rÃ  rè  rý   ©rs  r  z[Auxiliary %s: model %r no longer in Nous catalog; retrying with refreshed recommendation %r)rc  rý   rO   r=   r\   rù  r  r·  zSAuxiliary %s: refreshed Nous runtime credentials after paid account check, retryingzDAuxiliary %s: refreshed Nous runtime credentials after 401, retrying>   NrB   rê   zAAuxiliary %s: refreshed %s credentials after auth error, retryingr°  rå  rø  rù  rú  rû  r  rL  rù  rü  rý  rª  rß  r\   rí  z@Auxiliary %s: recovered %s via credential-pool rotation after %sú
auth errorrY  r–  úmodel incompatible with routeúinvalid provider responseúconnection errorz,Auxiliary %s: %s on %s (%s), trying fallback©r†  rY  rb  ©r  rk  r’  ©r°  rå  r§  r¥  rù  rü  rý  rª  ústale fallback credentialzoAuxiliary %s: %s on %s and all fallbacks exhausted (fallback_chain + main agent model). Raising original error.z7Auxiliary: cache eviction after connection error failedrt   r   )Hr  r  rº  rp  r  rX   rY   rN  r  r  rò   ró   r”  Úupperrl  r³  rÉ  rJ   r$   ro  rI   ro   r  r  r	  rx  r{  rt  rK  rð  r
  rå  rK   r«  rž  r²  Úranger°  Ú_TRANSIENT_RETRY_BACKOFF_BASEr  ÚsleeprÁ  r´  r‹  r©  r·  r¿  r™  r4   rÉ  rƒ  r’  rj  r&  r"  rû   rÙ  r  rì  r÷  rÿ  r*   rÏ  rÑ  rl  r�  rŸ  ri  r|  rV  r  rx   )@r°  rè   rý   r=   r\   r  rå  r§  r¥  rù  r6  rð  rª  rn  rù  r  r3  rå  rø  rú  rû  rý  r  rL  Ú	_explicitr:  r;  r'  rü  Ú_rfr!   Ú_client_baseÚtransient_errÚ_max_transient_retriesÚ_last_transientÚ_attemptÚ_backoffÚretry_transientÚ	first_errr  rU  Úretry_err_strÚerr_strÚ_is_zai_param_errorÚ_heal_is_nousÚhealed_modelÚclient_is_nousÚrefreshed_clientÚrefreshed_modelÚauth_refresh_providerÚpool_providerÚ_client_api_keyÚrecovery_errÚ
retry2_errÚshould_fallbackÚis_autoÚis_capacity_errorr  Ú_chain_failed_modelÚfb_respr�  rZ   r‚  rù  s@   `                                                           @@@@r   rh  rh  –"  s4  øøøøø€ õ| +¨<Ñ8Ô8€LÝ`|Øˆh˜˜x¨ña2ô a2Ñ]Ð�~Ð'8Ð:JÐL]àð %Ø$ÐÝ/°Ñ5Ô5ÐØ×Ò 
Ð 0¨bÑ1Ô1Ð1Ø*ÐàˆxÒÐÝ2PØ*;¸vÒ*EÐ*EÐ&Ð&È8Ø Ð) EØ&Ð2¨(Ø$Ð/¨ØØ%ð3
ñ 3
ô 3
Ñ/Ð˜F Kð ˆ>Ð/°6Ò9Ð9ÐBSÐ9Ý�NŠNØVØ!ñô ð õ 7UØØ$Ø Ø)ð	7ñ 7ô 7Ñ3Ð ¨ð ˆ>Ýð%°tð %ð %ÐGXð %ð %ð %ñô ð ð /ÐCÐ2CÐÑå0ØØØ&Ø$Ø&Ø%Øð
ñ 
ô 
Ñˆ�õ <ØÐ%ñ
ô 
Ðð ˆ>ð +Ð0¨b×7Ò7Ñ9Ô9×?Ò?ÑAÔAˆIØð ˜YÐ.NÐNÐNÝ0_Ø˜)ñ1ô 1Ñ-�	˜8 Xð Ð(Ø*3°XÐ'�F˜KØ(0Ð(EÐ4EÐ%Ø):Ð&Ð&å&ð\ Yð \ð \Ø.7¯oªoÑ.?Ô.?ð\ð \ð \ñô ð ð ˆ~Ð&7ˆ~Ý—’Ð`Ø ˜N FÐ,=ñ?ô ?ð ?å&8Ø¨¸Dð'ñ 'ô 'Ñ#�˜õ &DØ˜Fñ&ô &Ð"ð ˆ>Ýð%°tð %ð %ÐGXð %ð %ð %ñ&ô &ð &õ /¨t°WÑ=Ô=ÐØ)Ð>Ð->ÐÝØØØñô ð ð ×
"Ò
"Ð#4Ñ
5Ô
5€Cå�3�ÑÔðJà�GŠG�F‰OŒO˜}Ò,Ð,Ø¥#¥g¨f°jÀ"Ñ&EÔ&EÐ&KÈÑ"LÔ"LÐLÐLà39¸=Ð2IÐÐ.Ñ/õ •W˜V ZÐ1BÑCÔCÐIÀrÑJÔJ€JØð cÝ�ŠÐ3ØÐ+Ð5¨v°{Ð7OÀiØ,6Ða¸<ÈzÐ;YÐ;YÐ(˜JÐ(Ð(Ð(Ð_añ	cô 	cð 	cõ  Ø˜+ xØ¨JØÐ.Ð;OØ)ØÐ0Ð0°tð=ñ =ô =€Fð ð 6Ý"& }Ñ"5Ô"5ˆˆÑõ •w˜v z°2Ñ6Ô6Ð<¸"Ñ=Ô=€LÝ$Ð%5°|ÑDÔDð UÝ@ÀÈ
ÔASÑTÔTˆˆzÑð ð 
ØˆˆxÑØð 	6Ø'5ˆFÐ#Ñ$ØÐ#Ò#Ð#­
°6Õ;OÑ(PÔ(PÐ#ð 2�6”;Ô*Ô1Ð;Ð;°FÐ;Ð;Ð;Ý!ØØØ%Ø&ð	
ñ 
ô 
ð 	
ðzð"F	"Ý)Ý&ØØØ-Ø.ðð ð ð ð ð ð ð ðñ ô ð Ø)°Jð!@ñ @ô @ð @øõ" ð 4	"ñ 4	"ð 4	"Ý0°Ñ?Ô?ð Øð �}Ò$Ð$Õ):¸=Ñ)IÔ)IÐ$Ý—’ðHà!ñô ð ð
 Ý%;Ñ%=Ô%=Ð"Ø+ˆOÝ! !Ð%;¸aÑ%?Ñ@Ô@ð 6ð 6�ÝÕ<ÀÈÐSTÉÑ@UÑVÐX[Ñ\Ô\�Ý—’ðMà�N˜F HÐ.DÀhØ#ñ	ô ð õ ”
˜8Ñ$Ô$Ð$ð6Ý1Ý.Ø"Ø"Ø%5Ø%6ð$ð $ð $ð $ð $ð $ð $ð $ðñ ô ð ñ!ô ð ð ð ð ð ð ð ð øõ" !ð 6ð 6ð 6Ý8¸ÑIÔIð ØØ&5�O�O�O�O�O�Oøøøøð6øøøð
 "Ð!øøøøði4	"øøøøõj ð bñ bð bØ˜FÐ"Ð"Õ'HÈÑ'SÔ'SÐ"Ý ™<œ<ˆLØ×Ò˜]¨DÑ1Ô1Ð1Ý�KŠKØWØ�˜ñô ð ð&Ý-Ý*ØØ$Ø!2Ø!2ð	ñ ô ð
 ñô ð ð ð ð ð ð øõ ð &ð &ð &Ý # I¡¤�õ & iÑ0Ô0ðå+¨IÑ6Ô6ðõ & iÑ0Ô0ðð $ }Ð4Ð4Ø.°-Ð?Ð?àØ%�	Ø%������øøøøð&øøøõ" �i‘.”.ˆð �gÐð CØ�c¥'¨&°*¸bÑ"AÔ"AÑBÔBÐBð 	ð Ð!Ø˜GÐ#Ð#Ø&¨'Ð1Ð1Ý.¨y¸,ÑGÔGð 2à"ð 2ð �JŠJ�| TÑ*Ô*Ð*Ø�JŠJÐ.°Ñ5Ô5Ð5ð&Ý-Ý*ØØØ!2Ø!2ð	ñ ô ð
 ñô ð ð ð ð ð ð øõ ð &ð &ð &õ *¨)Ñ4Ô4ð Õ8LÈYÑ8WÔ8Wð Õ[oÐpyÑ[zÔ[zð ØØ%�	�	�	�	�	�	øøøøð&øøøð  Ò'ð SÝ$ ZÐ1QÑRÔRð 	õ % YÑ/Ô/ð 	*°Mð 	*Ý:Ø Ò(°v·z²zÀ'Ñ7JÔ7JðLñ Lô LˆLàð * °·
²
¸7Ñ0CÔ0CÒ CÐ CÝ—’ð@à�N˜F F§J¢J¨wÑ$7Ô$7¸ñô ð ð
 #/��w‘ð	*Ý1Ý.Ø"Ø"Ø%6Ø%6ð	ñ ô ð
  ñ!ô !ð !ð !ð !ð !ð !ð !øõ !ð *ð *ð *Ø )�I�I�I�I�I�Iøøøøð*øøøð
  Ò'ð SÝ$ ZÐ1QÑRÔRð 	õ
 ˜iÑ(Ô(ð&	*àð&	*õ ;Ñ<Ô<ð&	*õ
 1OØ0Ð:°FØ!Ø Ø*Ø(Ø*Ø)Ø 8Ò+ð	1ñ 	1ô 	1Ñ-Ð˜oð  Ð+Ý—’ØiØ�N˜Fñô ð ð #ð 6 ¸&¿*º*ÀWÑ:MÔ:MÒ'MÐ'MØ&5�F˜7‘Oð*Ý1Ý.Ø,Ø"Ø%6Ø%6ð	ñ ô ð
  ñ!ô !ð !ð !ð !ð !ð !ð !øõ !ð *ð *ð *å& yÑ1Ô1ðå,¨YÑ7Ô7ðõ 0°	Ñ:Ô:ðõ 0°	Ñ:Ô:ð	ð Ø )�I�I�I�I�I�Iøøøøð*øøøõ ˜)Ñ$Ô$ð 	¨ð 	Ý0NØ0Ð:°FØ!Ø Ø*Ø(Ø*Ø)Ø 8Ò+ð	1ñ 	1ô 	1Ñ-Ð˜oð  Ð+Ý—’ÐbØ ˜N Fñ,ô ,ð ,à"ð 6 ¸&¿*º*ÀWÑ:MÔ:MÒ'MÐ'MØ&5�F˜7‘OÝ-Ý*Ø(ØØ!2Ø!2ð	ñ ô ð
 ñô ð ð ð ð ð ð õ !AØ˜zñ!+ô !+Ðå˜9Ñ%Ô%ð 	Ø)Ð1CÐCÐCØ&ð Då,Ð-BÑCÔCð Ø(Õ,CÐDUÑ,VÔ,VÒVÐVõ *Ð*;Ñ<Ô<Ð<Ý—’ØWØ�N˜FÐ$9ñô ð õ 1ð ð ð Ø˜ðà&;Ð&;ðð $2Ð#@°[øðð '8Ð&7ð	ð
 &6Ð%5ðð '8Ð&7ðð ". ðð !, ðð &˜Xðð !, ðð  *˜zðð  ˜%ðð '8Ð&7ðð *>Ð)=ðð &6Ð%5ðð  #0 -ð!ð ð ð ð ð ð õ( 3Ð3DÀfÐ[gÐhÑhÔhˆõ
 �g f¨i¸Ñ<Ô<ÐBÀÑCÔCˆØñ 4	�n¨YÑ7Ô7ð 4	Õ;LÈYÑ;WÔ;Wð 4	Õ[oÐpyÑ[zÔ[zñ 4	Ø$ˆLõ $ IÑ.Ô.ð -Õ7HÈÑ7SÔ7Sð -ð-Ý1Ý.Ø"Ø"Ø%6Ø%6ð	ñ ô ð
  ñ!ô !ð !ð !ð !ð !ð !ð !øõ !ð -ð -ð -Ý*¨9Ñ5Ô5ð Õ9JÈ9Ñ9UÔ9Uð ÕYmÐnwÑYxÔYxð ØØ#,�L�L�L�L�L�Løøøøð-øøøõ & m°\ÐRaÐbÑbÔbð #Ý—’ØVØ�N˜F Mµ4¸Ñ3EÔ3EÔ3Nñô ð ðÝ4ð ð ð Ø!˜Tðà*;Ð*;ðð (6 ~ðð +<Ð*;ð	ð
 *:Ð)9ðð +<Ð*;ðð &2 \ðð %0 Kðð "* ðð %0 Kðð $. :ðð $˜eðð +<Ð*;ðð .BÐ-Aðð *:Ð)9ðð  '4 mð!ð ð ð ð ð ð øõ$ !ð ð ð õ *¨*Ñ5Ô5ð ½È
Ñ9SÔ9Sð Ý3°JÑ?Ô?ðå.¨}¸jÑIÔIÐIØ$.˜	˜	àð "˜	˜	˜	˜	øøøøðøøøõN ˜9Ñ%Ô%ð 9Ý  Ñ+Ô+ð9å# IÑ.Ô.ð9õ $ IÑ.Ô.ð9õ ,¨IÑ6Ô6ð	9õ
 .¨iÑ8Ô8ð 	ð $Ð'9Ð9ˆõ ˜iÑ(Ô(ð 9Ý# IÑ.Ô.ð9å# IÑ.Ô.ð9õ ,¨IÑ6Ô6ð9õ .¨iÑ8Ô8ð 	ð ñ Y	 ð Y	Ð+<ñ Y	Ý˜iÑ(Ô(ð ,Ø%��Ý" 9Ñ-Ô-ð ,Ø(�õ
 )Ý.Ð/@À&ÐWcÐdÑdÔdÐyÐhyñô ð ð õ & iÑ0Ô0ð ,Ø%��Ý-¨iÑ8Ô8ð ,Ø8��Ý/°	Ñ:Ô:ð ,Ø4��à+�Ý�KŠKÐFØ˜ ¨Ð0AÀ9ñNô Nð Nð Ð"AÐAÐA��À{ð  ð -=Ñ)ˆI�x Øð :Ý0NØÐ+Ð5¨v¸fØ!4ð16ñ 16ô 16Ñ-�	˜8 Xð Ð$Ý4LØÐ/Ð9°6À&ð5Jñ 5Jô 5JÑ1�I˜x¨àÐ$Ý4IØ)¨4¸ð5@ñ 5@ô 5@Ñ1�I˜x¨øõ 1OØÐ+Ð5¨v¸fØ!4ð16ñ 16ô 16Ñ-�	˜8 Xð Ð$Ý4RØ)¨4¸Ø%8ð5:ñ 5:ô 5:Ñ1�I˜x¨ð Ð$Ý7Ø˜x¨Ø¨Ø +¸
ØÐ3DØ)=Ø%5ð7ñ 7ô 7�ð Ð&Ø"�N�N�N�N�N�Nõ 1FØ% tÐ4Oð1Qñ 1Qô 1QÑ-�	˜8 XàÐ(Ý;Ø! 8¨XØ!¨HØ$/¸JØ#Ð7HØ-AØ)9ð;ñ ;ô ;�Gð Ð*Ø&˜˜˜˜˜˜õ �NŠNðOà�˜ Ð(9ñô ð õ   	Ñ*Ô*ð 	,ð,Ý-¨fÑ5Ô5Ð5Ð5øÝð ,ð ,ð ,Ý—’ÐVØ&*ð ñ ,ô ,ð ,ð ,ð ,ð,øøøð 	øøøøðEbøøøsÂ  Î+N< Î<S!ÏB9SÒ(R1Ò)SÒ+S!Ò,S$ Ò1
SÒ;SÓSÓSÓSÓS!Ó!S$ Ó$y*Ó/Ay%Õ U+Õ%y*Õ+
WÕ5A	WÖ>y%×W×A>y%Ù Y-Ù'y*Ù-
Z1Ù70Z,Ú'y%Ú,Z1Ú1B$y%Ý ]<Ý6y*Ý<
^Þ^Þy%Þ^ÞBy%à* aá
y*á
b#á?bây%âb#â#By%ä6y*ä<B/y%ç+y*ç1By%é5 jêy*ê
kê%0këy%ëkëAy%ì&9m%íy*í%
n:í/An5î0y%î5n:î:G>y%ö8y*ö>5y%÷3y*÷9.y%ø(x8ø7y%ø8&y!ùy%ù y!ù!y%ù%y*c                 óˆ  — ddl }| j        d         j        }|j        pd                     ¦   «         }|r7 |j        dd||j        |j        z  ¬¦  «                             ¦   «         }|r|S g }dD ]i}t          ||d¦  «        }|rTt          |t          ¦  «        r?|                     ¦   «         r+||vr'|                     |                     ¦   «         ¦  «         Œjt          |dd¦  «        }|r¿t          |t          ¦  «        rª|D ]§}	t          |	t          ¦  «        r�|	                     d¦  «        p)|	                     d	¦  «        p|	                     d
¦  «        }
|
rO|
|vrK|                     t          |
t          ¦  «        r|
                     ¦   «         nt          |
¦  «        ¦  «         Œ¨|rd                     |¦  «        S dS )u¡  Extract content from an LLM response, falling back to reasoning fields.

    Mirrors the main agent loop's behavior when a reasoning model (DeepSeek-R1,
    Qwen-QwQ, etc.) returns ``content=None`` with reasoning in structured fields.

    Resolution order:
      1. ``message.content`` â€” strip inline think/reasoning blocks, check for
         remaining non-whitespace text.
      2. ``message.reasoning`` / ``message.reasoning_content`` â€” direct
         structured reasoning fields (DeepSeek, Moonshot, NovitaAI, etc.).
      3. ``message.reasoning_details`` â€” OpenRouter unified array format.

    Returns the best available text, or ``""`` if nothing found.
    r   NrB   zz<(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>.*?</(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>)Úflags)rñ  rW  Úreasoning_detailsr÷  ré  r*  z

)r*  r?  r)  ré  rò   ÚsubÚDOTALLÚ
IGNORECASEro   r$   rI   r&  rE  ro  rJ   rP  )rÀ  r*  rR  ré  ÚcleanedrQ  rú  r'  ÚdetailsÚdetailr÷  s              r   Úextract_content_or_reasoningr·  u%  sü  € ð €I€I€Ià
Ô
˜1Ô
Ô
%€CØŒ{Ð ˜b×'Ò'Ñ)Ô)€Gàð 	à�"”&ðLð �˜rœy¨2¬=Ñ8ð	
ñ 
ô 
÷
 Š%‰'Œ'ð 	ð ð 	ØˆNð "$€OØ3ð 0ð 0ˆÝ�c˜5 $Ñ'Ô'ˆØð 	0•:˜c¥3Ñ'Ô'ð 	0¨C¯IªI©K¬Kð 	0¸CÀÐ<VÐ<VØ×"Ò" 3§9¢9¡;¤;Ñ/Ô/Ð/øå�cÐ.°Ñ5Ô5€GØð 	j•:˜g¥tÑ,Ô,ð 	jØð 	jð 	jˆFÝ˜&¥$Ñ'Ô'ð jà—J’J˜yÑ)Ô)ð *Ø—z’z )Ñ,Ô,ð*à—z’z &Ñ)Ô)ð ð
 ð j˜w¨oÐ=Ð=Ø#×*Ò*½jÈÕRUÑ>VÔ>VÐ+h¨7¯=ª=©?¬?¨?Õ\_Ð`gÑ\hÔ\hÑiÔiÐiøàð ,Ø�{Š{˜?Ñ+Ô+Ð+àˆ2r   )rè   rý   r=   r\   r  r§  r¥  rù  r6  rð  rª  c             ƒ   ó
  K  — t          | ¦  «        }|�|                     ¦   «         ƒ d{V —† 	 t          | |||||||||	|
||¬¦  «        ƒ d{V —†	 |�|                     ¦   «          S S # |�|                     ¦   «          w w xY w)zERun an asynchronous auxiliary LLM request under the configured limit.N)r°  rè   rý   r=   r\   r  rå  r§  r¥  rù  r6  rð  rª  )rÊ  rg  Ú_async_call_llm_implrj  )r°  rè   rý   r=   r\   r  rå  r§  r¥  rù  r6  rð  rª  rÄ  s                 r   Úasync_call_llmrº  ­%  så   è è € õ$ -¨TÑ2Ô2€IØÐØ×ÒÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ð Ý)ØØØØØØ%ØØ#Ø!ØØØ!Ø-ð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
ð  Ð Ø×ÒÑÔÐÐð !øˆ9Ð Ø×ÒÑÔÐÐð !øøøs   ¯!A) Á)Bc             ƒ   ón  ‡ ‡8‡9K  — t          |¦  «        }t          ‰ ||||¦  «        \  }}}}}t          ‰ ¦  «        }|                     |pi ¦  «         |}‰ dk    r�t	          |dk    r|n||p||p||p|d|¬¦  «        \  }Š9}‰9€:|dk    r4|s2t
                               d|¦  «         t	          d|d|¬¦  «        \  }Š9}‰9€t          d‰ › d	|› d
�¦  «        ‚|p|}�nt          ||d||||‰ ¬¦  «        \  Š9}t          ‰9|¦  «        }‰9€Ö|pd 
                    ¦   «                              ¦   «         }|rd|dvr`t          ‰ |¦  «        \  }}}|�"t          ||pd‰ dk    ¬¦  «        \  Š9}|p|}|}n(t          d|› d|                     ¦   «         › d�¦  «        ‚‰9€F|sDt
                               d‰ pd|¦  «         t          dd|‰ ¬¦  «        \  Š9}t          ‰9d¦  «        }‰9€t          d‰ › d	|› d
�¦  «        ‚t!          ‰ |
¦  «        }|p|}t#          |||¦  «         |                     d¦  «        }t'          |t(          ¦  «        r$|                     d¦  «        dk    rd|v rddi|d<   t+          t-          ‰9dd¦  «        pd¦  «        }t/          ||||||	||||p|‰ ¬¦  «        }t1          ||¦  «        rt3          |d         ¦  «        |d<   	 t5          ||p|¦  «        o"t'          ‰9t6          t8          t:          f¦  «         Š8dt<          t*          t>          f         dt>          fˆ8ˆ9ˆ fd„}	 tA          tC          ‰9||||¬ ¦  «        ƒ d{V —†‰ ||¬!¦  «        S # tD          $ r‘}tG          |¦  «        s‚ ‰ d"k    r+tI          |¦  «        rt
                               d#|¦  «         ‚ t
                               d$‰ pd|¦  «         tA          tC          ‰9||||¬ ¦  «        ƒ d{V —†‰ ¦  «        cY d}~S d}~ww xY w# tD          $ �	r³} d%|v rÞtK          | ¦  «        rÏt)          |¦  «        }!|! &                    d%d¦  «         t
                               d&‰ pd¦  «         	 tA          tC          ‰9|!||¬'¦  «        ƒ d{V —†‰ ¦  «        cY d} ~ S # tD          $ rS}"t+          |"¦  «        }#tO          |"¦  «        s'tQ          |"¦  «        stS          |"¦  «        s	d(|#v sd)|#v s‚ |"} |!}Y d}"~"nd}"~"ww xY wt+          | ¦  «        }$d*|$v od+t+          t-          ‰9dd¦  «        ¦  «        v }%|�ºd(|$v sd)|$v stU          | d(¦  «        s|%r | &                    d(d¦  «         | &                    d,d¦  «         	 tA          tC          ‰9|||¬'¦  «        ƒ d{V —†‰ ¦  «        cY d} ~ S # tD          $ r:}"tO          |"¦  «        stQ          |"¦  «        stW          |"¦  «        s‚ |"} Y d}"~"nd}"~"ww xY w|d-k    ptY          |d.¦  «        }&t[          | ¦  «        rÂ|&rÀt]          ‰ dk    |                     d/¦  «        ¬0¦  «        }'|'r–|'|                     d/¦  «        k    r}t
                               d1‰ pd|                     d/¦  «        |'¦  «         |'|d/<   	 tA          tC          ‰9|||¬'¦  «        ƒ d{V —†‰ ¦  «        cY d} ~ S # tD          $ r}"|"} Y d}"~"nd}"~"ww xY w|d-k    ptY          |d.¦  «        }(tO          | ¦  «        rñ|(rït_          ¦   «         ráta          |pd-|d|||‰ dk    ¬2¦  «        \  })}*|)�Àt
                               d3‰ pd¦  «         |*r|*|                     d/¦  «        k    r|*|d/<   	 tA          tC          |)|||¬'¦  «        ƒ d{V —†‰ ¦  «        cY d} ~ S # tD          $ rI}"tS          |"¦  «        s.tO          |"¦  «        stQ          |"¦  «        stW          |"¦  «        s‚ |"} Y d}"~"nd}"~"ww xY wtS          | ¦  «        rŒ|(rŠta          |pd-|d|||‰ dk    ¬2¦  «        \  })}*|)�it
                               d4‰ pd¦  «         |*r|*|                     d/¦  «        k    r|*|d/<   tA          tC          |)|||¬'¦  «        ƒ d{V —†‰ ¦  «        cY d} ~ S tc          ||¦  «        }+tS          | ¦  «        r|+d5vr{|(syte          |+¦  «        rj|+tg          |¦  «        k    rti          |¦  «         t
                               d6‰ pd|+¦  «         tk          ‰ |+|p|||||||||	|||¬7¦  «        ƒ d{V —†cY d} ~ S tm          |‰9|¬8¦  «        },t+          t-          ‰9d9d¦  «        pd¦  «        }-|,�r†tS          | ¦  «        stO          | ¦  «        stW          | ¦  «        �rX| }.tW          | ¦  «        rƒtO          | ¦  «        st	 tA          tC          ‰9|||¬'¦  «        ƒ d{V —†‰ ¦  «        cY d} ~ S # tD          $ r:}"tS          |"¦  «        stO          |"¦  «        stW          |"¦  «        s‚ |"}.Y d}"~"nd}"~"ww xY wto          |,|.|-¬:¦  «        r²t
                               d;‰ pd|,tq          |.¦  «        j9        ¦  «         	 tk          ‰ ||||||||||	|||¬7¦  «        ƒ d{V —†cY d} ~ S # tD          $ rK}/tO          |/¦  «        stS          |/¦  «        stW          |/¦  «        rto          |,|/¦  «         |/} n‚ Y d}/~/nd}/~/ww xY wtS          | ¦  «        pJtO          | ¦  «        p;tQ          | ¦  «        p,tW          | ¦  «        ptu          | ¦  «        ptw          | ¦  «        }0|d5v }1tO          | ¦  «        p;tQ          | ¦  «        p,tW          | ¦  «        ptu          | ¦  «        ptw          | ¦  «        }2|0�ró|1s|2�rîtS          | ¦  «        rd<}3nitO          | ¦  «        r"d=}3ty          tm          |‰9¦  «        p|¦  «         n8tW          | ¦  «        rd>}3n&tu          | ¦  «        rd?}3ntw          | ¦  «        rd@}3ndA}3t
                               dB‰ pd|3|| ¦  «         |3dCv rdn|}4dD\  }}}|1rLt{          ‰ |pd|3|4¬E¦  «        \  }}}|€t}          ‰ |pd|3¬F¦  «        \  }}}|€t          |‰ |3¬F¦  «        \  }}}n2t{          ‰ |pd|3|4¬E¦  «        \  }}}|€t�          |‰ |3|4¬E¦  «        \  }}}|�¤t          ||pd‰ dk    ¬¦  «        \  }5}6tƒ          |5|6p||‰ ||||	|||¬G¦  «        ƒ d{V —†}7|7�|7cY d} ~ S t          |‰ dH¬F¦  «        \  }}}|�Ft          ||pd‰ dk    ¬¦  «        \  }5}6tƒ          |5|6p||‰ ||||	|||¬G¦  «        ƒ d{V —†}7|7�|7cY d} ~ S t
                               dI‰ pd|3|¦  «         tQ          | ¦  «        r=	 t…          ‰9¦  «         n,# tD          $ r t
           C                    dJd¬K¦  «         Y nw xY w‚ d} ~ ww xY w)LzqCentralized asynchronous LLM call.

    Same as call_llm() but async. See call_llm() for full documentation.
    rs  rê   Tro  Nrp  rq  rr  rs  rt  )rO   r=   r\   rù  r  r°  rB   >   rê   rî   r{  rØ  ru  rv  rw  rx  rk  )rO   r  r°  ry  rÿ  rz  r{  r|  r=   r  rå  Ú_kwargsr   c              “   ót   •K  — ‰rt          ‰| ‰¦  «        ƒ d {V —†S  ‰j        j        j        di | ¤Žƒ d {V —†S rÖ  )re  r{  rt  rK  )r¼  Ú_force_stream_asyncrZ   r°  s    €€€r   Ú_acreatez&_async_call_llm_impl.<locals>._acreater&  sd   øè è € Ø"ð IÝ1°&¸'À4ÑHÔHÐHÐHÐHÐHÐHÐHÐHØ7˜œÔ0Ô7ÐBÐB¸'ÐBÐBÐBÐBÐBÐBÐBÐBÐBr   rÓ  r  r~  znAuxiliary compression (async): timeout on the critical path; skipping same-provider retry and falling back: %szgAuxiliary %s (async): transient transport error; retrying once on the same provider before fallback: %sr§  zMAuxiliary %s (async): provider rejected temperature; retrying once without itrÊ  r¥  r¼  r„  r¬  r¦  rÃ  rè  rý   r…  zcAuxiliary %s (async): model %r no longer in Nous catalog; retrying with refreshed recommendation %r)rc  rý   rO   r=   r\   rù  r·  z[Auxiliary %s (async): refreshed Nous runtime credentials after paid account check, retryingzLAuxiliary %s (async): refreshed Nous runtime credentials after 401, retrying>   NrB   rê   zIAuxiliary %s (async): refreshed %s credentials after auth error, retrying)r°  rå  rø  rù  rú  rû  rL  rå  r§  r¥  rù  rü  rý  rª  rß  r\   rí  zHAuxiliary %s (async): recovered %s via credential-pool rotation after %sr†  rY  r–  r‡  rˆ  r‰  z4Auxiliary %s (async): %s on %s (%s), trying fallbackrŠ  rb  r‹  r’  rŒ  r�  zwAuxiliary %s (async): %s on %s and all fallbacks exhausted (fallback_chain + main agent model). Raising original error.z?Auxiliary (async): cache eviction after connection error failedrt   )Dr  r  rº  rp  r  rX   rY   rN  r  r  rò   ró   r”  rÈ  rŽ  rl  r³  rÉ  rJ   r$   ro  rI   ro   r  r  r	  r=  r�  rÔ  ró  r   r   r
  ré  rK   r«  rž  rÁ  r´  r‹  r©  r·  r¿  r™  r4   rÉ  rƒ  r’  rj  r&  r"  rû   rÙ  r  rì  r÷  rÿ  r*   rÏ  rÑ  rl  r�  rŸ  ri  r|  rX  r  rx   ):r°  rè   rý   r=   r\   r  rå  r§  r¥  rù  r6  rð  rª  rå  rø  rù  rú  rû  rý  r  rL  r’  r:  r;  r'  rü  r‚  r“  r”  r!   r¿  r•  r›  r  rU  rœ  r�  rž  rŸ  r   r¡  r¢  r£  r¤  r¥  r¦  r§  r¨  r©  rª  r«  r  r¬  Úasync_fbÚasync_fb_modelr­  r¾  rZ   s:   `                                                       @@r   r¹  r¹  ×%  s  øøøè è € õ, +¨<Ñ8Ô8€LÝ`|Øˆh˜˜x¨ña2ô a2Ñ]Ð�~Ð'8Ð:JÐL]å/°Ñ5Ô5ÐØ×Ò 
Ð 0¨bÑ1Ô1Ð1Ø*ÐàˆxÒÐÝ2PØ*;¸vÒ*EÐ*EÐ&Ð&È8Ø Ð) EØ&Ð2¨(Ø$Ð/¨ØØ%ð3
ñ 3
ô 3
Ñ/Ð˜F Kð ˆ>Ð/°6Ò9Ð9ÐBSÐ9Ý�NŠNØVØ!ñô ð õ 7UØØ$ØØ)ð	7ñ 7ô 7Ñ3Ð ¨ð ˆ>Ýð%°tð %ð %ÐGXð %ð %ð %ñô ð ð /ÐCÐ2CÐÑå0ØØØØ&Ø$Ø&Ø%Øð	
ñ 	
ô 	
Ñˆ�õ <ØÐ%ñ
ô 
Ðð ˆ>Ø*Ð0¨b×7Ò7Ñ9Ô9×?Ò?ÑAÔAˆIØð ˜YÐ.NÐNÐNÝ0_Ø˜)ñ1ô 1Ñ-�	˜8 Xð Ð(Ý*:Ø! 8 >¨r¸dÀhÒ>Nð+ñ +ô +Ñ'�F˜Kð )1Ð(EÐ4EÐ%Ø):Ð&Ð&å&ð\ Yð \ð \Ø.7¯oªoÑ.?Ô.?ð\ð \ð \ñô ð ð
 ˆ~Ð&7ˆ~Ý—’Ð`Ø ˜N FÐ,=ñ?ô ?ð ?å&8ØØ#Ø!-Øð	'ñ 'ô 'Ñ#�˜õ &DØ˜Fñ&ô &Ð"ð ˆ>Ýð%°tð %ð %ÐGXð %ð %ð %ñ&ô &ð &õ /¨t°WÑ=Ô=ÐØ)Ð>Ð->ÐÝØØØñô ð ð ×
"Ò
"Ð#4Ñ
5Ô
5€Cå�3�ÑÔðJà�GŠG�F‰OŒO˜}Ò,Ð,Ø ,Ð.Ð.à39¸=Ð2IÐÐ.Ñ/õ
 •w˜v z°2Ñ6Ô6Ð<¸"Ñ=Ô=€LÝØ˜+ xØ¨JØÐ.Ð;OØ)ØÐ2Ð!2¸ð?ñ ?ô ?€Fõ %Ð%5°|ÑDÔDð UÝ@ÀÈ
ÔASÑTÔTˆˆzÑðiõ
 &Ø  ,Ð"CÐ2Cñô ð õ ˜vÝ)Ý-Ý+ð(ñ ô ð ð	 	ð	C¥D­­c¨¤Nð 	Cµsð 	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	Cð
%	Ý)Ý-ØØØ-Ø.Ø#ðñ ô ð ð ð ð ð ð ð Ø)°Lð	Bñ 	Bô 	Bð 	Bøõ ð 	ð 	ð 	Ý0°Ñ?Ô?ð Øð �}Ò$Ð$Õ):¸=Ñ)IÔ)IÐ$Ý—’ðNà!ñô ð ð
 Ý�KŠKð@à�˜ ñô ð õ
 *Ý-ØØØ-Ø.Ø#ðñ ô ð ð ð ð ð ð ð ñô ð ð ð ð ð ð øøøøð%	øøøøõ6 ð oñ oð oØ˜FÐ"Ð"Õ'HÈÑ'SÔ'SÐ"Ý ™<œ<ˆLØ×Ò˜]¨DÑ1Ô1Ð1Ý�KŠKØ_Ø�˜ñô ð ð&Ý-Ý1ØØ$Ø!2Ø!2ð	ñ ô ð ð ð ð ð ð ð
 ñô ð ð ð ð ð ð øõ ð &ð &ð &Ý # I¡¤�å% iÑ0Ô0ðå+¨IÑ6Ô6ðõ & iÑ0Ô0ðð $ }Ð4Ð4Ø.°-Ð?Ð?àØ%�	Ø%������øøøøð&øøøõ �i‘.”.ˆð �gÐð CØ�c¥'¨&°*¸bÑ"AÔ"AÑBÔBÐBð 	ð Ð!Ø˜GÐ#Ð#Ø&¨'Ð1Ð1Ý.¨y¸,ÑGÔGð 2à"ð 2ð �JŠJ�| TÑ*Ô*Ð*Ø�JŠJÐ.°Ñ5Ô5Ð5ð&Ý-Ý1ØØØ!2Ø!2ð	ñ ô ð ð ð ð ð ð ð
 ñô ð ð ð ð ð ð øõ ð &ð &ð &õ *¨)Ñ4Ô4ð Õ8LÈYÑ8WÔ8Wð Õ[oÐpyÑ[zÔ[zð ØØ%�	�	�	�	�	�	øøøøð&øøøð  Ò'ð UÝ$ \Ð3SÑTÔTð 	õ % YÑ/Ô/ð 	*°Mð 	*Ý:Ø Ò(°v·z²zÀ'Ñ7JÔ7JðLñ Lô LˆLàð * °·
²
¸7Ñ0CÔ0CÒ CÐ CÝ—’ð@à�N˜F F§J¢J¨wÑ$7Ô$7¸ñô ð ð
 #/��w‘ð	*Ý1Ý5Ø"Ø"Ø%6Ø%6ð	ñ ô ð ð ð ð ð ð ð
  ñ!ô !ð !ð !ð !ð !ð !ð !øõ !ð *ð *ð *Ø )�I�I�I�I�I�Iøøøøð*øøøð
  Ò'ð UÝ$ \Ð3SÑTÔTð 	õ
 ˜iÑ(Ô(ð%	*àð%	*õ ;Ñ<Ô<ð%	*õ
 1OØ0Ð:°FØ!ØØ*Ø(Ø*Ø 8Ò+ð1ñ 1ô 1Ñ-Ð˜oð  Ð+Ý—’ØqØ�N˜Fñô ð ð #ð 6 ¸&¿*º*ÀWÑ:MÔ:MÒ'MÐ'MØ&5�F˜7‘Oð*Ý1Ý5Ø,Ø"Ø%6Ø%6ð	ñ ô ð ð ð ð ð ð ð
  ñ!ô !ð !ð !ð !ð !ð !ð !øõ !ð *ð *ð *å& yÑ1Ô1ðå,¨YÑ7Ô7ðõ 0°	Ñ:Ô:ðõ 0°	Ñ:Ô:ð	ð Ø )�I�I�I�I�I�Iøøøøð*øøøõ ˜)Ñ$Ô$ð 	¨ð 	Ý0NØ0Ð:°FØ!ØØ*Ø(Ø*Ø 8Ò+ð1ñ 1ô 1Ñ-Ð˜oð  Ð+Ý—’ÐjØ ˜N Fñ,ô ,ð ,à"ð 6 ¸&¿*º*ÀWÑ:MÔ:MÒ'MÐ'MØ&5�F˜7‘OÝ-Ý1Ø(ØØ!2Ø!2ð	ñ ô ð ð ð ð ð ð ð
 ñô ð ð ð ð ð ð õ !AØ˜|ñ!-ô !-Ðå˜9Ñ%Ô%ð 	Ø)Ð1CÐCÐCØ&ð Då,Ð-BÑCÔCð Ø(Õ,CÐDUÑ,VÔ,VÒVÐVõ *Ð*;Ñ<Ô<Ð<Ý—’Ø_Ø�N˜FÐ$9ñô ð õ 8ØØ&;Ø#1Ð#@°[Ø&7Ø%5Ø&7Ø +Ø%Ø +Ø)ØØ&7Ø)=Ø%5ðñ ô ð ð ð ð ð ð ð ð ð ð ð ð õ$ 3Ð3DÀfÐ[gÐhÑhÔhˆÝ�g f¨i¸Ñ<Ô<ÐBÀÑCÔCˆØñ -	�n¨YÑ7Ô7ð -	Õ;LÈYÑ;WÔ;Wð -	Õ[oÐpyÑ[zÔ[zñ -	Ø$ˆLõ $ IÑ.Ô.ð -Õ7HÈÑ7SÔ7Sð -ð-Ý1Ý5Ø"Ø"Ø%6Ø%6ð	ñ ô ð ð ð ð ð ð ð
  ñ!ô !ð !ð !ð !ð !ð !ð !øõ !ð -ð -ð -Ý*¨9Ñ5Ô5ð Õ9JÈ9Ñ9UÔ9Uð ÕYmÐnwÑYxÔYxð ØØ#,�L�L�L�L�L�Løøøøð-øøøõ & m°\ÐRaÐbÑbÔbð Ý—’Ø^Ø�N˜F Mµ4¸Ñ3EÔ3EÔ3Nñô ð ðÝ!;Ø!Ø*;Ø'5Ø*;Ø)9Ø*;Ø$/Ø!)Ø$/Ø#-Ø#Ø*;Ø-AØ)9ð"ñ "ô "ð ð ð ð ð ð ð ð ð ð ð ð øõ  !ð ð ð Ý)¨*Ñ5Ô5ð ½È
Ñ9SÔ9Sð Ý3°JÑ?Ô?ðå.¨}¸jÑIÔIÐIØ$.˜	˜	àð "˜	˜	˜	˜	øøøøð	øøøõ ˜9Ñ%Ô%ð 9Ý  Ñ+Ô+ð9å# IÑ.Ô.ð9õ $ IÑ.Ô.ð9õ ,¨IÑ6Ô6ð	9õ
 .¨iÑ8Ô8ð 	ð $Ð'9Ð9ˆå˜iÑ(Ô(ð 9Ý# IÑ.Ô.ð9å# IÑ.Ô.ð9õ ,¨IÑ6Ô6ð9õ .¨iÑ8Ô8ð 	ð ñ Y	 ð Y	Ð+<ñ Y	Ý˜iÑ(Ô(ð ,Ø%��Ý" 9Ñ-Ô-ð ,Ø(�Ý(Ý.Ð/@À&ÑIÔIÐ^ÐM^ñô ð ð õ & iÑ0Ô0ð ,Ø%��Ý-¨iÑ8Ô8ð ,Ø8��Ý/°	Ñ:Ô:ð ,Ø4��à+�Ý�KŠKÐNØ˜ ¨Ð0AÀ9ñNô Nð Nð Ð"AÐAÐA��À{ð  ð -=Ñ)ˆI�x Øð :Ý0NØÐ+Ð5¨v¸fØ!4ð16ñ 16ô 16Ñ-�	˜8 Xð Ð$Ý4LØÐ/Ð9°6À&ð5Jñ 5Jô 5JÑ1�I˜x¨àÐ$Ý4IØ)¨4¸ð5@ñ 5@ô 5@Ñ1�I˜x¨øõ 1OØÐ+Ð5¨v¸fØ!4ð16ñ 16ô 16Ñ-�	˜8 Xð Ð$Ý4RØ)¨4¸Ø%8ð5:ñ 5:ô 5:Ñ1�I˜x¨ð Ð$å+;Ø˜x˜~¨2¸$À(Ò:Jð,ñ ,ô ,Ñ(�˜.õ !?Ø˜nÐ8°¸(Ø¨Ø +¸
ØÐ3DØ)=Ø%5ð!7ñ !7ô !7ð 7ð 7ð 7ð 7ð 7ð 7�ð Ð&Ø"�N�N�N�N�N�Nõ 1FØ% tÐ4Oð1Qñ 1Qô 1QÑ-�	˜8 XàÐ(Ý/?Ø! 8 >¨r¸dÀhÒ>Nð0ñ 0ô 0Ñ,�H˜nõ %CØ  .Ð"<°H¸hØ!¨HØ$/¸JØ#Ð7HØ-AØ)9ð%;ñ %;ô %;ð ;ð ;ð ;ð ;ð ;ð ;�Gð Ð*Ø&˜˜˜˜˜˜å�NŠNðOà�˜ Ð(9ñô ð õ   	Ñ*Ô*ð 	,ð,Ý-¨fÑ5Ô5Ð5Ð5øÝð ,ð ,ð ,Ý—’Ð^Ø&*ð ñ ,ô ,ð ,ð ,ð ,ð,øøøð 	øøøøð_oøøøs   ËAO6 Ì-*M Í
O3Í"BO.Ï(O3Ï)O6 Ï.O3Ï3O6 Ï6v4ÐAv/Ñ&RÑ=v4Ò
S ÒA	SÓv/ÓS Ó A>v/Õ&VÖv4Ö
WÖ0W
×v/×
W×B$v/Ù4&Z Úv4Ú 
Z6Ú*Z1Ú,v/Ú1Z6Ú6Bv/Ý&]9Ý3v4Ý9
_Þ?_ßv/ß_ßBv/á$v4á*Bv/äv4äBv/æ&f8æ2v4æ8
g<ç0g7ç2v/ç7g<ç<Av/é"i+é%v4é+
k é5Aj;ê6v/ê;k ë Hv/óv4ó%Av/ô=v4õ.v/õ2vöv/ö&v+ö(v/ö*v+ö+v/ö/v4)TNNri   r   )rB   rE  rË  )NrY  )Nrj  Nr3  )rj  N)rB   rj  r  )	NFFNNNNFN)NFNNNNFN)NNNNN)NNNr§  NNNN(p  r-   Ú
contextlibr­   rB  r¿  rO  r{  r¢  Úloggingr�  r*  rŒ   r  r·  Úpathlibr   Útypesr   Útypingr   r   r   r   r	   r
   r   r   rÌ  r   r   r   r   r   r   rÿ  r7  r   r   Úagent.credential_poolr/   rÀ  r0   r1   rH   r2   r¹  r3   rA  r4   r5   r6   r7   r8   Ú	getLoggerr*   rX   r¤   r9   r:   r;   r<   rI   rM   rW   rn   r[   ra   Úlocalrp   r£   rc   rq   r|   Úcontextmanagerr�   rƒ   r†   rˆ   r˜   r™   r›   r�   ro  rµ   r¹   rÉ   r¥  r÷   rû   rK  rü   r  r  r  r  r  r  r  r'  r  r  r(  r  Úcompiler%  r,  rJ  rT  rP  rX  Ú	frozensetrZ  r\  r`  ra  r€  rƒ  rw  rŠ  rŽ  r�  Ú
hermes_clir�  Ú_HERMES_VERSIONÚ_AI_GATEWAY_HEADERSrú  r’  r•  r–  ÚNOUS_EXTRA_BODYr—  ra  rz  r  rQ  r  r2  r©  r°  r¶  r¼  rÀ  rÈ  rÎ  rÐ  r…  rØ  rÝ  rß  rp  rx  r~  r�  r�  r–  rÅ  rÈ  rÍ  rÑ  rÔ  rØ  râ  rå  rì  rð  ró  r÷  r  r  r  r"  r*  r3  r<  rB  rW  rX  r[  rc  rf  rp  rr  r~  rƒ  r‡  rö   rŒ  r�  r›  r�  r¢  r£  r¤  r¥  r¦  r§  r¨  Ú
ContextVarrª  r¬  rÂ  rÆ  rÉ  rÒ  rå  ré  rð  rò  r�   r  rù  rG  ÚTokenr  r  r	  r  r  r  r)  r-  r8  r>  rA  rM  rM  Ú_AUTO_PROVIDER_LABELSr÷  rX  r  r\  re  r^  r_  ra  rc  rl  rL  ro  rq  rK   r‹  r’  r™  rž  r©  r«  r¯  r�  r²  r·  r¿  rÁ  rÉ  rÏ  rÑ  rÙ  r  râ  rä  rì  r÷  rE  r  r  r"  r&  r/  r2  r4  r6  r9  r>  rB  rG  rV  rX  ri  r|  r  r‚  r�  r”  rˆ  r‡  rŸ  r¡  r­  r±  rµ  r  rÈ  rI  rw  r  r  r(  r  r!  r$  r&  r*  r  r;  r>  rÖ  rÕ  r‹  rA  rS  r\  rb  rj  rq  ry  r×  r~  r‚  r„  r‡  r‰  r  r–  r  Ú_DEFAULT_AUX_TIMEOUTr²  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.  r/  r1  r7  r=  rE  rD  rG  rc  re  rl  ri  rh  r·  rº  r¹  r   r   r   ú<module>rÕ     s·>  ðð,ð ,ð ,ð\ Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ð ð ØÐÐÐÐÐà$(Ð �8˜D”>Ð (Ð (Ñ (ð˜$ð ð ð ð ð,ð ,ð ,ð ,ð ,ñ ,ô ,ð ,ð& 
ˆ‰Œ€à +Ð +Ð +Ð +Ð +Ð +Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ð Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dð  Dà	ˆÔ	˜8Ñ	$Ô	$€ð &) S¡U¤UÐ ˜sÐ *Ð *Ñ *Ø'* s¡u¤uÐ  Ð ,Ð ,Ñ ,ð ),¨©¬Ð   #Ð -Ð -Ñ -Ø&) c¡e¤eÐ  Ð +Ð +Ñ +ð (¨3¤-ð °Cð ð ð ð ð8 !&Ð ð ð$#ð $#ð $#Ø�sŒmð$#ð ð$#ð 
ˆ#ˆsˆ(„^ð	$#ð $#ð $#ð $#ðL@ cð @°Sð @ÀCð @ÈCð @ð @ð @ð @ð4 ,˜IœOÑ-Ô-Ð ðKð Kð Kð Kð K Mñ Kô Kð Kð E $ð Eð Eð Eð Eð¨ð ð ð ð ð& ÔàØØñCð CØðCð Cð Cñ ÔðCð: 8¨H°R¸°WÔ,=Ô#>ð ð ð ð ð°¸"¸c¸'Ô1Bð Àtð ð ð ð ð0ð 0ð 0ð 0ð 0ñ 0ô 0ð 0ðR  �	”Ñ!Ô!€ñ@ð @ð @ð @ð<˜dð <ð <ð <ð <ð Ôð"ð "ñ Ôð"ðB%Ø˜˜S #˜XœÐ'¨Ð,Ô-ðB%à��c�ŒNðB%ð 	ðB%ð B%ð B%ð B%ðJ˜#ð ¨3ð °4ð ð ð ð ð 3ð ð ð ð ð Ð ð"Øˆhð"à�Xð"ð ˜ð"ð ˆEð	"ð
 ˆEð"ð ˆEð"ð 
ˆ5ð"ð ˆEð"ð ˆEð"ð ˆUð"ð ˆMð"ð �ð"ð Ðð"ð Ð#ð"ð �ð"ð  �ð!"ð" �xð#"ð "ð$ �hð%"ð& 
ˆ8ð'"ð( �\ð)"ð* �,ð+"ð, ˆkð-"ð. �;ð/"ð0 ˆið1"ð2 �ið3"ð4 �Ið5"ð6 �Yð7"ð8 ˜-ð9"ð: ˜ð;"ð< Ð!ð="ð> Ð"ð?"ð@ Ð'ðA"ðB Ð%ðC"ð "Ð ðJ9 h¨s¤mð 9¸ð 9ð 9ð 9ð 9ð2 "˜6™8œ8Ð �&Ð #Ð #Ñ #ð6˜( 3œ-ð 6¨Dð 6ð 6ð 6ð 6ð, h¨s¤mð ,¸ð ,ð ,ð ,ð ,ð$ +/Ð 'ð %)Ð !ñð  H¨S¤Mð ¸XÀc¼]ð ÐVZð ð ð ð ñ:)ð )˜8 Cœ=ð )°H¸S´Mð )ÈTð )ð )ð )ð )ð" #ñð Ø�CŒ=ðà�sŒmðð  ðð ð ð ð0 #ñ#ð )-ð	#ð #ð #Ø�CŒ=ð#à�sŒmð#ð "&ð	#ð
 ˆe„_ð#ð #ð #ð #ðlÐ �eð ð ñ ð2Ð �Uð ð ñ ð �B”JÐ1Ñ2Ô2Ð ð ð ¨ð ð ð ð ð,2¨#ð 2°#ð 2ð 2ð 2ð 2ðl JOð (Fð (Fð (F¨Sð (FÀ$ð (FÐSVð (Fð (Fð (Fð (Fð` !ØØ*ØØ-Ø1Ø,Ø)Ø$ØØ)Ø)Ø%ð9ð 9Ð % t¨C°¨H¤~ð ð ñ ð, 0UÐ ˜d 3¨ 8œnÐ TÐ TÑ Tð  )˜yÐ*<Ð)=Ñ>Ô>Ð �9Ð >Ð >Ñ >ð Øð+ð +Ð ˜˜c 3˜hœð ð ñ ð¨sð °xÀ´}ð ð ð ð ðH (1 yØØð2ñ (ô (Ð ˜9ð ð ñ ð <ØØ7ðð Ð ð �YÐ9Ð9Ð9Ñ:Ô:Ð ð&¨°©ð &¸À¹ð &ð &ð &ð &ñR1ð 1  t¡ð 1°tð 1ð 1ð 1ð 1ðn ˜}ðÐ ð
 s¨T¡zð °dð ð ð ð ð 6Ð 5Ð 5Ð 5Ð 5Ð 5ð <ØØ2 Ð2Ð2ðð Ð ð DÐ CÐ CÐ CÐ CÐ Cð)˜$ð )ð )ð )ð )ð #Ð"Ñ$Ô$€ð  Ð �4Ð Ð Ñ ð .Ð Ø'€ØDÐ Ø9Ð Ø!�/Ñ#Ô# kÑ1€ð >Ð ð$¨Cð $°D¸¸c¸´Nð $ð $ð $ð $ðN #ð ¨#ð ð ð ð ð< ð ¨¨t°X¸c´]Ð/BÔ)Cð ð ð ð ð ˜sð  x°¤}ð ð ð ð ð." ð "¨ð "ð "ð "ð "ñ.ð . #ð .°ð .¸cð .ð .ð .ð .ð6 (˜iØð)ñ ô Ð ð
	 sð 	¨tð 	ð 	ð 	ð 	ð 3ð ð ð ð ð+˜#ð + #ð +ð +ð +ð +ð:i
ð i
ð i
ð i
ð i
ñ i
ô i
ð i
ðX#ð #ð #ð #ð #ñ #ô #ð #ð"ð "ð "ð "ð "ñ "ô "ð "ð$Dð Dð Dð Dð Dñ Dô Dð Dð#ð #ð #ð #ð #ñ #ô #ð #ð
6ð 6ð 6ð 6ð 6ñ 6ô 6ð 6ð&e
ð e
ð e
ð e
ð e
ñ e
ô e
ð e
ðP#ð #ð #ð #ð #ñ #ô #ð #ð
ð ð ð ð ñ ô ð ð$Dð Dð Dð Dð Dñ Dô Dð Dð#ð #ð #ð #ð #ñ #ô #ð #ð
	6ð 	6ð 	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð,
ð ,
ð ,
ð ,
ð ,
ñ ,
ô ,
ð ,
ð^#ð #ð #ð #ð #ñ #ô #ð #ð
ð ð ð ð ñ ô ð ðDð Dð Dð Dð Dñ Dô Dð Dð#ð #ð #ð #ð #ñ #ô #ð #ð
.ð .ð .ð .ð .ñ .ô .ð .ð°#ð ¸$ð ð ð ð ðD #ñQð QØðQàðQð ðQð ð	Qð
 �sŒmðQð 	ðQð Qð Qð Qðh#˜ $œð #ð #ð #ð #ðL˜Dð  Sð ð ð ð ð(H˜ð Hð Hð Hð Hð
 =Bð 0ð 0ð 0°Tð 0ÀhÈuÐUXÐZ]ÐU]ÌÔF_ð 0ð 0ð 0ð 0ðf 8=ð ð ð °ð ÀÈ%ÐPSÐUXÐPXÌ/ÔAZð ð ð ð ð<4 H¨U°3¸°8¬_Ô$=ð 4ð 4ð 4ð 4ðn( (¨3¤-ð (ð (ð (ð (ðVo 5¨°&Ô)9¸8ÀC¼=Ð)HÔ#Ið oð oð oð oðj ˜™œÐ �3Ð Ð Ñ ð@˜( 3œ-ð @¨Dð @ð @ð @ð @ð
( %¨¨c¨	Ô"2ð (ð (ð (ð (ð$ ð ¨ð ð ð ð ñ#Að #A cð #A¸ð #AÈÈhÐW]ÔN^Ð`hÐilÔ`mÐNmÔHnð #Að #Að #Að #AðL
4¨#ð 
4ð 
4ð 
4ð 
4ñQð Q�dð Q u¨X°fÔ-=¸xÈ¼}Ð-LÔ'Mð Qð Qð Qð Qðh&Øð&Ø"*¨3¤-ð&àˆc„]ð&ð &ð &ð &ðR˜#ð ð ð ð ð<˜Sð ð ð ð ð2˜Cð ð ð ð ð:˜Sð ð ð ð ð*#¨°#¬ð #¸5ÀÈ#ÄÐPXÐY\ÔP]ÐA]Ô;^ð #ð #ð #ð #ðL #ð ð ð ð ð$ °#ð  ¸#ð  ð  ð  ð  ð. !Ð ˜Ð  Ð  Ñ  ØÐ �SÐ Ñ Ñ Ø Ð ˜Ð  Ñ  Ñ  ØÐ �sÐ Ñ Ñ Ø Ð ˜Ð  Ñ  Ñ  Ø!Ð ˜Ð !Ñ !Ñ !à€KÔÑ3¸TÑBÑBÔBð �{Ô-¨h°t¸CÀ¸H´~Ô.FÔGð ñ ñ ð
 €KÔÑ1¸4Ñ@Ñ@Ô@ð ˜Ô/°¸¸cÀ3¸h¼Ô0HÔIð ñ ñ ñ
ð ð ñ4ð ð ð4>Ø�D‰jð>à�‰:ð>ð �D‰jð>ð 
ð	>ñ >ð >ð >ð   Øñð ð à�D‰jðð �D‰jðð ˆ3��T˜#˜s˜(”^Ð#Ô$ tÑ+ð	ñ ð ð ð2  ØØ59ñð ñ Øðà��c�ŒNðð �D‰jð	ð
 �D‰jñð �d˜3 ˜8”nÐ% sÐ*Ô+¨dÑ2ðð 	ðñ ð ð ð@  ØØ59ñð ñ Øðà��c�ŒNðð �D‰jð	ð
 �D‰jñð �d˜3 ˜8”nÐ% sÐ*Ô+¨dÑ2ðð 	ðñ ð ð ð:  Øñð ñ Øðà��c�ŒNðð �D‰jð	ð
 �D‰jðð 	ðñ ð ð ñ, 2JÐ ˜u S©# XœÐ IÑ IÑ IØ*˜IœNÑ,Ô,Ð ð3˜h t¨C°¨H¤~Ô6ð 3ñ 3ð 3ð 3ñ.	˜sð 	 sð 	ñ 	ð 	ð 	ð  !ØØØØØñ0ð 0ð 0Øð0àñ0ð ð	0ð
 ð0ð ð0ð ñ0ð ñ0ð ð0ð Ôð0ñ 0ð 0ð 0ñf	˜kÔ/ð 	°Dð 	ñ 	ð 	ð 	ð Ôñ+ h¨t°C¸°H¬~Ô&>ð +ñ +ð +ñ Ôð+ñAñ Að Að Að /8  x°¤}°h¸s´mÀXÈcÄ]Ð'RÔ!Sð /8ñ /8ð /8ð /8ðd #ð ñ ð ð ñ
ñ ð ð ð: ð ¨ð ñ ð ð ð$0#˜e H¨S¤M°8¸C´=Ð$@ÔAð 0#ñ 0#ð 0#ð 0#ðf; sð ;¨u°X¸c´]ÀHÈSÄMÐ5QÔ/Rð ;ñ ;ð ;ð ;ð@&;˜sð &; u¨X°c¬]¸HÀS¼MÐ-IÔ'Jð &;ñ &;ð &;ð &;ðV  Ø&*Ø'+Ø"ñoð oð oà�CŒ=ðoð ˜s”mñoð   ”}ð	oð
 �sŒmðoð ˆ8�CŒ=˜( 3œ-Ð'Ô(ðoñ oð oð oñd<cð <c Sð <c°E¸(À3¼-ÈÐRUÌÐ:VÔ4Wð <cñ <cð <cð <cñ@ $ÙÙ*Ù!*ñ	ð Ð ñ ]Ð Ø3Ñ6MÑMÐ ñ ¨(°4¸¸S¸´>Ô*Bð  ÀtÈCÐQTÈHÄ~ð  ñ  ð  ð  ðF˜T %œ[ð ñ ð ð ñR !Ð Ø)+Ð �d˜3 ˜:Ô&Ð +Ñ +Ñ +Ø-/Ð ˜$˜s E˜zÔ*Ð /Ñ /Ñ /ñ ÙÙÙ"Ù"Ùñ ð  Ð ð	2 Sð 	2¨Sð 	2ñ 	2ð 	2ð 	2ñð  sñ °¸%´ð ÈDð ñ ð ð ñ& #ð ¨$ð ñ ð ð ñ 
ñ 
˜sñ 
¨(°3¬-ð 
À4ð 
ñ 
ð 
ð 
ñ %ñ %ð %ð %ñ'˜9ð '¨ð 'ñ 'ð 'ð 'ðT	°Dð 	ñ 	ð 	ð 	ñ"˜ið "¨Dð "ñ "ð "ð "ñJ+˜9ð +¨ð +ñ +ð +ð +ñ*#˜ið #¨Dð #ñ #ð #ð #ñLN yð N°Tð Nñ Nð Nð Nñ& Ð ñ !$Ð ð* ð *ñ *ð *ð *ñ,˜	ð  dð ñ ð ð ñ$¨ñ ¸3ð À4ð ñ ð ð ñD?¨9ð ?¸ð ?ñ ?ð ?ð ?ñ% 9ð %°ð %ñ %ð %ð %ñP3 ið 3°Dð 3ñ 3ð 3ð 3ñl¨	ð °dð ñ ð ð ð&) Cð )¨Dð )ñ )ð )ñ )ñ ¨#ð  °$ð  ñ  ð  ñ  ðL .2ñ&ð &ð &Øñ&ð ˜4  S œ>Ô*ð&ð 	ð	&ñ &ð &ñ &ñ*˜Yð ¨4°°S°¬>ð ñ ð ñ ð .2ñ(ñ (Øñ(àñ(ð ˜4  S œ>Ô*ð(ð ˆc„]ð	(ñ (ð (ñ (ðV TVñ .ð .ð . Sñ .¨yñ .ÈSð .ÐZ^ð .ñ .ð .ñ .ðD /3ñ#Ið Iñ Ià
�3Œ-ñIð ñIð ˜S”Mñ	Ið
   ”}ñIð ˜s”mñIð   ”}ñIð ˜4  S œ>Ô*ñIð ˜#”ñIñ ñIð ˜%”ñIð ˜”ñIð ‘DŒ>ñIð ñIð ñIð  ˜t”nñ!Ið" ˜D  c œNÔ+ð#Ið$ 	ð%Iñ Ið Iñ Iðx /3ñ!Gð Gñ Gà
�3Œ-ñGð ñGð ˜S”Mñ	Gð
   ”}ñGð ˜s”mñGð   ”}ñGð ˜#”ñGñ ñGð ˜%”ñGð ˜”ñGð ‘DŒ>ñGð ñGð ñGð ˜t”nñGð  ˜D  c œNÔ+ð!Gð" 	ð#Gñ Gð Gñ GðTX¨Cð X°Dð Xñ Xð Xñ XñvØ ”}ñàðð 	ðñ ð ñ ñ26 ¨¤ñ 6¸ð 6ÀÈ$ÈsÐTWÈxÌ.ÔAYð 6ñ 6ð 6ñ 6ñ* (¨3¤-ñ ¸3ð À8ÈEÄ?ð ñ ð ñ ñ.I¨ð I°ð Iñ Ið Iñ Iðð ñ ð ñ ˜:ñ ô ñ ðEØðEàðEð �sŒmðEð �CŒ=ð	Eñ
 ðEñ Eð Eñ Eð0OØ��S�Œ>ñOàñOð �sŒmðOñ ð	Oñ Oð Oñ Oñ OØ
�3Œ-ñOàñOð �sŒmñOð ð	Oñ
 ðOñ Oð Oñ Oñ.Ùñà‘DŒ>ññ &ð	ð
 ‰4‘ˆ:Ôðñ ð ñ ñ&zØñzà�sŒmñzð ñzð
 �3Œ-ñzñ ñzð ˜%”ñzð ˜”ñzð ‘DŒ>ñzð ñzð ñzð ˜t”nðzð ˆc„]ðzñ zð zñ zñzdØñdà�sŒmñdð ñdð
 �3Œ-ñdñ ñdð ˜%”ñdð ˜”ñdð ‘DŒ>ñdð ñdð ñdð ˜t”nðdð ˆc„]ðdñ dð dñ dðR Ø!ñ0ñ 0Øñ0à
ñ0ð ð0ð ˆ8�CŒ=˜( 3œ-¨Ð,Ô-ð	0ñ 0ð 0ñ 0ðj ØØ"&ñ	S7ñ S7ØñS7à
ñS7ð ñS7ð ˜3”-ð	S7ð
 ˆ8�CŒ=˜( 3œ-¨Ð,Ô-ðS7ñ S7ð S7ñ S7ñR x°¤}ð ¸À#¼ð ñ ð ñ ð0 Øñ	'ð 'Øð'àð'ð ð'ð ð	'ð
 ˆc„]ð'ñ 'ð 'ñ 'ðZ Ø"&ñ	tñ tØ
ñtàñtð ñtð ˜3”-ð	tð
 ˆ8�CŒ=˜( 3œ-¨Ð,Ô-ðtñ tð tñ tñnØ
�3Œ-ñàðð ˆ8�CŒ=˜( 3œ-¨Ð,Ô-ðñ ð ñ ð,	( 4¨¨S¨¤>ð 	(°h¸s´mð 	(ñ 	(ð 	(ñ 	(ð" 4¨¨S¨¤>ð "°e¸HÀS¼MÈ8ÐTWÌ=Ð<XÔ6Yð "ñ "ð "ñ "ð8 ØñPñ PØ
�3Œ-ñPàñPð ðPð ˆ8�CŒ=˜( 3œ-¨Ð,Ô-ð	Pñ Pð Pñ Pðj  Ø"Ø!ñ	ð Øðà�CŒ=ðð �sŒmðð �cŒ]ð	ð
 ˆc„]ðñ ð ñ ð( .2ØñDñ DØ˜4  S œ>Ô*ñDà
�3Œ-ðDð ˆ8�FÔ˜X cœ]¨CÐ/Ô0ðDñ Dð Dñ DðP .2Øññ Ø˜4  S œ>Ô*ñà
�3Œ-ðð ˆ8�FÔ˜X cœ]Ð*Ô+ðñ ð ñ ñ

 Cð 

°3ð 

¸4ð 

ñ 

ð 

ñ 

ñ¨3ð ¸#ð À#ð ñ ð ñ ñ&K.ð K.¨ñ K.¸ð K.ñ K.ð K.ñ K.ñ\	¨(°3¬-ð 	À3ð 	È8ÐTWÌ=ð 	ñ 	ð 	ñ 	ð ØØØ!Ø ØØ-1ØØñnð nØðnàðnð ñnð ñ	nð
 ðnð ðnð ñnð ˜4  S œ>Ô*ñnð ñnð �3Œ-ðnð ˆ8�CŒ=˜( 3œ-Ð'Ô(ðnñ nð nñ nðh ñð .2ñð ñ Ø
ñð ˜4  S œ>Ô*ðð ˆ8�FÔ˜X cœ]Ð*Ô+ð	ñ ð ñ ñ2Ð`dñ ð ñ ¨#ñ ÀXÈdÐSVÐX[ÐS[ÌnÔE]ð ñ ð ñ ñ&Ñ ð¨#ð °h¸s´mð Èð ñ ð ñ ð>-¨°#¬ð -¸3ð -ñ -ð -ñ -ð  ñ&ð &Øð&à�CŒ=ð&ð ˆ8�CŒ=˜( 3œ-Ð'Ô(ð&ñ &ð &ñ &ðRC¨sð C°tð Cñ Cð Cñ Cð t¨C¤yð ñ ð ñ ð4 #Øño*ð #Ø!ØØ-1ño*ð o*ð o*Ø�sŒmðo*à�CŒ=ðo*ð �sŒmð	o*ð
 �cŒ]ðo*ð ño*ð ˜4  S œ>Ô*ðo*ð ˆ8�CŒ=˜( 3œ-¨°#¬Ð6Ô7ðo*ñ o*ð o*ñ o*ðd; $ð ;ñ ;ð ;ñ ;ð FJñ !ð !ñ ! cð !°X¸c´]ð !Èdð !ñ !ð !ñ !ð^ %'�ˆt�E˜5�LÔ!Ð &Ñ &Ñ &Ø#�Y”^Ñ%Ô%Ñ ÙÑ ð$ð $ñ $ð $ñ $ñ $ô $ñ $ñ,¨ñ °Cð ¸Cð ñ ð ñ ð #Ø!Ø"Ø-1ØØØñ!Gð !Gð !GØð!Gð ð!Gð �sŒmð	!Gð
 �cŒ]ð!Gð �sŒmñ!Gð ˜4  S œ>Ô*ñ!Gð ñ!Gð �3Œ-ð!Gð �CŒ=ð!Gð ð!Gñ !Gð !Gñ !GðH lpñ Gð Gñ G Eñ G°3ñ GÀxÐPSÄ}ñ GÐehð GÐtxð Gñ Gð Gñ Gð #Ø!Ø"Ø-1Øñ*ð *ñ *àð*ð �CŒ=ð*ð ð	*ð
 �sŒmð*ð �cŒ]ð*ð �sŒmñ*ð ˜4  S œ>Ô*ñ*ð ð*ð ˆ8�CŒ=˜( 3œ-Ð'Ô(ð*ñ *ð *ñ *ñZñ ð ñ ñB Sð ¨Tð ñ ð ñ ñ(
 ð 
¨ð 
ñ 
ð 
ñ 
ññ ð ñ ñ#ñ #ð #ñ #ñ& #ð ¨$ð ñ ð ñ ñ:°ñ :ÀXÈcÄ]ð :ÐW[ð :ñ :ð :ñ :ñ#˜#ð # h¨s¤mñ #ÀXÈcÄ]ð #ÐW_Ð`cÔWdð #ñ #ð #ñ #ð ØØØØØ-1ØØñu*ð u*Øðu*àðu*ð ðu*ð ð	u*ð
 ðu*ð ñu*ð ˜4  S œ>Ô*ñu*ð ñu*ð �3Œ-ðu*ð ˆ8�CŒ=˜( 3œ-Ð'Ô(ðu*ñ u*ð u*ñ u*ñJ Ñ)ð-Ñ ˜4  S œ>ð ñ ñ ð ØØØ"Ø!ñnAñ nAØ
ðnAàðnAð ðnAð �sŒmð	nAð
 �cŒ]ðnAð ˆ3�˜”˜x¨œ}¨h°s¬m¸XÀc¼]ÐJÔKðnAñ nAð nAñ nAñb Ñ ñ &+Ñ "ñ) Sð )¨T°#°s°(¬^ð )ñ )ð )ñ )ñX 3Gð ñ ˜Cñ ¨%ð È5ð ñ ð ñ ñ ñ ¨x¸¬ð À5ð ñ ð ñ ñ"+˜sð + t¨C°¨H¤~ð +ñ +ð +ñ +ðn KMÑ �d˜3  c¨9Õ+EÐ&EÔ FÐFÔGÐ LÑ LÑ LØ@BÑ �t˜E # s (œO¨U°3¸°8¬_Ð<Ô=Ð BÑ BÑ BØ�	”Ñ Ô �ñ( H¨S¤Mð (°h¸s´mð (ñ (ð (ñ (ñ  h¨s¤mð ¸ÀÕA[Ô8\ð ñ ð ñ ñ x°¤}ð ñ ð ñ ñ(&ñ &ð &ñ &ð (˜iÐ(RÑ(RÐ(RÑSÔSÑ ð	%¨Cð 	%¸3ð 	%À4ð 	%ñ 	%ð 	%ñ 	%ñQ±$ð Q¹4ð Qñ Qð Qñ Qðhñ ð Ñ ñ
¨cð 
°dð 
ñ 
ð 
ñ 
ð" $(Ø $Ø ØØ!%Ø'+Ø"Øñbð bØðbàñbñ ñbð ˜%”ñ	bð
 ˜”ñbð ‘DŒ>ñbð ñbð ˜”ñbð ˜t”nðbð �sŒmñbð �3Œ-ðbð 
ðbñ bð bñ bðN Ø"Ø"ñ	2ñ 2Øñ2à
�3Œ-ð2ð �sŒmð2ð �sŒmð	2ð
 	ð2ñ 2ð 2ñ 2ñj 6?ñ ð ñ ¨sð À4ð ñ ð ñ ñ 
*°Sð 
*¸Tð 
*ñ 
*ð 
*ñ 
*ñ
ñ 
ð 
ñ 
ñ
¨Cð 
°H¸S´Mð 
ñ 
ð 
ñ 
ñ8$¨ð $°ð $ñ $ð $ñ $ñ.ð �#ñ ˜Cñ ¨#ð ¸ð ñ ð ñ ñ, %*Ñ !Ù!$Ñ ñ9°¸%´ð 9ÀUð 9ñ 9ð 9ñ 9ñ	 sð 	¨tð 	ñ 	ð 	ñ 	ñ
 ið 
°Dð 
ñ 
ð 
ñ 
ð!¨ð !°xÀ´}ð !Èð !ñ !ð !ñ !ðN ñ?ð
 ñ?ð ?ñ ?Øð?à��c�ŒNñ?ð �3Œ-ñ?ð
 ð?ð 	ð?ñ ?ð ?ñ ?ðJ Ø%)ñ	ð ñ Øðð ñð ˜E”?ð	ð
 	ðñ ð ñ ð:`
ð `
ñ `
ð `
ñ `
ñ `
ô `
ñ `
ðL Ø%)ñ	ð ñ Øðð ñð ˜E”?ð	ð
 	ðñ ð ñ ð> ññ Øðà��c�ŒNñð �3Œ-ðð 	ð	ñ ð ñ ð0 àñ3 ð ØØØØ-1à#'ØØØØØ'+Ø.2ØØØñ%3 ð 3 ñ 3 Ø
ð3 ð ð3 ð ð	3 ð
 ð3 ð ñ3 ð ˜4  S œ>Ô*ñ3 ñ ñ3 ð ˜%”ñ3 ð ñ3 ñ ñ3 ð ñ3 ð ñ3 ð ˜t”nñ3 ð ˜D  c œNÔ+ð3 ð  ñ!3 ð" ñ#3 ð$ ð%3 ð& 	ð'3 ñ 3 ð 3 ñ Ôñ3 ñl Øñ Ø%Õ6ð ñ  ð  ñ  ð  ñ\ð ØØØØ-1à#'ØØØØØ'+Ø.2ØØØñ%\ð \ñ \Ø
ð\ð ð\ð ð	\ð
 ð\ð ñ\ð ˜4  S œ>Ô*ñ\ñ ñ\ð ˜%”ñ\ð ñ\ñ ñ\ð ñ\ð ñ\ð ˜t”nñ\ð ˜D  c œNÔ+ð\ð  ñ!\ð" ñ#\ð$ ð%\ð& 	ð'\ñ \ð \ñ \ð~5¨cð 5ñ 5ð 5ñ 5ðp àñ& ð ØØØØ-1à#'ØØØØØ'+ñ& ð & ñ & Ø
ð& ð ð& ð ð	& ð
 ð& ð ñ& ð ˜4  S œ>Ô*ñ& ñ ñ& ð ˜%”ñ& ð ñ& ñ ñ& ð ñ& ð ñ& ð ˜t”nð& ð 	ð& ñ & ð & ñ Ôñ& ðT ñuð ØØØØ-1à#'ØØØØØ'+ñuð uñ uØ
ðuð ðuð ð	uð
 ðuð ñuð ˜4  S œ>Ô*ñuñ ñuð ˜%”ñuð ñuñ ñuð ñuð ñuð ˜t”nðuð 	ðuñ uð uñ uð uð ur   