§
    øžyj½˜ ã                  ó¶  — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ  ej        e¦  «        ZddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. dd
l/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl3m8Z8 ddl9m:Z:m;Z;m<Z< d`dad„Z=dbd„Z>dcd„Z?ddd„Z@ded„ZAd`dfd"„ZBdgd%„ZCdhd&„ZDdid'„ZEdhd(„ZFdjd)„ZGdkdld+„ZHdd,œdmd/„ZIh d0£ZJdnd3„ZKdod4„ZLdpd7„ZMdddd8œdqd>„ZNdkdrd@„ZO	 	 dsdtdD„ZPdudG„ZQdudH„ZRdvdI„ZSdwdJ„ZTdedK„ZUdxdL„ZVddddMœdydO„ZWdodP„ZXdzdR„ZYdddSœd{dV„ZZdddSœd|dW„Z[ddddXœd}dY„Z\ddddXœd~dZ„Z]ddddd[œdd\„Z^d€d_„Z_dS )�zGShared runtime provider resolution for CLI, gateway, cron, and helpers.é    )ÚannotationsN)Úurlparse)ÚAnyÚDictÚOptional)Úauth)ÚCredentialPoolÚPooledCredentialÚ credential_pool_matches_providerÚget_custom_provider_pool_keyÚ	load_pool)Ú
get_secret)ÚACTUAL_LOCAL_NOAUTH_PLACEHOLDERÚ	AuthErrorÚDEFAULT_CODEX_BASE_URLÚDEFAULT_QWEN_BASE_URLÚDEFAULT_XAI_OAUTH_BASE_URLÚPROVIDER_REGISTRYÚ_agent_key_is_usableÚ_nous_inference_env_overrideÚformat_auth_errorÚresolve_providerÚ resolve_nous_runtime_credentialsÚ!resolve_codex_runtime_credentialsÚ%resolve_xai_oauth_runtime_credentialsÚ resolve_qwen_runtime_credentialsÚ$resolve_api_key_provider_credentialsÚ-resolve_external_process_provider_credentialsÚhas_usable_secretÚis_actual_local_base_urlÚnormalize_actual_base_url)Úget_compatible_custom_providersÚload_configÚnormalize_extra_headers)Úcustom_provider_aliasesÚcustom_provider_slug)ÚOPENROUTER_BASE_URL)Úis_official_openai_host)Úbase_url_host_matchesÚbase_url_hostnameÚenv_intÚ ÚnameÚstrÚdefaultÚreturnc                ó.   — t          | |¦  «        }|�|n|S )a±  Profile-scoped replacement for ``os.getenv`` on credential/provider reads.

    Routes through the secret scope (Workstream A): identical to ``os.getenv``
    when multiplexing is off, scope-aware (and fail-closed on an unscoped read)
    when on. Genuinely-global vars are handled inside ``get_secret`` and still
    read ``os.environ``. Keeps the ``(name, default) -> str`` contract every
    call site here already relies on.
    )Ú_get_secret)r-   r/   Úvals      úA/home/ragecks/.hermes/hermes-agent/hermes_cli/runtime_provider.pyÚ_getenvr5   6   s!   € õ �d˜GÑ
$Ô
$€CØ�/ˆ3ˆ3 wÐ.ó    Úvaluec                óv   — |                       ¦   «                              ¦   «                              dd¦  «        S )NÚ Ú-)ÚstripÚlowerÚreplace©r7   s    r4   Ú_normalize_custom_provider_namer?   C   s,   € Ø�;Š;‰=Œ=×ÒÑ Ô ×(Ò(¨¨cÑ2Ô2Ð2r6   ÚhostÚboolc                ó\   — | pd                      ¦   «                              d¦  «        }|dv S )Nr,   ú.>   ú::1ú0.0.0.0Ú	localhostú	127.0.0.1)r<   Úrstrip)r@   Úhs     r4   Ú_loopback_hostnamerJ   G   s1   € Ø	ˆ�×ÒÑÔ×#Ò# CÑ(Ô(€AØÐ<Ð<Ð<r6   Úcfg_base_urlÚcfg_providerc                óD  — |pd                      ¦   «                              ¦   «         }| pd                      ¦   «         }|sdS |dk    rdS 	 ddlm}  ||¦  «        dk    rdS n# t          $ r Y nw xY wt          |d¦  «        rdS t          t          |¦  «        ¦  «        S )uÉ  Decide whether ``model.base_url`` may back bare ``custom`` runtime resolution.

    GitHub #14676: the model picker can select Custom while ``model.provider`` still reflects a
    previous provider. Reject non-loopback URLs unless the YAML provider is already ``custom``
    (or one of the local-server aliases that resolve to ``custom`` â€” ollama, vllm, llamacpp, â€¦),
    so a stale OpenRouter/Z.ai base_url cannot hijack local ``custom`` sessions.
    r,   FÚcustomTr   ©r   úopenrouter.ai)r;   r<   Úhermes_cli.authr   Ú	Exceptionr)   rJ   r*   )rK   rL   Úcfg_provider_normÚbuÚ_resolve_providers        r4   Ú,_config_base_url_trustworthy_for_bare_customrV   L   sà   € ð &Ð+¨×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<ÐØ
Ð
˜"×	#Ò	#Ñ	%Ô	%€BØð ØˆuØ˜HÒ$Ð$Øˆtð
ØIÐIÐIÐIÐIÐIàÐÐ.Ñ/Ô/°8Ò;Ð;Ø�4ð <øåð ð ð Øˆðøøøå˜R Ñ1Ô1ð ØˆuÝÕ/°Ñ3Ô3Ñ4Ô4Ð4s   ÁA$ Á$
A1Á0A1Úbase_urlúOptional[str]c                óª  — | pd                      ¦   «                              ¦   «                              d¦  «        }t          | ¦  «        }|dk    rdS t	          | ¦  «        rdS |dk    rdS |dk    rdS t          |¦  «        j                             d¦  «        }|                     d¦  «        s|                     d	¦  «        rdS |d
k    rd|v rdS dS )u^  Auto-detect api_mode from the resolved base URL.

    - Direct api.openai.com endpoints need the Responses API for GPT-5.x
      tool calls with reasoning (chat/completions returns 400).
    - Direct api.anthropic.com endpoints must use the native Messages
      API (``/v1/messages``).  Anthropic also exposes an OpenAI-compat
      ``/chat/completions`` shim on the same host, but Pro/Max OAuth
      subscriptions are only billed against the native Messages route;
      hitting the shim accounts against a separate "extra usage" pool
      that is empty by default and surfaces as HTTP 400 "You're out of
      extra usage."  See issue #32243.
    - Third-party Anthropic-compatible gateways (MiniMax, Zhipu GLM,
      LiteLLM proxies, etc.) conventionally expose the native Anthropic
      protocol under a ``/anthropic`` suffix â€” treat those as
      ``anthropic_messages`` transport instead of the default
      ``chat_completions``.
    - Kimi Code's ``api.kimi.com/coding`` endpoint also speaks the
      Anthropic Messages protocol (the /coding route accepts Claude
      Code's native request shape).
    r,   ú/zapi.x.aiÚcodex_responseszapi.actual.incúapi.anthropic.comÚanthropic_messagesz
/anthropicz/anthropic/v1zapi.kimi.comz/codingN)r;   r<   rH   r*   r(   r   ÚpathÚendswith)rW   Ú
normalizedÚhostnamer^   s       r4   Ú_detect_api_mode_for_urlrb   j   sú   € ð* �.˜b×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1×8Ò8¸Ñ=Ô=€JÝ  Ñ*Ô*€HØ�:ÒÐØ Ð õ
 ˜xÑ(Ô(ð !Ø Ð ØÐ#Ò#Ð#Ø Ð ð
 Ð&Ò&Ð&Ø#Ð#Ý�JÑÔÔ$×+Ò+¨CÑ0Ô0€DØ‡}‚}�\Ñ"Ô"ð $ d§m¢m°OÑ&DÔ&Dð $Ø#Ð#Ø�>Ò!Ð! i°:Ð&=Ð&=Ø#Ð#Øˆ4r6   ÚproviderÚmodelc                óR   — t          |¦  «        }|r|S ddlm}  || ||¦  «        pdS )u   Resolve api_mode when no explicit/persisted mode applies.

    Precedence: URL detection (host-mandated wire shapes) first, then the
    transport the provider overlay itself declares via
    ``providers.determine_api_mode`` â€” which already handles host mandates,
    dual-wire providers, and the registry transport map â€” and only then the
    ``chat_completions`` default for genuinely unknown providers/endpoints.

    Before this helper the runtime paths consulted URL detection ONLY and
    silently landed reasoning providers on ``chat_completions`` whenever the
    hostname wasn't literally recognized. That is how ``openai-api`` pointed
    at OpenAI's data-residency hosts (``us.api.openai.com``) 400'd on every
    tool-calling turn: the provider declares ``codex_responses`` but the
    declaration was never consulted. Same latent class covered the other
    non-chat overlays (MiniMax family, copilot-acp).
    r   )Údetermine_api_modeÚchat_completions)rb   Úhermes_cli.providersrf   )rc   rW   rd   Údetectedrf   s        r4   Ú_fallback_api_moderj   ™   sK   € õ" (¨Ñ1Ô1€HØð ØˆØ7Ð7Ð7Ð7Ð7Ð7àÐ˜h¨°%Ñ8Ô8ÐNÐ<NÐNr6   Ú	model_cfgúDict[str, Any]c                óÆ   — t          |                      d¦  «        ¦  «        }t          |¦  «        }|dk    r%|dk    rt                               d|pd¦  «         d}|p|pdS )a«  Resolve api_mode for legacy/plain ``provider: custom`` endpoints.

    Custom endpoints should stay conservative by default. Only direct OpenAI/xAI
    URLs imply Responses API automatically; named custom providers can opt in via
    their own ``api_mode`` field. This also prevents a stale persisted
    ``model.api_mode: codex_responses`` from forcing generic relays onto the
    Responses path after upgrades or /reset.
    Úapi_moder[   zMIgnoring persisted custom api_mode=codex_responses for non-OpenAI endpoint %sz	(unknown)Nrg   )Ú_parse_api_modeÚgetrb   ÚloggerÚinfo)rk   rW   Úconfigured_modeÚdetected_modes       r4   Ú_resolve_plain_custom_api_moderu   ²   sz   € õ & i§m¢m°JÑ&?Ô&?Ñ@Ô@€OÝ,¨XÑ6Ô6€MàÐ+Ò+Ð+°ÐARÒ0RÐ0RÝ�ŠØ[ØÐ#˜ñ	
ô 	
ð 	
ð ˆàÐA˜mÐAÐ/AÐAr6   c                ór  — t          | ¦  «        }|sdS t          d„ |                     d¦  «        d         D ¦   «         ¦  «        rdS |dv sd|v rdS d„ |                     d¦  «        D ¦   «         }|r+|d         d	v r!|                     d¦  «         |r
|d         d	v °!t	          |¦  «        d
k     rdS |d         }d                     d„ |D ¦   «         ¦  «                             ¦   «         }|r|d                              ¦   «         sdS |dv rdS |› d�}t          |d¦  «        pd 	                    ¦   «         S )u_  Look up `<VENDOR>_API_KEY` in the env, derived from the base URL host.

    Examples:
        https://api.deepseek.com/v1   â†’ DEEPSEEK_API_KEY
        https://api.groq.com/openai/v1 â†’ GROQ_API_KEY
        https://api.mistral.ai/v1     â†’ MISTRAL_API_KEY
        https://generativelanguage.googleapis.com/v1beta/openai/ â†’ GOOGLEAPIS_API_KEY

    Returns the env value (stripped) or "". Never returns env vars whose names
    are already explicitly checked elsewhere â€” those are handled by their own
    host-gated paths (OPENAI/OPENROUTER/OLLAMA).

    The vendor label is the *registrable* portion of the hostname: strip
    ``api.`` / ``www.`` prefixes, then take the second-to-last label
    (``api.deepseek.com`` â†’ ``deepseek``). Falls back to "" for hostnames
    that don't yield a usable vendor label (IPs, loopback, single-label
    hosts).
    r,   c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Úisdigit©Ú.0Úchs     r4   ú	<genexpr>z(_host_derived_api_key.<locals>.<genexpr>ß   s*   è è € Ð
:Ð
:˜Bˆ2�:Š:‰<Œ<Ð
:Ð
:Ð
:Ð
:Ð
:Ð
:r6   rC   éÿÿÿÿ)rF   ú:c                ó   — g | ]}|¯|‘ŒS © r�   )r{   Úlbls     r4   ú
<listcomp>z)_host_derived_api_key.<locals>.<listcomp>ä   s   € Ð8Ð8Ð8�c°CÐ8ˆcÐ8Ð8Ð8r6   r   )ÚapiÚwwwé   éþÿÿÿc              3  óF   K  — | ]}|                      ¦   «         r|nd V — ŒdS )Ú_N)Úisalnumrz   s     r4   r}   z(_host_derived_api_key.<locals>.<genexpr>÷   s3   è è € ÐEÐE¸˜bŸjšj™lœlÐ3˜˜°ÐEÐEÐEÐEÐEÐEr6   )ÚOPENAIÚ
OPENROUTERÚOLLAMAÚ_API_KEY)
r*   ÚanyÚsplitÚpopÚlenÚjoinÚupperÚisalphar5   r;   )rW   ra   ÚlabelsÚvendorÚ	sanitizedÚenv_names         r4   Ú_host_derived_api_keyrš   È   sv  € õ& ! Ñ*Ô*€HØð Øˆrå
Ð
:Ð
: (§.¢.°Ñ"5Ô"5°bÔ"9Ð
:Ñ
:Ô
:Ñ:Ô:ð àˆrØ�>Ð!Ð! S¨H _ _ØˆrØ8Ð8˜XŸ^š^¨CÑ0Ô0Ð8Ñ8Ô8€Fà
ð �V˜A”Y .Ð0Ð0Ø�
Š
�1‰Œˆð ð �V˜A”Y .Ð0Ð0å
ˆ6�{„{�Q‚€Øˆrð �BŒZ€Fà—’ÐEÐE¸fÐEÑEÔEÑEÔE×KÒKÑMÔM€IØð ˜I aœL×0Ò0Ñ2Ô2ð ØˆràÐ6Ð6Ð6ØˆrØÐ%Ð%Ð%€HÝ�H˜bÑ!Ô!Ð' R×.Ò.Ñ0Ô0Ð0r6   c                óD  — | pd                      ¦   «         }|sdS t          |¦  «        pd                     ¦   «         }|sdS |dk    s*|                     d¦  «        s|                     d¦  «        rdS |                     d¦  «        rdS t	          |¦  «        dk    rdS dS )	u  Decide whether a configured ``model.base_url`` may back native Anthropic.

    Native ``provider: anthropic`` resolution honors ``model.base_url`` so users
    can point at Anthropic-compatible endpoints (official Anthropic/Claude hosts,
    Azure Foundry, MiniMax/Zhipu/LiteLLM-style ``/anthropic`` proxies, Kimi's
    ``/coding`` route). But a config can carry a *stale* non-Anthropic URL â€” e.g.
    ``provider: anthropic`` left with ``base_url: https://openrouter.ai/api/v1``
    after a provider switch â€” which would route Anthropic OAuth/setup-token
    traffic to an OpenAI-compatible aggregator and 404. Ignore those.

    Returns True only when the URL plausibly speaks the Anthropic Messages
    protocol; otherwise the caller falls back to ``https://api.anthropic.com``.
    r,   Fr\   z.anthropic.comz.claude.comTz
.azure.comr]   )r;   r*   r<   r_   rb   )rW   Ú	candidatera   s      r4   Ú_anthropic_base_url_override_okr�     sÈ   € ð �˜R×&Ò&Ñ(Ô(€IØð Øˆuå! )Ñ,Ô,Ð2°×9Ò9Ñ;Ô;€HØð Øˆuð Ð&Ò&Ð&¨(×*;Ò*;Ð<LÑ*MÔ*MÐ&ÐQY×QbÒQbÐcpÑQqÔQqÐ&Øˆtà×Ò˜Ñ&Ô&ð Øˆtõ   	Ñ*Ô*Ð.BÒBÐBØˆtàˆ5r6   c                óÖ  — | sdS 	 ddl }|                      d¦  «        }|                     d¦  «        s|dz  }|                     |dz   d¬¦  «        }|j        r[|                     ¦   «                              d	g ¦  «        }t          |¦  «        d
k    r |d                              dd¦  «        }|r|S n3# t          $ r&}t           	                    d| |¦  «         Y d}~nd}~ww xY wdS )zFQuery a local server for its model name when only one model is loaded.r,   r   NrZ   z/v1z/models)r†   é   )ÚtimeoutÚdataé   Úidz$Auto-detect model from %s failed: %s)
ÚrequestsrH   r_   rp   ÚokÚjsonr’   rR   rq   Údebug)rW   r¤   ÚurlÚrespÚmodelsÚmodel_idÚexcs          r4   Ú_auto_detect_local_modelr­   &  s  € àð ØˆrðLØˆˆˆØ�oŠo˜cÑ"Ô"ˆØ�|Š|˜EÑ"Ô"ð 	Ø�5‰LˆCØ�|Š|˜C )™O°Vˆ|Ñ<Ô<ˆØŒ7ð 	$Ø—Y’Y‘[”[—_’_ V¨RÑ0Ô0ˆFÝ�6‰{Œ{˜aÒÐØ! !œ9Ÿ=š=¨¨rÑ2Ô2�Øð $Ø#�OøøÝð Lð Lð Lõ 	�ŠÐ;¸XÀsÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøð ˆ2s   †B.B6 Â6
C&Ã C!Ã!C&c                 ór  — t          ¦   «         } |                      d¦  «        }t          |t          ¦  «        r¿t          |¦  «        }|                     d¦  «        s |                     d¦  «        r|d         |d<   |                     d¦  «        pd                     ¦   «         }|                     d¦  «        pd                     ¦   «         }d|v pd|v }| }|r|r|rt          |¦  «        }|r||d<   |S t          |t          ¦  «        r*|                     ¦   «         rd|                     ¦   «         iS i S )Nrd   r/   r,   rW   rF   rG   )r#   rp   Ú
isinstanceÚdictr;   r­   r.   )Úconfigrk   Úcfgr/   rW   Úis_localÚis_fallbackri   s           r4   Ú_get_model_configrµ   =  sB  € Ý‰]Œ]€FØ—
’
˜7Ñ#Ô#€IÝ�)�TÑ"Ô"ð Ý�9‰oŒoˆà�wŠw�yÑ!Ô!ð 	* c§g¢g¨gÑ&6Ô&6ð 	*Ø  œ\ˆC�	‰NØ—7’7˜9Ñ%Ô%Ð+¨×2Ò2Ñ4Ô4ˆØ—G’G˜JÑ'Ô'Ð-¨2×4Ò4Ñ6Ô6ˆØ (Ð*ÐE¨k¸XÐ.EˆØ!�kˆØð 	*˜ð 	*¨ð 	*Ý/°Ñ9Ô9ˆHØð *Ø!)��I‘Øˆ
Ý�)�SÑ!Ô!ð . i§o¢oÑ&7Ô&7ð .Ø˜9Ÿ?š?Ñ,Ô,Ð-Ð-Ø€Ir6   Úconfigured_providerc                óø   — | pd                      ¦   «                              ¦   «         }|pd                      ¦   «                              ¦   «         }|sdS |dk    r|dk    p|                     d¦  «        S ||k    S )aT  Check whether a persisted api_mode should be honored for a given provider.

    Prevents stale api_mode from a previous provider leaking into a
    different one after a model/provider switch.  Only applies the
    persisted mode when the config's provider matches the runtime
    provider (or when no configured provider is recorded).
    r,   TrN   úcustom:)r;   r<   Ú
startswith)rc   r¶   Únormalized_providerÚnormalized_configureds       r4   Ú$_provider_supports_explicit_api_moder¼   S  s�   € ð $˜> r×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:ÐØ0Ð6°B×=Ò=Ñ?Ô?×EÒEÑGÔGÐØ ð ØˆtØ˜hÒ&Ð&Ø$¨Ò0Ð_Ð4I×4TÒ4TÐU^Ñ4_Ô4_Ð_Ø Ð$7Ò7Ð7r6   ©Útarget_modelÚapi_keyr¾   c               óÀ  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }t	          |                      d¦  «        ¦  «        }|rt          d|¦  «        r|S t          |p|                      d¦  «        pd¦  «                             ¦   «         }|sdS 	 ddlm}  |||¬	¦  «        S # t          $ r Y dS w xY w)
Nrc   r,   rn   Úcopilotr/   rg   r   )Úcopilot_model_api_mode)r¿   )	r.   rp   r;   r<   ro   r¼   Úhermes_cli.modelsrÂ   rR   )rk   r¿   r¾   r¶   rs   Ú
model_namerÂ   s          r4   Ú_copilot_runtime_api_moderÅ   d  s  € õ ˜iŸmšm¨JÑ7Ô7Ð=¸2Ñ>Ô>×DÒDÑFÔF×LÒLÑNÔNÐÝ% i§m¢m°JÑ&?Ô&?Ñ@Ô@€OØð Õ?À	ÐK^Ñ_Ô_ð ØÐõ �\ÐC Y§]¢]°9Ñ%=Ô%=ÐCÀÑDÔD×JÒJÑLÔL€JØð "Ø!Ð!ð"Ø<Ð<Ð<Ð<Ð<Ð<à%Ð% j¸'ÐBÑBÔBÐBøÝð "ð "ð "Ø!Ð!Ð!ð"øøøs   Â<C Ã
CÃC>   r[   Úbedrock_converserg   Úcodex_app_serverr]   Úrawr   c                ó’   — t          | t          ¦  «        r1|                      ¦   «                              ¦   «         }|t          v r|S dS )z@Validate an api_mode value from config. Returns None if invalid.N)r¯   r.   r;   r<   Ú_VALID_API_MODES)rÈ   r`   s     r4   ro   ro   �  sD   € å�#•sÑÔð Ø—Y’Y‘[”[×&Ò&Ñ(Ô(ˆ
ØÕ)Ð)Ð)ØÐØˆ4r6   c                 ó"   — t          ¦   «         pdS )uV  Return the trusted Nous runtime base URL override, if configured.

    Delegates to ``auth._nous_inference_env_override`` so every
    ``NOUS_INFERENCE_BASE_URL`` read shares one normalization path
    (trailing-slash stripping, blank â†’ empty). The env source is trusted
    and intentionally bypasses the network host allowlist there.
    r,   )r   r�   r6   r4   Ú!_nous_inference_base_url_overriderÌ   ˜  s   € õ (Ñ)Ô)Ð/¨RÐ/r6   rn   úOptional[Dict[str, Any]]c                óº   — |s|S | dvr|S t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }|dk    rdS |S )uû  Optional opt-in: rewrite api_mode â†’ "codex_app_server" for OpenAI/Codex
    providers when the user has explicitly enabled that runtime via
    `model.openai_runtime: codex_app_server` in config.yaml.

    Default behavior is preserved: when the key is unset, "auto", or empty,
    this function is a no-op. Only providers in {"openai", "openai-codex"}
    are eligible â€” other providers (anthropic, openrouter, etc.) cannot be
    rerouted through codex.

    Returns the (possibly-rewritten) api_mode.>   Úopenaiúopenai-codexÚopenai_runtimer,   rÇ   )r.   rp   r;   r<   )rc   rn   rk   Úruntimes       r4   Ú%_maybe_apply_codex_app_server_runtimerÓ   £  sp   € ð  ð ØˆØÐ1Ð1Ð1ØˆÝ�)—-’-Ð 0Ñ1Ô1Ð7°RÑ8Ô8×>Ò>Ñ@Ô@×FÒFÑHÔH€GØÐ$Ò$Ð$Ø!Ð!Ø€Or6   )rk   Úpoolr¾   Úentryr
   Úrequested_providerrÔ   úOptional[CredentialPool]c           	     ó´	  — |pt          ¦   «         }|p|                     d¦  «        pd}t          |dd ¦  «        pt          |dd ¦  «        pd                     d¦  «        }t          |dd ¦  «        pt          |dd¦  «        }d}	| d	k    rd
}	|pt          }�næ| dk    rd
}	|pt
          }�nÓ| dk    rd}	|pt          }�nÀ| dk    r%d}	t          j        | ¦  «        }
|p
|
r|
j        nd}�n•| dk    r´d}	t          |                     d¦  «        pd¦  «         
                    ¦   «                              ¦   «         }d}|dk    rZt          |                     d¦  «        pd¦  «         
                    ¦   «                              d¦  «        }t          |¦  «        sd}|p|pd}�nÛ| dk    r|pt          }�nÊ| dk    rd
}	�nÀ| dk    r#ddlm}  ||¦  «        }	t!          ¦   «         p|}�n—| dk    r7t#          |t          |dd¦  «        |¬¦  «        }	|pt          d         j        }�nZ| dk    �rt          |                     d¦  «        pd¦  «         
                    ¦   «                              ¦   «         }|dk    rst          |                     d¦  «        pd¦  «         
                    ¦   «                              d¦  «        }|r|}t%          |                     d¦  «        ¦  «        }|r|}	|r/|	dk    r)	 ddlm}  ||¦  «        }n# t*          $ r d }Y nw xY w|r|}	|	dk    rt-          j        dd|¦  «        }�nCt          |                     d¦  «        pd¦  «         
                    ¦   «                              ¦   «         }t          j        | ¦  «        }
|
o0|                     d¦  «        |
j                             d¦  «        k    }|| k    rO|rMt          |                     d¦  «        pd¦  «         
                    ¦   «                              d¦  «        }|r|}t%          |                     d¦  «        ¦  «        }| dv rddlm}  || |¦  «        }	n&|rt3          | |¦  «        r|}	nt5          | ||¦  «        }	| dv rddlm}  || |	|¦  «        }t9          | |	|¬ ¦  «        }	| d!k    rt;          j        |¦  «        }| |	||t          |d"d#¦  «        ||d$œS )%Nr/   r,   Úruntime_base_urlrW   rZ   Úruntime_api_keyÚaccess_tokenrg   rÐ   r[   ú	xai-oauthú
qwen-oauthúminimax-oauthr]   Ú	anthropicrc   úhttps://api.anthropic.comÚ
openrouterÚxaiÚnousr   ©Únous_api_moderÁ   r½   úazure-foundryrn   ©Úazure_foundry_model_api_modeú/v1/?$¾   úopencode-goúopencode-zen©Úopencode_model_api_mode©Únormalize_opencode_base_url)rc   rn   rk   ÚlmstudioÚsourcerÔ   )rc   rn   rW   r¿   rò   Úcredential_poolrÖ   )rµ   rp   ÚgetattrrH   r   r   r   r   Úinference_base_urlr.   r;   r<   r�   r'   rh   rå   rÌ   rÅ   ro   rÃ   rè   rR   ÚreÚsubrî   r¼   rj   rð   rÓ   Úauth_modÚ$_normalize_lmstudio_runtime_base_url)rc   rÕ   rÖ   rk   rÔ   r¾   Úeffective_modelrW   r¿   rn   ÚpconfigrL   rK   rå   rs   rè   Úinferredr¶   Úpool_url_is_defaultrî   rð   s                        r4   Ú _resolve_runtime_from_pool_entryrþ   ½  sÇ  € ð Ð0Õ.Ñ0Ô0€Ið $ÐE y§}¢}°YÑ'?Ô'?ÐEÀ2€OÝ˜Ð1°4Ñ8Ô8Ðb½GÀEÈ:ÐW[Ñ<\Ô<\ÐbÐ`b×jÒjÐknÑoÔo€HÝ�eÐ.°Ñ5Ô5Ð[½ÀÈÐXZÑ9[Ô9[€GØ!€HØ�>Ò!Ð!Ø$ˆØÐ5Õ5ˆ‰Ø	�[Ò	 Ð	 Ø$ˆØÐ9Õ9ˆ‰Ø	�\Ò	!Ð	!Ø%ˆØÐ4Õ4ˆ‰Ø	�_Ò	$Ð	$ð
 (ˆÝ#Ô'¨Ñ1Ô1ˆØÐN¸gÐ M Ô :Ð :È2ˆ‰Ø	�[Ò	 Ð	 Ø'ˆÝ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆØˆØ˜;Ò&Ð&Ý˜yŸ}š}¨ZÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔG×NÒNÈsÑSÔSˆLÝ2°<Ñ@Ô@ð "Ø!�ØÐJ 8ÐJÐ/Jˆ‰Ø	�\Ò	!Ð	!ØÐ2Õ2ˆ‰Ø	�UÒ	Ð	Ø$ˆ‰Ø	�VÒ	Ð	Ø6Ð6Ð6Ð6Ð6Ð6à �= Ñ1Ô1ˆÝ4Ñ6Ô6ÐB¸(ˆ‰Ø	�YÒ	Ð	Ý,ØÝ�EÐ,¨bÑ1Ô1Ø(ð
ñ 
ô 
ˆð
 ÐNÕ0°Ô;ÔNˆ‰Ø	�_Ò	$Ñ	$å˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆØ˜?Ò*Ð*Ý˜yŸ}š}¨ZÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔG×NÒNÈsÑSÔSˆLØð (Ø'�Ý-¨i¯mªm¸JÑ.GÔ.GÑHÔHˆOØð +Ø*�ð
 ð 	$˜xÐ+?Ò?Ð?ð ØJÐJÐJÐJÐJÐJà7Ð7¸ÑHÔH��øÝð  ð  ð  Ø���ð øøøàð $Ø#�àÐ+Ò+Ð+Ý”v˜i¨¨XÑ6Ô6ˆHùå! )§-¢-°
Ñ";Ô";Ð"A¸rÑBÔB×HÒHÑJÔJ×PÒPÑRÔRÐõ
 $Ô'¨Ñ1Ô1ˆØ%Ðh¨(¯/ª/¸#Ñ*>Ô*>À'ÔB\×BcÒBcÐdgÑBhÔBhÒ*hÐØ (Ò*Ð*Ð/BÐ*Ý˜yŸ}š}¨ZÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔG×NÒNÈsÑSÔSˆLØð (Ø'�Ý)¨)¯-ª-¸
Ñ*CÔ*CÑDÔDˆØÐ6Ð6Ð6ð BÐAÐAÐAÐAÐAØ.Ð.¨x¸ÑIÔIˆHˆHØð 	OÕ!EÀhÐPcÑ!dÔ!dð 	OØ&ˆHˆHõ
 *¨(°H¸oÑNÔNˆHð Ð2Ð2Ð2ØAÐAÐAÐAÐAÐAà.Ð.¨x¸À8ÑLÔLˆõ 5Ø H¸	ðñ ô €Hð �:ÒÐÝÔ@ÀÑJÔJˆð ØØØÝ˜% ¨6Ñ2Ô2ØØ0ðð ð s   Ë5L ÌLÌLÚ	requestedc                óÒ  — | r:|                       ¦   «         r&|                       ¦   «                              ¦   «         S t          ¦   «         }|                     d¦  «        }t	          |t
          ¦  «        r:|                      ¦   «         r&|                      ¦   «                              ¦   «         S t          dd¦  «                              ¦   «                              ¦   «         }|r|S dS )z=Resolve provider request from explicit arg, config, then env.rc   ÚHERMES_INFERENCE_PROVIDERr,   Úauto)r;   r<   rµ   rp   r¯   r.   r5   )rÿ   rk   rL   Úenv_providers       r4   Úresolve_requested_providerr  P  sÓ   € àð )�Y—_’_Ñ&Ô&ð )Ø�ŠÑ Ô ×&Ò&Ñ(Ô(Ð(å!Ñ#Ô#€IØ—=’= Ñ,Ô,€LÝ�,¥Ñ$Ô$ð ,¨×);Ò);Ñ)=Ô)=ð ,Ø×!Ò!Ñ#Ô#×)Ò)Ñ+Ô+Ð+õ Ð6¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔK€LØð ØÐàˆ6r6   Úprovider_labelÚapi_mode_overrideÚprovider_namec                óP  — t          | |¬¦  «        }|sdS 	 t          |¦  «        }|                     ¦   «         sdS |                     ¦   «         }|€dS t	          |dd¦  «        pt	          |dd¦  «        }|sdS ||pt          | ¦  «        pd| |d|› �|dœS # t          $ r Y dS w xY w)	zXCheck if a credential pool exists for a custom endpoint and return a runtime dict if so.©r  NrÚ   rÛ   r,   rg   zpool:)rc   rn   rW   r¿   rò   ró   )r   r   Úhas_credentialsÚselectrô   rb   rR   )rW   r  r  r  Úpool_keyrÔ   rÕ   Úpool_api_keys           r4   Ú_try_resolve_from_custom_poolr  c  sø   € õ ,¨HÀMÐRÑRÔR€HØð ØˆtðÝ˜Ñ"Ô"ˆØ×#Ò#Ñ%Ô%ð 	Ø�4Ø—’‘”ˆØˆ=Ø�4Ý˜uÐ&7¸Ñ>Ô>ÐdÅ'È%ÐQ_ÐacÑBdÔBdˆØð 	Ø�4à&Ø)ÐeÕ-EÀhÑ-OÔ-OÐeÐSeØ Ø#Ø(˜hÐ(Ð(Ø#ð
ð 
ð 	
øõ ð ð ð Øˆtˆtðøøøs"   —#B ¼B Á$B Á:B Â
B%Â$B%ÚresultÚNonec                ó€   — dD ]:}|                       |¦  «        }t          |t          ¦  «        r|dk    r||d<    dS Œ;dS )aq  Propagate a per-provider output cap onto the resolved runtime dict.

    Accepts ``max_output_tokens`` or ``max_tokens`` on a ``custom_providers``
    entry so a provider block can pin its own output limit. Gateway and CLI
    map this onto ``AIAgent.max_tokens`` only when the top-level
    ``model.max_tokens`` isn't set, so the documented global key still wins.
    )Úmax_output_tokensÚ
max_tokensr   r  N)rp   r¯   Úint)rÕ   r  Ú_kÚ_vs       r4   Ú_lift_max_output_tokensr  ƒ  sY   € ð 2ð ð ˆØ�YŠY�r‰]Œ]ˆÝ�b�#ÑÔð 	 2¨¢6 6Ø*,ˆFÐ&Ñ'ØˆFˆFøð	ð r6   c                ó\   — t          |                      d¦  «        ¦  «        }|r||d<   dS dS )z×Copy a validated ``extra_headers`` dict from a provider entry.

    SECURITY: header values routinely carry credentials (Cloudflare Access
    service tokens, proxy auth, custom bearer schemes). Never log them.
    Úextra_headersN)r$   rp   )rÕ   r  r  s      r4   Ú_lift_extra_headersr  ’  s?   € õ ,¨E¯IªI°oÑ,FÔ,FÑGÔG€MØð 0Ø"/ˆˆÑÐÐð0ð 0r6   c           	     ó  — t          | pd¦  «        }|sd S |dk    rd S |dk    ri|                     d¦  «        sT	 t          j        |¦  «        }|pd                     ¦   «                              ¦   «         |k    rd S n# t          $ r Y nw xY wt          ¦   «         }|                     d¦  «        }t          |t          ¦  «        �rAddlm} |                     ¦   «         D �]%\  }}t          |t          ¦  «        sŒ ||¦  «        sŒ(t          |                     dd¦  «        pd¦  «                             ¦   «         }|r"t          |d¦  «                             ¦   «         nd}	|	s7t          |                     d	d¦  «        pd¦  «                             ¦   «         }	|                     d
d¦  «        }
|t!          t          |
p|¦  «        t          |¦  «        ¦  «        v �r"|                     d¦  «        p+|                     d¦  «        p|                     d¦  «        pd}|rß|                     d
|¦  «        |                     ¦   «         |	|                     dd¦  «        dœ}|                     d¦  «        }t          |t          ¦  «        rt          |¦  «        |d<   t#          ||¦  «         t%          |                     d¦  «        p|                     d¦  «        ¦  «        }|r||d<   t'          ||¦  «         |c S �Œ'|                     d¦  «        }t          |t          ¦  «        rt(                               d¦  «         d S t-          |¦  «        }|sd S |D �]!}t          |t          ¦  «        sŒ|                     d
¦  «        }|                     d¦  «        }t          |t          ¦  «        rt          |t          ¦  «        sŒnt          |                     dd¦  «        pd¦  «                             ¦   «         }|t!          ||¦  «        vrŒ¸|                     ¦   «         |                     ¦   «         t          |                     d	d¦  «        pd¦  «                             ¦   «         dœ}t          |                     dd¦  «        pd¦  «                             ¦   «         }|r||d<   |r||d<   |                     d¦  «        }t          |t          ¦  «        rt          |¦  «        |d<   t#          ||¦  «         t%          |                     d¦  «        ¦  «        }|r||d<   t          |                     dd¦  «        pd¦  «                             ¦   «         }|r||d<   t'          ||¦  «         |c S d S )Nr,   r  rN   r¸   Ú	providersr   )Úis_provider_enabledÚkey_envr¿   r-   r„   r¨   rW   Údefault_model)r-   rW   r¿   rd   Ú
extra_bodyrn   Ú	transportÚcustom_providersz…custom_providers in config.yaml is a dict, not a list. Each entry must be prefixed with '-' in YAML. Run 'hermes doctor' for details.Úprovider_key)r-   rW   r¿   rd   )r?   r¹   rø   r   r;   r<   r   r#   rp   r¯   r°   Úhermes_cli.configr  Úitemsr.   r5   r%   r  ro   r  rq   Úwarningr"   )rÖ   Úrequested_normÚ	canonicalr±   r  r  Úep_namerÕ   r  Úresolved_api_keyÚdisplay_namerW   r  r   rn   r"  r-   r#  rÄ   s                      r4   Ú_get_named_custom_providerr,  �  sº  € Ý4Ð5GÐ5MÈ2ÑNÔN€NØð Øˆtð" ˜ÒÐØˆtØ˜Ò!Ð!¨.×*CÒ*CÀIÑ*NÔ*NÐ!ð	Ý Ô1°.ÑAÔAˆIð �˜R×&Ò&Ñ(Ô(×.Ò.Ñ0Ô0°NÒBÐBØ�tð Cøõ ð 	ð 	ð 	ØˆDð	øøøõ ‰]Œ]€Fð —
’
˜;Ñ'Ô'€IÝ�)�TÑ"Ô"ñ /"Ø9Ð9Ð9Ð9Ð9Ð9Ø'ŸošoÑ/Ô/ð -	"ñ -	"‰NˆG�UÝ˜e¥TÑ*Ô*ð Øð
 'Ð& uÑ-Ô-ð Øå˜%Ÿ)š) I¨rÑ2Ô2Ð8°bÑ9Ô9×?Ò?ÑAÔAˆGØ?FÐN�w w°Ñ3Ô3×9Ò9Ñ;Ô;Ð;ÈBÐà#ð OÝ#& u§y¢y°¸BÑ'?Ô'?Ð'EÀ2Ñ#FÔ#F×#LÒ#LÑ#NÔ#NÐ à Ÿ9š9 V¨RÑ0Ô0ˆLØÕ!8Ý�LÐ+ GÑ,Ô,Ý�G‘”ñ"ô "ð ñ ð
 !Ÿ9š9 UÑ+Ô+Ð^¨u¯yªy¸Ñ/?Ô/?Ð^À5Ç9Â9ÈZÑCXÔCXÐ^Ð\^�Øð "à %§	¢	¨&°'Ñ :Ô :Ø$,§N¢NÑ$4Ô$4Ø#3Ø!&§¢¨?¸BÑ!?Ô!?ð	ð �Fð "'§¢¨<Ñ!8Ô!8�JÝ! *­dÑ3Ô3ð @Ý/3°JÑ/?Ô/?˜˜|Ñ,Ý'¨¨vÑ6Ô6Ð6õ  /¨u¯yªy¸Ñ/DÔ/DÐ/^ÈÏ	Ê	ÐR]ÑH^ÔH^Ñ_Ô_�HØð 6Ø-5˜˜zÑ*Ý+¨E°6Ñ:Ô:Ð:Ø!�M�M�Mùð —z’zÐ"4Ñ5Ô5ÐÝÐ"¥DÑ)Ô)ð Ý�Šð/ñ	
ô 	
ð 	
ð
 ˆtå6°vÑ>Ô>ÐØð Øˆtà!ð ñ ˆÝ˜%¥Ñ&Ô&ð 	ØØ�yŠy˜Ñ Ô ˆØ—9’9˜ZÑ(Ô(ˆÝ˜$¥Ñ$Ô$ð 	­J°xÅÑ,EÔ,Eð 	ØÝ˜5Ÿ9š9 ^°RÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔGˆØÕ!8¸¸|Ñ!LÔ!LÐLÐLØà—J’J‘L”LØ ŸšÑ(Ô(Ý˜5Ÿ9š9 Y°Ñ3Ô3Ð9°rÑ:Ô:×@Ò@ÑBÔBð
ð 
ˆõ
 �e—i’i 	¨2Ñ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ˆØð 	(Ø 'ˆF�9ÑØð 	2Ø%1ˆF�>Ñ"Ø—Y’Y˜|Ñ,Ô,ˆ
Ý�j¥$Ñ'Ô'ð 	4Ý#'¨
Ñ#3Ô#3ˆF�<Ñ Ý˜E 6Ñ*Ô*Ð*Ý" 5§9¢9¨ZÑ#8Ô#8Ñ9Ô9ˆØð 	*Ø!)ˆF�:ÑÝ˜Ÿš 7¨BÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>ˆ
Øð 	)Ø(ˆF�7‰OÝ  vÑ.Ô.Ð.Øˆˆˆàˆ4s   ºA= Á=
B
Â	B
c                óH   — 	 t          | ¦  «        duS # t          $ r Y dS w xY w)u~  Return True when config defines a custom provider matching the request.

    Thin public wrapper around :func:`_get_named_custom_provider` so other
    modules (e.g. the cronjob tool) can decide whether a provider name will
    actually resolve to a configured ``providers:`` / ``custom_providers:``
    entry â€” without reaching into a private helper or duplicating the scan.
    NF)r,  rR   )rÖ   s    r4   Úhas_named_custom_providerr.  +  s=   € ðÝ)Ð*<Ñ=Ô=ÀTÐIÐIøÝð ð ð Øˆuˆuðøøøs   ‚ “
! !c           
     óÖ  — t          | ¦  «        }|sdS 	 t          ¦   «         }n# t          $ r Y dS w xY w|                     d¦  «        }t	          |t
          ¦  «        r°|                     ¦   «         D ]›\  }}t	          |t
          ¦  «        sŒ|                     d¦  «        p+|                     d¦  «        p|                     d¦  «        pd}t          |¦  «        |k    r,t          t          |¦  «        t          |¦  «        ¦  «        c S Œœ	 t          |¦  «        }n# t          $ r d}Y nw xY w|pg D ]²}t	          |t
          ¦  «        sŒ|                     d¦  «        }t	          |t          ¦  «        r| 
                    ¦   «         sŒWt          |                     d¦  «        ¦  «        |k    r5t          |t          |                     dd¦  «        pd¦  «        ¦  «        c S Œ³dS )	uD  Map an endpoint URL back to its canonical ``custom:<name>`` menu key.

    Returns the ``custom:<normalized-name>`` slug of the first ``providers:``
    / ``custom_providers:`` entry whose base_url matches, or ``None`` when no
    entry owns the URL.

    Session persistence stores the agent's *resolved* provider, and for every
    named custom endpoint that is the literal string ``"custom"`` â€” the entry
    name is lost, and the api_key is deliberately never persisted. The
    endpoint URL is the one durable fact that survives the round-trip, so
    this reverse lookup lets persist/rebuild paths recover the entry identity
    (and with it key_env/api_key/api_mode resolution via
    :func:`_get_named_custom_provider`) instead of failing with
    ``auth_unavailable`` or silently rebuilding with placeholder credentials.
    Nr  r„   r¨   rW   r,   r-   r#  )Ú_normalize_base_url_for_matchr#   rR   rp   r¯   r°   r%  r&   r.   r"   r;   )	rW   Útargetr±   r  r)  rÕ   Ú	entry_urlr"  r-   s	            r4   Úfind_custom_provider_identityr3  9  s'  € õ  +¨8Ñ4Ô4€FØð ØˆtðÝ‘”ˆˆøÝð ð ð Øˆtˆtðøøøð —
’
˜;Ñ'Ô'€IÝ�)�TÑ"Ô"ð HØ'ŸošoÑ/Ô/ð 	Hð 	H‰NˆG�UÝ˜e¥TÑ*Ô*ð Øà—	’	˜%Ñ Ô ÐS E§I¢I¨eÑ$4Ô$4ÐS¸¿	º	À*Ñ8MÔ8MÐSÐQSð õ -¨YÑ7Ô7¸6ÒAÐAÝ+­C°©L¬L½#¸g¹,¼,ÑGÔGÐGÐGÐGð Bð Ý:¸6ÑBÔBÐÐøÝð  ð  ð  ØÐÐÐð øøøà!Ð' Rð 
ð 
ˆÝ˜%¥Ñ&Ô&ð 	ØØ�yŠy˜Ñ Ô ˆÝ˜$¥Ñ$Ô$ð 	¨D¯JªJ©L¬Lð 	ØÝ(¨¯ª°:Ñ)>Ô)>Ñ?Ô?À6ÒIÐIÝ'ØÝ�E—I’I˜n¨bÑ1Ô1Ð7°RÑ8Ô8ñô ð ð ð ð Jð ˆ4s   •$ ¤
2±2ÄD  Ä D/Ä.D/c           
     óh  ‡— t          | pd¦  «                             ¦   «                              ¦   «         Š‰sdS 	 t          ¦   «         }n# t          $ r Y dS w xY wdˆfd„}|                     d¦  «        }t          |t          ¦  «        rg|                     ¦   «         D ]R\  }}t          |t          ¦  «        sŒ ||¦  «        r,t          t          |¦  «        t          |¦  «        ¦  «        c S ŒS	 t          |¦  «        }n# t          $ r d}Y nw xY w|pg D ]—}t          |t          ¦  «        sŒ|                     d	¦  «        }t          |t           ¦  «        r|                     ¦   «         sŒW ||¦  «        r5t          |t          |                     d
d¦  «        pd¦  «        ¦  «        c S Œ˜dS )aþ  Map a model id back to the ``custom:<name>`` entry that serves it.

    Returns the ``custom:<normalized-name>`` slug of the first ``providers:``
    / ``custom_providers:`` entry whose ``model`` / ``default_model`` matches,
    or whose ``models`` catalog (dict or list shape) contains the id.
    ``None`` when no entry serves the model.

    Companion to :func:`find_custom_provider_identity` (URL reverse-lookup)
    for the persistence paths where no base_url survived the round-trip: the
    session row always stores the model name, and a custom endpoint's model
    ids (e.g. an in-house SFT checkpoint) virtually never collide with
    catalog models on built-in providers, so the model is the last durable
    fact that can recover the entry identity.
    r,   NrÕ   rl   r0   rA   c                ó(  •— dD ]Y}|                       |¦  «        }t          |t          ¦  «        r-|                     ¦   «                              ¦   «         ‰k    r dS ŒZ|                       d¦  «        }t          |t
          ¦  «        r-t          ˆfd„|                     ¦   «         D ¦   «         ¦  «        S t          |t          ¦  «        rÈ|D ]Å}t          |t          ¦  «        r-|                     ¦   «                              ¦   «         ‰k    r dS t          |t
          ¦  «        rl|                      d¦  «        p|                      d¦  «        }t          |t          ¦  «        r-|                     ¦   «                              ¦   «         ‰k    r dS ŒÆdS )N)rd   r  Trª   c              3  ó†   •K  — | ];}t          |¦  «                             ¦   «                              ¦   «         ‰k    V — Œ<d S rx   )r.   r;   r<   )r{   Úmidr1  s     €r4   r}   zVfind_custom_provider_identity_by_model.<locals>._entry_serves_model.<locals>.<genexpr>�  sU   øè è € ð ð Ø7:•�C‘”—’Ñ Ô ×&Ò&Ñ(Ô(¨FÒ2ðð ð ð ð ð r6   r£   r-   F)	rp   r¯   r.   r;   r<   r°   r�   ÚkeysÚlist)rÕ   Úkeyr7   rª   Úitemr7  r1  s         €r4   Ú_entry_serves_modelzCfind_custom_provider_identity_by_model.<locals>._entry_serves_model†  s…  ø€ Ø-ð 	ð 	ˆCØ—I’I˜c‘N”NˆEÝ˜%¥Ñ%Ô%ð ¨%¯+ª+©-¬-×*=Ò*=Ñ*?Ô*?À6Ò*IÐ*IØ�t�tøØ—’˜8Ñ$Ô$ˆÝ�f�dÑ#Ô#ð 	Ýð ð ð ð Ø>D¿kºk¹m¼mðñ ô ñ ô ð õ �f�dÑ#Ô#ð 	$Øð $ð $�Ý˜d¥CÑ(Ô(ð  ¨T¯ZªZ©\¬\×-?Ò-?Ñ-AÔ-AÀVÒ-KÐ-KØ˜4˜4Ý˜d¥DÑ)Ô)ð $ØŸ(š( 4™.œ.Ð<¨D¯HªH°VÑ,<Ô,<�CÝ! #¥sÑ+Ô+ð $°·	²	±´×0AÒ0AÑ0CÔ0CÀvÒ0MÐ0MØ#˜t˜tøØˆur6   r  r-   r#  )rÕ   rl   r0   rA   )r.   r;   r<   r#   rR   rp   r¯   r°   r%  r&   r"   )	rd   r±   r<  r  r)  rÕ   r"  r-   r1  s	           @r4   Ú&find_custom_provider_identity_by_modelr=  o  s  ø€ õ ��˜"ÑÔ×#Ò#Ñ%Ô%×+Ò+Ñ-Ô-€FØð ØˆtðÝ‘”ˆˆøÝð ð ð Øˆtˆtðøøøðð ð ð ð ð ð( —
’
˜;Ñ'Ô'€IÝ�)�TÑ"Ô"ð HØ'ŸošoÑ/Ô/ð 	Hð 	H‰NˆG�UÝ˜e¥TÑ*Ô*ð ØØ"Ð" 5Ñ)Ô)ð HÝ+­C°©L¬L½#¸g¹,¼,ÑGÔGÐGÐGÐGðHð Ý:¸6ÑBÔBÐÐøÝð  ð  ð  ØÐÐÐð øøøà!Ð' Rð 
ð 
ˆÝ˜%¥Ñ&Ô&ð 	ØØ�yŠy˜Ñ Ô ˆÝ˜$¥Ñ$Ô$ð 	¨D¯JªJ©L¬Lð 	ØØÐ˜uÑ%Ô%ð 	Ý'ØÝ�E—I’I˜n¨bÑ1Ô1Ð7°RÑ8Ô8ñô ð ð ð ð	ð ˆ4s#   ¼A Á
AÁAÃ4D ÄDÄD)rW   Úconfig_providerrd   r>  c                óÎ  — | rt          | ¦  «        }|r|S |rt          |¦  «        }|r|S t          |pd¦  «                             ¦   «         }|sV	 t          t	          ¦   «                              d¦  «        pd¦  «                             ¦   «         }n# t          $ r d}Y nw xY w|s2t          j                             dd¦  «                             ¦   «         }t          |¦  «        }|r|dv rdS 	 t          |¦  «        }|�Qt          t          |                     d¦  «        pd¦  «        ¦  «        }|r|S |                     d¦  «        r|S d|› �S n# t          $ r Y nw xY wdS )uq  Recover a routable ``custom:<name>`` identity for a bare custom provider.

    The bare string ``"custom"`` is the *resolved billing class* shared by
    every named ``providers:`` / ``custom_providers:`` entry â€” it is NOT a
    routable provider identity (``resolve_runtime_provider("custom")`` falls
    through to the OpenRouter default URL with no api_key, which surfaces to
    the user as "No LLM provider configured").

    Any code path that persists or restores a session's provider override
    must run the resolved provider through this helper so a bare ``"custom"``
    is upgraded back to its durable ``custom:<name>`` menu key. Three
    recovery sources, in priority order:

    1. ``base_url`` â€” reverse-lookup the entry that owns the endpoint URL
       (the one fact that always survives the persistence round-trip when a
       URL was recorded).
    2. ``model`` â€” reverse-lookup the entry that serves the session's model
       (``model``/``default_model``/``models`` catalog). The session row
       always stores the model name, so when no base_url survived (the
       recurring Desktop/TUI regression vector) the model is the last
       session-scoped fact that can recover the entry â€” and unlike the
       config fallback below it stays correct after the user points their
       global default at a different provider.
    3. ``config_provider`` â€” the active ``config.model.provider`` (or its
       ``provider``/``HERMES_INFERENCE_PROVIDER`` equivalent). When neither
       a base_url nor a model recovered the entry, the configured provider
       is the only durable identity left, so fall back to it when it names
       a real entry.

    Returns ``custom:<name>`` when a routable identity is recovered, else
    ``None`` (caller keeps whatever it had â€” bare ``"custom"`` only as a last
    resort, e.g. a genuine ad-hoc endpoint with no config entry).
    r,   rc   r  >   r  rN   rá   NrW   r¸   )r3  r=  r.   r;   rµ   rp   rR   ÚosÚenvironr?   r,  r¹   )rW   r>  rd   Úidentityrœ   Úcandidate_normrÕ   s          r4   Úcanonical_custom_identityrD  µ  sÅ  € ðP ð Ý0°Ñ:Ô:ˆØð 	ØˆOð ð Ý9¸%Ñ@Ô@ˆØð 	ØˆOõ �OÐ) rÑ*Ô*×0Ò0Ñ2Ô2€IØð ð	ÝÕ-Ñ/Ô/×3Ò3°JÑ?Ô?ÐEÀ2ÑFÔF×LÒLÑNÔNˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøàð LÝ”J—N’NÐ#>ÀÑCÔC×IÒIÑKÔKˆ	å4°YÑ?Ô?€Nàð ˜^Ð/OÐOÐOØˆtðÝ*¨9Ñ5Ô5ˆØÐõ 5µS¸¿ºÀ:Ñ9NÔ9NÐ9TÐRTÑ5UÔ5UÑVÔVˆHØð  Ø�Ø×(Ò(¨Ñ3Ô3ð &Ø%Ð%Ø-˜^Ð-Ð-Ð-ð øõ ð ð ð Øˆðøøøàˆ4s2   ÁAB ÂB#Â"B#Ã2AE Ä8E ÅE Å
E"Å!E"c                ó’   — t          | pd¦  «                             ¦   «                              d¦  «                             ¦   «         S )Nr,   rZ   )r.   r;   rH   r<   r>   s    r4   r0  r0    s:   € Ýˆuˆ{˜ÑÔ×!Ò!Ñ#Ô#×*Ò*¨3Ñ/Ô/×5Ò5Ñ7Ô7Ð7r6   Úcustom_providerc                ó€   — |                       d¦  «        }t          |t          ¦  «        r|si S dt          |¦  «        iS )Nr   )rp   r¯   r°   )rF  r   s     r4   Ú"_custom_provider_request_overridesrH    sF   € Ø ×$Ò$ \Ñ2Ô2€JÝ�j¥$Ñ'Ô'ð ¨zð Øˆ	Ø�$˜zÑ*Ô*Ð+Ð+r6   ©Úexplicit_api_keyÚexplicit_base_urlrJ  rK  c           
     óÊ	  — | pd                      ¦   «                              ¦   «         }|r/|dk    r)	 ddlm}  ||¦  «        dk    rd}n# t          $ r Y nw xY w|dk    �r|�r|                      ¦   «                              d¦  «        }t          |dd ¦  «        }|rd|d<   |S t          |d¦  «        pt          |d	¦  «        }t          |d
¦  «        }|pd                      ¦   «         |r"t          dd¦  «                              ¦   «         nd|r"t          dd¦  «                              ¦   «         ndt          |¦  «        g}	t          d„ |	D ¦   «         d¦  «        pd}
dt          |¦  «        pd||
d| dœS t          | ¦  «        }|sd S |pd                      ¦   «         p|                     dd¦  «                             d¦  «        }|sd S t          |d|                     d¦  «        |                     d¦  «        ¬¦  «        }|rº|                     d¦  «        }|r||d<   t          |                     d¦  «        t          ¦  «        r|d         |d<   t!          |¦  «        }|r+i t#          |                     d¦  «        pi ¦  «        ¥|¥|d<   |                     d¦  «        rt#          |d         ¦  «        |d<   |S t          |d¦  «        pt          |d	¦  «        }t          |d
¦  «        }|pd                      ¦   «         t%          |                     dd¦  «        pd¦  «                              ¦   «         t          t%          |                     dd¦  «        pd¦  «                              ¦   «         d¦  «                              ¦   «         |r"t          dd¦  «                              ¦   «         nd|r"t          dd¦  «                              ¦   «         ndt          |¦  «        g}	t          d„ |	D ¦   «         d¦  «        }
d|                     d¦  «        pt          |¦  «        pd||
pdd|                     d| ¦  «        › �dœ}|                     d¦  «        r|d         |d<   t          |                     d¦  «        t          ¦  «        r|d         |d<   |                     d¦  «        rt#          |d         ¦  «        |d<   t!          |¦  «        }|r||d<   |S )Nr,   rN   r   rO   rZ   zdirect-aliasrò   ú
openai.comúopenai.azure.comrP   ÚOPENAI_API_KEYÚOPENROUTER_API_KEYc              3  ó8   K  — | ]}t          |¦  «        ¯|V — Œd S rx   ©r   )r{   Úcs     r4   r}   z0_resolve_named_custom_runtime.<locals>.<genexpr>F  s0   è è € ÐCÐC�1Õ.?ÀÑ.BÔ.BÐCˆQÐCÐCÐCÐCÐCÐCr6   úno-key-requiredrg   ©rc   rn   rW   r¿   rò   rÖ   rW   rn   r-   r	  rd   r  Úrequest_overridesr  r¿   r  c              3  ó8   K  — | ]}t          |¦  «        ¯|V — Œd S rx   rR  ©r{   rœ   s     r4   r}   z0_resolve_named_custom_runtime.<locals>.<genexpr>‚  s1   è è € ÐbÐb )ÕEVÐW`ÑEaÔEaÐb�IÐbÐbÐbÐbÐbÐbr6   zcustom_provider:©rc   rn   rW   r¿   rò   )r;   r<   rQ   r   rR   rH   r  r)   r5   rš   Únextrb   r,  rp   r¯   r  rH  r°   r.   )rÖ   rJ  rK  r'  rU   rW   Úpool_resultÚ_da_is_openai_urlÚ_da_is_openrouterÚapi_key_candidatesr¿   rF  rÄ   rV  Ú_cp_is_openai_urlÚ_cp_is_openrouterr  s                    r4   Ú_resolve_named_custom_runtimera    sì  € ð )Ð.¨B×5Ò5Ñ7Ô7×=Ò=Ñ?Ô?€NØð ˜.¨HÒ4Ð4ð	ØMÐMÐMÐMÐMÐMà Ð  Ñ0Ô0°HÒ<Ð<Ø!)�øøÝð 	ð 	ð 	ØˆDð	øøøà˜Ò!Ñ!Ð&7Ñ!Ø$×*Ò*Ñ,Ô,×3Ò3°CÑ8Ô8ˆõ 4°H¸hÈÑMÔMˆØð 	Ø$2ˆK˜Ñ!ØÐÝ3°H¸lÑKÔKð  CÕOdÐemð  pBñ  PCô  PCÐÝ3°H¸oÑNÔNÐàÐ# ×*Ò*Ñ,Ô,à:KÐS�WÐ% rÑ*Ô*×0Ò0Ñ2Ô2Ð2ÐQSØ:KÐT�WÐ)¨2Ñ.Ô.×4Ò4Ñ6Ô6Ð6ÐRTõ " (Ñ+Ô+ð	
Ðõ ØCÐCÐ*ÐCÑCÔCØñ
ô 
ð ð ð 	ð
 !Ý0°Ñ:Ô:ÐPÐ>PØ ØØ$Ø"4ð
ð 
ð 	
õ 1Ð1CÑDÔD€OØð Øˆtð 
Ð	 ˜b×'Ò'Ñ)Ô)ð 	/Ø×Ò˜z¨2Ñ.Ô.ß‚fˆS�k„kð ð ð Øˆtõ 0°¸(ÀO×DWÒDWÐXbÑDcÔDcð  tC÷  tGò  tGð  HNñ  tOô  tOð  Pñ  Pô  P€KØð ð %×(Ò(¨Ñ1Ô1ˆ
Øð 	.Ø#-ˆK˜Ñ Ý�o×)Ò)Ð*=Ñ>Ô>ÅÑDÔDð 	TØ/>Ð?RÔ/SˆKÐ+Ñ,Ý>¸ÑOÔOÐØð 	ð0Ý�{—’Ð':Ñ;Ô;ÐA¸rÑBÔBð0à#ð0ˆKÐ+Ñ,ð ×Ò˜Ñ/Ô/ð 	RÝ+/°ÀÔ0PÑ+QÔ+QˆK˜Ñ(ØÐå/°¸,ÑGÔGÐ~ÕK`ÐaiÐk}ÑK~ÔK~ÐÝ/°¸/ÑJÔJÐà	Ð	˜R×&Ò&Ñ(Ô(ÝˆO×Ò 	¨2Ñ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=Ý•�O×'Ò'¨	°2Ñ6Ô6Ð<¸"Ñ=Ô=×CÒCÑEÔEÀrÑJÔJ×PÒPÑRÔRð 7HÐ	P�Ð! 2Ñ	&Ô	&×	,Ò	,Ñ	.Ô	.Ð	.ÈbØ6GÐ	P�Ð% rÑ	*Ô	*×	0Ò	0Ñ	2Ô	2Ð	2Èbõ 	˜hÑ'Ô'ðÐõ ÐbÐbÐ/AÐbÑbÔbÐdfÑgÔg€Gð Ø#×'Ò'¨
Ñ3Ô3ð Ý# HÑ-Ô-ðàØØÐ/Ð/ØV _×%8Ò%8¸ÐASÑ%TÔ%TÐVÐVðð €Fð ×Ò˜7Ñ#Ô#ð 3Ø)¨'Ô2ˆˆw‰Ý�/×%Ò%Ð&9Ñ:Ô:½CÑ@Ô@ð KØ&5Ð6IÔ&JˆÐ"Ñ#ð ×Ò˜?Ñ+Ô+ð IÝ"& °Ô'GÑ"HÔ"HˆˆÑÝ:¸?ÑKÔKÐØð 8Ø&7ˆÐ"Ñ#Ø€Ms   ²A
 Á

AÁAc           	     óÂ  — t          ¦   «         }t          |                     d¦  «        t          ¦  «        r|                     d¦  «        nd}t          |                     d¦  «        t          ¦  «        r|                     d¦  «        nd}d}dD ]V}|                     |¦  «        }t          |t          ¦  «        r*|                     ¦   «         r|                     ¦   «         } nŒW| pd                     ¦   «                              ¦   «         }	|                     ¦   «                              ¦   «         }|	r/|	dk    r)	 ddlm}
  |
|	¦  «        dk    rd}	n# t          $ r Y nw xY wt          dd¦  «                             ¦   «         }t          d	d¦  «                             ¦   «         }d
}|                     ¦   «         r+|s)|	dk    r|r|dk    rd}n|	dk    rt          ||¦  «        rd}|pd                     ¦   «         p"|p |r|                     ¦   «         ndp|pt                               d¦  «        }t          |d¦  «        }|p(|	dk    o"|p||k    o||pd                     d¦  «        k    }|r |t          d¦  «        t          d¦  «        g}n~t          |d¦  «        }t          |d¦  «        }t          |d¦  «        }||r|nd|rt          d¦  «        nd|s|rt          d¦  «        nd|rt          d¦  «        ndt          |¦  «        g}t          d„ |D ¦   «         d¦  «        }|s|rdnd}|	dk    rdnd}|dk    rA|r?t!          ||t#          |                     d¦  «        ¦  «        |	dk    r| nd ¬¦  «        }|r|S |dk    r|s|sd}||dk    rt%          ||¦  «        n2t#          |                     d¦  «        ¦  «        pt'          |¦  «        pd|||dœS )NrW   r,   rc   )r¿   r„   rN   r   rO   r'   ÚCUSTOM_BASE_URLFr  TrZ   rP   rá   rP  rO  z
ollama.comrM  rN  ÚOLLAMA_API_KEYc              3  óz   K  — | ]6}t          |¦  «        ¯t          |pd ¦  «                             ¦   «         V — Œ7dS )r,   N)r   r.   r;   rX  s     r4   r}   z._resolve_openrouter_runtime.<locals>.<genexpr>  sI   è è € ÐjÐj¨)ÕM^Ð_hÑMiÔMiÐj�ˆYˆ_˜"Ñ	Ô	×	#Ò	#Ñ	%Ô	%ÐjÐjÐjÐjÐjÐjr6   Úexplicitz
env/configrn   r	  rT  rg   rY  )rµ   r¯   rp   r.   r;   r<   rQ   r   rR   r5   rV   r'   rH   r)   rš   rZ  r  ro   ru   rb   )rÖ   rJ  rK  rk   rK   rL   Úcfg_api_keyÚkÚvr'  rU   Úenv_openrouter_base_urlÚenv_custom_base_urlÚuse_config_base_urlrW   Ú_is_openrouter_urlÚ_is_openrouter_contextr^  Ú_is_ollama_urlÚ_is_openai_urlÚ_is_openai_azurer¿   rò   Úeffective_providerr[  s                            r4   Ú_resolve_openrouter_runtimers  �  sï  € õ "Ñ#Ô#€IÝ0:¸9¿=º=ÈÑ;TÔ;TÕVYÑ0ZÔ0ZÐb�9—=’= Ñ,Ô,Ð,Ð`b€LÝ0:¸9¿=º=ÈÑ;TÔ;TÕVYÑ0ZÔ0ZÐb�9—=’= Ñ,Ô,Ð,Ð`b€LØ€KØð ð ˆØ�MŠM˜!ÑÔˆÝ�a�ÑÔð 	 !§'¢'¡)¤)ð 	ØŸ'š'™)œ)ˆKØˆEøØ(Ð.¨B×5Ò5Ñ7Ô7×=Ò=Ñ?Ô?€NØ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/€Lð ð ˜.¨HÒ4Ð4ð	ØMÐMÐMÐMÐMÐMà Ð  Ñ0Ô0°HÒ<Ð<Ø!)�øøÝð 	ð 	ð 	ØˆDð	øøøõ &Ð&;¸RÑ@Ô@×FÒFÑHÔHÐÝ!Ð"3°RÑ8Ô8×>Ò>Ñ@Ô@Ðð
  ÐØ×ÒÑÔð 'Ð$5ð 'Ø˜VÒ#Ð#Øð + <°6Ò#9Ð#9Ø&*Ð#øØ˜xÒ'Ð'Õ,XØ˜,ñ-
ô -
Ð'ð #'Ðð 
Ð	 ˜b×'Ò'Ñ)Ô)ð 	Øð	à$7Ð?ˆL×ÒÑ Ô Ð ¸Rð	ð #ð	õ ß‚fˆS�k„kð õ /¨x¸ÑIÔIÐð 0ð Ø˜,Ò&ð 	DØ$ÐK¨Ð4KÒ(Kð	DàÐ0Ð6°B×>Ò>¸sÑCÔCÒCð ð
 ð  
àÝÐ(Ñ)Ô)ÝÐ$Ñ%Ô%ð
ÐÐõ 2°(¸LÑIÔIˆÝ1°(¸LÑIÔIˆÝ1°(Ð<NÑOÔOÐð Ø/Ð7ˆ[ˆ[°RØ.<ÐZ�WÐ%Ñ&Ô&Ð&ÐXZØ/=ÐZÐAQÐZ�WÐ%Ñ&Ô&Ð&ÐXZØ.@ÐZ�WÐ)Ñ*Ô*Ð*ÐXZõ
 " (Ñ+Ô+ð
Ðõ ØjÐjÐ7IÐjÑjÔjØ
ñô €Gð
 -ÐTÐ0AÐTˆZˆZÈ€Fð &4°xÒ%?Ð%?˜˜À\Ðð ˜XÒ%Ð%¨(Ð%õ 4ØÐ(­/¸)¿-º-È
Ñ:SÔ:SÑ*TÔ*TØ0>À(Ò0JÐ0JÐ,Ð,ÐPTð
ñ 
ô 
ˆð ð 	ØÐà˜XÒ%Ð%¨gÐ%Ð>PÐ%Ø#ˆð 'à Ò)Ð)õ 3°9¸hÑGÔGÐGå˜YŸ]š]¨:Ñ6Ô6Ñ7Ô7ð Ý# HÑ-Ô-ðàØØØð
ð 
ð 
s   Ä?E Å
E$Å#E$)rJ  rK  r¾   c           	     óÞ  — t          |pd¦  «                             ¦   «         }t          |pd¦  «                             ¦   «                              d¦  «        }t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }d}d}d}	i }
|dk    rãt          |                     d¦  «        pd¦  «                             ¦   «                              d¦  «        }t          |                     d¦  «        ¦  «        pd}t          |                     d	¦  «        pd¦  «                             ¦   «                              ¦   «         pd}	|                     d
¦  «        }t          |t          ¦  «        r|}
t          |p|                     d¦  «        pd¦  «                             ¦   «         }|r/|dk    r)	 ddlm	}  ||¦  «        }n# t          $ r d}Y nw xY w|r|}t          dd¦  «                             ¦   «                              d¦  «        }|p|p|}|st          d¦  «        ‚|dk    rt          j        dd|¦  «        }|	dk    �r|r|}d}d}n¹	 ddlm}m}m} n&# t          $ r}t          d|› d�¦  «        |‚d}~ww xY wt          |
                     d¦  «        pd¦  «                             ¦   «         p|}	  ||¬¦  «        } ||¬¦  «        }n/# t&          $ r"}t          t          |¦  «        ¦  «        |‚d}~ww xY w|}d}d}i }|dk    r=t          |
                     d¦  «        pd¦  «                             ¦   «         }|r||d<   d||||||| dœS |}|s'	 ddlm}  |d¦  «        pd}n# t          $ r d}Y nw xY w|s"t          dd¦  «                             ¦   «         }|st          d¦  «        ‚|s|rdnd}d|||d|| d œS )!a§  Resolve an Azure Foundry runtime entry.

    Reads ``model.base_url`` + ``model.api_mode`` from config.yaml (or
    explicit overrides), pulls the API key from ``.env`` / env var, and
    strips a trailing ``/v1`` for Anthropic-style endpoints because the
    Anthropic SDK appends ``/v1/messages`` internally.

    When ``model.auth_mode == "entra_id"`` (and the model is OpenAI-style),
    the returned ``api_key`` is a zero-arg callable produced by
    :func:`agent.azure_identity_adapter.build_token_provider` rather than
    a string. Downstream code that constructs an OpenAI SDK client passes
    this through unchanged (the SDK accepts ``Callable[[], str]`` for
    ``api_key`` and calls it before every request). Code paths that need
    a string (logging, manual HTTP probes, header injection) must use the
    helpers in ``agent.azure_identity_adapter``.

    Raises :class:`AuthError` when required values are missing.
    r,   rZ   rc   rg   r¿   ræ   rW   rn   Ú	auth_modeÚentrar/   r]   r   rç   NÚAZURE_FOUNDRY_BASE_URLzpAzure Foundry requires a base URL. Set it via 'hermes model' or the AZURE_FOUNDRY_BASE_URL environment variable.ré   Úentra_idrf  )ÚEntraIdentityConfigÚSCOPE_AI_AZURE_DEFAULTÚbuild_token_providerzAzure Foundry Entra ID auth requires the 'azure-identity' package. Install it with: pip install azure-identity (import failed: ú)Úscope)r}  )r±   )rc   rn   rW   r¿   ru  rv  rò   rÖ   )Úget_env_valueÚAZURE_FOUNDRY_API_KEYa  Azure Foundry requires an API key. Set AZURE_FOUNDRY_API_KEY in ~/.hermes/.env or run 'hermes model' to configure. To use keyless Microsoft Entra ID auth instead, set model.auth_mode: entra_id in config.yaml (or pick 'Microsoft Entra ID' in 'hermes model').r±   )rc   rn   rW   r¿   ru  rò   rÖ   )r.   r;   rH   rp   r<   ro   r¯   r°   rÃ   rè   rR   r5   r   rö   r÷   Úagent.azure_identity_adapterry  rz  r{  ÚImportErrorr$  r~  )rÖ   rk   rJ  rK  r¾   Úexplicit_base_url_cleanrL   rK   Úcfg_api_modeÚcfg_auth_modeÚ	cfg_entraÚ_entrarú   rè   rü   Úenv_base_urlrW   r¿   rò   ru  ry  rz  r{  r¬   r}  Úentra_configÚtoken_providerÚclean_entraÚconfigured_scoper~  s                                 r4   Ú_resolve_azure_foundry_runtimerŒ  +  s1  € õ4 Ð+Ð1¨rÑ2Ô2×8Ò8Ñ:Ô:ÐÝ!Ð"3Ð"9°rÑ:Ô:×@Ò@ÑBÔB×IÒIÈ#ÑNÔNÐå�y—}’} ZÑ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?×EÒEÑGÔG€LØ€LØ%€LØ€MØ "€IØ�Ò&Ð&Ý˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×JÒJÈ3ÑOÔOˆÝ& y§}¢}°ZÑ'@Ô'@ÑAÔAÐWÐEWˆÝ˜IŸMšM¨+Ñ6Ô6ÐC¸)ÑDÔD×JÒJÑLÔL×RÒRÑTÔTÐaÐXaˆØ—’˜wÑ'Ô'ˆÝ�f�dÑ#Ô#ð 	ØˆIõ ˜,ÐH¨)¯-ª-¸	Ñ*BÔ*BÐHÀbÑIÔI×OÒOÑQÔQ€OØð $˜<Ð+?Ò?Ð?ð	ØFÐFÐFÐFÐFÐFà3Ð3°OÑDÔDˆHˆHøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøàð 	$Ø#ˆLåÐ3°RÑ8Ô8×>Ò>Ñ@Ô@×GÒGÈÑLÔL€LØ&ÐF¨,ÐF¸,€HØð 
Ýð?ñ
ô 
ð 	
ð Ð+Ò+Ð+Ý”6˜) R¨Ñ2Ô2ˆð  ˜
Ò"Ñ"Øð !	#ð ,ˆGØˆFØ!ˆIˆIððð ð ð ð ð ð ð ð ð ð øõ
 ð ð ð Ýð.à'*ð.ð .ð .ñô ð ð	øøøøðøøøõ �I—M’M 'Ñ*Ô*Ð0¨bÑ1Ô1×7Ò7Ñ9Ô9ð *Ø)ð ð3Ø2Ð2Øð ñ  ô  �ð "6Ð!5¸\Ð!JÑ!JÔ!J��øÝð 3ð 3ð 3Ý¥ C¡¤Ñ)Ô)¨sÐ2øøøøð3øøøà$ˆGØˆFØ"ˆIàˆØ˜
Ò"Ð"Ý" 9§=¢=°Ñ#9Ô#9Ð#?¸RÑ@Ô@×FÒFÑHÔHÐØð 8Ø'7�˜GÑ$ð (Ø$Ø ØØ"Ø ØØ"4ð	
ð 	
ð 		
ð €GØð ð	Ø7Ð7Ð7Ð7Ð7Ð7Ø#�mÐ$;Ñ<Ô<ÐBÀˆGˆGøÝð 	ð 	ð 	ØˆGˆGˆGð	øøøàð ?ÝÐ1°2Ñ6Ô6×<Ò<Ñ>Ô>ˆØð 
Ýð7ñ
ô 
ð 	
ð -ÐPÐ0AÐPˆZˆZÈ€Fà#Ø ØØØØØ0ðð ð sT   ÇG& Ç&G5Ç4G5É5
J  Ê 
J#Ê
JÊJ#ËK8 Ë8
L$ÌLÌL$ÎN ÎN%Î$N%c           
     óÈ  — t          |pd¦  «                             ¦   «         }t          |pd¦  «                             ¦   «                              d¦  «        }|s|sd S | dk    rÞt          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }d}|dk    rZt          |                     d¦  «        pd¦  «                             ¦   «                              d¦  «        }t          |¦  «        sd}|p|pd}|}	|	s!ddlm}
  |
¦   «         }	|	st          d	¦  «        ‚dd
||	d|dœS | dk    r|pt          }|}	d }|	sft          ¦   «         }|                     dd¦  «        }	|                     d¦  «        }|s+|                     dd¦  «                             d¦  «        p|}dd||	d||dœS | dk    �r¾ddlm} t          j        d¦  «        pi }|p`t          ¦   «         pRt          |                     d¦  «        pt          j        ¦  «                             ¦   «                              d¦  «        }|pct#          |t%          dt'          dd¦  «        ¦  «        ¦  «        r6t          |                     d¦  «        pd¦  «                             ¦   «         nd}	|                     d¦  «        p|                     d¦  «        }|	sƒt)          t+          t-          dd¦  «        ¦  «        ¬¦  «        }|                     dd¦  «        }	|                     d¦  «        }|s+|                     dd¦  «                             d¦  «        p|}d ||p|                     d¦  «        pd¦  «        ||	d||dœS | d k    rt/          ||||¬!¦  «        S t1          j        | ¦  «        }|�r$|j        dk    �rd}|j        r:t-          |j        d¦  «                             ¦   «                              d¦  «        }|}|sF| d"v r9t7          | ¦  «        }|                     dd¦  «                             d¦  «        }n	|p|j        }| d#k    rt;          |¦  «        }|}	|	set7          | ¦  «        }|                     dd¦  «        }	|s>|                     dd¦  «                             d¦  «        }| d#k    rt;          |¦  «        }d$}| d%k    rt=          ||	|¬&¦  «        }n¸| d'k    rd}n¯| d#k    rd}n¦t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }t?          |                     d(¦  «        ¦  «        }|rtA          | |¦  «        r|}n'tC          | ||p|                     dd¦  «        ¦  «        }| d#k    r|	stE          |¦  «        rtF          }	| ||                     d¦  «        |	d|dœS d S ))Nr,   rZ   rß   rc   rW   rà   r   ©Úresolve_anthropic_tokenú‰No Anthropic credentials found. Set ANTHROPIC_TOKEN or ANTHROPIC_API_KEY, run 'claude setup-token', or authenticate with 'claude /login'.r]   rf  rU  rÐ   r¿   Úlast_refreshr[   ©rc   rn   rW   r¿   rò   r‘  rÖ   rã   rä   rõ   é<   ÚHERMES_NOUS_MIN_KEY_TTL_SECONDSé  Ú	agent_keyÚagent_key_expires_atÚ
expires_atÚHERMES_NOUS_TIMEOUT_SECONDSÚ15©Útimeout_secondsr/   ©rc   rn   rW   r¿   rò   r˜  rÖ   ræ   )rÖ   rk   rJ  rK  >   úkimi-codingúkimi-coding-cnÚactualrg   rÁ   r½   râ   rn   )$r.   r;   rH   rp   r<   r�   Úagent.anthropic_adapterr�  r   r   r   rh   rå   rø   Úget_provider_auth_staterÌ   ÚDEFAULT_NOUS_INFERENCE_URLr   Úmaxr+   r   Úfloatr5   rŒ  r   Ú	auth_typeÚbase_url_env_varr   rõ   r!   rÅ   ro   r¼   rj   r    r   )rc   rÖ   rk   rJ  rK  r¾   rL   rK   rW   r¿   r�  r‘  Úcredsrå   Ústater˜  rû   Úenv_urlrn   r¶   rs   s                        r4   Ú_resolve_explicit_runtimer«  Ô  sÜ  € õ Ð+Ð1¨rÑ2Ô2×8Ò8Ñ:Ô:ÐÝÐ-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<×CÒCÀCÑHÔHÐØð Ð$5ð Øˆtà�;ÒÐÝ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆØˆØ˜;Ò&Ð&Ý˜yŸ}š}¨ZÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔG×NÒNÈsÑSÔSˆLÝ2°<Ñ@Ô@ð "Ø!�Ø$ÐS¨ÐSÐ8SˆØ"ˆØð 	ØGÐGÐGÐGÐGÐGà-Ð-Ñ/Ô/ˆGØð ÝðVñô ð ð
 $Ø,Ø ØØ Ø"4ð
ð 
ð 	
ð �>Ò!Ð!Ø$Ð>Õ(>ˆØ"ˆØˆØð 	MÝ5Ñ7Ô7ˆEØ—i’i 	¨2Ñ.Ô.ˆGØ Ÿ9š9 ^Ñ4Ô4ˆLØ$ð MØ Ÿ9š9 Z°Ñ4Ô4×;Ò;¸CÑ@Ô@ÐLÀH�à&Ø)Ø ØØ Ø(Ø"4ð
ð 
ð 	
ð �6ÒÑØ6Ð6Ð6Ð6Ð6Ð6åÔ0°Ñ8Ô8Ð>¸Bˆàð oÝ0Ñ2Ô2ðoå�5—9’9Ð1Ñ2Ô2ÐYµhÔ6YÑZÔZ×`Ò`ÑbÔb×iÒiÐjmÑnÔnð 	ð #ð 
å#ØÝ�B�Ð AÀ4ÑHÔHÑIÔIñô ð�C�—	’	˜+Ñ&Ô&Ð,¨"Ñ-Ô-×3Ò3Ñ5Ô5Ð5ð
 ð 	ð —Y’YÐ5Ñ6Ô6ÐQ¸%¿)º)ÀLÑ:QÔ:Qˆ
Øð 	MÝ4Ý %¥gÐ.KÈTÑ&RÔ&RÑ SÔ Sðñ ô ˆEð —i’i 	¨2Ñ.Ô.ˆGØŸš <Ñ0Ô0ˆJØ$ð MØ Ÿ9š9 Z°Ñ4Ô4×;Ò;¸CÑ@Ô@ÐLÀH�àØ%˜ lÐ&T°i·m²mÀIÑ6NÔ6NÐ&TÐRTÑUÔUØ ØØ Ø$Ø"4ð
ð 
ð 	
ð �?Ò"Ð"Ý-Ø1ØØ-Ø/ð	
ñ 
ô 
ð 	
õ  Ô# HÑ-Ô-€GØñ :
�7Ô$¨	Ò1Ñ1ØˆØÔ#ð 	PÝ˜gÔ6¸Ñ;Ô;×AÒAÑCÔC×JÒJÈ3ÑOÔOˆGà$ˆØð 	AØÐ<Ð<Ð<Ý<¸XÑFÔF�Ø Ÿ9š9 Z°Ñ4Ô4×;Ò;¸CÑ@Ô@��à"Ð@ gÔ&@�à�xÒÐÝ0°Ñ:Ô:ˆHà"ˆØð 	CÝ8¸ÑBÔBˆEØ—i’i 	¨2Ñ.Ô.ˆGØð CØ Ÿ9š9 Z°Ñ4Ô4×;Ò;¸CÑ@Ô@�Ø˜xÒ'Ð'Ý8¸ÑBÔB�Hà%ˆØ�yÒ Ð Ý0ØØØ)ðñ ô ˆHˆHð
 ˜ÒÐØ(ˆHˆHØ˜Ò!Ð!Ø(ˆHˆHå"% i§m¢m°JÑ&?Ô&?Ð&EÀ2Ñ"FÔ"F×"LÒ"LÑ"NÔ"N×"TÒ"TÑ"VÔ"VÐÝ-¨i¯mªm¸JÑ.GÔ.GÑHÔHˆOØð Õ#GÈÐReÑ#fÔ#fð Ø*��õ .Ø˜h¨Ð(T¸	¿ºÀiÐQSÑ8TÔ8Tñô �ð �xÒÐ¨ÐÕ4LÈXÑ4VÔ4VÐÝ5ˆGð !Ø Ø Ÿš¨Ñ,Ô,ØØ Ø"4ð
ð 
ð 	
ð ˆ4r6   )rÿ   rJ  rK  r¾   c           
     ó:$  ‡C— t          | ¦  «        }ddlm}m}  |¦   «         }t	          |t
          ¦  «        r|                     d¦  «        nd}t	          |t
          ¦  «        rK|                     |¦  «        }	t	          |	t
          ¦  «        r! ||	¦  «        st          d|›d|› d�¦  «        ‚|dk    r	dd	d
dd|dœS |pd                     ¦   «         }
|dk    rzd|
v rv|pd                     ¦   «         pCt          dd¦  «                             ¦   «         p!t          dd¦  «                             ¦   «         }dd|
 
                    d¦  «        |d|dœS |dk    r"t          |t          ¦   «         |||¬¦  «        }|S |dv rBddlm}  |¦   «         \  }}|r|st          d¦  «        ‚dd	| 
                    d¦  «        |d|dœS t!          |||¬¦  «        }|r||d<   |S |sÊ|sÈt          ¦   «         }t#          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }t#          |                     d¦  «        pd¦  «                             ¦   «         ŠC‰Cr:|d v r6d!}t'          ˆCfd"„|D ¦   «         ¦  «        st)          |||¬¦  «        }||d<   |S t+          |||¬#¦  «        }t          ¦   «         }t-          ||||||¬$¦  «        }|r|S |d%k    }|d%k    røt#          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }t#          |                     d¦  «        pd¦  «                             ¦   «         ŠCt          d&d¦  «                             ¦   «         }t          d'd¦  «                             ¦   «         }t/          |p|p|¦  «        }‰Cr|d(v rd)}t/          |p|¦  «        }|d*v o| o| }	 |rt1          |¦  «        nd}n# t2          $ r d}Y nw xY w|�rò|                     ¦   «         �rÝ|                     ¦   «         }d}|�"t9          |d+d¦  «        pt9          |d,d¦  «        }|d-k    �rO|��Lt;          d.t=          d/d0¦  «        ¦  «        }t9          |d1d¦  «        t9          |d2d¦  «        t9          |d3d¦  «        d4œ} t?          | |¦  «        sët@           !                    d5¦  «         	 | "                    ¦   «         }!n4# t2          $ r'}"t@           !                    d6|"¦  «         d}!Y d}"~"nd}"~"ww xY w|!�W|!}t9          |d+d¦  «        pt9          |d,d¦  «        }t9          |d1d¦  «        t9          |d2d¦  «        t9          |d3d¦  «        d4œ} |rt?          | |¦  «        st@           !                    d7¦  «         d}|�K|rItG          ||t9          |d8d¦  «        pt9          |dd¦  «        pd¬9¦  «        rtI          ||||||¬:¦  «        S |d-k    rï	 dd;l%m&}# tO          tQ          t          d<d=¦  «        ¦  «        ¬>¦  «        }$d- |#|p|                     d?¦  «        pd¦  «        |$                     dd¦  «         
                    d¦  «        |$                     d@d¦  «        |$                     dAdB¦  «        |$                     dC¦  «        |dDœS # t          $ r$ |dEk    r‚ t@           )                    dF¦  «         Y nw xY w|dGk    r¬	 tU          ¦   «         }$dGdH|$                     dd¦  «         
                    d¦  «        |$                     d@d¦  «        |$                     dAdI¦  «        |$                     dJ¦  «        |dKœS # t          $ r$ |dEk    r‚ t@           )                    dL¦  «         Y nw xY w|dMk    r´	 tW          ¦   «         }$dMdH|$                     d¦  «        pd 
                    d¦  «        ptX          |$                     d@d¦  «        |$                     dAdI¦  «        |$                     dJ¦  «        |dKœS # t          $ r$ |dEk    r‚ t@           )                    dN¦  «         Y nw xY w|dOk    r¬	 t[          ¦   «         }$dOd	|$                     dd¦  «         
                    d¦  «        |$                     d@d¦  «        |$                     dAdP¦  «        |$                     dQ¦  «        |dRœS # t          $ r$ |dEk    r‚ t@           )                    dS¦  «         Y nw xY w|dTk    rZt]          j        |¦  «        }%|%rD|%j/        dUk    r9ddVl0m1}&  |&¦   «         }$|d|$d         |$d@         |$                     dAdW¦  «        |dœS |dXk    rŸte          |¦  «        }$dXd	|$                     dd¦  «         
                    d¦  «        |$                     d@d¦  «        |$                     dYd¦  «        tg          |$                     dZ¦  «        pg ¦  «        |$                     dAd[¦  «        |d\œS |dk    �rðt#          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }dŠC|dk    rM|                     d¦  «        pd                     ¦   «          
                    d¦  «        ŠCti          ‰C¦  «        sdŠC‰Cpd]}d|                     ¦   «         v p‰Cod‰C                     ¦   «         v }'|'rõd}d^D ]`}(t#          |                     |(¦  «        pd¦  «                             ¦   «         })|)r&t          |)d¦  «                             ¦   «         }|r nŒa|s6t#          |                     d@¦  «        pd¦  «                             ¦   «         }|sDt          dd¦  «                             ¦   «         p!t          dd¦  «                             ¦   «         }|st          d_¦  «        ‚n!dd`l5m6}*  |*¦   «         }|st          da¦  «        ‚dd||db|dœS |dck    �rÈdddl7m8}+m9},m:}-m;}. |dev }/|/s |+¦   «         st          dfdg¬h¦  «        ‚ |¦   «                              dci ¦  «        }0|0                     di¦  «        pd                     ¦   «         p	 |-¦   «         }1 |,¦   «         pdj}2|0                     dki ¦  «        }3d}4|3                     dl¦  «        rf|3                     dm¦  «        rQ|3dl         |3dm         dnœ}4|3                     do¦  «        r|3do         |4dp<   |3                     dq¦  «        r|3dq         |4dq<   t#          |p|                     d?¦  «        pd¦  «                             ¦   «         }5t/          tx          j=                             drd¦  «                             ¦   «         ¦  «        }6 |.|5¦  «        r|6sdcdds|1› dt�du|2|1d)|dvœ}ndcdwds|1› dt�du|2|1|dxœ}|4r|4|dy<   |S t]          j        |¦  «        }%|%�r|%j/        d@k    �rt}          |¦  «        }$|dzk    �r)t          |$                     d@¦  «        ¦  «        �st#          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }7d}8|7|k    r<|                     d¦  «        pd                     ¦   «          
                    d¦  «        }8t�          |8p(|$                     dd¦  «         
                    d¦  «        ¦  «        }9tƒ          |9¦  «        r3t          |$¦  «        }$t„          |$d@<   |$                     dA¦  «        pd{|$dA<   t          |$                     d@¦  «        ¦  «        s<d| C                    |%jD        ¦  «        }:|:rd}|:› d~�nd};t          d|› d€|;› �|d�¬‚¦  «        ‚t#          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }dŠC||k    r<|                     d¦  «        pd                     ¦   «          
                    d¦  «        ŠC‰Cp(|$                     dd¦  «         
                    d¦  «        }|dzk    rt�          |¦  «        }d	}<|dƒk    r't‹          ||$                     d@d¦  «        |¬„¦  «        }<nç|d…k    rdH}<nÞ|dzk    rdH}<nÕt#          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }=t�          |                     d†¦  «        ¦  «        }>|d‡v r+ddˆlGmH}? |p|                     d?d¦  «        }@ |?||@¦  «        }<n<|>rt“          ||=¦  «        r|>}<n't•          |||p|                     d?d¦  «        ¦  «        }<|d‡v rdd‰lGmK}A  |A||<|¦  «        }|dŠk    rt™          jM        |¦  «        }|$                     d@d¦  «        }B|dzk    r|Bstƒ          |¦  «        rt„          }B||<||B|$                     dAdb¦  «        |dœS t)          |||¬¦  «        }||d<   |S )‹a)  Resolve runtime provider credentials for agent execution.

    target_model: Optional override for model_cfg.get("default") when
    computing provider-specific api_mode (e.g. OpenCode Zen/Go where different
    models route through different API surfaces). Callers performing an
    explicit mid-session model switch should pass the new model here so
    api_mode is derived from the model they are switching TO, not the stale
    persisted default. Other callers can leave it None to preserve existing
    behavior (api_mode derived from config).
    r   )r  r#   r  Nz	provider z" is disabled in config (providers.z.enabled: false)Úmoarg   zmoa://localzmoa-virtual-providerrU  r,   rß   z	azure.comÚAZURE_ANTHROPIC_KEYÚANTHROPIC_API_KEYr]   rZ   zazure-explicitræ   )rÖ   rk   rJ  rK  r¾   )Úvertexzgoogle-vertexz	vertex-aiz
gcp-vertexÚvertexai)Úget_vertex_configa“  Vertex AI credentials could not be resolved. Vertex uses OAuth2 (not a static API key): provide a service-account JSON via GOOGLE_APPLICATION_CREDENTIALS (or VERTEX_CREDENTIALS_PATH) in ~/.hermes/.env, or run 'gcloud auth application-default login' for ADC. Set the GCP project/region under vertex: in config.yaml if they aren't embedded in the credentials. Run `hermes setup` to install Vertex support.r°  zvertex-oauth)rÖ   rJ  rK  rÖ   rc   rW   )r  r,   )rP   zanthropic.comrM  c              3  ó8   •K  — | ]}t          ‰|¦  «        V — Œd S rx   )r)   )r{   r@   rK   s     €r4   r}   z+resolve_runtime_provider.<locals>.<genexpr>  sA   øè è € ð ð àõ & l°DÑ9Ô9ðð ð ð ð ð r6   rI  )rc   rÖ   rk   rJ  rK  r¾   rá   ÚOPENAI_BASE_URLr'   >   r  rN   T>   r  rá   rÚ   rÛ   rã   r“  r”  r•  r–  r—  r}  )r–  r—  r}  zINous pool entry agent_key expired/missing, refreshing selected pool entryz"Nous pool entry refresh failed: %szRNous pool entry agent_key still unavailable, falling through to runtime resolutionrÙ   )rW   )rc   rÕ   rÖ   rk   rÔ   r¾   rä   r™  rš  r›  r/   r¿   rò   Úportalr˜  r�  r  zUAuto-detected Nous provider but credentials failed; falling through to next provider.rÐ   r[   zhermes-auth-storer‘  r’  zVAuto-detected Codex provider but credentials failed; falling through to next provider.rÜ   zZAuto-detected xAI OAuth provider but credentials failed; falling through to next provider.rÝ   zqwen-cliÚexpires_at_ms)rc   rn   rW   r¿   rò   r¶  rÖ   z@Qwen OAuth credentials failed; falling through to next provider.rÞ   Úoauth_minimax)Ú)resolve_minimax_oauth_runtime_credentialsÚoauthzcopilot-acpÚcommandÚargsÚprocess)rc   rn   rW   r¿   rº  r»  rò   rÖ   rà   )r  Úapi_key_envz£No Azure Anthropic API key found. Set AZURE_ANTHROPIC_KEY or ANTHROPIC_API_KEY, or point key_env/api_key_env in your config.yaml model section at a custom env var.rŽ  r�  ÚenvÚbedrock)Úhas_aws_credentialsÚresolve_aws_auth_env_varÚresolve_bedrock_regionÚis_anthropic_bedrock_model>   úaws-bedrockúamazon-bedrockÚawsÚamazonr¿  zçNo AWS credentials found for Bedrock. Configure one of:
  - AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY
  - AWS_PROFILE (for SSO / named profiles)
  - IAM instance role (EC2, ECS, Lambda)
Or run 'aws configure' to set up credentials.Úno_aws_credentials)ÚcodeÚregionzaws-sdk-default-chainÚ	guardrailÚguardrail_identifierÚguardrail_version)ÚguardrailIdentifierÚguardrailVersionÚstream_processing_modeÚstreamProcessingModeÚtraceÚAWS_BEARER_TOKEN_BEDROCKzhttps://bedrock-runtime.z.amazonaws.comzaws-sdk)rc   rn   rW   r¿   rò   rÊ  Úbedrock_anthropicrÖ   rÆ   )rc   rn   rW   r¿   rò   rÊ  rÖ   Úguardrail_configr   zlocal-offlinez, z Set rC   z*No usable credentials found for provider 'z'.Úmissing_api_key)rc   rÉ  rÁ   r½   râ   rn   rê   rí   rï   rñ   )Nr  r$  r  r#   r¯   r°   rp   Ú
ValueErrorr;   r5   rH   rŒ  rµ   Úagent.vertex_adapterr²  r   ra  r.   r<   r�   rs  r   r«  rA   r   rR   r
  r  rô   r¤  r+   r   rq   r§   Útry_refresh_currentr   rþ   rh   rå   r   r¥  rr   r   r   r   r   r   r¦  rQ   r¸  r   r9  r�   r¡  r�  Úagent.bedrock_adapterrÀ  rÁ  rÂ  rÃ  r@  rA  r   r   r!   r    r   r“   Úapi_key_env_varsrÅ   ro   rÃ   rî   r¼   rj   rð   rø   rù   )Drÿ   rJ  rK  r¾   rÖ   r  r#   Ú	_full_cfgÚ
_provs_cfgÚ_blockÚ	_eff_baseÚ
_azure_keyÚazure_runtimer²  ÚtokenrW   Úcustom_runtimerk   rL   Ú_known_cloud_hostsrÒ   rc   Úexplicit_runtimeÚshould_use_poolÚenv_openai_base_urlrj  Úhas_custom_endpointÚhas_runtime_overriderÔ   rÕ   r  Úmin_ttlÚ
nous_stateÚ	refreshedr¬   rå   r¨  rû   r¸  Ú_is_azure_endpointÚhint_keyÚenv_varr�  rÀ  rÁ  rÂ  rÃ  Úis_explicitÚ_bedrock_cfgrÊ  Úauth_sourceÚ_grrÕ  Ú_current_modelÚ_has_bearer_tokenÚ_cfg_providerÚ_cfg_urlÚ_effective_urlÚ	env_namesÚhintrn   r¶   rs   rî   Ú
_effectiverð   r¿   rK   sD                                                                      @r4   Úresolve_runtime_providerrü  �  s†  ø€ õ" 4°IÑ>Ô>Ðð CÐBÐBÐBÐBÐBÐBÐBØ�‘”€IÝ/9¸)ÅTÑ/JÔ/JÐT�—’˜{Ñ+Ô+Ð+ÐPT€JÝ�*�dÑ#Ô#ð Ø—’Ð 2Ñ3Ô3ˆÝ�f�dÑ#Ô#ð 	Ð,?Ð,?ÀÑ,GÔ,Gð 	ÝðCÐ.ð Cð CØ0ðCð Cð Cñô ð ð
 ˜UÒ"Ð"àØ*Ø%Ø-Ø,Ø"4ð
ð 
ð 	
ð #Ð( b×/Ò/Ñ1Ô1€IØ˜[Ò(Ð(¨[¸IÐ-EÐ-EàÐ# ×*Ò*Ñ,Ô,ð 8ÝÐ,¨bÑ1Ô1×7Ò7Ñ9Ô9ð8åÐ*¨BÑ/Ô/×5Ò5Ñ7Ô7ð 	ð $Ø,Ø!×(Ò(¨Ñ-Ô-Ø!Ø&Ø"4ð
ð 
ð 	
ð ˜_Ò,Ð,Ý6Ø1Ý'Ñ)Ô)Ø-Ø/Ø%ð
ñ 
ô 
ˆð Ðð Ð_Ð_Ð_Ø:Ð:Ð:Ð:Ð:Ð:à+Ð+Ñ-Ô-‰ˆˆxØð 		˜Hð 		Ýð@ñô ð ð !Ø*Ø Ÿš¨Ñ,Ô,ØØ$Ø"4ð
ð 
ð 	
õ 3Ø-Ø)Ø+ðñ ô €Nð
 ð Ø/AˆÐ+Ñ,ØÐð ð Ð%5ð Ý%Ñ'Ô'ˆ	Ý˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆÝ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔCˆØð 	˜L¨LÐ8Ð8ð"Ðõ
 ð ð ð ð à.ðñ ô ñ ô ð 
õ 6Ø'9Ø%5Ø&7ðñ ô �ð
 1C�Ð,Ñ-Ø�åØØ)Ø+ðñ ô €Hõ
 "Ñ#Ô#€IÝ0ØØ-ØØ)Ø+Ø!ðñ ô Ðð ð  ØÐà ,Ò.€OØ�<ÒÐÝ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆÝ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔCˆÝ%Ð&7¸Ñ<Ô<×BÒBÑDÔDÐÝ")Ð*?ÀÑ"DÔ"D×"JÒ"JÑ"LÔ"LÐÝ"Øð 'Ø"ð'à&ñ
ô 
Ðð
 ð 	'˜LÐ,>Ð>Ð>Ø"&ÐÝ#Ð$4Ð$IÐ8IÑJÔJÐàÐ"8Ð8ð )Ø'Ð'ð)à(Ð(ð 	ðØ&5Ð?�y˜Ñ"Ô"Ð"¸4ˆˆøÝð ð ð Øˆˆˆðøøøàñ >�×$Ò$Ñ&Ô&ñ >Ø—’‘”ˆØˆØÐå˜Ð0°$Ñ7Ô7ð 6Ý˜5 .°"Ñ5Ô5ð ð �vÒÑ %Ñ"3Ý˜"�gÐ&GÈÑNÔNÑOÔOˆGå$ U¨K¸Ñ>Ô>Ý(/°Ð7MÈtÑ(TÔ(TÝ  ¨°Ñ6Ô6ðð ˆJõ
 (¨
°GÑ<Ô<ð &Ý—’ÐhÑiÔiÐið%Ø $× 8Ò 8Ñ :Ô :�I�IøÝ ð %ð %ð %Ý—L’LÐ!EÀsÑKÔKÐKØ $�I�I�I�I�I�Iøøøøð%øøøð Ð(Ø%�Eå Ð'8¸$Ñ?Ô?ð >Ý" 5¨.¸"Ñ=Ô=ð !õ
 &-¨U°KÀÑ%FÔ%FÝ07¸Ð?UÐW[Ñ0\Ô0\Ý!(¨°¸Ñ!>Ô!>ð"ð "�Jð
 $ð &Õ+?À
ÈGÑ+TÔ+Tð &Ý—L’LÐ!uÑvÔvÐvØ#%�LàÐØð å0ØØå˜EÐ#5°tÑ<Ô<ð Ý˜u j°$Ñ7Ô7ðàðñ ô ð õ 4Ø!ØØ#5Ø#ØØ)ðñ ô ð ð �6ÒÐð	=Ø:Ð:Ð:Ð:Ð:Ð:å4Ý %¥gÐ.KÈTÑ&RÔ&RÑ SÔ Sðñ ô ˆEð #Ø)˜M¨,Ð*X¸)¿-º-È	Ñ:RÔ:RÐ*XÐVXÑYÔYØ!ŸIšI j°"Ñ5Ô5×<Ò<¸SÑAÔAØ Ÿ9š9 Y°Ñ3Ô3ØŸ)š) H¨hÑ7Ô7Ø#Ÿiši¨Ñ5Ô5Ø&8ðð ð øõ ð 	=ð 	=ð 	=Ø! VÒ+Ð+Øõ �KŠKð <ñ =ô =ð =ð =ð =ð	=øøøð �>Ò!Ð!ð	=Ý5Ñ7Ô7ˆEà*Ø-Ø!ŸIšI j°"Ñ5Ô5×<Ò<¸SÑAÔAØ Ÿ9š9 Y°Ñ3Ô3ØŸ)š) HÐ.AÑBÔBØ %§	¢	¨.Ñ 9Ô 9Ø&8ðð ð øõ ð 	=ð 	=ð 	=Ø! VÒ+Ð+Øõ �KŠKð <ñ =ô =ð =ð =ð =ð	=øøøð �;ÒÐð	=Ý9Ñ;Ô;ˆEà'Ø-Ø"ŸYšY zÑ2Ô2Ð8°b×@Ò@ÀÑEÔEÐcÕIcØ Ÿ9š9 Y°Ñ3Ô3ØŸ)š) HÐ.AÑBÔBØ %§	¢	¨.Ñ 9Ô 9Ø&8ðð ð øõ ð 	=ð 	=ð 	=Ø! VÒ+Ð+ØÝ�KŠKð <ñ =ô =ð =ð =ð =ð	=øøøð �<ÒÐð	=Ý4Ñ6Ô6ˆEà(Ø.Ø!ŸIšI j°"Ñ5Ô5×<Ò<¸SÑAÔAØ Ÿ9š9 Y°Ñ3Ô3ØŸ)š) H¨jÑ9Ô9Ø!&§¢¨?Ñ!;Ô!;Ø&8ðð ð øõ ð 	=ð 	=ð 	=Ø! VÒ+Ð+ØÝ�KŠKð <ñ =ô =ð =ð =ð =ð	=øøøð �?Ò"Ð"Ý#Ô'¨Ñ1Ô1ˆØð 
	�wÔ(¨OÒ;Ð;ØQÐQÐQÐQÐQÐQØ=Ð=Ñ?Ô?ˆEà$Ø0Ø! *Ô-Ø  Ô+ØŸ)š) H¨gÑ6Ô6Ø&8ðð ð ð �=Ò Ð Ý=¸hÑGÔGˆà%Ø*ØŸ	š	 *¨bÑ1Ô1×8Ò8¸Ñ=Ô=Ø—y’y ¨BÑ/Ô/Ø—y’y ¨BÑ/Ô/Ý˜Ÿš 6Ñ*Ô*Ð0¨bÑ1Ô1Ø—i’i ¨)Ñ4Ô4Ø"4ð	
ð 	
ð 		
ð �;ÒÑõ ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆØˆØ˜;Ò&Ð&Ø%ŸMšM¨*Ñ5Ô5Ð;¸×BÒBÑDÔD×KÒKÈCÑPÔPˆLÝ2°<Ñ@Ô@ð "Ø!�ØÐ>Ð#>ˆð )¨H¯NªNÑ,<Ô,<Ð<ð 
ØÐ@˜[¨L×,>Ò,>Ñ,@Ô,@Ð@ð 	ð ð %	ð ˆEØ6ð ð �Ý˜iŸmšm¨HÑ5Ô5Ð;¸Ñ<Ô<×BÒBÑDÔD�Øð Ý# G¨RÑ0Ô0×6Ò6Ñ8Ô8�EØð Ø˜øð ð DÝ˜IŸMšM¨)Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC�àð åÐ1°2Ñ6Ô6×<Ò<Ñ>Ô>ð @ÝÐ2°BÑ7Ô7×=Ò=Ñ?Ô?ð ð ð ÝðEñô ð ðð HÐGÐGÐGÐGÐGØ+Ð+Ñ-Ô-ˆEØð ÝðVñô ð ð
 $Ø,Ø ØØØ"4ð
ð 
ð 	
ð �9ÒÑð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð )Ð,iÐiˆØð 	Ð#6Ð#6Ñ#8Ô#8ð 	Ýð@ð
 *ðñ ô ð ð #�{‘}”}×(Ò(¨°BÑ7Ô7ˆà×"Ò" 8Ñ,Ô,Ð2°×9Ò9Ñ;Ô;ÐWÐ?UÐ?UÑ?WÔ?WˆØ.Ð.Ñ0Ô0ÐKÐ4Kˆà×Ò˜{¨BÑ/Ô/ˆØÐØ�7Š7Ð)Ñ*Ô*ð 	9¨s¯wªwÐ7JÑ/KÔ/Kð 	9à'*Ð+AÔ'BØ$'Ð(;Ô$<ð ð  Ðð �wŠwÐ/Ñ0Ô0ð YØ;>Ð?WÔ;XÐ Ð!7Ñ8Ø�wŠw�wÑÔð 9Ø,/°¬LÐ  Ñ)õ ˜\ÐK¨Y¯]ª]¸9Ñ-EÔ-EÐKÈÑLÔL×RÒRÑTÔTˆÝ ¥¤§¢Ð0JÈBÑ!OÔ!O×!UÒ!UÑ!WÔ!WÑXÔXÐØ%Ð% nÑ5Ô5ð 	Ð>Oð 	ð &Ø0ØM°vÐMÐMÐMØ$Ø%Ø Ø%)Ø&8ð	ð 	ˆGˆGð &Ø.ØM°vÐMÐMÐMØ$Ø%Ø Ø&8ðð ˆGð ð 	;Ø*:ˆGÐ&Ñ'Øˆõ  Ô# HÑ-Ô-€GØñ _
�7Ô$¨	Ò1Ñ1Ý4°XÑ>Ô>ˆð
 �xÒÑÕ(9¸%¿)º)ÀIÑ:NÔ:NÑ(OÔ(OÑÝ 	§¢¨jÑ 9Ô 9Ð ?¸RÑ@Ô@×FÒFÑHÔH×NÒNÑPÔPˆMØˆHØ Ò(Ð(Ø%ŸMšM¨*Ñ5Ô5Ð;¸×BÒBÑDÔD×KÒKÈCÑPÔP�Ý6ØÐA˜EŸIšI j°"Ñ5Ô5×<Ò<¸SÑAÔAñô ˆNõ (¨Ñ7Ô7ð IÝ˜U™œ�Ý#B��iÑ Ø"'§)¢)¨HÑ"5Ô"5Ð"H¸��h‘õ ! §¢¨9Ñ!5Ô!5Ñ6Ô6ð 	ØŸ	š	 'Ô":Ñ;Ô;ˆIØ+4Ð<Ð'˜9Ð'Ð'Ð'Ð'¸"ˆDÝØO¸XÐOÐOÈÐOÐOØ!Ø&ðñ ô ð õ ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKˆØˆØ˜8Ò#Ð#Ø%ŸMšM¨*Ñ5Ô5Ð;¸×BÒBÑDÔD×KÒKÈCÑPÔPˆLØÐH 5§9¢9¨Z¸Ñ#<Ô#<×#CÒ#CÀCÑ#HÔ#HˆØ�xÒÐÝ0°Ñ:Ô:ˆHØ%ˆØ�yÒ Ð Ý0ØØ—	’	˜) RÑ(Ô(Ø)ðñ ô ˆHˆHð
 ˜ÒÐØ(ˆHˆHØ˜Ò!Ð!Ø(ˆHˆHå"% i§m¢m°JÑ&?Ô&?Ð&EÀ2Ñ"FÔ"F×"LÒ"LÑ"NÔ"N×"TÒ"TÑ"VÔ"VÐå-¨i¯mªm¸JÑ.GÔ.GÑHÔHˆOØÐ:Ð:Ð:ð FÐEÐEÐEÐEÐEØ)ÐI¨Y¯]ª]¸9ÀbÑ-IÔ-I�
Ø2Ð2°8¸ZÑHÔH��Ø ð Õ%IÈ(ÐTgÑ%hÔ%hð Ø*��õ
 .Ø˜h¨Ð(T¸	¿ºÀiÐQSÑ8TÔ8Tñô �ð Ð6Ð6Ð6ØEÐEÐEÐEÐEÐEØ2Ð2°8¸XÀxÑPÔPˆHØ�zÒ!Ð!ÝÔDÀXÑNÔNˆHØ—)’)˜I rÑ*Ô*ˆØ�xÒÐ¨ÐÕ4LÈXÑ4VÔ4VÐÝ5ˆGà Ø Ø ØØ—i’i ¨%Ñ0Ô0Ø"4ð
ð 
ð 	
õ *Ø-Ø)Ø+ðñ ô €Gð
 %7€GÐ Ñ!Ø€Nsv   Ï'O; Ï;P
Ð	P
Ó%S: Ó:
T+ÔT&Ô&T+Ø	B<[ Û+[4Û3[4Û>A9]8 Ý8+^&Þ%^&Þ0B`2 à2+a áa á*A9c$ ã$+dädÚerrorrR   c                óh   — t          | t          ¦  «        rt          | ¦  «        S t          | ¦  «        S rx   )r¯   r   r   r.   )rý  s    r4   Úformat_runtime_provider_errorrÿ  ÷  s.   € Ý�%�Ñ#Ô#ð (Ý  Ñ'Ô'Ð'Ýˆu‰:Œ:Ðr6   )r,   )r-   r.   r/   r.   r0   r.   )r7   r.   r0   r.   )r@   r.   r0   rA   )rK   r.   rL   r.   r0   rA   )rW   r.   r0   rX   )rc   r.   rW   r.   rd   r.   r0   r.   )rk   rl   rW   r.   r0   r.   )rW   r.   r0   r.   )rW   r.   r0   rA   )r0   rl   rx   )rc   rX   r¶   rX   r0   rA   )rk   rl   r¿   r.   r¾   rX   r0   r.   )rÈ   r   r0   rX   )r0   r.   )rc   r.   rn   r.   rk   rÍ   r0   r.   )rc   r.   rÕ   r
   rÖ   r.   rk   rÍ   rÔ   r×   r¾   rX   r0   rl   )rÿ   rX   r0   r.   )NN)
rW   r.   r  r.   r  rX   r  rX   r0   rÍ   )rÕ   rl   r  rl   r0   r  )rÖ   r.   r0   rÍ   )rÖ   r.   r0   rA   )rd   r.   r0   rX   )rW   rX   r>  rX   rd   rX   r0   rX   )rF  rl   r0   rl   )rÖ   r.   rJ  rX   rK  rX   r0   rÍ   )rÖ   r.   rJ  rX   rK  rX   r0   rl   )rÖ   r.   rk   rl   rJ  rX   rK  rX   r¾   rX   r0   rl   )rc   r.   rÖ   r.   rk   rl   rJ  rX   rK  rX   r¾   rX   r0   rÍ   )
rÿ   rX   rJ  rX   rK  rX   r¾   rX   r0   rl   )rý  rR   r0   r.   )`Ú__doc__Ú
__future__r   Úloggingr@  rö   Úurllib.parser   Útypingr   r   r   Ú	getLoggerÚ__name__rq   Ú
hermes_clir   rø   Úagent.credential_poolr	   r
   r   r   r   Úagent.secret_scoper   r2   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r$  r"   r#   r$   rh   r%   r&   Úhermes_constantsr'   r(   Úutilsr)   r*   r+   r5   r?   rJ   rV   rb   rj   ru   rš   r�   r­   rµ   r¼   rÅ   rÊ   ro   rÌ   rÓ   rþ   r  r  r  r  r,  r.  r3  r=  rD  r0  rH  ra  rs  rŒ  r«  rü  rÿ  r�   r6   r4   ú<module>r     s  ðØ MÐ Mà "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à	ˆÔ	˜8Ñ	$Ô	$€à 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð ð ð ð ð ð ð ð ð ð ð ð ð ð 9Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð*ð ð ð ð ð ð ð ð ð ð
 OÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ Cð
/ð 
/ð 
/ð 
/ð 
/ð3ð 3ð 3ð 3ð=ð =ð =ð =ð
5ð 5ð 5ð 5ð<,ð ,ð ,ð ,ð^Oð Oð Oð Oð Oð2Bð Bð Bð Bð,61ð 61ð 61ð 61ðr"ð "ð "ð "ðJð ð ð ð.ð ð ð ð,8ð 8ð 8ð 8ð 8ð* #'ð	"ð "ð "ð "ð "ð "ð:ð ð Ð ðð ð ð ð0ð 0ð 0ð 0ðð ð ð ð> +/Ø%)Ø"&ðPð Pð Pð Pð Pð Pðfð ð ð ð ð, (,Ø#'ð	ð ð ð ð ð@ð ð ð ð0ð 0ð 0ð 0ðKð Kð Kð Kð\ð ð ð ð3ð 3ð 3ð 3ðlCð Cð Cð CðP #Ø%)Øð	Vð Vð Vð Vð Vð Vðr8ð 8ð 8ð 8ð,ð ,ð ,ð ,ð '+Ø'+ð	Að Að Að Að Að AðN '+Ø'+ð	Kð Kð Kð Kð Kð Kðd '+Ø'+Ø"&ðfð fð fð fð fð fð\ '+Ø'+Ø"&ðjð jð jð jð jð jð^  $Ø&*Ø'+Ø"&ðs	ð s	ð s	ð s	ð s	ð s	ðlð ð ð ð ð r6   