+
    iHàjÕ= ã                   ó�  a € ER- Et0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHtHtHtHtHtHt ^ RIHt ^ RIt^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtH t  ^ R	I!H"t"H#t# ^ R
I$H%t%H&t&H't' ]PP                  ! ])4      t* ^ RI+H,t- ]/! R ]-! 4        4       4      t0] ^ k ]Pb                  ! R]Pd                  4      t3]Ph                  ! R4      t5R R lt6/ s7] ^k ^ s8] ^k Rt9/ t:] ^k / t;] ^k Rt<Rt=Rt>/ t?] ^k Rt@/ tA] ^k ER.R R lltBR R ltCR R ltDR R ltER R  ltFR! R" ltGRtHR# R$ ltIR% R& ltJR' R( ltKR)R*/R+ R, lltLR- R. ltMR/ R0 ltNR1 R2 ltOR3 R4 ltPR5 R6 ltQR7 R8 ltRR9 R: ltSR; R< ltTR= R> ltUR? R@ ltV. ER/OtW]W^ ,          tX]Y! 4       tZ] ^k RD RE lt[RCt\Rt]/ t^] ^k Rt_/ t`] ^	k / RFRGbRHRGbRIRGbRJRGbRKRGbRLRGbRMRGbRNRGbRORGbRPRGbRQRGbRRRGbRSRTbRURVbRWRVbRXRVbRYRVb/ RZRVbR[RVbR\RVbR]RVbR^R_bR`R_bRaRVbRbRBbRcRBbRdR_bReRfbRgRBbRhRibRjRAbRkRAbRlRAbRmRnbC/ RoRpbRqRGbRrRGbRsRGbRtRGbRuRGbRvRGbRwRBbRxRnbRyRibRzRibR{RibR|RGbR}RGbR~RibRRibR€RGbC/ R�R‚bRƒR‚bR„RnbR…RGbR†R‡bRˆR‰bRŠR‰bR‹RibRŒRibR�RibRŽRibR�RibR�RibR‘RAbR’R‡bR“R”bR•R”bC/ R–R‡bR—R”bR˜R‡bR™RnbRšR‡bR›R”bRœRTbR�RžbRŸRAbR RAbR¡RpbR¢R£bR¤R£bR¥RžbR¦RžbR§RGbR¨RAbC/ R©RnbRªRnbR«RnbR¬RibR­R‚bR®R‚bR¯RnbR°R±bR²R³bR´RµbR¶RibR·R‚bR¸R‚bR¹RibRºRibR»R‚bR¼RGbC/ R½RGbR¾RnbR¿R‚bRÀR‚bRÁR‚bRÂR‚bRÃRnbRÄRnbRÅR±bRÆR‚bRÇR‚bRÈR‚bRÉR‡bRÊR‚bRËRibRÌRibRÍRibCRÎRiRÏRiRÐRiRÑR‚RÒR‚RÓR”/CtaER0tbRÔ RÕ ltc]Pb                  ! RÖ4      tdR× RØ lteRÙ RÚ ltf]/! 0 ER1m4      tgRÛ RÜ lthER2tiER3tjER4tkER5tlRÝ RÞ ltmER6Rà Rá lltnRâ Rã lto/ 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þRhb/ RÿER bERRwbERERbERERbERERbERERbERERbER	ER
bERERbERERbERERbERERbERERbERERbERERbERERbERERbCtp] ^
k  ]-! 4        F5  tq]qPå                  4       ts]s'       g   K  ]s]p9  g   K&  ]qPè                  ]p]s&   K7  	  ER ER ltuER7ER ER lltvER  ER! ltwER" ER# ltxER$ ER% ltyER8tz]Pb                  ! ER&ER'P÷                  ]|! ]Pú                  ]z4      4       ER(24      t~ER) ER* ltER+ ER, lt€ER-R/ER. ER/ llt�RðER0ER100 ER9mRi3ERER20ER30R‚33t‚ER4 ER5 ltƒER6 ER7 lt„ER8 ER9 lt…ER: ER; lt†ER< ER= lt‡ER> ER? ltˆER6ER@ ERA llt‰ERB ERC ltŠERD ERE lt‹ER6ERF ERG lltŒERH ERI lt�ER:ERJ ERK lltŽERL ERM lt�ERN ERO lt�ERP ERQ lt‘ERR^ERSERTERUERTERVRGERWRG/t’ERXt“ER;t”ERY ERZ lt•ER[ ER\ lt–ER] ER^ lt—ER<ER_ ER` llt˜ERa ERb lt™ERc ERd ltšERe ERf lt›ERg ERh ltœERi ERj lt�ERk ERl ltžERm ERn ltŸER=ERo ERp llt ER6ERq ERr llt¡ERs ERt lt¢ERu ERv lt£ERw ERx lt¤ERy ERz lt¥]ER{Rß/ER| ER} ll4       t¦ER6ER~ ER llt§ER€R*/ER� ER‚ llt¨ERƒ ER„ lt©ER… ER† ltªER‡ ERˆ lt«ER‰ ERŠ lt¬]Pb                  ! ER‹4      t­ERŒ ER� lt®ERŽ ER� lt¯ER>t°ER?t±ER@t²ER� ER‘ lt³ER’ ER“ lt´ER” ER• ltµER– ER— lt¶ERAER˜R*/ER™ ERš lllt·ER› ERœ lt¸ER6ER� ERž llt¹ER6ERŸ ER  lltºER¡ ER¢ lt»ER6ER£ ER¤ llt¼ER6ER¥ ER¦ llt½ER§ ER¨ lt¾ER© ERª lt¿]/! 0 ERBm4      tÀER« ER¬ ltÁER­ ER® ltÂER¯ ER° ltÃER6ER± ER² lltÄER³ ER´ ltÅERµ ER¶ ltÆER· ER¸ ltÇER6ER¹ ERº lltÈER» ER¼ ltÉER½ ER¾ ltÊ/ RUER¿bRWER¿bRXER¿bRYER¿bERÀER¿bERÁER¿bERÂER¿bRbRBbERÃER¿bR`ER¿bR\ER¿bR[ER¿bRZER¿bERÄER¿bR]ER¿bRaER¿bERÅER¿bRdER¿/CtË] ^k ERÆERÇRXERÇRYERÇ/tÌ] ^k RaERÇERÄERÇRUERÇRWERÇ/tÍ] ^k ER¿tÎERÈtÏERCtÐ]/! 0 ]ÐmRakERÄkRUkRWk4      tÑ]Pb                  ! ERÉ4      tÒERÊ ERË ltÓERÌ ERÍ ltÔERÎ ERÏ ltÕERÐ ERÑ ltÖERÒ ERÓ lt×ERÔ ERÕ ltØERÖ ER× ltÙ/ tÚ] ^k / tÛ] ^k RtÜRtÝERØtÞERÙtßERÚtàER6ERÛ ERÜ lltá]á! 4       tâER6ERÝ ERÞ lltãER6ERß ERà lltäER6ERá ERâ lltåERã ERä ltæER6ERå ERæ lltçERç ERè ltèERé ERê ltéER7ERë ERì lltêER7ERí ERî lltëERïRß/ERð ERñ lltìERò ERó ltíER6ERô ERõ lltîERö ER÷ ltïERø ERù ltðERú ERû ltñERü ERý ltòERþ ERÿ ltóER  ER ltôERDER ER lltõERDER ER lltö^t÷]Pb                  ! ER4      tøER ER ltùER	 ER
 ltúERER/ER ER lltûER ER ltüERRßERR/ER ER lltýEREtþER ER ltÿ/ Et ] ^k EREtER ER lEtER ER lEtER ER lEt]/! 0 ERFm4      EtER ER lEtER  ER! lEtER" ER# lEtER$ ER% lEt	ERRßERRERER/ER& ER' llEt
/ Et] ^k ER(EtER) ER* lEtER+ ER, lEtR#   ]. d    R t- E	L¦i ; i  ]. d     ELÞi ; i(G  z¿Model metadata, context lengths, and token estimation utilities.

Pure utility functions with no AIAgent dependency. Used by ContextCompressor
and run_agent.py for pre-flight context checks.
N©ÚPath)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Úurlparse)Úmodel_metadata_http)Ú_write_context_cacheÚlocked_context_cache©Úllamacpp_context)Úatomic_json_writeÚbase_url_host_matchesÚbase_url_hostname)ÚOPENROUTER_MODELS_URLÚopenrouter_variant_base)ÚPERSISTENCE_ONLY_MESSAGE_FIELDSÚUNPRICED_REPLAY_FIELDSÚwithout_persistence_fields)Úlist_providersc                  ó   € . # ©N© r   ó    Ú9/home/ubuntu/.hermes/hermes-agent/agent/model_metadata.pyÚ_list_providersr   #   s   € Øˆ	r   c              #   ó‚   "  € T F5  pVP                   .VP                  O F  pVP                  4       x € K  	  K7  	  R # 5ir   )ÚnameÚaliasesÚlower)Ú.0ÚprofileÚvalues   &  r   Ú	<genexpr>r&   &   s<   é € ð /á$ˆØ—,‘,Ð1 §¡Ó1ˆð 
‡K�K‡M€Má1ñ Û$ùs   ‚=?zE^(\d+\.?\d*b|latest|stable|q\d|fp?\d|instruct|chat|coder|vision|text)z100.64.0.0/10c                ó0   € V ^8„  d   QhR\         R\         /# ©é   ÚmodelÚreturn©Ústr)Úformats   "r   Ú__annotate__r/   1   s   € ÷ ñ ¤#ð ¬#ñ r   c                óT  € RV 9  g   V P                  R4      '       d   V # T P                  R^4      w  r ^ RIHp V! VP	                  4       P                  4       4      RJpV'       d,   \        P                  VP	                  4       4      '       g   V# V #   \         d    Rp LDi ; i)z¥Strip a registry-known provider prefix: ``"local:m"`` -> ``"m"``. Ollama ``model:tag``
ids are preserved even when the model half is a provider name (``qwen:0.5b``).Ú:Úhttp©Úget_provider_profileNF)	Ú
startswithÚsplitÚ	providersr4   Ústripr"   Ú	ExceptionÚ_OLLAMA_TAG_PATTERNÚmatch)r*   ÚprefixÚsuffixr4   Úis_providers   &    r   Ú_strip_provider_prefixr?   1   s•   € ð �%Ô˜5×+Ñ+¨F×3Ò3ØˆØ—[‘[  aÓ(�N€FðÝ2Ù*¨6¯<©<«>×+?Ñ+?Ó+AÓBÈ$ÐNˆ÷ Ô.×4Ñ4°V·\±\³^×DÒDØˆØ€Løô	 ô ØŠðús   ¶,B ÂB'Â&B'i  i,  g      ¬@g     Àr@g      >@c                ó0   € V ^8„  d   QhR\         R\         /# )r)   Úbase_urlÚschemer,   )r.   s   "r   r/   r/   Z   s   € ÷ Wñ Wœcð W¬3ñ Wr   c                óf   € \        V 4      pV'       g   R# \        RV9   d   V4      # V RV 24      # )zW``urlparse`` of the normalized URL (``scheme`` prepended when absent); None when empty.Nz://)Ú_normalize_base_urlr
   )rA   rB   Ú
normalizeds   && r   Ú_parse_base_urlrF   Z   s7   € ä$ XÓ.€JßÙÜ %¨:Ô"5�JÓVÐV¸f¸XÀSÈÈÐ;UÓVÐVr   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r)   rA   r+   ©r-   r   )r.   s   "r   r/   r/   b   s   € ÷ ñ ¤ð ¬´#­ñ r   c                óâ   €  \        V 4      pVe   VP                  '       g   R# VP                   RVP                  ;'       g    VP                  R8X  d   R 2# ^P 2#   \         d     R# i ; i)z[``host:port`` key (None without a host) so every probe path for one server shares an entry.Nr1   Úhttpsé»  )rF   ÚhostnameÚportrB   r9   )rA   Úparseds   & r   Ú_endpoint_host_keyrP   b   sm   € ðÜ  Ó*ˆØŠ> §§ ÙØ—/‘/Ð" ! F§K¡K×$\Ð$\¸6¿=¹=ÈGÔ;S°CÐ#]Ð^Ð^ÐY[Ð#]Ð^Ð^øÜô Úðús"   ‚ A ¥A ÁA ÁA ÁA.Á-A.c                ó(   € V ^8„  d   QhR\         RR/# )r)   rA   r+   Nr,   )r.   s   "r   r/   r/   m   s   € ÷ Eñ E¬ð E°ñ Er   c                ó–   € \        V 4      pVe:   \        P                  ! 4       \        V&   \        P                  RV\        4       R# R# )zARecord that a probe to ``base_url`` timed out during TCP connect.NuF   Endpoint %s timed out connecting â€” skipping further probes for %.0fs)rP   ÚtimeÚ	monotonicÚ_endpoint_blackhole_cacheÚloggerÚdebugÚ_ENDPOINT_BLACKHOLE_TTL_SECONDS)rA   Úkeys   & r   Ú_note_endpoint_blackholedrZ   m   sB   € ä
˜XÓ
&€CØ
‚Ü)-¯ªÓ)9Ô! #Ñ&Ü�‰Ð]Ð_bô  eDö  	Eñ r   c                ó0   € V ^8„  d   QhR\         R\        /# rH   ©r-   Úbool)r.   s   "r   r/   r/   u   s   € ÷ ñ ¤3ð ¬4ñ r   c                óÔ   € \         ^ 8:  d   R# \        V 4      pVe   \        P                  V4      MRpVf   R# \        P
                  ! 4       V,
          \         8¼  d
   \        V R# R# )zXTrue if a recent probe to ``base_url`` timed out during TCP connect (cache lookup only).FNT)rX   rP   rU   ÚgetrS   rT   )rA   rY   Úseens   &  r   Ú_endpoint_blackholedra   u   sY   € ä&¨!Ô+ÙÜ
˜XÓ
&€CØ14²Ô$×(Ñ(¨Ô-Àd€DØ‚|ÙÜ�ŠÓ˜4ÕÔ$CÔCÜ% cÐ*ÙÙr   c                ó4   € V ^8„  d   QhR\         R\        RR/# )r)   ÚexcrA   r+   N)ÚBaseExceptionr-   )r.   s   "r   r/   r/   ƒ   s!   € ÷ ,ñ ,¤-ð ,¼3ð ,À4ñ ,r   c                óB   € \        V 4      '       d   \        V4       R# R# )z?Blackhole ``base_url`` when ``exc`` is a connect-phase timeout.N)Ú_is_connect_timeoutrZ   )rc   rA   s   &&r   Ú_note_if_connect_timeoutrg   ƒ   s   € ä˜3×ÒÜ! (Ö+ñ  r   c                ó0   € V ^8„  d   QhR\         R\        /# )r)   rc   r+   )rd   r]   )r.   s   "r   r/   r/   ‰   s   € ÷ 1ñ 1œ]ð 1¬tñ 1r   c                ó4   € ^ RI p\        WP                  4      # )zFRead timeouts prove the server accepted a connection, not a blackhole.N)ÚhttpxÚ
isinstanceÚConnectTimeout)rc   rj   s   & r   rf   rf   ‰   s   € ãä�c×/Ñ/Ó0Ð0r   c                ó0   € V ^8„  d   QhR\         R\        /# )r)   r    r+   )r-   r   )r.   s   "r   r/   r/   •   s   € ÷ .ñ .”cð .œdñ .r   c                 ó8   € ^ RI Hp V! 4       R,          V ,          # )é    ©Úget_hermes_homeÚcache©Úhermes_constantsrq   )r    rq   s   & r   Ú_cache_fileru   •   s   € Ý0ÙÓ˜wÕ&¨Õ-Ð-r   c                óR   € V ^8„  d   QhR\         R\        \        \        3,          /# )r)   Úpathr+   )r   Údictr-   r   )r.   s   "r   r/   r/   š   s"   € ÷ ñ œ$ð ¤4¬¬S¨¥>ñ r   c                óø   €  V P                  RRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X\        4      '       d   V# / #   + '       g   i     L*; i  \
         d    / u # i ; i)z4JSON object at ``path``, or {} when missing/invalid.Úrú	utf-8-sig©ÚencodingN)ÚopenÚjsonÚloadrk   rx   r9   )rw   ÚfÚdatas   &  r   Ú_load_json_dictrƒ   š   sc   € ðØ�Y‰Y�s [ˆY×1Ô1°QÜ—9’9˜Q“<ˆD÷ 2ä! $¬×-Ò-ˆtÐ5°2Ð5÷ 2×1ûô ô ØŠ	ðús-   ‚A) �A´A) ÁA) ÁA&	Á!A) Á)A9Á8A9c                óv   € V ^8„  d   QhR\         R\        R\        R\        R\        R\        \        ,          /# )r)   rw   rY   ÚttlÚts_keyÚ	value_keyr+   )r   r-   Úfloatr   r   )r.   s   "r   r/   r/   ¤   s=   € ÷ 
ñ 
œð 
¤3ð 
¬Uð 
¼sð 
Ìsð 
ÔW_Ô`cÕWdñ 
r   c               ó   € \        V 4      P                  V4      p\        V\        4      '       g   R#  \        P                  ! 4       \        WS,          4      ,
          V8¼  d   R# WT,          #   \         d     R# i ; i)z[Fresh (< ``ttl`` seconds) ``value_key`` of the ``key`` entry in a TTL memo file, else None.N)rƒ   r_   rk   rx   rS   rˆ   r9   )rw   rY   r…   r†   r‡   Úentrys   &&&$$ r   Ú_ttl_memo_getr‹   ¤   sd   € ä˜DÓ!×%Ñ% cÓ*€EÜ�eœT×"Ò"ÙðÜ�IŠI‹Kœ% ¥Ó.Õ.°3Ô6ÙØÕÐøÜô Úðús   ´0A. Á&A. Á.A=Á<A=Úts_firstFc                ó|   € V ^8„  d   QhR\         R\        R\        R\        R\        R\        R\        R\        R	R
/	# )r)   rw   rY   r%   r…   r†   r‡   ÚwhatrŒ   r+   N)r   r-   r   rˆ   r]   )r.   s   "r   r/   r/   ±   sS   € ÷ 7ñ 7œð 7¤3ð 7¬sð 7¼ð 7Ì3ð 7Ô[^ð 7Ôfið 7Ôuyð 7ð  GKñ 7r   c               ó¶  €  \         P                   ! 4       p\        V 4      P                  4        U	U
u/ uFH  w  rš\        V
\        4      '       g   K  V\        V
P                  V^ 4      4      ,
          V8  g   KF  WšbKJ  	  pp	p
V'       d   WHWR/MWRWH/W±&   \        W^ RR7       R# u up
p	i   \         d"   p\        P                  RYl4        Rp?R# Rp?ii ; i)zKWrite ``key`` into a TTL memo file, dropping expired siblings. Best-effort.©ÚindentÚ
separatorszFailed to save %s: %sN©Ú,r1   )rS   rƒ   Úitemsrk   rx   rˆ   r_   r   r9   rV   rW   )rw   rY   r%   r…   r†   r‡   rŽ   rŒ   ÚnowÚkÚvr‚   Úes   &&&&$$$$     r   Ú_ttl_memo_putrš   ±   s¾   € ð7Ü�iŠi‹kˆÜ!0°Ó!6×!<Ñ!<Ô!>ô  AÑ!>™˜Ä*ÈQÔPT×BU”Ð[^ÔafÐgh×glÑglÐmsÐuvÓgwÓaxÕ[xÐ|ÑZ”�’Ñ!>ˆñ  Aß7?�V )Ñ3ÀiÐX^ÐEdˆ‰	Ü˜$¨Q¸:×Fùó Aøô ô 7Ü�‰Ð,¨d×6Ò6ûð7ús4   ‚1B, ³B&Á$B&Á;B&Â#B, Â&B, Â,CÂ7CÃCc                ó$   € V ^8„  d   QhR\         /# ©r)   r+   r   )r.   s   "r   r/   r/   ¼   s   € ÷ 5ñ 5¤dñ 5r   c                  ó   € \        R 4      # )zlocal_endpoint_probes.json©ru   r   r   r   Ú_local_probe_disk_cache_pathrŸ   ¼   s   € ÜÐ3Ó4Ð4r   c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# )r)   ÚkindrY   r+   )r-   r   r   )r.   s   "r   r/   r/   À   s*   € ÷ Iñ I¤ð I¬#ð I´(¼3µ-ñ Ir   c                óD   € \        \        4       V  RV 2\        RRR7      # )z8Return a fresh cached value for ``kind:key``, else None.r1   Útsr%   ©r†   r‡   )r‹   rŸ   Ú_LOCAL_PROBE_DISK_TTL_SECONDS)r¡   rY   s   &&r   Ú_local_probe_disk_getr¦   À   s0   € äÔ5Ó7¸D¸6ÀÀ3À%¸ÔJgÐptð  AHô  Ið  Ir   c                ó@   € V ^8„  d   QhR\         R\         R\        RR/# )r)   r¡   rY   r%   r+   N)r-   r   )r.   s   "r   r/   r/   Å   s.   € ÷ hñ h¤ð h¬#ð h´cð h¸dñ hr   c           
     óL   € \        \        4       V  RV 2V\        RRRR7       R# )zEPersist a successful probe result. Best-effort; prunes stale entries.r1   r£   r%   zlocal probe disk cache)r†   r‡   rŽ   N)rš   rŸ   r¥   )r¡   rY   r%   s   &&&r   Ú_local_probe_disk_putr©   Å   s3   € äÔ.Ó0°T°F¸!¸C¸5°/À5ÔJgÐptð  AHð  Og÷  hr   c                ó$   € V ^8„  d   QhR\         /# rœ   r   )r.   s   "r   r/   r/   Ê   s   € ÷ 9ñ 9¬ñ 9r   c                 ó   € \        R4      # )z1Path to the OpenRouter model metadata disk cache.zopenrouter_model_metadata.jsonrž   r   r   r   Ú_get_model_metadata_cache_pathr¬   Ê   s   € äÐ7Ó8Ð8r   c                ó:   € V ^8„  d   QhR\         \        ,          /# rœ   )r   rˆ   )r.   s   "r   r/   r/   Ï   s   € ÷ ñ ´¼µñ r   c                 ó¶   €  \         P                   ! 4       \        4       P                  4       P                  ,
          p V ^ 8¼  d   V # R#   \         d     R# i ; i)z;Disk-cache age in seconds, or None if freshness is unknown.N)rS   r¬   ÚstatÚst_mtimer9   )Úages    r   Ú&_model_metadata_disk_cache_age_secondsr²   Ï   sM   € ðÜ�iŠi‹kÔ:Ó<×AÑAÓC×LÑLÕLˆØ˜Q”hˆsÐ( DÐ(øÜô Úðús   ‚AA	 ÁA	 Á	AÁAc                óh   € V ^8„  d   QhR\         \        \         \        \        3,          3,          /# rœ   ©rx   r-   r   )r.   s   "r   r/   r/   Ø   s%   € ÷ ñ ¬¬c´4¼¼S¸µ>Ð.AÕ)Bñ r   c                 óÖ  €  \        4       P                  RRR7      ;_uu_ 4       p \        P                  ! V 4      pRRR4       \	        X\
        4      '       dG   VP                  4        UUu/ uF)  w  r#\	        V\
        4      '       g   K  \        V4      VbK+  	  upp# / #   + '       g   i     Ln; iu uppi   \         d#   p\        P                  RT4       / u Rp?# Rp?ii ; i)zBProcessed OpenRouter metadata cache from disk ({} on any failure).rz   r{   r|   Nz7Failed to load OpenRouter model metadata disk cache: %s)r¬   r~   r   r€   rk   rx   r•   r-   r9   rV   rW   )r�   r‚   rY   r%   r™   s        r   Ú_load_model_metadata_disk_cacher¶   Ø   s¬   € ðÜ+Ó-×2Ñ2°3ÀÐ2×MÔMÐQRÜ—9’9˜Q“<ˆD÷ Nä^hÐimÔos×^tÒ^t°$·*±*´,ÔZ±,¡J CÄ*ÈUÔTX×BY””�C“˜%’±,ÒZÐ|Ðz|Ð|÷ N×MüãZøÜô Ü�‰ÐNÐPQÔRØ�	ûðúsK   ‚#B; ¥B"¼1B; Á-B5ÂB5ÂB; Â B; Â"B2	Â-B; Â;C(ÃC#ÃC(Ã#C(c                ól   € V ^8„  d   QhR\         \        \         \        \        3,          3,          RR/# )r)   r‚   r+   Nr´   )r.   s   "r   r/   r/   ã   s0   € ÷ Sñ S¬$¬s´D¼¼c¸µNÐ/BÕ*Cð SÈñ Sr   c                 ó”   €  \        \        4       V ^ RR7       R#   \         d"   p\        P	                  RT4        Rp?R# Rp?ii ; i)ro   r�   z7Failed to save OpenRouter model metadata disk cache: %sNr“   )r   r¬   r9   rV   rW   )r‚   r™   s   & r   Ú_save_model_metadata_disk_cacher¹   ã   s@   € ðSÜÔ8Ó:¸DÈÐWa×bøÜô SÜ�‰ÐNÐPQ×RÒRûðSús   ‚ ›A¦AÁAc                ó$   € V ^8„  d   QhR\         /# rœ   r   )r.   s   "r   r/   r/   ê   s   € ÷ 7ñ 7¬4ñ 7r   c                 ó   € \        R4      # )zMOn-disk memo of remote ``/models`` probes (see ``_endpoint_disk_cache_get``).zendpoint_model_metadata.jsonrž   r   r   r   Ú!_get_endpoint_metadata_cache_pathr¼   ê   s   € äÐ5Ó6Ð6r   c          	      óŠ   € V ^8„  d   QhR\         R\        \        \         \        \         \        3,          3,          ,          /# )r)   rE   r+   )r-   r   rx   r   )r.   s   "r   r/   r/   ï   s1   € ÷ 8ñ 8¬ð 8´¼$¼sÄDÌÌcÈÅNÐ?RÕ:SÕ1Tñ 8r   c                ón   € \        \        4       V \        RRR7      p\        V\        4      '       d   V# R# )a  Fresh cross-process memo of a remote ``/models`` probe (same TTL as in-memory): one-shot
runs (``hermes -q``, cron) start cold and Nous bypasses the persistent context cache, so
without this every launch paid the live probe. Local endpoints are never memoized.ÚatÚmodelsr¤   N)r‹   r¼   Ú_ENDPOINT_MODEL_CACHE_TTLrk   rx   )rE   rÀ   s   & r   Ú_endpoint_disk_cache_getrÂ   ï   s;   € ô Ô<Ó>À
ÔLeÐnrð  Gô  H€FÜ ¬×-Ò-ˆ6Ð7°4Ð7r   c                óx   € V ^8„  d   QhR\         R\        \         \        \         \        3,          3,          RR/# )r)   rE   rr   r+   N©r-   rx   r   )r.   s   "r   r/   r/   ÷   s9   € ÷ cñ c¬ð c´T¼#¼tÄCÌÀH½~Ð:MÕ5Nð cÐSWñ cr   c                óB   € \        \        4       W\        RRRRR7       R# )zLMemoize a successful remote ``/models`` probe; expired siblings are dropped.r¿   rÀ   z"endpoint model metadata disk cacheT)r†   r‡   rŽ   rŒ   N)rš   r¼   rÁ   )rE   rr   s   &&r   Ú_endpoint_disk_cache_putrÆ   ÷   s!   € äÜ)Ó+¨ZÔ@YØ˜xÐ.RÐ]a÷cr   é è é ô é ú  c                ó4   € V ^8„  d   QhR\         R\         RR/# ©r)   r*   rA   r+   Nr,   )r.   s   "r   r/   r/     s!   € ÷ 

ñ 

¬ð 

¼ð 

Àñ 

r   c                ó²   € Y;'       g    R3pV\         9  d?   \         P                  V4       \        P                  RY;'       g    R\        R 4       R# R# )zŸWarn once per model+endpoint that detection failed and the hard default is used,
so small-context models (8K, 32K) don't silently get 256K and fail at the API.Ú u‘   Could not determine context length for model %r (base_url=%s) â€” falling back to %s tokens. Set model.context_length in config.yaml to override.Údefaultr”   N)Ú_FALLBACK_WARNEDÚaddrV   ÚwarningÚDEFAULT_FALLBACK_CONTEXT)r*   rA   rY   s   && r   Ú_warn_context_length_fallbackrÓ     sS   € ð —.�.˜bÐ
!€CØ
Ô"Ô"Ü×Ñ˜SÔ!Ü�‰ðCà×(Ð(˜yÔ-EÀaÐ,Hö	
ñ #r   zclaude-fable-5é@B zclaude-fableúclaude-opus-5zclaude-sonnet-5úclaude-opus-4-8zclaude-opus-4.8zclaude-opus-4-7zclaude-opus-4.7zclaude-opus-4-6zclaude-sonnet-4-6zclaude-opus-4.6zclaude-sonnet-4.6Úclaudei@ zgpt-6-astrai� zgpt-6.1-solú	gpt-6-solú
gpt-6-lunaúgpt-5.6-lunaúgpt-5.6-terraúgpt-5.6-solzgpt-5.5zgpt-5.4-nanoi€ zgpt-5.4-minizgpt-5.4zgpt-5.3-codex-sparkzgpt-5.1-chatzgpt-5zgpt-4.1iü zgpt-4Úgeminii   zgemma-4Úgemma4zgemma-4-31bzgemma-3i   Úgemmai    údeepseek-v4-proúdeepseek-v4.1-flashúdeepseek-v4-flashúdeepseek-chatúdeepseek-reasonerúdeepseek-flashÚdeepseekÚllamaúmuse-spark-1.3ú
muse-sparkÚinklingzqwen3.8-maxzqwen3.8-flashúqwen3.6-pluszqwen3.7-pluszqwen3-coder-pluszqwen3-coderi   z	qwen3-maxÚqwenú
minimax-m3Úminimaxi   zglm-5.3i   zglm-5.3-flashzglm-5.3:batchz
glm-5.3:uszglm-5.3-flash:batchzglm-5.3-flash:uszglm-5.3-flashxzglm-5.2zglm-5.2:freezglm-5.1zglm-5-turboi  zglm-5v-turbozglm-5zglm-4.7-flashzglm-4.7zglm-4.6vzglm-4.6Úglmzgrok-composerzgrok-build-latesti ¡ z
grok-buildzgrok-code-fastzgrok-2-visionúgrok-4-fasti€„ ú	grok-4.20úgrok-4.6úgrok-4.5úgrok-4.3zgrok-4zgrok-3zgrok-2Úgrokúkimi-k3Úkimizsolar-open2z
solar-pro3z
solar-pro2i   z
solar-minié €  úsolar-i   zhy4-previewzhy3-previewÚhy3zx-preview-fzox-alphazunion-alphaznemotron-3.5-lightningznemotron-3.5-super-vlÚnemotronzlaguna-s-2.1zlaguna-xs-2.1ÚtrinityÚelephantzQwen/Qwen3.5-397B-A17BzQwen/Qwen3.5-35B-A3Bzdeepseek-ai/DeepSeek-V3.2zmoonshotai/Kimi-K2.5zmoonshotai/Kimi-K2.6zmoonshotai/Kimi-K2-ThinkingzMiniMaxAI/MiniMax-M2.5zXiaomiMiMo/MiMo-V2-Flashzmimo-v2.6-pro-ultraspeedzmimo-v2.6-prozmimo-v2.6-flashzmimo-v2-prozmimo-v2.5-proz	mimo-v2.5zmimo-v2-omnizmimo-v2-flashzzai-org/GLM-5c                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/   v  s   € ÷ cñ c¬#ð c´$ñ cr   c                ó,  a€ T ;'       g    RP                  4       P                  4       P                  R^4      R,          o\        S4      ;'       dC    \        ;QJ d#    V3R l\
         4       F  '       g   K   R# 	  R# ! V3R l\
         4       4      # )zfAllowlist check (aggregator prefixes like ``x-ai/`` stripped); unknown Grok models get no effort dial.rÍ   Ú/c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir   ©r5   )r#   r<   r    s   & €r   r&   Ú1grok_supports_reasoning_effort.<locals>.<genexpr>y  s   øé € ÐbÑDa¸&˜dŸo™o¨f×5Ð5ÓDaùó   ƒ!TFéÿÿÿÿ)r8   r"   Úrsplitr]   ÚanyÚ_GROK_EFFORT_CAPABLE_PREFIXES©r*   r    s   &@r   Úgrok_supports_reasoning_effortr
  v  si   ø€ à�KˆK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Õ;€DÜ�‹:×bÐbŸ#›#ÔbÕDaÓbŸ#œ#Ðbš#Ðb˜#ÔbÕDaÓbÓbÐbr   z-^(?:ft:)?(?:gpt-3\.5|gpt-4(?![0-9])|chatgpt-)c                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/   „  s   € ÷ 6ñ 6¬#ð 6´$ñ 6r   c                ó¼   € T ;'       g    RP                  4       P                  4       P                  R^4      R,          p\        \        P                  V4      4      # )z®True for an OpenAI model id (aggregator ``openai/`` prefix stripped) that rejects the
Responses ``reasoning`` parameter outright, so callers send no ``reasoning`` key at all.rÍ   r   r  )r8   r"   r  r]   Ú_OPENAI_NON_REASONING_REr;   r	  s   & r   Úopenai_model_rejects_reasoningr  „  sJ   € ð �KˆK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Õ;€DÜÔ(×.Ñ.¨tÓ4Ó5Ð5r   c                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/   ‹  s   € ÷ >ñ >œSð >¤Tñ >r   c                óÜ   € T ;'       g    RP                  4       P                  4       P                  RR4      P                  R^4      R,          pVR8H  ;'       g    VP	                  R4      # )z0Whether *model* is a Grok 4.6 family identifier.rÍ   Ú_Ú-r   rò   z	grok-4.6-r  )r8   r"   Úreplacer  r5   r	  s   & r   Úis_grok_46_familyr  ‹  sZ   € à�KˆK�R×ÑÓ ×&Ñ&Ó(×0Ñ0°°cÓ:×AÑAÀ#ÀqÓIÈ"ÕM€DØ�:Ñ×=Ð= §¡°Ó!=Ð=r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r(   ©r   r-   r]   )r.   s   "r   r/   r/   —  s"   € ÷ Gñ G¬´­ð G¼$ñ Gr   c                ó.  € \        T ;'       g    R4      P                  4       P                  4       P                  R^4      ^ ,          P	                  R^4      R,          p\
        P                  ! RRV4      p\
        P                  ! RRV4      \        9   # )a
  Whether *model* accepts Anthropic fast mode. Accepts vendor-prefixed, dotted, variant and
dated spellings (``anthropic/claude-opus-5.5``, ``claude-opus-4-8-20260601``). Dedicated
``...-fast`` ids select fast inference through the model field and are not in the list.rÍ   r1   r   z
(\d)\.(\d)z\1-\2z-\d{8}$r  )r-   r8   r"   r6   r  ÚreÚsubÚ_ANTHROPIC_FAST_MODE_MODELSr	  s   & r   Úis_anthropic_fast_mode_modelr  —  su   € ô ˆu�{ˆ{˜Ó×!Ñ!Ó#×)Ñ)Ó+×1Ñ1°#°qÓ9¸!Õ<×CÑCÀCÈÓKÈBÕO€DÜ�6Š6�- ¨4Ó0€DÜ�6Š6�*˜b $Ó'Ô+FÑFÐFr   c                ó0   € V ^8„  d   QhR\         R\         /# rH   r,   )r.   s   "r   r/   r/   ª  s   € ÷ 0ñ 0¤#ð 0¬#ñ 0r   c                 óT   € T ;'       g    R P                  4       P                  R4      # )rÍ   r   )r8   Úrstrip©rA   s   &r   rD   rD   ª  s"   € Ø�NˆN˜×!Ñ!Ó#×*Ñ*¨3Ó/Ð/r   rÍ   c                óR   € V ^8„  d   QhR\         R\        \        \        3,          /# )r)   Úapi_keyr+   )Úobjectrx   r-   )r.   s   "r   r/   r/   ®  s&   € ÷ Añ Aœ6ð A¬4´´S°­>ñ Ar   c                 ó@   € ^ RI Hp V! V 4      pV'       d   RRV 2/# / # )ro   )Úmaterialize_probe_api_keyÚAuthorizationúBearer )Úagent.command_token_sourcer$  )r!  r$  Útokens   &  r   Ú_auth_headersr)  ®  s(   € ÝDÙ% gÓ.€Eß38ˆO˜w u gÐ.Ð/Ð@¸bÐ@r   c                ó0   € V ^8„  d   QhR\         R\        /# rH   r\   )r.   s   "r   r/   r/   ´  s   € ÷ Wñ W¤#ð W¬$ñ Wr   c                 ó`   € \        V 4      p\        V4      ;'       d    \        VR 4      '       * # )úopenrouter.ai)rD   r]   r   )rA   rE   s   & r   Ú_is_custom_endpointr-  ´  s*   € Ü$ XÓ.€JÜ�
Ó×VÐVÔ$9¸*ÀoÓ$VÔ VÐVr   zapi.openai.comÚopenaiúchatgpt.comúapi.anthropic.comÚ	anthropiczapi.z.aiÚzaizopen.bigmodel.cnzapi.moonshot.aizkimi-codingzapi.moonshot.cnzkimi-coding-cnzapi.kimi.comzapi.stepfun.aiÚstepfunzapi.stepfun.comzapi.arcee.aiÚarceezapi.minimaxzdashscope.aliyuncs.comÚalibabazdashscope-intl.aliyuncs.comzportal.qwen.aiz
qwen-oauthr,  Ú
openrouterz!generativelanguage.googleapis.comzinference-api.nousresearch.comÚnouszapi.deepseek.comzapi.githubcopilot.comÚcopilotz.githubcopilot.comzmodels.github.aizmodels.inference.ai.azure.comzapi.fireworks.aiÚ	fireworkszopencode.aizopencode-gozapi.x.aiÚxaizintegrate.api.nvidia.comÚnvidiazapi.xiaomimimo.comÚxiaomizxiaomimimo.comzapi.gmi-serving.comÚgmiúapi.novita.aiÚnovitaztokenhub.tencentmaas.comztencent-tokenhubzapi.lkeap.cloud.tencent.comztencent-tokenplanz
ollama.comúollama-cloudc                óF   € V ^8„  d   QhR\         R\        \         ,          /# rH   rI   )r.   s   "r   r/   r/   ×  s   € ÷ 	ñ 	¤sð 	¬x¼­}ñ 	r   c                óð   € \        V R4      pVf   R# VP                  P                  4       ;'       g    VP                  P                  4       p\        P                  4        F  w  r4W29   g   K  Vu # 	  R# )zUmodels.dev provider name for a base URL (custom endpoints need no explicit provider).rK   N)rF   Únetlocr"   rw   Ú_URL_TO_PROVIDERr•   )rA   rO   ÚhostÚurl_partÚproviders   &    r   Ú_infer_provider_from_urlrH  ×  sc   € ä˜X wÓ/€FØ‚~ÙØ�=‰=×ÑÓ ×7Ð7 F§K¡K×$5Ñ$5Ó$7€DÜ.×4Ñ4Ö6ÑˆØÖØŠOñ 7ñ r   c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r)   r*   rA   rG  r+   r,   )r.   s   "r   r/   r/   ã  s,   € ÷ $ñ $Üð$Üð$Ü.1ð$äñ$r   c                ó$  € V '       g   V # T;'       g    RP                  4       P                  4       R8H  ;'       g"    \        V4      ;'       d    \        V4      R8H  pV'       g   V # \	        V 4      pVf   V # \
        P                  RW4       V# )u¾  Strip an OpenRouter routing-variant suffix for catalog lookup.

``:nitro`` / ``:floor`` / ``:exacto`` / ``:online`` are request-time
routing modifiers, NOT catalog entries â€” OpenRouter's ``/models`` lists
only the base id, and a variant shares the base model's context window.
Without this, every lookup below misses and the resolver falls through to
a generic family default (``x-ai/grok-4.6:nitro`` â†’ the 131K ``grok``
catch-all instead of its real 2M window).

Only the id used for LOOKUP is rewritten. The suffixed id the caller holds
stays on the wire, so the routing opt-in is preserved â€” the same rule
:func:`hermes_cli.models.validate_requested_model` applies. Sharing the
base's cache key is intentional: the window is identical, so a variant and
its base must never disagree.

Narrow by design: only applied when the request actually routes through
OpenRouter, so a local ``model:tag`` that happens to end in one of these
words is untouched.
rÍ   r6  zIResolving context length for OpenRouter routing variant %r via base id %r)r8   r"   r]   rH  r   rV   rW   )r*   rA   rG  Úis_openrouterÚbases   &&&  r   Ú!_strip_openrouter_routing_variantrM  ã  sŒ   € ÷, ØˆØ—^�^ ×*Ñ*Ó,×2Ñ2Ó4¸ÑD÷ ð ÜˆX‹×MÐMÔ3°HÓ=ÀÑMð ÷ ØˆÜ" 5Ó)€DØ‚|ØˆÜ
‡L�LØSØôð €Kr   c                ó0   € V ^8„  d   QhR\         R\        /# rH   r\   )r.   s   "r   r/   r/   
  s   € ÷ :ñ :¬#ð :´$ñ :r   c                 ó   € \        V 4      R J# r   )rH  r  s   &r   Ú_is_known_provider_base_urlrP  
  s   € Ü# HÓ-°TÐ9Ð9r   c                ó0   € V ^8„  d   QhR\         R\         /# rH   r,   )r.   s   "r   r/   r/     s   € ÷ ñ ¤Cð ¬Cñ r   c                óœ   € \        V 4      pR F:  pVP                  V4      '       g   K  VR\        V4      )  P                  R4      u # 	  V# )z7LM Studio server root for native ``/api/v1`` endpoints.Nr   )z/api/v1z/apiú/v1)rD   ÚendswithÚlenr  )rA   Úrootr=   s   &  r   Ú_lmstudio_server_rootrW    sJ   € ä˜xÓ(€DÛ,ˆØ�=‰=˜× Ô Ø˜œ3˜v›;˜,Ð'×.Ñ.¨sÓ3Ò3ñ -ð €Kr   c                ó0   € V ^8„  d   QhR\         R\         /# rH   r,   )r.   s   "r   r/   r/     s   € ÷ *ñ *œ3ð *¤3ñ *r   c                óX   € \        V P                  R4      4      pVP                  R4      # )zFProbe root for a local server: IPv4-resolved, ``/v1`` suffix stripped.r   rS  )Ú_localhost_to_ipv4r  Úremovesuffix)rA   Ú
server_urls   & r   Ú_server_rootr]    s&   € ä# H§O¡O°CÓ$8Ó9€JØ×"Ñ" 5Ó)Ð)r   z((?:Ú|z)[a-z]+)-(\d{1,2})(?=[-:.@]|$)c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r)   rY   Úmodel_lowerr+   r\   )r.   s   "r   r/   r/   $  s&   € ÷ 
hñ 
hœcð 
h´ð 
h¼ñ 
hr   c                óÖ  € V P                  \        4      '       d­   \        P                  RV4      pV P	                  R4      '       dL   \
        P                  ! \
        P                  ! V 4      R,           VP                  R^4      R,          4      RJ# \
        P                  ! \
        P                  ! V 4      R,           V4      RJ# W9   ;'       g    \        V 4      \        V4      9   # )ap  Substring match with version separators normalised on both sides, so a relay slug like
``z-ai-glm-5-3`` still hits the ``glm-5.3`` entry instead of the ``glm`` catch-all (#97398).
Boundary-matched families: a key must be followed by ``-:.@`` or the end, and a key ending in
``-`` is the family default for bare names (``org/`` allowed) continuing with a lineup letter.z\1\2r  z[a-z]r   Nz(?:[-:.@]|$)r  )r5   Ú_BOUNDARY_MATCHED_KEY_PREFIXESÚ_HYPHENATED_GENERATION_REr  rT  r  r;   Úescaper  ÚsearchÚ_normalize_model_version)rY   r`  s   &&r   Ú_catalog_key_matchesrg  $  s²   € ð
 ‡~�~Ô4×5Ò5Ü/×3Ñ3°G¸[ÓIˆØ�<‰<˜×ÒÜ—8’8œBŸIšI c›N¨WÕ4°k×6HÑ6HÈÈaÓ6PÐQSÕ6TÓUÐ]aÐaÐaÜ�yŠyœŸš 3›¨/Õ9¸;ÓGÈtÐSÐSØÑ×gÐgÔ!9¸#Ó!>ÔBZÐ[fÓBgÑ!gÐgr   c          	      ó–   € V ^8„  d   QhR\         \        \        3,          R\        R\        \        \        \        3,          ,          /# )r)   Útabler`  r+   )rx   r-   Úintr   Útuple)r.   s   "r   r/   r/   1  s9   € ÷ ñ œd¤3¬ 8�nð ¼3ð Ä8ÌEÔRUÔWZÐRZÍOÕC\ñ r   c                ó~   € \        V P                  4       R RR7       F  w  r#\        W!4      '       g   K  W#3u # 	  R# )z¼First ``(key, value)`` whose key is a substring of ``model_lower``, longest key first so
specific entries (``gpt-5.4-mini``) beat their family catch-all (``gpt-5``); ties keep table order.c                 ó&   € \        V ^ ,          4      # ©ro   ©rU  )Úxs   &r   Ú<lambda>Ú$_longest_key_match.<locals>.<lambda>4  s   € ¼#¸aÀ½d¼)r   T)rY   ÚreverseN)Úsortedr•   rg  )ri  r`  rY   r%   s   &&  r   Ú_longest_key_matchru  1  s9   € ô ˜UŸ[™[›]Ñ0CÈT×R‰
ˆÜ ×1Ô1Ø�:Òñ Sñ r   Úminimumc          	      ó–   € V ^8„  d   QhR\         \        \        3,          R\        R\        \
        ,          R\        \
        ,          /# )r)   r‚   Ú
gguf_firstrv  r+   )rx   r-   r   r]   r   rj  )r.   s   "r   r/   r/   :  s<   € ÷ ñ œt¤C¬ H�~ð ¼dð ÌXÔVYÍ]ð ÔfnÔorÕfsñ r   c               ó†   a € V 3R lpV 3R lpV'       d   WC3MW43 F!  pV! 4        F  pVe	   Wb8¼  g   K  Vu u # 	  K#  	  R# )a  Context length from an Ollama ``/api/show`` payload. ``parameters.num_ctx`` is the RUNTIME
window (Modelfile override), ``model_info.*.context_length`` the GGUF training max. Local users
control num_ctx (prefer it); hosted operators may cap it arbitrarily (``gguf_first``).c               3   ó   <"  € SP                  R R4      P                  R4       FQ  p V P                  4       P                  4       pRV 9   g   K*  \        V4      ^8¼  g   K<   \	        VR,          4      x € KS  	  R#   \
         d     Ke  i ; i5i)Ú
parametersrÍ   Ú
Únum_ctxNr  )r_   r6   r8   rU  rj  Ú
ValueError)ÚlineÚpartsr‚   s     €r   Ú_num_ctxÚ&_ollama_show_context.<locals>._num_ctx>  sr   øé € Ø—H‘H˜\¨2Ó.×4Ñ4°TÖ:ˆDØ—J‘J“L×&Ñ&Ó(ˆEØ˜DÖ ¤S¨£Z°1¦_ðÜ˜e B�i›.Ô(ó	 ;øô
 "ô Úðüs0   ƒABÁBÁ"A<Á6BÁ<BÂBÂ
BÂBc               3   óÊ   <"  € SP                  R / 4      P                  4        F9  w  rRV 9   g   K  \        V\        \        34      '       g   K,  \        V4      x € K;  	  R# 5i)Ú
model_infoÚcontext_lengthN)r_   r•   rk   rj  rˆ   )rY   r%   r‚   s     €r   Ú_ggufÚ#_ollama_show_context.<locals>._ggufF  sH   øé € ØŸ(™( <°Ó4×:Ñ:Ö<‰JˆCØ 3Ö&¬:°e¼cÄ5¸\×+JÔ+JÜ˜%“jÔ ó =ùs   ƒ*A#²A#ÁA#Nr   )r‚   rx  rv  r�  r†  ÚreaderÚctxs   f$$    r   Ú_ollama_show_contextrŠ  :  sF   ø€ õõ!÷ )3�EÑ$¸Ð8IÒIˆÙ–8ˆCØŠ #¦.Ø”
ó ñ Jñ r   z/codingz
/coding/v1rS  zdeepseek-ai/deepseek-v4-proc                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# ©r)   r*   rA   r+   ©r-   r   rj  )r.   s   "r   r/   r/   X  s*   € ÷ ^ñ ^¬3ð ^¼#ð ^Ä(Ì3Å-ñ ^r   c                ó2  aaa€  \        \        V4      4      pVP                  pTP                  P                  4       R8w  gH   TR9  gA   TP                  f3   TP                  f%   TP                  '       g   TP                  '       d   R# TP                  ;'       g    RP                  4       TP                  P                  R4      T P                  4       P                  4       uooo\        TTT3R l\         4       R4      #   \         d     R# i ; i)a  Context confirmed for one provider endpoint only (see _ENDPOINT_SCOPED_CONTEXT): Kimi Coding
serves K3 at 1 Mi only on the canonical ``api.kimi.com/coding`` host (legacy Moonshot keys do
not); NVIDIA NIM serves deepseek-v4-pro at 262,144 while DeepSeek's native endpoint is 1M.NrK   rÍ   r   c              3   ód   <"  € T F%  w  rr4SV8X  g   K  SV9   g   K  SV9   g   K!  Vx € K'  	  R # 5ir   r   )r#   Úscoped_hostÚpathsrÀ   r‰  rE  Ú	model_keyrw   s   &    €€€r   r&   Ú2_endpoint_scoped_context_length.<locals>.<genexpr>e  sH   øé € ð  WÑ<TÑ8˜¨VÐX\Ð`kÑXk”ÐptÐx}Ñp}”ð  CLð  PVñ  CV—’Ó<Tùs   ƒ0”0�0¦
0)NrL   )r
   rD   rN   r~  rB   r"   ÚusernameÚpasswordÚqueryÚfragmentrM   rw   r  r8   ÚnextÚ_ENDPOINT_SCOPED_CONTEXT)r*   rA   rO   rN   rE  r’  rw   s   &&  @@@r   Ú_endpoint_scoped_context_lengthrš  X  s  ú€ ðÜÔ-¨hÓ7Ó8ˆØ�{‰{ˆð ‡}�}×ÑÓ Ô'¨4°{Ô+BÀfÇoÁoÒFaÐek×etÑetò  fAð  EK÷  EQ÷  EQð  EQð  U[÷  Ud÷  Udð  UdÙØ#Ÿ_™_×2Ð2°×9Ñ9Ó;¸V¿[¹[×=OÑ=OÐPSÓ=TÐV[×VaÑVaÓVc×ViÑViÓVkÐ€Dˆ$�	Üö  WÕ<Tó  Wð  Y]ó  ^ð  ^øô ô Úðús   … D ÄDÄDc                ó<   € V ^8„  d   QhR\         R\         R\        /# ©r)   rA   rG  r+   r\   )r.   s   "r   r/   r/   h  s&   € ÷ Lñ L¬Sð L¼Cð LÄDñ Lr   c                óX   € T;'       g    RP                  4       P                  4       R9   # )zÈProviders whose disk context cache must not short-circuit probing: LM Studio (loaded
context is transient), Codex OAuth (entitlement-specific window; a persisted fallback would suppress revalidation).rÍ   >   Úlmstudioúopenai-codex)r8   r"   ©rA   rG  s   &&r   Ú_skip_persistent_context_cacher¡  h  s(   € ð �NˆN˜×!Ñ!Ó#×)Ñ)Ó+Ð/KÑKÐKr   c                óV   € V ^8„  d   QhR\         R\         R\        R,          R\        /# )r)   rG  rA   Úcustom_providersNr+   )r-   Úlistr]   )r.   s   "r   r/   r/   n  s-   € ÷ ñ œcð ¬Sð ÄDÈ4ÅKð ÔTXñ r   c                ó  € T ;'       g    RP                  4       P                  4       R8X  d   R# V'       g   R# \        P                  ! \        4      ;_uu_ 4        ^ RIHp V! W4      R8H  uuRRR4       #   + '       g   i     R# ; i)aH  True when the request travels the Codex Responses wire regardless of host: the native
``openai-codex`` provider (also behind a ``HERMES_CODEX_BASE_URL`` / ``model.base_url`` proxy)
or a custom entry declaring ``api_mode: codex_responses``. The transport, not the hostname,
decides which window the model actually gets (#116191).rÍ   rŸ  TF)Úget_custom_provider_api_modeÚcodex_responsesN)r8   r"   Ú
contextlibÚsuppressr9   Úhermes_cli.configr¦  )rG  rA   r£  r¦  s   &&& r   Ú_is_codex_router«  n  sc   € ð
 	�ˆ�B×ÑÓ×%Ñ%Ó'¨>Ô9ÙßÙÜ	×	Ò	œY×	'Õ	'ÝBÙ+¨HÓGÐK\Ñ\÷ 
(×	'×	'Ñ	'ñ ús   ÁA8Á8B		c          
      óL   € V ^8„  d   QhR\         R\         R\        R\         RR/# )r)   r*   rA   r‰  rG  r+   N©r-   rj  )r.   s   "r   r/   r/   }  s0   € ÷ 2ñ 2¤ð 2¬sð 2¼ð 2Ìð 2ÐPTñ 2r   c                óD   € \        W4      '       g   \        WV4       R# R# )z?Persist ``ctx`` unless the provider opts out of the disk cache.N)r¡  Úsave_context_length)r*   rA   r‰  rG  s   &&&&r   Ú_save_unless_skippedr°  }  s   € ä)¨(×=Ò=Ü˜E¨SÖ1ñ >r   c                ó@   € V ^8„  d   QhR\         R\         R\        RR/# )r)   r*   rA   Úlengthr+   Nr­  )r.   s   "r   r/   r/   ƒ  s)   € ÷ 5ñ 5¬Sð 5¼Cð 5Ìð 5ÐQUñ 5r   c                ó8   € V\         8¼  d   \        WV4       R# R# )z¶Persist a probed local window only at/above MINIMUM_CONTEXT_LENGTH: sub-minimum windows are
still returned so agent_init can reject them, but must not be blessed into the disk cache.N)ÚMINIMUM_CONTEXT_LENGTHr¯  )r*   rA   r²  s   &&&r   Ú!_maybe_cache_local_context_lengthrµ  ƒ  s   € ð Ô'Ô'Ü˜E¨VÖ4ñ (r   c                ój   € V ^8„  d   QhR\         R\         R\         R\         R\        \        ,          /# ©r)   r*   rA   r!  rG  r+   r�  )r.   s   "r   r/   r/   Š  s7   € ÷ ñ ¤sð ´cð ÄCð ÔSVð Ô[cÔdgÕ[hñ r   c                ó|   € \        WVR7      pV'       d   V^ 8”  g   R# \        W4      '       g   \        WV4       V# )z\Live local probe; persists a positive result unless the provider opts out of the disk cache.©r!  N)Ú_query_local_context_lengthr¡  rµ  )r*   rA   r!  rG  Ú	local_ctxs   &&&& r   Ú_probe_local_context_lengthr¼  Š  s5   € ä+¨EÀWÔM€Iß˜) aœ-ÙÜ)¨(×=Ò=Ü)¨%¸9ÔEØÐr   c          
      óT   € V ^8„  d   QhR\         R\         R\        R\         R\        /# ©r)   r*   rA   Úcachedr!  r+   r­  )r.   s   "r   r/   r/   ”  s1   € ÷ ñ ´#ð Äð Ìcð Ô\_ð Ôilñ r   c                ó"  € \        WVR7      pV'       d   V^ 8”  d   WB8w  g   V# V\        8  d"   \        P                  RWVR \        R 4       M\        P                  RWVR VR 4       \	        W4       V\        8¼  d   \        WV4       V# )zô*cached* unless a live local probe reports a different limit (operators restart
vLLM/Ollama with a new --max-model-len / num_ctx under the same id). A failed
probe keeps the disk entry; sub-minimum live windows invalidate but are not persisted.r¹  uk   Live local probe for %s@%s reports %s (< minimum %s); invalidating stale cache â€” agent init should rejectr”   z@Reconciling stale local cache entry %s@%s: %s -> %s (live probe))rº  r´  rV   ÚinfoÚ!_invalidate_cached_context_lengthrµ  )r*   rA   r¿  r!  Úlive_ctxs   &&&& r   Ú&_reconcile_local_cached_context_lengthrÄ  ”  sÁ   € ô +¨5ÀGÔL€Hß˜ Aœ¨(Ô*<ØˆØÔ(Ô(Ü�‰ð  Bð  DIð  X`ð  abð  Wcô  ið  @Að  hBõ  	Dä�‰ÐVÐX]ÐlrÐstÐkuð  |Dð  EFð  {Gô  	IÜ% eÔ6ØÔ)Ô)Ü)¨%¸8ÔDØ€Or   c                ó0   € V ^8„  d   QhR\         R\        /# rH   r\   )r.   s   "r   r/   r/   ¥  s   € ÷ Nñ N¤ð N¬ñ Nr   c                óÞ  €  \        V 4      pVe   VP                  ;'       g    RMRpTf   R# T\        9   gI   TP	                  \
        4      '       g.   TP	                  R4      '       g   T'       d   RT9  d
   RT9  d   R#  \        P                  ! T4      pTP                  '       gP   TP                  '       g>   TP                  '       g,   \        T\        P                  4      '       d   T\        9   d   R# TP                  R4      p\!        T4      ^8w  d   R#  \#        T^ ,          4      \#        T^,          4      reT^
8H  ;'       gi    T^¬8H  ;'       d    ^Tu;8*  ;'       d    ^8*  Mu ;'       g>    T^À8H  ;'       d    T^¨8H  ;'       g$    T^d8H  ;'       d    ^@Tu;8*  ;'       d    ^8*  # u #   \         d     R# i ; i  \         d     LÛi ; i  \         d     R# i ; i)z¾True for loopback, container-internal DNS, unqualified hosts, RFC-1918,
link-local and Tailscale CGNAT (so a trusted Ollama box over Tailscale gets
the same timeout auto-bumps as localhost).NrÍ   Fz.localÚ.r1   T)rF   rM   r9   Ú_LOCAL_HOSTSrT  Ú_CONTAINER_LOCAL_SUFFIXESÚ	ipaddressÚ
ip_addressÚ
is_privateÚis_loopbackÚis_link_localrk   ÚIPv4AddressÚ_TAILSCALE_CGNATr~  r6   rU  rj  )rA   rO   rE  Úaddrr€  ÚfirstÚseconds   &      r   Úis_local_endpointrÔ  ¥  sü  € ðÜ  Ó*ˆØ(.Ò(:ˆv�‰×$Ð$ "øÀˆð ‚|Ùð Œ|Ô˜tŸ}™}Ô-F×GÒGÈ4Ï=É=ÐYa×KbÒKb×gkÐpsÐ{Ôpð  EHð  PTô  ETÙðÜ×#Ò# DÓ)ˆØ�?�?ˆ?˜d×.×.Ð.°$×2D×2DÐ2DÌÐTXÔZc×ZoÑZo×IpÒIpÐuyô  ~Nô  vNÙð
 �J‰J�s‹O€EÜ
ˆ5ƒz�Q„ÙðÜ˜E !�H›¤s¨5°­8£}ˆvð �B‰;÷  Nð  N˜5 C™<×>Ð>¨B°&×,>Ô,>¸BÔ,>÷  Nð  NÀEÈSÁL×DbÐDbÐU[Ð_bÑUb÷  Nð  NÐhmÐqtÑht÷  iMð  iMÐy{ð  @F÷  zMô  zMð  JMñ  zMð  Nñ  zMð  Nøô1 ô Úðûô ô Ùðûô ô ÚðúsL   ‚!F: ¤F: Â'G Â-G Â?G Ã+G Ä"#G Æ:G	ÇG	ÇGÇGÇG,Ç+G,c                ó0   € V ^8„  d   QhR\         R\         /# )r)   Úurlr+   r,   )r.   s   "r   r/   r/   Ç  s   € ÷ Wñ WœCð W¤Cñ Wr   c                óv   € V '       d   \        V \        4      '       g   V # \        P                  ! RRV ^R7      # )zÅ``localhost`` HOST -> ``127.0.0.1`` (Windows dual-stack resolves ::1 first and pays a ~2s IPv6
connect timeout on IPv4-only servers). Scheme-anchored so ``?upstream=http://localhost`` is untouched.z^(https?://)localhost(?=[:/]|$)z\g<1>127.0.0.1)Úcount)rk   r-   r  r  )rÖ  s   &r   rZ  rZ  Ç  s0   € ÷ ”j ¤c×*Ò*Øˆ
Ü�6Š6Ð4Ð6GÈÐTUÔVÐVr   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# ©r)   rA   r!  r+   rI   )r.   s   "r   r/   r/   Ï  s%   € ÷ 7ñ 7¤sð 7´Sð 7Ä(Ì3Å-ñ 7r   c                óš  € ^ RI p\        \        V 4      4      p\        V4      R9  d   R# \	        V4      p\        V4      p\        P                  V4      pVeG   \        P                  ! 4       V^,          ,
          V^ ,          e   \        M\        8  d
   V^ ,          # \        V4      '       d   R# \        RV4      p\        V\        4      '       d!   V\        P                  ! 4       3\        V&   V# RV R23R 3RV R23R 3R	V R
2V R23R 3RV R23R 33pRp	 VP!                  R\#        V4      \$        P&                  ! V 4      R7      ;_uu_ 4       p
V FY  w  r¼p V F'  pV
P                  V4      pVP(                  ^È8X  g   K'   M	  XP(                  ^È8X  d   V! V4      '       d   Tp	 MKY  K[  	  RRR4       T	\        P                  ! 4       3\        T&   T	e   \1        RYI4       T	#   \*         d)   p\-        T4      '       d   \/        T4       h  Rp?KÃ  Rp?ii ; i  + '       g   i     Lv; i  \*         d     L†i ; i)zWProbe known endpoints: "ollama", "lm-studio", "vllm", "llamacpp", or None (TTL-cached).NÚserver_typeú	lm-studioú/api/v1/modelsc                 ó   € R # )Tr   ©rz   s   &r   rq  Ú*detect_local_server_type.<locals>.<lambda>ê  s   € ÁDr   Úollamaz	/api/tagsc                 ó(   € R V P                  4       9   # )rÀ   ©r   rà  s   &r   rq  rá  ë  s   € ¸(ÀaÇfÁfÃhÒ:Nr   Úllamacppú	/v1/propsú/propsc                 ó    € R V P                   9   # )Údefault_generation_settings)Útextrà  s   &r   rq  rá  ì  s   € ÐRoÐst×syÑsyÒRyr   Úvllmz/versionc                 ó(   € R V P                  4       9   # )Úversionrä  rà  s   &r   rq  rá  í  s   € °yÀAÇFÁFÃHÒ7Lr   g       @©ÚtimeoutÚheadersÚverify)Nr@  )rj   rZ  rD   rH  r]  rW  Ú_endpoint_probe_path_cacher_   rS   rT   Ú_ENDPOINT_PROBE_TTL_SECONDSÚ#_ENDPOINT_PROBE_FAILURE_TTL_SECONDSra   r¦   rk   r-   ÚClientr)  r   Úresolve_verifyÚstatus_coder9   rf   rZ   r©   )rA   r!  rj   rE   r\  Úlmstudio_urlr¿  Údisk_hitÚ	waterfallÚresultÚclientr    ÚurlsÚcheckrÖ  rz   rc   s   &&               r   Údetect_local_server_typerÿ  Ï  sL  € ãä#Ô$7¸Ó$AÓB€Jô
   
Ó+Ð3IÔIÙÜ˜jÓ)€JÜ(¨Ó4€LÜ'×+Ñ+¨JÓ7€FØÒœtŸ~š~Ó/°&¸µ)Õ;Ð_eÐfgÕ_hÒ_tÕ@[ô  {^ô  _Ø�a�yÐô ˜J×'Ò'ÙÜ$ ]°JÓ?€HÜ�(œC× Ò Ø2:¼D¿NºNÓ<LÐ1MÔ" :Ñ.Øˆð 
˜,˜ ~Ð6Ð8¹.ÐIØ	�z�l )Ð,Ð.Ñ0NÐOØ	˜˜ IÐ.°:°,¸fÐ0EÐFÑHyÐzØ	�Z�L Ð)Ð+Ñ-LÐMð	€Ið !€FðØ�\‰\ #¬}¸WÓ/EÔNa×NpÒNpÐqyÓNzˆ\×{Ô{ð  @FÛ%.Ñ!�˜EðÛ#˜Ø"ŸJ™J s›O˜ØŸ=™=¨CÖ/Ù!ñ  $ð —}‘}¨Ô+±°a·²Ø!%˜Ùñ 19Ñ+ñ &/÷ |ð$ /5´d·n²nÓ6FÐ-GÔ˜zÑ*ØÒÜ˜m¨ZÔ@Ø€Møô !ô ä*¨3×/Ò/Ü1°*Ô=Øõ 0ûðú÷ |×{ûô ô Ùðúsf   Ä"9H< Å	H)Å%$G3Æ"G3Æ1G3Æ3H)Æ;H< Ç3H&	Ç>H!	ÈH)È!H&	È&H)È)H9	È4H< È9H< È<I
É	I
c                ó$   € V ^8„  d   QhR\         /# )r)   r%   ©r   )r.   s   "r   r/   r/     s   € ÷ 0ñ 0œcñ 0r   c              #   ó
  "  € \        V \        4      '       d1   V x € V P                  4        F  p\        V4       R j  x€L
  K  	  R # \        V \        4      '       d   V  F  p\        V4       R j  x€L
  K  	  R # R #  L@ L5ir   )rk   rx   ÚvaluesÚ_iter_nested_dictsr¤  )r%   ÚnestedÚitems   &  r   r  r    si   é € Ü�%œ×ÒØŠØ—l‘l–nˆFÜ)¨&Ó1×1Ò1ó %ä	�Eœ4×	 Ò	 ÛˆDÜ)¨$Ó/×/Ò/ó ñ 
!ñ 2ñ 0ùs!   ‚<B¾A?¿3BÁ2BÁ3BÂBc          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \        ,          /# )r)   r%   rv  Úmaximumr+   )r   rj  r   )r.   s   "r   r/   r/     s/   € ÷ <ñ <¤#ð <´ð <ÄSð <ÔZbÔcfÕZgñ <r   c                 ó  € \        V \        4      '       d   R #  \        \        V \        4      '       d!   V P	                  4       P                  RR4      MT 4      pYu;8:  d	   T8:  d   T#  R #   \        \        3 d     R # i ; i)Nr”   rÍ   )rk   r]   rj  r-   r8   r  Ú	TypeErrorr~  )r%   rv  r  rû  s   &&& r   Ú_coerce_reasonable_intr    sv   € Ü�%œ×ÒÙðÜ´zÀ%Ì×7MÒ7M�U—[‘[“]×*Ñ*¨3°Ô3ÐSXÓYˆð Ö1¨'Ô1ˆ6Ð;Ð1°tÐ;øô ”zÐ"ô Úðús   šAA. Á.BÂBc                óŽ   € V ^8„  d   QhR\         \        \        3,          R\        \        R3,          R\        \
        ,          /# )r)   ÚpayloadÚkeys.r+   )rx   r-   r   rk  r   rj  )r.   s   "r   r/   r/      s6   € ÷ ñ ¤¤S¬# X¥ð ´e¼CÀ¸Hµoð Ì(ÔSVÍ-ñ r   c                 ó  € V Uu0 uF  q"P                  4       kK  	  pp\        V 4       FQ  pVP                  4        F:  w  r%\        V4      P                  4       V9   g   K%  \	        V4      pVf   K6  Vu u # 	  KS  	  R # u upi r   )r"   r  r•   r-   r  )r  r  rY   ÚkeysetÚmappingr%   Úcoerceds   &&     r   Ú_extract_first_intr     sm   € Ù%)Ó*¡T˜c�i‰iŽk¡T€FÐ*Ü% gÖ.ˆØ!Ÿ-™-ž/‰JˆCÜ�3‹x�~‰~Ó 6Ö)Ü0°Ó7�ØÔ&Ø"”Nó	 *ñ /ñ ùò +s   …Bc                óh   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          /# ©r)   r  r+   ©rx   r-   r   r   rj  )r.   s   "r   r/   r/   +  s*   € ÷ Añ A¬$¬s´C¨x­.ð A¼XÄc½]ñ Ar   c                ób   a € \        R \        \        V 3R l\         4       4       4       R4      # )zÌTop-level-only context WINDOW read (no nested walk, so an unrelated nested section can't leak
a same-named key). ``max_tokens`` is NOT a window key: on OpenAI-compatible passthroughs it is the max OUTPUT.c              3   ó0   "  € T F  qf   K  Vx € K  	  R # 5ir   r   )r#   Úcs   & r   r&   Ú/_extract_flat_context_length.<locals>.<genexpr>.  s   é € ÐyÑg�q—’Ógùó   ‚Œ
c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir   ©r_   ©r#   r—   r  s   & €r   r&   r  .  s   øé € Ð8fÑQeÈA¸¿¹ÀQ¿¸ÓQeùr  N)r˜  Úmapr  Ú_CONTEXT_LENGTH_KEYS)r  s   fr   Ú_extract_flat_context_lengthr!  +  s.   ø€ ô ÑyœCÔ 6Ô8fÕQeÓ8fÔgÓyÐ{ó  Að  Ar   c                óh   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          /# r  r  )r.   s   "r   r/   r/   1  s*   € ÷ 	Pñ 	P´´S¼#°Xµð 	PÄ8ÌCÅ=ñ 	Pr   c                óè   € \        V \        4      '       g   R# \        V 4      pVe   V# V P                  R4      p\        V\        \
        34      '       d   \	        V4      ^ 8”  d   \	        V4      # R# )zµContext window from a ``/v1/models`` object: window keys first, ``max_tokens`` last (Anthropic
payloads carry ``max_input_tokens`` = 1M window AND ``max_tokens`` = 128k OUTPUT cap).NÚ
max_tokens)rk   rx   r!  r_   rj  rˆ   )r  r‰  Úraws   &  r   Ú"_context_length_from_model_payloadr&  1  s_   € ô �gœt×$Ò$ÙÜ
& wÓ
/€CØ
‚Øˆ
Ø
�+‰+�lÓ
#€CÜ! #¬¬U |×4Ò4¼¸S»ÀA¼Œ3ˆs‹8ÐOÈ4ÐOr   Ú	per_tokenÚper_1k_tokensiè  Úper_thousand_tokensÚper_1m_tokensÚper_million_tokensgü©ñÒMbP?c                ó€   € V ^8„  d   QhR\         \        \        3,          R\        R\         \        \        3,          /# )r)   ÚpricingÚunitr+   r´   )r.   s   "r   r/   r/   G  s1   € ÷ ñ ¤D¬¬c¨¥Nð ¼#ð Ä$ÄsÌCÀxÅ.ñ r   c                ól  € / p\          F  p \        W,          4      W#&   K  	  \
        P                  \        T;'       g    R4      P                  4       P                  4       4      pVf[   \        ;QJ d*    R VP                  4        4       F  '       g   K   RM	  RM! R VP                  4        4       4      '       d   RM^pV^8w  dD   T P                  VP                  4        UUu/ uF  w  r5V\        WT,          4      bK  	  upp4       V #   \        \        \        3 d     EK#  i ; iu uppi )z³Rescale the generic path's token rates to per-token strings (the contract usage_pricing
multiplies by 1e6), the way the Novita/DeepInfra branches already do for their known units.rÍ   c              3   ó2   "  € T F  q\         8¬  x € K  	  R # 5ir   )Ú_PER_MILLION_QUOTE_MIN©r#   r˜   s   & r   r&   Ú)_normalize_token_rates.<locals>.<genexpr>R  s   é € Ð"WÉÀ1Ô(>Ö#>Ëùs   ‚TFrÔ   )Ú_TOKEN_RATE_FIELDSrˆ   ÚKeyErrorr
  r~  Ú_PRICING_UNIT_DIVISORSr_   r-   r8   r"   r  r  Úupdater•   )r-  r.  ÚratesrY   Údivisorr%   s   &&    r   Ú_normalize_token_ratesr:  G  sè   € ð !€Eß!ˆð	Ü˜w�|Ó,ˆE‹Jñ "ô
 %×(Ñ(¬¨T¯Z¨Z°R«×)>Ñ)>Ó)@×)FÑ)FÓ)HÓI€GØ‚ß"›sÑ"WÈÏÉÌÓ"WŸsŸsšsÑ"WÈÏÉÌÓ"W×WÒW‘)Ð]^ˆØ�!„|Ø�‰ÀEÇKÁKÄMÔRÁM±j°c˜œS ¥Ó1Ò1ÁMÒRÔSØ€Nøô œ)¤ZÐ0ô 	Ûð	üó Ss   �DÃ+D0
ÄD-Ä,D-c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# r  r´   )r.   s   "r   r/   r/   X  s*   € ÷ ñ œd¤3¬ 8�nð ´´c¼3°hµñ r   c           
      ó   a a€ R  R lpRRRR/p\         ;QJ d-    V 3R lVP                  4        4       F  '       g   K   RM"	  RM! V 3R lVP                  4        4       4      '       d   V! S VR	 4      # S P                  R
4      p\        V\        4      '       d   VP                  R4      MRoRRRRRR/p\        S\        4      '       dh   \         ;QJ d-    V3R lVP                  4        4       F  '       g   K   RM"	  RM! V3R lVP                  4        4       4      '       d   V! SVR 4      # RRRRRRRRRR/p\        S 4       F¨  pVP                  4        UUu/ uF  w  rx\        V4      P                  4       VbK!  	  p	pp/ p
VP                  4        F0  w  r¼V F%  pWÙ9   g   K  W�,          R9  g   K  W�,          W«&    K.  	  K2  	  V
'       g   KŽ  \        W©P                  R4      4      u # 	  / # u uppi )c                ó¢   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\         \        \        3,          /# )r)   ÚsourceÚfieldsr+   r´   )r.   s   "r   r/   Ú&_extract_pricing.<locals>.__annotate__Y  sA   € ÷ yñ yœ4¤¤S �>ð y´4¼¼S¸µ>ð yÌTÔRUÔWZÐRZÍ^ñ yr   c                 ó¾   € VP                  4        UUu/ uF;  w  r4V P                  V4      f   K  V\        V! \        W,          4      4      4      bK=  	  upp# u uppi r   )r•   r_   r-   rˆ   )r>  r?  ÚscaleÚtargetrY   s   &&&  r   Ú
_per_tokenÚ$_extract_pricing.<locals>._per_tokenY  sJ   € àJPÏ,É,Ì.ÔxÉ.¹;¸6Ð\b×\fÑ\fÐgjÓ\kÔ6�œ™E¤%¨­Ó"4Ó5Ó6Ò6É.ÒxÐxùÓxs
   ”A°%AÚpromptÚinput_token_price_per_mÚ
completionÚoutput_token_price_per_mc              3   óJ   <"  € T F  pSP                  V4      R Jx € K  	  R # 5ir   r  r  s   & €r   r&   Ú#_extract_pricing.<locals>.<genexpr>]  s    øé € Ð
FÑ/E¨!ˆ7�;‰;�q‹> Õ%Ó/Eùs   ƒ #TFc                 ó"   € V R ,          R,          # )i'  rÔ   r   ©r˜   s   &r   rq  Ú"_extract_pricing.<locals>.<lambda>^  s   € ¸AÀ½JÈÖ<Rr   Úmetadatar-  NÚinput_tokensÚoutput_tokensÚ
cache_readÚcache_read_tokensc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir   r   )r#   r—   Údeepinfra_pricings   & €r   r&   rK  c  s   øé € Ð2mÑSlÈaÐ8IÖ3IÓSlùó   ƒc                 ó   € V R ,          # )rÔ   r   rM  s   &r   rq  rN  d  s   € ÈÈYÎr   ÚrequestÚcache_writer.  )rF  ÚinputÚinput_cost_per_tokenÚprompt_token_cost)rH  ÚoutputÚoutput_cost_per_tokenÚcompletion_token_cost)rX  Úrequest_cost)rR  Úcached_promptÚinput_cache_readÚcache_read_cost_per_token)rY  Úcache_creationÚinput_cache_writeÚcache_write_cost_per_token>   NrÍ   )
r  r  r_   rk   rx   r  r•   r-   r"   r:  )r  rD  Únovita_fieldsrO  Údeepinfra_fieldsÚ	alias_mapr  rY   r%   rE   r-  rC  r!   ÚaliasrU  s   f             @r   Ú_extract_pricingrk  X  s¼  ù€ õyð Ð8¸,ÐHbÐc€Mß
ƒsÔ
F¨}×/CÑ/CÔ/EÓ
F‡s‡s‚sÔ
F¨}×/CÑ/CÔ/EÓ
F×FÒFÙ˜' =Ñ2RÓSÐSà�{‰{˜:Ó&€HÜ3=¸hÌ×3MÒ3M˜Ÿ™ YÔ/ÐSWÐØ  .°,ÀÐQ]Ð_rÐsÐÜÐ#¤T×*Ò*¯s«sÔ2mÐSc×SjÑSjÔSlÓ2m¯s¯sªsÔ2mÐSc×SjÑSjÔSlÓ2m×/mÒ/mÙÐ+Ð-=Ñ?VÓWÐWàÐRØÐ`ØÐ.ØÐfØÐkð€Iô & gÖ.ˆØ@GÇÁÄÔPÁ±*°#”c˜#“h—n‘nÓ&¨Ò-Áˆ
ÑPØ"$ˆØ(Ÿ™Ö0‰OˆFÛ �ØÖ&¨:Õ+<ÀJÖ+NØ&0Õ&7�G‘OÚó !ñ  1÷
 ‰7Ü)¨'·>±>À&Ó3IÓJÒJñ /ð €Iùó Qs   Å"%G:c                ó¦   € V ^8„  d   QhR\         \        \         \        \        3,          3,          R\        R\         \        \        3,          RR/# )r)   rr   Úmodel_idrŠ   r+   Nr´   )r.   s   "r   r/   r/   y  sF   € ÷ ;ñ ;œd¤3¬¬S´#¨X­Ð#6Õ7ð ;Ä3ð ;ÌtÔTWÔY\ÐT\Í~ð ;Ðbfñ ;r   c                 ór   € W V&   R V9   d,   V P                  VP                  R ^4      ^,          V4       R# R# )r   N)Ú
setdefaultr6   )rr   rm  rŠ   s   &&&r   Ú_add_model_aliasesrp  y  s5   € Øˆ(�OØ
ˆh„Ø×Ñ˜Ÿ™¨¨QÓ/°Õ2°EÖ:ñ r   c                ót   € V ^8„  d   QhR\         R\        \        \        \        \        3,          3,          /# )r)   Úforce_refreshr+   )r]   rx   r-   r   )r.   s   "r   r/   r/     s,   € ÷ -ñ -¬ð -¼¼cÄ4ÌÌSÈÅ>Ð>QÕ9Rñ -r   c                ó$  € V '       g‹   \         '       d0   \        P                  ! 4       \        ,
          \        8  d   \         # \	        4       pVeB   V\        8  d7   \        4       pV'       d%   Vs \        P                  ! 4       V,
          s\         #  \        P                  ! \        R\        P                  ! 4       R7      pVP                  4        / pVP                  4       P                  R. 4       F¨  pVP                  RR4      pRVP                  RR4      RVP                  R	/ 4      P                  RR
4      RVP                  RV4      RVP                  R/ 4      /pVP                  RR4      pV'       d
   W†8w  d   Wh3MV3 F  p	\        WIV4       K  	  Kª  	  Vs \        P                  ! 4       s\        V4       \        P                  R\!        V4      4       V#   \"         d    p
\        P%                  RT
4       \         '       d   \         u Rp
?
# \        4       pT'       dU   Ts \	        4       pTe   \'        T\        4      M\        ^,
          p\        P                  ! 4       T,
          s\         u Rp
?
# / u Rp
?
# Rp
?
ii ; i)z9Fetch model metadata from OpenRouter (cached for 1 hour).N)rï  rñ  r‚   ÚidrÍ   r…  rÈ   Úmax_completion_tokensÚtop_provideré   r    r-  Úcanonical_slugz.Fetched metadata for %s models from OpenRouterz2Failed to fetch model metadata from OpenRouter: %s©é   é
   )Ú_model_metadata_cacherS   Ú_model_metadata_cache_timeÚ_MODEL_CACHE_TTLr²   r¶   r   r_   r   rö  Úraise_for_statusr   rp  r¹   rV   rW   rU  r9   rÑ   Úmin)rr  Údisk_ageÚ
disk_cacheÚresponserr   r*   rm  rŠ   Ú	canonicalrj  r™   Ústale_bys   &           r   Úfetch_model_metadatar†    s
  € ÷ ß Ó ¤d§i¢i£kÔ4NÕ&NÔRbÔ%bÜ(Ð(Ü9Ó;ˆØÒ HÔ/?Ô$?Ü8Ó:ˆJßØ(2Ð%Ü-1¯YªY«[¸8Õ-CÐ*Ü,Ð,ð ô '×*Ò*Ô+@È'ÔZm×Z|ÒZ|ÓZ~ÔˆØ×!Ñ!Ô#ØˆØ—]‘]“_×(Ñ(¨°Ö4ˆEØ—y‘y  rÓ*ˆHà  %§)¡)Ð,<¸fÓ"EØ'¨¯©°>À2Ó)F×)JÑ)JÐKbÐdhÓ)iØ˜Ÿ	™	 &¨(Ó3°YÀÇ	Á	È)ÐUWÓ@XðˆEð
 Ÿ	™	Ð"2°BÓ7ˆIß3<ÀÔAV˜8Ñ/Ð]eÐ\gÒg�Ü" 5°Ö7ó hñ 5ð !&ÐÜ%)§Y¢Y£[Ð"Ü'¨Ô.Ü�‰ÐEÄsÈ5ÃzÔRØˆøÜô Ü�‰ÐKÈQÔOß Ó Ü(Õ(Ü4Ó6ˆ
ßØ$.Ð!Ü=Ó?ˆHØ:BÒ:N”s˜8Ô%5Ô6ÔTdÐghÕThˆHÜ)-¯ª«°xÕ)?Ð&Ü(Õ(Ø�	ûðús8   ÂEG% Ç%JÇ0'J
ÈJÈA J
É=JÊJ
ÊJÊ
Jc          
      ó¢   € V ^8„  d   QhR\         \        \        3,          R\        R\        \        ,          R\         \        \        3,          /# )r)   r*   rm  r…  r+   r  )r.   s   "r   r/   r/   ¯  sJ   € ÷ añ a¤¤c¬3 h¥ð a¼3ð aÔPXÔY\ÕP]ð aÔbfÔgjÔloÐgoÕbpñ ar   c                óÆ   € RV3R\        V \        4      3R\        V 4      ;'       g    R33pRV P                  RV4      /V UUu/ uF  w  rEVf   K  WEbK  	  uppC# u uppi )zLCache entry for one ``/models`` item; optional keys are set only when known.r…  ru  r-  Nr    )r  Ú_MAX_COMPLETION_KEYSrk  r_   )r*   rm  r…  Úoptionalr—   r˜   s   &&&   r   Ú_endpoint_model_entryr‹  ¯  s’   € à! >Ð2Ð5LÔN`ÐafÔh|ÓN}Ð4~ð  BKô  M]ð  ^có  Md÷  Mlð  Mlð  hlð  Amð  n€HØ�E—I‘I˜f hÓ/Ð`ÁXÔ3_ÁX¹T¸QÐQR´D°A²DÁXÒ3_Ð`Ð`ùÓ3_s   ÁAÁAc                óh   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          /# r(   r  )r.   s   "r   r/   r/   µ  s&   € ÷ ñ ¤D¬¬c¨¥Nð ´xÄµ}ñ r   c                ó8  € V P                  R. 4      ;'       g    .  Fy  p\        V\        4      '       d   VP                  R/ 4      MRp\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       g   Kn  V^ 8”  g   Kw  Vu # 	  R# )zNContext of the first loaded LM Studio instance (the runtime value), else None.Úloaded_instancesÚconfigNr…  )r_   rk   rx   rj  )r*   ÚinstÚcfgr‰  s   &   r   Ú_lmstudio_loaded_contextr’  µ  s{   € à—	‘	Ð,¨bÓ1×7Ð7°RÒ7ˆÜ(2°4¼×(>Ò(>ˆd�h‰h�x Ô$ÀDˆÜ+5°c¼4×+@Ò+@ˆc�g‰gÐ&Ô'ÀdˆÜ�cœ3×Ô C¨!¦GØŠJñ	 8ñ
 r   c          
      ó¢   € V ^8„  d   QhR\         R\        \         \         3,          R\        \         \        \         \        3,          3,          /# )r)   rE   rð  r+   rÄ   )r.   s   "r   r/   r/   ¿  s@   € ÷ ñ ¬ð ´d¼3Ä¸8µnð ÌÌcÔSWÔX[Ô]`ÐX`ÕSaÐNaÕIbñ r   c                óz  € \         P                  ! \        V 4      P                  R4      R,           VR\         P                  ! V 4      R7      pVP                  4        / pVP                  4       P                  R. 4       F·  p\        V\        4      '       d+   VP                  R4      ;'       g    VP                  R4      MRpV'       g   KO  \        WE\        V4      4      p\        W5V4       VP                  R4      p\        V\        4      '       g   K™  V'       g   K£  Wu8w  g   K«  \        W7V4       K¹  	  V# )	uU   LM Studio ``/api/v1/models`` â†’ cache; context comes from the first loaded instance.r   rÞ  ©rð  rï  rñ  rÀ   rY   rt  Nry  )r   r_   rW  r  rö  r  r   rk   rx   r‹  r’  rp  r-   )rE   rð  rƒ  rr   r*   rm  rŠ   Úalt_ids   &&      r   Ú_lmstudio_native_modelsr—  ¿  s  € ä"×&Ò&Ô'<¸ZÓ'H×'OÑ'OÐPSÓ'TÐWgÕ'gÐqxð  CJô  Sf÷  Suò  Suð  v@ó  SAô  B€HØ×ÑÔØ')€EØ—‘“×$Ñ$ X¨rÖ2ˆÜ<FÀuÌd×<SÒ<S�E—I‘I˜eÓ$×7Ð7¨¯	©	°$«øÐY]ˆßÙÜ% eÔ7OÐPUÓ7VÓWˆÜ˜5¨EÔ2Ø—‘˜4“ˆÜ�fœc×"Ô"§v¡v°&Ö2DÜ˜u¨eÖ4ñ 3ð €Lr   c                ó¦   € V ^8„  d   QhR\         \        \         \        \        3,          3,          R\        R\         \        \        3,          RR/# )r)   rr   Úrequest_candidaterð  r+   Nr´   )r.   s   "r   r/   r/   Ð  sH   € ÷ :ñ :¤¤c¬4´´S°­>Ð&9Õ!:ð :Ìsð :Ô]aÔbeÔgjÐbjÕ]kð :Ðx|ñ :r   c                óx  aaa€ VP                  R4      P                  RR4      oRVVV3R llpR R lpV! 4       pVP                  '       gM   VP                  4       pV! V4      VP	                  RR4      r˜V'       d   V	'       d   W�9   d   W€V	,          R	&   R# \
        P                  ! SR
,           S^SR7      p
V
P                  '       d   R# V
P                  4       ;'       g    / P	                  R. 4      R,           F¶  p\        V\        4      '       d   VP	                  R4      MRpV'       d6   WÀ9  g0   VP	                  R4      ;'       g    / P	                  R4      R9  d   Kk  V! RVRR/4      pVP                  '       g   V! VP                  4       4      MRpV'       g   K«  WàV,          R	&   K¸  	  R# )u  Overwrite ``context_length`` with llama.cpp's allocated ``n_ctx`` from /props (``/v1/props``, then
``/props`` for older builds). In router mode the bare endpoint 400s, so each LOADED child is read
via ``/props?model=``; unloaded children are skipped â€” probing could autoload them.r   rS  rÍ   Nc                 ó´   <€ \         P                  ! SR ,           V S^SR7      pVP                  '       d#   \         P                  ! SR,           V S^SR7      pV# )ræ  )Úparamsrð  rï  rñ  rç  )r   r_   Úis_error)rœ  ÚresprL  rð  rñ  s   & €€€r   Ú_propsÚ%_apply_llamacpp_props.<locals>._propsÕ  sP   ø€ Ü"×&Ò& t¨kÕ'9À&ÐRYÐcdÐmsÔtˆØ�=�=ˆ=Ü&×*Ò*¨4°(­?À6ÐSZÐdeÐntÔuˆDØˆr   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# )r)   Úpropsr+   r´   )r.   s   "r   r/   Ú+_apply_llamacpp_props.<locals>.__annotate__Ú  s&   € ÷ Mñ M”dœ3¤˜8•nð M¬ñ Mr   c                 óV   € V P                  R 4      ;'       g    / P                  R4      # )ré  Ún_ctxr  )r¢  s   &r   Ú_n_ctxÚ%_apply_llamacpp_props.<locals>._n_ctxÚ  s%   € Ø—	‘	Ð7Ó8×>Ð>¸B×CÑCÀGÓLÐLr   Úmodel_aliasr…  ú/modelsr•  r‚   ºNé   Nrt  Ústatusr%   r*   ÚautoloadÚfalser   )ÚloadedÚready)r  r  r�  r   r_   r   rk   rx   )rr   r™  rð  rñ  rŸ  r¦  Ú
props_respr¢  r¥  r¨  ÚnativeÚchildÚchild_idÚprÚ	child_ctxrL  s   &&ff           @r   Ú_apply_llamacpp_propsr·  Ð  sb  ú€ ð ×#Ñ# CÓ(×0Ñ0°¸Ó;€D÷ñ õ
Má“€JØ××ÐØ—‘Ó!ˆÙ# E›]¨E¯I©I°mÀRÓ,Hˆ{ß—[ [Ô%9Ø38�+ÕÐ/Ñ0ÙÜ ×$Ò$ T¨IÕ%5¸wÐPQÐZ`Ôa€FØ‡‡€ÙØ—+‘+“-×%Ð% 2×*Ñ*¨6°2Ó6°s×;Ð;ˆÜ&0°¼×&=Ò&=�5—9‘9˜T”?À4ˆß˜8Ô0°U·Y±Y¸xÓ5H×5NÐ5NÈB×4SÑ4SÐT[Ó4\ÐdwÔ4wÙÙ�W˜h¨
°GÐ<Ó=ˆØ-/¯[¯[¨[‘F˜2Ÿ7™7›9Ô%¸dˆ	ß‰9Ø09�(�OÐ,Ó-ó <r   c                ó^   € V ^8„  d   QhR\         R\        R\        \         \         3,          /# )r)   rE   r!  r+   )r-   r"  rk  )r.   s   "r   r/   r/   ð  s.   € ÷ eñ e¤3ð e´ð e¼EÄ#ÄsÀ(½Oñ er   c                 óh   € ^ RI Hp T \        V\        4      '       d   V! V4      ;'       g    R3# R3# )ro   )Úfingerprint_secret_valuerÍ   )Úagent.credential_persistencerº  rk   r-   )rE   r!  rº  s   && r   Ú_endpoint_memo_keyr¼  ð  s4   € ÝEàÄJÈwÔX[×D\ÒD\Ñ0°Ó9×?Ð?¸RÐdÐdÐbdÐdÐdr   c          
      óæ   € V ^8„  d   QhR\         \        \        3,          R\        \        \        \        \        3,          3,          R\        \        \        \        \        3,          3,          /# )r)   Úmemo_keyrr   r+   )rk  r-   rx   r   )r.   s   "r   r/   r/   ö  sU   € ÷ ñ ¬¬c´3¨h­ð ÄÄSÌ$ÌsÔTWÈxÍ.ÐEXÕ@Yð Ô^bÔcfÔhlÔmpÔruÐmuÕhvÐcvÕ^wñ r   c                 óP   € V\         V &   \        P                  ! 4       \        V &   V# r   )Ú_endpoint_model_metadata_cacherS   Ú#_endpoint_model_metadata_cache_time)r¾  rr   s   &&r   Ú_remember_endpoint_modelsrÂ  ö  s#   € Ø/4Ô" 8Ñ,Ü48·I²I³KÔ'¨Ñ1Ø€Lr   c                ó–   € V ^8„  d   QhR\         \        \        3,          R\         \        \         \        \        3,          3,          /# r  r´   )r.   s   "r   r/   r/   ü  s4   € ÷ ñ ¤4¬¬S¨¥>ð ´d¼3ÄÄSÌ#ÀXÅÐ;NÕ6Oñ r   c                 óê   € / pV P                  R . 4       FZ  p\        V\        4      '       d   VP                  R4      MRpV'       g   K6  \        W\	        W#\        V\        4      4      4       K\  	  V# )r‚   rt  N)r_   rk   rx   rp  r‹  r  r   )r  rr   r*   rm  s   &   r   Ú_parse_models_payloadrÅ  ü  sm   € Ø')€EØ—‘˜V RÖ(ˆÜ&0°¼×&=Ò&=�5—9‘9˜T”?À4ˆß‰8Ü˜uÔ0EÀeÔWiÐjoô  rFó  XGó  1Hö  Iñ )ð €Lr   c                óŒ   € V ^8„  d   QhR\         R\         R\        R\        \         \        \         \        3,          3,          /# )r)   rA   r!  rr  r+   )r-   r]   rx   r   )r.   s   "r   r/   r/     sB   € ÷ 83ñ 83¬Cð 83¼#ð 83ÔSWð 83ÔdhÔilÔnrÔsvÔx{Ðs{Õn|Ði|Õd}ñ 83r   c           	     óR  € \        V 4      pV'       d   \        VR4      '       d   / # \        V4      p\        W14      pV'       gy   \        P                  V4      pVe<   \        P                  ! 4       \        P                  V^ 4      ,
          \        8  d   V# V'       g   \        V4      MRpVe   \        WW4      # \        V4      '       d   / # VP                  R4      '       d   VRR P                  R4      MVR,           pV.Wƒ8w  d   V.M. ,           p	\        V4      p
\        P                   ! V4      pRpV'       d)    \#        W1R7      R8X  d   \        V\%        W:4      4      #  V	 EF™  p\        V4      '       d    EM†\+        V4      pVP                  R4      R,           p \        P,                  ! VV
RVR7      ;_uu_ 4       pVP.                  R9   d.   \0        P3                  R	VP.                  V4        RRR4        EMVP5                  4        VP7                  4        VP9                  4       pRRR4       \;        X4      p\<        ;QJ d,    R
 VP                  R. 4       4       F  '       g   K   RM!	  RM! R
 VP                  R. 4       4       4      '       d9   \>        P@                  ! \&        4      ;_uu_ 4        \C        VWúV4       RRR4       V'       d   V'       g   \E        VV4       \        VV4      u # 	  V'       d   \0        P3                  RW<4       \        V/ 4      #   \&         d   pTp\)        YÓ4        Rp?ELèRp?ii ; i  + '       g   i     EL*; i  + '       g   i     L ; i  \&         d   pTp\)        YÓ4        Rp?EK4  Rp?ii ; i)zTModel metadata from an OpenAI-compatible ``/models`` endpoint (cached per base URL).r,  NrS  r   r¹  rÝ  r©  r•  zIModel metadata probe received HTTP %s from %s; stopping candidate probingc              3   óz   "  € T F1  p\        V\        4      '       g   K  VP                  R 4      R8H  x € K3  	  R# 5i)Úowned_byrå  N©rk   rx   r_   )r#   Úms   & r   r&   Ú0fetch_endpoint_model_metadata.<locals>.<genexpr>2  s/   é € ÐkÑ<S°qÔWaÐbcÔei×WjÔ2�1—5‘5˜Ó$¨
Ö2Ó<Sùs   ‚;Ÿ;r‚   TFz1Failed to fetch model metadata from %s/models: %séýÿÿÿry  )i‘  i“  )#rD   r   rÔ  r¼  rÀ  r_   rS   rÁ  rÁ   rÂ   rÂ  ra   rT  r  r)  r   rö  rÿ  r—  r9   rg   rZ  Ústreamr÷  rV   rW   r  Úreadr   rÅ  r  r¨  r©  r·  rÆ   )rA   r!  rr  rE   Úlocalr¾  r¿  ÚmemoÚ	alternateÚ
candidatesrð  rñ  Ú
last_errorrc   Ú	candidater™  rÖ  rƒ  r  rr   s   &&&                 r   Úfetch_endpoint_model_metadatarÖ    s   € ä$ XÓ.€JßÔ.¨z¸?×KÒKØˆ	Ü˜jÓ)€EÜ! *Ó6€HßÜ/×3Ñ3°HÓ=ˆØÒ¤4§9¢9£;Ô1T×1XÑ1XÐYaÐcdÓ1eÕ#eô  jCô  #CØˆMß;@Ô'¨
Ô3ÀdˆØÒÜ,¨XÓ<Ð<ä˜J×'Ò'Øˆ	Ø/9×/BÑ/BÀ5×/IÒ/I�
˜3˜B�×&Ñ& sÔ+ÈzÐ\aÕOa€IØ�°	Ô0G )¡ÈRÕP€JÜ˜GÓ$€GÜ ×/Ò/°
Ó;€FØ&*€Jßð	6Ü'¨
ÔDÈÔSÜ0°Ô;RÐS]Ó;gÓhÐhð Tô
  ˆ	ä 
×+Ò+Úä.¨yÓ9ÐØ×&Ñ& sÓ+¨iÕ7ˆð	6Ü$×+Ò+¨C¸È'ÐZ`×aÕaÐemØ×'Ñ'¨:Ô5Ü—L‘LÐ!lÐnv÷  oCñ  oCð  EHô  IØ÷ bÒað ×)Ñ)Ô+Ø—‘”Ø"Ÿ-™-›/�÷ bô *¨'Ó2ˆEß‹sÑk¸G¿K¹KÈÐPRÔ<SÓk�s�sŠsÑk¸G¿K¹KÈÐPRÔ<SÓk×kÒkÜ×(Ò(¬×3Õ3Ü)¨%Ð1BÈVÔT÷ 4çŸUÜ(¨°UÔ;Ü,¨X°uÓ=Ò=ñ+  ÷2 Ü�‰ÐHÈ*ÔaÜ$ X¨rÓ2Ð2øô= ô 	6ØˆJÜ$ S×5Ò5ûð	6ú÷ b×aÐaú÷ 4×3ûô
 ô 	6ØˆJÜ$ S×5Ó5ûð	6ús„   Å%L5 Æ)"NÇ4MÇ?NÈ
0MÈ:?NÉ<*NÊ'"NË	M/ËNË'NË/NÌ5MÍ MÍMÍM,Í&	NÍ/M?Í:NÎN&ÎN!Î!N&c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# ©r)   r*   rA   r!  r+   r�  )r.   s   "r   r/   r/   @  s5   € ÷ 	Gñ 	G¬Cð 	G¼3ð 	GÌð 	GÔV^Ô_bÕVcñ 	Gr   c                ó†  a € \        WR7      pVP                  S 4      pV'       g4   \        V4      ^8X  d$   \        \	        VP                  4       4      4      pM4V'       g-   S '       d%   \        V 3R lVP                  4        4       R4      pV'       d   VP                  R4      MRp\        V\        4      '       d   V# R# )zDResolve context length from an endpoint's live ``/models`` metadata.r¹  c              3   óL   <"  € T F  w  rSV9   g
   VS9   g   K  Vx € K  	  R # 5ir   r   )r#   rY   rŠ   r*   s   &  €r   r&   Ú3_resolve_endpoint_context_length.<locals>.<genexpr>G  s'   øé € ÐjÑ0I¡* #ÈUÐVYÌ\Ð]`ÐdiÑ]iŸšÓ0Iùs   ƒ$š
$Nr…  )	rÖ  r_   rU  r˜  Úiterr  r•   rk   rj  )r*   rA   r!  Úendpoint_metadataÚmatchedr…  s   f&&   r   Ú _resolve_endpoint_context_lengthrß  @  s“   ø€ ä5°hÔPÐØ×#Ñ# EÓ*€Gß”sÐ,Ó-°Ô2Ü”tÐ-×4Ñ4Ó6Ó7Ó8‰ßŸÜÔjÐ0A×0GÑ0GÔ0IÓjÐlpÓqˆß6=�W—[‘[Ð!1Ô2À4€NÜ'¨¼×<Ò<ˆ>ÐFÀ$ÐFr   c                ó$   € V ^8„  d   QhR\         /# rœ   r   )r.   s   "r   r/   r/   L  s   € ÷ ;ñ ;¤ñ ;r   c                 ó*   € ^ RI Hp  V ! 4       R,          # )z1Path to the persistent context length cache file.rp   zcontext_length_cache.yamlrs   rp   s    r   Ú_get_context_cache_pathrâ  L  s   € å0ÙÓÐ:Õ:Ð:r   c                ó$   € V ^8„  d   QhR\         /# rœ   )rx   )r.   s   "r   r/   r/   R  s   € ÷ ñ ¤dñ r   c                 ó   € \        4       p V P                  4       '       g   / #  \        V RR7      ;_uu_ 4       p\        P                  ! V4      p\        V\        4      '       g   / uuRRR4       # R F.  p\        VP                  V4      \        4      '       d   K*  / W#&   K0  	  VuuRRR4       #   + '       g   i     M; iXP                  R4      ;'       g    / #   \         d#   p\        P                  RT4       / u Rp?# Rp?ii ; i)zGRead scalar lengths and their provenance from the same atomic document.r{   r|   NÚcontext_lengthsz'Failed to load context length cache: %s)rå  Úbedrock_confirmed_v1)râ  Úexistsr~   ÚyamlÚ	safe_loadrk   rx   r_   r9   rV   rW   )rw   r�   r‚   Úsectionr™   s        r   Ú_load_context_cache_documentrë  R  sÑ   € ä"Ó$€DØ�;‰;�=Š=Øˆ	ðÜ�$ ×-Õ-°Ü—>’> !Ó$ˆDÜ˜d¤D×)Ò)Ø÷ .Ò-ó G�Ü! $§(¡(¨7Ó"3´T×:Ô:Ø$&�D“Mñ Gð ÷ .×-×-Ò-úð �x‰xÐ)Ó*×0Ð0¨bÐ0øÜô Ü�‰Ð>ÀÔBØ�	ûðúsL   ¤C  ¹.B2Á'
C  Á2'B2Â	B2Â'
C  Â2C	Â=C  ÃC  Ã DÃ+DÄDÄDc                óF   € V ^8„  d   QhR\         \        \        3,          /# rœ   )rx   r-   rj  )r.   s   "r   r/   r/   f  s   € ÷ Gñ GœT¤#¤s (�^ñ Gr   c                 óH   € \        4       P                  R4      ;'       g    / # )z;Load scalar lengths, preserving the legacy reader contract.rå  )rë  r_   r   r   r   Ú_load_context_cacherî  f  s   € ä'Ó)×-Ñ-Ð.?Ó@×FÐFÀBÐFr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# rŒ  r,   )r.   s   "r   r/   r/   k  s!   € ÷ 5ñ 5œcð 5¬Sð 5´Sñ 5r   c                óB   € T  RT;'       g    RP                  R4       2# )zdCanonical ``model@base_url`` key; trailing slashes stripped so ``/v1`` and ``/v1/`` share one entry.Ú@rÍ   r   )r  )r*   rA   s   &&r   Ú_context_cache_keyrò  k  s%   € àˆW�A�x—~�~ 2×-Ñ-¨cÓ2Ð3Ð4Ð4r   r>  c          
      óL   € V ^8„  d   QhR\         R\         R\        R\         RR/# )r)   r*   rA   r²  r>  r+   Nr­  )r.   s   "r   r/   r/   q  s7   € ÷ Cñ Cœsð C¬cð C¼3ð CÌ3ð CÐX\ñ Cr   c               ó„  € V^ 8:  d   \         P                  RV  RV 2V4       R# \        W4      p\        4       pVP	                  R4      ;'       g    / pVP	                  R4      ;'       g    / p\        V\        4      '       d   TM/ pVP                  4       pW@ RV 2V R23 F  p	VP                  V	R4       K  	  VR8X  d   W'V&   VP	                  V4      V8X  d	   Wx8X  d   R# W&V&    \        Wg4       \         P                  RWBR	 4       R#   \         d"   p
\         P                  R
T
4        Rp
?
R# Rp
?
ii ; i)zqPersist a discovered context length under ``model@base_url`` (same model, different providers, different limits).z=Refusing to cache non-positive context length %s -> %s tokensrñ  Nrå  ræ  r   úbedrock-confirmed-v1z%Cached context length %s -> %s tokensr”   z'Failed to save context length cache: %s)rV   rÑ   rò  rë  r_   rk   rx   ÚcopyÚpopr   rÁ  r9   rW   )r*   rA   r²  r>  rY   Údocumentrr   Ú	confirmedÚold_confirmedrj  r™   s   &&&$       r   r¯  r¯  p  s3  € ð �„{Ü�‰ÐVÐ[`ÐZaÐabÐckÐblÐXmÐouÔvÙÜ
˜UÓ
-€CÜ+Ó-€HØ�L‰LÐ*Ó+×1Ð1¨r€EØ—‘Ð3Ó4×:Ð:¸€IÜ'¨	´4×8Ò8‘	¸b€IØ—N‘NÓ$€Mð ˜  ( Ð,°°°Q¨iÓ8ˆØ�‰�e˜TÖ"ñ 9àÐ'Ô'Ø�#‰Ø‡y�y�ƒ~˜Ô IÔ$>ÙØˆ#�JðCÜ˜UÔ.Ü�‰Ð;¸SÈAÀJÖPøÜô CÜ�‰Ð>À×BÒBûðCús   Ã.#D ÄD?ÄD:Ä:D?c          
      óL   € V ^8„  d   QhR\         R\         R\        R\         RR/# )r)   r*   rA   r²  rG  r+   Nr­  )r.   s   "r   r/   r/   �  s1   € ÷ 5ñ 5¬ð 5´sð 5ÄCð 5ÔSVð 5Ð`dñ 5r   c                ót   € \        W4      '       d   \        Y;'       g    RVRR7       R# \        WV4       R# )zUPersist a provider-confirmed window, distinguishing it from legacy Bedrock fallbacks.ú
bedrock://rõ  )r>  N)Ú_is_bedrock_contextr¯  )r*   rA   r²  rG  s   &&&&r   Úsave_provider_context_lengthrÿ  �  s,   € ä˜8×.Ò.Ü˜E×#;Ð#;¨|¸VÐLb×cä˜E¨VÖ4r   Úbedrock_confirmedc          	      ó^   € V ^8„  d   QhR\         R\         R\        R\        \        ,          /# )r)   r*   rA   r   r+   )r-   r]   r   rj  )r.   s   "r   r/   r/   •  s/   € ÷ ñ ¤Sð ´Cð Ìtð Ô`hÔilÕ`mñ r   c               óÞ  a	€ \        W4      p\        4       pVP                  R4      ;'       g    / o	\        S	\        4      '       g   R# \        V	3R lW0 RV 2V R23 4       R4      pS	P                  V4      p\        V4      \        Jd   R# V'       dV   VP                  R4      p\        V\        4      '       d   VP                  V4      MRp\        V4      \        Jg   W†8w  d   R# V# )zBLook up a previously discovered context length for model+provider.rå  Nc              3   óR   <"  € T F  pSP                  V4      f   K  Vx € K  	  R # 5ir   r  )r#   r—   rr   s   & €r   r&   Ú,get_cached_context_length.<locals>.<genexpr>�  s    øé € ÐgÑ#J˜aÈeÏiÉiÐXYËlŸšÓ#Jùs   ƒ'�
'rñ  r   ræ  )rò  rë  r_   rk   rx   r˜  Útyperj  )
r*   rA   r   rY   rø  Úmatched_keyr²  rù  Úmarkerrr   s
   &&$      @r   Úget_cached_context_lengthr  •  sÊ   ø€ ä
˜UÓ
-€CÜ+Ó-€HØ�L‰LÐ*Ó+×1Ð1¨r€EÜ�eœT×"Ò"ÙäÔg C¨7°!°H°:Ð)>À3À%ÀqÀ	Ñ#JÓgÐimÓn€KØ�Y‰Y�{Ó#€FÜˆFƒ|œ3ÓÙßØ—L‘LÐ!7Ó8ˆ	Ü/9¸)ÄT×/JÒ/J�—‘˜{Ô+ÐPTˆÜ�‹<œsÓ" fÔ&6ÙØ€Mr   c                ó4   € V ^8„  d   QhR\         R\         RR/# rË   r,   )r.   s   "r   r/   r/   ©  s&   € ÷ Jñ J¬Sð J¼Cð JÀDñ Jr   c                óª  € ^ RI Hp \        W4      p\        V 4      T;'       g    RP	                  R4      rT\
        P                  WE3R4       \
        P                  RWE3R4       ^ RIHp \        \        4       FA  pVR,          V! 4       V38X  g   K  V^,          W39   g   K+  \        P                  VR4       KC  	  V! W0 RV 2V R20V4       R# )	a5  Drop a stale entry and its probe cooldown using the persisted cache URL.

Bedrock callers without a runtime endpoint must pass ``bedrock://``, as
the resolver does; a blank URL addresses the distinct generic cache key.
In-process caches are dropped unconditionally; only the file update takes the cache lock.
)Údrop_context_cache_rowsrÍ   r   NÚollama_show©Úhermes_home_key:Nr)   Nrñ  )Úagent.model_metadata_cacher  rò  r?   r  Ú_LOCAL_CTX_PROBE_CACHEr÷  rt   r  r¤  Ú_BEDROCK_PROBE_FAILURE_CACHE)r*   rA   r  rY   ÚbareÚstrippedr  r¾  s   &&      r   rÂ  rÂ  ©  s¿   € õ CÜ
˜UÓ
-€Cä+¨EÓ2°X·^°^À×4KÑ4KÈCÓ4Pˆ(Ü×Ñ Ð/°Ô6Ü×Ñ ¨tÐ>ÀÔEõ 1ÜÔ5Ö6ˆØ�B�<™OÓ-¨xÐ8Ö8¸XÀa½[ÈUÈMÖ=YÜ(×,Ñ,¨X°tÖ<ñ 7ñ ˜S G¨1¨X¨JÐ"7¸C¸5À¸ÐCÀSÖIr   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r)   Úcurrent_lengthr+   )rj  r   )r.   s   "r   r/   r/   À  s"   € ÷ Wñ W¬ð W´¼µñ Wr   c                ó8   a € \        V 3R l\         4       R4      # )z5Next lower probe tier, or None if already at minimum.c              3   ó8   <"  € T F  qS8  g   K  Vx € K  	  R # 5ir   r   )r#   Útierr  s   & €r   r&   Ú&get_next_probe_tier.<locals>.<genexpr>Â  s   øé € ÐOÑ"5˜$ÀÑ9N—’Ó"5ùs   ƒ�
N)r˜  ÚCONTEXT_PROBE_TIERS)r  s   fr   Úget_next_probe_tierr  À  s   ø€ äÔOÕ"5ÓOÐQUÓVÐVr   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r)   Ú	error_msgr+   r�  )r.   s   "r   r/   r/   Å  s   € ÷ ñ ¬cð ´h¼sµmñ r   c                ó  a€ V P                  4       oRS9   g   RS9   g   RS9   d
   RS9  d   R# R	p\        RV3R lV 4       4       F4  p\        VP                  ^4      4      pRTu;8:  d   R8:  g   K.   Vu #  K6  	  R# )
a  Context limit quoted in a provider error ("maximum context length is 32768 tokens"), if any.

A message about only an OUTPUT cap ("... model output limit of 16384") never says "context";
bail out so the generic "limit ... of N" pattern can't cache the output cap as the window.úoutput limitúoutput tokenszoutput tokenÚcontextNc              3   óR   <"  € T F  p\         P                  ! VS4      x € K  	  R # 5ir   )r  re  )r#   ÚpatternÚerror_lowers   & €r   r&   Ú1parse_context_limit_from_error.<locals>.<genexpr>Ù  s   øé € ÐWÉhÀ7œrŸyšy¨°+×>Ð>Ëhùs   ƒ$'é   é€–˜ )z+max_model_len\s*(?:is\s*)?[:=(]?\s*(\d{4,})z2maximum model length\s*(?:is\s*)?[:=(]?\s*(\d{4,})zY(?:max(?:imum)?|limit)\s*(?:context\s*)?(?:length|size|window)?\s*(?:is|of|:)?\s*(\d{4,})z:context\s*(?:length|size|window)\s*(?:is|of|:)?\s*(\d{4,})z)(\d{4,})\s*(?:token)?\s*(?:context|limit)z">\s*(\d{4,})\s*(?:max|limit|token)z(\d{4,})\s*(?:max(?:imum)?)\bz*supports?\s+(?:only\s+)?up\s+to\s+(\d{4,}))r"   Úfilterrj  Úgroup)r  Úpatternsr;   Úlimitr%  s   &   @r   Úparse_context_limit_from_errorr-  Å  s‹   ø€ ð
 —/‘/Ó#€KØ˜+Ô%¨¸KÔ)GÈ>Ð]hÔKhÐnwð  @Kô  oKÙð€Hô ˜ÔWÉhÓWÖXˆÜ�E—K‘K “NÓ#ˆØ�5Ö&˜J×&ØŠLò 'ñ Yñ r   c                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# )r)   r  Úcurrent_context_lengthr+   ©r-   rj  r   )r.   s   "r   r/   r/   à  s.   € ÷ hñ h´cð hÔSVð hÔ[cÔdgÕ[hñ hr   c                ó4   € \        V 4      pVe	   W!8  d   V# R# )zÿProvider-reported limit LOWER than the current window, else None. Overflow recovery must
not invent a window: when the provider only says the input is too long, callers keep the
configured length and compress rather than stepping down guessed probe tiers.N)r-  )r  r/  Úparsed_limits   && r   Ú&get_context_length_from_provider_errorr3  à  s$   € ô 2°)Ó<€LØ'Ò3¸Ô8]ˆ<ÐgÐcgÐgr   z}\((\d+)\s+(?:tokens\s+)?in (?:the messages|your prompt|the prompt)\s*[;,]\s*(\d+)\s+(?:tokens\s+)?(?:in|for) the completion\)c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r)   r%  r+   r�  )r.   s   "r   r/   r/   ñ  s   € ÷ 1ñ 1¬#ð 1´(¼3µ-ñ 1r   c                ó  € \         P                  V 4      p\        P                  ! RV 4      pV'       d	   V'       g   R# \        VP	                  ^4      4      \        VP	                  ^4      4      ,
          pV^8¼  d   V# R# )z³window - measured prompt from the OpenAI-style parenthetical split, or None when the wording
is absent or the prompt alone fills the window (a genuine input overflow -> compress).úmaximum context length is (\d+)N)Ú_COMPLETION_SPLIT_REre  r  rj  r*  )r%  r6   r‰  Ú	availables   &   r   Ú_completion_split_budgetr:  ñ  sb   € ô !×'Ñ'¨Ó4€EÜ
�)Š)Ð6¸Ó
D€CßŸÙÜ�C—I‘I˜a“LÓ!¤C¨¯©°A«Ó$7Õ7€IØ! Qœˆ9Ð0¨DÐ0r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# r  r�  )r.   s   "r   r/   r/   ü  s"   € ÷ Bñ B¼ð BÄÌÅñ Br   c                ó¸  € V P                  4       p\        V\        4      '       g   R# R	 F^  p\        P                  ! W!4      pV'       g   K#  \        VP                  ^4      4      ^8¼  g   KD  \        VP                  ^4      4      u # 	  \        P                  ! RV4      p\        P                  ! RV4      pV'       dj   V'       db   \        VP                  ^4      4      \        VP                  ^4      4      ,
          \        VP                  ^4      4      ,
          pV^8¼  d   V# \        V4      pVe   V# \        P                  ! RV4      p\        P                  ! RV4      p	V'       dY   V	'       dQ   \        VP                  ^4      4      \        V	P                  ^4      4      ^,           ^,          ,
          pV^8¼  d   V# \        V4      p
V
'       d4   V
^ ,          V
^,          ,
          ^8¼  d   V
^ ,          V
^,          ,
          # \        P                  ! RV4      pV'       d«   V'       d£   \        VP                  ^4      4      \        VP                  ^4      4      ,
          p\        P                  ! RV4      pRV9   dC   V'       d;   \        VP                  ^4      4      pWm^,
          8¼  d   \        ^V^,          4      # V^8¼  d   V# R# )
zõAvailable OUTPUT tokens from a "max_tokens too large" error, or None. Distinct from "prompt
too long" (-> compress): here input + requested_output > window, so the fix is a smaller
max_tokens for this call and context_length must NOT be touched.Nr7  zK\((\d+)\s+of text input,\s*(\d+)\s+of tool input,\s*(\d+)\s+in the output\)z'maximum context length is (\d+)\s*tokenz!prompt contains (\d+)\s*characterz2prompt contains (?:at least )?(\d+)\s*input tokenszrequested (\d+)\s*output tokenszat least)	z?exceeds model(?:\'s)? maximum output tokens\s*\(?\s*(\d+)\s*\)?z\max_tokens\s*:\s*\d+\s*>\s*(\d+)\s*,?\s*which is the maximum allowed number of output tokensz9range of max_tokens should be\s*\[\s*\d+\s*,\s*(\d+)\s*\]zavailable_tokens[:\s]+(\d+)zavailable\s+tokens[:\s]+(\d+)zoutput limit (?:of|is)\s*(\d+)z3supports at most\s+(\d+)\s*(?:completion\s+)?tokensz:(?:max_tokens|max_completion_tokens) is limited to\s*(\d+)z=\s*(\d+)\s*$)
r"   Ú_any_phrase_groupÚ_PARSEABLE_OUTPUT_CAP_SIGNALSr  re  rj  r*  r:  Ú_sglang_window_and_inputÚmax)r  r%  r$  r;   Ú_m_ctxÚ_m_partsÚ
_availableÚ_split_availableÚ
_m_ctx_tokÚ_m_charsÚ	_m_sglangÚ_m_vllm_inputÚ_m_requested_outÚ_requested_outs   &             r   Ú(parse_available_output_tokens_from_errorrK  ü  s0  € ð —/‘/Ó#€KÜ˜[Ô*G×HÒHÙó
ˆô —	’	˜'Ó/ˆß‰5”S˜Ÿ™ Q›Ó(¨AÖ-Ü�u—{‘{ 1“~Ó&Ò&ñ!ô$ �YŠYÐ9¸;ÓG€FÜ�yŠyÐgÐitÓu€Hß—(Ü˜Ÿ™ a›Ó)¬C°·±¸qÓ0AÓ,BÕBÄSÈÏÉÐXYÓIZÓE[Õ[ˆ
Ø˜Œ?ØÐÜ/°Ó<ÐØÒ#ØÐä—’ÐEÀ{ÓS€JÜ�yŠyÐ=¸{ÓK€Hß—hÜ˜×)Ñ)¨!Ó,Ó-´°X·^±^ÀAÓ5FÓ1GÈ!Õ1KÐPQÕ0QÕQˆ
Ø˜Œ?ØÐô )¨Ó5€Iß�Y˜q•\ I¨a¥LÕ0°AÔ5Ø˜�|˜i¨�lÕ*Ð*ô
 —I’IÐSÐU`Óa€Mß—mÜ˜×)Ñ)¨!Ó,Ó-´°M×4GÑ4GÈÓ4JÓ0KÕKˆ
ÜŸ9š9Ð%GÈÓUÐØ˜Ô$×)9Ü Ð!1×!7Ñ!7¸Ó!:Ó;ˆNØ¨aÕ/Ô/ä˜1˜n°Õ1Ó2Ð2Ø˜Œ?ØÐÙr   c                óh   € V ^8„  d   QhR\         R\        \        \        \        3,          ,          /# r5  )r-   r   rk  rj  )r.   s   "r   r/   r/   `  s+   € ÷ Uñ U¬#ð U´(¼5ÄÄcÀ½?Õ2Kñ Ur   c                óê   € \         P                  ! RV 4      p\         P                  ! RV 4      pV'       d=   V'       d5   \        VP                  ^4      4      \        VP                  ^4      4      3# R# )z]``(window, input_tokens)`` from SGLang's wording, else None; both figures are explicit there.z'maximum context length of (\d+)\s*tokenz&(\d+)\s*tokens from the input messagesN)r  re  rj  r*  )r%  rA  Ú_m_ins   &  r   r?  r?  `  sS   € ä�YŠYÐAÀ;ÓO€FÜ�IŠIÐ?ÀÓM€Eß:@ÇUŒC�—‘˜Q“Ó ¤# e§k¡k°!£nÓ"5Ð6ÐTÐPTÐTr   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r)   rê  Úgroupsr+   )r-   rk  r]   )r.   s   "r   r/   r/   g  s&   € ÷ Bñ BœCð B¬ð B´4ñ Br   c                 óx   a € \         ;QJ d    V 3R  lV 4       F  '       g   K   R# 	  R# ! V 3R  lV 4       4      # )c              3   ó˜   <"  € T F?  p\         ;QJ d    V3R  lV 4       F  '       d   K   RM	  RM! V3R  lV 4       4      x € KA  	  R# 5i)c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir   r   )r#   Úprê  s   & €r   r&   Ú._any_phrase_group.<locals>.<genexpr>.<genexpr>h  s   øé € Ð,¡e ˜–9£eùrV  FTN)Úall)r#   r*  rê  s   & €r   r&   Ú$_any_phrase_group.<locals>.<genexpr>h  s/   øé € ÐA¹&°�s‹sÔ,¡eÓ,�s�sŠsÔ,¡eÓ,×,Ð,»&ùs   ƒA
“A
ª A
TF©r  )rê  rP  s   f&r   r=  r=  g  s,   ø€ ß‹3ÔA¹&ÓA�3Œ3ÐAŠ3ÐAˆ3ÔA¹&ÓAÓAÐAr   c                ó0   € V ^8„  d   QhR\         R\        /# r  r\   )r.   s   "r   r/   r/   k  s   € ÷ ñ ¤3ð ¬4ñ r   c                óî  a€ V P                  4       o\        S4      e   R# \        S4      p\        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      ;'       dŠ    \	        S\
        4      ;'       dr    \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       * ;'       d#    T;'       d    V^,          V^ ,          8¬  '       * # )a$  Yes/no sibling of :func:`parse_available_output_tokens_from_error` for unparseable wordings. An
output-cap 400 misclassified as context overflow death-loops the compressor (same max_tokens, same
rejection). Signal: talks about max_tokens as a cap/range/limit and NOT about an oversized input.Tc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir   r   ©r#   rT  r%  s   & €r   r&   Ú&is_output_cap_error.<locals>.<genexpr>x  s   øé € ð  AÑ& �ÖÓ&ùrV  Fc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir   r   r\  s   & €r   r&   r]  z  s   øé € ÐFÑ.E¨˜Ö$Ó.EùrV  )r$  Úmax_output_tokensru  útokens for the completion)r"   r:  r?  r  r=  Ú_OUTPUT_CAP_SIGNALSÚ_INPUT_OVERFLOW_SIGNALS)r  rG  r%  s   & @r   Úis_output_cap_errorrc  k  sÊ   ø€ ð —/‘/Ó#€Kô   Ó,Ò8Ùô )¨Ó5€Iç‹ô  AÑ&ó  A��Šô  AÑ&ó  Aó  	A÷ 	=ð 	=Ü˜kÔ+>Ó?÷	=ð 	=ç“ÔFÕ.EÓF——’ÔFÕ.EÓFÓFÔF÷	=ð 	=ð ×;Ð;˜y¨�|¨y¸­|Ñ;Ô<ð	r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r)   Úcandidate_idÚlookup_modelr+   r\   )r.   s   "r   r/   r/     s&   € ÷ tñ t¤Cð t´sð t¼tñ tr   c                ól   € W8H  ;'       g*    RV 9   ;'       d    V P                  R^4      ^,          V8H  # )z`Exact match, or ``publisher/slug`` (LM Studio native ids) whose slug equals the configured name.r   )r  )re  rf  s   &&r   Ú_model_id_matchesrh    s;   € àÑ'×sÐs¨C°<Ñ,?×,rÐ,rÀL×DWÑDWÐX[Ð]^ÓD_Ð`aÕDbÐfrÑDrÐsr   Únote_blackholec                ó˜   € V ^8„  d   QhR\         R\         R\         R\        R\        R\        \        \         \
        3,          ,          /# )r)   r\  r!  Ú
bare_modelrï  ri  r+   )r-   rˆ   r]   r   rx   r   )r.   s   "r   r/   r/   „  sf   € ÷ 
ñ 
œSð 
¬3ð 
¼Cð 
Ì%ð 
Ôjnð 
ô  |Dô  EIô  JMô  ORð  JRõ  ESõ  |Tñ 
r   c               óŠ  € ^ RI p VP                  V\        V4      \        P                  ! V 4      R7      ;_uu_ 4       pVP                  V  R2RV/R7      pVP                  ^È8X  d   VP                  4       MRuuRRR4       #   + '       g   i     R# ; i  \         d   pT'       d   \        Y€4        Rp?R# Rp?ii ; i)z}Ollama ``/api/show`` JSON for ``bare_model``, or None on any failure (``note_blackhole``: connect timeouts condemn the host).Nrî  ú	/api/showr    rä  )
rj   rõ  r)  r   rö  Úpostr÷  r   r9   rg   )	r\  r!  rk  rï  ri  rj   rü  rž  rc   s	   &&&&$    r   Ú_ollama_showro  „  s°   € ãðØ�\‰\ '´=ÀÓ3IÔRe×RtÒRtÐuó  SAˆ\÷  Bô  Bð  FLØ—;‘; * ¨YÐ7¸vÀzÐ>R�;ÓSˆDØ"&×"2Ñ"2°cÔ"9�4—9‘9”;¸t÷ B÷  B÷  Bó  Bûô ô ßÜ$ SÔ5Ýûðús4   †9B ¿;BÁ:
B ÂB	ÂB ÂB ÂCÂ$B=Â=Cc                ó<   € V ^8„  d   QhR\         R\         R\        /# rÚ  r\   )r.   s   "r   r/   r/   ‘  s!   € ÷ ñ ¤ð ¬cð ´dñ r   c                 óF   €  \        WR 7      R8H  #   \         d     R# i ; i)r¹  râ  F)rÿ  r9   ©rA   r!  s   &&r   Ú_is_ollama_serverrs  ‘  s+   € ðô (¨ÔBÀhÑNÐNøÜô Úðús   ‚ ‘ Ÿ c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# rØ  r�  )r.   s   "r   r/   r/   š  s-   € ÷ ñ ¤ð ¬sð ¼Sð Ì(ÔSVÍ-ñ r   c                ó  € \        V 4      \        V4      rC\        W4      '       g   R# V RV 2p\        RV4      p\	        V\
        4      '       d
   V^ 8”  d   V# \        WBV4      pVe   \        VRR7      MRpVe   \        RWX4       V# )zbOllama ``/api/show`` context (Modelfile num_ctx, else GGUF max); the value to send as ``num_ctx``.Nr^  Úollama_num_ctxF©rx  )	r?   r]  rs  r¦   rk   rj  ro  rŠ  r©   )	r*   rA   r!  rk  r\  Ú	_disk_keyrù  r‚   r‰  s	   &&&      r   Úquery_ollama_num_ctxry  š  sŒ   € ä3°EÓ:¼LÈÓ<R�
Ü˜X×/Ò/ÙØ�,˜a 
˜|Ð,€IÜ$Ð%5°yÓA€HÜ�(œC× Ò  X°¤\ØˆÜ˜
¨ZÓ8€DØ:>Ò:JÔ
˜t°Õ
6ÐPT€CØ
‚ÜÐ.°	Ô?Ø€Jr   c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# rØ  )r-   r   r]   )r.   s   "r   r/   r/   ª  s/   € ÷ ñ ¬ð ´sð ÄSð ÔRZÔ[_ÕR`ñ r   c                ó$  € \        V 4      pV'       d   V'       d   \        W4      '       g   R# \        \        V4      W#4      pVf   R# VP	                  R4      p\        V\        4      '       d=   V'       d5   \        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # VP	                  R4      p\        V\        4      '       d=   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# R# )z¸True/False when Ollama ``/api/show`` reports vision support (``capabilities`` on 0.6.0+, else
``model_info.*.vision.block_count``); None when unreachable, not Ollama, or model unknown.NÚcapabilitiesc              3   óZ   "  € T F!  p\        V4      P                  4       R 8H  x € K#  	  R# 5i)ÚvisionN©r-   r"   )r#   Úcaps   & r   r&   Ú/query_ollama_supports_vision.<locals>.<genexpr>µ  s    é € Ð@¹4°C”3�s“8—>‘>Ó# xÖ/»4ùó   ‚)+TFr„  c              3   óZ   "  € T F!  pR \        V4      P                  4       9   x € K#  	  R# 5i)zvision.block_countNr  )r#   rY   s   & r   r&   r�  ·  s$   é € Ð+kÑ`jÐY\Ð,@ÄCÈÃHÇNÁNÓDTÖ,TÓ`jùr‚  )	r?   rs  ro  r]  r_   rk   r¤  r  rx   )r*   rA   r!  rk  r‚   Úcapsr„  s   &&&    r   Úquery_ollama_supports_visionr…  ª  sÃ   € ô (¨Ó.€JßŸXÔ->¸x×-QÒ-QÙÜœ XÓ.°ÓD€DØ‚|ÙØ�8‰8�NÓ#€DÜ�$œ×Ò§$ß‹sÑ@¹4Ó@�sŒsÐ@ŠsÐ@ˆsÑ@¹4Ó@Ó@Ð@Ø—‘˜,Ó'€JÜ�*œd×#Ò#¯«Ñ+kÑ`jÓ+k¯¯ªÑ+kÑ`jÓ+k×(kÒ(kÙÙr   c                ó‚   € V ^8„  d   QhR\         R\        . \        \        ,          3,          R\        \        ,          /# )r)   Ú	cache_keyÚprober+   )rk  r   r   rj  )r.   s   "r   r/   r/   ¼  s4   € ÷ 
ñ 
¤ð 
¬x¸¼HÄS½MÐ8IÕ/Jð 
ÌxÔX[Í}ñ 
r   c                óÖ   € \         P                  ! 4       p\        P                  V 4      pVe"   W#^,          ,
          \        8  d
   V^ ,          # V! 4       pV'       d   WB3\        V &   V# )z¿Short-TTL, positive-only memo of a local probe (see _LOCAL_CTX_PROBE_CACHE): a failure during
a startup race must not suppress the retry once the server is up, so only truthy results memoize.)rS   rT   r  r_   Ú_LOCAL_CTX_PROBE_TTL_SECONDS)r‡  rˆ  r–   r¿  rû  s   &&   r   Ú_memo_local_prober‹  ¼  sZ   € ô �.Š.Ó
€CÜ#×'Ñ'¨	Ó2€FØÒ˜s¨A¥Y�Ô2NÔNØ�a�yÐÙ‹W€FßØ-3¨MÔ˜yÑ)Ø€Mr   c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# rØ  r�  )r.   s   "r   r/   r/   É  s3   € ÷ nñ n¤#ð n´ð n¼sð nÌHÔUXÍMñ nr   c                ób   a aa€ \        R\        S 4      SP                  R4      3VVV 3R l4      # )uÏ   Provider-agnostic Ollama ``/api/show`` probe (any hostname; non-Ollama servers 404 fast).
GGUF-first (hosted users can't set num_ctx) â€” the reverse of query_ollama_num_ctx(), hence the namespaced memo key.r  r   c                  ó    <€ \        SSS R 7      # ©r¹  )Ú_query_ollama_api_show_uncached©r!  rA   r*   s   €€€r   rq  Ú(_query_ollama_api_show.<locals>.<lambda>Ì  s&   ø€ ô  lKð  LQð  S[ð  elõ  lmr   ©r‹  r?   r  ©r*   rA   r!  s   fffr   Ú_query_ollama_api_showr•  É  s4   ú€ ô ˜mÔ-CÀEÓ-JÈHÏOÉOÐ\_ÓL`Ðaö  dmó  nð  nr   c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# rØ  r�  )r.   s   "r   r/   r/   Ï  s5   € ÷ cñ c¬3ð c¼#ð cÌð cÔU]Ô^aÕUbñ cr   c                ó„   € \        V4      p\        V4      '       d   R# \        W2V RRR7      pVe   \        VRRR7      # R# )uJ   Uncached body of ``_query_ollama_api_show`` â€” one POST to ``/api/show``.Ng      @T)rï  ri  r'  )rx  rv  )r]  ra   ro  rŠ  )r*   rA   r!  r\  r‚   s   &&&  r   r�  r�  Ï  sF   € ä˜hÓ'€JÜ˜J×'Ò'ÙÜ˜
¨U¸CÐPTÔU€DàHLÒHXÔ °¸tÔDÐbÐ^bÐbr   c                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/   Ù  s   € ÷ ;ñ ;¤Sð ;¬Tñ ;r   c                ó^   € V P                  4       pVP                  R4      ;'       g    RV9   # )uT   Kimi family (``kimi-*``, ``moonshotai/*``) â€” guard against stale 32K underreports.r÷   Úmoonshot©r"   r5   ©r*   r"   s   & r   Ú_model_name_suggests_kimir�  Ù  s+   € à�K‰K‹M€EØ×Ñ˜FÓ#×:Ð: z°UÑ':Ð:r   c                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/   ß  s   € ÷ )ñ )¬3ð )´4ñ )r   c                ó(   € RV P                  4       9   # )uj   MiniMax M3 on any surface â€” models.dev underreport guard and agent_runtime_helpers cache-control gating.rí   ©r"   ©r*   s   &r   Ú_model_name_suggests_minimax_m3r¢  ß  s   € à˜5Ÿ;™;›=Ñ(Ð(r   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r)   r*   r¿  r+   )r-   rj  r]   )r.   s   "r   r/   r/   ô  s&   € ÷ Kñ K¬#ð K´sð K¼tñ Kr   c                ó’  € V P                  4       p\        P                  4        UUu. uF  w  r4\        W24      '       g   K  W43NK  	  pppV'       g   R# \	        VR R7      w  rgV\
        9  g   W8¼  d   R# V UU	u. uF"  w  r‰\        V4      \        V4      8  g   K   V	NK$  	  p
pp	V\	        V
\        R7      8*  # u uppi u up	pi )zÌTrue when a persisted window is a pre-catalog leftover: the model resolves (longest-key-first) to a
_PRE_CATALOG_STALE_KEYS key and the cached value is <= the largest shorter matching catch-all (or 256K).Fc                 ó&   € \        V ^ ,          4      # rn  ro  )Úkvs   &r   rq  Ú0_stale_pre_catalog_cache_entry.<locals>.<lambda>û  s   € ¼sÀ2ÀaÅ5¼zr   )rY   )rÎ   )r"   ÚDEFAULT_CONTEXT_LENGTHSr•   rg  r@  Ú_PRE_CATALOG_STALE_KEYSrU  rÒ   )r*   r¿  r`  rY   r%   ÚmatchesÚspecific_keyÚspecific_valuer—   r˜   Úshorter_valuess   &&         r   Ú_stale_pre_catalog_cache_entryr®  ô  s«   € ð —+‘+“-€KÜ.E×.KÑ.KÔ.MÔxÑ.M¡
 ÔQeÐfi×QwŒ|�‹|Ñ.M€GÑxßÙÜ#& wÑ4IÔ#JÑ €LØÔ2Ô2°fÔ6NÙÙ$+ÔJ¡G™D˜A¬s°1«v¼¸LÓ8IÑ/I—a�a¡G€NÑJØ”S˜Ô1IÔJÑJÐJùó yùó Ks   ¨B=ÁB=Á>CÂ Cc                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/     s   € ÷ @ñ @¬ð @´ñ @r   c                ó^   € V P                  4       pVP                  R4      ;'       g    RV9   # )ug   MiniMax family (``minimax*``, ``minimaxai/*``) â€” guard against stale 32K underreports (real: 204.8K).rî   z
minimaxai/r›  rœ  s   & r   Ú_model_name_suggests_minimaxr±    s+   € à�K‰K‹M€EØ×Ñ˜IÓ&×?Ð?¨,¸%Ñ*?Ð?r   c                ó0   € V ^8„  d   QhR\         R\        /# r(   r\   )r.   s   "r   r/   r/     s   € ÷ Sñ S´cð S¼dñ Sr   c                ó>   € \        V 4      ;'       g    \        V 4      # )z8Model families known to be wrongly underreported as 32K.)r�  r±  r¡  s   &r   Ú*_model_name_suggests_stale_32k_underreportr´    s   € ä$ UÓ+×RÐRÔ/KÈEÓ/RÐRr   c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# rØ  r�  )r.   s   "r   r/   r/     s5   € ÷ dñ d¤sð d´cð dÄCð dÔQYÔZ]ÕQ^ñ dr   c                ó`   a aa€ \        \        S 4      SP                  R4      3VVV 3R l4      # )zJLocal-server context probe, short-TTL cached (see _LOCAL_CTX_PROBE_CACHE).r   c                  ó    <€ \        SSS R 7      # r�  )Ú$_query_local_context_length_uncachedr‘  s   €€€r   rq  Ú-_query_local_context_length.<locals>.<lambda>  s&   ø€ ô  ]Að  BGð  IQð  [bõ  ]cr   r“  r”  s   fffr   rº  rº    s/   ú€ äÔ4°UÓ;¸X¿_¹_ÈSÓ=QÐRö  Ucó  dð  dr   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r)   r%   r+   )r   r   rj  )r.   s   "r   r/   r/     s"   € ÷ Mñ Mœð M¤¬#¥ñ Mr   c                 ód   € \        V \        \        34      '       d   V '       d   \        V 4      # R # r   )rk   rj  rˆ   )r%   s   &r   Ú_positive_intr¼    s#   € Ü# E¬C´¨<×8Ò8¿UŒ3ˆu‹:ÐLÈÐLr   c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# )r)   rø  r*   r+   r�  )r.   s   "r   r/   r/     s%   € ÷ 	ñ 	¬Cð 	¼ð 	ÄÌÅñ 	r   c           	     ó‚  € V P                  V R24      pVP                  ^È8w  d   R# VP                  4       P                  R. 4       Fs  p\        VP                  RR4      V4      '       g%   \        VP                  RR4      V4      '       g   KI  \	        R R VP                  R	. 4       4        4       R4      u # 	  R# )
ztLM Studio native /api/v1/models (the OpenAI-compat list omits context);
loaded-instance config is the runtime value.rÞ  NrÀ   rY   rÍ   rt  c              3   ó0   "  € T F  qf   K  Vx € K  	  R # 5ir   r   ©r#   r‰  s   & r   r&   Ú$_lmstudio_context.<locals>.<genexpr>  s   é € ð  dñ  )P Ÿšó  )Pùr  c              3   óv   "  € T F/  p\        VP                  R / 4      P                  R4      4      x € K1  	  R# 5i)r�  r…  N©r¼  r_   )r#   r�  s   & r   r&   rÁ    s=   é € ð  )Pñ  rOÐim¬°t·x±xÀÈ"Ó7M×7QÑ7QÐRbÓ7c×)dÐ)dó  rOùs   ‚79rŽ  )r_   r÷  r   rh  r˜  )rü  rø  r*   rž  rË  s   &&&  r   Ú_lmstudio_contextrÄ    sÈ   € ð �:‰:˜˜ nÐ5Ó6€DØ×Ñ˜3ÔÙØ�Y‰Y‹[�_‰_˜X rÖ*ˆÜ˜QŸU™U 5¨"Ó-¨u×5Ò5Ô9JÈ1Ï5É5ÐQUÐWYË?Ð\a×9bÔ9bÜñ  dñ  )PÐqr×qvÑqvð  xJð  LNô  rOô  )Pó  dð  fjó  kò  kñ +ñ r   c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# )r)   r\  r*   r+   r�  )r.   s   "r   r/   r/   "  s&   € ÷ ñ ´Cð Äð ÌÔQTÍñ r   c                óî  a€ V P                  V R24      pVP                  ^È8w  d   R# VP                  4       P                  R. 4      p\        V3R lV 4       R4      pVf   \	        V4      ^8X  d
   V^ ,          pVf   R# YUP                  R4      ;'       g    / 3 Uu. uF  p\        V\        4      '       g   K  VNK  	  ppR \        3 F  pV F  p	V! V	4      p
V
f   K  V
u u # 	  K   	  R# u upi )zp/v1/models list: match by id, else the sole model on single-model servers (llama.cpp reports a GGUF path as id).z
/v1/modelsNr‚   c              3   ó    <"  € T FC  p\        V\        4      '       g   K  \        VP                  R R4      S4      '       g   K?  Vx € KE  	  R# 5i)rt  rÍ   N)rk   rx   rh  r_   )r#   rË  r*   s   & €r   r&   Ú._openai_models_list_context.<locals>.<genexpr>(  s9   øé € Ðp™{˜!¬j¸¼D×.A”AÔFWÐXY×X]ÑX]Ð^bÐdfÓXgÐin×Fo—A’A›{ùs   ƒA AÁ
AÚmetac                 ó6   € \        V P                  R 4      4      # )r¥  rÃ  )Úsrcs   &r   rq  Ú-_openai_models_list_context.<locals>.<lambda>/  s   € œ}¨S¯W©W°WÓ-=Ô>r   )r_   r÷  r   r˜  rU  rk   rx   r&  )rü  r\  r*   rž  Úmodels_listrÞ  ÚsÚsourcesrˆ  r>  r‰  s   &&f        r   Ú_openai_models_list_contextrÐ  "  sã   ø€ à�:‰:˜˜ JÐ/Ó0€DØ×Ñ˜3ÔÙØ—)‘)“+—/‘/ &¨"Ó-€KÜÔp™{ÓpÐrvÓw€GØ‚œ3˜{Ó+¨qÔ0Ø˜a•.ˆØ‚Ùà"§K¡K°Ó$7×$=Ð$=¸2Ñ>ÓVÑ>�QÄ*ÈQÔPT×BU�qˆqÑ>€GÐVÙ>Ô@bÓcˆÛˆFÙ˜“.ˆCØŒØ”
ó ñ dñ
 ùò Ws   Â C2Â=C2c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# rØ  r�  )r.   s   "r   r/   r/   7  s/   € ÷ %ñ %´ð %¼sð %ÌSð %ÔZbÔcfÕZgñ %r   c                ó¦  a a	a
aa€ ^ RI p\        S 4      o \        V4      o\        \	        V4      4      o
\        S4      '       d   R#  \        WR7      oR V V3R llpR V VV3R llpRVRV
V 3R	 lR
V V3R l/P                  S4      pV'       d   V.M. VV V3R l.,           p VP                  R\        V4      \        P                  ! V4      R7      ;_uu_ 4       o	\        R V	3R lV 4        4       R4      uuRRR4       #   \         d    Ro LÂi ; i  + '       g   i     R# ; i  \         d   p\        TS4        Rp?R# Rp?ii ; i)z4Query a local server for the model's context length.Nr¹  c                ó:   € V ^8„  d   QhR\         \        ,          /# rœ   ©r   rj  )r.   s   "r   r/   Ú:_query_local_context_length_uncached.<locals>.__annotate__C  s   € ÷ hñ hœx¬�}ñ hr   c                 ó�   <€ V P                  S R 2RS/R7      pVP                  ^È8X  d   \        VP                  4       RR7      # R# )rm  r    rä  Frw  N)rn  r÷  rŠ  r   )rü  rž  r*   r\  s   & €€r   Ú_ollama_ctxÚ9_query_local_context_length_uncached.<locals>._ollama_ctxC  sJ   ø€ ð �{‰{˜j˜\¨Ð3¸6À5¸/ˆ{ÓJˆØFJ×FVÑFVÐZ]ÔF]Ô# D§I¡I£K¸EÔBÐgÐcgÐgr   c                ó:   € V ^8„  d   QhR\         \        ,          /# rœ   rÔ  )r.   s   "r   r/   rÕ  H  s   € ÷ dñ d¤X¬c¥]ñ dr   c                 ó”   <€ Sf   R # V P                  S RS 24      pVP                  ^È8X  d   \        VP                  4       4      # R # )Nz/v1/models/)r_   r÷  r&  r   )rü  rž  r*   rÜ  r\  s   & €€€r   Ú_model_detail_ctxÚ?_query_local_context_length_uncached.<locals>._model_detail_ctxH  sM   ø€ ð
 ÒÙØ�z‰z˜Z˜L¨°E°7Ð;Ó<ˆØBF×BRÑBRÐVYÔBYÔ1°$·)±)³+Ó>ÐcÐ_cÐcr   râ  rÝ  c                 ó   <€ \        V SS4      # r   )rÄ  )rü  rø  r*   s   &€€r   rq  Ú6_query_local_context_length_uncached.<locals>.<lambda>S  s   ø€ Ô$5°f¸lÈEÔ$Rr   rå  c                 ó   <€ \        V SS4      # r   r   ©rü  r*   r\  s   &€€r   rq  rÞ  T  s   ø€ Ô#3°F¸JÈÔ#Nr   c                 ó   <€ \        V SS4      # r   )rÐ  rà  s   &€€r   rq  rÞ  V  s   ø€ ÔMhÐioÐq{ð  ~Cô  NDr   ç      @rî  c              3   ó0   "  € T F  qf   K  Vx € K  	  R # 5ir   r   rÀ  s   & r   r&   Ú7_query_local_context_length_uncached.<locals>.<genexpr>Y  s   é € Ð_Ñ(K ŸšÓ(Kùr  c              3   ó2   <"  € T F  q! S4      x € K  	  R # 5ir   r   )r#   rˆ  rü  s   & €r   r&   rä  Y  s   øé € Ð(KÁF¸5¨¨v¯¨ÃFùó   ƒ)rj   r?   r]  rZ  rW  ra   rÿ  r9   r_   rõ  r)  r   rö  r˜  rg   )r*   rA   r!  rj   r×  rÛ  ÚtypedÚprobesrc   rü  rø  rÜ  r\  s   f&&      @@@@r   r¸  r¸  7  sC  ü€ ãÜ" 5Ó)€EÜ˜hÓ'€JÜ%Ô&;¸HÓ&EÓF€LÜ˜J×'Ò'ÙðÜ.¨xÔIˆ÷hñ h÷
dò dð 	�+ØÕRØÕNð÷ 
�cˆ+Óð	 
÷
 ˆu‰g BÐ+<õ  ?Dð  +Eõ  E€Fð2Ø�\‰\ #¬}¸WÓ/EÔNa×NpÒNpÐqyÓNzˆ\×{Ô{ð  @FÜÑ_Ô(KÁFÔ(KÓ_ÐaeÓf÷ |Ò{øô/ ô ØŠðú÷. |Ö{ñ ûô ô 2Ü   j×1Ð1Ùûð2úsH   ÁD Â&9D. ÃDÃ<
D. ÄDÄDÄD+	Ä%D. Ä+D. Ä.EÄ9EÅEc                ó0   € V ^8„  d   QhR\         R\         /# r(   r,   )r.   s   "r   r/   r/   _  s   € ÷ #ñ #¤Cð #¬Cñ #r   c                ó&   € V P                  RR4      # )zYDots -> dashes so Nous ids (claude-opus-4-6) compare with OpenRouter's (claude-opus-4.6).rÇ  r  )r  r¡  s   &r   rf  rf  _  s   € à�=‰=˜˜cÓ"Ð"r   c          	      ó^   € V ^8„  d   QhR\         R\         R\        R\        \        ,          /# rØ  )r-   r   r   rj  )r.   s   "r   r/   r/   d  s/   € ÷ ñ ¬3ð ¼#ð Ìð ÔPXÔY\ÕP]ñ r   c                óŽ  € V'       d.   \        V\        4      '       d   VP                  R4      '       d   R#  VP                  R4      P	                  R4      pRVRR/p\
        P                  ! V R2VR\
        P                  ! V4      R	7      pVP                  ^È8w  d   R# VP                  4       P                  R
. 4       FO  pVP                  R4      V 8X  d   VP                  R4      MRp\        V\        4      '       g   KD  V^ 8”  g   KM  Vu # 	  R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)u  Anthropic /v1/models max_input_tokens; OAuth tokens (sk-ant-oat*) 401 and are skipped.

``api_key`` may be a ``key_cmd`` callable token source; the metadata probe never mints â€” a
callable is not a Console key, so the lookup is skipped like an OAuth token (#114967).
z
sk-ant-oatNr   rS  z	x-api-keyzanthropic-versionz
2023-06-01z/v1/models?limit=1000r•  r‚   rt  Úmax_input_tokensz%Anthropic /v1/models query failed: %sry  )rk   r-   r5   r  r[  r   r_   rö  r÷  r   rj  r9   rV   rW   )	r*   rA   r!  rL  rð  rž  rË  r‰  r™   s	   &&&      r   Ú_query_anthropic_context_lengthrî  d  s)  € ÷ œ* W¬c×2Ò2°g×6HÑ6HÈ×6VÒ6VÙðAØ�‰˜sÓ#×0Ñ0°Ó7ˆØ Ð)<¸lÐKˆÜ"×&Ò&¨$¨Ð/DÐ'EÈwÐ`gô  qD÷  qSò  qSð  T\ó  q]ô  ^ˆØ×Ñ˜sÔ"ÙØ—‘“—‘ ¨Ö,ˆAØ/0¯u©u°T«{¸eÔ/C�!—%‘%Ð*Ô+ÈˆCÜ˜#œs×#Ô#¨¨a®Ø’
ñ -ñ øô ô AÜ�‰Ð<¸a×@Ð@ÙûðAús1   ¹A(D Â#AD ÄD ÄD ÄD ÄEÄ#D?Ä?Ei€& zgpt-5.1-codex-maxzgpt-5.1-codex-minizgpt-5.3-codexzgpt-5.2-codexzgpt-daybreak-blue-latestzgpt-5.2zgpt-5.6i » z-900kz^\d{4}-\d{2}-\d{2}$c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r(   ©r   r-   )r.   s   "r   r/   r/      s   € ÷ <ñ <œH¤S�Mð <¬cñ <r   c                ó€   € T ;'       g    RP                  4       P                  4       P                  R^4      R,          # )a  Lowercased slug without ``vendor/`` (display/auxiliary callers pass ``openai/gpt-5.6-sol-900k``).

Display/auxiliary callers pass ids like ``openai/gpt-5.6-sol-900k``; the main-agent path normalizes the
namespace away earlier, but this resolver must accept both shapes (#92797 review).
rÍ   r   r  )r8   r"   r  r¡  s   &r   Ú_bare_codex_slugrò     s4   € ð �KˆK�R×ÑÓ ×&Ñ&Ó(×/Ñ/°°QÓ7¸Õ;Ð;r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r(   r  )r.   s   "r   r/   r/   ©  s   € ÷ ñ œh¤s�mð ´ñ r   c                ó
  a€ \        V 4      oS'       d   SP                  \        4      '       d   R# S\        9   ;'       gC    \        ;QJ d#    V3R l\
         4       F  '       g   K   R# 	  R# ! V3R l\
         4       4      # )ziSingle source of truth for ``-900k`` eligibility (picker, resolution, /model validation, wire stripping).Fc              3   ó´   <"  € T FM  pSP                  VR ,           4      ;'       d)    \        P                  S\        V4      ^,           R 4      x € KO  	  R# 5i)r  N)r5   Ú_CODEX_900K_SNAPSHOT_REr;   rU  )r#   rL  Úslugs   & €r   r&   Ú%is_codex_900k_base.<locals>.<genexpr>¯  sR   øé € ð 5ñ iCÐ`dˆ�‰˜˜s�
Ó#×[Ð[Ô(?×(EÑ(EÀdÌ3ÈtË9ÐWXÍ=È>ÐFZÓ([Ô[ó  iCùs
   ƒ#A§1AT)rò  rT  ÚCODEX_CONTEXT_VARIANT_SUFFIXÚ_CODEX_900K_ELIGIBLE_BASESr  Ú_CODEX_900K_SNAPSHOT_BASES)r*   r÷  s   &@r   Úis_codex_900k_baserü  ©  sw   ø€ ä˜EÓ"€Dß�4—=‘=Ô!=×>Ò>ÙàÔ-Ñ-÷ ð ·³ô 5õ iCó5·´ð ²ð °ô 5õ iCó5ó 2ð r   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# r(   rð  )r.   s   "r   r/   r/   ´  s&   € ÷ Kñ Kœx¬�}ð K´¼#µñ Kr   c                óª   € \        V 4      pVP                  \        4      '       d   VR\        \        4      )  MRpVe   \	        V4      '       d   V# R# )zhLowercased eligible base of a VALID ``-900k`` variant, else None (``gpt-5.5-900k`` is an invalid alias).N)rò  rT  rù  rU  rü  )r*   r÷  rL  s   &  r   Ú_codex_variant_baserÿ  ´  sO   € ä˜EÓ"€DØ9=¿¹ÔGc×9dÒ9dˆ4Ð4”3Ô3Ó4Ð4Ñ5Ðjn€DØÒ#Ô(:¸4×(@Ò(@ˆ4ÐJÀdÐJr   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r(   r  )r.   s   "r   r/   r/   »  s   € ÷ 2ñ 2¤H¬S¥Mð 2´dñ 2r   c                ó   € \        V 4      RJ# )uQ   Suffix AND eligible base â€” ``gpt-5.5-900k`` is an invalid alias, not a variant.N)rÿ  r¡  s   &r   Úis_codex_context_variantr  »  s   € ä˜uÓ%¨TÐ1Ð1r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r(   rð  )r.   s   "r   r/   r/   À  s"   € ÷ fñ f¬h´s­mð fÄñ fr   c                óz   € T ;'       g    RP                  4       p\        V4      e   VR\        \        4      )  # T# )z¹Wire-safe slug with a VALID ``-900k`` suffix removed (vendor prefix kept); an ineligible alias is
returned unchanged so it fails honestly at the API instead of running as another model.rÍ   N)r8   rÿ  rU  rù  )r*   r%  s   & r   Ú"strip_codex_context_variant_suffixr  À  s?   € ð �;ˆ;�B×
Ñ
Ó
€CÜ8KÈCÓ8PÒ8\ˆ3Ð3”#Ô2Ó3Ð3Ð4ÐeÐbeÐer   c                ó0   € V ^8„  d   QhR\         R\        /# ©r)   Ú
model_barer+   r\   )r.   s   "r   r/   r/   Ç  s   € ÷ *ñ *¬#ð *´$ñ *r   c                ó   € \        V 4      # )z0Picker-side alias of :func:`is_codex_900k_base`.)rü  )r  s   &r   Úhas_codex_context_variantr
  Ç  s   € ä˜jÓ)Ð)r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# r  r�  )r.   s   "r   r/   r/   Ì  s"   € ÷ _ñ _¬Sð _´X¼cµ]ñ _r   c                ó¬   a€ \        V 4      oSf   R# \        P                  S4      pVe   V# \        V3R l\        P                  4        4       R4      # )z`Live-verified cap for a VALID ``-900k`` variant only; base slugs and ineligible aliases -> None.Nc              3   óŒ   <"  € T F9  w  rSV8X  g*   SP                  VR ,           VR,           34      '       g   K5  Vx € K;  	  R# 5i)r  rÇ  Nr  )r#   rY   r‰  rL  s   &  €r   r&   Ú/_verified_codex_ctx_for_slug.<locals>.<genexpr>Ô  sd   øé € ð  XÑ%\™˜Ð`dÐhkÔ`kÐos×o~Ño~ð  ADð  GJõ  AJð  LOð  RUõ  LUð  @V÷  pW—’Ó%\ùs
   ƒ2Aº
A)rÿ  Ú,_CODEX_OAUTH_VERIFIED_ABOVE_ADVERTISED_EXACTr_   r˜  Ú/_CODEX_OAUTH_VERIFIED_ABOVE_ADVERTISED_PREFIXESr•   )r  ÚexactrL  s   & @r   Ú_verified_codex_ctx_for_slugr  Ì  s^   ø€ ä˜zÓ*€DØ‚|ÙÜ8×<Ñ<¸TÓB€EØÒØˆÜô  XÔ%T×%ZÑ%ZÔ%\ó  Xð  Z^ó  _ð  _r   z,https://chatgpt.com/backend-api/codex/modelsz99.0.0z0.0.0c                óJ   € V ^8„  d   QhR\         R\        \         R3,          /# )r)   rA   r+   .)r-   rk  )r.   s   "r   r/   r/   ê  s"   € ÷ 	ñ 	¤#ð 	¬u´S¸#°X­ñ 	r   c                ó  a€ T ;'       g    RP                  4       P                  R4      pV'       d   V R2M\        o\        ;QJ d!    . V3R l\        \
        3 4       F  NK  	  5# ! V3R l\        \
        3 4       4      # )u  Catalog URLs against ``base_url`` when it names a Codex-compatible gateway, else the
hard-coded endpoint. A custom base's credential belongs to that service â€” sending it to
chatgpt.com (or fetching the direct catalog behind a gateway's back) is wrong (#121486).rÍ   r   r©  c              3   ó2   <"  € T F  pS R V 2x € K  	  R# 5i)z?client_version=Nr   )r#   r˜   Úendpoints   & €r   r&   Ú&_codex_catalog_urls.<locals>.<genexpr>ð  s$   øé € ð áLˆAð ˆ*Ð$ Q CÕ(ÛLùræ  )r8   r  ÚCODEX_MODELS_CATALOG_ENDPOINTrk  ÚCODEX_NEWEST_CLIENT_VERSIONÚCODEX_UNGATED_CLIENT_VERSION)rA   rL  r  s   & @r   Ú_codex_catalog_urlsr  ê  ss   ø€ ð �NˆN˜×!Ñ!Ó#×*Ñ*¨3Ó/€Dß#'�$��wÑÔ-J€HßŒ5ô ä-Ô/KÑLó�5ð ˆ5ô ä-Ô/KÑLóó ð r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# ©r)   Úaccess_tokenrA   r+   r\   )r.   s   "r   r/   r/   ù  s!   € ÷ 2ñ 2¬sð 2¼cð 2Ì4ñ 2r   c                ó¼   € V '       g   R# T;'       g    RP                  4       ;'       g    \        p\        VR4      '       g   R# ^ RIHp \        V! V 4      4      # )u½  Whether a catalog probe may carry ``access_token`` to ``base_url``'s ``/models``.

The caller binds ``base_url`` to the credential's own route, so a custom gateway is asked with
its own key (opaque or JWT). chatgpt.com only accepts ChatGPT OAuth access tokens â€” JWTs â€” so a
non-JWT credential aimed there is a gateway key composed with the wrong host: refuse it
(defense in depth, mirroring ``_probe_codex_quota_restored``'s gate; #121486).
FrÍ   r/  T)Ú_decode_jwt_claims)r8   r  r   Úhermes_cli.auth_constantsr   r]   )r  rA   rL  r   s   &&  r   Ú_codex_catalog_probe_allowedr"  ù  sK   € ÷ ÙØ�NˆN˜×!Ñ!Ó#×DÐDÔ'D€DÜ   }×5Ò5ÙÝ<ÜÑ" <Ó0Ó1Ð1r   c          	      ó®   € V ^8„  d   QhR\         \        .\        3,          R\        R\        \        \        ,          \
        \        ,          3,          /# )r)   r_   rA   r+   )r   r-   r   rk  r¤  r   rj  )r.   s   "r   r/   r/   
  sE   € ÷ ñ ¤X¬s¨e´S¨jÕ%9ð ÄSð ÔRWÔX\Ô]`ÕXaÔckÔloÕcpÐXpÕRqñ r   c                ó(  € Rp\        V4       F~  pV ! V4      pVP                  pV^È8w  d   K   VP                  4       p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       g   Kq  V'       g   K{  Wb3u # 	  . V3# )a  ``(models, last_status)`` from the first catalog URL that answers HTTP 200 with a non-empty
``models`` list; ``get(url)`` is any client returning an object with ``status_code``/``json()``.
An empty or non-200 answer on the newest-client URL falls through to the ``0.0.0`` sentinel.NrÀ   )r  r÷  r   rk   rx   r_   r¤  )r_   rA   r¬  rÖ  rž  r‚   Úentriess   &&     r   Úfetch_codex_catalog_entriesr&  
  s‚   € ð !€FÜ" 8Ö,ˆÙ�3‹xˆØ×!Ñ!ˆØ�SŒ=ÙØ�y‰y‹{ˆÜ(2°4¼×(>Ò(>�$—(‘(˜8Ô$ÀDˆÜ�gœt×$Ô$¯©Ø�?Ò"ñ -ð ˆvˆ:Ðr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# r  r,   )r.   s   "r   r/   r/     s&   € ÷ oñ o´ð oÄð oÌSñ or   c                óÌ   € \         P                  ! T  RT;'       g    RP                  4       P                  R4       2P	                  4       4      P                  4       R,          # )u­   Non-secret cache key for a Codex OAuth access token (plus the base it was probed against â€”
a gateway's catalog can differ from chatgpt.com's for the same forwarded token).r|  rÍ   r   rª  )ÚhashlibÚsha256r8   r  ÚencodeÚ	hexdigest©r  rA   s   &&r   Ú_codex_oauth_token_fingerprintr.    sQ   € ô �>Š>˜\˜N¨"¨h¯n¨n¸"×-CÑ-CÓ-E×-LÑ-LÈSÓ-QÐ,RÐS×ZÑZÓ\Ó]×gÑgÓiÐjmÕnÐnr   c                ó(   € V ^8„  d   QhR\         RR/# )r)   r‡  r+   Nr,   )r.   s   "r   r/   r/   !  s   € ÷ 
{ñ 
{¬#ð 
{°$ñ 
{r   c                óö   € \         P                   ! 4       p\        P                  V 4      pVe*   V^ ,          '       d   W^,          ,
          \        8  d   R# / V\        ,
          \        ,           3\        V &   R# )aÂ  A probe that found no catalog (down, non-200, not Codex-shaped) is remembered briefly: context
resolution runs on init, /status, aux and @-reference turns, and each miss can block ~30s. The entry is
stamped as if cached ``TTL - NEGATIVE_TTL`` ago, so the shared freshness check expires it after
``_CODEX_OAUTH_CONTEXT_NEGATIVE_TTL``. A fresh catalog a concurrent probe just stored is kept, and the
max cache is left alone so an observed cap survives.N)rS   Ú_codex_oauth_context_cacher_   Ú_CODEX_OAUTH_CONTEXT_CACHE_TTLÚ!_CODEX_OAUTH_CONTEXT_NEGATIVE_TTL)r‡  r–   Úcurrents   &  r   Ú_remember_no_codex_catalogr5  !  s[   € ô �)Š)‹+€CÜ(×,Ñ,¨YÓ7€GØÒ˜w qŸzœz¨c¸AµJÕ.>ÔA_Ô._ÙØ-/°Ô7UÕ1UÔXyÕ1yÐ,zÔ˜yÓ)r   c          	      ó€   € V ^8„  d   QhR\         R\         R\        \        \         \        3,          \        3,          /# r  )r-   rk  rx   rj  r]   )r.   s   "r   r/   r/   .  s;   € ÷ +ñ +Äð +ÔPSð +Ô]bÔcgÔhkÔmpÐhpÕcqÔswÐcwÕ]xñ +r   c                ó4  a€ \        W4      '       g   / R3# \        P                  ! 4       p\        W4      p\        P	                  V4      pVe$   W$^,          ,
          \
        8  d   V^ ,          R3# ^ RIHp RRV  2/V! V 4      Co \        V3R lVR7      w  rgV^È8w  d&   \        P                  RV4       \        V4       / R3#  ^ R
IHp	 T	! Y64       / p
/ pT FÎ  p\        T\         4      '       d3   TP	                  R4      TP	                  R4      TP	                  R4      3MRw  rÞp\        T\"        4      '       g   Kh  \        T\$        4      '       g   K€  T^ 8”  g   K‰  YêTP'                  4       &   \        T\$        4      '       g   K³  T^ 8”  g   K¼  YûTP'                  4       &   KÐ  	  T
'       g   \        T4       / R3# T\(        T&   Y¢3\        T&   T
R3#   \         d0   p\        P                  R	T4       \        T4       / R3u Rp?# Rp?ii ; i)z«Account-scoped catalogue context lengths and HTTP freshness; also retain max-context and
speed metadata. In-process hits report False and must not drive persistent writes.FN)Úcodex_account_headersr%  r&  c                 ó^   <€ \         P                  ! V SR\         P                  ! 4       R7      # )rz  r•  ry  )r   r_   rö  )rÖ  rð  s   &€r   rq  Ú@_fetch_codex_oauth_context_lengths_with_source.<locals>.<lambda>>  s0   ø€ Ô+×/Ò/°¸WÈgÔ^q÷  _Aò  _Aó  _Cõ  Dr   r  zHCodex /models probe returned HTTP %s; falling back to hardcoded defaultszCodex /models probe failed: %s)Úremember_catalogr÷  Úcontext_windowÚmax_context_windowT)NNN)r"  rS   r.  r1  r_   r2  Úagent.codex_headersr8  r&  rV   rW   r5  r9   Úagent.codex_service_tiersr;  rk   rx   r-   rj  r8   Ú_codex_oauth_max_context_cache)r  rA   r–   r‡  r¿  r8  r%  r¬  rc   r;  rû  Ú
max_resultr  r÷  r‰  Úmax_ctxrð  s   &&              @r   Ú._fetch_codex_oauth_context_lengths_with_sourcerC  .  sø  ø€ ô (¨×?Ò?Ø�5ˆyÐÜ
�)Š)‹+€CÜ.¨|ÓF€IÜ'×+Ñ+¨IÓ6€FØÒ˜c¨1¥I�oÔ0NÔNØ�a�y˜%ÐÐõ :Ø '¨,¨Ð 8Ð`Ñ<QÐR^Ó<_Ð`€GðÜ5ô DØô
‰ˆð �SŒ=Ü�L‰LÐcÐekÔlÜ& yÔ1Ø�u�9Ðð õ ;Ù�YÔ(Ø€FØ!#€JÛˆÜoyÐz~ô  AE÷  pFò  pF˜dŸh™h vÓ.°·±Ð9IÓ0JÈDÏHÉHÐUiÓLjÑkð  L^Ñˆ�7Ü�dœC× Ô ¤Z°´S×%9Ô%9¸cÀA¾gØ#&�4—:‘:“<Ñ Ü˜'¤3×'Ô'¨G°a®KØ+2˜4Ÿ:™:›<Ó(ñ ÷ Ü" 9Ô-Ø�5ˆyÐà0:Ô" 9Ñ-Ø-3¨MÔ˜yÑ)Ø�4ˆ<Ðøô) ô Ü�‰Ð5°sÔ;Ü" 9Ô-Ø�5ˆyÕûðús   Â	>G ÇHÇ($HÈHÈHc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r)   r÷  r+   rI   )r.   s   "r   r/   r/   \  s"   € ÷ `ñ `¤3ð `¬8´C­=ñ `r   c                óB   a€ SV 9   d   S# \        V3R lV  4       R4      # )zQThe catalog key for ``slug``: exact, then case-insensitive in case casing drifts.c              3   óp   <"  € T F+  qP                  4       SP                  4       8X  g   K'  Vx € K-  	  R # 5ir   r   )r#   r—   r÷  s   & €r   r&   Ú%_codex_catalog_key.<locals>.<genexpr>^  s$   øé € Ð*X±d°¿g¹g»iÈ4Ï:É:Ë<Ñ>W¯1ª1³dùs   ƒ$6¬
6N)r˜  )r  r÷  s   &fr   Ú_codex_catalog_keyrH  \  s"   ø€ à˜4”<ˆ4Ð_¤TÔ*X±dÓ*XÐZ^Ó%_Ð_r   c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \        ,          /# )r)   r  rA   r÷  r+   r�  )r.   s   "r   r/   r/   a  s-   € ÷ >ñ >¬Cð >¼3ð >Äcð >ÌhÔWZÍmñ >r   c                ót   € \         P                  \        W4      / 4      pVP                  \        W24      4      # )zc``max_context_window`` the catalog behind ``(access_token, base_url)`` last published for ``slug``.)r@  r_   r.  rH  )r  rA   r÷  Ú	publisheds   &&& r   Ú_cached_codex_catalog_maxrL  a  s1   € ä.×2Ñ2Ô3QÐR^Ó3iÐkmÓn€IØ�=‰=Ô+¨IÓ<Ó=Ð=r   c          
      ó€   € V ^8„  d   QhR\         R\         R\         R\        \        \        ,          \         3,          /# )r)   r*   r  rA   r+   ©r-   rk  r   rj  )r.   s   "r   r/   r/   g  sV   € ÷ Xñ X¼3ð XÌcð XÔbeð XÔotÔu}ô  Bõ  vCô  EHð  vHõ  pIñ Xr   c                óž  a
€ \        V 4      P                  4       o
S
'       g   R# R	R V
3R lllp\        \        S
4      4      pRpV'       dI   \	        WR7      w  rg\        WV4      p\        Wd4      pVe    T! Wh,          V'       d   RV4      # RV4      # \        \        VP                  4       4      p	V	'       d   V! V	^,          RV4      # R# )
uè   ``(context_length, source)`` for a Codex OAuth slug. source: "live" (fresh authenticated probe â€”
the only one eligible for persistent writes), "memory" (same-token in-process hit), "fallback"
(static table), or "" when unresolved.Nc          
      ó€   € V ^8„  d   QhR\         R\        R\        \         ,          R\        \         \        3,          /# )r)   r‰  r>  Úcatalog_maxr+   )rj  r-   r   rk  )r.   s   "r   r/   ÚE_resolve_codex_oauth_context_length_with_source.<locals>.__annotate__n  s9   € ÷ ñ ¤#ð ¬sð ÄÌ#Åð ÔZ_Ô`cÔehÐ`hÕZiñ r   c                óœ   <€ \        S4      pVe;   V \        8X  d0   V'       d   \        W24      MTp\        P	                  RSW4       W13# W3# )z¶Lift an EXACT stale 272K advertisement to the verified cap for opted-in ``-900k`` variants only,
never above the catalog's own ``max_context_window`` when it publishes one (#105443).zDCodex OAuth context for %s: advertised %d raised to live-verified %d)r  Ú!_CODEX_OAUTH_STALE_ADVERTISED_CTXr€  rV   rW   )r‰  r>  rQ  Úbumpedr  s   &&& €r   Ú_apply_verified_bumpÚM_resolve_codex_oauth_context_length_with_source.<locals>._apply_verified_bumpn  sN   ø€ ô .¨jÓ9ˆØÒ #Ô)JÔ"Jß1<”S˜Ô-À&ˆFÜ�L‰LÐ_ÐakÐmpÔyØ�>Ð!Øˆ{Ðr   r  ÚliveÚmemoryÚfallback©NrÍ   r   )
r?   r8   rò  r  rC  rL  rH  ru  Ú_CODEX_OAUTH_CONTEXT_FALLBACKr"   )r*   r  rA   rV  Úlookup_barerQ  rX  Úfresh_prober÷  Úhitr  s   &&&       @r   Ú/_resolve_codex_oauth_context_length_with_sourcer`  g  s½   ø€ ô (¨Ó.×4Ñ4Ó6€JßØˆ÷ò ô #Ô#EÀjÓ#QÓR€KØ€KßÜJÈ<ÔkÑˆä/°ÈÓTˆÜ! $Ó4ˆØÒÙ'¨­
¿k°FÐYdÓeÐeÈxÐYdÓeÐeÜ
Ô:¸K×<MÑ<MÓ<OÓ
P€CßDGÑ  A¥¨
°KÓ@ÐWÈZÐWr   c          
      ó€   € V ^8„  d   QhR\         R\         R\         R\        \        \        ,          \         3,          /# rØ  rN  )r.   s   "r   r/   r/   ‰  s;   € ÷ ñ ¬ð ´sð Ì#ð ÔW\Ô]eÔfiÕ]jÔloÐ]oÕWpñ r   c                óŒ  a aaa€ V'       d   \        S WR7      pVe   VR3# \        4       pR R lpS P                  4       \        S 4      P                  4       uooR VV3R lloR V3R	 llpR
 V3R llpV 3R lWg3 F@  pVP	                  4        F)  w  ršV! V	4      '       d	   V! Wš4      MRpVf   K#  VR3u u # 	  KB  	  R# )u  ``(context_length, source)`` for a Nous Portal model: portal /v1/models is authoritative
("portal"). Fallback matches OR's prefixed ids against the bare Nous id with dot/dash
normalisation ("openrouter" â€” callers must NOT persist it, or a portal blip freezes the wrong value).r¹  NÚportalc                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# )r)   Úor_idrŠ   r+   )r-   rx   r   rj  )r.   s   "r   r/   Ú2_resolve_nous_context_length.<locals>.__annotate__’  s%   € ÷ ñ œð ¤Tð ¬h´s­mñ r   c                ó�   € VP                  R4      pVe1   VR8:  d*   \        V 4      '       d   \        P                  RW 4       R# V# )zMContext length minus the known stale 32K underreports (same guard as step 6).r…  Nrø   zyRejecting OpenRouter metadata context=%s for %r (known 32K underreport, Nous path); falling through to hardcoded defaults)r_   r´  rV   rÁ  )re  rŠ   r‰  s   && r   Ú	_safe_ctxÚ/_resolve_nous_context_length.<locals>._safe_ctx’  sJ   € à�i‰iÐ(Ó)ˆØŠ?˜s eœ|Ô0ZÐ[`×0aÒ0aÜ�K‰Kð  Tð  VYô  aÙØˆ
r   c                ó$   € V ^8„  d   QhR\         /# )r)   re  r,   )r.   s   "r   r/   rf  š  s   € ÷ cñ c”cñ cr   c                 ó¢   <€ R V 9   d   V P                  R ^4      ^,          MT pVP                  4       S3\        V4      P                  4       S33# )r   )r6   r"   rf  )re  r  r`  rE   s   & €€r   Ú_pairsÚ,_resolve_nous_context_length.<locals>._pairsš  sK   ø€ Ø),°¬ˆu�{‰{˜3 Ó" 1Ö%¸5ˆØ—‘“˜{Ð+Ô.FÀtÓ.L×.RÑ.RÓ.TÐV`Ð-aÐbÐbr   c                ó0   € V ^8„  d   QhR\         R\        /# ©r)   re  r+   r\   )r.   s   "r   r/   rf  �  s   € ÷ Mñ M”cð Mœdñ Mr   c                 ó„   <€ \         ;QJ d"    R  S! V 4       4       F  '       g   K   R# 	  R# ! R  S! V 4       4       4      # )c              3   ó.   "  € T F  w  rW8H  x € K  	  R # 5ir   r   ©r#   rÕ  r–  s   &  r   r&   Ú?_resolve_nous_context_length.<locals>._exact.<locals>.<genexpr>ž  s   é € ÐL¹mÑ*:¨)�9Ö%»mùs   ‚TFrX  ©re  rl  s   &€r   Ú_exactÚ,_resolve_nous_context_length.<locals>._exact�  s4   ø€ ß‹sÑL¹fÀU¼mÓL�sŒsÐLŠsÐLˆsÑL¹fÀU¼mÓLÓLÐLr   c                ó0   € V ^8„  d   QhR\         R\        /# ro  r\   )r.   s   "r   r/   rf  Ÿ  s   € ÷ [ñ [”sð [œtñ [r   c                 ó„   <€ \         ;QJ d"    R  S! V 4       4       F  '       g   K   R# 	  R# ! R  S! V 4       4       4      # )c              3   óÀ   "  € T FT  w  rVP                  V4      ;'       d5    \        V4      \        V4      8H  ;'       g    V\        V4      ,          R 9   x € KV  	  R# 5i)z-:.N)r5   rU  rr  s   &  r   r&   Ú@_resolve_nous_context_length.<locals>._prefix.<locals>.<genexpr>   sg   é € ð  [ñ  MZñ  yIð  yB�9×'Ñ'¨Ó.×sÐs´C¸	³NÄcÈ%ÃjÑ4P×4rÐ4rÐT]Ô^aÐbgÓ^hÕTiÐmrÑTrÔsó  MZùs   ‚A¡AÁ ATFrX  rt  s   &€r   Ú_prefixÚ-_resolve_nous_context_length.<locals>._prefixŸ  sj   ø€ ß‹sñ  [ñ  MSð  TYô  MZó  [�sŒsð  	[Šsð  	[ˆsñ  [ñ  MSð  TYô  MZó  [ó  [ð  	[r   c                 ó   <€ V S8H  # r   r   )re  r*   s   &€r   rq  Ú._resolve_nous_context_length.<locals>.<lambda>£  s	   ø€  %¨5¢.r   r6  r[  )rß  r†  r"   rf  r•   )r*   rA   r!  Ú
portal_ctxrO  rh  ru  r{  Úmatcherre  rŠ   r‰  rl  r`  rE   s   f&&         @@@r   Ú_resolve_nous_context_lengthr�  ‰  sÉ   û€ ÷ Ü5°e¸XÔWˆ
ØÒ!Ø˜xÐ'Ð'Ü#Ó%€Hõð $Ÿk™k›mÔ-EÀeÓ-L×-RÑ-RÓ-TÐ€K�÷cñ c÷Mð M÷[ð [ô 1°&ÓBˆØ$ŸN™NÖ,‰LˆEÙ-4°U¯^ª^‘)˜EÔ)ÀˆCØŒØ˜LÐ(Ô(ó -ñ Cð
 €Or   r!  c                ój   € V ^8„  d   QhR\         R\         R\        R\         R\        \        ,          /# r¾  r0  )r.   s   "r   r/   r/   «  s7   € ÷ ñ ¬3ð ¼#ð Äsð ÔX[ð ÔemÔnqÕerñ r   c               óª  € V^ 8*  \         P                  RV3VR8*  ;'       d    \        V 4      \         P                  RVR 3\	        W4      \         P                  RVR 33pV F%  w  rVrxV'       g   K  V! WpW4       \        W4        R# 	  \        V4      R8X  d   \         P                  RW4       R# \        V4      '       d   \        WW#R	7      # V# )
zìStep 1 of get_model_context_length: accept, repair, or drop a persisted entry. Returns the
value to use, or None to fall through to live resolution. Order matters: a value must be
rejected as bogus before any provider-specific handling.z;Dropping non-positive cache entry %s@%s -> %s; re-resolvingrø   zlDropping stale cached context entry %s@%s -> %s (known 32K underreport); re-resolving via hardcoded defaultsr”   zWDropping stale pre-catalog cache entry %s@%s -> %s; re-resolving via hardcoded defaultsNr7  z@Bypassing persistent cache for %s@%s (Nous portal authoritative)r¹  )
rV   rÑ   r´  rÁ  r®  rÂ  rH  rW   rÔ  rÄ  )	r*   rA   r¿  r!  Ú
drop_rulesr_  ÚlogÚmsgÚshowns	   &&&$     r   Ú_validate_cached_context_lengthrˆ  «  sé   € ð 
�1‰”f—n‘nÐ&cÐekÐlØ	�5‰×	NÐ	NÔGÈÓNÔPV×P[ÑP[Ø	wð  }Cð  DEð  |Fð	Hä	'¨Ó	6¼¿¹Ø	bÐgmÐnoÐfpð	sð	€Jó !+Ñˆ�#ß‰3Ù�˜HÔ,Ü-¨eÔ>Úñ	 !+ô   Ó)¨VÔ3Ü�‰ÐWÐY^ÔiÙô ˜×"Ò"Ü5°eÀvÔ_Ð_Ø€Mr   c                ó0   € V ^8„  d   QhR\         R\        /# )r)   rY   r+   )rk  r]   )r.   s   "r   r/   r/   Í  s   € ÷ /ñ /¬ð /´$ñ /r   c                óÜ   € \         P                  ! 4       p\        \        P	                  4       4       F.  w  r#W,
          \
        8¼  g   K  \        P                  VR4       K0  	  V \        9   # )zLPrune expired failures and check this home/endpoint/model/region's cooldown.N)rS   rT   r¤  r  r•   Ú"_BEDROCK_PROBE_FAILURE_TTL_SECONDSr÷  )rY   r–   r¾  Ú	failed_ats   &   r   Ú_bedrock_probe_failed_recentlyr�  Í  sT   € ä
�.Š.Ó
€CÜ#Ô$@×$FÑ$FÓ$HÖIÑˆØ�?Ô@Ö@Ü(×,Ñ,¨X°tÖ<ñ  Jð Ô.Ñ.Ð.r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# rœ  r\   )r.   s   "r   r/   r/   Ö  s!   € ÷ ñ ¤#ð ´ð ¼dñ r   c                 óž   € VR 8H  ;'       gB    \        T ;'       d/    \        V 4      P                  R4      ;'       d    \        V R4      4      # )Úbedrockzbedrock-runtime.zamazonaws.com)r]   r   r5   r   r   s   &&r   rþ  rþ  Ö  sU   € Ø�yÑ ÷ ð ¤DØ÷ 	=ð 	=Ô& xÓ0×;Ñ;Ð<NÓO÷ 	=ð 	=Ü! (¨OÓ<ó%ð r   c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# rŒ  r�  )r.   s   "r   r/   r/   Ý  s%   € ÷ ":ñ ":¬3ð ":¼#ð ":Ä(Ì3Å-ñ ":r   c                óÂ  €  ^ RI HpHpHp T;'       g    Rp\        YRR7      pTe
   T^ 8”  d   T# T'       d   \        P                  ! RT4      MRpT'       d   TP                  ^4      MRpT'       g3   \        P                  ! \        4      ;_uu_ 4        T! 4       pRRR4       ^ RIHp	 T	! 4       TP                  R	4      Y3p
T'       dd   \        T
4      '       gS   T! Y4      pT'       d'   \!        YTR
R7       \"        P%                  T
R4       T# \&        P(                  ! 4       \"        T
&   T! T RR7      #   \         d     R# i ; i  + '       g   i     L¶; i)a^  Step 1b: Bedrock static table + one cached live probe (Bedrock exposes no context window via
metadata APIs); None when boto3 is absent. Only provider-confirmed windows from a probe
or runtime error are reused. The table answers a call, never the cache. Keys use base_url,
or synthetic bedrock:// when absent, consistently with provider-error writers.)Úget_bedrock_context_lengthÚprobe_bedrock_context_lengthÚresolve_bedrock_regionNrý  T)r   zbedrock-runtime\.([a-z0-9-]+)\.rÍ   r  r   r�  )rG  F)rˆ  )Úagent.bedrock_adapterr“  r”  r•  ÚImportErrorr  r  re  r*  r¨  r©  r9   rt   r  r  r�  rÿ  r  r÷  rS   rT   )r*   rA   r“  r”  r•  Úcache_key_urlr¿  Ú_mÚregionr  r¾  Úprobeds   &&          r   Ú_resolve_bedrock_context_lengthrœ  Ý  s  € ð
ßzÑzð ×,Ð, €MÜ& uÈtÔT€FØÒ˜f qœjØˆ÷
 EMŒ�ŠÐ5°xÔ	@ÐRV€BßˆR�X‰X�aŒ[ B€FßÜ× Ò ¤×+Õ+Ù+Ó-ˆF÷ ,å0ÙÓ! =×#7Ñ#7¸Ó#<¸eÐL€HßÔ4°X×>Ò>Ù-¨eÓ<ˆßô )¨¸vÐPYÕZÜ(×,Ñ,¨X°tÔ<ØˆMÜ15·²Ó1AÔ$ XÑ.Ù% e°5Ô9Ð9øô7 ô Úðú÷ ,×+ús   ‚
D< ÂEÄ<EÅ
EÅE	c          
      óT   € V ^8„  d   QhR\         R\         R\         R\         R\        /# r·  r­  )r.   s   "r   r/   r/     s2   € ÷ $ñ $´3ð $Ä#ð $ÔPSð $Ô_bð $Ôgjñ $r   c                óÀ  € \        WVR7      pVe   V# \        V4      '       d   \        WW#4      MRpV'       d   V# \        WVR7      pVe   \	        WWc4       V# \
        P                  RW\        R 4       \        \        V P                  4       4      pV'       d1   \
        P                  RV^,          R W^ ,          4       V^,          # \        W4       \        # )zaSteps 2-3 for a truly custom endpoint: /models, local probes, Ollama /api/show, catalog, default.r¹  Nu‘   Could not detect context length for model %r at %s â€” defaulting to %s tokens (probe-down). Set model.context_length in config.yaml to override.r”   zUUsing hardcoded context length %s for model %r (custom endpoint, catalog match on %r))rß  rÔ  r¼  r•  r°  rV   rÁ  rÒ   ru  r¨  r"   rÓ   )r*   rA   r!  rG  r…  r»  r‰  r_  s   &&&&    r   Ú'_resolve_custom_endpoint_context_lengthrŸ    sá   € ä5°eÈwÔW€NØÒ!ØÐô TeÐem×SnÒSnÔ+¨E¸WÔOÐtx€IßØÐä
  ¸'Ô
B€CØ
‚Ü˜U¨cÔ<Øˆ
ä
‡K�Kð	?àÔ4°QÐ7ôô Ô4°e·k±k³mÓ
D€Cß
Ü�‰ÐkÐpsÐtuÕpvÐwxÐoyð  }Bð  HIõ  DJô  	KØ�1�vˆä! %Ô2Ü#Ð#r   c          
      óT   € V ^8„  d   QhR\         R\         R\         R\         R\        /# r·  r­  )r.   s   "r   r/   r/   "  s9   € ÷ Wñ W´cð WÄSð WÔSVð WÔbeð WÔjmñ Wr   c           	     ó`  € \        V 4      w  rEV'       dl   V'       dd   \        V 4      '       dS   \        W!4       \        W!\	        \        V 4      4      4      pV'       d"   Wd8  d   \        P                  RWVR 4       TpV'       d   \        P                  RVR W4       V# \        WW#4      # )u  Step 2 for a custom ``api_mode: codex_responses`` route â€” a Codex proxy on a generic URL.
The Codex OAuth table (with the opted-in ``-900k`` bump) answers first: the proxy's own /models
and the direct-API catalog both advertise the 1.05M direct window that Codex does not honour.
The proxy's context_window is never trusted; only an opted-in ``-900k`` variant asks the route's own
catalog (with the route's own key), and only for its max_context_window cap. Slugs the table does
not know take the ordinary endpoint probes.z4Route catalog at %s caps %r at max_context_window %sr”   zNUsing Codex OAuth context length %s for model %r (codex_responses route at %s))	r`  r  rC  rL  rò  r  rV   rÁ  rŸ  )r*   rA   r!  rG  r‰  Ú_sourcer€  s   &&&&   r   Ú*_resolve_custom_codex_route_context_lengthr£  "  sš   € ô CÀ5ÓI�L€Cß
�wÔ3°E×:Ò:ô 	7°wÔIÜ'¨Ô;KÔLnÐotÓLuÓ;vÓwˆß�3”9Ü�K‰KÐNÐPXÐdgÐhiÐcjÔlØˆCß
Ü�‰ÐdÐilÐmnÐhoÐrwô  	CØˆ
Ü2°5ÀGÓVÐVr   c                ó`   € V ^8„  d   QhR\         R\        R,          R\        \        ,          /# )r)   r*   r£  Nr+   ©r-   r¤  r   rj  )r.   s   "r   r/   r/   8  s*   € ÷ ñ ¤sð ¼dÀT½kð ÌhÔWZÍmñ r   c                óú  €  ^ RI HpHp ^ RIHp ^ RIHp V! 4       pVf	   V! V4      pT! VP                  R4      ;'       g    / V 4      P                  R4      ;'       g    / p\        VP                  R4      ;'       g    R4      P                  4       p\        VP                  R	4      ;'       g    R4      P                  4       p	V	'       dƒ   V'       d{   VP                  4       R8w  df   V! W‰R
7      p
\        YšP                  RR4      ;'       g    RV
P                  RR4      ;'       g    RV
P                  R4      ;'       g    TVR7      # R#   \         d    \        P                  RRR7        R# i ; i)uµ   Step 0a: MoA virtual provider â€” ``model`` is a preset name, so every probe would miss. Resolve
the aggregator's real provider+model (references are advisory). None on any failure.)Úget_compatible_custom_providersÚload_config)Úresolve_moa_preset)Úresolve_runtime_providerNÚmoaÚ
aggregatorrG  rÍ   r*   )Ú	requestedÚtarget_modelrA   r!  )rA   r!  rG  r£  z/MoA aggregator context-length resolution failedT)Úexc_info)rª  r§  r¨  Úhermes_cli.moa_configr©  Úhermes_cli.runtime_providerrª  r_   r-   r8   r"   Úget_model_context_lengthr9   rV   rW   )r*   r£  r§  r¨  r©  rª  r�  ÚaggÚagg_providerÚ	agg_modelÚrts   &&         r   Ú_resolve_moa_context_lengthr·  8  s@  € ðWßRÝ<ÝHÙ“ˆØÒ#Ù>¸vÓFÐÙ  §¡¨EÓ!2×!8Ð!8°b¸%Ó@×DÑDÀ\ÓR×XÐXÐVXˆÜ˜3Ÿ7™7 :Ó.×4Ð4°"Ó5×;Ñ;Ó=ˆÜ˜Ÿ™ Ó(×.Ð.¨BÓ/×5Ñ5Ó7ˆ	ßŸ¨,×*<Ñ*<Ó*>À%Ô*GÙ)°LÔYˆBÜ+Ø§F¡F¨:°rÓ$:×$@Ð$@¸bÈ"Ï&É&ÐQZÐ\^ÓJ_×JeÐJeÐceØŸ™ 
Ó+×;Ð;¨|ÐN^ôð ñ øô ô WÜ�‰ÐFÐQUˆÕVÙðWúsC   ‚A E ÁE Á!E Â1E Â3E ÃE ÃAE Ä/E Å	E Å"E:Å9E:c                óx   € V ^8„  d   QhR\         R\         R\         R\        R,          R\        \        ,          /# )r)   r*   rA   rG  r£  Nr+   r¥  )r.   s   "r   r/   r/   P  s=   € ÷ ñ ¬3ð ¼#ð Ìð Ô`dÐgkÕ`kð ÔpxÔy|Õp}ñ r   c                óØ  € V'       dY   V '       dQ   \         P                  ! \        4      ;_uu_ 4        ^ RIHp V! W 4      pVe   V^ 8”  d   VuuRRR4       # RRR4       V'       d[   V '       dS   \         P                  ! \        4      ;_uu_ 4        ^ RIHp V! WVR7      pV'       d   VuuRRR4       #  RRR4       R# R#   + '       g   i     Lt; i  + '       g   i     R# ; i)u  Steps 0b-0c: config-only overrides (never touch the network). 0b: EXPLICIT model_overrides
only â€” fill-gap _default entries apply inside lookup_models_dev_context once the catalog has
missed, so a _default can never preempt custom_providers or live probes. 0c: custom_providers.)Ú_override_context_windowN)Ú"get_custom_provider_context_length)r*   rA   r£  )r¨  r©  r9   Úagent.models_devrº  rª  r»  )r*   rA   rG  r£  rº  Úmo_ctxr»  Úcp_ctxs   &&&&    r   Ú_config_override_context_lengthr¿  P  s�   € ÷ —EÜ× Ò ¤×+Õ+ÝAÙ-¨hÓ>ˆFØÒ! f¨q¤jØ÷	 ,×+Ò+÷ —EÜ× Ò ¤×+Õ+ÝLÙ7¸eÐiyÔzˆFßØ÷	 ,Ò+ð ÷ ,ó
 ÷! ,×+ú÷ ,Ö+ñ
 ús   ³CÂCÃC	ÃC)	c                óv   € V ^8„  d   QhR\         R\         R\         R\         R\         R\        \        ,          /# )r)   r*   rA   r!  rG  Úeffective_providerr+   r�  )r.   s   "r   r/   r/   j  sK   € ÷ 6ñ 6´#ð 6Äð 6Ìsð 6Ô^að 6Ôwzð 6ô  @Hô  ILõ  @Mñ 6r   c                ó  a aa€ VR9   dQ   \         P                  ! \        4      ;_uu_ 4        ^ RIHp V! S SR7      pV'       d   VuuRRR4       #  RRR4       RVVV 3R lRVVV 3R l/P                  V4      pVe0   V! 4       w  rhp	V'       d   S'       d   W‰8X  d   \        S SV4       V# VR9   d   S'       d   \        S SSR7      pVe   V# S'       d:   \        S4      p
V
e   RV
9   d   \        S SSR7      MRpVe   \        S SWc4       V# VR	8X  dj   \        4       P                  S 4      ;'       g    / P                  R
4      p\        V\        4      '       d"   V^ 8”  d   VR8X  d   \        S 4      '       g   V# V'       dl   ^ RIHp V! VS 4      pV'       dU   \#        S 4      '       d   \$        P                  R4      MRpV'       d#   Wm8  d   \&        P)                  RVS VR 4       TpV# R#   + '       g   i     EL®; i)zFStep 5: provider-specific sources, tried in order; None when all miss.)Úget_copilot_model_contextr¹  Nr7  c                  óV   <€ \        SS;'       g    R S ;'       g    R R7      R,           # )rÍ   rr  )rc  )r�  r‘  s   €€€r   rq  Ú8_resolve_provider_aware_context_length.<locals>.<lambda>x  s&   ø€ Ô4°UÀXÇ^À^ÐQSÐ]d×]jÐ]jÐhjÔkÐnyÖyr   rŸ  c                  óV   <€ \        SS ;'       g    R S;'       g    R R7      R,           # )rÍ   r-  )rX  )r`  r‘  s   €€€r   rq  rÅ  y  sD   ø€ Ô OÐPUÐdk×dqÐdqÐoqð  }E÷  }Kð  }Kð  IKô  !Lð  OXö  !Xr   râ  r6  r…  rø   )Úlookup_models_dev_contextrí   z[Rejecting models.dev context=%s for %r (MiniMax-M3 underreport); using hardcoded default %sr”   >   r8  úcopilot-acpúgithub-copilot>   r=  Úcommandcodeúcommandcode-anthropic)r¨  r©  r9   Úhermes_cli.modelsrÃ  r_   r¯  rß  rH  r•  r°  r†  rk   rj  r�  r¼  rÇ  r¢  r¨  rV   rÁ  )r*   rA   r!  rG  rÁ  rÃ  r‰  Úsourcedr>  Ú
persist_onÚinferredÚor_ctxrÇ  Úcatalogs   fff&&         r   Ú&_resolve_provider_aware_context_lengthrÒ  j  sé  ú€ ð ÐIÔIÜ× Ò ¤×+Õ+ÝCÙ+¨E¸7ÔCˆCßØ÷	 ,Ò+ð ÷ ,ð 	ÖyØö  Xð÷ 
�cÐ
Óð ð ÒÙ")£)Ñˆ�Zßß˜FÔ0Ü# E¨8°SÔ9ØˆJØÐLÔL×QYô /¨u°hÈÔPˆØŠ?ØˆJ÷ Ü+¨HÓ5ˆØJRÒJZÐ^fÐjrÔ^rÔ$ U¨H¸gÕFÐx|ˆØŠ?Ü  ¨°#Ô@ØˆJð ˜\Ô)Ü&Ó(×,Ñ,¨UÓ3×9Ð9°r×>Ñ>Ð?OÓPˆä�fœc×"Ò" v°¤z¸6ÀU¼?ÔOhÐin×OoÒOoØˆMßÝ>Ù'Ð(:¸EÓBˆßäCbÐch×CiÒCiÔ-×1Ñ1°,Ô?ÐosˆGß˜3œ=Ü—‘ÐyÐ{~ð  AFð  KRð  STð  JUô  WØ�ØˆJÙ÷c ,×+Ð+ús   ­G8Ç8H		c                óˆ   € V ^8„  d   QhR\         R\         R\         R\        R,          R\         R\        R,          R\        /# ©	r)   r*   rA   r!  Úconfig_context_lengthNrG  r£  r+   ©r-   rj  r¤  )r.   s   "r   r/   r/   £  sX   € ÷ r$ñ r$Üðr$Üðr$Ü-0ðr$ÜNQÐTXÍjðr$äðr$ä*.°­+ðr$ô 	ñr$r   c                óø  € \        V\        4      '       d
   V^ 8”  d   V# T;'       g    RP                  4       P                  4       R8X  d   \	        W4      pVe   V# \        WWE4      pVe   V# V'       d     \        \        V4      4      P                  p\        T ;'       g    R4      P                  4       '       g#   \        P                  R\        R 4       \        # \        V 4      p \        WVR7      p \!        W4      pVe   V# ^ RIHp	 V	! V4      p
V
'       d   V
P'                  V 4      MRp\)        V4      \        J d
   V^ 8”  d   V# \+        W4      p\-        WAV4      pV'       d-   V'       g%   V'       g   \/        W4      '       g   \1        W4      MRpVe   \3        WWâR7      MRpVe   V# V'       d   \5        W4      MRpVe   V# VR	8X  g   V'       dD   \7        VR
4      '       d2   \9        Y;'       g    RVR7      pVe   V'       d   \;        WV4       V# \=        V4      '       d\   \?        V4      '       gK   T;'       g    RP                  4       P                  4       R8w  d   V'       d   \@        M\B        pV! WW$4      # VR8X  g   V'       d1   \E        V4      R8X  d!   \G        Y;'       g    RV4      pV'       d   V# TpV'       d%   V'       d   VR9   d   \I        V4      ;'       g    Tp\K        WW$V4      pVe   V# V'       ga   \M        4       pV V9   dP   VV ,          PO                  R\        4      pVR8X  d*   \Q        V 4      '       d   \        P                  RVV 4       MV# V'       d   \S        V4      '       d   \U        WW$4      MRpV'       d   V# \W        \X        V P                  4       4      pV'       d
   V^,          # \[        W4       \        #   \         d    Rp ELai ; i)aâ  Context length for a model. Resolution order: 0 config override / MoA aggregator /
model_overrides / custom_providers / endpoint-scoped; 1 persistent cache (Nous, LM
Studio, Codex OAuth bypass it) and Bedrock; 2-3 custom endpoints (/models, local
probe, Ollama); 4 Anthropic /v1/models (API keys only); 5 provider-aware (Copilot,
Nous, Codex OAuth, GMI, Ollama, OpenRouter live, models.dev); 6 OpenRouter for
unknown providers; 7 local server; 8 hardcoded defaults; 9 256K fallback.rÍ   r«  NuO   No model id provided for context length resolution â€” defaulting to %s tokens.r”   r   r3   r¹  r?  r>  zhttps://api.novita.ai/openai/v1rŸ  r1  r0  zhttps://api.anthropic.comr…  rø   znRejecting OpenRouter metadata context=%s for %r (known 32K underreport); falling through to hardcoded defaults>   Úcustomr6  ).rk   rj  r8   r"   r·  r¿  r
   rD   rN   r~  r-   rV   rÁ  rÒ   r?   rM  rš  r7   r4   r²  r  rþ  r«  r¡  r  rˆ  rœ  r   rß  r¯  r-  rP  r£  rŸ  r   rî  rH  rÒ  r†  r_   r´  rÔ  r¼  ru  r¨  rÓ   )r*   rA   r!  rÕ  rG  r£  r‰  r  Úendpoint_contextr4   r$   r"  Úis_bedrock_contextÚcodex_router¿  Ú	validatedÚresolverÁ  rO  rÐ  r»  r_  s   &&&&&&                r   r²  r²  £  s½  € ô Ð'¬×-Ò-Ð2GÈ!Ô2KØ$Ð$Ø�ˆ�B×ÑÓ×%Ñ%Ó'¨5Ô0Ü)¨%ÓBˆØŠ?ØˆJÜ
)¨%¸8Ó
V€CØ
‚Øˆ
÷ ð	ÜÔ,¨XÓ6Ó7×<Ñ<ˆAô
 ˆu�{ˆ{˜Ó×!Ñ!×#Ò#Ü�‰Ðeô  kCð  DEð  jFô  	HÜ'Ð'Ü" 5Ó)€Eô .¨eÐQYÔZ€Eô 7°uÓGÐØÒ#ØÐõ /Ù" 8Ó,€Gß9@ˆg×.Ñ.¨uÔ5Àd€GÜˆGƒ}œÓ ¨!¤ØˆÜ,¨XÓ@Ðô " (Ð6FÓG€Kç;C×L^×grô  |Zð  [c÷  |nò  |nÔ& uÔ7ð  tx€FØ]cÒ]oÔ/°ÀÕYÐuy€IØÒØÐ÷ ?QÔ
)¨%Ô
:ÐVZ€CØ
‚Øˆ
Ø�8Ô§Ô-BÀ8È_×-]Ò-]Ü.¨u×6cÐ6cÐBcÐmtÔuˆØŠ?ßÜ# E°SÔ9ØˆJô ˜8×$Ò$Ô-HÈ×-RÒ-RÐX`×XfÐXfÐdf×WmÑWmÓWo×WuÑWuÓWwð  |Jô  XJß@KÕ<ÔQxˆÙ�u¨Ó:Ð:à�;Ô§8Ô0AÀ(Ó0KÐObÔ0bÜ-¨e×5\Ð5\ÐA\Ð^eÓfˆßØˆJð "Ðß×+Ð/AÐE]Ô/]Ü5°hÓ?×UÐUÐCUÐÜ
0°À'ÐUgÓ
h€CØ
‚Øˆ
÷ Ü'Ó)ˆØ�HÔØ˜e•_×(Ñ(Ð)9Ô;SÓTˆFØ˜ŒÔ#MÈe×#TÒ#TÜ—‘ð  Mð  OUð  W\õ  ]à�÷ T\Ô`qÐrz×`{Ò`{Ô+¨E¸WÔOð  BF€IßØÐä
Ô4°e·k±k³mÓ
D€Cß
Ø�1�vˆä! %Ô2Ü#Ð#øôs ô 	Ø‹Hð	ús   Á9O( Ï(O9Ï8O9c                óˆ   € V ^8„  d   QhR\         R\         R\         R\        R,          R\         R\        R,          R\        /# rÔ  rÖ  )r.   s   "r   r/   r/   	  sk   € ÷ kñ k´ð k¼sð kÔRUð kÔsvÐy}Õs}ð kô  QTð kô  mqð  txõ  mxð kô  DGñ kr   c           
   ƒ  óZ   "  € ^ RI pVP                  \        WVW4VR7      G Rj  x€L
 #  L5i)z[get_model_context_length on a worker thread (its blocking HTTP would stall the event loop).N)rA   r!  rÕ  rG  r£  )ÚasyncioÚ	to_threadr²  )r*   rA   r!  rÕ  rG  r£  rà  s   &&&&&& r   Úget_model_context_length_asyncrâ  	  s;   é € ãØ×"Ñ"Ü  %ÀGØ3ÐYið #ó k÷ kð kñ kùs   ‚"+¤)¥+u,   [á„€-á‡¿âº€-é¿¿ê¥ -ê¥¿ê°€-íž¯ï¤€-ï«¿ï¼€-ï¿¯]c                ó0   € V ^8„  d   QhR\         R\        /# )r)   Úchr+   r\   )r.   s   "r   r/   r/   )	  s   € ÷ 3ñ 3¤ð 3¬ñ 3r   c                 ó0   € \         P                  V 4      R J# r   )Ú_CJK_DENSE_REÚ	fullmatch)rä  s   &r   Ú_is_cjk_token_dense_charrè  )	  s   € Ü×"Ñ" 2Ó&¨dÐ2Ð2r   c                ó0   € V ^8„  d   QhR\         R\        /# )r)   rê  r+   r­  )r.   s   "r   r/   r/   -	  s   € ÷ Wñ W¤ð W¬ñ Wr   c                ó\  € V '       g   ^ # \        V 4      p V P                  4       '       d   \        V 4      ^,           \        ,          # \        P                  RV 4      p\        V 4      \        V4      ,
          pV\        VP                  RR4      4      ^,           \        ,          ,           # )a  Rough token estimate: CJK/Hangul/Kana codepoints ~1 token each; everything else ceil(UTF-8 bytes/4).
Ceiling keeps short texts from estimating 0. Runs on every preflight walk, so all-ASCII stays O(1).

Byte-counting (not chars) is the corrective for non-CJK, non-ASCII text: Cyrillic/Greek/Arabic are 2
bytes/char so count ~chars/2, matching real BPE cost (~2-3 chars/token) where chars/4 under-counted
~2x and let sessions ride the provider ceiling below the compaction threshold. Calibrated vs
cl100k/o200k/Qwen2.5 (estimate/real): Russian 0.67->1.24, Arabic 0.53->0.96, Hindi 0.34->0.90,
Greek 0.37->0.68; accented Latin barely moves (French 1.02->1.03). errors="replace": lone surrogates
(routine in tool output; see message_sanitization) must not turn an estimate into a raise.rÍ   zutf-8r  )r-   ÚisasciirU  ÚCHARS_PER_TOKENræ  r  r+  )rê  r  Údenses   &  r   Úestimate_tokens_roughrî  -	  sz   € ÷ ÙÜˆt‹9€DØ‡|�|‡~‚~Ü�D“	˜A•¤/Õ1Ð1Ü× Ñ   TÓ*€HÜ�‹Iœ˜H›Õ%€EØ”S˜Ÿ™¨°)Ó<Ó=ÀÕAÄoÕUÕVÐVr   Úcharge_stale_thinkingTc                ót   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        R\
        /# )r)   Úmessagesrï  r+   )r¤  rx   r-   r   r]   rj  )r.   s   "r   r/   r/   A	  s5   € ÷ Uñ U¬T´$´s¼C°xµ.Õ-Að UÔ]að UÔmpñ Ur   c               ón   a€ ^ RI Hp V! 4       oV'       g   \        V 4      p \        V3R lV  4       4      # )u-  Rough token estimate for a message list (pre-flight only). Images cost the per-image price
learned from provider usage (``agent.image_token_cost``; flat default before calibration)
rather than their base64 length. ``charge_stale_thinking=False`` mirrors the tail-budget
walk (``context_compressor._estimate_msg_budget_tokens``): on non-echo routes stale reasoning
rides the wire only for the NEWEST assistant turn, so excluding it keeps the compaction TRIGGER
in the same size class as the walk â€” otherwise reasoning-heavy sessions fire preflight forever.)Úcurrent_image_token_costc              3   ó<   <"  € T F  p\        VS4      x € K  	  R # 5ir   )Ú_estimate_message_tokens_cached)r#   r†  Ú
image_costs   & €r   r&   Ú1estimate_messages_tokens_rough.<locals>.<genexpr>M	  s   øé € ÐTÉ8ÀCÔ.¨s°J×?Ð?Ë8ùó   ƒ)Úagent.image_token_costró  Ú"_strip_stale_thinking_for_estimateÚsum)rñ  rï  ró  rö  s   &$ @r   Úestimate_messages_tokens_roughrü  A	  s/   ø€ õ @á)Ó+€Jß Ü5°hÓ?ˆÜÔTÉ8ÓTÓTÐTr   c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# ©r)   rñ  r+   ©r¤  rx   r-   r   rj  )r.   s   "r   r/   r/   P	  s(   € ÷ ñ ¼dÄ4ÌÌSÈÅ>Õ>Rð ÔWZñ r   c                óf   € ^ RI Hp V! V 4      w  r#\        V4      \        R V 4       4      ,           # )zXEstimate native Anthropic messages with replayed readable thinking charged exactly once.©Ú&native_anthropic_accounting_projectionc              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   ©rî  ©r#   rê  s   & r   r&   ÚBestimate_native_anthropic_messages_tokens_rough.<locals>.<genexpr>U	  s   é € ð ;Ù0A¨Ô˜d×#Ð#Ó0Aùó   ‚)Úagent.message_sanitizationr  rü  rû  )rñ  r  Ú	projectedÚreplayed_thinkings   &   r   Ú/estimate_native_anthropic_messages_tokens_roughr  P	  s8   € åQá#IÈ(Ó#SÑ €IÜ)¨)Ó4´sñ ;Ù0Aó;ó 8õ ð r   Úsystem_promptÚtoolsc          
      óÎ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        R\        \         \        \        \        3,          ,          ,          R\
        /# )r)   rñ  r  r  r+   )r¤  rx   r-   r   r   rj  )r.   s   "r   r/   r/   Z	  sS   € ÷ 
Gñ 
GÜ”4œœS˜•>Õ"ð
GÜ69ð
Gä”Dœœc¤3˜h�Õ(Õ)ð
Gô 	ñ
Gr   c               ój   € ^ RI Hp V! V 4      w  rE\        WAVR7      \        R V 4       4      ,           # )zWRequest estimate for native Anthropic; opaque replay bytes never enter text accounting.r  )r  r  c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   r  r  s   & r   r&   ÚAestimate_native_anthropic_request_tokens_rough.<locals>.<genexpr>d	  s   é € ÐFÑ4E¨DÔ! $×'Ð'Ó4Eùr  )r  r  Úestimate_request_tokens_roughrû  )rñ  r  r  r  r	  r
  s   &$$   r   Ú.estimate_native_anthropic_request_tokens_roughr  Z	  s=   € õ
 Rá#IÈ(Ó#SÑ €IÜ(Ø°eôäÑFÑ4EÓFÓFõGð Gr   c                ó    € V ^8„  d   QhR\         \        \        \        3,          ,          R\         \        \        \        3,          ,          /# rþ  )r¤  rx   r-   r   )r.   s   "r   r/   r/   l	  s7   € ÷ 
ñ 
´´d¼3Ä¸8µnÕ1Eð 
Ì$ÌtÔTWÔY\ÐT\Í~ÕJ^ñ 
r   c                óø  a aa€ R R lo\        VV 3R l\        \        S 4      ^,
          RR4       4       R4      p\        S 4       UUaUUu. uF•  w  poW!8w  dˆ   S! S4      '       dz   \        ;QJ d#    V3R l\
         4       F  '       g   K   RM	  RM! V3R l\
         4       4      '       d2   SP                  4        UUu/ uF  w  rEV\
        9  g   K  WEbK  	  uppMSNK—  	  upppp# u uppi u uppppi )z¹Copy of ``messages`` with stale thinking keys removed (newest kept). Shallow stripped copies
share the original value objects, so the per-message memo still hits for the stripped shape.c                ó0   € V ^8„  d   QhR\         R\        /# )r)   rË  r+   )r   r]   )r.   s   "r   r/   Ú8_strip_stale_thinking_for_estimate.<locals>.__annotate__o	  s   € ÷ Dñ Dœð D¤ñ Dr   c                 óZ   € \        V \        4      ;'       d    V P                  R 4      R8H  # )ÚroleÚ	assistantrÊ  )rË  s   &r   Ú_is_assistantÚ9_strip_stale_thinking_for_estimate.<locals>._is_assistanto	  s$   € Ü˜!œTÓ"×CÐC q§u¡u¨V£}¸Ñ'CÐCr   c              3   óV   <"  € T F  pS! SV,          4      '       g   K  Vx € K   	  R # 5ir   r   )r#   Úir  rñ  s   & €€r   r&   Ú5_strip_stale_thinking_for_estimate.<locals>.<genexpr>q	  s#   øé € Ð]Ñ>˜Á-ÐPXÐYZÕP[×B\—1’1Ó>ùs   ƒ)Ÿ
)c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir   r  )r#   r—   rË  s   & €r   r&   r  t	  s   øé € Ð3dÑFcÀ°A·E±E¸!·H°HÓFcùr  TFr  )r˜  ÚrangerU  Ú	enumerater  Ú_STALE_THINKING_ESTIMATE_KEYSr•   )rñ  Únewestr  rË  r—   r˜   r  s   f  `  @r   rú  rú  l	  sÂ   ú€ õDäÕ]œe¤C¨£M°AÕ$5°r¸2Ô>Ó]Ð_aÓb€Fô ˜hÔ'÷ñ (‰DˆAˆqð Œ;™=¨×+Ò+·³Ô3dÕFcÓ3d··²Ô3dÕFcÓ3d×0dÒ0dð Ÿ'™'œ)ÔN™)‘$�! qÔ0MÑ'MŒˆŠ™)ÓNØjkò	lá'ôð ùÛNùõs6   ÁC4
Á)
C4
Á4C4
Â!C4
Â1C4
ÃC.ÃC.Ã
C4
Ã.C4
rw  c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r)   r%   Úpinsr+   )r   r¤  )r.   s   "r   r/   r/   ‹	  s!   € ÷ 8ñ 8œCð 8¤tð 8´ñ 8r   c                 óJ  a€ V e   V RJ g   V RJ d   V # \        V 4      pV\        J d   SP                  V 4       R\        V 4      3# V\        J g   V\
        J d   RVP                  V 3# V\        J dR   R\        ;QJ d&    . V3R lV P                  4        4       F  NK  	  53# ! V3R lV P                  4        4       4      3# V\        J g   V\        J dB   V\        J d   RMR\        ;QJ d    . V3R	 lV  4       F  NK  	  53# ! V3R	 lV  4       4      3# \        R
4      h)NTFrÎ  ÚnÚdc              3   óX   <"  € T F  w  r\        VS4      \        VS4      3x € K!  	  R # 5ir   ©Ú_msg_fingerprint)r#   r—   r˜   r&  s   &  €r   r&   Ú#_msg_fingerprint.<locals>.<genexpr>•	  s,   øé € ÐlÑ^kÑVZÐVWÔ,¨Q°Ó5Ô7GÈÈ4Ó7PÕQÓ^kùs   ƒ'*ÚlÚtc              3   ó<   <"  € T F  p\        VS4      x € K  	  R # 5ir   r+  )r#   r˜   r&  s   & €r   r&   r-  —	  s   øé € Ð0ZÑTYÈqÔ1AÀ!ÀT×1JÐ1JÓTYùrø  zunfingerprintable message value)r  r-   Úappendrt  rj  rˆ   Ú__name__rx   rk  r•   r¤  r~  )r%   r&  r/  s   &f r   r,  r,  ‹	  sô   ø€ Ø‚}˜ ›¨°%«ØˆÜˆU‹€AØŒCƒxØ�‰�EÔØ”R˜“YÐÐØŒCƒx�1œ“:Ø�Q—Z‘Z Ð'Ð'ØŒDƒyØ—U”UÔlÐ^c×^iÑ^iÔ^kÓl—UÐmÐm�UÔlÐ^c×^iÑ^iÔ^kÓlÓlÐmÐmØŒDƒy�Aœ“JØœD“y‘ c¯5¬5Ô0ZÑTYÓ0Z¯5Ð[Ð[¨5Ô0ZÑTYÓ0ZÓ+ZÐ[Ð[Ü
Ð6Ó
7Ð7r   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r)   r†  rö  r+   )r   rj  )r.   s   "r   r/   r/   ›	  s!   € ÷ ñ ¬ð ¼#ð Ä#ñ r   c                óV  a € R V 3R llp . p\        \        S 4      \        J d   \        S 4      MS V4      p\	        V4       \        P                  T4      pTe   T^,          T^,          T,          ,           # T! 4       w  rVYVT,          ,           pY5T3\        T&   \        \        4      \        8”  d/    \        P                  \        \        \        4      4      4       KF  T#   \
         d    T! 4       w  rVYVT,          ,           u # i ; i  \        \        \        3 d     T# i ; i)z�Text tokens + images x ``image_cost``; the memo holds text and image COUNT so a recalibrated
per-image price re-prices cached rows without invalidating them.c                óF   € V ^8„  d   QhR\         \        \        3,          /# rœ   )rk  rj  )r.   s   "r   r/   Ú5_estimate_message_tokens_cached.<locals>.__annotate__ž	  s   € ÷ Yñ Y”eœC¤˜H•oñ Yr   c                  ó2   <€ \        S 4      \        S ^4      3# )é   )Ú'_estimate_message_tokens_without_imagesÚ_count_image_tokens©r†  s   €r   Ú_computeÚ1_estimate_message_tokens_cached.<locals>._computež	  s   ø€ Ü6°sÓ;Ô=PÐQTÐVWÓ=XÐXÐXr   )r,  r  rx   r   Úhashr9   Ú_MSG_TOKENS_CACHEr_   rU  Ú_MSG_TOKENS_CACHE_MAXr÷  r˜  rÜ  ÚStopIterationr5  ÚRuntimeError)	r†  rö  r<  r&  rY   rê  Úimagesr¿  Útokenss	   f&       r   rõ  rõ  ›	  s  ø€ ÷Yð Yð	*Øˆô Ü/3°C«y¼DÓ/@Ô& sÔ+ÀcÈ4óQˆäˆSŒ	ô ×"Ñ" 3Ó'€FØÒØ�a�y˜6 !�9 zÕ1Õ1Ð1Ù“:�L€DØ˜ZÕ'Õ'€FØ"¨&Ð1Ô�cÑÜ
ÔÓ
 Ô#8Ô
8ð	Ü×!Ñ!¤$¤tÔ,=Ó'>Ó"?Ö@ð €Møô ô *Ù“z‰ˆØ˜zÕ)Õ)Ò)ð*ûô œx¬Ð6ô 	ØØ€Mð	ús#   Œ7C% Â6+D Ã%#DÄ
DÄD(Ä'D(c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r)   r€  Útypesr+   )r   Úsetrj  )r.   s   "r   r/   r/   ¸	  s&   € ÷ ~ñ ~œð ~¤Cð ~¬Cñ ~r   c                 ó^   a€ \        V \        4      '       d   \        V3R  lV  4       4      # ^ # )c              3   óˆ   <"  € T F7  p\        V\        4      '       g   K  VP                  R 4      S9   g   K3  ^x € K9  	  R# 5i)r  NrÊ  )r#   ÚpartrF  s   & €r   r&   Ú_count_parts.<locals>.<genexpr>¹	  s/   øé € Ð[™U�T¤j°´t×&<ŒqÀÇÁÈ&ÓAQÐUZÑAZ�qŠq›Uùs   ƒA A¸
A)rk   r¤  rû  )r€  rF  s   &fr   Ú_count_partsrL  ¸	  s(   ø€ Ü_iÐjoÔqu×_vÒ_vŒ3Ô[™UÓ[Ó[Ð}Ð|}Ð}r   c                ó^   € V ^8„  d   QhR\         \        \        3,          R\        R\        /# )r)   r†  Úcost_per_imager+   ©rx   r-   r   rj  )r.   s   "r   r/   r/   ¿	  s)   € ÷ "ñ "œT¤#¤s (�^ð "¼Sð "ÄSñ "r   c                ó¸  € \        V \        4      '       g   ^ # V P                  R4      p\        V\        4      pV\        V P                  R4      R04      ,          p\        V\        4      '       d<   VP                  R4      '       d%   V\        VP                  R4      RR04      ,          pV\        V P                  R4      \        4      ,          pW1,          # )zECount image-like content parts in a message; return their token cost.ÚcontentÚ_anthropic_content_blocksÚimageÚ_multimodalÚ	image_urlr]  )rk   rx   r_   rL  Ú_IMAGE_PART_TYPES)r†  rN  rQ  rØ  s   &&  r   r:  r:  ¿	  sª   € ä�cœ4× Ò ÙØ�g‰g�iÓ €GÜ˜Ô"3Ó4€EØ	Œ\˜#Ÿ'™'Ð"=Ó>ÀÀ	ÓJÕJ€Eä�'œ4× Ò  W§[¡[°×%?Ò%?Ø”˜gŸk™k¨)Ó4°wÀÐ6LÓMÕMˆð 
Œ\˜#Ÿ'™' (Ó+Ô->Ó?Õ?€EØÕ!Ð!r   c                ó0   € V ^8„  d   QhR\         R\         /# )r)   r•   r+   r  )r.   s   "r   r/   r/   Ï	  s   € ÷ 	ñ 	¤Sð 	¬Sñ 	r   c                óþ   € \        V \        4      '       g   V # V  UUUu. uFH  p\        V\        4      '       d.   VP                  4        UUu/ uF  w  r#Y"R8X  d   RMTbK  	  uppMTNKJ  	  uppp# u uppi u upppi )zö``codex_reasoning_items`` with ``encrypted_content`` blanked for local token estimation.
The ciphertext is priced by the provider's own count, never by its bytes (a compaction
checkpoint alone can be 5M chars, #100611); only real usage prices it.Úencrypted_contentrÍ   )rk   r¤  rx   r•   )r•   r  r—   r˜   s   &   r   Ústrip_opaque_replay_itemsrZ  Ï	  sz   € ô �eœT×"Ò"Øˆñ õáˆDô R\Ð\`Ôbf×QgÒQgÀÇ
Á
ÄÔMÁ¹¸ˆÐ+Ô+‰R°Ò	2ÁÓMÐmqÒqÙóð ùÛMùôs   Ÿ.A8ÁA2Á#
A8Á2A8c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# ©r)   r†  r+   r´   )r.   s   "r   r/   r/   Û	  s*   € ÷ 2ñ 2œd¤3¬ 8�nð 2´´c¼3°hµñ 2r   c                óà  € V P                  R4      p\        V\        4      ;'       d(    \        V4      ;'       d    V P                  R4      R9   pV P                  R4      p\        V\        4      ;'       d    \        VP	                  4       4      p/ pV P                  4        EFº  w  rgV\        9   g   V\        9   g   VR8X  d   V'       d   K-  VR8X  d   V'       d   WuR&   KB  KD  VR8X  d   V'       d   KU  VR8X  dr   \        V\        4      '       d\   V Uu. uFJ  p\        V\        4      '       d0   VP                  R4      \        9   d   RVP                  R4      RR/MTNKL  	  upWV&   KÍ  VR8X  dE   \        V\        4      '       d/   VP                  R	4      '       d   VP                  R
R4      WV&   EK  VR8X  ds   \        V\        4      '       d]   V Uu. uFJ  p\        V\        4      '       d0   VP                  R4      \        9   d   RVP                  R4      RR/MTNKL  	  upWV&   EK‘  VR8X  d   \        V4      WV&   EK¨  VR8X  d   RWV&   EK¶  WuV&   EK½  	  V# u upi u upi )uŠ  Shadow of a message holding only what the provider actually receives.
* ``api_content`` SUBSTITUTES ``content`` (mirrors ``turn_context.substitute_api_content`` exactly):
  only a non-empty STRING sidecar on a user/assistant row displaces content; substituting any
  other shape would UNDERcount â€” the dangerous direction.
* Base64 images become a placeholder; ``_count_image_tokens`` charges them flat.
* ``reasoning`` never ships as-is (request builds pop it after optionally promoting it into
  ``reasoning_content``); counting both inflated estimates up to +53%.
* Opaque provider blobs (``encrypted_content`` on codex reasoning / compaction items) are
  ciphertext the provider prices by its OWN token count, never by bytes; a native compaction
  checkpoint alone can be 5M chars (#100611). They contribute 0 here: only real usage ever
  prices them, and the usage anchor carries that price forward.Úapi_contentr  Úreasoning_contentÚ	reasoningrQ  r  rS  z
[stripped]rT  Útext_summaryrÍ   r]  Úcodex_reasoning_itemsrY  )Úuserr  )r_   rk   r-   r]   r8   r•   r   r   r¤  rx   rV  rZ  )	r†  ÚsidecarÚsidecar_winsÚ_rcÚdrop_reasoning_dupÚshadowr—   r˜   rJ  s	   &        r   Ú_wire_message_shadowri  Û	  s$  € ð �g‰g�mÓ$€GÜ˜g¤sÓ+×jÐj´°W³×jÐjÀ#Ç'Á'È&Ã/ÐUjÑBj€LØ
�'‰'Ð%Ó
&€CÜ# C¬Ó-×CÐC´$°s·y±y³{Ó2CÐØ€FØ—	‘	—‰ˆØÔ&Ô&¨!Ô/NÔ*NÐSTÐXcÔSc×hzÙØ�ÔßØ$%�yÓ!ñ à�)Œ^§ÙØ�)Œ^¤
¨1¬d× 3Ò 3ñ
 ó	ñ �Dô ˜d¤D×)Ò)¨d¯h©h°vÓ.>ÔBSÔ.Sð ˜Ÿ™ &Ó)¨7°LÑAàòñ ñ	ˆF‹Ið �)Œ^¤
¨1¬d× 3Ò 3¸¿¹¸m×8LÒ8LØŸ™˜n¨bÓ1ˆFŒIØ�(Œ]œz¨!¬T×2Ò2ñ ó	ñ �Dô ˜d¤D×)Ò)¨d¯h©h°vÓ.>ÔBSÔ.Sð ˜Ÿ™ &Ó)¨7°LÑAàòñ ñ	ˆFŒIð Ð)Ô)Ü1°!Ó4ˆFŒIØÐ%Ô%ØˆFŒIà�1ŒIñA ðB €Mùò1ùòs   ÄAI&ÇAI+c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# r\  rO  )r.   s   "r   r/   r/   
  s&   € ÷ cñ c´´c¼3°hµð cÄCñ cr   c                ó|   € \        \        \        V \        4      '       d   \	        V 4      4      4      # T 4      4      # )zAToken estimate for a message shadow with image payloads stripped.)rî  r-   rk   rx   ri  r;  s   &r   r9  r9  
  s1   € ä ¤Ä*ÈSÔRV×BWÒBWÔ%9¸#Ó%>Ó!aÓbÐbÐ]`Ó!aÓbÐbr   c          
      óÚ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        R\        \         \        \        \        3,          ,          ,          R\
        R\        /# )r)   rñ  r  r  rï  r+   )r¤  rx   r-   r   r   r]   rj  )r.   s   "r   r/   r/   
  s]   € ÷ ñ Ü”4œœS˜•>Õ"ðÜ69ðÜGOÔPTÔUYÔZ]Ô_bÐZbÕUcÕPdÕGeðô FJðäñr   c               óÀ   € V'       d   \        V4      M^ pV '       d'   YC'       d   \        V 4      M\        V RR7      ,          pV'       d   V\        V4      ,          pV# )u  Rough token estimate for a full request: system prompt + messages + tool schemas (50+ tools
add 20-30K on their own). ``charge_stale_thinking`` is forwarded â€” pass False when the route
provably strips stale thinking (``message_sanitization.stale_thinking_reaches_wire``).F)rï  )rî  rü  Ú_estimate_tools_tokens_rough)rñ  r  r  rï  Útotals   &$$$ r   r  r  
  sY   € ÷ 5BÔ! -Ô0Àq€EßàÖ=RÔ/°Ô9ÔXvÐwð  X]ô  Y^õ  	^ˆßØÔ-¨eÓ4Õ4ˆØ€Lr   é   c                ó0   € V ^8„  d   QhR\         R\        /# )r)   Útoolr+   )r   r-   )r.   s   "r   r/   r/   *
  s   € ÷ 1ñ 1œsð 1¤sñ 1r   c                 ó,  € \        V \        4      '       g   R # V P                  R4      p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   TMV P                  R4      p\        V\        4      '       d   V# R # )rÍ   Úfunctionr    N)rk   rx   r_   r-   )rr  Úfnr    s   &  r   Ú_tool_name_for_cacherv  *
  sn   € Ü�dœD×!Ò!ÙØ	�‰�*Ó	€BÜ'¨¬D×1Ò1ˆ2�6‰6�&Œ>°t€DÜ˜d¤C×(Ò(‰4¨d¯h©h°vÓ.>€DÜ˜d¤C×(Ò(ˆ4Ð0¨bÐ0r   c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# )r)   r  r+   rÿ  )r.   s   "r   r/   r/   3
  s'   € ÷ ñ ¬¬T´#´s°(­^Õ(<ð Äñ r   c           
      óÌ  € V '       g   ^ # \        V 4      p\        V 4      \        V ^ ,          4      \        V R,          4      3p\        P	                  V4      pVe   VR,          V8X  d
   V^,          # ^ pV  FØ  p\        V\        4      '       g   K  VP	                  R4      p\        V\        4      '       d   TMTpVP	                  R4      ;'       g    / pT\        R VP	                  R4      ;'       g    RVP	                  R4      ;'       g    R3 4       4      ,          p V\        \        P                  ! VR	RR
7      4      ,          pKÚ  	  V^,           ^,          p	\        \        4      \        8¼  d-   \        P                  \        \        \        4      4      R4       . VOV	N5\        V&   V	#   \         d!    T\        \        T4      4      ,          p EKj  i ; i)ro   N:Né   Nrt  r{  c              3   óh   "  € T F(  p\        V\        4      '       g   K  \        V4      x € K*  	  R # 5ir   )rk   r-   rU  r2  s   & r   r&   Ú/_estimate_tools_tokens_rough.<locals>.<genexpr>C
  s&   é € ÐwÑ+` aÔdnÐopÔru×dvœ6œ3˜qŸ6˜6Ó+`ùs   ‚2Ÿ2r    rÍ   ÚdescriptionF)Úensure_asciir’   r  r“   )rt  rU  rv  Ú_TOOLS_TOKENS_CACHEr_   rk   rx   rû  r   Údumpsr9   r-   Ú_TOOLS_TOKENS_CACHE_MAXr÷  r˜  rÜ  )
r  rY   Ú	signaturer¿  Útotal_charsrr  ru  rË  rœ  rD  s
   &         r   rn  rn  3
  s�  € ßÙÜ
ˆU‹)€CÜ�U“Ô1°%¸µ(Ó;Ô=QÐRWÐXZÕR[Ó=\Ð]€IÜ ×$Ñ$ SÓ)€FØÒ˜f R�j¨IÔ5Ø�a�yÐà€KÛˆÜ˜$¤×%Ò%ÙØ�X‰X�jÓ!ˆÜ˜r¤4×(Ò(‰b¨dˆØ—‘˜Ó&×,Ð,¨"ˆØ”sÑw¨C¯G©G°F«O×,AÐ,A¸rÀ3Ç7Á7È=ÓCY×C_ÐC_Ð]_Ñ+`ÓwÓwÕwˆð	,Øœ3œtŸzšz¨&¸uÐQ[Ô\Ó]Õ]ŠKñ ð ˜A�o !Õ#€FÜ
ÔÓÔ#:Ô:Ü×Ñ¤¤TÔ*=Ó%>Ó ?ÀÔFØ3 Ð3¨FÑ3Ô˜ÑØ€Møô ô 	,Øœ3œs 6›{Ó+Õ+ŒKð	,ús   Ä')F8Æ8&G#Ç"G#c                ón  € V ^8„  d   Qh/ ^ \         9   d   \        \        ,          ;R&   ^\         9   d,   \        \        \        \        \        3,          3,          ;R&   ^\         9   d
   \
        ;R&   ^\         9   dN   \        \        \        \        3,          \        \        \        \        \        3,          3,          3,          ;R&   ^\         9   d,   \        \        \        \        3,          \
        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \
        3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \        \        3,          ;R	&   ^	\         9   d   \        \        \
        3,          ;R
&   ^
\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d=   \        \        \        \        \        \        3,          \
        3,          3,          ;R&   ^\         9   d,   \        \        \        \        \        3,          3,          ;R&   ^\         9   d1   \        \        \        \        \        \        3,          3,          ;R&   ^\         9   d6   \        \        \        \        \        \        \        3,          3,          ;R&   # )r)   Ú_PROVIDER_PREFIXESr|  r}  rÀ  rÁ  rò  rU   rÏ   r  r  rD  r\  r  r  r1  r@  r?  r~  )
Ú__conditional_annotations__Ú	frozensetr-   rx   r   rˆ   rk  rG  rj  r¤  )r.   s   "r   r/   r/      sz  € ÷ ñ ÷Jò ”Iœc•Nñ ñK÷@ 6Ò 5”tœC¤¤c¬3 h¥Ð/Õ0Ñ 5ñA÷B &Ò %œEÑ %ñC÷J VÒ U¤¤U¬3´¨8¥_´d¼3ÄÄSÌ#ÀXÅÐ;NÕ6OÐ%OÕ PÑ UñK÷L GÒ F¤T¬%´´S°­/¼5Ð*@Õ%AÑ FñM÷d 2Ò 1œD¤¤e Õ,Ñ 1ñe÷l 1Ò 0œ4¤¤U 
Õ+Ñ 0ñm÷@ Ò ”#Ñ ñA÷j 0Ò /œœU¤E˜\Õ*Ñ /ñk÷~ 6Ò 5œd¤5¬% <Õ0Ñ 5ñ÷vò ”$”sœC�x•.ñ ñw÷x3ò œt¤C¬ H�~ñ ñy3÷V4ò ´´c¼3°hµñ ñW4÷\4ò ¬d´3¼°8­nñ ñ]4÷l6 IÒ HœD¤¤e¬D´´c°­N¼EÐ,AÕ&BÐ!BÕCÑ Hñm6÷r6 ?Ò >¤¤S¬$¬s´C¨x­.Ð%8Õ 9Ñ >ñs6÷LL 9Ò 8”4œœU¤4¬¬c >Õ2Ð2Õ3Ñ 8ñML÷JQ ?Ò >”Tœ#œu¤S¬#¬s´CÐ%7Õ8Ð8Õ9Ñ >òKQr   )r2   )rÇ   rÈ   rÉ   i }  i€>  i@  )zgrok-3-minizgrok-4.20-multi-agentrô   ró   rò   >   rÕ   rÖ   úclaude-opus-5-5)r…  r<  Úcontext_sizeÚmax_context_lengthÚmax_position_embeddingsÚmax_model_lenrí  Úmax_sequence_lengthÚmax_seq_lenÚn_ctx_trainr¥  Úctx_size)ru  r_  r$  )Ú	localhostz	127.0.0.1z::1z0.0.0.0)z.docker.internalz.containers.internalz.lima.internal)rÍ   )rÍ   rÍ   )rù   >   Úk3rö   úkimi-k3-cot)r'  r(  )rF  rH  rR  rY  )F)rÍ   F)©zrange of max_tokens should be)Úavailable_tokens)úavailable tokens©zin the outputúmaximum context length)r­  r!  )z	should be)zless than or equal)zmust be©zexceeds modelzmaximum output tokens©r   )ú'maximum allowed number of output tokens©zmax_tokens is too largezsupports at most©ztokens from the input messagesr`  ©z
limited to)zprompt is too longzprompt too longzinput is too longzinput tokenzprompt lengthzprompt containszreduce the length))r$  r”  )r$  r•  r–  )r—  r­  r!  )r—  zin the completion)r—  zfor the completionr“  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Ø   rÙ   )rÍ   rÍ   NrÍ   N)r`  r_  >   rS  rU  Úinput_image(  r…  Ú__doc__r¨  r)  rÊ  r   Úloggingr  rS   Úpathlibr   Útypingr   r   r   r   r   r	   Úurllib.parser
   Úhermes_yamlrè  Úagentr   r  r   r   Úagent.model_metadata_llamacppr   Úutilsr   r   r   rt   r   r   Úagent.message_metadatar   r   r   Ú	getLoggerr2  rV   r7   r   r   r9   r†  r„  ÚcompileÚ
IGNORECASEr:   ÚIPv4NetworkrÐ  r?   r|  r}  r~  rÀ  rÁ  rÁ   ró  rô  rò  rX   rU   rF   rP   rZ   ra   rg   rf   r¥   ru   rƒ   r‹   rš   rŸ   r¦   r©   r¬   r²   r¶   r¹   r¼   rÂ   rÆ   r  rÒ   rG  rÏ   rÓ   r´  rŠ  r  r‹  r  r¨  r  r
  r  r  r  r  r  r   r‰  rÈ  rÉ  rD   r)  r-  rD  Ú_ppÚget_hostnameÚ_hostr    rH  rM  rP  rW  r]  rb  Újoinr  rd  rc  rg  ru  rŠ  r™  rš  r¡  r«  r°  rµ  r¼  rÄ  rÔ  rZ  rÿ  r  r  r  r!  r&  r6  r1  r4  r:  rk  rp  r†  r‹  r’  r—  r·  r¼  rÂ  rÅ  rÖ  rß  râ  rë  rî  rò  r¯  rÿ  r  rÂ  r  r-  r3  r8  r:  rK  ra  rb  r>  r?  r=  rc  rh  ro  rs  ry  r…  r‹  r•  r�  r�  r¢  r©  r®  r±  r´  rº  r¼  rÄ  rÐ  r¸  rf  rî  r\  r  r  rT  rù  rû  rú  rö  rò  rü  rÿ  r  r  r
  r  r1  r@  r2  r3  r  r  r  r  ÚCODEX_MODELS_CATALOG_URLSr"  r&  r.  r5  rC  rH  rL  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õ  rL  rV  r:  rZ  ri  r9  r  r~  r€  rv  rn  r/   )r…  s   @r   Ú<module>r²     sd  øð÷ð ó Û Û Û Û Û 	Û Ý ß =× =Ý !ã å %ß QÝ :ç MÑ Mç Kß vÑ và	×	Ò	˜8Ó	$€ðÝ;ñ
 &/ñ /á"Ô$ó/ó &Ð ó ð
 —j’jÐ!iÐkm×kxÑkxÓyÐ ð ×(Ò(¨Ó9Ð õð  46Ð Ó 5Ø$%Ð Ó %ØÐ ð TVÐ Ó UØDFÐ #Ó FØÐ ð %Ð ð ',Ð #Ø/1Ð Ó 1ð #'Ð Ø.0Ð Ó 0÷Wð WõõEõõ,õ1ð !&Ð õ.õ
õ
ð7ð  }B÷ 7õ5õIõ
hõ
9õ
õõSõ7õ
8õcó HÐ Ø.¨qÕ1Ð Ù›Ð Ó õ

ð  Ð ð  $Ð Ø-/Ð Ó /ð &+Ð "Ø35Ð Ó 5ðJð �gðJð  .¨wðJð 9HÈðJð SdÐelðJð �wð	Jð !2°7ð	Jð =NÈwð	Jð YjÐkrð	Jð
 �wðJð
 !4°WðJð
 ?PÐQXðJð
 [nÐovðJð ˆfðJð �7ðJð �7ðJð �ðJð '¨ñJð �GðJð -¨gðJð 8EÀgðJð PYÐZaðJð �FðJð +¨FðJð 5>¸wðJð ˜6ðJð $2°6ðJð <CÀFðJð  ˆwð!Jð    ð!Jð$ ˆgð%Jð& ˆvð'Jð&   ð'Jð& *7¸ð'Jð& AJÈ6ò'Jð& T[Ð\`ð'Jð0 �yð1Jð0 #8¸ð1Jð0 EXÐYbð1Jð0 etÐu~ð1Jð2 ˜ð3Jð2 %5°ið3Jð2 BLÈVð3Jð: ˆVð;Jð: & yð;Jð: 3?À	ð;Jð: LUÐV_ð;Jð@ �9ðAJð@ .¨yðAJð@ ;IÈ'ðAJð@ TbÐcjðAJðB ˜òCJðB "/°ðCJðB 9DÀVðCJðB NTÐU[ðCJðF �'ðGJðF % fðGJðP ˆyðQJðP *¨9ðQJðP 7FÀyðQJðP S_Ð`iðQJðR ˜9ðSJðR '9¸)ðSJðR FVÐW`ðSJðT ˆyðUJðT )¨'ðUJðV ˆwðWJðV & vðWJðV 0>¸vòWJðV HOÐPWðWJðX �VðYJðX '¨ðYJðX 2<¸VðYJðX FOÐPWðYJðX Z_Ð`fðYJðd �VðeJðd 1°&ðeJðd ;GÈðeJðd QaÐbhðeJðf �TðgJðf )¨'ðgJðf 4?ÀðgJðh �ðiJðh # FðiJðh -7¸ðiJðh BJÈ6òiJðj ˆfðkJðj  ðkJðj )/°ðkJðn ˆyðoJðn ! &ðoJðt �6ðuJðt (¨ðuJðt 2>¸uðuJðt GSÐTYðuJðt \dÐekðuJðx �9ðyJðx ,¨VðyJðx 6;¸FðyJð@ �9ðAJð@ )¨)ðAJð@ 6CÀFðAJðB ˜iòCJðB *AÀ)ðCJðB NXÐY_ðCJðD �FðEJðD ,¨VðEJðD 6?ÀðEJðD ISÐTZðEJðH ˜fðIJðH '=¸fðIJðH GbÐchðIJðJ ˜FðKJðJ %;¸FðKJðJ EbÐciðKJðL ˜fðMJðL 'AÀ&ðMJðN  ðOJðN *9¸'ðOJðN DUÐV]ñOJðP �7˜O¨W°kÀ7ÈNÐ\bÐdsÐu{Ø�VñSJÐ ñ^ !mÐ õcð Ÿ:š:Ð&VÓWÐ õ6õ>ñ (Ó(_Ó`Ð õGñÐ ñ TÐ Ù;€áZÐ õ0÷Að AõWð$Ø�hð$Ø -¨xð$Ø9LÈkð$à�ð$à)¨5ð$ð �}ð$ð '8Ð9Ið$ð LZÐ[hð$ð �ið	$ð "3°Ið	$ð @NÈwð	$ð YfÐgpð	$ð
 ˜ið$ð
 *GÈ	ð$ð
 TdÐeqð$ð �\ð$ð $GÈñ$ð %¡fð$ñ /AÀ*ð$ñ ™Yð$ñ )=¹ið$ñ J\Ñ]fð$ñ $¡Yð$ñ ™ð$ñ &3±Mð$ñ DNÉuð$ñ ¡ð$ñ +?Áð$ñ K[Ñ\dð$ñ ™5ð$ñ #2±8ð$ñ Ñ 2ð$ñ 5RÑSfð$ñ ‘.ñ$Ð ó ð$	ÙÖ ˆØ× Ñ Ó"ˆß‰5�UÐ"2Ö2Ø&)§h¡hÐ˜UÓ#ñ !÷	÷$ò $÷N:÷÷*ñ "-Ð ØŸJšJÙ‰C�H‰H‘S˜Ÿ™Ð$BÓCÓDÐEÑEeÐfóhÐ ÷
h÷ñÐ]a÷ ñ ð2 ‘i¡Ð.Ó0PÐR[Ð\Ù¡% Ñ+HÐ*IÈ7ÐSðÐ ÷^÷ L÷÷2÷5÷÷ò ÷"N÷DW÷7ò 7÷z0÷<ò <÷÷A÷	Pñ �‘O¡UÑ,AÁ5Ù�YÑ 4°iðÐ ñ Ð ÙJÐ ÷÷"÷B;÷-ò -÷`a÷÷÷":÷@e÷÷÷83ò 83÷v	Gò 	G÷;÷÷(G÷
5ð
 ñCÐQS÷ Cð Có ðC÷85ò 5ñÐV[÷ ñ ÷(J÷.W÷
÷6hð —z’zñ9óÐ ÷1÷BñPÐ ñÐ ñ	!Ð ÷U÷B÷÷(tó

Ðqv÷ 
ò 
÷÷ò ÷ ò ÷$
÷nò n÷cò c÷;÷)ñ $ó 	%ó 	Ð ÷K÷@÷S÷
dò d÷
M÷	÷÷*%ò %÷P#÷
ð21Ø‘7ð1Ø)©7ð1Ø4?Áð1ØJVÑX_ð1á™ð1á"6¹ð1áAPÑRYð1ð ˜7ð1ñ %4±Wð1ð ?MÉgð1ð ‘7ð	1ð ,©Wð	1ð 7EÁgð	1ñ PjÑkrð	1ð
 ‰wð1ð
 "¡7ð1ñ
 -6±wð1ð
 AHÉñ1Ð ó ñ  ‰w˜¡W¨l¹GðCÐ /ó ð ‰wÑ2±GØ‘7ð ‘7ð@Ð ,ó ñ %,Ð !Ù&Ð ñ iÐ Ù&ð  (JÐ)Cð  (JÀYð  (JÑPjð  (JÐlyð  (Jð  |Ið  (Jó  KÐ ØŸ*š*Ñ%;Ó<Ð ÷<÷÷K÷2÷
f÷*÷
_ð GIÐ Ó Hð =?Ð Ó >Ø!%Ð Ø$'Ð !ñ !OÐ Ù&Ð Ù&Ð ÷	ò 	ñ 0Ó1Ð ÷2ò 2÷"ò ÷"oò o÷
{÷+ò +÷\`÷
>÷Xò X÷Dò ñDÐ^`÷ ñ ÷D/÷ò ÷":÷J$÷@W÷,÷0÷46÷rr$ò r$÷jkò kð €à—
’
ÑmÓn€÷3÷Wñ(UÑdh÷ Uñ U÷ñ
GØ<>ñ
Gà,0÷
Gñ 
Gñ !CÐ ÷
ð6 79Ñ Ó 8ÙÑ ÷8ð 8÷ ð ÷:~ð ~ñ ÓCÓDÑ ÷"ð "÷ 	ð 	÷2ð 2÷jcð cñ
Ø<>ñØhlññ MQ÷ò ð" =?Ñ Ó >ÙÑ ÷1ð 1÷ò øðcP ô õðûðb ô 	Úð	ús0   Â
h) Ð&h: Ñ
h: Ñh: è)
h7è6h7è:iéi