+
    iHàjÓ<  ã                  óø  a € 0 t $ R t^ RIHt ^ RIt^ RIHtHt ]P                  ! R4      t	RJt
R	]R
&   RKtR	]R&   RLtR	]R&   RMtR	]R&   RNtR	]R&   ]! RR04      tR]R&   ROtR	]R&   RPtR	]R&   ]! RR04      tR]R&   RQtR	]R&   RRtR	]R&   RStR	]R&   RTtR	]R&   RRtR	]R&   RRRR/tR]R&   RTtR	]R&   RR/tR]R &   RRtR	]R!&   RRtR	]R"&   RRtR	]R#&   RUt R	]R$&   RR/t!R]R%&   RVt"R	]R&&   RR/t#R]R'&   RVt$R	]R(&   RR/t%R]R)&   RSt&R	]R*&   RR/t'R]R+&   RWt(R	]R,&   RRt)R	]R-&   R. R/ lt*R0 R1 lt+R2 R3 lt,RXR4 R5 llt-RXR6 R7 llt.RYR8 R9 llt/R: R; lt0R< R= lt1R> R? lt2]3R@ RA llt3RXRBRC/RD RE lllt4RZt5RF RG lt6RH RI lt7R# )[uñ  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]|$)ÚmediumÚhighÚxhighÚmaxútuple[str, ...]ÚEFFORT_LADDERÚOPENAI_COMPAT_WIRE_EFFORTSÚCODEX_GPT56_EFFORTSÚCODEX_LEGACY_EFFORTSÚCODEX_ASTRA_EFFORTSzgpt-6-astrazgpt-6-astra-900kzfrozenset[str]ÚASTRA_MODEL_IDSÚGPT6_TIER_PREFIXESÚNO_DISABLE_TIER_PREFIXESzgpt-daybreak-blue-latestzgpt-daybreak-blue-latest-900kÚDAYBREAK_MODEL_IDSÚXAI_GROK46_EFFORTSÚXAI_LEGACY_EFFORTSÚACTUAL_RELAY_EFFORTSÚKIMI_K3_EFFORTSÚKIMI_K2_EFFORTSzdict[str, str]ÚKIMI_K3_OVERRIDESÚOX_ALPHA_EFFORTSÚOX_ALPHA_OVERRIDESÚTOKENHUB_EFFORTSÚNEBIUS_EFFORTSÚSOLAR_EFFORTSÚGLM52_EFFORTSÚGLM52_OVERRIDESÚGLM53_EFFORTSÚGLM53_OVERRIDESÚDEEPSEEK_V4_EFFORTSÚDEEPSEEK_V4_OVERRIDESÚOLLAMA_CLOUD_EFFORTSÚOLLAMA_CLOUD_OVERRIDESÚMETA_AI_EFFORTSÚGEMINI4_THINKING_LEVELSc               ó    € V ^8„  d   QhRRRR/# )é   ÚmodelúOptional[str]ÚreturnÚbool© )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/agent/reasoning_effort.pyÚ__annotate__r1   a   s   € ÷ Oñ O˜-ð O¨Dñ Oó    c                óŽ   € T ;'       g    RP                  4       P                  4       P                  R^4      R,          \        9   # )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   )r*   s   &r0   Úis_astra_modelr:   a   s9   € ð �KˆK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Õ;¼ÑNÐNr2   c               ó    € V ^8„  d   QhRRRR/# ©r)   r*   r+   r,   r	   r.   )r/   s   "r0   r1   r1   h   s   € ÷ 	ñ 	 =ð 	°_ñ 	r2   c                óV  € T ;'       g    RP                  4       P                  4       P                  R^4      R,          p\        V 4      '       g   VP	                  \
        4      '       d   \        # RV9   g'   VP	                  \        4      '       g   V\        9   d   \        # \        # )z9Supported effort set for an OpenAI/Codex Responses model.r4   r5   zgpt-5.6r6   )r7   r8   r9   r:   Ú
startswithr   r   r   r   r   r   )r*   Úbares   & r0   Úcodex_supported_effortsr@   h   s†   € à�KˆK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Õ;€DÜ�e×Ò §¡Ô0H× IÒ IÜ"Ð"ð ˜Ô §¡Ô0B× CÒ CÀtÔOaÔGaô 	ðô "ðr2   c               ó    € V ^8„  d   QhRRRR/# r<   r.   )r/   s   "r0   r1   r1   t   s   € ÷ Nñ N -ð N°Oñ Nr2   c                óÌ   € T ;'       g    RP                  4       P                  4       P                  R4      R,          p\        P	                  V4      '       d   \
        # \        # )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).
r4   r5   r6   )r7   r8   ÚsplitÚ_KIMI_K3_SLUG_REÚsearchr   r   ©r*   Úms   & r0   Úkimi_supported_effortsrH   t   sL   € ð 
�ˆ�"×ÑÓ×#Ñ#Ó%×+Ñ+¨CÓ0°Õ4€AÜ.×5Ñ5°a×8Ò8Œ?ÐM¼oÐMr2   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r)   Úeffortr+   Ú	supportedzOptional[Sequence[str]]Ú	overridesúOptional[dict[str, str]]r,   r.   )r/   s   "r0   r1   r1      s2   € ÷ fñ fØðfØ&=ðfØJbðfàñfr2   c                óº  € \        T ;'       g    R4      P                  4       P                  4       pV'       d	   V'       g   V # R V 4        Uu. uF  qD\        9   g   K  VNK  	  ppV'       d   W59   d   V # V'       d   VP	                  V4      V9   d	   W#,          # V\        9  d   V # V Uu. uF  qfR8w  g   K  VNK  	  ppV'       g   V # \        P                  V4      pV Uu. uF!  p\        P                  V4      V8  g   K  VNK#  	  p	pV	'       d   \        V	\        P
                  R7      # \        V\        P
                  R7      # u upi u upi u upi )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.
r4   c              3  óp   "  € T F,  p\        V4      P                  4       P                  4       x € K.  	  R # 5i©N)Ústrr7   r8   )Ú.0Úss   & r0   Ú	<genexpr>Úclamp_effort.<locals>.<genexpr>�   s&   é € Ð%PÁiÀ¤c¨!£f§l¡l£n×&:Ñ&:×&<Ð&<Ãiùs   ‚46Únone)Úkey)rQ   r7   r8   r
   ÚgetÚindexr   Úmin)
rJ   rK   rL   Ú	requestedÚlvlÚsupported_normÚlevelÚ
candidatesÚrequested_idxÚbelows
   &&&       r0   Úclamp_effortrb      s  € ô �F—L�L˜bÓ!×'Ñ'Ó)×/Ñ/Ó1€IßŸIØˆÙ%PÁiÔ%PÓiÑ%P˜cÔ[hÑTh—c�cÑ%P€NÐiß˜YÔ8Øˆß�Y—]‘] 9Ó-°Ô?ØÕ#Ð#ØœÔ%Øˆñ &4ÓG¡^˜EÀ±—%�%¡^€JÐGßØˆÜ!×'Ñ'¨	Ó2€MÙ *ÓY¡
�u¬m×.AÑ.AÀ%Ó.HÈ=Ñ.X�UˆU¡
€EÐYß27Œ3ˆuœ-×-Ñ-Ô.Ðe¼SÀÔQ^×QdÑQdÔ=eÐeùò jùò Hùò Zs$   ÁEÁ EÂ/EÂ<EÃ'EÄEc               ó(   € V ^8„  d   QhRRRRRRRR/# )r)   Úproviderr+   r*   Úapi_moder,   r	   r.   )r/   s   "r0   r1   r1       s,   € ÷ &ñ &Øð&Ø$1ð&Ø=Jð&àñ&r2   c                ó¬   € T ;'       g    RP                  4       P                  4       R8X  d#   \        V4      pVR8X  d   RV9   d   . VORN5# T# \        # )a°  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). On the Codex app-server runtime ``ultra`` is codex's own harness mode,
accepted wherever the model's ladder reaches ``max`` (codex runs it at ``max``; a model without
``max`` rejects it), so it is sent verbatim there.r4   zopenai-codexÚcodex_app_serverr   Úultra)r7   r8   r@   r   )rd   r*   re   rK   s   &&& r0   Úroute_supported_effortsri       s[   € ð 	�ˆ�B×ÑÓ×%Ñ%Ó'¨>Ô9Ü+¨EÓ2ˆ	Ø(0Ð4FÔ(FÈ5ÐT]ÔK]Ð$�Ð$˜GÑ$ÐlÐclÐlÜ%Ð%r2   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r)   rJ   r+   rd   r*   re   r,   rQ   r.   )r/   s   "r0   r1   r1   ®   s=   € ÷ 	rñ 	rØð	rØ%2ð	rØBOð	ràð	rð 	ñ	rr2   c                óÀ   € \        T ;'       g    R4      P                  4       P                  4       p\        V\	        WV4      4      pV'       d   WT8X  d   V# V RV R2# )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.r4   z (sends z on this route))rQ   r7   r8   rb   ri   )rJ   rd   r*   re   r[   Úclampeds   &&&&  r0   Úeffort_display_labelrm   ®   s]   € ô �F—L�L˜bÓ!×'Ñ'Ó)×/Ñ/Ó1€IÜ˜9Ô&=¸hÈxÓ&XÓY€Gß%¨Ô)=ˆ9ÐqÀiÀ[ÐPXÐY`ÐXaÐapÐCqÐqr2   c               ó    € V ^8„  d   QhRRRR/# )r)   Úreasoning_configúOptional[dict]r,   r+   r.   )r/   s   "r0   r1   r1   º   s   € ÷ Mñ M ~ð M¸-ñ Mr2   c                óð   € \        V \        4      '       d   V P                  R4      RJ d   R# \        V P                  R4      ;'       g    R4      P	                  4       P                  4       ;'       g    R# )u…   The user's explicit effort, or None (absent/malformed config, no effort, or reasoning
disabled) â€” callers then omit the wire field.ÚenabledFNrJ   r4   )Ú
isinstanceÚdictrX   rQ   r7   r8   ©ro   s   &r0   Úrequested_effortrv   º   sb   € ô Ð&¬×-Ò-Ð1A×1EÑ1EÀiÓ1PÐTYÓ1YÙÜÐ×#Ñ# HÓ-×3Ð3°Ó4×:Ñ:Ó<×BÑBÓD×LÐLÈÐLr2   c               ó    € V ^8„  d   QhRRRR/# )r)   r[   r+   r,   rQ   r.   )r/   s   "r0   r1   r1   Â   s   € ÷ Vñ V˜}ð V°ñ Vr2   c                ó.   € V f   R# \        V \        4      # )zþTokenHub's top-level ``reasoning_effort``: ``high`` when no level was chosen, else the
request clamped to low/medium/high. Shared by the tencent-tokenhub profile and the host-based
branch base_url-only agents take; callers handle thinking-off themselves.r   )rb   r   )r[   s   &r0   Útokenhub_effortry   Â   s   € ð Ò&ˆ6ÐU¬L¸ÔDTÓ,UÐUr2   c               ó    € V ^8„  d   QhRRRR/# )r)   ro   rp   r,   rt   r.   )r/   s   "r0   r1   r1   É   s   € ÷ 
bñ 
b¨~ð 
bÀ$ñ 
br2   c                óº   € V '       d   \        V \        4      '       g   / # V P                  R4      RJ d   RRR//# RRRRV P                  R4      ;'       g    R//# )aš  The OpenAI-compatible ``extra_body`` fallback for a route whose profile declares no
reasoning shape: ``{}`` with no config, ``{"reasoning": {"enabled": False}}`` when disabled,
else ``{"reasoning": {"enabled": True, "effort": <effort or medium>}}``. Used by auxiliary
calls, and by a profile hook that wants that fallback (``handles_reasoning`` skips it for any
profile overriding ``build_api_kwargs_extras``).rr   FÚ	reasoningTrJ   r   )rs   rt   rX   ru   s   &r0   Úgeneric_nested_reasoningr}   É   se   € ÷ ¤:Ð.>Ä×#EÒ#EØˆ	Ø×Ñ˜IÓ&¨%Ó/Ø˜i¨Ð/Ð0Ð0Ø˜) T¨8Ð5E×5IÑ5IÈ(Ó5S×5_Ð5_ÐW_Ð`ÐaÐar2   c               ó$   € V ^8„  d   QhRRRRRR/# )r)   ro   rp   rK   úSequence[str]r,   r.   )r/   s   "r0   r1   r1   Ö   s+   € ÷ ^ñ ^¨^ð ^Èð ^ð  xFñ ^r2   c                óü   € \        V \        4      '       g   V # \        V P                  R4      ;'       g    R4      P	                  4       P                  4       pV'       d   \        W!4      MTpW28w  d	   / V CRV/C# T # )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.
rJ   r4   )rs   rt   rQ   rX   r7   r8   rb   )ro   rK   rJ   rl   s   &&  r0   Úclamp_reasoning_configr�   Ö   su   € ô Ð&¬×-Ò-ØÐÜÐ!×%Ñ% hÓ/×5Ð5°2Ó6×<Ñ<Ó>×DÑDÓF€Fß17Œl˜6Ô-¸V€GØ6=Ô6GÐ2ÐÐ2 ¨'Ñ2Ð]ÐM]Ð]r2   Úalways_emit_toggleFc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r)   ro   rp   Úeffortsr   rL   rM   r‚   r-   r,   útuple[dict, dict]r.   )r/   s   "r0   r1   r1   å   s:   € ÷ 1ñ 1Ø$ð1àð1ð (ð1ð
 ð1ð ñ1r2   c               óì   € \        V \        4      '       d   V P                  R4      RJ d	   RRR/// 3# \        V 4      p\	        VR8X  d   RMTW4      pWQ9   d   V'       d   RRR//M/ RV/3# RRR/// 3# )	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.
rr   FÚthinkingÚtypeÚdisabledrV   NÚreasoning_effort)rs   rt   rX   rv   rb   )ro   r„   rL   r‚   rJ   rl   s   &&&$  r0   Úthinking_toggle_extrasr‹   å   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Ð0r2   c               ó    € V ^8„  d   QhRRRR/# )r)   r*   r+   r,   rt   r.   )r/   s   "r0   r1   r1     s   € ÷ ñ ¨mð Àñ r2   c                ó&  a€ T ;'       g    RP                  4       P                  4       o\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   RR/# SP	                  R4      '       d   RR/# / # )zZ``extra_body`` keys that keep replayed reasoning on a DashScope-hosted model, else ``{}``.r4   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r.   )rR   ÚtokenrG   s   & €r0   rT   Ú5dashscope_preserve_thinking_extras.<locals>.<genexpr>  s   øé € Ð
>Ñ#=˜%�AŽ:Ó#=ùs   ƒTFÚpreserve_thinkingzglm-5Úclear_thinking)r7   r8   ÚanyÚ_DASHSCOPE_PRESERVE_MODELSr>   rF   s   &@r0   Ú"dashscope_preserve_thinking_extrasr•     sm   ø€ à	�ˆ�"×ÑÓ×#Ñ#Ó%€Aß
ƒsÔ
>Õ#=Ó
>‡s‡s‚sÔ
>Õ#=Ó
>×>Ò>Ø# TÐ*Ð*Ø‡|�|�G×ÒØ  %Ð(Ð(Ø€Ir2   c               ó$   € V ^8„  d   QhRRRRRR/# )r)   ro   rp   r*   r+   r,   r…   r.   )r/   s   "r0   r1   r1     s'   € ÷ \ñ \°ð \À}ð \ÐYjñ \r2   c                ó  € T;'       g    RP                  4       P                  R^4      R,          P                  4       R8w  d   / / 3# \        V 4      p\	        VR8X  d   RMT\
        \        4      pV\
        9   d   / RV/3# / / 3# )z†Ox Alpha (``x-preview-f-free``) ``reasoning_effort`` translation for the
opencode-zen profile (low/high/max only; anything else 400s).r4   r5   zx-preview-f-freerV   NrŠ   r6   )r7   r9   r8   rv   rb   r   r   )ro   r*   rJ   rl   s   &&  r0   Úox_alpha_reasoning_extrasr˜     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[Ð[r2   )rV   ÚminimalÚlowr   r   r   r   rh   )rV   r™   rš   r   r   r   r   )rV   rš   r   r   r   r   )rV   rš   r   r   r   )rš   r   r   r   r   )z	gpt-6-solz
gpt-6-luna)zgpt-6.1-sol)rš   r   r   r   )rš   r   r   )rV   rš   r   r   r   )rš   r   r   )r   r   )rš   r   r   r   )r™   rš   r   r   r   rP   )NNN)zqwen3.6zqwen3.7zqwen3.8z	kimi-k2.6z	kimi-k2.7)8Ú__conditional_annotations__Ú__doc__Ú
__future__r   ÚreÚtypingr   r   ÚcompilerD   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%   r&   r'   r:   r@   rH   rb   ri   rm   rv   ry   r}   r�   r‹   r”   r•   r˜   )r›   s   @r0   Ú<module>r£      s9  øðô
õ #ã 	ß %ð —:’:ÐAÓBÐ ð
 "g€ˆÓ fð /kÐ ˜OÓ jð (YÐ �_Ó XØ(RÐ �oÓ Rð (QÐ �_Ó PÙ"+¨]Ð<NÐ,OÓ"P€�Ó Pà&AÐ �OÓ Að -=Ð ˜/Ó <Ù%.ØÐ!@ÐAó&Ð �Nó ð
 'IÐ �OÓ HØ&?Ð �OÓ ?ð )QÐ �oÓ Pð
 $:€�Ó 9Ø#<€�Ó <Ø%-¨v°wÀÐ$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ð ,EÐ ˜Ó DõOõ	õN÷f÷B&÷	rõMõVõ
bð Ys÷ ^ñ1ð
  %÷1ð 1ð: YÐ õ÷\r2   