+
    „WÝjG-  ã                  ó  a € 0 t $ R t^ RIHt ^ RIt^ RIHt / RRbRRbRRbR	RbR
RbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRR /CtR!]R"&   ]	! 0 RDm4      t
R#]R$&   ]	! R04      tR#]R%&   ]	! 0 REm4      tR#]R&&   ]	! R'04      tR#]R(&   ]	! 0 RFm4      tR#]R)&   ]	! R04      tR#]R*&   ]	! R04      tR#]R+&   R,R-R.R-/tR!]R/&   R0 R1 ltR2 R3 ltR4 R5 ltR6 R7 ltR8 R9 ltR: R; ltR< R= ltR> R? ltR@ RA ltRB RC ltR# )Gz&Per-provider model name normalization.)ÚannotationsN)ÚOptionalÚclaudeÚ	anthropicÚgptÚopenaiÚo1Úo3Úo4ÚgeminiÚgoogleÚgemmaÚdeepseekÚglmzz-aiÚkimiÚ
moonshotaiÚminimaxÚgrokzx-aiÚqwenÚmimoÚxiaomiÚtrinityzarcee-aiÚnemotronÚnvidiaÚllamaz
meta-llamaÚstepÚstepfunzdict[str, str]Ú_VENDOR_PREFIXESzfrozenset[str]Ú_AGGREGATOR_PROVIDERSÚ_DOT_TO_HYPHEN_PROVIDERSÚ_STRIP_VENDOR_ONLY_PROVIDERSÚhuggingfaceÚ_AUTHORITATIVE_NATIVE_PROVIDERSÚ _MATCHING_PREFIX_STRIP_PROVIDERSÚ"_CATALOGUE_PREFIX_REPAIR_PROVIDERSÚ_LOWERCASE_MODEL_PROVIDERSzdeepseek-chatzdeepseek-flashzdeepseek-reasonerÚ_DEEPSEEK_RETIRED_ALIASESc               ó    € V ^8„  d   QhRRRR/# ©é   Ú
model_nameÚstrÚreturn© )Úformats   "ÚNC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\model_normalize.pyÚ__annotate__r0   b   s   € ÷ 5ñ 5¨ð 5°ñ 5ó    c                ó^   € \        V 4      P                  4       p\        P                  W4      # )zSFold retired DeepSeek aliases onto their replacement; pass everything else through.)Ú_strip_vendor_prefixÚlowerr&   Úget)r*   Úbares   & r/   Ú_normalize_for_deepseekr7   b   s&   € ä 
Ó+×1Ñ1Ó3€DÜ$×(Ñ(¨Ó4Ð4r1   c               ó    € V ^8„  d   QhRRRR/# r(   r-   )r.   s   "r/   r0   r0   h   s   € ÷ Lñ L Sð L¨Sñ Lr1   c                óF   € RV 9   d   V P                  R^4      ^,          # T # )z'Remove a ``vendor/`` prefix if present.Ú/)Úsplit©r*   s   &r/   r3   r3   h   s&   € à*-°Ô*;ˆ:×Ñ˜C Ó# AÕ&ÐKÀÐKr1   c               ó    € V ^8„  d   QhRRRR/# r(   r-   )r.   s   "r/   r0   r0   m   s   € ÷ (ñ ( ð (¨ñ (r1   c                ó&   € V P                  R R4      # )Ú.Ú-)Úreplacer<   s   &r/   Ú_dots_to_hyphensrB   m   s   € Ø×Ñ˜c 3Ó'Ð'r1   c               ó    € V ^8„  d   QhRRRR/# )r)   Úprovider_namer+   r,   r-   )r.   s   "r/   r0   r0   q   s   € ÷ 
ñ 
¨Sð 
°Sñ 
r1   c                óª   € T ;'       g    RP                  4       P                  4       pV'       g   V#  ^ RIHp V! V4      #   \         d    Tu # i ; i)z2Resolve provider aliases to Hermes' canonical ids.Ú )Únormalize_provider)Ústripr4   Úhermes_cli.modelsrG   Ú	Exception)rD   ÚrawrG   s   &  r/   Ú_normalize_provider_aliasrL   q   sP   € à×Ð˜B×
%Ñ
%Ó
'×
-Ñ
-Ó
/€CßØˆ
ðÝ8á! #Ó&Ð&øÜô ØŠ
ðús   ´A ÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r)   r*   r+   Útarget_providerr,   r-   )r.   s   "r/   r0   r0   ~   s&   € ÷ mñ m°ð mÀcð mÈcñ mr1   c                óÚ  € \        R V P                  R4      V P                  R4      3 4       RR7      pV^ 8  d   V # V RV W^,           R rCVP                  4       '       d   VP                  4       '       g   V # \        V4      pVR8X  d6   VP                  4       P	                  4       R8X  d   VP                  4       # T # \        V4      pV'       d   We8X  d   VP                  4       # T # )a”  Strip ``provider/`` or ``provider:`` only when the prefix matches the target provider, so
arbitrary slash-bearing ids aren't mangled while ``zai/glm-5.1`` is repaired for ``zai``. The colon
form is Hermes's own ``provider:model`` switch syntax (``-m openai-codex:gpt-5.6-sol``); left intact
it reaches the wire and the Codex backend rejects it with HTTP 400 (#64787). Only the FIRST separator
counts, so an Ollama-style ``qwen3:8b`` tag is never split on a later colon. ``custom`` is a bucket,
not a vendor: an alias resolving to it (``ollama``) may be a real LiteLLM-style routing prefix, so
only a literal ``custom/`` / ``custom:`` prefix is redundant there.c              3  ó6   "  € T F  q^ 8¼  g   K  Vx € K  	  R# 5i)é    Nr-   )Ú.0Úis   & r/   Ú	<genexpr>Ú2_strip_matching_provider_prefix.<locals>.<genexpr>†   s   é € ÐQÑF�QÈqÉ&�qŠqÓFùs   ‚�
r:   Ú:)ÚdefaultNÚcustoméÿÿÿÿ)ÚminÚfindrH   rL   r4   )r*   rN   ÚcutÚprefixÚ	remainderÚnormalized_targetÚnormalized_prefixs   &&     r/   Ú_strip_matching_provider_prefixra   ~   sÐ   € ô ÑQ˜:Ÿ?™?¨3Ó/°·±ÀÓ1EÑFÓQÐ[]Ô
^€CØ
ˆQ„wØÐØ" 4 CÐ(¨*¸1µW°XÐ*>ˆIØ�<‰<�>Š> §¡×!2Ò!2ØÐÜ1°/ÓBÐØ˜HÔ$Ø$*§L¡L£N×$8Ñ$8Ó$:¸hÔ$Fˆy�‰Ó ÐVÈJÐVÜ1°&Ó9Ðß 1Ð6GÔ6\ˆ9�?‰?ÓÐlÐblÐlr1   c               ó    € V ^8„  d   QhRRRR/# )r)   r*   r+   r,   úOptional[str]r-   )r.   s   "r/   r0   r0   “   s   € ÷ pñ p˜cð p mñ pr1   c                óx  a€ V P                  4       pV'       g   R# RV9   d2   VP                  R^4      ^ ,          P                  4       ;'       g    R# VP                  4       oSP                  R4      ^ ,          pV\        9   d   \        V,          # \	        V3R l\        P                  4        4       R4      # )u¯   Vendor slug from a bare model name: an existing ``vendor/`` prefix, the first hyphen token,
or a ``_VENDOR_PREFIXES`` key the name starts with (``qwen3.5-plus`` â†’ ``qwen``).Nr:   r@   c              3  ó^   <"  € T F"  w  rSP                  V4      '       g   K  Vx € K$  	  R # 5i)N)Ú
startswith)rR   r]   ÚvendorÚ
name_lowers   &  €r/   rT   Ú detect_vendor.<locals>.<genexpr>Ÿ   s%   øé € ÐhÑ.F™N˜FÈ*×J_ÑJ_Ð`f×Jg—’Ó.Fùs   ƒ-£
-)rH   r;   r4   r   ÚnextÚitems)r*   ÚnameÚfirst_tokenrh   s   &  @r/   Údetect_vendorrn   “   s™   ø€ ð ×ÑÓ€DßÙØ
ˆd„{Ø�z‰z˜#˜qÓ! !Õ$×*Ñ*Ó,×4Ð4°Ð4Ø—‘“€JØ×"Ñ" 3Ó'¨Õ*€KØÔ&Ô&Ü Õ,Ð,ÜÔhÔ.>×.DÑ.DÔ.FÓhÐjnÓoÐor1   c               ó    € V ^8„  d   QhRRRR/# r(   r-   )r.   s   "r/   r0   r0   ¢   s   € ÷ >ñ > ð >¨ñ >r1   c                óL   € RV 9   d   V # \        V 4      pV'       d   V RV  2# T # )z�Prepend the detected ``vendor/`` for aggregators; names with ``/`` or no detectable vendor
pass through (the aggregator may still accept them).r:   )rn   )r*   rg   s   & r/   Ú_prepend_vendorrq   ¢   s4   € ð ˆjÔØÐÜ˜:Ó&€Fß'-ˆfˆX�Q�z�lÐ#Ð=°:Ð=r1   c               ó$   € V ^8„  d   QhRRRRRR/# )r)   r*   r+   Úproviderr,   r-   )r.   s   "r/   r0   r0   «   s!   € ÷ >ñ >¨cð >¸Sð >ÀSñ >r1   c                ó´  € RV 9   d   V #  ^ RI Hp T P                  4       P	                  4       pTP                  T4      ;'       g    . pT Uu0 uFJ  pRT9   g   K  TP                  R^4      ^,          P                  4       P	                  4       T8X  g   KH  TkKL  	  pp\        T4      ^8X  d   TP                  4       # T #   \         d    T u # i ; iu upi )u±   Restore a dropped ``vendor/`` prefix only when the bare id matches **exactly one** curated
entry for this provider modulo the prefix â€” a lookup, never a guess from name shape.r:   )Ú_PROVIDER_MODELS)	rI   ru   rJ   rH   r4   r5   r;   ÚlenÚpop)r*   rs   ru   ÚneedleÚ	catalogueÚeÚmatchess   &&     r/   Ú_repair_prefix_from_cataloguer|   «   sÊ   € ð ˆjÔØÐðÝ6ð
 ×ÑÓ×%Ñ%Ó'€FØ ×$Ñ$ XÓ.×4Ð4°"€IÙ#Óa™)�Q s¨a¡xŒq°A·G±G¸CÀ³OÀAÕ4F×4LÑ4LÓ4N×4TÑ4TÓ4VÐZ`Ñ4`�qˆq™)€GÐaÜ ›L¨AÔ-ˆ7�;‰;‹=Ð=°:Ð=øô ô ØÒðüò bs#   ‹C Á	CÁ7CÂCÃCÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r)   rs   r+   r*   r,   rc   r-   )r.   s   "r/   r0   r0   ¼   s!   € ÷ 2ñ 2¨ð 2¸ð 2Àñ 2r1   c                ó¾   € T;'       g    RP                  4       pV'       d   RV9   d   R#  \        V 4      p\        Y#4      pYB8w  d   T# R#   \         d     R# i ; i)u¶   Prefixed catalogue id for a bare *model_name* if unambiguous, else ``None`` â€” the diagnostic
counterpart to :func:`_repair_prefix_from_catalogue` for explaining a content-free 404.rF   r:   N)rH   rL   rJ   r|   )rs   r*   rl   Ú	canonicalÚrepaireds   &&   r/   Úsuggest_prefixed_model_idr�   ¼   se   € ð ×Ð˜"×#Ñ#Ó%€Dß�3˜$”;ÙðÜ-¨hÓ7ˆ	ô -¨TÓ=€HØÔ'ˆ8Ð1¨TÐ1øô ô Úðús   ­A ÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r)   Úmodel_inputr+   rN   r,   r-   )r.   s   "r/   r0   r0   Ê   s!   € ÷ ;ñ ;¨cð ;ÀCð ;ÈCñ ;r1   c                ó²  € T ;'       g    RP                  4       pV'       g   V# \        V4      pV\        9   d   \        V4      # ^ RIHp V! V4      pVer   RV9   d2   VP                  R^4      ^,          P                  4       ;'       g    TpVR8X  d1   VP                  4       P                  R4      '       d   \        V4      # V# V\        9   d    \        W#4      pRV9   d   V# \        V4      # VR
9   d    ^ RIHp V! V4      pV'       d   V#  V\        9   d9   \        W#4      p	W’8X  d&   VP                  R4      '       d   V\        R4      R # V	# VR	8X  d    \        W#4      pRV9   d   V# \!        V4      # V\"        9   d)   \        W#4      p
V\$        9   d   V
P                  4       # T
# V\&        9   d   \)        W#4      # V#   \         d     LÁi ; i)z¤Translate a model name (bare, vendor-prefixed or native) into what the target provider's API
expects. ``target_provider`` should already be canonical. Never raises.rF   )Úopencode_provider_familyNr:   zopencode-zenzclaude-)Únormalize_copilot_model_idúopenai/r   >   Úcopilotúcopilot-acp)r‡   zopenai:)rH   rL   r   rq   rI   r…   r;   r4   rf   rB   r   ra   r†   rJ   r    rv   r7   r#   r%   r$   r|   )rƒ   rN   rl   rs   r…   Ú
_oc_familyr6   r†   Ú
normalizedÚstrippedÚresults   &&         r/   Únormalize_model_for_providerrŽ   Ê   sË  € ð ×Ð˜2×$Ñ$Ó&€DßØˆÜ(¨Ó9€HàÔ(Ô(Ü˜tÓ$Ð$õ ;á)¨(Ó3€JØÒØ�$Œ;Ø—:‘:˜c 1Ó% aÕ(×.Ñ.Ó0×8Ð8°DˆDØ˜Ô'¨D¯J©J«L×,CÑ,CÀI×,NÒ,NÜ# DÓ)Ð)ØˆàÔ+Ô+Ü.¨tÓ>ˆØ˜d”{ˆtÐ>Ô(8¸Ó(>Ð>ð
 Ð-Ô-ð	ÝDá3°DÓ9ˆJßØ!Ð!ð ð
 Ô/Ô/Ü2°4ÓBˆØÔ §¡Ð0F× GÒ GØœ˜I›˜Ð(Ð(Øˆà�:ÔÜ.¨tÓ>ˆØ˜d”{ˆtÐEÔ(?ÀÓ(EÐEàÔ3Ô3Ü0°Ó@ˆØ!)Ô-GÔ!Gˆv�|‰|‹~ÐSÈVÐSð Ô5Ô5Ü,¨TÓ<Ð<ð €Køô- ô 	Ùð	ús   Ã;G ÄG ÇGÇG>   ÚnousÚkilocodeÚ
openrouterú
ai-gateway>   rˆ   r‰   úopenai-codex>   ÚxaiÚzaiÚarceerX   r   r   Úalibabar   ú
minimax-cnú
qwen-oauthúkimi-codingúollama-cloudúminimax-oauthúkimi-coding-cnúnebius-token-factory)Ú__conditional_annotations__Ú__doc__Ú
__future__r   ÚreÚtypingr   r   Ú__annotations__Ú	frozensetr   r   r    r"   r#   r$   r%   r&   r7   r3   rB   rL   ra   rn   rq   r|   r�   rŽ   )rŸ   s   @r/   Ú<module>r¦      s  øðÜ ,å "ã 	Ý ð$Øˆkð$à	ˆ8ð$ð 	ˆ(ð$ð 	ˆ(ð	$ð
 	ˆ(ð$ð ˆhð$ð ˆXð$ð �
ð$ð 
ˆ6ð$ð ˆLð$ð ˆyð$ð ˆFð$ð ˆFð$ð ˆHð$ð ˆzð$ð  �ð!$ð" ˆ\ð#$ð$ ˆIñ%$Ð �.ó ñ* )2ò 34ó )5Ð �~ó 5ñ ,5Øð6ó ,Ð ˜.ó ñ 09ò :.ó 0/Ð ˜nó /ñ 3<Øð=ó 3Ð  ó ñ
 4=ò >ó 4Ð   .ó ñB 6?Øð@ó 6Ð " Nó ñ
 .7Øð8ó .Ð ˜Nó ð Ð%Ð':Ð<Lð-NÐ ˜>ó Nõ5õLõ
(õ
õmõ*põ>õ>õ"2÷;r1   