Ë
    áß²jì2  ã                  ó¦  — U d Z ddlmZ ddlZddlmZmZ  ej                  d«      ZdZ	de
d<   d	Zde
d
<   dZde
d<   dZde
d<   dZde
d<    eddh«      Zde
d<   dZde
d<    eddh«      Zde
d<   dZde
d<   dZde
d<   dZde
d<   d Zde
d!<   dZde
d"<   d#d$d%œZd&e
d'<   d Zde
d(<   d)d$iZd&e
d*<   dZde
d+<   dZde
d,<   dZde
d-<   d.Zde
d/<   d)d$iZd&e
d0<   d1Z de
d2<   d)d$iZ!d&e
d3<   d1Z"de
d4<   d)d$iZ#d&e
d5<   dZ$de
d6<   d)d$iZ%d&e
d7<   d8Z&de
d9<   dGd:„Z'dHd;„Z(dHd<„Z)	 dI	 	 	 	 	 	 	 dJd=„Z*dKd>„Z+dLdMd?„Z,dNd@„Z-efdOdA„Z.	 dIdBdCœ	 	 	 	 	 	 	 	 	 dPdD„Z/dQdE„Z0eZ1de
dF<   y)Ruñ  Canonical reasoning-effort vocabulary and wire clamping.

Hermes' internal effort ladder (``VALID_REASONING_EFFORTS`` plus ``none``) is wider than any
single provider wire accepts; hand-rolled per-transport maps leaked new levels (``ultra``) to
wires that 400 and inverted the ladder (unknown â†’ weak default). Single source of truth:
:data:`EFFORT_LADDER` (lowâ†’high), :func:`clamp_effort` (verbatim if supported, else the
nearest WEAKER level; only when nothing weaker exists the weakest supported), and named
wire-vocabulary constants so call sites declare data. Rules: wire shape stays local, only the
vocabulary math lives here; unset stays unset (never invent an effort); when a provider
rejects a level fix its declared set, never a predicate.
é    )ÚannotationsN)ÚOptionalÚSequencez (?:^|[^a-z0-9])k3(?:[^a-z0-9]|$))ÚnoneÚminimalÚlowÚmediumÚhighÚxhighÚmaxÚultraútuple[str, ...]ÚEFFORT_LADDER)r   r   r   r	   r
   r   r   ÚOPENAI_COMPAT_WIRE_EFFORTS)r   r   r	   r
   r   r   ÚCODEX_GPT56_EFFORTS)r   r   r	   r
   r   ÚCODEX_LEGACY_EFFORTS)r   r	   r
   r   r   ÚCODEX_ASTRA_EFFORTSzgpt-6-astrazgpt-6-astra-900kzfrozenset[str]ÚASTRA_MODEL_IDS)z	gpt-6-solzgpt-6-terraz
gpt-6-lunaÚGPT6_TIER_PREFIXESzgpt-daybreak-blue-latestzgpt-daybreak-blue-latest-900kÚDAYBREAK_MODEL_IDS)r   r	   r
   r   ÚXAI_GROK46_EFFORTS)r   r	   r
   ÚXAI_LEGACY_EFFORTS)r   r   r	   r
   r   ÚACTUAL_RELAY_EFFORTS)r   r
   r   ÚKIMI_K3_EFFORTSÚKIMI_K2_EFFORTSr
   r   )r	   r   zdict[str, str]ÚKIMI_K3_OVERRIDESÚOX_ALPHA_EFFORTSr   ÚOX_ALPHA_OVERRIDESÚTOKENHUB_EFFORTSÚNEBIUS_EFFORTSÚSOLAR_EFFORTS)r
   r   ÚGLM52_EFFORTSÚGLM52_OVERRIDES)r   r	   r
   r   ÚGLM53_EFFORTSÚGLM53_OVERRIDESÚDEEPSEEK_V4_EFFORTSÚDEEPSEEK_V4_OVERRIDESÚOLLAMA_CLOUD_EFFORTSÚOLLAMA_CLOUD_OVERRIDES)r   r   r	   r
   r   ÚMETA_AI_EFFORTSc                óx   — | xs dj                  «       j                  «       j                  dd«      d   t        v S )z÷``gpt-6-astra`` or its Hermes-side ``-900k`` picker alias, with or without a ``vendor/`` prefix.
    The single home for the slug set: picker gating, effort vocabulary and the request sanitizer all
    key off it, so a new Astra alias is one edit.Ú ú/é   éÿÿÿÿ)ÚstripÚlowerÚrsplitr   )Úmodels    ú;/home/ubuntu/.hermes/hermes-agent/agent/reasoning_effort.pyÚis_astra_modelr5   Z   s7   € ð ŠK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Ñ;¼ÐNÐNó    c                óè   — t        | «      rt        S | xs dj                  «       j                  «       j	                  dd«      d   }d|v s|j                  t        «      s|t        v rt        S t        S )z9Supported effort set for an OpenAI/Codex Responses model.r,   r-   r.   r/   zgpt-5.6)
r5   r   r0   r1   r2   Ú
startswithr   r   r   r   )r3   Úbares     r4   Úcodex_supported_effortsr:   a   so   € ä�eÔÜ"Ð"ØŠK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Ñ;€Dð ˜Ñ §¡Ô0BÔ CÀtÔOaÑGaô 	ðô "ðr6   c                ó¬   — | xs dj                  «       j                  «       j                  d«      d   }t        j	                  |«      rt
        S t        S )u�  Supported effort set for a Moonshot/Kimi slug (bare ``k3``, ``k3-256k``, ``kimi-k3*`` â†’ K3).

    K3 is served as the bare slug ``k3``, plan variants like ``k3-256k``, and the ``kimi-k3*`` aliases; its
    documented set is low/high/max. Everything earlier speaks low/medium/high. Boundary-matched so K2-era
    names (``kimi-k2.6``) never match (detection regex from #76427 by @ruizanthony).
    r,   r-   r/   )r0   r1   ÚsplitÚ_KIMI_K3_SLUG_REÚsearchr   r   )r3   Úms     r4   Úkimi_supported_effortsr@   m   sG   € ð 
Š�"×ÑÓ×#Ñ#Ó%×+Ñ+¨CÓ0°Ñ4€AÜ.×5Ñ5°aÔ8Œ?ÐM¼oÐMr6   c                ó4  — t        | xs d«      j                  «       j                  «       }|r|s| S d„ |D «       D �cg c]  }|t        v sŒ|‘Œ }}|r||v r| S |r|j	                  |«      |v r||   S |t        vr| S |D �cg c]
  }|dk7  sŒ	|‘Œ }}|s| S t        j                  |«      }|D �cg c]  }t        j                  |«      |k  sŒ|‘Œ }	}|	rt        |	t        j
                  ¬«      S t        |t        j
                  ¬«      S c c}w c c}w c c}w )u�  Clamp a requested reasoning effort onto a wire's supported levels.

    ``overrides`` (a declared vendor mapping, e.g. Kimi K3 ``medium â†’ high``) is consulted
    first. Otherwise the request passes through unchanged when it is supported, when the
    supported set is unknown/empty, or when it isn't a recognized ladder level (custom
    providers may use bespoke names). Else the **nearest weaker** supported level is returned
    so a clamp never escalates cost; when nothing weaker exists, the weakest supported level
    (the provider's floor is the closest honest match). Monotonic: a stronger request never
    resolves weaker than a weaker request would.
    r,   c              3  ój   K  — | ]+  }t        |«      j                  «       j                  «       –— Œ- y ­w©N)Ústrr0   r1   )Ú.0Úss     r4   ú	<genexpr>zclamp_effort.<locals>.<genexpr>ˆ   s#   è ø€ Ò%PÀ¤c¨!£f§l¡l£n×&:Ñ&:×&<Ñ%Pùs   ‚13r   )Úkey)rD   r0   r1   r   ÚgetÚindexr   Úmin)
ÚeffortÚ	supportedÚ	overridesÚ	requestedÚlvlÚsupported_normÚlevelÚ
candidatesÚrequested_idxÚbelows
             r4   Úclamp_effortrV   x   s  € ô �F’L˜bÓ!×'Ñ'Ó)×/Ñ/Ó1€IÙ™IØˆÙ%PÀiÔ%PÖi˜cÐTWÔ[hÒTh’cÐi€NÐiÙ˜Y¨.Ñ8ØˆÙ�Y—]‘] 9Ó-°Ñ?Ø˜Ñ#Ð#ØœÑ%Øˆð &4ÖG˜E°uÀ³’%ÐG€JÐGÙØˆÜ!×'Ñ'¨	Ó2€MØ *ÖY�u¬m×.AÑ.AÀ%Ó.HÈ=Ó.XŠUÐY€EÐYÙ27Œ3ˆuœ-×-Ñ-Ô.Ðe¼SÀÔQ^×QdÑQdÔ=eÐeùò jùò Hùò Zs#   ½DÁDÂ
DÂDÂ/DÃDc                ón   — | xs dj                  «       j                  «       dk(  rt        |«      S t        S )zÞLevels the (provider, model) route's ENTRY clamp accepts: the Codex/OpenAI Responses set per
    model generation, else the widest OpenAI-compatible vocabulary (narrower providers clamp again
    downstream, never upward).r,   zopenai-codex)r0   r1   r:   r   )Úproviderr3   s     r4   Úroute_supported_effortsrY   ™   s3   € ð 	Š�B×ÑÓ×%Ñ%Ó'¨>Ò9Ü& uÓ-Ð-Ü%Ð%r6   c                ó¦   — t        | xs d«      j                  «       j                  «       }t        |t	        ||«      «      }|r||k(  r|S |› d|› d�S )a   Picker / ``/reasoning`` status label for a ladder level: the level itself when the route sends
    it verbatim, else ``"<level> (sends <clamped> on this route)"`` so a Hermes-internal step such as
    ``ultra`` (#61634) is never presented as a distinct wire level the route does not have.r,   z (sends z on this route))rD   r0   r1   rV   rY   )rL   rX   r3   rO   Úclampeds        r4   Úeffort_display_labelr\   ¢   s]   € ô �F’L˜bÓ!×'Ñ'Ó)×/Ñ/Ó1€IÜ˜9Ô&=¸hÈÓ&NÓO€GÙ%¨°IÒ)=ˆ9ÐqÀiÀ[ÐPXÐY`ÐXaÐapÐCqÐqr6   c                óÆ   — t        | t        «      r| j                  d«      du ryt        | j                  d«      xs d«      j	                  «       j                  «       xs dS )u‰   The user's explicit effort, or None (absent/malformed config, no effort, or reasoning
    disabled) â€” callers then omit the wire field.ÚenabledFNrL   r,   )Ú
isinstanceÚdictrI   rD   r0   r1   )Úreasoning_configs    r4   Úrequested_effortrb   «   sY   € ô Ð&¬Ô-Ð1A×1EÑ1EÀiÓ1PÐTYÑ1YØÜÐ×#Ñ# HÓ-Ò3°Ó4×:Ñ:Ó<×BÑBÓDÒLÈÐLr6   c                óØ   — t        | t        «      s| S t        | j                  d«      xs d«      j	                  «       j                  «       }|rt        ||«      n|}||k7  ri | ¥d|i¥S | S )a¤  Return ``reasoning_config`` with its ``effort`` clamped onto ``supported`` (non-dicts and
    configs without an effort pass through untouched).

    The entry clamp for an OpenAI-compatible chat-completions request builder: Hermes-internal
    ``ultra`` never reaches a wire (#89503 main transport, #112010 aux/MoA), while provider
    profiles with narrower vocabularies clamp again downstream. Unset stays unset.
    rL   r,   )r_   r`   rD   rI   r0   r1   rV   )ra   rM   rL   r[   s       r4   Úclamp_reasoning_configrd   ³   ss   € ô Ð&¬Ô-ØÐÜÐ!×%Ñ% hÓ/Ò5°2Ó6×<Ñ<Ó>×DÑDÓF€FÙ17Œl˜6 9Ô-¸V€GØ6=ÀÒ6GÐ2ÐÐ2 ¨'Ñ2Ð]ÐM]Ð]r6   F)Úalways_emit_togglec               óÊ   — t        | t        «      r| j                  d«      du rdddiii fS t        | «      }t	        |dk(  rdn|||«      }||v r|rdddiini d|ifS dddiii fS )	a+  Translate a reasoning config onto the Moonshot/DeepSeek chat_completions wire:
    ``extra_body.thinking`` toggle and top-level ``reasoning_effort``.

    Moonshot 400s when both are sent, so by default the effort (when it lands in
    ``efforts``) replaces the toggle. DeepSeek instead requires the toggle on every
    request (an omitted toggle defaults thinking on and then demands
    ``reasoning_content`` echoes), hence ``always_emit_toggle``. A requested effort of
    ``none`` is not a level on these wires; it falls back to the plain toggle.
    r^   FÚthinkingÚtypeÚdisabledr   NÚreasoning_effort)r_   r`   rI   rb   rV   )ra   ÚeffortsrN   re   rL   r[   s         r4   Úthinking_toggle_extrasrl   Â   s—   € ô  Ð"¤DÔ)Ð.>×.BÑ.BÀ9Ó.MÐQVÑ.VØ˜V ZÐ0Ð1°2Ð5Ð5ÜÐ.Ó/€FÜ 6¨VÒ#3™4¸ÀÈ)ÓT€GØ�'ÑÙ5G�˜f iÐ0Ñ1ÈRÐSeÐgnÐRoÐoÐoØ˜ Ð+Ð,¨bÐ0Ð0r6   c                óì   — |xs dj                  «       j                  dd«      d   j                  «       dk7  ri i fS t        | «      }t	        |dk(  rdn|t
        t        «      }|t
        v ri d|ifS i i fS )	zŠOx Alpha (``x-preview-f-free``) ``reasoning_effort`` translation for the
    opencode-zen profile (low/high/max only; anything else 400s).r,   r-   r.   r/   zx-preview-f-freer   Nrj   )r0   r2   r1   rb   rV   r   r   )ra   r3   rL   r[   s       r4   Úox_alpha_reasoning_extrasrn   Û   s‡   € ð 	Š�×ÑÓ×#Ñ# C¨Ó+¨BÑ/×5Ñ5Ó7Ð;MÒMØ�2ˆvˆÜÐ.Ó/€FÜ 6¨VÒ#3™4¸ÔAQÔSeÓf€GØ29Ô=MÑ2MˆBÐ# WÐ-Ð.Ð[ÐTVÐXZÐS[Ð[r6   ÚCODEX_RESPONSES_EFFORTS)r3   úOptional[str]ÚreturnÚbool)r3   rp   rq   r   rC   )rL   rp   rM   zOptional[Sequence[str]]rN   úOptional[dict[str, str]]rq   rp   )rX   rp   r3   rp   rq   r   )NN)rL   rp   rX   rp   r3   rp   rq   rD   )ra   úOptional[dict]rq   rp   )ra   rt   rM   úSequence[str]rq   rt   )
ra   rt   rk   ru   rN   rs   re   rr   rq   útuple[dict, dict])ra   rt   r3   rp   rq   rv   )2Ú__doc__Ú
__future__r   ÚreÚtypingr   r   Úcompiler=   r   Ú__annotations__r   r   r   r   Ú	frozensetr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r5   r:   r@   rV   rY   r\   rb   rd   rl   rn   ro   © r6   r4   ú<module>r      sg  ðò
õ #ã 	ß %ð �2—:‘:ÐAÓBÐ ð
 "g€ˆÓ fð /kÐ ˜OÓ jð (YÐ �_Ó XØ(RÐ �oÓ Rð (QÐ �_Ó PÙ"+¨]Ð<NÐ,OÓ"P€�Ó Pà&PÐ �OÓ PÙ%.ØÐ!@ÐAó&Ð �Nó ð
 'IÐ �OÓ HØ&?Ð �OÓ ?ð )QÐ �oÓ Pð
 $:€�Ó 9Ø#<€�Ó <Ø/5ÀÑ$FÐ �>Ó Fð %;Ð �/Ó :Ø&-¨uÐ%5Ð �NÓ 5ð %>Ð �/Ó =Ø";€�Ó ;Ø!:€ˆÓ :ð "1€ˆÓ 0Ø#*¨EÐ"2€�Ó 2ð "B€ˆÓ AØ#*¨EÐ"2€�Ó 2ð (HÐ �_Ó GØ)0°%Ð(8Ð �~Ó 8ð )QÐ �oÓ PØ*1°5Ð)9Ð ˜Ó 9ð $Q€�Ó PóOó	óNð fjðfØðfØ&=ðfØJbðfàófóB&ôróMð Ysô ^ð$ +/ð1ð
  %ñ1Ø$ð1àð1ð (ð1ð
 ð1ð ó1ó2\ð ,?Ð ˜Ô >r6   