§
    ‰eîi:D ã                   ó²  — 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mZ ddlm	Z	 ddl
mZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ  ej         e!¦  «        Z"de#fd„Z$da%i dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d “d"d#“d$d#“d%d&“d&d'd'd'd'd(d(d)œ¥Z&d*ee#         d+e#fd,„Z' e(¦   «         Z)e(e*d-<   d.ee#         d+e+fd/„Z,	 dæd.ee#         d0ee#         d+d1fd2„Z-d3d4d5d6d5d7d7d8d9d:d;d<d=d>œZ.ee#e#f         e*d?<   d@dAdBœZ/ee#e#f         e*dC<   dDdEdFdGœZ0ddHl1m2Z3 dDdEdIe3› �dJœZ4dKdLgiZ5da6e+e*dM<   d<Z7d<Z8dNZ9dOZ: e¦   «         dPz  Z;dQZ<dRZ=dSe#d+ee#e#f         fdT„Z>d0e#d+e#fdU„Z?d*e#d+ee+ee         f         fdV„Z@dWed+e#fdX„ZAdçdWedZe#d+e#fd[„ZBd\ed+efd]„ZC G d^„ d_¦  «        ZD G d`„ da¦  «        ZE G db„ dc¦  «        ZF G dd„ de¦  «        ZG G df„ dg¦  «        ZH G dh„ di¦  «        ZI G dj„ dk¦  «        ZJ G dl„ dm¦  «        ZK G dn„ do¦  «        ZL G dp„ dq¦  «        ZM G dr„ ds¦  «        ZN G dt„ du¦  «        ZOd+eeP         fdv„ZQd*ePd+e#fdw„ZRd+e#fdx„ZSddyœdze+d+eeTe#e#f                  fd{„ZUd+ee#         fd|„ZVd+eee         ee#         f         fd}„ZWd+eee         ee#         f         fd~„ZXd+e#fd„ZYdèd€e+d+eee         ee#         f         fd�„ZZd+e#fd‚„Z[d+e#fdƒ„Z\d+eee#         ee#         ee#         f         fd„„Z]d+e#fd…„Z^déd†„Z_d0e#d+dfd‡„Z`d+eee         ee#         f         fdˆ„Zad+eee         ee#         f         fd‰„Zbd+eee         ee#         f         fdŠ„Zcd‹dŒd�dŽd�d�œZdd‘Zed’eee#ef                  d+ee#e#f         fd“„Zfd+eeT         fd”„Zgd•ehd+e+fd–„Zid•ehd+e+fd—„Zjd•ehd+e+fd˜„Zkd•ehd™e#d+e+fdš„Zld•ehd+e+fd›„Zmd*e#d+dfdœ„Znd*e#d+e+fd�„Zo	 	 dêdŸe#d e#d¡e#d+eee         ee#         e#f         fd¢„Zpdæd’eee#ef                  d+eee         ee#         f         fd£„Zqd.e#fd¤„Zrd¥ee#         d*e#d+ee#         fd¦„Zs	 	 	 	 	 	 	 dëd*e#d.e#d§e+d¨e+d©e#dªe#d«e#d’eee#ef                  d+eee         ee#         f         fd¬„Zt	 dçdd­œd e#d’eee#ef                  d+eee         ee#         f         fd®„Zudçdd­œd e#d’eee#ef                  fd¯„Zvd°Zwd*ee#         d+e#fd±„Zxd*e#d+eee         ee#         f         fd²„Zyd*e#d+e+fd³„Zzd+ee#         fd´„Z{	 	 dìddddµœd*ee#         d.ee#         d0ee#         d¶ee#         d§e+d+eee#         ee         ee#         f         fd·„Z|d+ePfd¸„Z}d¹e~d+ePfdº„Zi Z€eeTeTf         e*d»<    ej�        ¦   «         Z‚d¼Zƒddddd½œd*e#d§e+d0ee#         d¶ee#         d«ee#         d’eee#ef                  d+eTfd¾„Z„dd¿œdÀeTdÁedÂee#         dÃed+df
dÄ„Z…ddddd½œdÅe#d.ee#         d§e+d0ee#         d¶ee#         d«ee#         d’eee#ef                  d+eee         ee#         f         fdÆ„Z†dé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e#         d+ee#         fdÍ„ZŒ	 	 	 	 	 	 díd*e#d.e#d§e+d0e#d¶e#d«e#d’eee#ef                  d+eee         ee#         f         fdÎ„Z�	 	 	 	 	 dîd e#d*e#d.e#d0e#d¶e#d+ee#ee#         ee#         ee#         ee#         f         fdÏ„ZŽdÐZ�d e#d+ee#ef         fdÑ„Z�e�fd e#dÒe‘d+e‘fdÓ„Z’d e#d+ee#ef         fdÔ„Z“ e”dÕd#h¦  «        Z•d*e#d0e#d+e+fdÖ„Z–d×e—d+e—fdØ„Z˜	 	 	 	 	 	 dïd*e#d.e#d×e—dÙee‘         dÚee~         dÛee—         dÜe‘dÝeeP         d0ee#         d+ePfdÞ„Z™dædßed e#d+efdà„Zš	 dædddddddddddáœ
d e#d*e#d.e#d0e#d¶e#d’eee#ef                  d×e—dÙe‘dÚe~dÛe—dÜe‘dÝePd+efdâ„Z›d+e#fdã„Zœ	 dæddddddddddäœ	d e#d*e#d.e#d0e#d¶e#d×e—dÙe‘dÚe~dÛe—dÜe‘dÝePd+efdå„Z�dS )ða,  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. OpenRouter  (OPENROUTER_API_KEY)
  2. Nous Portal (~/.hermes/auth.json active provider)
  3. Custom endpoint (config.yaml model.base_url + OPENAI_API_KEY)
  4. Codex OAuth (Responses API via chatgpt.com with gpt-5.3-codex,
     wrapped to look like a chat.completions client)
  5. Native Anthropic
  6. Direct API-key providers (z.ai/GLM, Kimi/Moonshot, MiniMax, MiniMax-CN)
  7. None

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. Codex OAuth (gpt-5.3-codex supports vision via Responses API)
  5. Native Anthropic
  6. Custom endpoint (for local vision models: Qwen-VL, LLaVA, Pixtral, etc.)
  7. None

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ÚDictÚListÚOptionalÚTuple)ÚurlparseÚparse_qsÚ
urlunparse)ÚOpenAI)Ú	load_pool)Úget_hermes_home)ÚOPENROUTER_BASE_URL)Úbase_url_host_matchesÚbase_url_hostnameÚnormalize_proxy_env_varsÚ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).Ú )Úqueryc                 ó&   — i | ]\  }}||d          “ŒS ©r   © )Ú.0ÚkÚvs      ú8/home/div/.hermes/hermes-agent/agent/auxiliary_client.pyú
<dictcomp>z-_extract_url_query_params.<locals>.<dictcomp>>   s"   € ÐEÐEÐE™d˜a �!�Q�q”TÐEÐEÐEó    N)r
   r   r   Ú_replacer   Úitems)r   ÚparsedÚcleanÚparamss       r   Ú_extract_url_query_paramsr&   9   so   € å�c‰]Œ]€FØ„|ð Ý˜6Ÿ?š?°˜?Ñ4Ô4Ñ5Ô5ˆØEÐE¥h¨v¬|Ñ&<Ô&<×&BÒ&BÑ&DÔ&DÐEÑEÔEˆØ�fˆ}ÐØ�ˆ9Ðr    FÚgoogleÚgeminizgoogle-geminizgoogle-ai-studiozx-aiÚxaizx.aiÚgrokÚglmÚzaizz-aizz.aiÚzhipuÚkimiúkimi-codingÚmoonshotzkimi-cnúkimi-coding-cnzmoonshot-cnzminimax-chinaú
minimax-cnÚ
minimax_cnÚclaudeÚ	anthropicÚcopilotúcopilot-acp)zclaude-codeÚgithubzgithub-copilotzgithub-modelzgithub-modelszgithub-copilot-acpzcopilot-acp-agentÚproviderÚreturnc                 ó´  — | 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Úmainr   )r<   rC   r   )ÚstripÚlowerÚ
startswithÚsplitÚ_read_main_providerÚ_PROVIDER_ALIASESÚget)r9   Ú
normalizedÚsuffixÚ	main_provs       r   Ú_normalize_aux_providerrN   b   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.r   ú/r?   éÿÿÿÿzkimi-r.   )rD   rE   ÚrsplitrF   )rP   Úbares     r   Ú_is_kimi_modelrV   ~   sS   € àˆK�R×ÒÑ Ô ×&Ò&Ñ(Ô(×/Ò/°°QÑ7Ô7¸Ô;€DØ�?Š?˜7Ñ#Ô#Ð5 t¨v¢~Ð5r    Úbase_urlzOptional[float] | objectc                 óh   — t          | ¦  «        r"t                               d| ¦  «         t          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)N)rV   ÚloggerÚdebugrO   )rP   rW   s     r   Ú_fixed_temperature_for_modelr[   „   s5   € õ �eÑÔð  Ý�ŠÐNÐPUÑVÔVÐVÝÐØˆ4r    zgemini-3-flash-previewzglm-4.5-flashzkimi-k2-turbo-previewzstep-3.5-flashzMiniMax-M2.7úclaude-haiku-4-5-20251001zgoogle/gemini-3-flashzgemini-3-flashzglm-5zgoogle/gemini-3-flash-previewznemotron-3-nano:30b)r(   r,   r/   Ústepfunr1   Úminimaxr2   r5   z
ai-gatewayzopencode-zenzopencode-goÚkilocodezollama-cloudÚ_API_KEY_PROVIDER_AUX_MODELSz	mimo-v2.5zglm-5v-turbo)Úxiaomir,   Ú_PROVIDER_VISION_MODELSz%https://hermes-agent.nousresearch.comzHermes Agentzproductivity,cli-agent)úHTTP-RefererzX-OpenRouter-TitlezX-OpenRouter-Categories)Ú__version__zHermesAgent/)rc   zX-Titleú
User-AgentÚtagsúproduct=hermes-agentÚauxiliary_is_nousz)https://inference-api.nousresearch.com/v1zhttps://api.anthropic.comz	auth.jsonzgpt-5.2-codexz%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)re   Ú
originatorr   Nú.é   r?   Ú=é   zhttps://api.openai.com/authÚchatgpt_account_idzChatGPT-Account-ID)Ú
isinstanceÚstrrD   Úbase64rG   ÚlenÚjsonÚloadsÚurlsafe_b64decoderJ   Ú	Exception)ri   Úheadersrt   ÚpartsÚpayload_b64ÚclaimsÚacct_ids          r   Ú_codex_cloudflare_headersr   Ú   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¦  «        r9|dt	          d¦  «         …         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.
    r   rR   ú
/anthropicNz/v1u,   Auxiliary client: rewrote base URL %s â†’ %s)rs   rD   ÚrstripÚendswithru   rY   rZ   )rW   r   Ú	rewrittens      r   Ú_to_openai_base_urlr…     s…   € õ ˆhˆn˜"Ñ
Ô
×
#Ò
#Ñ
%Ô
%×
,Ò
,¨SÑ
1Ô
1€CØ
‡|‚|�LÑ!Ô!ð ØÐ,�3˜|Ñ,Ô,Ð,Ð,Ô-°Ñ5ˆ	Ý�ŠÐCÀSÈ)ÑTÔTÐTØÐØ€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   ry   rY   rZ   Úhas_credentialsÚselect)r9   ÚpoolÚexcs      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&Úentryc                 ó”   — | €dS t          | dd ¦  «        pt          | dd¦  «        }t          |pd¦  «                             ¦   «         S )Nr   Úruntime_api_keyri   )Úgetattrrs   rD   )rŒ   Úkeys     r   Ú_pool_runtime_api_keyr‘   "  sN   € Ø€}Øˆrõ �%Ð*¨DÑ
1Ô
1Ð
WµW¸UÀNÐTVÑ5WÔ5W€CÝˆsˆy�b‰>Œ>×ÒÑ!Ô!Ð!r    r   Úfallbackc                 óH  — | €6t          |pd¦  «                             ¦   «                              d¦  «        S t          | dd ¦  «        p#t          | dd ¦  «        pt          | dd ¦  «        p|}t          |pd¦  «                             ¦   «                              d¦  «        S )Nr   rR   Úruntime_base_urlÚinference_base_urlrW   )rs   rD   r‚   r�   )rŒ   r’   r   s      r   Ú_pool_runtime_base_urlr–   +  s©   € Ø€}Ý�8�>˜rÑ"Ô"×(Ò(Ñ*Ô*×1Ò1°#Ñ6Ô6Ð6õ 	�Ð)¨4Ñ0Ô0ð 	Ý�5Ð.°Ñ5Ô5ð	å�5˜* dÑ+Ô+ð	ð ð	 õ ˆsˆy�b‰>Œ>×ÒÑ!Ô!×(Ò(¨Ñ-Ô-Ð-r    Úcontentc                 ó8  — t          | t          ¦  «        r| S t          | t          ¦  «        s| rt          | ¦  «        ndS g }| D �]R}t          |t          ¦  «        sŒ|                     dd¦  «        }|dk    r-|                     d|                     dd¦  «        dœ¦  «         Œb|dk    rŸ|                     di ¦  «        }t          |t          ¦  «        r|                     dd¦  «        nt          |¦  «        }d|d	œ}t          |t          ¦  «        r|                     d
¦  «        nd}|r||d
<   |                     |¦  «         �Œ|dv r|                     |¦  «         �Œ"|                     dd¦  «        }|r|                     d|dœ¦  «         �ŒT|pdS )aÜ  Convert chat.completions content to Responses API format.

    chat.completions uses:
      {"type": "text", "text": "..."}
      {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}

    Responses API uses:
      {"type": "input_text", "text": "..."}
      {"type": "input_image", "image_url": "data:image/png;base64,..."}

    If content is a plain string, it's returned as-is (the Responses API
    accepts strings directly for text-only messages).
    r   ÚtypeÚtextÚ
input_text©r™   rš   Ú	image_urlr   Úinput_image)r™   r�   ÚdetailN)r›   rž   )rr   rs   ÚlistÚdictrJ   Úappend)	r—   Ú	convertedÚpartÚptypeÚ
image_datar   rŒ   rŸ   rš   s	            r   Ú_convert_content_for_responsesr§   ?  sÈ  € õ �'�3ÑÔð ØˆÝ�g�tÑ$Ô$ð /Ø&Ð.�s�7‰|Œ|ˆ|¨BÐ.à&(€IØð Gñ GˆÝ˜$¥Ñ%Ô%ð 	ØØ—’˜ Ñ$Ô$ˆØ�FŠ?ˆ?Ø×Ò l¸D¿HºHÀVÈRÑ<PÔ<PÐQÐQÑRÔRÐRÐRØ�kÒ!Ð!àŸš +¨rÑ2Ô2ˆJÝ/9¸*ÅdÑ/KÔ/KÐ`�*—.’. ¨Ñ+Ô+Ð+ÕQTÐU_ÑQ`ÔQ`ˆCØ-:ÈÐ$MÐ$MˆEå1;¸JÍÑ1MÔ1MÐW�Z—^’^ HÑ-Ô-Ð-ÐSWˆFØð )Ø"(��h‘Ø×Ò˜UÑ#Ô#Ð#Ñ#ØÐ3Ð3Ð3à×Ò˜TÑ"Ô"Ð"Ñ"ð —8’8˜F BÑ'Ô'ˆDØð GØ× Ò ¨,ÀÐ!EÐ!EÑFÔFÐFùàˆ?˜Ðr    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_clientrP   c                 ó"   — || _         || _        d S ©N)Ú_clientÚ_model)Úselfrª   rP   s      r   Ú__init__z!_CodexCompletionsAdapter.__init__s  s   € Ø"ˆŒØˆŒˆˆr    r:   c                 óÊ	  — |                      dg ¦  «        }|                      d| j        ¦  «        }d}g }|D ]�}|                      dd¦  «        }|                      d¦  «        pd}|dk    r't          |t          ¦  «        r|nt          |¦  «        }Œ\|                     |t          |¦  «        d	œ¦  «         Œ‚|||pddd	œgd
dœ}	|                      d¦  «        }
|
r•g }|
D ]‰}t          |t          ¦  «        r|                      di ¦  «        ni }|                      d¦  «        }|sŒG|                     d||                      dd¦  «        |                      di ¦  «        dœ¦  «         ŒŠ|r||	d<   g }g }d }	 g }g }d
} | j        j        j	        d:i |	¤Ž5 }|D ]u}t          |dd¦  «        }|dk    r)t          |dd ¦  «        }|�|                     |¦  «         ŒBd|v r)t          |dd¦  «        }|r|                     |¦  «         Œod|v rd}Œv|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   t          |dd ¦  «        }t          |t          ¦  «        r¹|s·|r=t          |¦  «        |_        t                               dt!          |¦  «        ¦  «         nx|rv|std                     |¦  «        }t%          dddt%          d|¬¦  «        g¬ ¦  «        g|_        t                               d!t!          |¦  «        t!          |¦  «        ¦  «         d;d"t&          d#t          d$t&          d%t&          fd&„}t          |dg ¦  «        D ]±} ||d¦  «        }|dk    rB ||d¦  «        pg D ]2}  || d¦  «        }!|!d'v r |                      || d(d¦  «        ¦  «         Œ3ŒV|dk    rU|                     t%           ||d)d¦  «        dt%           ||dd¦  «         ||d*d+¦  «        ¬,¦  «        ¬-¦  «        ¦  «         Œ²t          |d.d ¦  «        }"|"r?t%          t          |"d/d0¦  «        t          |"d1d0¦  «        t          |"d2d0¦  «        ¬3¦  «        }n.# t(          $ r!}#t                               d4|#¦  «         ‚ d }#~#ww xY wd                     |¦  «                             ¦   «         pd }t%          d||pd ¬5¦  «        }$t%          d0|$|sd6nd7¬8¦  «        }%t%          |%g||¬9¦  «        S )<NÚmessagesrP   zYou are a helpful assistant.ÚroleÚuserr—   r   Úsystem)r³   r—   F)rP   ÚinstructionsÚinputÚstoreÚtoolsÚfunctionÚnameÚdescriptionÚ
parameters)r™   r»   r¼   r½   r™   zresponse.output_item.doneÚitemzoutput_text.deltaÚdeltaÚfunction_callTÚoutputz>Codex auxiliary: backfilled %d output items from stream eventsÚmessageÚ	assistantÚ	completedÚoutput_textrœ   )r™   r³   Ústatusr—   z6Codex auxiliary: synthesized from %d deltas (%d chars)Úobjr�   Údefaultr:   c                 óŠ   — t          | |d ¦  «        }|€+t          | t          ¦  «        r|                      ||¦  «        }|�|n|S r¬   )r�   rr   r¡   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Å   rš   rš   Úcall_idÚ	argumentsz{})r»   rÍ   )Úidr™   rº   ÚusageÚinput_tokensr   Úoutput_tokensÚtotal_tokens©Úprompt_tokensÚcompletion_tokensrÒ   z-Codex auxiliary Responses API call failed: %s)r³   r—   Ú
tool_callsÚstoprÖ   ©ÚindexrÂ   Úfinish_reason©ÚchoicesrP   rÏ   r   r¬   )rJ   r®   rr   rs   r¢   r§   r¡   r­   Ú	responsesÚstreamr�   Úget_final_responser    rÁ   rY   rZ   ru   Újoinr   r   ry   rD   )&r¯   Úkwargsr²   rP   r¶   Ú
input_msgsÚmsgr³   r—   Úresp_kwargsr¹   r£   ÚtÚfnr»   Ú
text_partsÚtool_calls_rawrÏ   Úcollected_output_itemsÚcollected_text_deltasÚhas_function_callsrÞ   Ú_eventÚ_etypeÚ_doneÚ_deltaÚfinalÚ_outputÚ	assembledrË   r¾   Ú	item_typer¤   r¥   Ú
resp_usagerŠ   rÂ   Úchoices&                                         r   Úcreatez_CodexCompletionsAdapter.createw  s’  € Ø—:’:˜j¨"Ñ-Ô-ˆØ—
’
˜7 D¤KÑ0Ô0ˆð
 6ˆØ+-ˆ
Øð 		ð 		ˆCØ—7’7˜6 6Ñ*Ô*ˆDØ—g’g˜iÑ(Ô(Ð.¨BˆGØ�xÒÐÝ*4°W½cÑ*BÔ*BÐT˜w˜wÍÈGÉÌ��à×!Ò!Ø Ý=¸gÑFÔFð#ð #ñ ô ð ð ð Ø(ØÐD¨VÀÐ$CÐ$CÐ#DØð	'
ð '
ˆð —
’
˜7Ñ#Ô#ˆØð 	1ØˆIØð 
ð 
�Ý.8¸½DÑ.AÔ.AÐI�Q—U’U˜: rÑ*Ô*Ð*Àr�Ø—v’v˜f‘~”~�Øð ØØ× Ò Ø&Ø Ø#%§6¢6¨-¸Ñ#<Ô#<Ø"$§&¢&¨°rÑ":Ô":ð	"ð "ñ ô ð ð ð ð 1Ø'0�˜GÑ$ð !#ˆ
Ø$&ˆØˆðP	ð 13Ð"Ø/1Ð!Ø!&ÐØ.�”Ô'Ô.Ð=Ð=°Ð=Ð=ð 4ÀØ$ð 2ð 2�FÝ$ V¨V°RÑ8Ô8�FØÐ!<Ò<Ð<Ý '¨°¸Ñ =Ô =˜Ø Ð,Ø2×9Ò9¸%Ñ@Ô@Ð@øØ,°Ð6Ð6Ý!(¨°¸"Ñ!=Ô!=˜Ø!ð AØ1×8Ò8¸Ñ@Ô@Ð@øØ(¨FÐ2Ð2Ø-1Ð*øØ×1Ò1Ñ3Ô3�ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4õ  ˜e X¨tÑ4Ô4ˆGÝ˜'¥4Ñ(Ô(ð °ð Ø)ð Ý#'Ð(>Ñ#?Ô#?�E”LÝ—L’LØXÝÐ2Ñ3Ô3ñô ð ð ð +ð Ð3Eð ð !#§¢Ð(=Ñ >Ô >�IÝ$3Ø&¨[ÀÝ!0°mÈ)Ð!TÑ!TÔ!TÐ Uð%ñ %ô %ð $�E”Lõ —L’LØPÝÐ1Ñ2Ô2µC¸	±N´Nñô ð ð;ð ;�sð ;­ð ;µsð ;Åcð ;ð ;ð ;ð ;õ    x°Ñ4Ô4ð ð �Ø%˜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Ý&-¨j¸/È1Ñ&MÔ&MÝ!(¨°^ÀQÑ!GÔ!Gðñ ô �øøõ
 ð 	ð 	ð 	Ý�LŠLÐHÈ#ÑNÔNÐNØøøøøð	øøøð —'’'˜*Ñ%Ô%×+Ò+Ñ-Ô-Ð5°ˆõ "ØØØ%Ð-¨ð
ñ 
ô 
ˆõ
 !ØØØ(6ÐH˜&˜&¸Lð
ñ 
ô 
ˆõ
 Ø�HØØð
ñ 
ô 
ð 	
s>   Å:Q ÆBH0È$Q È0H4È4Q È7H4È8HQ Ñ
Q<ÑQ7Ñ7Q<N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rs   r°   r   rö   r   r    r   r©   r©   o  sb   € € € € € ð>ð >ð Fð °3ð ð ð ð ðX
 #ð X
ð X
ð X
ð X
ð X
ð X
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¯   rý   s     r   r°   z_CodexChatShim.__init__  ó   € Ø"ˆÔÐÐr    N)r÷   rø   rù   rú   r©   r°   r   r    r   rü   rü     s6   € € € € € ØHÐHð#Ð 8ð #ð #ð #ð #ð #ð #r    rü   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ª   rP   c                 óŒ   — || _         t          ||¦  «        }t          |¦  «        | _        |j        | _        |j        | _        d S r¬   )Ú_real_clientr©   rü   ÚchatÚapi_keyrW   )r¯   rª   rP   rý   s       r   r°   zCodexAuxiliaryClient.__init__   s@   € Ø'ˆÔÝ*¨;¸Ñ>Ô>ˆÝ" 7Ñ+Ô+ˆŒ	Ø"Ô*ˆŒØ#Ô,ˆŒˆˆr    c                 ó8   — | j                              ¦   «          d S r¬   )r  Úclose©r¯   s    r   r
  zCodexAuxiliaryClient.close'  s   € ØÔ×ÒÑ!Ô!Ð!Ð!Ð!r    N)r÷   rø   rù   rú   r   rs   r°   r
  r   r    r   r  r    sO   € € € € € ðð ð- Fð -°3ð -ð -ð -ð -ð"ð "ð "ð "ð "r    r  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   r°   z&_AsyncCodexCompletionsAdapter.__init__2  ó   € Ø!ˆŒ
ˆ
ˆ
r    r:   c              ‹   óJ   K  — dd l } |j        | j        j        fi |¤Žƒ d {V —†S ©Nr   ©ÚasyncioÚ	to_threadr  rö   ©r¯   rá   r  s      r   rö   z$_AsyncCodexCompletionsAdapter.create5  óA   è è € ØˆˆˆØ&�WÔ& t¤zÔ'8ÐCÐC¸FÐCÐCÐCÐCÐCÐCÐCÐCÐCr    N)r÷   rø   rù   rú   r©   r°   r   rö   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 )Ú_AsyncCodexChatShimrý   c                 ó   — || _         d S r¬   rÿ   r  s     r   r°   z_AsyncCodexChatShim.__init__;  r  r    N)r÷   rø   rù   r  r°   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_wrapperr  c                 ó”   — |j         j        }t          |¦  «        }t          |¦  «        | _         |j        | _        |j        | _        d S r¬   )r  r   r  r  r  rW   ©r¯   r   r  Úasync_adapters       r   r°   z"AsyncCodexAuxiliaryClient.__init__B  sA   € Ø#Ô(Ô4ˆÝ5°lÑCÔCˆÝ'¨Ñ6Ô6ˆŒ	Ø#Ô+ˆŒØ$Ô-ˆŒˆˆr    N)r   r  )r÷   rø   rù   rú   r°   r   r    r   r  r  ?  s.   € € € € € ØRÐRð.ð .ð .ð .ð .ð .r    r  c                   ó4   — e Zd ZdZd
dededefd„Zdefd„Zd	S )Ú_AnthropicCompletionsAdapterz<OpenAI-client-compatible adapter for Anthropic Messages API.Frª   rP   Úis_oauthc                 ó0   — || _         || _        || _        d S r¬   )r­   r®   Ú	_is_oauth)r¯   rª   rP   r&  s       r   r°   z%_AnthropicCompletionsAdapter.__init__M  s   € Ø"ˆŒØˆŒØ!ˆŒˆˆr    r:   c           	      óæ  — ddl m} ddlm} |                     dg ¦  «        }|                     d| j        ¦  «        }|                     d¦  «        }|                     d¦  «        }|                     d¦  «        p|                     d	¦  «        pd
}|                     d¦  «        }	d }
t          |t          ¦  «        r|}
n€t          |t          ¦  «        rkt          |                     dd¦  «        ¦  «         	                    ¦   «         }|dk    r*|                     di ¦  «                             d¦  «        }
n|dv r|}
 |||||d |
| j
        ¬¦  «        }|	�ddl m}  ||¦  «        s|	|d<    | j        j        j        di |¤Ž} |d¦  «        }|                     || j
        ¬¦  «        }t!          |j        |j        |j        ¬¦  «        }|j        }d }t+          |d¦  «        rd|j        r]t/          |j        dd¦  «        pd}t/          |j        dd¦  «        pd}t/          |j        dd¦  «        p||z   }t!          |||¬¦  «        }t!          d||¬¦  «        }t!          |g||¬¦  «        S )Nr   )Úbuild_anthropic_kwargs)Úget_transportr²   rP   r¹   Útool_choiceÚ
max_tokensÚmax_completion_tokensiÐ  Útemperaturer™   r   rº   r»   >   r<   ÚnoneÚrequired)rP   r²   r¹   r-  Úreasoning_configr,  r&  ©Ú_forbids_sampling_paramsÚanthropic_messages)Ústrip_tool_prefix)r—   rÖ   Ú	reasoningrÏ   rÐ   rÑ   rÒ   rÓ   rØ   rÛ   r   )Úagent.anthropic_adapterr*  Úagent.transportsr+  rJ   r®   rr   rs   r¡   rE   r(  r4  r­   r²   rö   Únormalize_responser   r—   rÖ   r7  rÚ   ÚhasattrrÏ   r�   )r¯   rá   r*  r+  r²   rP   r¹   r,  r-  r/  Únormalized_tool_choiceÚchoice_typeÚanthropic_kwargsr4  ÚresponseÚ
_transportÚ_nrÚassistant_messagerÚ   rÏ   rÔ   rÕ   rÒ   rõ   s                           r   rö   z#_AnthropicCompletionsAdapter.createR  sû  € ØBÐBÐBÐBÐBÐBØ2Ð2Ð2Ð2Ð2Ð2à—:’:˜j¨"Ñ-Ô-ˆØ—
’
˜7 D¤KÑ0Ô0ˆØ—
’
˜7Ñ#Ô#ˆØ—j’j Ñ/Ô/ˆØ—Z’Z Ñ-Ô-Ð\°·²Ð<SÑ1TÔ1TÐ\ÐX\ˆ
Ø—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Ð&à1Ð1ØØØØ!Ø!Ø.Ø”^ð
ñ 
ô 
Ðð Ð"ØHÐHÐHÐHÐHÐHØ+Ð+¨EÑ2Ô2ð >Ø2=Ð  Ñ/à/�4”<Ô(Ô/ÐCÐCÐ2BÐCÐCˆØ"�]Ð#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    N©F)	r÷   rø   rù   rú   r   rs   Úboolr°   rö   r   r    r   r%  r%  J  sj   € € € € € ØFÐFð"ð " Cð "°ð "¸tð "ð "ð "ð "ð
I
 #ð I
ð I
ð I
ð I
ð I
ð I
r    r%  c                   ó   — e Zd Zdefd„ZdS )Ú_AnthropicChatShimrý   c                 ó   — || _         d S r¬   rÿ   r  s     r   r°   z_AnthropicChatShim.__init__Ÿ  r  r    N)r÷   rø   rù   r%  r°   r   r    r   rF  rF  ž  s0   € € € € € ð#Ð <ð #ð #ð #ð #ð #ð #r    rF  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ª   rP   r  rW   r&  c                 ó|   — || _         t          |||¬¦  «        }t          |¦  «        | _        || _        || _        d S )N©r&  )r  r%  rF  r  r  rW   )r¯   rª   rP   r  rW   r&  rý   s          r   r°   z!AnthropicAuxiliaryClient.__init__¦  s?   € Ø'ˆÔÝ.¨{¸EÈHÐUÑUÔUˆÝ& wÑ/Ô/ˆŒ	ØˆŒØ ˆŒˆˆr    c                 óh   — t          | j        dd ¦  «        }t          |¦  «        r |¦   «          d S d S )Nr
  )r�   r  Úcallable)r¯   Úclose_fns     r   r
  zAnthropicAuxiliaryClient.close­  s?   € Ý˜4Ô,¨g°tÑ<Ô<ˆÝ�HÑÔð 	ØˆH‰JŒJˆJˆJˆJð	ð 	r    NrC  )	r÷   rø   rù   rú   r   rs   rD  r°   r
  r   r    r   rI  rI  £  sf   € € € € € ØJÐJð!ð ! Cð !°ð !¸cð !ÈSð !Ð\`ð !ð !ð !ð !ðð ð ð ð r    rI  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   r°   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   rö   z(_AsyncAnthropicCompletionsAdapter.create·  r  r    N)r÷   rø   rù   r%  r°   r   rö   r   r    r   rP  rP  ³  sR   € € € € € ð"Ð%Að "ð "ð "ð "ðD¨ð Dð Dð Dð Dð Dð Dr    rP  c                   ó   — e Zd Zdefd„ZdS )Ú_AsyncAnthropicChatShimrý   c                 ó   — || _         d S r¬   rÿ   r  s     r   r°   z _AsyncAnthropicChatShim.__init__½  r  r    N)r÷   rø   rù   rP  r°   r   r    r   rT  rT  ¼  s0   € € € € € ð#Ð Að #ð #ð #ð #ð #ð #r    rT  c                   ó   — e Zd Zdd„ZdS )ÚAsyncAnthropicAuxiliaryClientr   rI  c                 ó”   — |j         j        }t          |¦  «        }t          |¦  «        | _         |j        | _        |j        | _        d S r¬   )r  r   rP  rT  r  rW   r"  s       r   r°   z&AsyncAnthropicAuxiliaryClient.__init__Â  sA   € Ø#Ô(Ô4ˆÝ9¸,ÑGÔGˆÝ+¨MÑ:Ô:ˆŒ	Ø#Ô+ˆŒØ$Ô-ˆŒˆˆr    N)r   rI  )r÷   rø   rù   r°   r   r    r   rW  rW  Á  s(   € € € € € ð.ð .ð .ð .ð .ð .r    rW  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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.
    ÚnousNri   r   Úrefresh_tokenÚ	agent_keyÚportal_base_urlÚ	client_idÚscopeÚ
token_typeÚBearerr‰   )	ri   r[  r\  r•   r]  r^  r_  r`  ÚsourceÚactive_providerÚ	providerszCould not read Nous auth: %s)r‹   r�   r–   Ú_NOUS_DEFAULT_BASE_URLÚ_AUTH_JSON_PATHÚis_filerv   rw   Ú	read_textrJ   ry   rY   rZ   )Úpool_presentrŒ   Údatar9   rŠ   s        r   Ú_read_nous_authrk  Ê  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Ñ5Ô5Ñ6Ô6ˆØ�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                 óX   — |                       d¦  «        p|                       dd¦  «        S )z9Extract the best API key from a Nous provider state dict.r\  ri   r   ©rJ   ©r9   s    r   Ú_nous_api_keyro  ð  s'   € à�<Š<˜Ñ$Ô$ÐH¨¯ª°^ÀRÑ(HÔ(HÐHr    c                  ó6   — t          j        dt          ¦  «        S )z8Resolve the Nous inference base URL from env or default.ÚNOUS_INFERENCE_BASE_URL)ÚosÚgetenvre  r   r    r   Ú_nous_base_urlrt  õ  s   € åŒ9Ð.Õ0FÑGÔGÐGr    ©Úforce_refreshrv  c                 óB  — 	 ddl m}  |t          dt          t	          j        dd¦  «        ¦  «        ¦  «        t          t	          j        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 )a2  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 + mint flow instead of
    relying only on whatever raw tokens happen to be sitting in auth.json
    or the credential pool.
    r   ©Ú resolve_nous_runtime_credentialsé<   ÚHERMES_NOUS_MIN_KEY_TTL_SECONDSÚ1800ÚHERMES_NOUS_TIMEOUT_SECONDSÚ15©Úmin_key_ttl_secondsÚtimeout_secondsÚ
force_mintz7Auxiliary Nous runtime credential resolution failed: %sNr  r   rW   rR   )Úhermes_cli.authry  ÚmaxÚintrr  rs  Úfloatry   rY   rZ   rs   rJ   rD   r‚   )rv  ry  ÚcredsrŠ   r  rW   s         r   Ú_resolve_nous_runtime_apirˆ  ú  s7  € ð
ØDÐDÐDÐDÐDÐDà0Ð0Ý # B­­B¬IÐ6WÐY_Ñ,`Ô,`Ñ(aÔ(aÑ bÔ bÝ!¥"¤)Ð,IÈ4Ñ"PÔ"PÑQÔQØ$ð
ñ 
ô 
ˆˆøõ
 ð ð ð Ý�ŠÐ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   ‚A"A% Á%
BÁ/BÂB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.
    rB   r   )Ú_read_codex_tokensÚtokensri   Nrm   r?   ro   rp   Úexpz-Codex access token expired (exp=%s), skippingz2Could not read Codex auth for auxiliary client: %s)r‹   r‘   rƒ  rŠ  rJ   rr   rs   rD   rt   rG   ru   rv   rw   rx   ÚtimerY   rZ   ry   )ri  rŒ   ÚtokenrŠ  rj  r‹  ri   rt   Úpayloadr}   rŒ  rŠ   s               r   Ú_read_codex_access_tokenr�    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Œ|dk    r4	 ddl m}  |d¦  «        sŒ+n# t          $ r Y nw xY wt          ¦   «         c S t          |¦  «        \  }}|rót          |¦  «        }|sŒrt          t          ||j        ¦  «        p|j        ¦  «        }t                               |¦  «        }	|	€Œ¸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<   t1          d||dœ|¤Ž|	fc S  ||¦  «        }t3          |                     dd¦  «        ¦  «                             ¦   «         }|s�Œ—t          t3          |                     dd¦  «        ¦  «                             ¦   «                              d¦  «        p|j        ¦  «        }t                               |¦  «        }	|	€�Œ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<   t1          d||dœ|¤Ž|	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_REGISTRYÚ$resolve_api_key_provider_credentialsz7Could not import PROVIDER_REGISTRY for API-key fallback©NNr  r5   )Ú!is_provider_explicitly_configuredNz'Auxiliary text client: %s (%s) via poolr(   ©ÚGeminiNativeClientÚis_native_gemini_base_url©r  rW   úapi.kimi.comre   úclaude-code/0.1.0Údefault_headersúapi.githubcopilot.com©Úcopilot_default_headersr   rW   rR   zAuxiliary text client: %s (%s)r   )rƒ  r’  r“  ÚImportErrorrY   rZ   r"   Ú	auth_typer•  Ú_try_anthropicr‹   r‘   r…   r–   r•   r`   rJ   r»   Úagent.gemini_native_adapterr—  r˜  r   Úhermes_cli.modelsrŸ  r   rs   rD   r‚   )r’  r“  Úprovider_idÚpconfigr•  ri  rŒ   r  rW   rP   r—  r˜  ÚextrarŸ  r‡  s                  r   Ú_resolve_api_key_providerr¨  @  s  € ðØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[øÝð ð ð Ý�ŠÐNÑOÔOÐOØˆzˆzðøøøð !2× 7Ò 7Ñ 9Ô 9ð BJñ BJÑˆ�WØÔ 	Ò)Ð)ØØ˜+Ò%Ð%ðØMÐMÐMÐMÐMÐMØ8Ð8¸ÑEÔEð Øðøåð ð ð Ø�ðøøøå!Ñ#Ô#Ð#Ð#Ð#å0°Ñ=Ô=Ñˆ�eØð 	NÝ+¨EÑ2Ô2ˆGØð Øå*Ý& u¨gÔ.HÑIÔIÐgÈWÔMgñô ˆHõ 1×4Ò4°[ÑAÔAˆ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¨~Ñ>Ô>ð EØ,8Ð:MÐ+N�Ð'Ñ(Ð(Ý& xÐ1HÑIÔIð EØEÐEÐEÐEÐEÐEà+BÐ+BÑ+DÔ+D�Ð'Ñ(ÝÐF '°HÐFÐFÀÐFÐFÈÐMÐMÐMÐMà4Ð4°[ÑAÔAˆÝ�e—i’i 	¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7ˆØð 	Ùå&Ý�—	’	˜* bÑ)Ô)Ñ*Ô*×0Ò0Ñ2Ô2×9Ò9¸#Ñ>Ô>Ð\À'ÔB\ñ
ô 
ˆõ -×0Ò0°Ñ=Ô=ˆØˆ=ÙÝ�ŠÐ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ØˆÝ  ¨>Ñ:Ô:ð 	AØ(4Ð6IÐ'JˆEÐ#Ñ$Ð$Ý" 8Ð-DÑEÔEð 	AØAÐAÐAÐAÐAÐAà'>Ð'>Ñ'@Ô'@ˆEÐ#Ñ$ÝÐB˜g°ÐBÐB¸EÐBÐBÀEÐIÐIÐIÐIàˆ:s   ‚ ‹$3²3Á#A6Á6
BÂBc                  ó¢  — t          d¦  «        \  } }| rgt          |¦  «        }|sdS t          |t          ¦  «        pt          }t                               d¦  «         t          ||t          ¬¦  «        t          fS t          j
        d¦  «        }|sdS t                               d¦  «         t          |t          t          ¬¦  «        t          fS )NÚ
openrouterr”  z%Auxiliary client: OpenRouter via pool©r  rW   rœ  ÚOPENROUTER_API_KEYzAuxiliary client: OpenRouter)r‹   r‘   r–   r   rY   rZ   r   Ú_OR_HEADERSÚ_OPENROUTER_MODELrr  rs  )ri  rŒ   Úor_keyrW   s       r   Ú_try_openrouterr°  —  sã   € Ý,¨\Ñ:Ô:Ñ€L�%Øð GÝ& uÑ-Ô-ˆØð 	Ø�:Ý)¨%Õ1DÑEÔEÐ\ÕI\ˆÝ�ŠÐ<Ñ=Ô=Ð=Ý˜f¨xÝ'2ð4ñ 4ô 4Ý5FðGð 	Gõ ŒYÐ+Ñ,Ô,€FØð ØˆzÝ
‡L‚LÐ/Ñ0Ô0Ð0Ý˜&Õ+>Ý#.ð0ñ 0ô 0Ý1BðCð Cr    c                  óÆ   — t          d¦  «        \  } }| r|€dS t          |¦  «        sdS t          t          j        d¦  «        p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 keyr¬  r   zOPENROUTER_API_KEY not setz&no usable OpenRouter credentials found)r‹   r‘   rs   rr  rs  rD   )ri  rŒ   s     r   Ú _describe_openrouter_unavailabler²  ª  sw   € å,¨\Ñ:Ô:Ñ€L�%Øð SØˆ=ØdÐdÝ$ UÑ+Ô+ð 	SØRÐRÝ�rŒyÐ-Ñ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ð ,Ø+Ð+Ø3Ð3r    Úvisionc                 ó"  — 	 ddl m}  |¦   «         }|�#|dk    rt                               d|¦  «         dS n# t          $ r Y nw xY wt          ¦   «         }t          d¬¦  «        }|€|sdS 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|�|\  }	}
nVt          |pi ¦  «        }	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”  Fru  TzAuxiliary client: Nous Portal)Úget_nous_recommended_aux_model©r³  z/Auxiliary/%s: using Portal-recommended model %sr³  rš   z:Auxiliary/%s: no Portal recommendation, falling back to %szGAuxiliary/%s: recommended-models lookup failed (%s); falling back to %sr•   rR   r™  )Úagent.nous_rate_guardrµ  rY   rZ   ry   rk  rˆ  rh   Ú_NOUS_MODELr¤  r¶  ro  rs   rJ   rt  r‚   r   )r³  rµ  Ú
_remainingrZ  ÚruntimerP   r¶  ÚrecommendedrŠ   r  rW   s              r   Ú	_try_nousr½  ·  s<  € ð
ØCÐCÐCÐCÐCÐCØ.Ð.Ñ0Ô0ˆ
ØÐ! j°1¢n nÝ�LŠLØQØñô ð ð �:øøÝð ð ð Øˆðøøøõ ÑÔ€DÝ'°eÐ<Ñ<Ô<€GØ€˜t€ØˆzàÐÝ
‡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°ñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøð ÐØ#Ñˆ��å  
¨Ñ+Ô+ˆÝ˜˜
 ×'Ò'Ð(<Ñ=Ô=ÐQÅÑAQÔAQÑRÔR×YÒYÐZ]Ñ^Ô^ˆåØØð	
ñ 	
ô 	
ð 	ðð s(   ‚38 ¸
AÁAÂAC( Ã(
DÃ2!DÄDc                  óÀ  — 	 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 )zÂ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.
    r   ©Úload_configrP   rÈ   r   )Úhermes_cli.configrÀ  rJ   rr   rs   rD   r¡   ry   )rÀ  ÚcfgÚ	model_cfgrÈ   s       r   Ú_read_main_modelrÄ  ù  sä   € ðØ1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆØ—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ%Ô%ð 	%¨)¯/ª/Ñ*;Ô*;ð 	%Ø—?’?Ñ$Ô$Ð$Ý�i¥Ñ&Ô&ð 	'Ø—m’m I¨rÑ2Ô2ˆGÝ˜'¥3Ñ'Ô'ð '¨G¯MªM©O¬Oð 'Ø—}’}‘”Ð&øøÝð ð ð Øˆðøøøàˆ2s   ‚A"C Á%A'C Ã
CÃCc                  ój  — 	 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 )z¢Read the user's configured main provider from config.yaml.

    Returns the lowercase provider id (e.g. "alibaba", "openrouter") or ""
    if not configured.
    r   r¿  rP   r9   r   )	rÁ  rÀ  rJ   rr   r¡   rs   rD   rE   ry   )rÀ  rÂ  rÃ  r9   s       r   rH   rH     sÁ   € ð	Ø1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆØ—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ&Ô&ð 	0Ø —}’} Z°Ñ4Ô4ˆHÝ˜(¥CÑ(Ô(ð 0¨X¯^ª^Ñ-=Ô-=ð 0Ø—~’~Ñ'Ô'×-Ò-Ñ/Ô/Ð/øøÝð ð ð Øˆðøøøàˆ2s   ‚BB# Â#
B0Â/B0c                  ó°  — 	 ddl m}   | d¬¦  «        }n4# t          $ r'}t                               d|¦  «         d}Y d}~nd}~ww xY wt          |t          ¦  «        sjt          j        dd¦  «         	                    ¦   «          
                    d	¦  «        }t          j        d
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_URLr   rR   ÚOPENAI_API_KEY©NNN)rW   r  rW   r  Úapi_modeúopenrouter.aiúno-key-required)Úhermes_cli.runtime_providerrÇ  ry   rY   rZ   rr   r¡   rr  rs  rD   r‚   rJ   rs   r   )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ˆÝ”YÐ/°Ñ4Ô4×:Ò:Ñ<Ô<ˆ
Øð 	$Ø#Ð#à#Ø!ð
ð 
ˆð
 —+’+˜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 )Nr   )rÕ  )rÒ  Ú_s     r   Ú_current_custom_base_urlrØ  S  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_proxyr   z%Malformed proxy environment variable ro   z1. Fix or unset your proxy settings and try again.N)Úurllib.parser
   r   rs   rr  ÚenvironrJ   rD   ÚschemeÚportÚ
ValueErrorÚRuntimeError)r
   r�   Úvaluer#   r×  rŠ   s         r   Ú_validate_proxy_env_urlsrè  X  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Ú  r   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
   rs   rD   rF   rã  rä  rå  ræ  )rW   r
   Ú	candidater#   r×  rŠ   s         r   Ú_validate_base_urlrí  u  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 }|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œ|¤Ž|fS )Nrn   r”  úgpt-4o-miniz3Auxiliary client: custom endpoint (%s, api_mode=%s)Úchat_completionsÚdefault_queryÚcodex_responsesr™  r5  r   ©Úbuild_anthropic_clientu|   Custom endpoint declares api_mode=anthropic_messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire.FrK  r   )rÕ  ru   rE   rF   Ú_CODEX_AUX_BASE_URLrÄ  rY   rZ   r&   r   r  r8  rô  r   ÚwarningrI  )
r»  rÒ  rÓ  rÔ  rP   Ú_clean_baseÚ_dqÚ_extrarª   rô  s
             r   Ú_try_custom_endpointrú  ‡  sô  € Ý%Ñ'Ô'€GÝ
ˆ7�|„|�qÒÐØ")Ñˆ�ZØˆˆà/6Ñ,ˆ�Z Øð ˜jð ØˆzØ×ÒÑÔ×%Ò%Õ&9×&?Ò&?Ñ&AÔ&AÑBÔBð ØˆzÝÑÔÐ/ -€EÝ
‡L‚LÐFÈÈ{ÐOpÐ^pÑqÔqÐqÝ0°Ñ=Ô=Ñ€K�Ø'*Ð2ˆo˜sÐ#Ð#°€FØÐ'Ò'Ð'ÝÐP Z¸+ÐPÐPÈÐPÐPˆÝ# K°Ñ7Ô7¸Ð>Ð>ØÐ*Ò*Ð*ð	UØFÐFÐFÐFÐFÐFØ0Ð0°¸[ÑIÔIˆKˆKøÝð 	Uð 	Uð 	UÝ�NŠNðRñô ð õ ÐM *°{ÐMÐMÀfÐMÐMÈuÐTÐTÐTÐTð	Uøøøõ % [°%¸À[Ð[`ÐaÑaÔaØð
ð 	
õ ÐE˜*¨{ÐEÐE¸fÐEÐEÀuÐLÐLs   Ã,C? Ã?5D7Ä6D7c                  ó¢  — t          d¦  «        \  } }| rHt          |¦  «        }|rt          |t          ¦  «        pt          }n3t	          ¦   «         }|sdS t          }nt	          ¦   «         }|sdS t          }t
                               dt          ¦  «         t          ||t          |¦  «        ¬¦  «        }t          |t          ¦  «        t          fS )NrB   r”  z4Auxiliary client: Codex OAuth (%s via Responses API)r«  )r‹   r‘   r–   rõ  r�  rY   rZ   Ú_CODEX_AUX_MODELr   r   r  )ri  rŒ   Úcodex_tokenrW   rª   s        r   Ú
_try_codexrþ  ­  sÙ   € Ý,¨^Ñ<Ô<Ñ€L�%Øð 'Ý+¨EÑ2Ô2ˆØð 	+Ý-¨eÕ5HÑIÔIÐ`ÕM`ˆHˆHå2Ñ4Ô4ˆKØð "Ø!�zÝ*ˆHˆHå.Ñ0Ô0ˆØð 	Ø�:Ý&ˆÝ
‡L‚LÐGÕIYÑZÔZÐZÝØØÝ1°+Ñ>Ô>ðñ ô €Kõ
   Õ-=Ñ>Ô>Õ@PÐPÐPr    c                  ó”  — 	 ddl m} m} n# t          $ r Y dS w xY wt	          d¦  «        \  }}|r|€dS t          |¦  «        }nd } |¦   «         }|sdS |rt          |t          ¦  «        nt          }	 ddlm	}  |¦   «         }| 
                    d¦  «        }t          |t          ¦  «        rŽt          | 
                    d¦  «        pd¦  «                             ¦   «                              ¦   «         }	|	dk    r@| 
                    d	¦  «        pd                     ¦   «                              d
¦  «        }
|
r|
}n# t"          $ r Y nw xY wddl m}  ||¦  «        }t&           
                    dd¦  «        }t(                               d|||¦  «         	  | ||¦  «        }n# t          $ r Y dS w xY wt-          |||||¬¦  «        |fS )Nr   )rô  Úresolve_anthropic_tokenr”  r5   r¿  rP   r9   r   rW   rR   )Ú_is_oauth_tokenr\   z8Auxiliary client: Anthropic native (%s) at %s (oauth=%s)rK  )r8  rô  r   r   r‹   r‘   r–   Ú_ANTHROPIC_DEFAULT_BASE_URLrÁ  rÀ  rJ   rr   r¡   rs   rD   rE   r‚   ry   r  r`   rY   rZ   rI  )rô  r   ri  rŒ   rŽ  rW   rÀ  rÂ  rÃ  Úcfg_providerÚcfg_base_urlr  r&  rP   rª   s                  r   r¢  r¢  Æ  sQ  € ðØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[øÝð ð ð Øˆzˆzðøøøõ -¨[Ñ9Ô9Ñ€L�%Øð *Øˆ=Ø�:Ý% eÑ,Ô,ˆˆàˆØ'Ð'Ñ)Ô)ˆØð Øˆzð
 NZÐzÕ% eÕ-HÑIÔIÐIÕ_z€HðØ1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆØ—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�Øð ,Ø+�HøøÝð ð ð Øˆðøøøð 8Ð7Ð7Ð7Ð7Ð7Øˆ˜uÑ%Ô%€HÝ(×,Ò,¨[Ð:UÑVÔV€EÝ
‡L‚LÐKÈUÐT\Ð^fÑgÔgÐgðØ,Ð,¨U°HÑ=Ô=ˆˆøÝð ð ð ð ˆzˆzð	øøøõ
 $ K°¸¸xÐRZÐ[Ñ[Ô[Ð]bÐbÐbs1   ‚ ‹
˜Á3CD< Ä<
E	ÅE	ÆF# Æ#
F1Æ0F1rª  rZ  úlocal/customrB   úapi-key©r°  r½  rú  rþ  r¨  )r9   rP   rW   r  rÌ  Úmain_runtimec                 óR  — t          | t          ¦  «        si S i }t          D ]W}|                      |¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         ||<   ŒX|                     d¦  «        }|r|                     ¦   «         |d<   |S )z8Return a sanitized copy of a live main-runtime override.r9   )rr   r¡   Ú_MAIN_RUNTIME_FIELDSrJ   rs   rD   rE   )r  rK   Úfieldrç  r9   s        r   Ú_normalize_main_runtimer    s§   € å�l¥DÑ)Ô)ð Øˆ	Ø!#€JÝ%ð .ð .ˆØ× Ò  Ñ'Ô'ˆÝ�e�SÑ!Ô!ð 	. e§k¢k¡m¤mð 	.Ø %§¢¡¤ˆJ�uÑøØ�~Š~˜jÑ)Ô)€HØð 2Ø!)§¢Ñ!1Ô!1ˆ
�:ÑØÐr    c                  óV   — dt           fdt          fdt          fdt          fdt          fgS )zª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.
    rª  rZ  r  rB   r  r  r   r    r   Ú_get_provider_chainr    s8   € ð 
•Ð'Ø	•ÐØ	Õ-Ð.Ø	�Ð$Ø	Õ-Ð.ðð 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 )	zÈDetect payment/credit/quota exhaustion errors.

    Returns True for HTTP 402 (Payment Required) and for 429/other errors
    whose message indicates billing exhaustion rather than rate limiting.
    Ústatus_codeNé’  T)r  i­  Nc              3   ó    •K  — | ]}|‰v V — Œ	d S r¬   r   ©r   ÚkwÚ	err_lowers     €r   ú	<genexpr>z$_is_payment_error.<locals>.<genexpr>,  s?   øè è € ð @ð @ 2ˆr�Yˆð @ð @ð @ð @ð @ð @r    )Úcreditszinsufficient fundszcan only affordÚbillingzpayment requiredF)r�   rs   rE   Úany©rŠ   rÆ   r  s     @r   Ú_is_payment_errorr    s–   ø€ õ �S˜-¨Ñ.Ô.€FØ�‚}€}ØˆtÝ�C‘”—’Ñ Ô €Ið Ð!Ð!Ð!Ýð @ð @ð @ð @ð *?ð @ñ @ô @ñ @ô @ð 	ð �4Øˆ5r    c                 ó   ‡‡— ddl m}m} t          | ||f¦  «        rdS 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   )ÚAPIConnectionErrorÚAPITimeoutErrorTc              3   ó    •K  — | ]}|‰v V — Œ	d S r¬   r   )r   r  Úerr_types     €r   r  z'_is_connection_error.<locals>.<genexpr>A  s'   øè è € Ð
LÐ
L˜bˆ2�ˆ>Ð
LÐ
LÐ
LÐ
LÐ
LÐ
Lr    )Ú
ConnectionÚTimeoutÚDNSÚSSLc              3   ó    •K  — | ]}|‰v V — Œ	d S r¬   r   r  s     €r   r  z'_is_connection_error.<locals>.<genexpr>D  s7   øè è € ð ð ˜rˆ2�ˆ?ð ð ð ð ð ð r    )zconnection refusedzname or service not knownzno route to hostznetwork is unreachablez	timed outzconnection resetF)	Úopenair  r  rr   r™   r÷   r  rs   rE   )rŠ   r  r  r  r   s      @@r   Ú_is_connection_errorr'  3  sÏ   øø€ ð ;Ð:Ð:Ð:Ð:Ð:Ð:Ð:å�#Ð*¨OÐ<Ñ=Ô=ð Øˆtå�C‰yŒyÔ!€HÝ
Ð
LÐ
LÐ
LÐ
LÐ$KÐ
LÑ
LÔ
LÑLÔLð ØˆtÝ�C‘”—’Ñ Ô €IÝ
ð ð ð ð ð &ð ñ ô ñ ô ð ð
 ˆtØˆ5r    c                 óÎ   — t          | dd¦  «        }|dk    rdS t          | ¦  «                             ¦   «         }d|v p'dt          | ¦  «        j                             ¦   «         v S )zCDetect auth failures that should trigger provider-specific refresh.r  Ni‘  Tzerror code: 401Úauthenticationerror)r�   rs   rE   r™   r÷   r  s      r   Ú_is_auth_errorr*  M  sa   € å�S˜-¨Ñ.Ô.€FØ�‚}€}ØˆtÝ�C‘”—’Ñ Ô €IØ 	Ð)Ð`Ð-BÅdÈ3ÁiÄiÔFX×F^ÒF^ÑF`ÔF`Ð-`Ð`r    Ú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.
    r   Fc              3   ó    •K  — | ]}|‰v V — Œ	d S r¬   r   )r   Úmarkerr  s     €r   r  z2_is_unsupported_parameter_error.<locals>.<genexpr>l  s8   øè è € ð 	ð 	 vˆv˜Ð"ð 	ð 	ð 	ð 	ð 	ð 	r    )zunsupported parameterÚunsupported_parameterznot supportedzdoes not supportzunknown parameterzunrecognized request argumentzunrecognized parameterzinvalid parameter)rE   rs   r  )rŠ   r+  Úparam_lowerr  s      @r   Ú_is_unsupported_parameter_errorr1  V  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/  )r1  )rŠ   s    r   Ú!_is_unsupported_temperature_errorr3  x  s   € õ +¨3°Ñ>Ô>Ð>r    c                 óª  ‡— t          | ¦  «        Št          5  ˆfd„t          D ¦   «         }|D ]‹}t                               |d¦  «        d         }|�Kt	          |¦  «         	 t          |dd¦  «        }t          |¦  «        r
 |¦   «          n# t          $ r Y nw xY wt                               |d¦  «         ŒŒ	 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   )rN   rs   )r   r�   rK   s     €r   ú
<listcomp>z)_evict_cached_clients.<locals>.<listcomp>…  s@   ø€ ð 
ð 
ð 
ØÝ&¥s¨3¨q¬6¡{¤{Ñ3Ô3°zÒAÐAð ØAÐAÐAr    rË  r   Nr
  )	rN   Ú_client_cache_lockÚ_client_cacherJ   Ú_force_close_async_httpxr�   rM  ry   Úpop)r9   Ú
stale_keysr�   ÚclientrN  rK   s        @r   Ú_evict_cached_clientsr=  �  sR  ø€ å(¨Ñ2Ô2€JÝ	ð )ð )ð
ð 
ð 
ð 
Ý(ð
ñ 
ô 
ˆ
ð ð 
	)ð 
	)ˆCÝ"×&Ò& sÐ,>Ñ?Ô?ÀÔBˆFØÐ!Ý(¨Ñ0Ô0Ð0ðÝ& v¨w¸Ñ=Ô=�HÝ Ñ)Ô)ð #Ø ˜™
œ
˜
øøÝ ð ð ð Ø�Dðøøøå×Ò˜c 4Ñ(Ô(Ð(Ð(ð
	)ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )s6   ˜A
CÁ#*BÂCÂ
BÂCÂBÂCÃCÃCc                 ó   — t          | ¦  «        }	 |dk    r\ddlm}  |d¬¦  «        }t          |                     dd¦  «        pd¦  «                             ¦   «         sdS t          |¦  «         dS |d	k    r¬dd
lm}  |t          dt          t          j        dd¦  «        ¦  «        ¦  «        t          t          j        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 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.rB   r   )Ú!resolve_codex_runtime_credentialsTru  r  r   FrZ  rx  rz  r{  r|  r}  r~  r  r5   )Úread_claude_code_credentialsÚ_refresh_oauth_tokenr   ÚrefreshTokenNz7Auxiliary provider credential refresh failed for %s: %s)rN   rƒ  r?  rs   rJ   rD   r=  ry  r„  r…  rr  rs  r†  r8  r@  rA  r   rr   r¡   ry   rY   rZ   )
r9   rK   r?  r‡  ry  r@  rA  r   rŽ  rŠ   s
             r   Ú_refresh_provider_credentialsrC  –  sn  € å(¨Ñ2Ô2€Jð"Ø˜Ò'Ð'Ø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Ý$'¨­Cµ´	Ð:[Ð]cÑ0dÔ0dÑ,eÔ,eÑ$fÔ$fÝ %¥b¤iÐ0MÈtÑ&TÔ&TÑ UÔ UØðñ ô ˆ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ð %øõ ð ð ð Ý�ŠÐNÐPZÐ\_Ñ`Ô`Ð`Øˆuˆuˆuˆuˆuøøøøðøøøð ˆ5s8   ‘AG Á"G Á3BG ÄG Ä%B!G ÇG Ç
HÇ$HÈHúpayment errorÚfailed_providerÚtaskÚreasonc           	      óZ  ‡— |                       ¦   «                              ¦   «         }t          ¦   «         }|h}|r=|                      ¦   «         |v r'|                     |                      ¦   «         ¦  «         dddddddœŠˆfd„|D ¦   «         }g }t	          ¦   «         D ]X\  }}	||v rŒ
 |	¦   «         \  }
}|
�*t
                               d|pd	|| ||pd
¦  «         |
||fc S |                     |¦  «         ŒYt
                               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ª  rZ  rB   r  )rª  rZ  rB   rA   r@   r  c                 ó<   •— h | ]}‰                      ||¦  «        ’ŒS r   rm  )r   ÚsÚ_alias_to_labels     €r   ú	<setcomp>z(_try_payment_fallback.<locals>.<setcomp>Ø  s)   ø€ ÐHÐHÐH°q˜×,Ò,¨Q°Ñ2Ô2ÐHÐHÐHr    Nu2   Auxiliary %s: %s on %s â€” falling back to %s (%s)ÚcallrÈ   z<Auxiliary %s: %s on %s and no fallback available (tried: %s)ú, )NNr   )
rE   rD   rH   Úaddr  rY   Úinfor¢   rö  rà   )rE  rF  rG  ÚskipÚmain_providerÚskip_labelsÚskip_chain_labelsÚtriedÚlabelÚtry_fnr<  rP   rK  s               @r   Ú_try_payment_fallbackrX  ¿  s~  ø€ ð × Ò Ñ"Ô"×(Ò(Ñ*Ô*€Dõ (Ñ)Ô)€MØ�&€KØð /˜×,Ò,Ñ.Ô.°$Ð6Ð6Ø�Š˜×+Ò+Ñ-Ô-Ñ.Ô.Ð.à%1¸6Ø'5ÀØ!/ÀðQð Q€Oð IÐHÐHÐH¸KÐHÑHÔHÐà€EÝ,Ñ.Ô.ð 
ð 
‰ˆˆvØÐ%Ð%Ð%ØØ˜™œ‰ˆ�ØÐÝ�KŠKØDØ�˜ ¨¸ÀÐ@RÈñô ð ð ˜5 %Ð'Ð'Ð'Ð'Ø�Š�UÑÔÐÐå
‡N‚NØFØˆ�˜ °·²¸5Ñ1AÔ1Añô ð ð ˆ>r    c           	      ó   — da t          | ¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }t          stt	          j        dd¦  «                             ¦   «         }|pt          ¦   «         }|r;|r9|d	k    r3|                     d
¦  «        st           
                    d||¦  «         da|pt          ¦   «         }	|pt          ¦   «         }
|	rp|
rn|	dvrj|	}d}d}|r#|	d	k    s|	                     d
¦  «        rd	}|}|pd}t          ||
|||pd¬¦  «        \  }}|�$t                               d|	|p|
¦  «         ||p|
fS g }t          ¦   «         D ]‚\  }} |¦   «         \  }}|�Y|r3t                               d||pdd                     |¦  «        ¦  «         nt                               d||pd¦  «         ||fc S |                     |¦  «         Œƒt           
                    dd                     |¦  «        ¦  «         dS )uÂ  Full auto-detection chain.

    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).
    Fr9   r   rP   rW   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©r<   r   N)Úexplicit_base_urlÚexplicit_api_keyrÌ  z2Auxiliary auto-detect: using main provider %s (%s)u4   Auxiliary auto-detect: using %s (%s) â€” skipped: %srÈ   rN  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.r”  )rh   r  rJ   Ú_stale_base_url_warnedrr  rs  rD   rH   rF   rY   rö  rÄ  Úresolve_provider_clientrP  r  rà   r¢   )r  r»  Úruntime_providerÚruntime_modelr”   rŽ   Úruntime_api_modeÚ	_env_baseÚ_cfg_providerrR  Ú
main_modelÚresolved_providerr[  r\  r<  ÚresolvedrU  rV  rW  rP   s                       r   Ú_resolve_autorg  î  sñ  € ð ÐÝ% lÑ3Ô3€GØ—{’{ :¨rÑ2Ô2ÐØ—K’K ¨Ñ,Ô,€MØ—{’{ :¨rÑ2Ô2ÐØ—k’k )¨RÑ0Ô0€OØ—{’{ :¨rÑ2Ô2Ðõ "ð *Ý”IÐ/°Ñ4Ô4×:Ò:Ñ<Ô<ˆ	Ø(ÐAÕ,?Ñ,AÔ,AˆØð 
	*˜-ð 
	*Ø! XÒ-Ð-Ø%×0Ò0°Ñ;Ô;ð .å�NŠNð6ð ˜=ñô ð ð &*Ð"ð %Ð=Õ(;Ñ(=Ô(=€MØÐ4Õ"2Ñ"4Ô"4€JØð 2˜*ð 2Ø \Ð1Ð1Ø)ÐØ ÐØÐØð 	7 °(Ò!:Ð!:¸m×>VÒ>VÐW`Ñ>aÔ>aÐ!:Ø (ÐØ 0ÐØ.Ð6°$ÐÝ2ØØØ/Ø-Ø%Ð-¨ð
ñ 
ô 
Ñˆ�ð ÐÝ�KŠKÐLØ% xÐ'=°:ñ?ô ?ð ?à˜8Ð1 zÐ1Ð1ð €EÝ,Ñ.Ô.ð 	ð 	‰ˆˆvØ˜™œ‰ˆ�ØÐØð _Ý—’Ð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Ñ#Ô#ñ%ô %ð %ð ˆ:r    c                 ó¦  — ddl m} 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#          t$          ¦  «        |d<   n;t!          |d¦  «        rdd	lm}  |¦   «         |d<   nt!          |d
¦  «        rddi|d<    |di |¤Ž|fS )zIConvert a sync client to its async counterpart, preserving Codex routing.r   )ÚAsyncOpenAI)r—  ÚAsyncGeminiNativeClient©ÚCopilotACPClientr™  rÍ  rœ  r�  rž  rš  re   r›  r   )r&  ri  rr   r  r  rI  rW  r£  r—  rj  r   Úagent.copilot_acp_clientrl  r  rs   rW   r   r¡   r­  r¤  rŸ  )	Úsync_clientrP   ri  r—  rj  rl  Úasync_kwargsÚsync_base_urlrŸ  s	            r   Ú_to_async_clientrq  T  sÿ  € à"Ð"Ð"Ð"Ð"Ð"å�+Õ3Ñ4Ô4ð =Ý(¨Ñ5Ô5°uÐ<Ð<Ý�+Õ7Ñ8Ô8ð AÝ,¨[Ñ9Ô9¸5Ð@Ð@ðØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[å�kÐ#5Ñ6Ô6ð 	?Ø*Ð*¨;Ñ7Ô7¸Ð>Ð>ð	?øåð ð ð ØˆðøøøðØ=Ð=Ð=Ð=Ð=Ð=Ý�kÐ#3Ñ4Ô4ð 	&Ø Ð%Ð%ð	&øåð ð ð Øˆðøøøð Ô&Ý˜Ô,Ñ-Ô-ðð €Lõ ˜Ô,Ñ-Ô-€MÝ˜]¨OÑ<Ô<ð NÝ*.­{Ñ*;Ô*;ˆÐ&Ñ'Ð'Ý	˜}Ð.EÑ	FÔ	Fð NØ=Ð=Ð=Ð=Ð=Ð=à*AÐ*AÑ*CÔ*CˆÐ&Ñ'Ð'Ý	˜}¨nÑ	=Ô	=ð NØ+7Ð9LÐ*MˆÐ&Ñ'Øˆ;Ð&Ð&˜Ð&Ð&¨Ð-Ð-s$   Á$A: Á:
BÂBÂB& Â&
B3Â2B3Ú
model_namec                 ó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_normalizert  ry   )rr  r9   rt  s      r   Ú_normalize_resolved_modelrv  z  sa   € àð ØÐðØKÐKÐKÐKÐKÐKà+Ð+¨J¸ÑAÔAÐAøÝð ð ð ØÐÐÐðøøøs   † ˜'¦'Ú
async_modeÚ	raw_codexr[  r\  rÌ  c                 ó€  ‡‡‡7— t          ¦   «          t          | ¦  «        } dt          dt          dt          fˆˆfd„Š7dZdt          dt          fˆ7ˆfd„}| dk    r[t	          |¬	¦  «        \  }	}
|	€dS |r(d|v r$|
r"d|
vrt
                               d||
¦  «         d
}|p|
}|rt          |	|¦  «        n|	|fS | dk    rdt          ¦   «         \  }	}|	€)t
           	                    dt          ¦   «         ¦  «         dS t          |p|| ¦  «        }|rt          |	|¦  «        n|	|fS | dk    r |t                               ¦   «         v p+|pd                     ¦   «                              ¦   «         dk    }t!          |¬¦  «        \  }	}|	€t
           	                    d¦  «         dS t          |p|| ¦  «        }|rt          |	|¦  «        n|	|fS | dk    rÄ‰rkt#          ¦   «         }|st
           	                    d¦  «         dS t          |pt$          | ¦  «        }t'          |t(          t+          |¦  «        ¬¦  «        }||fS t-          ¦   «         \  }	}|	€t
           	                    d¦  «         dS t          |p|| ¦  «        }|rt          |	|¦  «        n|	|fS | dk    �rµ|�r|                     ¦   «         }|pd                     ¦   «         p(t/          j        dd¦  «                             ¦   «         pd}|st
           	                    d¦  «         dS t          |pt3          ¦   «         pd| ¦  «        }i }t5          |¦  «        \  }}|r||d<   t7          |d¦  «        rddi|d <   n#t7          |d!¦  «        rd"d#lm}  |¦   «         |d <   t'          d[||d$œ|¤Ž}	 ||	||¦  «        }	|rt          |	|¦  «        n|	|fS t<          t,          t>          fD ]h} |¦   «         \  }	}|	�Wt          |p|| ¦  «        }t          tA          |	d%d¦  «        pd¦  «        } ||	||¦  «        }	|rt          |	|¦  «        n|	|fc S Œit
           	                    d&¦  «         dS 	 d"d'l!m"}  || ¦  «        }|�rS| #                    d%d¦  «                             ¦   «         }| #                    d(d¦  «                             ¦   «         }| #                    d)d¦  «                             ¦   «         }|s)|r't/          j        |d¦  «                             ¦   «         }|pd}‰p| #                    d*¦  «        pd                     ¦   «         }|�rat          |p$| #                    d+¦  «        pt3          ¦   «         pd| ¦  «        }t5          |¦  «        \  }}|rd|ini }t
                               d,| ||pd-¦  «         |d.k    r�	 d"d/l$m%}  |||¦  «        } nP# tL          $ rC t
           	                    d0| ¦  «         t'          d[||d$œ|¤Ž}	|rt          |	|¦  «        n|	|fcY S w xY wtO          | |||d1¬2¦  «        }!|rtQ          |!¦  «        |fS |!|fS t'          d[||d$œ|¤Ž}	|d3k    r&tS          |	tT          ¦  «        stU          |	|¦  «        }	n ||	||¦  «        }	|rt          |	|¦  «        n|	|fS t
           	                    d4| ¦  «         dS n# tL          $ r Y nw xY w	 d"d5l+m,}"m-}#m.}$ n,# tL          $ r t
                               d6| ¦  «         Y dS w xY w|" #                    | ¦  «        }%|%€t
           	                    d7| ¦  «         dS |%j/        d(k    �r×| d8k    rWta          ¦   «         \  }	}&|	€t
           	                    d9¦  «         dS t          |p|&| ¦  «        }|rt          |	|¦  «        n|	|fS  |#| ¦  «        }'t          |' #                    d(d¦  «        ¦  «                             ¦   «         }(|(s`tc          |%j2        ¦  «        })| d:k    r|) 3                    d;¦  «         t
                               d<| d= 4                    |)¦  «        ¦  «         dS tk          t          |' #                    d%d¦  «        ¦  «                             ¦   «          6                    d¦  «        p|%j7        ¦  «        }*tp           #                    | d¦  «        }&t          |p|&| ¦  «        }| d>k    rRd"d?l9m:}+m;},  |,|*¦  «        r? |+|(|*¬$¦  «        }	t
                               d@| |¦  «         |rt          |	|¦  «        n|	|fS i }-t7          |*d¦  «        rd|-d<   n3t7          |*d!¦  «        r#d"d#lm} |- <                     |¦   «         ¦  «         t'          d[|(|*d$œ|-rd |-ini ¤Ž}	| d:k    rR|rP‰sN	 d"dAlm=}.  |.|¦  «        r+t
                               dB|¦  «         tU          |	|¦  «        }	n# tL          $ r Y nw xY w ||	||*¦  «        }	t
                               d@| |¦  «         |rt          |	|¦  «        n|	|fS |%j/        dCk    �r— |$| ¦  «        }'t          |pt3          ¦   «         | ¦  «        }| dDk    �rJt          |' #                    d(d¦  «        ¦  «                             ¦   «         }(t          |' #                    d%d¦  «        ¦  «                             ¦   «         }*t          |' #                    dEd¦  «        ¦  «                             ¦   «         pd
}/tc          |' #                    dF¦  «        pg ¦  «        }0|st
           	                    dG¦  «         dS |(r|*st
           	                    dH¦  «         dS d"dIl>m?}1  |1|(|*|/|0¬J¦  «        }	t
                               d@| |¦  «         |rt          |	|¦  «        n|	|fS t
           	                    dK| ¦  «         dS |%j/        dLk    �r	 d"dMl@mA}2mB}3 d"dNl$mC}4 n+# tL          $ r t
           	                    dO¦  «         Y dS w xY w |2¦   «         st
                               dP¦  «         dS  |3¦   «         }5dQ}&t          |p|&| ¦  «        }	  |4|5¦  «        } n3# tL          $ r&}6t
           	                    dR|6¦  «         Y d
}6~6dS d
}6~6ww xY wtO          | |dSdT|5› dU�¬$¦  «        }	t
                               dV||5¦  «         |rt          |	|¦  «        n|	|fS |%j/        dWv rK| dk    rt‰          d||¦  «        S | dk    rt‰          d||¦  «        S t
           	                    dX| ¦  «         dS t
           	                    dY|%j/        | ¦  «         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.
    Úbase_url_strÚ	model_strr:   c                 óÀ   •— t          | t          ¦  «        rdS ‰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ò  Túapi.openai.comr   rA   )rr   r  r   rE   )Ú
client_objrz  r{  Úmodel_lowerrÌ  rx  s       €€r   Ú_needs_codex_wrapz2resolve_provider_client.<locals>._needs_codex_wrap²  s‘   ø€ õ �jÕ"6Ñ7Ô7ð 	Ø�5Øð 	Ø�5ØÐ(Ò(Ð(Ø�4àð 	˜Ð$5Ò5Ð5Ø�5Ý˜\Ñ*Ô*Ð.>Ò>Ð>Ø$˜?¨×1Ò1Ñ3Ô3ˆKØ˜+Ð%Ð%Ø�tØˆur    r   Úfinal_model_strc                 ó˜   •—  ‰| ||¦  «        r;t                                d‰pd||r
|dd…         nd¦  «         t          | |¦  «        S | S )zNWrap a plain OpenAI client in CodexAuxiliaryClient if Responses API is needed.zeresolve_provider_client: wrapping client in CodexAuxiliaryClient (api_mode=%s, model=%s, base_url=%s)zauto-detectedNrz  r   )rY   rZ   r  )r~  r�  rz  r€  rÌ  s      €€r   Ú_wrap_if_neededz0resolve_provider_client.<locals>._wrap_if_neededÈ  sn   ø€ àÐ˜Z¨°ÑGÔGð 	EÝ�LŠLð7àÐ+˜O¨_Ø%1Ð9�˜S˜b˜SÔ!Ð!°rñ	;ô ;ð ;õ
 (¨
°OÑDÔDÐDØÐr    r<   ©r  Nr”  rR   z\Dropping OpenRouter-format model %r for non-OpenRouter auxiliary provider (using %r instead)rª  z4resolve_provider_client: openrouter requested but %srZ  zmimo-v2-omnir·  zYresolve_provider_client: nous requested but Nous Portal not configured (run: hermes auth)rB   zbresolve_provider_client: openai-codex requested but no Codex OAuth token found (run: hermes model)r«  r@   rÊ  rÎ  zQresolve_provider_client: explicit custom endpoint requested but base_url is emptyrï  rñ  rš  re   r›  rœ  r�  r   rž  r™  rW   zPresolve_provider_client: custom/main requested but no endpoint credentials found)Ú_get_named_custom_providerr  Úkey_envrÌ  rP   zCresolve_provider_client: named custom provider %r (%s, api_mode=%s)rð  r5  ró  u…   Named custom provider %r declares api_mode=anthropic_messages but the anthropic SDK is not installed â€” falling back to OpenAI-wire.FrK  rò  zAresolve_provider_client: named custom provider %r has no base_url)r’  r“  Ú-resolve_external_process_provider_credentialsz-hermes_cli.auth not available for provider %sz,resolve_provider_client: unknown provider %rr5   zOresolve_provider_client: anthropic requested but no Anthropic credentials foundr6   zgh auth tokenzJresolve_provider_client: provider %s has no API key configured (tried: %s)rN  r(   r–  z resolve_provider_client: %s (%s))Ú!_should_use_copilot_responses_apiud   resolve_provider_client: copilot model %s needs Responses API â€” wrapping with CodexAuxiliaryClientÚexternal_processr7   ÚcommandÚargszVresolve_provider_client: copilot-acp requested but no model was provided or configuredz^resolve_provider_client: copilot-acp requested but external process credentials are incompleterk  )r  rW   rŠ  r‹  zLresolve_provider_client: external-process provider %s not directly supportedÚaws_sdk)Úhas_aws_credentialsÚ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:0z9resolve_provider_client: cannot create Bedrock client: %szaws-sdkzhttps://bedrock-runtime.z.amazonaws.comz)resolve_provider_client: bedrock (%s, %s))Úoauth_device_codeÚoauth_externalzMresolve_provider_client: OAuth provider %s not directly supported, try 'auto'z6resolve_provider_client: unhandled auth_type %s for %s©r   r   )Erè  rN   rs   rD  rg  rY   rZ   rq  r°  rö  r²  rv  rb   ÚvaluesrD   rE   r½  r�  rü  r   rõ  r   rþ  rr  rs  rÄ  r&   r   r¤  rŸ  rú  r¨  r�   rÏ  r…  rJ   r8  rô  r   rI  rW  rr   r  rƒ  r’  r“  r‡  r¡  r¢  r    Úapi_key_env_varsr¢   rà   r…   r‚   r•   r`   r£  r—  r˜  Úupdaterˆ  rm  rl  Úagent.bedrock_adapterr�  rŽ  r�  r^  )8r9   rP   rw  rx  r[  r\  rÌ  r  rƒ  r<  rf  Úfinal_modelrÈ   Ú
_is_visionrý  Ú
raw_clientrÒ  rÓ  r§  r÷  rø  rŸ  rW  Ú_cbaser…  Úcustom_entryÚcustom_key_envÚentry_api_modeÚ_clean_base2Ú_dq2Ú_extra2rô  rª   Úsync_anthropicr’  r“  r‡  r¦  Údefault_modelr‡  r  Útried_sourcesrW   r—  r˜  rz   rˆ  rŠ  r‹  rl  r�  rŽ  r�  ÚregionrŠ   r€  s8      `  `                                                @r   r^  r^  †  s¦  øøø€ õP ÑÔÐå& xÑ0Ô0€HðµCð ÅCð ÍDð ð ð ð ð ð ð ð,	ð 	µSð 	Íð 	ð 	ð 	ð 	ð 	ð 	ð 	ð �6ÒÐÝ(°lÐCÑCÔCÑˆ�Øˆ>Ø�:ð
 ð 	�S˜E�\�\ h�\°3¸hÐ3FÐ3FÝ�LŠLð8Ø9>ÀñJô Jð Jð ˆEØÐ'˜xˆØ9Cð +Õ  ¨Ñ5Ô5Ð5Ø˜kÐ*ð	,ð �<ÒÐÝ)Ñ+Ô+‰ˆ�Øˆ>Ý�NŠNØFÝ0Ñ2Ô2ñô ð ð �:Ý/°Ð0@¸À(ÑKÔKˆØ9Cð +Õ  ¨Ñ5Ô5Ð5Ø˜kÐ*ð	,ð �6ÒÐð Õ,×3Ò3Ñ5Ô5Ð5ð ?Ø�˜×"Ò"Ñ$Ô$×*Ò*Ñ,Ô,°Ò>ð 	õ $¨:Ð6Ñ6Ô6‰ˆ�Øˆ>Ý�NŠNð Oñ Pô Pð Pà�:Ý/°Ð0@¸À(ÑKÔKˆØ9Cð +Õ  ¨Ñ5Ô5Ð5Ø˜kÐ*ð	,ð �>Ò!Ð!Øð 	-õ 3Ñ4Ô4ˆKØð "Ý—’ð  Tñ Uô Uð Uà!�zÝ3°EÐ4MÕ=MÈxÑXÔXˆKÝØ#Ý,Ý 9¸+Ñ FÔ Fðñ ô ˆJð
  Ð,Ð,å$™,œ,‰ˆ�Øˆ>Ý�NŠNð Pñ Qô Qð Qà�:Ý/°Ð0@¸À(ÑKÔKˆØ9Cð +Õ  ¨Ñ5Ô5Ð5Ø˜kÐ*ð	,ð �8ÒÑØñ 	0Ø+×1Ò1Ñ3Ô3ˆKà!Ð' R×.Ò.Ñ0Ô0ð %Ý”9Ð-¨rÑ2Ô2×8Ò8Ñ:Ô:ð%à$ð ð
 ð "Ý—’ð,ñô ð ð "�zÝ3ØÐ<Õ)Ñ+Ô+Ð<¨}Øñô ˆKð ˆEÝ8¸ÑEÔEÑˆK˜Øð -Ø),��oÑ&Ý$ [°.ÑAÔAð EØ,8Ð:MÐ+N�Ð'Ñ(Ð(Ý& {Ð4KÑLÔLð EØEÐEÐEÐEÐEÐEØ+BÐ+BÑ+DÔ+D�Ð'Ñ(ÝÐN J¸ÐNÐNÈÐNÐNˆFØ$�_ V¨[¸+ÑFÔFˆFØ=Gð /Õ$ V¨[Ñ9Ô9Ð9Ø  +Ð.ð0õ ,­ZÝ0ð2ð 	4ð 	4ˆFà$˜f™hœh‰OˆF�GØÐ!Ý7¸Ð8HÀÈ(ÑSÔS�Ý�W V¨Z¸Ñ<Ô<ÐBÀÑCÔC�Ø(˜¨°¸fÑEÔE�ØAKð 3Õ(¨°Ñ=Ô=Ð=Ø$ kÐ2ð4ð 4ð 4ð	 "õ 	�Šð ;ñ 	<ô 	<ð 	<àˆzð@ØJÐJÐJÐJÐJÐJØ1Ð1°(Ñ;Ô;ˆØñ ;	Ø&×*Ò*¨:°rÑ:Ô:×@Ò@ÑBÔBˆKØ%×)Ò)¨)°RÑ8Ô8×>Ò>Ñ@Ô@ˆJØ)×-Ò-¨i¸Ñ<Ô<×BÒBÑDÔDˆNØð C .ð CÝœY ~°rÑ:Ô:×@Ò@ÑBÔB�
Ø#Ð8Ð'8ˆJð 'ÐL¨,×*:Ò*:¸:Ñ*FÔ*FÐLÈ"×SÒSÑUÔUˆNØñ -4Ý7ØÐ]˜\×-Ò-¨gÑ6Ô6Ð]Õ:JÑ:LÔ:LÐ]ÐP]Øñô �õ &?¸{Ñ%KÔ%KÑ"�˜dØ59ÐA˜?¨DÐ1Ð1¸r�Ý—’ØYØ˜k¨>Ð+OÐ=OñQô Qð Qð "Ð%9Ò9Ð9ð<ØRÐRÐRÐRÐRÐRØ&<Ð&<¸ZÈÑ&UÔ&U˜˜øÝ&ð 	<ð 	<ð 	<ÝŸšðIð %ñ	ô ð õ "(Ð!]°
À\Ð!]Ð!]ÐU\Ð!]Ð!]˜ØISð !;Õ 0°¸Ñ EÔ EÐ EØ&,¨kÐ%:ð<ð <ð <ð	<øøøõ &>Ø# [°*¸kÐTYð&ñ &ô &�Nð "ð ZÝ<¸^ÑLÔLÈkÐYÐYØ)¨;Ð6Ð6ÝÐU¨
¸\ÐUÐUÈWÐUÐU�ð
 "Ð%6Ò6Ð6½zØÕ0ñ@ô @Ð6õ 2°&¸+ÑFÔF�F�Fà,˜_¨V°[À+ÑNÔN�FØAKð 3Õ(¨°Ñ=Ô=Ð=Ø$ kÐ2ð4å�NŠNØSØñô ð ð �:ðw;	øõx ð ð ð Øˆðøøøðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ
 ð ð ð Ý�ŠÐDÀhÑOÔOÐOØˆzˆzðøøøð  ×#Ò# HÑ-Ô-€GØ€Ý�ŠÐEÀxÑPÔPÐPØˆzàÔ˜IÒ%Ñ%Ø�{Ò"Ð"Ý$2Ñ$4Ô$4Ñ!ˆF�MØˆ~Ý—’ÐpÑqÔqÐqØ!�zÝ3°EÐ4J¸]ÈHÑUÔUˆKØ=GÐbÕ$ V¨[Ñ9Ô9Ð9ÈfÐVaÐMbÐcà4Ð4°XÑ>Ô>ˆÝ�e—i’i 	¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7ˆØð 	Ý  Ô!9Ñ:Ô:ˆMØ˜9Ò$Ð$Ø×$Ò$ _Ñ5Ô5Ð5Ý�LŠLð 6à! 4§9¢9¨]Ñ#;Ô#;ñ=ô =ð =ð �:å&Ý�—	’	˜* bÑ)Ô)Ñ*Ô*×0Ò0Ñ2Ô2×9Ò9¸#Ñ>Ô>Ð\À'ÔB\ñ
ô 
ˆõ 5×8Ò8¸À2ÑFÔFˆÝ/°Ð0F¸ÈÑQÔQˆà�xÒÐØaÐaÐaÐaÐaÐaÐaÐaà(Ð(¨Ñ2Ô2ð 4Ø+Ð+°GÀhÐOÑOÔO�Ý—’Ð?ÀÈ;ÑWÔWÐWØAKð 3Õ(¨°Ñ=Ô=Ð=Ø$ kÐ2ð4ð ˆÝ  ¨>Ñ:Ô:ð 	6Ø$7ˆG�LÑ!Ð!Ý" 8Ð-DÑEÔEð 	6ØAÐAÐAÐAÐAÐAà�NŠNÐ2Ð2Ñ4Ô4Ñ5Ô5Ð5Ýð M °(ð 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øøÝð ð ð Ø�ðøøøð !� ¨°hÑ?Ô?ˆå�ŠÐ7¸À;ÑOÔOÐOØ9Cð +Õ  ¨Ñ5Ô5Ð5Ø˜kÐ*ð	,ð ÔÐ.Ò.Ñ.Ø=Ð=¸hÑGÔGˆÝ/°Ð0KÕ9IÑ9KÔ9KÈXÑVÔVˆØ�}Ò$Ñ$Ý˜%Ÿ)š) 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Ø=Gð /Õ$ V¨[Ñ9Ô9Ð9Ø  +Ð.ð0å�Šð ,Ø-5ñ	7ô 	7ð 	7àˆzà	Ô	˜iÒ	'Ñ	'ð	ØYÐYÐYÐYÐYÐYÐYÐYØNÐNÐNÐNÐNÐNÐNøÝð 	ð 	ð 	Ý�NŠNð Bñ Cô Cð Cà�:�:ð	øøøð
 #Ð"Ñ$Ô$ð 	Ý�LŠLð 4ñ 5ô 5ð 5à�:à'Ð'Ñ)Ô)ˆØBˆÝ/°Ð0F¸ÈÑQÔQˆð	Ø8Ð8¸Ñ@Ô@ˆKˆKøÝð 	ð 	ð 	Ý�NŠNð (Ø),ñ.ô .ð .à�:�:�:�:�:øøøøð	øøøõ *Ø˜¨iØF°ÐFÐFÐFð
ñ 
ô 
ˆõ 	�ŠÐ@À+ÈvÑVÔVÐVØ9Cð +Õ  ¨Ñ5Ô5Ð5Ø˜kÐ*ð	,ð 
Ô	ÐEÐ	EÐ	Eà�vÒÐÝ*¨6°5¸*ÑEÔEÐEØ�~Ò%Ð%Ý*¨>¸5À*ÑMÔMÐMå�Šð 8Ø9Añ	Cô 	Cð 	Càˆzå
‡N‚NÐKØÔ$ hñ0ô 0ð 0àˆ:s™   ÑEZ3 Ö)V< Ö;Z3 Ö<A
X	ØZ3 ØX	Ø	)Z3 Ø3Z3 Ø7AZ3 ÚZ3 Ú3
[ Ú?[ Û
[ Û%[8Û7[8æ<g ç
gçgïo ï$o9ï8o9ñq ñ
q=ñq8ñ8q=r„  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)rP   r[  r\  rÌ  r  ©Ú_resolve_task_provider_modelr^  ©rF  r  r9   rP   rW   r  rÌ  s          r   Úget_text_auxiliary_clientr©  =  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)rP   rw  r[  r\  rÌ  r  r¦  r¨  s          r   Úget_async_text_auxiliary_clientr«  V  sP   € õ 4PÐPTÐP\ÐX\Ñ3]Ô3]Ñ0€Hˆe�X˜w¨Ý"ØØØØ"Ø ØØ!ðñ ô ð r    )rª  rZ  c                 ó    — t          | ¦  «        S r¬   )rN   rn  s    r   Ú_normalize_vision_providerr­  o  s   € Ý" 8Ñ,Ô,Ð,r    c                 óð   — t          | ¦  «        } | dk    rt          ¦   «         S | dk    rt          d¬¦  «        S | dk    rt          ¦   «         S | dk    rt	          ¦   «         S | dk    rt          ¦   «         S dS )	Nrª  rZ  Tr·  rB   r5   r@   r”  )r­  r°  r½  rþ  r¢  rú  rn  s    r   Ú_resolve_strict_vision_backendr¯  s  sŠ   € Ý)¨(Ñ3Ô3€HØ�<ÒÐÝÑ Ô Ð Ø�6ÒÐÝ Ð%Ñ%Ô%Ð%Ø�>Ò!Ð!Ý‰|Œ|ÐØ�;ÒÐÝÑÔÐØ�8ÒÐÝ#Ñ%Ô%Ð%Øˆ:r    c                 ó0   — t          | ¦  «        d         d uS r  )r¯  rn  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.
    rZ  )rH   Ú_VISION_AUTO_PROVIDER_ORDERr±  r¢   r^  rÄ  )Ú	availablerR  r<  r×  Úps        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    )rW   r  rw  r  c                ó¾  ‡‡— t          d| |||¦  «        \  }Š}}}t          |¦  «        }dt          dt          dt          t                   fˆˆfd„}	|r!t          d‰‰|||¬¦  «        \  }
}|
€d	S d|
|fS |d
k    �rt          ¦   «         }t          ¦   «         }|r«|dvr§|dk    rBt          |¦  «        \  }}|�-t           
                    d||p‰p|¦  «          |	|||¦  «        S n_t                               ||¦  «        }t          |||¬¦  «        \  }}|�-t           
                    d||p|¦  «          |	|||p|¦  «        S t          D ],}||k    rŒ	t          |¦  «        \  }}|� |	|||¦  «        c S Œ-t                               d¦  «         dS |t          v rt          |¦  «        \  }} |	|||¦  «        S t          |‰‰|¬¦  «        \  }
}|
€|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.
    r³  re  rn  r¢  c                 óX   •— |€| d d fS ‰p|}‰rt          ||¦  «        \  }}| ||fS | ||fS r¬   )rq  )re  rn  r¢  r—  Úasync_clientÚasync_modelrw  Úresolved_models         €€r   Ú	_finalizez1resolve_vision_provider_client.<locals>._finalize³  sW   ø€ ØÐØ$ d¨DÐ0Ð0Ø$Ð5¨ˆØð 	@Ý(8¸ÀkÑ(RÔ(RÑ%ˆL˜+Ø$ l°KÐ?Ð?Ø  +¨{Ð:Ð:r    r@   )rP   rw  r[  r\  rÌ  N)r@   NNr<   rZ  rZ  z/Vision auto-detect: using main provider %s (%s))rÌ  z'Auxiliary vision client: none availablerË  )r§  r­  rs   r   r   r^  rH   rÄ  r¯  rY   rP  rb   rJ   r³  rZ   Ú_get_cached_client)r9   rP   rW   r  rw  rÈ  Úresolved_base_urlÚresolved_api_keyÚresolved_api_moder¼  r<  r—  rR  rd  rn  r¢  Úvision_modelÚ
rpc_clientÚ	rpc_modelrì  r»  s       `               @r   Úresolve_vision_provider_clientrÄ  Ÿ  sÚ  øø€ õ YuØ�(˜E 8¨WñYô YÑU€Iˆ~Ð0Ð2BÐDUõ +¨9Ñ5Ô5€Ið;¥Sð ;µsð ;Í8ÕTWÌ=ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ð -Ý5ØØ Ø!Ø/Ø-Ø&ð
ñ 
ô 
Ñˆ�ð ˆ>Ø'Ð'Ø˜ Ð,Ð,à�FÒÑõ ,Ñ-Ô-ˆÝ%Ñ'Ô'ˆ
Øð 	N˜]°,Ð>Ð>Ø Ò&Ð&Ý-KÈMÑ-ZÔ-ZÑ*�˜]ØÐ*Ý—K’KØIØ% }Ð'T¸Ð'TÈ*ñô ð ð %˜9 ]°KÀÑOÔOÐOð +õ  7×:Ò:¸=È*ÑUÔU�Ý(?Ø! <Ø.ð)0ñ )0ô )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ÀIÑ%NÔ%NÑ"ˆ�]Øˆy˜ K°Ñ?Ô?Ð?å,¨Y¸È
Ø6GðIñ Iô IÑ€FˆKà€~Ø˜$ Ð$Ð$Ø�f˜kÐ)Ð)r    c                  ó<   — t           rt          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.
    )rh   r¡   ÚNOUS_EXTRA_BODYr   r    r   Úget_auxiliary_extra_bodyrÇ  	  s   € õ %6Ð=�4•Ñ Ô Ð ¸2Ð=r    rç  c                 óœ   — t          ¦   «         }t          j        d¦  «        }|s%t          ¦   «         €t	          |¦  «        dk    rd| iS d| iS )aF  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, o-series, gpt-5+) requires 'max_completion_tokens'.
    The Codex adapter translates max_tokens internally, so we use max_tokens
    for it as well.
    r¬  Nr}  r.  r-  )rØ  rr  rs  rk  r   )rç  rÒ  r¯  s      r   Úauxiliary_max_tokens_paramrÉ  	  s]   € õ +Ñ,Ô,€KÝŒYÐ+Ñ,Ô,€Fàð 0ÝÑ!Ô!Ð)Ý! +Ñ.Ô.Ð2BÒBÐBØ'¨Ð/Ð/Ø˜%Ð Ð r    r8  é@   ©rW   r  rÌ  r  c                óŽ   ‡— t          |¦  «        Š| dk    r t          ˆfd„t          D ¦   «         ¦  «        nd}| ||pd|pd|pd|fS )Nr<   c              3   óD   •K  — | ]}‰                      |d ¦  «        V — ŒdS )r   Nrm  )r   r  r»  s     €r   r  z$_client_cache_key.<locals>.<genexpr>@	  s1   øè è € ÐQÐQ°5˜Ÿš E¨2Ñ.Ô.ÐQÐQÐQÐQÐQÐQr    r   r   )r  Útupler
  )r9   rw  rW   r  rÌ  r  Úruntime_keyr»  s          @r   Ú_client_cache_keyrÐ  6	  sf   ø€ õ & lÑ3Ô3€GØU]ÐagÒUgÐUg•%ÐQÐQÐQÐQÕ<PÐQÑQÔQÑQÔQÐQÐmo€KØ�j ( .¨b°'°-¸RÀÀÈRÐQ\Ð]Ð]r    ©Ú
bound_loopÚ	cache_keyr<  r¢  rÒ  c                óZ  — t           5  t                               | ¦  «        }|�a|d         |urWt          |d         ¦  «         	 t	          |d         dd ¦  «        }t          |¦  «        r
 |¦   «          n# t          $ r Y nw xY w|||ft          | <   d d d ¦  «         d S # 1 swxY w Y   d S )Nr   r
  )r7  r8  rJ   r9  r�   rM  ry   )rÓ  r<  r¢  rÒ  Ú	old_entryrN  s         r   Ú_store_cached_clientrÖ  D	  s   € Ý	ð 
Gð 
GÝ!×%Ò% iÑ0Ô0ˆ	ØÐ  Y¨q¤\¸Ð%?Ð%?Ý$ Y¨q¤\Ñ2Ô2Ð2ðÝ" 9¨Q¤<°¸$Ñ?Ô?�Ý˜HÑ%Ô%ð Ø�H‘J”J�JøøÝð ð ð Ø�ðøøøà$*¨M¸:Ð#F��iÑ ð
Gð 
Gð 
Gñ 
Gô 
Gð 
Gð 
Gð 
Gð 
Gð 
Gð 
Gð 
Gøøøð 
Gð 
Gð 
Gð 
Gð 
Gð 
Gs5   ˆ<B Á0A6Á5B Á6
BÂ B ÂBÂB Â B$Â'B$Úcache_providerc                 óB  — t          d¬¦  «        }|€d|fS |\  }}	t          ||	¬¦  «        }
|}d}|r@	 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.Tru  Nr™  r   r   ©rw  rW   r  rÌ  r  rÑ  )rˆ  r   r  Úget_event_loopræ  rq  rÐ  rÖ  )r×  rP   rw  rW   r  rÌ  r  r»  Ú	fresh_keyÚfresh_base_urlrn  r—  Úcurrent_loopÚ_aior<  rÓ  s                   r   Ú_refresh_nous_auxiliary_clientrß  R	  sÿ   € õ (°dÐ;Ñ;Ô;€GØ€Ø�Uˆ{Ðà 'Ñ€Iˆ~Ý °^ÐDÑDÔD€KØ€Kà€LØð ð	Ø"Ð"Ð"Ð"Ø×.Ò.Ñ0Ô0ˆLˆLøÝð 	ð 	ð 	ØˆDð	øøøå.¨{¸KÐ<MÈ2ÑNÔNÑˆ��àˆå!ØØØØØØ!ðñ ô €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   ú<lambda>z(neuter_async_httpx_del.<locals>.<lambda>˜	  s   € °t€ r    N)Úopenai._base_clientrâ  Ú__del__r   ÚAttributeErrorrá  s    r   Úneuter_async_httpx_delrè  |	  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._clientrê  r�   ÚCLOSEDÚ_statery   )r<  rê  Úinners      r   r9  r9  �	  s   € ðØ-Ð-Ð-Ð-Ð-Ð-Ý˜ 	¨4Ñ0Ô0ˆØÐ¥W¨U°KÀÑ%FÔ%FÐØ&Ô-ˆEŒLˆLˆLð ÐÐÐøåð ð ð Øˆˆðøøøs   ‚6> ¾
AÁAc                  ó’  — ddl } t          5  t          t                               ¦   «         ¦  «        D ]b\  }}|d         }|€Œt          |¦  «         	 t          |dd¦  «        }|r|                      |¦  «        s
 |¦   «          ŒS# t          $ r Y Œ_w xY w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   Nr
  )
Úinspectr7  r    r8  r"   r9  r�   Úiscoroutinefunctionry   Úclear)rñ  r�   rŒ   r<  rN  s        r   Úshutdown_cached_clientsrô  ±	  s0  € ð €N€N€Nå	ð ð Ý�}×2Ò2Ñ4Ô4Ñ5Ô5ð 	ð 	‰JˆC�Ø˜1”XˆFØˆ~Øõ % VÑ,Ô,Ð,ðÝ" 6¨7°DÑ9Ô9�Øð  G×$?Ò$?ÀÑ$IÔ$Ið Ø�H‘J”J�JøøÝð ð ð Ø�ðøøøå×ÒÑÔÐð!ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s6   ŒAB<Á2BÂB<Â
BÂB<ÂBÂB<Â<C ÃC 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)r7  r8  r"   rë  r9  r¢   )r;  r�   rŒ   r<  Ú_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­   r<  rW   r   rÍ  TF)r�   r   rs   )r<  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                 ó8   — |rd|v rt          | ¦  «        s|S |p|S )z¢Drop OpenRouter-format model slugs (with '/') for non-OpenRouter clients.

    Mirrors the guard in resolve_provider_client() which is skipped on cache hits.
    rR   )rú  )r<  rP   rû  s      r   Ú_compat_modelrý  æ	  s2   € ð
 ð �˜��Õ&;¸FÑ&CÔ&C�ØÐØÐ"�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   t          | ||||||	¬¦  «        \  }}|�Ö|}t
          5  |
t          vr›t          t          ¦  «        t          k    rpt          t          t                               ¦   «         ¦  «        ¦  «        \  }}t          |d         ¦  «         t          |= t          t          ¦  «        t          k    °p|||ft          |
<   n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   rÙ  )r[  r\  rÌ  r  )r  rÚ  ræ  r  rÐ  r7  r8  rë  rý  r9  r^  ru   Ú_CLIENT_CACHE_MAX_SIZEÚnextÚiterr"   )r9   rP   rw  rW   r  rÌ  r  rÝ  rÞ  r»  rÓ  Úcached_clientrû  r÷  Úloop_okÚ	effectiver<  r¢  rÒ  Ú	evict_keyÚevict_entryr×  s                         r   r½  r½  ð	  s>  € ð: €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õ, 4ØØØØ"Ø ØØðñ ô Ñ€FˆMð Ðð "ˆ
Ýð 
	Dð 
	DØ¥Ð-Ð-õ �-Ñ(Ô(Õ,BÒBÐBÝ-1µ$µ}×7JÒ7JÑ7LÔ7LÑ2MÔ2MÑ-NÔ-NÑ*�I˜{Ý,¨[¸¬^Ñ<Ô<Ð<Ý% iÐ0õ �-Ñ(Ô(Õ,BÒBÐBð -3°MÀ:Ð+N•˜iÑ(Ð(å+8¸Ô+CÑ(�˜ qð
	Dð 
	Dð 
	Dñ 
	Dô 
	Dð 
	Dð 
	Dð 
	Dð 
	Dð 
	Dð 
	Døøøð 
	Dð 
	Dð 
	Dð 
	Dð �5Ð)˜MÐ)Ð)s8   † Ÿ
,«,ÁAC<Â7,C<Ã<D ÄD Ä+B6G-Ç-G1Ç4G1c                 óà  — 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}t          |
                     dd¦  «        ¦  «                             ¦   «         pd}	|p|}|	}|rd||||fS |r|||||fS | r|rd||||fS |r|d	k    r||dd|fS d	|dd|fS d	|dd|fS )
a  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). When base_url is set, provider is forced
    to "custom" and the task uses that direct endpoint. api_mode is one of
    "chat_completions", "codex_responses", or None (auto-detect).
    Nr9   r   rP   rW   r  rÌ  r@   r<   )Ú_get_auxiliary_task_configrs   rJ   rD   )rF  r9   rP   rW   r  r  Ú	cfg_modelr  Úcfg_api_keyÚcfg_api_modeÚtask_configr»  rÀ  s                r   r§  r§  N
  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ˆÝ˜;Ÿ?š?¨:°rÑ:Ô:Ñ;Ô;×AÒAÑCÔCÐKÀtˆàÐ'˜i€NØ$Ðàð NØ˜¨°7Ð<MÐMÐMØð NØ˜¨°7Ð<MÐMÐMàð Eàð 	ZØ˜^¨\¸;ÐHYÐYÐYØð 	O˜L¨FÒ2Ð2Ø °°tÐ=NÐNÐNà�~ t¨TÐ3DÐDÐDà�> 4¨Ð/@Ð@Ð@r    ç      >@c                 ó8  — | 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          ¦  «        r|ni S )zDReturn the config dict for auxiliary.<task>, or {} when unavailable.r   r¿  Ú	auxiliary)rÁ  rÀ  r   rr   r¡   rJ   )rF  rÀ  ÚconfigÚauxr  s        r   r  r  †
  s¾   € àð Øˆ	ðØ1Ð1Ð1Ð1Ð1Ð1Ø�‘”ˆˆøÝð ð ð Øˆ	ˆ	ˆ	ðøøøå)3°F½DÑ)AÔ)AÐ
Iˆ&�*Š*�[ "Ñ
%Ô
%Ð
%Àr€CÝ'1°#µtÑ'<Ô'<ÐD�#—'’'˜$ Ñ#Ô#Ð#À"€KÝ$ [µ$Ñ7Ô7Ð?ˆ;ˆ;¸RÐ?s   † —&¥&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*.Útimeout)r  rJ   r†  rå  Ú	TypeError)rF  rÈ   r  Úraws       r   Ú_get_task_timeoutr  ”
  sm   € àð ØˆÝ,¨TÑ2Ô2€KØ
�/Š/˜)Ñ
$Ô
$€CØ
€ð	Ý˜‘:”:ÐøÝ�IÐ&ð 	ð 	ð 	ØˆDð	øøøà€Ns   ¬; »AÁAc                 ó–   — t          | ¦  «        }|                     d¦  «        }t          |t          ¦  «        rt          |¦  «        S i S )zFRead auxiliary.<task>.extra_body and return a shallow copy when valid.Ú
extra_body)r  rJ   rr   r¡   )rF  r  r  s      r   Ú_get_task_extra_bodyr  ¢
  sC   € å,¨TÑ2Ô2€KØ
�/Š/˜,Ñ
'Ô
'€CÝ�#•tÑÔð Ý�C‰yŒyÐØ€Ir    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.
    Tr   r�   )Ú_ANTHROPIC_COMPAT_PROVIDERSrE   )r9   rW   Ú	url_lowers      r   Ú_is_anthropic_compat_endpointr  ´
  s5   € ð Õ.Ð.Ð.ØˆtØ�˜R×&Ò&Ñ(Ô(€IØ˜9Ð$Ð$r    r²   c           	      óð  — g }| D �]o}|                      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}Œð|                     |¦  «         �Œ|                     |ri |¥d|i¥n|¦  «         �Œq|S )zÑConvert OpenAI ``image_url`` content blocks to Anthropic ``image`` blocks.

    Only touches messages that have list-type content with ``image_url`` blocks;
    plain text messages pass through unchanged.
    r—   Fr™   r�   r   r   zdata:Ú,z	image/pngr>   ú;r?   r   Úimagert   )r™   Ú
media_typerj  )r™   rb  )r™   r   T)rJ   rr   r    r¢   rF   Ú	partitionrG   )r²   r£   rã   r—   Únew_contentÚchangedÚblockÚimage_url_valÚheaderr×  Úb64datar"  s               r   Ú#_convert_openai_images_to_anthropicr*  À
  sè  € ð €IØð $Nñ $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ð#ð #ð(ð (ñ ô ð ð ��à×"Ò" 5Ñ)Ô)Ð)Ñ)Ø×Ò¸GÐLÐ8˜CÐ8 ¨KÐ8Ð8Ð8ÈÑMÔMÐMÑMØÐr    r/  r-  r¹   r  r  c	                 ó®  — |||dœ}	t          ||¦  «        }
|
t          u rd}n|
�|
}|�ddlm}  ||¦  «        rd}|�||	d<   |�:| dk    r/|pt	          ¦   «         }t          |¦  «        dk    r||	d<   n||	d	<   n||	d	<   |r||	d
<   t          |pi ¦  «        }| dk    st          r*|                     dg ¦  «         	                    dg¦  «         |r||	d<   |	S )zLBuild kwargs for .chat.completions.create() with model/provider adjustments.)rP   r²   r  Nr   r3  r/  r@   r}  r.  r-  r¹   rZ  rf   rg   r  )
r[   rO   r8  r4  rØ  r   r¡   rh   Ú
setdefaultÚextend)r9   rP   r²   r/  r-  r¹   r  r  rW   rá   Úfixed_temperaturer4  rÒ  Úmerged_extras                 r   Ú_build_call_kwargsr0  ð
  s]  € ð ØØðð €Fõ 5°U¸HÑEÔEÐØÕ,Ð,Ð,ØˆˆØ	Ð	&Ø'ˆð ÐØDÐDÐDÐDÐDÐDØ#Ð# EÑ*Ô*ð 	ØˆKàÐØ +ˆˆ}ÑàÐð �xÒÐØ"Ð@Õ&>Ñ&@Ô&@ˆKÝ  Ñ-Ô-Ð1AÒAÐAØ2<�Ð.Ñ/Ð/à'1��|Ñ$Ð$à#-ˆF�<Ñ àð  Øˆˆw‰õ ˜
Ð( bÑ)Ô)€LØ�6ÒÐÕ.ÐØ×Ò ¨Ñ+Ô+×2Ò2Ð4JÐ3KÑLÔLÐLØð ,Ø+ˆˆ|Ñà€Mr    r?  c           
      ó`  — | €t          d|pd› d�¦  «        ‚	 | j        }|rt          |d         d¦  «        st          d¦  «        ‚nf# t          t          t
          f$ rL}t          | ¦  «        j        }t          | ¦  «        dd…         }t          d|pd› d	|› d
|›d�¦  «        |‚d}~ww xY w| S )a3  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.
    Nz
Auxiliary rM  z: LLM returned None responser   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.)	ræ  rÜ   r;  rç  r  Ú
IndexErrorr™   r÷   rs   )r?  rF  rÜ   rŠ   Úresponse_typeÚresponse_previews         r   Ú_validate_llm_responser6  -  s  € ð ÐÝØE˜˜ ÐEÐEÐEñ
ô 
ð 	
ð
ØÔ"ˆØð 	?�g g¨a¤j°)Ñ<Ô<ð 	?Ý Ð!=Ñ>Ô>Ð>ð	?øå�I¥zÐ2ð ð ð Ý˜X™œÔ/ˆÝ˜x™=œ=¨¨#¨Ô.ÐÝð9˜˜ ð 9ð 9Ø"ð9ð 9Ø'7ð9ð 9ð 9ñ
ô 
ð
 ð	øøøøðøøøð €Os   ™.A ÁB+ÁAB&Â&B+)
r9   rP   rW   r  r  r/  r-  r¹   r  r  c                ó  — t          | ||||¦  «        \  }}}}}t          | ¦  «        }|                     |pi ¦  «         | dk    r~t          |dk    r|n||p||p||p|d¬¦  «        \  }}}|€9|dk    r3|s1t                               d|¦  «         t          d|d¬¦  «        \  }}}|€t          d| › d	|› d
�¦  «        ‚|p|}n¼t          ||||||¬¦  «        \  }}|€Š|pd                     ¦   «          	                    ¦   «         }|r,|dvr(t          d|› d| 
                    ¦   «         › d�¦  «        ‚|s2t                               d| pd|¦  «         t          d|¬¦  «        \  }}|€t          d| › d	|› d
�¦  «        ‚|
�|
nt          | ¦  «        }t          t          |d|¦  «        pd¦  «        }| r-t                               d| |pd|pd|r	d|vrd|› �nd¦  «         t          ||||||	|||p|¬¦	  «	        }t          t          |dd¦  «        pd¦  «        }t!          ||¦  «        rt#          |d         ¦  «        |d<   	 t%           |j        j        j        d,i |¤Ž| ¦  «        S # t,          $ �r}d|v rÜt/          |¦  «        rÍt1          |¦  «        }|                     dd¦  «         t                               d| pd¦  «         	 t%           |j        j        j        d,i |¤Ž| ¦  «        cY d}~S # t,          $ rS}t          |¦  «        }t5          |¦  «        s't7          |¦  «        st9          |¦  «        s	d|v sd|v s‚ |}|}Y d}~nd}~ww xY wt          |¦  «        }|�–d|v sd|v st;          |d¦  «        r~|                     dd¦  «         ||d<   	 t%           |j        j        j        d,i |¤Ž| ¦  «        cY d}~S # t,          $ r+}t5          |¦  «        st7          |¦  «        s‚ |}Y d}~nd}~ww xY w|d k    pt=          |d!¦  «        }t9          |¦  «        r†|r„t?          |pd |d||||¬"¦  «        \  } }!| �gt                               d#| pd¦  «         |!r|!|                      d$¦  «        k    r|!|d$<   t%           | j        j        j        d,i |¤Ž| ¦  «        cY d}~S t9          |¦  «        rù|d%vrõ|sótC          |¦  «        rät                               d&| pd|¦  «         | dk    rt          ||d¬¦  «        d'd…         nt          ||||||¬¦  «        \  }"}#|"�Œt          ||#p|||||	|||¬¦	  «	        }t          t          |"dd¦  «        pd¦  «        }$t!          ||$¦  «        rt#          |d         ¦  «        |d<   t%           |"j        j        j        d,i |¤Ž| ¦  «        cY d}~S t5          |¦  «        pt7          |¦  «        }%|d%v }&|%r­|&r«t5          |¦  «        rd(nd)}'t                               d*| pd|'||¦  «         tE          || |'¬+¦  «        \  }(})}*|(�`t          |*|)||||	||t          t          |(dd¦  «        pd¦  «        ¬¦	  «	        }+t%           |(j        j        j        d,i |+¤Ž| ¦  «        cY d}~S ‚ d}~ww xY w)-a  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.
        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.

    Returns:
        Response object with .choices[0].message.content

    Raises:
        RuntimeError: If no provider is configured.
    r³  r<   F©r9   rP   rW   r  rw  NúDVision provider %s unavailable, falling back to auto vision backends©r9   rP   rw  ú$No LLM provider configured for task=ú
 provider=ú. Run: hermes setuprË  r   ©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 chainrM  r„  rW   zAuxiliary %s: using %s (%s)%srÈ   rª  z at ©r/  r-  r¹   r  r  rW   r²   r/  zEAuxiliary %s: provider rejected temperature; retrying once without itr-  r/  r.  rZ  úinference-api.nousresearch.com)r×  rP   rw  rW   r  rÌ  r  zDAuxiliary %s: refreshed Nous runtime credentials after 401, retryingrP   ©r<   r   NzAAuxiliary %s: refreshed %s credentials after auth error, retryingr?   rD  úconnection errorz,Auxiliary %s: %s on %s (%s), trying fallback©rG  r   )#r§  r  r•  rÄ  rY   rö  ræ  r½  rD   rE   ÚupperrP  r  rs   r�   r0  r  r*  r6  r  r   rö   ry   r3  r¡   r:  r  r'  r*  r1  r   rß  rJ   rC  rX  ),rF  r9   rP   rW   r  r  r²   r/  r-  r¹   r  r  re  r»  r¾  r¿  rÀ  Úeffective_extra_bodyÚeffective_providerr<  r—  Ú	_explicitÚeffective_timeoutÚ
_base_inforá   Ú_client_baseÚ	first_errÚretry_kwargsÚ	retry_errÚretry_err_strÚerr_strÚclient_is_nousÚrefreshed_clientÚrefreshed_modelÚretry_clientÚretry_modelÚ_retry_baseÚshould_fallbackÚis_autorG  Ú	fb_clientÚfb_modelÚfb_labelÚ	fb_kwargss,                                               r   Úcall_llmr`  L  s&
  € õN a}Øˆ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Ý"ðX ð Xð XØ*3¯/ª/Ñ*;Ô*;ðXð Xð Xñô ð ð %ð \Ý—’Ð`Ø ˜N FÐ,=ñ?ô ?ð ?å&8¸ÈlÐ&[Ñ&[Ô&[Ñ#�˜Øˆ>Ýð%°tð %ð %ÐGXð %ð %ð %ñ&ô &ð &ð $+Ð#6˜˜Õ<MÈdÑ<SÔ<SÐõ •W˜V ZÐ1BÑCÔCÐIÀrÑJÔJ€JØð cÝ�ŠÐ3ØÐ,Ð6°¸Ð8PÀyØ,6Ða¸<ÈzÐ;YÐ;YÐ(˜JÐ(Ð(Ð(Ð_añ	cô 	cð 	cõ  Ø˜;¨Ø¨JØÐ.Ð;OØÐ0Ð0ð	2ñ 2ô 2€Fõ •w˜v z°2Ñ6Ô6Ð<¸"Ñ=Ô=€LÝ$Ð%6¸ÑEÔEð UÝ@ÀÈ
ÔASÑTÔTˆˆzÑðSÝ%Ø*ˆFŒKÔ#Ô*Ð4Ð4¨VÐ4Ð4°dñ<ô <ð 	<øåð Pñ Pð PØ˜FÐ"Ð"Õ'HÈÑ'SÔ'SÐ"Ý ™<œ<ˆLØ×Ò˜]¨DÑ1Ô1Ð1Ý�KŠKØWØ�˜ñô ð ð&Ý-Ø2�F”KÔ+Ô2ÐBÐB°\ÐBÐBÀDñJô Jð Jð Jð Jð Jð Jð Jøåð &ð &ð &Ý # I¡¤�õ & iÑ0Ô0ðå+¨IÑ6Ô6ðõ & iÑ0Ô0ðð $ }Ð4Ð4Ø.°-Ð?Ð?àØ%�	Ø%������øøøøð&øøøõ" �i‘.”.ˆØÐ!Ø˜GÐ#Ð#Ø&¨'Ð1Ð1Ý.¨y¸,ÑGÔGð 2ð �JŠJ�| TÑ*Ô*Ð*Ø.8ˆFÐ*Ñ+ð&Ý-Ø2�F”KÔ+Ô2Ð<Ð<°VÐ<Ð<¸dñDô Dð Dð Dð Dð Dð Dð Døåð &ð &ð &õ *¨)Ñ4Ô4ð Õ8LÈYÑ8WÔ8Wð ØØ%�	�	�	�	�	�	øøøøð&øøøð  Ò'ð SÝ$ ZÐ1QÑRÔRð 	õ ˜)Ñ$Ô$ð 	N¨ð 	NÝ0NØ0Ð:°FØ!Ø Ø*Ø(Ø*Ø)ð1ñ 1ô 1Ñ-Ð˜oð  Ð+Ý—’ÐbØ ˜N Fñ,ô ,ð ,à"ð 6 ¸&¿*º*ÀWÑ:MÔ:MÒ'MÐ'MØ&5�F˜7‘OÝ-Ø<Ð$Ô)Ô5Ô<ÐFÐF¸vÐFÐFÈñNô Nð Nð Nð Nð Nð Nð Nõ ˜9Ñ%Ô%ð (	TØ%Ð-?Ð?Ð?Ø&ð @å,Ð->Ñ?Ô?ð %TÝ—’ØWØ�N˜FÐ$5ñô ð ð ˜xÒ'Ð'õ 3Ø!2Ø)Ø#(ðñ ô ð �b�bô	ð õ ,Ø)Ø&Ø!2Ø 0Ø!2Ø%1ðñ ô ñ *�˜kð   Ð+Ý#5Ø)Ø#Ð2 {Ø Ø$/Ø#-Ø#Ø 1Ø#7Ø!2ð
$ñ 
$ô 
$�Lõ #&¥g¨l¸JÈÑ&KÔ&KÐ&QÈrÑ"RÔ"R�KÝ4Ð5FÈÑTÔTð qÝ3VÐWcÐdnÔWoÑ3pÔ3p˜ ZÑ0Ý1Ø<˜Ô)Ô5Ô<ÐLÐL¸|ÐLÐLÈdñTô Tð Tð Tð Tð Tð Tð Tõ ,¨IÑ6Ô6ÐYÕ:NÈyÑ:YÔ:Yˆð $Ð'9Ð9ˆØð 	J˜wð 	JÝ(9¸)Ñ(DÔ(DÐ\�_�_ÐJ\ˆFÝ�KŠKÐFØ˜ ¨Ð0AÀ9ñNô Nð Nå,AØ! 4°ð-8ñ -8ô -8Ñ)ˆI�x àÐ$Ý.Ø˜h¨Ø +¸
ØÐ):Ø3Ý ¥¨°JÀÑ!CÔ!CÐ!IÀrÑJÔJðLñ Lô L�	õ .Ø5�I”NÔ.Ô5ÐBÐB¸	ÐBÐBÀDñJô Jð Jð Jð Jð Jð Jð JàøøøøðaPøøøs–   É$I* É*ZÉ5AZË$K5Ë/ZË5
MË?A	MÍZÍMÍAZÎ$OÎ>ZÏ
O9Ï!O4Ï/ZÏ4O9Ï9B(ZÒ!ZÒ'DZÖ)ZÖ/CZÙ:ZÚ ZÚZc                 ó’  — ddl }| j        d         j        }|j        pd                     ¦   «         }|r<|                     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, Novita, etc.).
      3. ``message.reasoning_details`` â€” OpenRouter unified array format.

    Returns the best available text, or ``""`` if nothing found.
    r   Nr   zz<(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>.*?</(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>)Úflags)r7  Úreasoning_contentÚreasoning_detailsÚsummaryr—   rš   z

)ÚrerÜ   rÂ   r—   rD   ÚsubÚDOTALLÚ
IGNORECASEr�   rr   rs   r¢   r    r¡   rJ   rà   )r?  rf  rã   r—   ÚcleanedÚreasoning_partsr  rÊ   ÚdetailsrŸ   re  s              r   Úextract_content_or_reasoningrm  a  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    )	r9   rP   rW   r  r/  r-  r¹   r  r  c       
      ƒ   ó"  K  — t          | ||||¦  «        \  }}}}}t          | ¦  «        }|                     |
pi ¦  «         | dk    r~t          |dk    r|n||p||p||p|d¬¦  «        \  }}}|€9|dk    r3|s1t                               d|¦  «         t          d|d¬¦  «        \  }}}|€t          d| › d	|› d
�¦  «        ‚|p|}n¼t          ||d|||¬¦  «        \  }}|€Š|pd                     ¦   «          	                    ¦   «         }|r,|dvr(t          d|› d| 
                    ¦   «         › d�¦  «        ‚|s2t                               d| pd|¦  «         t          dd¬¦  «        \  }}|€t          d| › d	|› d
�¦  «        ‚|	�|	nt          | ¦  «        }t          t          |dd¦  «        pd¦  «        }t          |||||||||p|¬¦	  «	        }t!          ||¦  «        rt#          |d         ¦  «        |d<   	 t%           |j        j        j        d'i |¤Žƒ d{V —†| ¦  «        S # t,          $ �r`}d|v rât/          |¦  «        rÓt1          |¦  «        }|                     dd¦  «         t                               d| pd¦  «         	 t%           |j        j        j        d'i |¤Žƒ d{V —†| ¦  «        cY d}~S # t,          $ rS}t          |¦  «        }t5          |¦  «        s't7          |¦  «        st9          |¦  «        s	d|v sd|v s‚ |}|}Y d}~nd}~ww xY wt          |¦  «        }|�œd|v sd|v st;          |d¦  «        r„|                     dd¦  «         ||d<   	 t%           |j        j        j        d'i |¤Žƒ d{V —†| ¦  «        cY d}~S # t,          $ r+}t5          |¦  «        st7          |¦  «        s‚ |}Y d}~nd}~ww xY w|dk    pt=          |d¦  «        }t9          |¦  «        r‹|r‰t?          |pd|d|||¬¦  «        \  }}|�mt                               d| pd¦  «         |r||                      d ¦  «        k    r||d <   t%           |j        j        j        d'i |¤Žƒ d{V —†| ¦  «        cY d}~S t9          |¦  «        rü|d!vrø|sötC          |¦  «        rçt                               d"| pd|¦  «         | dk    rt          ||d¬¦  «        \  } }!}"nt          ||d|||¬¦  «        \  }!}"|!�’t          ||"p||||||||¬¦	  «	        }t          t          |!dd¦  «        pd¦  «        }#t!          ||#¦  «        rt#          |d         ¦  «        |d<   t%           |!j        j        j        d'i |¤Žƒ d{V —†| ¦  «        cY d}~S t5          |¦  «        pt7          |¦  «        }$|d!v }%|$rè|%ræt5          |¦  «        rd#nd$}&t                               d%| pd|&||¦  «         tE          || |&¬&¦  «        \  }'}(})|'�›t          |)|(||||||t          t          |'dd¦  «        pd¦  «        ¬¦	  «	        }*tG          |'|(pd¦  «        \  }+},|,r|,|*                      d ¦  «        k    r|,|*d <   t%           |+j        j        j        d'i |*¤Žƒ d{V —†| ¦  «        cY d}~S ‚ d}~ww xY w)(zqCentralized asynchronous LLM call.

    Same as call_llm() but async. See call_llm() for full documentation.
    r³  r<   Tr8  Nr9  r:  r;  r<  r=  )rw  rW   r  rÌ  r   r>  r?  r@  rA  rB  rM  )rw  rW   rC  r²   r/  zMAuxiliary %s (async): provider rejected temperature; retrying once without itr-  r/  r.  rZ  rD  )r×  rP   rw  rW   r  rÌ  zLAuxiliary %s (async): refreshed Nous runtime credentials after 401, retryingrP   rE  zIAuxiliary %s (async): refreshed %s credentials after auth error, retryingrD  rF  z4Auxiliary %s (async): %s on %s (%s), trying fallbackrG  r   )$r§  r  r•  rÄ  rY   rö  ræ  r½  rD   rE   rH  rP  r  rs   r�   r0  r  r*  r6  r  r   rö   ry   r3  r¡   r:  r  r'  r*  r1  r   rß  rJ   rC  rX  rq  )-rF  r9   rP   rW   r  r²   r/  r-  r¹   r  r  re  r»  r¾  r¿  rÀ  rI  rJ  r<  r—  rK  rL  rN  rá   rO  rP  rQ  rR  rS  rT  rU  rV  r×  rW  rX  rY  rZ  r[  rG  r\  r]  r^  r_  Úasync_fbÚasync_fb_models-                                                r   Úasync_call_llmrq  ™  sM
  è è € õ$ a}Øˆ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Ý"ðX ð Xð XØ*3¯/ª/Ñ*;Ô*;ðXð Xð Xñô ð ð
 %ð RÝ—’Ð`Ø ˜N FÐ,=ñ?ô ?ð ?å&8¸ÈDÐ&QÑ&QÔ&QÑ#�˜Øˆ>Ýð%°tð %ð %ÐGXð %ð %ð %ñ&ô &ð &ð $+Ð#6˜˜Õ<MÈdÑ<SÔ<SÐõ
 •w˜v z°2Ñ6Ô6Ð<¸"Ñ=Ô=€LÝØ˜;¨Ø¨JØÐ.Ð;OØÐ2Ð!2ð	4ñ 4ô 4€Fõ %Ð%6¸ÑEÔEð UÝ@ÀÈ
ÔASÑTÔTˆˆzÑðCÝ%Ø0�&”+Ô)Ô0Ð:Ð:°6Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:¸DñBô Bð 	Bøåð @ñ @ð @Ø˜FÐ"Ð"Õ'HÈÑ'SÔ'SÐ"Ý ™<œ<ˆLØ×Ò˜]¨DÑ1Ô1Ð1Ý�KŠKØ_Ø�˜ñô ð ð&Ý-Ø8˜&œ+Ô1Ô8ÐHÐH¸<ÐHÐHÐHÐHÐHÐHÐHÐHÈ$ñPô Pð Pð Pð Pð Pð Pð Pøåð &ð &ð &Ý # I¡¤�å% iÑ0Ô0ðå+¨IÑ6Ô6ðõ & iÑ0Ô0ðð $ }Ð4Ð4Ø.°-Ð?Ð?àØ%�	Ø%������øøøøð&øøøõ �i‘.”.ˆØÐ!Ø˜GÐ#Ð#Ø&¨'Ð1Ð1Ý.¨y¸,ÑGÔGð 2ð �JŠJ�| TÑ*Ô*Ð*Ø.8ˆFÐ*Ñ+ð&Ý-Ø8˜&œ+Ô1Ô8ÐBÐB¸6ÐBÐBÐBÐBÐBÐBÐBÐBÀDñJô Jð Jð Jð Jð Jð Jð Jøåð &ð &ð &õ *¨)Ñ4Ô4ð Õ8LÈYÑ8WÔ8Wð ØØ%�	�	�	�	�	�	øøøøð&øøøð  Ò'ð UÝ$ \Ð3SÑTÔTð 	õ ˜)Ñ$Ô$ð 	T¨ð 	TÝ0NØ0Ð:°FØ!ØØ*Ø(Ø*ð1ñ 1ô 1Ñ-Ð˜oð  Ð+Ý—’ÐjØ ˜N Fñ,ô ,ð ,à"ð 6 ¸&¿*º*ÀWÑ:MÔ:MÒ'MÐ'MØ&5�F˜7‘OÝ-ØBÐ*Ô/Ô;ÔBÐLÐLÀVÐLÐLÐLÐLÐLÐLÐLÐLÈdñTô Tð Tð Tð Tð Tð Tð Tõ ˜9Ñ%Ô%ð '	ZØ%Ð-?Ð?Ð?Ø&ð @å,Ð->Ñ?Ô?ð $ZÝ—’Ø_Ø�N˜FÐ$5ñô ð ð ˜8Ò#Ð#Ý3QØ!2Ø)Ø#'ð4ñ 4ô 4Ñ0�A�| [ [õ 1CØ)Ø&Ø#'Ø!2Ø 0Ø!2ð1ñ 1ô 1Ñ-�L +ð  Ð+Ý#5Ø)Ø#Ð2 {Ø Ø$/Ø#-Ø#Ø 1Ø#7Ø!2ð
$ñ 
$ô 
$�Lõ #&¥g¨l¸JÈÑ&KÔ&KÐ&QÈrÑ"RÔ"R�KÝ4Ð5FÈÑTÔTð qÝ3VÐWcÐdnÔWoÑ3pÔ3p˜ ZÑ0Ý1ØB˜lÔ/Ô;ÔBÐRÐRÀ\ÐRÐRÐRÐRÐRÐRÐRÐRÐTXñZô Zð Zð Zð Zð Zð Zð Zõ ,¨IÑ6Ô6ÐYÕ:NÈyÑ:YÔ:YˆØ#Ð'9Ð9ˆØð 	O˜wð 	OÝ(9¸)Ñ(DÔ(DÐ\�_�_ÐJ\ˆFÝ�KŠKÐNØ˜ ¨Ð0AÀ9ñNô Nð Nå,AØ! 4°ð-8ñ -8ô -8Ñ)ˆI�x àÐ$Ý.Ø˜h¨Ø +¸
ØÐ):Ø3Ý ¥¨°JÀÑ!CÔ!CÐ!IÀrÑJÔJðLñ Lô L�	õ ,<¸IÀxÀ~ÐSUÑ+VÔ+VÑ(�˜.Ø!ð 8 n¸	¿ºÀgÑ8NÔ8NÒ&NÐ&NØ)7�I˜gÑ&Ý-Ø:˜(œ-Ô3Ô:ÐGÐG¸YÐGÐGÐGÐGÐGÐGÐGÐGÈñOô Oð Oð Oð Oð Oð Oð OàøøøøðA@øøøs–   Ç8*H# È#ZÈ.AZ	Ê*J4Ê.ZÊ4
LÊ>A	LÌZ	ÌLÌAZ	Í*N	ÎZÎ	
N>Î!N9Î4Z	Î9N>Î>B-Z	Ñ+ZÑ1DZ	Õ6ZÕ<DZ	ÚZÚZ	Ú	Zr¬   r’  rC  )r:   N)NrD  )NFFNNNNr”  )NFNNNN)NNNNN)NNNr  NN)žrú   rv   Úloggingrr  Ú	threadingr�  Úpathlibr   Útypesr   Útypingr   r   r   r   r	   rá  r
   r   r   r&  r   Úagent.credential_poolr   rÁ  r   Úhermes_constantsr   Úutilsr   r   r   Ú	getLoggerr÷   rY   rs   r&   r]  rI   rN   ÚobjectrO   Ú__annotations__rD  rV   r[   r`   rb   r­  Ú
hermes_clird   Ú_HERMES_VERSIONÚ_AI_GATEWAY_HEADERSrÆ  rh   r®  r¹  re  r  rf  rü  rõ  r   r…   r‹   r‘   r–   r§   r©   rü   r  r  r  r  r%  rF  rI  rP  rT  rW  r¡   rk  ro  rt  rÎ  rˆ  r�  r¨  r°  r²  r½  rÄ  rH   rÕ  rØ  rè  rí  rú  rþ  r¢  Ú_AUTO_PROVIDER_LABELSr
  r  r  ry   r  r'  r*  r1  r3  r=  rC  rX  rg  rq  rv  r^  r©  r«  r³  r­  r¯  r±  r¶  rÄ  rÇ  r…  rÉ  r8  ÚLockr7  rÿ  rÐ  rÖ  rß  rè  r9  rô  rø  rú  rý  r½  r§  Ú_DEFAULT_AUX_TIMEOUTr  r†  r  r  Ú	frozensetr  r  r    r*  r0  r6  r`  rm  rq  r   r    r   ú<module>r„     s¦  ðð"ð "ð "ðH €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +Ø -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ Tà	ˆÔ	˜8Ñ	$Ô	$€ð 3ð ð ð ð ð Ð ðØˆhðà�Xðð ˜ðð ˆEð	ð
 ˆEðð ˆEðð 
ˆ5ðð ˆEðð ˆEðð ˆUðð ˆMðð �ðð Ððð Ð#ðð �\ðð  �,ð!ð" ˆkð#ð$ ØØØØØ'Ø&ð1ð ð Ð ð89 h¨s¤mð 9¸ð 9ð 9ð 9ð 9ð2 "˜6™8œ8Ð �&Ð #Ð #Ñ #ð6˜( 3œ-ð 6¨Dð 6ð 6ð 6ð 6ð #ðð Ø�CŒ=ðà�sŒmðð  ðð ð ð ð* 'ØØ*ØØ-ØØ Ø,Ø)Ø$ØØ/Ø)ð0ð 0Ð ˜d 3¨ 8œnð ð ñ ð* Øð+ð +Ð ˜˜c 3˜hœð ð ñ ð <Ø(Ø7ðð €ð 6Ð 5Ð 5Ð 5Ð 5Ð 5ð <ØØ2 Ð2Ð2ðð Ð ð Ð2Ð3Ð4€ð  Ð �4Ð Ð Ñ ð 4Ð Ø-€ØDÐ Ø9Ð Ø!�/Ñ#Ô# kÑ1€ð #Ð Ø=Ð ð$¨Cð $°D¸¸c¸´Nð $ð $ð $ð $ðN #ð ¨#ð ð ð ð ð" ð ¨¨t°X¸c´]Ð/BÔ)Cð ð ð ð ð " ð "¨ð "ð "ð "ð "ð.ð . #ð .°ð .¸cð .ð .ð .ð .ð(-¨Cð -°Cð -ð -ð -ð -ð``
ð `
ð `
ð `
ð `
ñ `
ô `
ð `
ðF#ð #ð #ð #ð #ñ #ô #ð #ð"ð "ð "ð "ð "ñ "ô "ð "ð$Dð Dð Dð Dð Dñ Dô Dð Dð#ð #ð #ð #ð #ñ #ô #ð #ð
.ð .ð .ð .ð .ñ .ô .ð .ðQ
ð Q
ð Q
ð Q
ð Q
ñ Q
ô Q
ð Q
ðh#ð #ð #ð #ð #ñ #ô #ð #ð
ð ð ð ð ñ ô ð ð Dð Dð Dð Dð Dñ Dô Dð Dð#ð #ð #ð #ð #ñ #ô #ð #ð
.ð .ð .ð .ð .ñ .ô .ð .ð#˜ $œð #ð #ð #ð #ðLI˜Dð I Sð Ið Ið Ið Ið
H˜ð Hð Hð Hð Hð
 8=ð ð ð °ð ÀÈ%ÐPSÐUXÐPXÌ/ÔAZð ð ð ð ð6( (¨3¤-ð (ð (ð (ð (ðVP 5¨°&Ô)9¸8ÀC¼=Ð)HÔ#Ið Pð Pð Pð PðnC˜˜x¨Ô/°¸#´Ð>Ô?ð Cð Cð Cð Cð&
4¨#ð 
4ð 
4ð 
4ð 
4ð?ð ?�dð ? u¨X°fÔ-=¸xÈ¼}Ð-LÔ'Mð ?ð ?ð ?ð ?ðD˜#ð ð ð ð ð*˜Sð ð ð ð ð&/8  x°¤}°h¸s´mÀXÈcÄ]Ð'RÔ!Sð /8ð /8ð /8ð /8ðd #ð ð ð ð ð
ð ð ð ð: ð ¨ð ð ð ð ð$#M˜e H¨S¤M°8¸C´=Ð$@ÔAð #Mð #Mð #Mð #MðLQ�E˜( 3œ-¨°#¬Ð6Ô7ð Qð Qð Qð Qð2-c˜˜h sœm¨X°c¬]Ð:Ô;ð -cð -cð -cð -cðb $ØØ*Ø Ø!*ðð Ð ð PÐ ð¨(°4¸¸S¸´>Ô*Bð ÀtÈCÐQTÈHÄ~ð ð ð ð ð˜T %œ[ð ð ð ð ð˜9ð ¨ð ð ð ð ð(˜ið ¨Dð ð ð ð ð4a˜	ð a dð að að að að¨ð ¸3ð À4ð ð ð ð ðD?¨9ð ?¸ð ?ð ?ð ?ð ?ð) Cð )¨Dð )ð )ð )ð )ð*&¨Cð &°Dð &ð &ð &ð &ðV Ø!ð,ð ,Øð,à
ð,ð ð,ð ˆ8�CŒ=˜( 3œ-¨Ð,Ô-ð	,ð ,ð ,ð ,ð^Xð X ¨¨c°3¨h¬Ô 8ð XÀEÈ(ÐSYÔJZÐ\dÐehÔ\iÐJiÔDjð Xð Xð Xð XðL#.¨ð #.ð #.ð #.ð #.ðL	¨(°3¬-ð 	À3ð 	È8ÐTWÌ=ð 	ð 	ð 	ð 	ð ØØØ!Ø ØØ-1ðrð rØðràðrð ðrð ð	rð
 ðrð ðrð ðrð ˜4  S œ>Ô*ðrð ˆ8�CŒ=˜( 3œ-Ð'Ô(ðrð rð rð rðp ðð .2ðð ð Ø
ðð ˜4  S œ>Ô*ðð ˆ8�FÔ˜X cœ]Ð*Ô+ð	ð ð ð ð2Ð`dð ð ð ¨#ð ÀXÈdÐSVÐX[ÐS[ÌnÔE]ð ð ð ð ð&Ð ð-¨°#¬ð -¸3ð -ð -ð -ð -ð¨Sð °U¸8ÀC¼=È(ÐSVÌ-Ð;WÔ5Xð ð ð ð ðC¨sð C°tð Cð Cð Cð Cð t¨C¤yð ð ð ð ð4 #Øðb*ð #Ø!Øðb*ð b*ð b*Ø�sŒmðb*à�CŒ=ðb*ð �sŒmð	b*ð
 �cŒ]ðb*ð ðb*ð ˆ8�CŒ=˜( 3œ-¨°#¬Ð6Ô7ðb*ð b*ð b*ð b*ðJ> $ð >ð >ð >ð >ð! cð !¨dð !ð !ð !ð !ðH %'€ˆt�E˜5�LÔ!Ð &Ð &Ñ &Ø#�Y”^Ñ%Ô%Ð ØÐ ð #Ø!Ø"Ø-1ð^ð ^ð ^Øð^ð ð^ð �sŒmð	^ð
 �cŒ]ð^ð �sŒmð^ð ˜4  S œ>Ô*ð^ð ð^ð ^ð ^ð ^ð 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œ-Ð'Ô(ð'ð 'ð 'ð 'ðTð ð ð ðB Sð ¨Tð ð ð ð ð(ð ð ð ð6#ð #ð #ð #ð& #ð ¨$ð ð ð ð ð#˜#ð # h¨s¤mð #ÀXÈcÄ]ð #ÐW_Ð`cÔWdð #ð #ð #ð #ð ØØØØØ-1ð[*ð [*Øð[*àð[*ð ð[*ð ð	[*ð
 ð[*ð ð[*ð ˜4  S œ>Ô*ð[*ð ˆ8�CŒ=˜( 3œ-Ð'Ô(ð[*ð [*ð [*ð [*ð~ ØØØØð2Að 2AØ
ð2Aàð2Að ð2Að ð	2Að
 ð2Að ˆ3�˜”˜x¨œ}¨h°s¬m¸XÀc¼]ÐJÔKð2Að 2Að 2Að 2Aðj Ð ð@ Sð @¨T°#°s°(¬^ð @ð @ð @ð @ð 3Gð ð ˜Cð ¨%ð È5ð ð ð ð ð˜sð  t¨C°¨H¤~ð ð ð ð ð (˜i¨°LÐ(AÑBÔBÐ ð	%¨Cð 	%¸3ð 	%À4ð 	%ð 	%ð 	%ð 	%ð,°$ð ,¸4ð ,ð ,ð ,ð ,ðh $(Ø $Ø ØØ!%Ø"ð:ð :Øð:àð:ð ð:ð ˜%”ð	:ð
 ˜”ð:ð �DŒ>ð:ð ð:ð ˜”ð:ð �sŒmð:ð 
ð:ð :ð :ð :ðzð  Sð °ð ¸sð ð ð ð ð@ ðRð ØØØØ-1àØØØØðRð Rð RØ
ðRð ðRð ð	Rð
 ðRð ðRð ˜4  S œ>Ô*ðRð ðRð ðRð ðRð ðRð ðRð ðRð 	ðRð Rð Rð Rðj5¨cð 5ð 5ð 5ð 5ðr ð\ð ØØØàØØØØð\ð \ð \Ø
ð\ð ð\ð ð	\ð
 ð\ð ð\ð ð\ð ð\ð ð\ð ð\ð ð\ð ð\ð 	ð\ð \ð \ð \ð \ð \r    