+
    iHàjuÀ  ã                   ór  a € RÒ tt0 t R 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 ^ RIHtHtHtHtHt ^ RIHtHt ^ RIHt ^ RIt]P0                  ! ]4      tRtRÓtRt/ s] ^ k ^ s] ^k ^ s ] ^k ]PB                  ! 4       t"]PB                  ! 4       t#R	s$]	 ! R
 R4      4       t%]	 ! R R4      4       t&]	 ! R R4      4       t'/ RRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbR R bR!R!bR"R"b/ R#R"bR$R%bR&R'bR(R)bR*R*bR+R,bR-R.bR/R/bR0R1bR1R1bR2R2bR3R2bR4R4bR5R5bR6R7bR7R7bR8R8bCR9R9R:R:R;R;R<R<R=R=/Ct(] ^k Rs)] ^k R> R? lt*R@ RA lt+RBR/RC RD llt,RBR/RE RF llt-].! 4       t/] ^k RBR/RG RH llt0RI RJ lt1RK RL lt2RM RN lt3RÔRO RP llt4RQ RR lt5RS RT lt6RU RV lt7RW RX lt8RY RZ lt9R[ R\ lt:R] R^ lt;R_ R` lt<RÕRb Rc llt= ! Rd Re]>4      t?RfR	/Rg Rh llt@Ri Rj ltARk Rl ltBRmRa/Rn Ro lltCRp Rq ltDRr Rs ltERt Ru ltFRv Rw ltGRx Ry ltHRÖRzR{/R| R} llltIR~ R ltJR€ R� ltKRzR	RBR/R‚ Rƒ lltL]M! R04      tNR„ R… ltOR†R{R‡Ra/Rˆ R‰ lltPRÕRŠ R‹ lltQRŒ R� ltRRŽ R� ltSRzR	/R� R‘ lltT].! 4       tU] ^k R’R“R”/R•R{/tV] ^k R’R“R–R—R˜/R™RšR›Rœ.R—R›./R•R{R�R{RžRŸ/tW] ^k R×R’R“R R—R¡/R™RšR›Rœ.R—R›./R•R{R�R{RžR¢/RØ]WRÙ]WRÚ]WRÛ]W/tX] ^	k RBR/R£ R¤ lltYRBR/R¥ R¦ lltZRBR/R§ R¨ llt[RBR/R© Rª llt\RBR/R« R¬ llt]R­ R® lt^R¯ R° lt_R± R² lt`R³ R´ ltaRµ R¶ ltbRBR/R· R¸ lltcR¹ Rº ltdR» R¼ lteRBR/R½ R¾ lltfR¿ RÀ ltgRzR	RBR/RÁ RÂ llthRzR{/RÃ RÄ llti]PÔ                  ! RÅ]PÖ                  4      tl] ^
k ]M! 0 RÜm4      tmRÆ RÇ ltnRzR{/RÈ RÉ lltoRÊ RË ltpRÌ RÍ ltqRzR{RBR/RÎ RÏ lltrRzR	RBR/RÐ RÑ lltsR# )Ýu-  Models.dev registry integration â€” primary database for providers and models.

Resolution: in-memory cache (fresh, or stale served while one background daemon
thread refreshes) â†’ disk cache (~/.hermes/models_dev_cache.json, any age) â†’
network only when no cache exists. Failed refreshes back off 5 min process-wide.
Refreshes use ETag conditional GET when a servable registry is held. Hot paths
pass ``allow_network=False`` and never do I/O. A corrupt/empty disk cache is
quarantined, never served as ``{}``. ``models_dev.url`` in config.yaml = mirror.N)Ú	dataclass©ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)Úatomic_json_writeÚatomic_write_text)Úopenrouter_variant_basezhttps://models.dev/api.jsoni,  Fc                   óÖ   a € ] tR t^'t o RtRtRtRtRtRt	Rt
RtRt^ t^ tRtRtRtRtRtRtRtRtRtV 3R lR ltV 3R lR	 ltV 3R
 lR ltV 3R lR ltV 3R lR ltV 3R ltRtV tR# )Ú	ModelInfoz1Full metadata for a single model from models.dev.FNg        Ú c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturn©Úbool)ÚformatÚ__classdict__s   "€Ú5/home/ubuntu/.hermes/hermes-agent/agent/models_dev.pyÚ__annotate__ÚModelInfo.__annotate__F   s   ø€ ÷ ;ñ ;™tñ ;ó    c                óN   € V P                   ^ 8„  ;'       g    V P                  ^ 8„  # )é    )Ú
cost_inputÚcost_output©Úselfs   &r   Úhas_cost_dataÚModelInfo.has_cost_dataF   s$   € Ø�‰ Ñ"×:Ð: d×&6Ñ&6¸Ñ&:Ð:r   c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   r   H   s   ø€ ÷ Cñ C¡ñ Cr   c                óH   € V P                   ;'       g    R V P                  9   # )Úimage)Ú
attachmentÚinput_modalitiesr    s   &r   Úsupports_visionÚModelInfo.supports_visionH   s   € Ø�‰×BÐB '¨T×-BÑ-BÑ"BÐBr   c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   r   J   s   ø€ ÷ .ñ .™dñ .r   c                ó    € R V P                   9   # )Úpdf©r(   r    s   &r   Úsupports_pdfÚModelInfo.supports_pdfJ   s   € Ø˜×-Ñ-Ñ-Ð-r   c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   r   L   s   ø€ ÷ 0ñ 0¡dñ 0r   c                ó    € R V P                   9   # )Úaudior.   r    s   &r   Úsupports_audio_inputÚModelInfo.supports_audio_inputL   s   € Ø˜$×/Ñ/Ñ/Ð/r   c                ó    <€ V ^8„  d   QhRS[ /# r   ©Ústr)r   r   s   "€r   r   r   N   s   ø€ ÷ Hñ H¡Sñ Hr   c                ó  € V P                   R3V P                  R3V P                  4       R3V P                  4       R3V P	                  4       R3V P
                  R3V P                  R33pRP                  R	 V 4       4      ;'       g    R
# )zBHuman-readable capabilities, e.g. 'reasoning, tools, vision, PDF'.Ú	reasoningÚtoolsÚvisionÚPDFr3   zstructured outputzopen weightsz, c              3   ó>   "  € T F  w  rV'       g   K  Vx € K  	  R # 5i©N© )Ú.0ÚonÚlabels   &  r   Ú	<genexpr>Ú0ModelInfo.format_capabilities.<locals>.<genexpr>T   s   é € Ð<±¡9 2¼Ÿš³ùs   ‚“
Úbasic)r:   Ú	tool_callr)   r/   r4   Ústructured_outputÚopen_weightsÚjoin)r!   Úflagss   & r   Úformat_capabilitiesÚModelInfo.format_capabilitiesN   s¢   € ð �^‰^˜[Ð)¨D¯N©N¸GÐ+DÀt×G[ÑG[ÓG]Ð_gÐFhÐko×k|Ñk|Ók~ð  AFð  kGØ×&Ñ&Ó(¨'Ð2°T×5KÑ5KÐM`Ð4aÐdh×duÑduð  xFð  dGð
ˆð �y‰yÑ<±Ó<Ó<×GÐGÀÐGr   c                ó†  <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[S[ R3,          ;R&   S[S[ R3,          ;R&   S[;R&   S[;R&   S[S[,          ;R&   S[;R&   S[;R&   S[S[,          ;R&   S[S[,          ;R&   S[ ;R&   S[ ;R&   S[ ;R&   S[;R&   # )r   ÚidÚnameÚfamilyÚprovider_idr:   rG   r'   ÚtemperaturerH   rI   .r(   Úoutput_modalitiesÚcontext_windowÚ
max_outputÚ	max_inputr   r   Úcost_cache_readÚcost_cache_writeÚknowledge_cutoffÚrelease_dateÚstatusÚinterleaved)r8   r   ÚtupleÚintr   Úfloatr   )r   r   s   "€r   r   r   '   sI  ø‡ ‚ ñ 	�Gñ ñ �Iñ	 ñ
 �Kñ ñ Ññ ñ Ññ ñ Ññ ñ Ññ ñ Ññ ñ Ñ#ñ ñ Ññ ñ ™C ˜H•oÑ*ñ ñ  ™S #˜X•Ñ+ñ! ñ$ Ññ% ñ& Ññ' ñ( ™�}Ñ#ñ) ñ, Ññ- ñ. Ññ/ ñ0 ™e•_Ñ+ñ1 ñ2 ™u•oÑ,ñ3 ñ6 Ññ7 ñ8 Ññ9 ñ: Ññ; ñ< Ñò= r   r@   ) Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r:   rG   r'   rS   rH   rI   r(   rT   rU   rV   rW   r   r   rX   rY   rZ   r[   r\   r]   r"   r)   r/   r4   rL   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r   '   s¬   ø‡ € á;ð €IØ€IØ€JØ€KØ#ÐØ€Là(*ÐØ)+Ðà€NØ€JØ#€Ià€JØ€KØ'+€OØ(,ÐàÐØ€LØ€FØ€K÷;ð ;÷Cð C÷.ð .÷0ð 0÷Hð H÷O ƒ r   r   c                   ó8   a € ] tR t^Wt o RtRt^ tV 3R ltRtV t	R# )ÚProviderInfoz-Full metadata for a provider from models.dev.r   c                óv   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[S[ R3,          ;R&   S[ ;R&   S[ ;R&   S[;R&   # )r   rO   rP   .ÚenvÚapiÚdocÚmodel_count)r8   r^   r_   )r   r   s   "€r   r   ÚProviderInfo.__annotate__W   sW   ø‡ ‚ ñ 	�Gñ ñ �Iñ	 ñ
 
‰s�Cˆx�Ññ ñ 
�Hñ ñ 
�Mñ ñ Ñò r   r@   N)
ra   rb   rc   rd   re   ro   rp   rf   rg   rh   ri   s   @r   rk   rk   W   s   ø‡ € á7ð
 €CØ€K÷ ƒ r   rk   c                   óH   a € ] tR t^bt o RtRtRtRtRtRt	Rt
V 3R ltRtV tR# )ÚModelCapabilitiesz;Structured capability metadata for a model from models.dev.TNé@ r   c                ó’   <€ V ^8„  d   Qh/ S[ ;R&   S[S[ ,          ;R&   S[S[ ,          ;R&   S[;R&   S[S[,          ;R&   S[;R&   # )r   Úsupports_toolsr)   Úsupports_reasoningrU   Úmax_output_tokensÚmodel_family)r   r   r_   r8   )r   r   s   "€r   r   ÚModelCapabilities.__annotate__b   s_   ø‡ ‚ ñ Ññ ñ ™d•^Ñ*ñ	 ñ
 !¡�Ñ-ñ ñ Ñ ñ ñ  ¡•}Ñ+ñ ñ Ñò r   r@   )ra   rb   rc   rd   re   rv   r)   rw   rU   rx   ry   rf   rg   rh   ri   s   @r   rs   rs   b   s/   ø‡ € áEØ€NØ&*€OØ)-ÐØ €NØ'+ÐØ€L÷ ƒ r   rs   Ú
openrouterÚnovitaz	novita-aiÚ	anthropicÚopenaiz
openai-apizopenai-codexÚzaiÚkimizkimi-for-codingzkimi-codingÚmoonshotÚstepfunzkimi-coding-cnÚminimaxzminimax-oauthz
minimax-cnÚdeepseekÚalibabaz
qwen-oauthÚcopilotzgithub-copilotz
ai-gatewayÚvercelzopencode-zenÚopencodezopencode-goÚkilocodeÚkiloÚ	fireworkszfireworks-aiÚhuggingfaceÚgeminiÚgoogleÚxaiz	xai-oauthÚxiaomiÚnvidiazmeta-aiÚmetaÚgroqÚmistralÚ
togetheraiÚ
perplexityÚcoherezollama-cloudc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Úmdev_idr   )r8   Úlist)r   s   "r   r   r   ˆ   s   € ÷ 4ñ 4¤sð 4¬t´C­yñ 4r   c                óÆ   € \         fE   / s \        P                  4        F*  w  r\         P                  V. 4      P	                  V4       K,  	  \         P                  V . 4      # )zAReturn the Hermes provider ids that map to *mdev_id* (may be []).)Ú_MODELS_DEV_TO_PROVIDERÚPROVIDER_TO_MODELS_DEVÚitemsÚ
setdefaultÚappendÚget)r™   Ú	hermes_idÚmappeds   &  r   Ú_models_dev_to_hermes_idsr¤   ˆ   sU   € ô Ò&Ø"$ÐÜ!7×!=Ñ!=Ö!?ÑˆIÜ#×.Ñ.¨v°rÓ:×AÑAÀ)ÖLñ "@ä"×&Ñ& w°Ó3Ð3r   c                óR   € V ^8„  d   QhR\         R\        \        \         3,          /# )r   Úvaluer   )r   Údictr8   )r   s   "r   r   r   ’   s"   € ÷ 4ñ 4œ#ð 4¤$¤s¬C x¥.ñ 4r   c                 ó6   € \        V \        4      '       d   V # / # r?   ©Ú
isinstancer§   )r¦   s   &r   Ú_dict_or_emptyr«   ’   s   € Ü˜u¤d×+Ò+ˆ5Ð3°Ð3r   Úconfigc                óŠ   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          R\        \         ,          /# ©r   Úproviderr¬   r   ©r8   r   r§   r   )r   s   "r   r   r   –   s5   € ÷ ñ ÜðÜ&¤t¬C´¨H¥~Õ6ðäŒc…]ñr   c               óF  a€ T ;'       g    RP                  4       oSP                  4       P                  R4      '       d   S\        R4      R oS'       d   S\        9   d   R# Ve   \        RSRVR7      M\        RSRR7      p\        V4      P                  R4      pV'       gN   Ve   \        RRVR7      M\        RRR7      p\        V3R	 l\        V\        4      '       d   TM.  4       R4      p\        T;'       g    R4      P                  4       pT;'       g    R# )
z·``catalog_provider`` declared on a custom provider's ``providers.<name>`` row (or legacy
``custom_providers[]`` entry): the catalogued vendor whose models it resells. None when unset.r   zcustom:NÚ	providers©Údefaultr¬   ©r´   Úcatalog_providerÚcustom_providersc              3   óè   <"  € T Fg  p\        V\        4      '       g   K  \        VP                  R 4      ;'       g    R4      P	                  4       S8X  g   KT  VP                  R4      x € Ki  	  R# 5i)rP   r   r¶   N)rª   r§   r8   r¡   Ústrip)rA   ÚerP   s   & €r   rD   Ú/_configured_catalog_provider.<locals>.<genexpr>¬   s^   øé € ð [Ñ:d°AÜ# A¤t×,ô 0Ü14°Q·U±U¸6³]×5HÐ5HÀbÓ1I×1OÑ1OÓ1QÐUYÑ1Yô 0�a—e‘eÐ.×/Ð/Ó:dùs   ƒA2 A2½A2ÁA2)r¹   ÚlowerÚ
startswithÚlenr�   Ú_cfg_getr«   r¡   Únextrª   rš   r8   )r¯   r¬   Úprovider_configÚaliasÚlegacyrP   s   &$   @r   Ú_configured_catalog_providerrÄ   –   s  ø€ ð
 �NˆN˜×!Ñ!Ó#€DØ‡z�zƒ|×Ñ˜y×)Ò)Ø”C˜	“N�OÐ$ˆß�4Ô1Ô1Ùð Òô 	�˜d¨D¸Õ@ä�k 4°Ô6ð ô
 ˜?Ó+×/Ñ/Ð0BÓC€Eßð Ò!ô Ð'°¸fÕEäÐ,°dÔ;ð 	ô
 ô [ÄJÈvÔW[×D\ÒD\¹&ÐbdÐ:dó [Ø\`óbˆä�—�˜Ó×"Ñ"Ó$€EØ�=ˆ=�DÐr   c                óŠ   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          R\        \         ,          /# r®   r°   )r   s   "r   r   r   ²   s5   € ÷ ñ ÜðÜ&¤t¬C´¨H¥~Õ6ðäŒc…]ñr   c               ó’  € T ;'       g    RP                  4       p\        P                  V4      pVf”   \        W!R7      pV'       d   \        P                  WD4      MRpVee   V\        P	                  4       9  dL   V\        RR7      9  d;   W$3\        9  d-   \        P                  W$34       \        P                  RW$4       RpV# )z¡models.dev provider id for a Hermes provider id, or None. A custom provider reaches the
catalog only through its configured ``catalog_provider`` alias (#112649).r   N©r¬   F©Úallow_networkz_providers.%s: catalog_provider %r is neither a Hermes provider id nor a models.dev id; ignoring)
r¹   r�   r¡   rÄ   ÚvaluesÚfetch_models_devÚ _UNKNOWN_CATALOG_PROVIDER_WARNEDÚaddÚloggerÚwarning)r¯   r¬   Úkeyr™   rÂ   s   &$   r   Ú_models_dev_idrÑ   ²   s«   € ð
 �>ˆ>�r×
 Ñ
 Ó
"€CÜ$×(Ñ(¨Ó-€GØ‚Ü,¨SÔ@ˆß>CÔ(×,Ñ,¨UÔ:ÈˆØÒ 7Ô2H×2OÑ2OÓ2QÔ#QØÔ#3À%Ô#HÔHàˆ|Ô#CÔCÜ0×4Ñ4°c°\ÔBÜ—‘ð  9Ø:=ôFàˆGØ€Nr   c          	      ó€   € V ^8„  d   QhR\         R\        R\        \        \         \        3,          ,          R\        /# )r   Úkeysr´   r¬   r   )r8   r   r   r§   )r   s   "r   r   r   Ê   s6   € ÷ ñ ”Cð ¤#ð ¬x¼¼SÄ#¸X½Õ/Gð ÔSVñ r   c                óh   €  ^ RI HpHp T! Ve   TMV! 4       .VO5RV / #   \         d    T u # i ; i)z@``cfg_get`` over the read-only config; *default* on any failure.)Úcfg_getÚload_config_readonlyr´   )Úhermes_cli.configrÕ   rÖ   Ú	Exception)r´   r¬   rÓ   rÕ   rÖ   s   $$*  r   r¿   r¿   Ê   s@   € ðßCÙ Ò!3‘vÑ9MÓ9OÐhÐRVÒhÐ`gÑhÐhøÜô ØŠðús   ‚! ¡1°1c                ó0   € V ^8„  d   QhR\         R\        /# )r   rP   r   )r8   r   )r   s   "r   r   r   Ó   s   € ÷ $ñ $”sð $œtñ $r   c                 ó*   € ^ RI Hp V! 4       V ,          # )r   )Úget_hermes_home)Úhermes_constantsrÛ   )rP   rÛ   s   & r   Ú_hermes_pathrÝ   Ó   s   € Ý0ÙÓ˜tÕ#Ð#r   c                ó$   € V ^8„  d   QhR\         /# r   r   )r   s   "r   r   r   Ø   s   € ÷ 1ñ 1œñ 1r   c                  ó   € \        R 4      # )zmodels_dev_cache.json©rÝ   r@   r   r   Ú_get_cache_pathrá   Ø   ó   € ÜÐ/Ó0Ð0r   c                ó$   € V ^8„  d   QhR\         /# r   r   )r   s   "r   r   r   Ü   s   € ÷ 1ñ 1œñ 1r   c                  ó   € \        R 4      # )zmodels_dev_cache.etagrà   r@   r   r   Ú_get_etag_pathrå   Ü   râ   r   c                ó$   € V ^8„  d   QhR\         /# )r   Úwhatr7   )r   s   "r   r   r   à   s   € ÷ ñ ”3ñ r   c                ór   €  V! 4       #   \          d#   p\        P                  RY4       Tu Rp?# Rp?ii ; i)zXRun *fn*; on any exception log ``"Failed to <what>: %s"`` at debug and return *default*.zFailed to %s: %sN)rØ   rÎ   Údebug)rç   Úfnr´   rº   s   &&& r   Ú_quietlyrë   à   s2   € ðÙ‹tˆøÜô Ü�‰Ð'¨Ô1Ø�ûðús   ‚	 ‰6”1«6±6c                ó$   € V ^8„  d   QhR\         /# r   r7   )r   s   "r   r   r   é   s   € ÷ Wñ W”Cñ Wr   c                 ó   € \        RR R4      # )z,Last-known ETag from disk, or "" if missing.zload models.dev ETagc                  ó’   € \        4       P                  4       '       d)   \        4       P                  R R7      P                  4       # R# )ú	utf-8-sig©Úencodingr   )rå   ÚexistsÚ	read_textr¹   r@   r   r   Ú<lambda>Ú_load_etag.<locals>.<lambda>ë   sX   € Ôp~ó  qA÷  qHñ  qH÷  qJò  qJ´NÓ4D×4NÑ4NÐXcÐ4NÓ4d×4jÑ4jÓ4lð  5Rð  PRð  5Rr   r   ©rë   r@   r   r   Ú
_load_etagr÷   é   s!   € äÐ*ñ  -Rð  TVó  Wð  Wr   c                ó(   € V ^8„  d   QhR\         RR/# )r   Úetagr   Nr7   )r   s   "r   r   r   î   s   € ÷ ,ñ ,”Sð ,˜Tñ ,r   c                 ó2   a € R  V 3R llp\        RV4       R# )c                ó   € V ^8„  d   QhRR/# ©r   r   Nr@   )r   s   "r   r   Ú _save_etag.<locals>.__annotate__ï   s   € ÷ +ñ +�4ñ +r   c                  ód   <€ \        4       p ^ RIHp V! V P                  4       \	        V S4       R# )r   )Úmkdir_under_hermes_homeN)rå   rÜ   rÿ   Úparentr   )Ú	etag_pathrÿ   rù   s     €r   ÚwriteÚ_save_etag.<locals>.writeï   s&   ø€ Ü"Ó$ˆ	Ý<á 	× 0Ñ 0Ô1Ü˜) TÖ*r   zsave models.dev ETagNrö   )rù   r  s   f r   Ú
_save_etagr  î   s   ø€ ÷+ð +ô Ð# UÖ+r   c                ó   € V ^8„  d   QhRR/# rü   r@   )r   s   "r   r   r   ø   s   € ÷ Xñ X�Tñ Xr   c                 ó    € \        RR 4       R# )z Delete the ETag sidecar so the next fetch is unconditional: an If-None-Match without a
servable cache invites a 304 that leaves the process with no data at all.zclear models.dev ETagc                  ó6   € \        4       P                  R R7      # )T)Ú
missing_ok)rå   Úunlinkr@   r   r   rô   Ú_clear_etag.<locals>.<lambda>û   s   € ¬nÓ.>×.EÑ.EÐQUÐ.EÔ.Vr   Nrö   r@   r   r   Ú_clear_etagr  ø   s   € ô Ð$Ñ&VÖWr   c                ó$   € V ^8„  d   QhR\         /# r   r7   )r   s   "r   r   r   þ   s   € ÷ Sñ SœSñ Sr   c                 ó¢   € \        RRRR7      p \        V \        4      '       d'   V P                  4       '       d   V P                  4       # \        # )zHThe models.dev API URL, honoring the ``models_dev.url`` config override.Ú
models_devÚurlr   rµ   )r¿   rª   r8   r¹   ÚMODELS_DEV_URL)r  s    r   Ú_get_models_dev_urlr  þ   s7   € ä
�< °Ô
3€Cä$ S¬#×.Ò.°3·9±9·;²;ˆ3�9‰9‹;ÐRÄNÐRr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Údatar   )r   r   )r   s   "r   r   r     s   € ÷ 4ñ 4œSð 4¤Tñ 4r   c                óN   € \        V \        4      ;'       d    \        V 4      ^ 8„  # )z8True if *data* is a non-empty dict suitable for serving.)rª   r§   r¾   ©r  s   &r   Ú_validate_registryr    s   € ä�dœDÓ!×3Ð3¤c¨$£i°!¡mÐ3r   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r   ©r§   r8   r   )r   s   "r   r   r   
  s   € ÷ ñ œ$œs¤C˜x�.ñ r   c                 óF  €  \        4       p V P                  4       '       dh   \        V RR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X4      '       d   V# \        P                  R4       \        V 4       / #   + '       g   i     LE; i  \         dx   p\        P                  RT4       \        P                  ! \        4      ;_uu_ 4        \        \        4       4       RRR4        Rp?/ #   + '       g   i      Rp?/ # ; iRp?ii ; i)zŽLoad the disk cache; a corrupt/empty one is quarantined with a warning so it never
masquerades as ``{}`` and breaks provider/model resolution.rï   rð   NzSmodels.dev disk cache is corrupt or empty; quarantining (will refetch from network)z6Failed to load models.dev disk cache; quarantining: %s)rá   rò   ÚopenÚjsonÚloadr  rÎ   rÏ   Ú_quarantine_corrupt_cacherØ   Ú
contextlibÚsuppress)Ú
cache_pathÚfr  rº   s       r   Ú_load_disk_cacher"  
  sÎ   € ð9Ü$Ó&ˆ
Ø×Ñ×ÒÜ�j¨;×7Õ7¸1Ü—y’y “|�÷ 8ä! $×'Ò'Ø�Ü�N‰NÐpÔqÜ% jÔ1ð
 €I÷ 8×7ûô ô 9Ü�‰ÐOÐQRÔSÜ× Ò ¤×+Õ+Ü%¤oÓ&7Ô8÷ ,Ó+à€I÷ ,×+Ò+à€Iþð	9úsR   ‚5B ·BÁB Á) B ÂB	ÂB ÂD Â)8DÃ!DÃ5DÄDÄDÄDÄD c                ó(   € V ^8„  d   QhR\         RR/# )r   r   r   Nr   )r   s   "r   r   r     s   € ÷ ñ ¬$ð °4ñ r   c                ó¸   €  V P                  V P                  R4      4       \        4        R#   \         d!   p\        P	                  RT4        Rp?L2Rp?ii ; i)u  Rename a rejected cache aside and drop its ETag sidecar. Renaming makes the rejection a
one-time event â€” otherwise every hot-path call that finds the in-memory cache empty re-parses
and re-warns until a network fetch succeeds. The sidecar vouches for a registry we no longer hold.z.json.corruptz1Could not quarantine corrupt models.dev cache: %sN)ÚrenameÚwith_suffixrØ   rÎ   ré   r  )r   rº   s   & r   r  r    sN   € ðMØ×Ñ˜*×0Ñ0°ÓAÔBô †Møô ô MÜ�‰ÐHÈ!×LÑLûðMús   ‚ . ®A¹AÁAc                ó:   € V ^8„  d   QhR\         \        ,          /# r   ©r   r`   )r   s   "r   r   r   (  s   € ÷ 8ñ 8¤¬%¥ñ 8r   c                 ó&   € R R lp \        RV 4      # )u¸   Age of the disk cache file in seconds, or None if missing/unreadable. An mtime in the future
(clock skew) is also None â€” unknown freshness â€” so callers fall through to the network.c                ó:   € V ^8„  d   QhR\         \        ,          /# r   r(  )r   s   "r   r   Ú-_disk_cache_age_seconds.<locals>.__annotate__+  s   € ÷ )ñ )”(œ5•/ñ )r   c                  óÄ   € \        4       p V P                  4       '       d5   \        P                  ! 4       V P                  4       P                  ,
          MRpV^ 8¼  d   V# R# )é   Néÿÿÿÿ)rá   rò   ÚtimeÚstatÚst_mtime)r   Úages     r   r0  Ú%_disk_cache_age_seconds.<locals>.stat+  sI   € Ü$Ó&ˆ
Ø:D×:KÑ:K×:MÒ:MŒd�iŠi‹k˜JŸO™OÓ-×6Ñ6Ö6ÐSUˆØ˜Q”hˆsÐ( DÐ(r   zstat models.dev disk cacherö   )r0  s    r   Ú_disk_cache_age_secondsr4  (  s   € õ)ô Ð0°$Ó7Ð7r   r   c                óV   € V ^8„  d   QhR\         \        \        3,          R\        RR/# )r   r  rù   r   Nr  )r   s   "r   r   r   2  s)   € ÷ ñ œ4¤¤S �>ð ´ð ¸dñ r   c                óR   a € \        RV 3R l4       V'       d   \        V4       R# R# )zCSave the registry atomically, plus the ETag sidecar when non-empty.zsave models.dev disk cachec                  ó2   <€ \        \        4       S R RR7      # )N)ÚindentÚ
separators)Ú,Ú:)r
   rá   r  s   €r   rô   Ú"_save_disk_cache.<locals>.<lambda>4  s   ø€ Ô3DÄ_ÓEVÐX\Ðeið  wAõ  4Br   N)rë   r  )r  rù   s   f&r   Ú_save_disk_cacher=  2  s%   ø€ äÐ)ô  ,Bô  CßÜ�4Öñ r   c                   ó   € ] tR tRtRtRtR# )Ú_NotModifiedi:  uC   Server returned 304 Not Modified â€” existing cache is still valid.r@   N)ra   rb   rc   rd   re   rg   r@   r   r   r?  r?  :  s   † ÝMr   r?  Úconditionalc                ót   € V ^8„  d   QhR\         R\        \        \        \        3,          \        3,          /# )r   r@  r   )r   r^   r§   r8   r   )r   s   "r   r   r   >  s.   € ÷ 2ñ 2´4ð 2ÄEÌ$ÌsÔTWÈxÍ.ÔZ]ÐJ]ÕD^ñ 2r   c                ól  € / pV '       d   \        4       ;p'       d   W!R&   \        P                  ! \        4       VRR7      pVP                  R8X  d   \        4       hVP                  4        VP                  4       p\        V4      '       g   \        R4      hWCP                  P                  RR4      3# )ud  Fetch the live registry; returns ``(registry, etag)`` (etag "" if none). Raises on network
errors and on an empty/invalid payload. ``conditional`` sends ``If-None-Match`` with the sidecar's
ETag and raises ``_NotModified`` on 304 â€” pass True ONLY while holding ``_models_dev_fetch_lock``
AND a servable registry, or a 304 leaves the process with no data.zIf-None-Match)ÚheadersÚtimeouti0  z0models.dev returned an empty or invalid registryÚETagr   )é   é
   )r÷   Úrequestsr¡   r  Ústatus_coder?  Úraise_for_statusr  r  Ú
ValueErrorrC  )r@  rC  rù   Úresponser  s   $    r   Ú_fetch_models_dev_from_networkrM  >  s–   € ð
 !€Gß¤
£Ð,˜Ö,Ø#'�Ñ ä�|Š|Ô/Ó1¸7ÈGÔT€HØ×Ñ˜sÔ"Ü‹nÐØ×ÑÔØ�=‰=‹?€DÜ˜d×#Ò#ÜÐKÓLÐLØ×!Ñ!×%Ñ% f¨bÓ1Ð1Ð1r   c                ó   € V ^8„  d   QhRR/# rü   r@   )r   s   "r   r   r   Q  s   € ÷ xñ x ñ xr   c                 óx   € \        \        \        P                  ! 4       \        ,
          \        ,           4      sR# )z¸Give stale cache data a 5-minute in-memory grace before retrying refresh. Only ever moves the
timestamp forward, so a background refresh that completed meanwhile keeps its fresh stamp.N)ÚmaxÚ_models_dev_cache_timer/  Ú_MODELS_DEV_CACHE_TTLÚ_MODELS_DEV_RETRY_DELAYr@   r   r   Ú_mark_stale_cache_gracerT  Q  s$   € ô !Ô!7¼¿º»ÔG\Õ9\Ô_vÕ9vÓwÒr   c                ó^   € V ^8„  d   QhR\         R\        R\        \         \        3,          /# )r   ÚmsgÚargsr   )r8   r   r§   )r   s   "r   r   r   X  s)   € ÷ ñ ”cð ¤#ð ¬$¬s´C¨x­.ñ r   c                óf   € \        4        \        4        \        P                  ! V .VO5!   \        # )zKArm the grace window, kick off a background refresh, return the held cache.)rT  Ú$_start_background_refresh_models_devrÎ   ré   Ú_models_dev_cache)rV  rW  s   &*r   Ú_serve_staler[  X  s%   € äÔÜ(Ô*Ü
‡L‚L�Ð�tÔÜÐr   rù   c                ób   € V ^8„  d   QhR\         \        \        3,          R\        R\        RR/# )r   r  rù   Úwherer   Nr  )r   s   "r   r   r   `  s0   € ÷ ñ œ4¤¤S �>ð ´Cð ÄSð ÈTñ r   c          
     óÌ   € \        W4       V s\        P                  ! 4       s^ s\
        P                  RV\        V 4      \        R V P                  4        4       4      4       R# )z¾Persist a fetched registry: disk + in-mem + clear backoff. Callers hold ``_models_dev_fetch_lock``
so a failing refresh on one path can never stomp state a succeeding refresh just committed.zARefreshed models.dev registry (%s): %d providers, %d total modelsc              3   óˆ   "  € T F8  p\        V\        4      '       g   K  \        VP                  R / 4      4      x € K:  	  R# 5i)ÚmodelsN)rª   r§   r¾   r¡   )rA   Úps   & r   rD   Ú#_commit_registry.<locals>.<genexpr>j  s/   é € ÐS©m¨¼zÈ!ÌT×?RÔ$ŒC�—‘�h Ó#×$Ð$«mùs
   ‚AŸ#AN)
r=  rZ  r/  rQ  Ú_models_dev_retry_afterrÎ   ré   r¾   ÚsumrÊ   )r  rù   r]  s   &$$r   Ú_commit_registryre  `  sR   € ô �TÔ ØÐÜ!ŸYšY›[ÐØÐÜ
‡L�LØKÈUÔTWÐX\ÓT]ÜÑS¨d¯k©k¬mÓSÓSör   c                ó(   € V ^8„  d   QhR\         RR/# )r   r]  r   Nr7   )r   s   "r   r   r   n  s   € ÷ jñ j¬#ð j°$ñ jr   c                óü   € \         '       gC   \        4        \        P                  ! 4       \        ,           s\
        P                  RV 4       R# \        P                  ! 4       s^ s\
        P                  RV 4       R# )uŽ   After a 304: clear backoff and re-mark the held cache fresh (disk is untouched â€” only the
freshness marker advances). Caller holds the lock.zomodels.dev returned 304 but no cached registry is held (%s); cleared ETag sidecar, will refetch unconditionallyNzNmodels.dev registry unchanged (304 Not Modified, %s); cache re-confirmed fresh)	rZ  r  r/  rS  rc  rÎ   rÏ   rQ  ré   ©r]  s   $r   Ú_confirm_cache_not_modifiedri  n  s^   € ÷ Óô 	ŒÜ"&§)¢)£+Ô0GÕ"GÐÜ�‰ð LØMRô	TáÜ!ŸYšY›[ÐØÐÜ
‡L�LÐaÐchÖir   c                ó4   € V ^8„  d   QhR\         R\        RR/# )r   Úexcr]  r   N)rØ   r8   )r   s   "r   r   r     s&   € ÷ vñ vœyð v´Cð v¸Dñ vr   c               ó~   € \         P                   ! 4       \        ,           s\        P	                  RV\        V 4       R# )z=Arm the process-wide 5-minute backoff. Caller holds the lock.z<models.dev refresh failed (%s); retry suppressed for %ds: %sN)r/  rS  rc  rÎ   ré   )rk  r]  s   &$r   Ú_note_refresh_failurerm    s,   € ô #Ÿiši›kÔ,CÕCÐÜ
‡L�LÐOÐQVÔXoÐqtÖur   c                óh   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          /# )r   r]  r   r°   )r   s   "r   r   r   †  s'   € ÷ ñ œ3ð ¤8¬D´´c°­NÕ#;ñ r   c                óÞ   €  \        \        \        4      R7      w  r\        WV R7       V#   \         d    \        T R7       \        u # \         d   p\        Y0R7        Rp?R# Rp?ii ; i)zœOne conditional fetch + state update; caller holds ``_models_dev_fetch_lock``. Returns the
registry to serve, or None when the fetch failed (backoff armed).)r@  )rù   r]  rh  N)rM  r   rZ  re  r?  ri  rØ   rm  )r]  r  rù   rº   s   &   r   Ú_refresh_lockedrp  †  sY   € ð	Ü3ÄÔEVÓ@WÔX‰
ˆÜ˜°Õ6ØˆøÜô !Ü#¨%Õ0Ü Ò Üô Ü˜aÕ-Ýûðús!   ‚), ¬A,ÁA,ÁA,ÁA'Á'A,c                ó   € V ^8„  d   QhRR/# rü   r@   )r   s   "r   r   r   •  s   € ÷ 2ñ 2¨ñ 2r   c            	     ó.  €  \         ;_uu_ 4        \        R4       RRR4       \        ;_uu_ 4        RsRRR4       R#   + '       g   i     L+; i  + '       g   i     R# ; i  \        ;_uu_ 4        RsRRR4       i   + '       g   i     i ; i; i)z3Best-effort refresh after serving stale cache data.Ú
backgroundNF)Ú_models_dev_fetch_lockrp  Ú_models_dev_refresh_lockÚ_models_dev_refresh_in_flightr@   r   r   Ú_background_refresh_models_devrw  •  sb   € ð2÷ $Ö#Ü˜LÔ)÷ $÷ &Ö%Ø,1Ð)÷ &Ñ%÷ $×#ú÷ &×%Ð%û×%Ö%Ø,1Ð)÷ &×%×%Ð%ýsB   ‚A& �?œA& ²A¿A	Á
A& ÁA#	Á&BÁ5B	Á8	BÂBÂBc                ó   € V ^8„  d   QhRR/# rü   r@   )r   s   "r   r   r   £  s   € ÷ Iñ I¨dñ Ir   c                 óà  € \         P                   ! 4       \        8  d   R# \        ;_uu_ 4        \        '       d    RRR4       R# RsRRR4       \        P
                  ! \        RRR7      p  V P                  4        R#   + '       g   i     L@; i  \         dO   p\        ;_uu_ 4        RsRRR4       M  + '       g   i     M; i\        P                  RT4        Rp?R# Rp?ii ; i)zWStart one daemon refresh worker if none is running and the failure backoff has elapsed.NTzmodels-dev-refresh)ÚtargetrP   ÚdaemonFz-Failed to start models.dev refresh thread: %s)r/  rc  ru  rv  Ú	threadingÚThreadrw  ÚstartrØ   rÎ   ré   )Úthreadrº   s     r   rY  rY  £  s«   € ô ‡y‚yƒ{Ô,Ô,Ùß	!Ö	!ß(Ó(Ø÷ 
"Ñ	!ð )-Ð%÷ 
"ô ×ÒÔ%CÐJ^ÐgkÔl€FðIØ�‰Ž÷ 
"×	!ûô ô Iç%Ö%Ø,1Ð)÷ &×%×%Ð%úä�‰ÐDÀa×HÒHûð	IúsA   ¯BÁBÁ/B ÂB	ÂC-ÂC(Â-B9Â0	C(Â9C	ÃC(Ã(C-rÉ   Tc                ó^   € V ^8„  d   QhR\         R\         R\        \        \        3,          /# )r   Úforce_refreshrÉ   r   )r   r§   r8   r   )r   s   "r   r   r   ¶  s.   € ÷ 7!ñ 7!¤Dð 7!ÄDð 7!ÔTXÔY\Ô^aÐYaÕTbñ 7!r   c               óª  € V'       gS   \         '       gA   \        4       ;p'       d/   Vs \        4       pVe   \        P                  ! 4       V,
          M^ s\         # V '       gò   \         '       d0   \        P                  ! 4       \        ,
          \
        8  d   \         # \         '       d   \        R4      # \        4       pVen   \        4       ;p'       d\   Vs V\
        8¼  d   \        RV4      # \        P                  ! 4       V,
          s\        P                  R\        V4      V4       \         # \        P                  ! 4       \        8  d   \         # \        ;_uu_ 4        V '       g;   \         '       g   \        P                  ! 4       \        8  d   \         uuRRR4       # V '       d#   \         '       g   \        4       ;p'       d   Vs ^ s\        R4      pVe   VuuRRR4       # \         '       g<   \        4       s ^ s\         '       d$   \        P                  R\        \         4      4       \         uuRRR4       #   + '       g   i     R# ; i)uI  Fetch the models.dev registry (dict keyed by provider ID; {} on failure). Cache hierarchy:
fresh in-memory â†’ stale in-memory (served now, refreshed in one background daemon thread â€” stale
beats a foreground timeout) â†’ disk of any age (stale triggers the same background refresh) â†’
singleflight foreground fetch. A failed refresh suppresses automatic refreshes for 5 minutes.
``force_refresh=True`` bypasses the cache fast paths and the backoff, falling back to cached data
only if the call fails. ``allow_network=False`` returns any memory/disk cache and never makes a request.Nz@Using stale in-memory models.dev cache; refreshing in backgroundzGUsing stale models.dev disk cache (age=%.0fs); refreshing in backgroundzALoaded models.dev from fresh disk cache (%d providers, age=%.0fs)Ú
foregroundz1Loaded stale models.dev disk cache (%d providers))rZ  r"  r4  r/  rQ  rR  r[  rÎ   ré   r¾   rc  rt  rp  )r�  rÉ   Ú	disk_dataÚdisk_ageÚdiskÚserveds   &$    r   rË   rË   ¶  s­  € ÷ ß Ó Ô3CÓ3EÐ&E iÖ&EØ )ÐÜ.Ó0ˆHØ?GÒ?S¤T§Y¢Y£[°8Ö%;ÐYZÐ"Ü Ð ßçÓ¤$§)¢)£+Ô0FÕ"FÔJ_Ô!_Ü$Ð$çÓÜÐ bÓcÐcô +Ó,ˆØÒÔ2BÓ2DÐ%D YÖ%DØ )ÐØÔ0Ô0Ü#Ð$mÐowÓxÐxä%)§Y¢Y£[°8Õ%;Ð"Ü�L‰LÐ\Ô^aÐbkÓ^lÐnvÔwÜ$Ð$ä�9Š9‹;Ô0Ô0Ü$Ð$÷ 
 Ö	ß×"3Ó"3´t·y²y³{ÔE\Ô7\Ü$÷ 
 Ò	÷
 ×!2Ó!2Ô@PÓ@RÐ8R¸Ö8RØ $ÐØ%&Ð"Ü  Ó.ˆØÒØ÷ 
 Ò	÷ !Ó Ü 0Ó 2ÐØ%&Ð"ß Ó Ü—‘ÐPÔRUÔVgÓRhÔiÜ ÷% 
 ×	×	Ó	ús1   Å"IÅ7#IÆ%IÆ-IÆ9&IÇ*IÇ6A IÉI	c          	      ót   € V ^8„  d   QhR\         R\        R\        \        \         \        3,          ,          /# ©r   r™   rÉ   r   ©r8   r   r   r§   r   )r   s   "r   r   r   ð  s4   € ÷ Fñ F¤ð F´Dð F¼XÄdÌ3ÔPSÈ8ÅnÕ=Uñ Fr   c                ó”   € V'       d   \        4       M\        RR7      pVP                  V 4      p\        V\        4      '       d   V# R# )z+The raw models.dev provider entry, or None.FrÈ   N)rË   r¡   rª   r§   )r™   rÉ   ÚregistryÚprovider_datas   &&  r   Ú_registry_providerrŽ  ð  s=   € ÷ &3ÔÔ!Ô8HÐW\Ô8]€HØ—L‘L Ó)€MÜ& }´d×;Ò;ˆ=ÐEÀÐEr   c          	      ót   € V ^8„  d   QhR\         R\        R\        \        \         \        3,          ,          /# r‰  rŠ  )r   s   "r   r   r   ø  s/   € ÷ 8ñ 8œcð 8´Tð 8¼hÄtÌCÔQTÈHÅ~Õ>Vñ 8r   c               ó|   € \        W4      pVe   VP                  R/ 4      MRp\        V\        4      '       d   V# R# )z<The ``models`` dict of a models.dev provider entry, or None.Nr`  )rŽ  r¡   rª   r§   )r™   rÉ   r�  r`  s   &$  r   Ú_registry_modelsr‘  ø  s<   € ä& wÓ>€MØ0=Ò0Iˆ]×Ñ˜x¨Ô,Èt€FÜ ¬×-Ò-ˆ6Ð7°4Ð7r   c                ó¸   € V ^8„  d   QhR\         R\        R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# )r   r¯   rÉ   r¬   r   rŠ  )r   s   "r   r   r   ÿ  sL   € ÷ Wñ WÜðWÜ%)ðWÜ;CÄDÌÌcÈÅNÕ;SðWäŒd”3œ�8�nÕñWr   c               óF   € \        WR7      pV'       d   \        W1R7      # R# )u�   Resolve a Hermes provider ID to its models dict, or None if unknown.
``allow_network`` defaults to False â€” hot-path callers must never block.rÇ   rÈ   N)rÑ   r‘  )r¯   rÉ   r¬   r™   s   &$$ r   Ú_get_provider_modelsr”  ÿ  s"   € ô
 ˜XÔ5€GßELÔ˜GÔAÐVÐRVÐVr   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# ©r   r¯   Úmodelr   )r8   r   )r   s   "r   r   r     s%   € ÷ *ñ *¬cð *¼#ð *Ä(Ì3Å-ñ *r   c                ó2   € V \         9  d   R# \        V4      # )u•  Return the base id to retry a catalog lookup with, or ``None``.

OpenRouter's ``:nitro`` / ``:floor`` / ``:exacto`` / ``:online`` are
request-time routing modifiers: they change which endpoint serves the
request, never which model runs. ``/models`` and models.dev list only the
base id, so a routed id must resolve to the base model's metadata.

Scoped to OpenRouter so a genuine ``model:tag`` on another provider (an
Ollama tag, a ``:cloud`` catalog key) is never rewritten.

Deliberately excludes ``:free``, ``:batch``, ``:extended``, and
``:thinking``: those are REAL catalog SKUs with their own entries and
their own â€” sometimes different â€” context windows. Stripping them would
report a window LARGER than the model actually has. Their real entries
are found by the exact/case-insensitive passes above, and a genuinely
absent SKU must miss so ``model_overrides`` ``_default`` fill-gap
semantics still apply.
N)Ú_OPENROUTER_CATALOG_PROVIDERSr   )r¯   r—  s   &&r   Ú_openrouter_catalog_lookup_baserš    s   € ð& Ô4Ô4ÙÜ" 5Ó)Ð)r   Úsuffix_fallbackr¯   c                ój   € V ^8„  d   QhR\         \        \        3,          R\        R\        R\        /# )r   r`  r—  r›  r¯   ©r§   r8   r   r   )r   s   "r   r   r   #  s4   € ÷ 
ñ 
Ü””c��Nð
Ü#&ð
Ü<@ð
ÜSVñ
r   c             #  óà  "  € V'       d!   V.R Uu. uF  qAV,           NK  	  up,           MV. FŒ  pV P                  V4      p\        V\        4      '       d   WV3x € VP                  4       pV P	                  4        F9  w  r‰VP                  4       V8X  g   K  \        V	\        4      '       g   K4  W‰3x € K;  	  KŽ  	  \        W14      p
V
e   \        W
VRR7       Rj  x€L
  R# R# u upi  L5i)u‘  Yield ``(model_id, entry)`` candidates: exact, case-insensitive, then (optionally)
``:cloud``/``-cloud`` suffixed forms. Suffix fallback: some providers (ollama-cloud) store
``kimi-k2.6:cloud`` while the live API returns the bare name; without it context lookup falls to
stale OpenRouter metadata and trips the 64k minimum-context guard. Every consumer shares this
order so a suffix-keyed catalog model counts as KNOWN for ``model_overrides`` fill-gap ``_default``.

``provider`` enables the OpenRouter routing-variant fallback as a LAST
resort â€” after exact, case-insensitive, and ``:cloud`` matching â€” so a
real catalog SKU always wins over its base.
Nr   ©r›  r¯   )z:cloudz-cloud)r¡   rª   r§   r¼   rž   rš  Ú_iter_model_entries)r`  r—  r›  r¯   ÚsuffixrP   ÚentryÚ
name_lowerÚmidÚmdataÚrouted_bases   &&$$       r   r   r   #  sÛ   é € ÷ Sb�%�Ñ9MÓNÑ9M¨v FŸN˜NÑ9MÑNÖNÐhmÐgnÒnˆØ—
‘
˜4Ó ˆÜ�eœT×"Ò"Ø�+ÒØ—Z‘Z“\ˆ
Ø Ÿ,™,ž.‰JˆCØ�y‰y‹{˜jÖ(¬Z¸¼t×-DÔ-DØ�jÔ ó )ñ oô 2°(ÓB€KØÒô 'Ø°È2ô
÷ 	
ò 	
ñ ùò Oñ	
ùs(   ‚C.‘C'¢A2C.ÂC.Â1-C.ÃC,ÃC.c                ó¢   € V ^8„  d   QhR\         \        \        3,          R\        R\        R\        \         \        \        3,          ,          /# )r   r`  r—  r¯   r   )r§   r8   r   r   )r   s   "r   r   r   A  sG   € ÷ hñ hÜ””c��NðhÜ#&ðhÜ25ðhäŒd”3œ�8�nÕñhr   c           	     ó>   € \        R \        WVR7       4       R4      # )zKFirst catalog entry for *model* (exact, case-insensitive, suffix), or None.c              3   ó*   "  € T F	  w  rVx € K  	  R # 5ir?   r@   )rA   Ú_midr¢  s   &  r   rD   Ú$_find_model_entry.<locals>.<genexpr>E  s   é € Ð`Ñ*_™;˜4•Ó*_ùs   ‚©r¯   N)rÀ   r   )r`  r—  r¯   s   &&&r   Ú_find_model_entryr­  A  s!   € ô Ñ`Ô*=¸fÐV^Õ*_Ó`ÐbfÓgÐgr   c                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# )r   r¢  rÐ   r   )r   r8   r   r_   )r   s   "r   r   r   H  s*   € ÷ Qñ Qœ#ð Q¤Cð Q¬H´S­Mñ Qr   c                óÆ   € \        \        V 4      P                  R4      4      P                  V4      p\        V\        \        34      '       d   V^ 8”  d   \        V4      # R# )zNPositive int ``entry.limit[key]`` or None (audio/image models have context=0).ÚlimitN)r«   r¡   rª   r_   r`   )r¢  rÐ   r¦   s   && r   Ú_extract_limitr±  H  sL   € äœ>¨%Ó0×4Ñ4°WÓ=Ó>×BÑBÀ3ÓG€EÜ# E¬C´¨<×8Ò8¸UÀQ¼YŒ3ˆu‹:ÐPÈDÐPr   c                óh   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          /# ©r   r¢  r   ©r§   r8   r   r   r_   )r   s   "r   r   r   N  s&   € ÷ ,ñ ,œD¤¤c �Nð ,¬x¼­}ñ ,r   c                ó   € \        V R4      # )zFContext length from a models.dev model entry, or None if invalid/zero.Úcontext)r±  )r¢  s   &r   Ú_extract_contextr·  N  s   € ä˜% Ó+Ð+r   c          	      ó^   € V ^8„  d   QhR\         R\         R\        R\        \        ,          /# )r   r¯   r—  rÉ   r   )r8   r   r   r_   )r   s   "r   r   r   S  s5   € ÷ [ñ [¬ð [´Cð [Ì4ð [Ô\dÔehÕ\iñ [r   c          	     óä   a€ \        W4      pVe   V# \        \        W4      R4      pVe   V# \        WR7      pVe"   \	        V3R l\        WQV R7       4       R4      MRpVe   V# \        V 4      # )u�  Context window in tokens for provider+model, or None if not found. An EXPLICIT ``model_overrides``
entry wins over the catalog; ``_default`` fills the gap only when the catalog has no answer (the
self-unblock path for wrong/missing context in models.dev). Catalog entries with context=0 are
skipped in favour of later candidates. ``allow_network`` defaults to False â€” runs every turn.

See #84482.
NrU   rÈ   c              3   óV   <"  € T F  w  r\        V4      ;o'       g   K  Sx € K   	  R # 5ir?   )r·  )rA   rª  r¢  Úctxs   &  €r   rD   Ú,lookup_models_dev_context.<locals>.<genexpr>b  s@   øé € ð  JÑ/d¡ ô  qAð  BGó  qHð  jHÐiló  jHŸšÓ/dùs   ƒ)Ÿ
)r¬  )Ú_override_context_windowÚ_override_intÚ_provider_model_capabilitiesr”  rÀ   r   Ú_default_override_context)r¯   r—  rÉ   Úoverride_ctxÚdeclared_ctxr`  Úcatalog_ctxr»  s   &&$    @r   Úlookup_models_dev_contextrÄ  S  s˜   ø€ ô ,¨HÓ<€LØÒØÐÜ Ô!=¸hÓ!NÐP`Óa€LØÒØÐÜ! (ÔH€Fð U[ò  Ug”$ô  JÔ/BÀ6Ð[cÕ/dó  Jð  LPô  Qð  mq€KØ%Ò1ˆ;ÐZÔ7PÐQYÓ7ZÐZr   r°  r¶  rt   rG   i@B Úoutputi Ü Ú
modalitiesÚinputÚtextr&   r:   rQ   údeepseek-flashi� i ô zgpt-6c                óŠ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        \        \        3,          /# )r   r¬   r   )r   r§   r8   r   )r   s   "r   r   r   �  s0   € ÷ 	%ñ 	%¤X¬d´3¼°8­nÕ%=ð 	%ÌÌcÔSVÈhÍñ 	%r   c                óV   € V e   \        R/ V R7      M\        R/ R7      p\        V4      # )a	  The ``model_overrides`` config section ({} on any failure). Deliberately not memoized:
``load_config_readonly()`` is already (mtime, size)-cached upstream, and an ``id(cfg)``-keyed
layer can serve stale overrides after a reload when CPython reuses the dict address.Úmodel_overridesr³   rµ   )r¿   r«   )r¬   Ú	overridess   $ r   Ú_load_model_overridesrÎ  �  s6   € ð Òô 	Ð"¨B°vÕ>äÐ'°Ô4ð ô
 ˜)Ó$Ð$r   c          	      ó¬   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# r®   r°   )r   s   "r   r   r   œ  sF   € ÷ Iñ I¬ð I¼Ä$ÄsÌCÀxÅ.Õ9Qð IÔ]eÔfjÔknÔpsÐksÕftÕ]uñ Ir   c               ó  a€ Ve   \        VR7      M	\        4       oT ;'       g    RP                  4       pS'       d	   V'       g   R# V\        P                  V4      .\	        V4      Op\        R V3R lV 4        4       R4      # )zLOverride section for *provider* (keyed by Hermes OR models.dev id), or None.NrÇ   r   c              3   óV   "  € T F  p\        V\        4      '       g   K  Vx € K!  	  R # 5ir?   r©   )rA   Úsections   & r   rD   Ú-_provider_override_section.<locals>.<genexpr>¨  s'   é € ð  BÑ(c˜WÔgqÐryÔ{÷  hA—’Ó(cùs   ‚)Ÿ
)c              3   óX   <"  € T F  q'       d   SP                  V4      MR x € K!  	  R # 5ir?   )r¡   )rA   rÐ   rÍ  s   & €r   rD   rÓ  ¨  s$   øé € Ð(cÑXbÐQT¾s¨¯©°sÔ);ÈÔ)LÓXbùs   ƒ'*)rÎ  r¹   r�   r¡   r¤   rÀ   )r¯   r¬   Úprovider_keyÚ
candidatesrÍ  s   &$  @r   Ú_provider_override_sectionr×  œ  s‹   ø€ ð Òô 	 VÕ,ä"Ó$ð ð
 —N�N ×)Ñ)Ó+€LßŸLÙàÔ 6× :Ñ :¸<Ó HÐsÔKdÐeqÓKrÐs€JÜñ  BÔ(cÑXbÔ(có  Bð  DHó  Ið  Ir   c                ó¸   € V ^8„  d   QhR\         R\         R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# ©r   r¯   r—  r¬   r   r°   )r   s   "r   r   r   «  sQ   € ÷ 
Qñ 
Q¤sð 
Q´3ð 
QÄ8ÌDÔQTÔVYÐQYÍNÕC[ð 
QÔgoÔptÔuxÔz}Ðu}Õp~Õgñ 
Qr   c               ó*  a€ T;'       g    RP                  4       pV'       d   \        WR7      MRpVf   R# VP                  V4      p\        V\        4      '       d   V# VP                  4       o\        V3R lVP                  4        4       R4      # )zuExplicit per-provider+model override dict (exact, then case-insensitive skipping the ``_default`` sentinel), or None.r   rÇ   Nc              3   óœ   <"  € T FA  w  rVR 8w  g   K  VP                  4       S8X  g   K%  \        V\        4      '       g   K=  Vx € KC  	  R# 5i)Ú_defaultN)r¼   rª   r§   )rA   r¤  r¥  Úmodel_lowers   &  €r   rD   Ú+_explicit_model_override.<locals>.<genexpr>µ  sM   øé € ð  J©™:˜3¸CÀ:Ñ<M”ÐRU×R[ÑR[ÓR]ÐalÑRl”Ôq{ð  }Bô  DH÷  rI—’«ùs   ƒA“AªAÁ
A)r¹   r×  r¡   rª   r§   r¼   rÀ   rž   )r¯   r—  r¬   Ú	model_keyrÒ  r¢  rÝ  s   &&$   @r   Ú_explicit_model_overriderà  «  s…   ø€ à—�˜"×#Ñ#Ó%€IßENÔ(¨ÕAÐTX€GØ‚ÙØ�K‰K˜	Ó"€EÜ�%œ×ÒØˆØ—/‘/Ó#€KÜô  J¨¯©¬ó  Jð  LPó  Qð  Qr   c          	      ó¬   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# r®   r°   )r   s   "r   r   r   ¸  sF   € ÷ Hñ H¤cð H´h¼tÄCÌÀH½~Õ6Nð HÔZbÔcgÔhkÔmpÐhpÕcqÕZrñ Hr   c               ó  € \        WR7      pVe/   \        VP                  R4      \        4      '       d
   VR,          # Ve   \	        VR7      M	\	        4       pVP                  R4      p\        V\        4      '       d   V# R# )zIFill-gap ``_default`` override: per-provider first, then global; or None.rÇ   NrÜ  )r×  rª   r¡   r§   rÎ  )r¯   r¬   rÒ  rÍ  Úglobal_defaults   &$   r   Ú_default_model_overriderä  ¸  sv   € ä(¨ÔA€GØÒœz¨'¯+©+°jÓ*AÄ4×HÒHØ�zÕ"Ð"ð Òô 	 VÕ,ä"Ó$ð ð
 —]‘] :Ó.€NÜ'¨¼×=Ò=ˆ>ÐGÀ4ÐGr   c                óÄ   € V ^8„  d   QhR\         R\         R\        R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# )r   r¯   r—  Úcatalog_hitr¬   r   rŠ  )r   s   "r   r   r   Æ  sV   € ÷ qñ qÜðqÜðqÜ/3ðqÜ=EÄdÌ3ÔPSÈ8ÅnÕ=UðqäŒd”3œ�8�nÕñqr   c               óP   € \        WVR7      pVf	   V'       d   V# \        WR7      # )zGExplicit override if any; else the ``_default`` only on a catalog miss.rÇ   )rà  rä  )r¯   r—  ræ  r¬   Úexplicits   &&$$ r   Ú_override_forré  Æ  s)   € ô (¨ÀÔG€HØÒ+¯{ˆ8ÐpÔ@WÐX`Ô@pÐpr   c                ót   € V ^8„  d   QhR\         \        \        3,          R\        R\        \        ,          /# )r   ÚoverriderÐ   r   r´  )r   s   "r   r   r   Î  s-   € ÷ ñ œD¤¤c �Nð ´ð ¼Ä#½ñ r   c                ó~  € V P                  V4      pVf   R# \        P                  ! \        \        4      ;_uu_ 4        \        V4      pV^ 8”  d   VuuRRR4       #  RRR4       V\        V4      3pV\        9  d,   \        P                  V4       \        P                  RW4       R#   + '       g   i     LU; i)zDCoerce an override field to a positive int, warning once on garbage.NzKmodel_overrides: ignoring invalid %s value %r (expected a positive integer))r¡   r  r  Ú	TypeErrorrK  r_   ÚreprÚ_OVERRIDE_WARNED_KEYSrÍ   rÎ   rÏ   )rë  rÐ   Úrawr¦   Úwarn_keys   &&   r   r¾  r¾  Î  s‘   € à
�,‰,�sÓ
€CØ
‚{ÙÜ	×	Ò	œY¬
×	3Õ	3Ü�C“ˆØ�1Œ9Ø÷ 
4Ò	3à÷ 
4ð ”T˜#“YÐ€HØÔ,Ô,Ü×!Ñ! (Ô+Ü�‰ÐdÐfiÔoÙ÷ 
4×	3ús   ¿B,Â,B<	c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# r–  ©r8   r   r_   )r   s   "r   r   r   Þ  s*   € ÷ Kñ K¤sð K´3ð K¼8ÄC½=ñ Kr   c                ó<   € \        W4      pVe   \        VR4      # R# )a*  EXPLICITLY overridden context_window, or None. Explicit-only on purpose: this runs early in the
resolution chain (agent/model_metadata.py, before custom_providers and live probes) where a
``_default`` must not preempt more specific sources; fill-gap defaults apply in ``lookup_models_dev_context``.NrU   )rà  r¾  )r¯   r—  Úovs   && r   r½  r½  Þ  s%   € ô 
" (Ó	2€BØ24².Œ=˜Ð-Ó.ÐJÀdÐJr   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   r¯   r   ró  )r   s   "r   r   r   ç  s"   € ÷ Uñ U¬ð U´¼µñ Ur   c                ó<   € \        V 4      pVe   \        VR4      # R# )zBFill-gap context from a ``_default`` override, for catalog misses.NrU   )rä  r¾  )r¯   r´   s   & r   rÀ  rÀ  ç  s%   € ä% hÓ/€GØ7>Ò7JŒ=˜Ð"2Ó3ÐTÐPTÐTr   c                ó¬   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          \        \
        ,          3,          /# )r   rë  r   )r§   r8   r   r^   r   r   )r   s   "r   r   r   í  s;   € ÷ ñ ¬¬c´3¨h­ð ¼EÄ$ÄsÌCÀxÅ.ÔRZÔ[_ÕR`ÐB`Õ<añ r   c                óR  € / pR UUu/ uF  w  r#\        W4      ;pf   K  W$bK  	  pppV'       d   WQR&   R	 F   w  r2W09   g   K  \        W,          4      W&   K"  	  RpRV 9   d   \        V R,          4      ;qaR&   RV 9   d    \        V R,          ;'       g    R4      VR&   W3# u uppi )
uÆ   Translate canonical override keys into a models.dev-shaped patch. Returns ``(patch, vision)`` â€”
vision is out-of-band because it maps onto the ``modalities.input`` list rather than a scalar field.Nr°  r)   r'   ry   r   rQ   ))r¶  rU   ))rv   rG   )rw   r:   )r¾  r   r8   )rë  ÚpatchÚcatalog_keyÚoverride_keyr¦   r°  r<   s   &      r   Ú_override_to_catalog_shaperý  í  sÅ   € ð €Eá<\ôÙ<\Ñ8˜{Ü" 8Ó:Ð:ˆEô 	ˆÒÑ<\ð 
ñ ÷ Øˆg‰Û%kÑ!ˆØÖ#Ü!% hÕ&<Ó!=ˆEÓñ &lð "€FØ˜HÔ$Ü'+¨HÐ5FÕ,GÓ'HÐHˆ�|Ñ$Ø˜Ô!Ü˜h ~Õ6×<Ð<¸"Ó=ˆˆh‰Øˆ=Ðùós
   ˆB# B#c                ó¢   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\         \        \        3,          /# )r   rð  rë  r   r  )r   s   "r   r   r     s?   € ÷ ñ ¬D´´c°­Nð ÄdÌ3ÔPSÈ8Ånð ÔY]Ô^aÔcfÐ^fÕYgñ r   c                ó  € \        V4      w  r#\        V 4      pVP                  RR4      pV'       d"   / \        V P	                  R4      4      CVCVR&   Ve¡   \        \        V P	                  R4      4      4      pVP	                  R4      p\        V\        4      '       d   \        V4      M. pV'       d   RV9  d   VP                  R4       M V'       g   RV9   d   VP                  R4       WvR&   WdR&   VP                  V4       V# )uÉ   Patch a catalog entry with a canonical-schema override. Sub-dicts (``limit``, ``modalities``) are
merged, not clobbered â€” setting only ``context_window`` must not wipe the catalog's ``limit.output``.r°  NrÆ  rÇ  r&   )
rý  r§   Úpopr«   r¡   rª   rš   r    ÚremoveÚupdate)rð  rë  ÚshapedÚvision_overrideÚmergedÚlimit_patchÚ	base_modsÚ
input_modss   &&      r   Ú"_merge_catalog_entry_with_overrider	    sã   € ô 9¸ÓBÑ€FÜ�#‹Y€FØ—*‘*˜W dÓ+€KßØMœ^¨C¯G©G°GÓ,<Ó=ÐMÀÐMˆˆw‰ØÒ"Üœ¨¯©°Ó(=Ó>Ó?ˆ	Ø—]‘] 7Ó+ˆ
Ü)3°JÄ×)EÒ)E”T˜*Ô%È2ˆ
ß˜w¨jÔ8Ø×Ñ˜gÕ&ß  W°
Ô%:Ø×Ñ˜gÔ&Ø'�'ÑØ(ˆ|ÑØ
‡M�M�&ÔØ€Mr   c                ó¸   € V ^8„  d   QhR\         R\         R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# rÙ  r°   )r   s   "r   r   r     sL   € ÷ Vñ VÜðVÜðVÜ*2´4¼¼S¸µ>Õ*BðVäŒd”3œ�8�nÕñVr   c               óÖ   € \        WR7      ;'       g    T ;'       g    RP                  4       p\        P                  Y1;'       g    RP                  4       P	                  4       34      # )zSBuilt-in metadata for a provider/model pair, if Hermes has a vendor-specific entry.rÇ   r   )rÑ   r¹   Ú_BUILTIN_MODEL_METADATAr¡   r¼   )r¯   r—  r¬   rÕ  s   &&$ r   Ú_builtin_model_metadatar    sQ   € ô " (Ô:×VÐV¸x¿~¸~È2×>TÑ>TÓ>V€LÜ"×&Ñ&¨·{°{À×6IÑ6IÓ6K×6QÑ6QÓ6SÐ'TÓUÐUr   c          	      ót   € V ^8„  d   QhR\         R\         R\        \        \         \        3,          ,          /# r–  r°   )r   s   "r   r   r      s4   € ÷ 
cñ 
c¬Cð 
c¼ð 
cÄÌÌcÔSVÈhÍÕ@Xñ 
cr   c                ó¦   € ^ RI Hp RT;'       g    RP                  4       P                  4       9  g   V! V 4      f   R# / \        CRRRR.R	R.//C# )
aÑ  Fill-gap base for an OpenCode Zen/Go ``*-vision*`` model id the catalog does not know. The relays
resell vendor previews (``deepseek-v4-flash-vision-exp``) before models.dev indexes them, and the id's
``-vision`` token is the vendor's own capability marker; without it ``image_input_mode: auto`` treats
the model as text-only and detours images through the lossy describe path (#96066). Every other field
keeps the unknown-model defaults, so only vision is claimed.)Úopencode_provider_familyz-visionr   NrÆ  rÇ  rÈ  r&   rÅ  )Úhermes_cli.modelsr  r¹   r¼   Ú_UNKNOWN_MODEL_BASE)r¯   r—  r  s   && r   Ú_relay_vision_marker_metadatar     s[   € õ ;à˜Ÿ˜ "×+Ñ+Ó-×3Ñ3Ó5Ô5Ñ9QÐRZÓ9[Ò9cÙØbÔ!Ðb <°'¸FÀGÐ;LÈhÐY_ÐX`Ð1aÑbÐbr   c                ó^   € V ^8„  d   QhR\         R\         R\        \         \        3,          /# r–  )r8   r§   r   )r   s   "r   r   r   -  s.   € ÷ Tñ T¬3ð T´sð T¼tÄCÌÀH½~ñ Tr   c                ób   € ^ RI Hp V! V 4      pVe   VP                  P                  V/ 4      # / # )a  Exact-model declaration from the registered ``ProviderProfile.model_capabilities`` (canonical
``model_overrides`` schema). The ONE plugin seam: every consumer that reads models.dev through this
module (picker badges, image routing, ``/api/model/info``, context lookup) sees it (#102115).)Úget_provider_profile)r²   r  Úmodel_capabilitiesr¡   )r¯   r—  r  Úprofiles   &&  r   r¿  r¿  -  s5   € õ /á" 8Ó,€GØ8?Ò8Kˆ7×%Ñ%×)Ñ)¨%°Ó4ÐSÐQSÐSr   c                óü   € V ^8„  d   QhR\         R\         R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          R\        \        \         \        3,          ,          /# )r   r¯   r—  r¢  r¬   r   r°   )r   s   "r   r   r   7  sg   € ÷ Iñ IÜðIÜðIÜ&.¬t´C¼°H­~Õ&>ðIÜKSÔTXÔY\Ô^aÐYaÕTbÕKcðIäŒd”3œ�8�nÕñIr   c               óô   € \        WVR7      pVe   TMTp\        W4      pV'       d   \        Ve   TM\        V4      p\	        WVRJVR7      pVf   \        W4      pVf   V# \        Ve   TM\        V4      # )zúCatalog/builtin metadata, patched by the plugin's declaration, then by the explicit user override.
``_UNKNOWN_MODEL_BASE`` is the base on a catalog miss; a fill-gap ``_default`` applies only when no
source knows the model. None when nothing knows it.rÇ   N)ræ  r¬   )r  r¿  r	  r  ré  r  )r¯   r—  r¢  r¬   ÚbuiltinÚbaseÚdeclaredrë  s   &&&$    r   Ú_apply_overridesr  7  s�   € ô & h¸fÔE€GØÒ%‰5¨7€DÜ+¨HÓ<€HßÜ1¸$Ò:J±$ÔPcÐemÓnˆÜ˜X¸$ÀdÐ:JÐSYÔZ€HØ‚|Ü,¨XÓ=ˆØÒ#ˆ4ð  IÔ)KÐTXÒTdÉDÔj}ð  @Hó  *Ið  Ir   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# r³  r�  )r   s   "r   r   r   H  s&   € ÷ kñ k¤$¤s¬C x¥.ð k´Tñ kr   c                óÂ   € \        V P                  R/ 4      4      P                  R4      p\        V\        4      '       d   RV9   # \	        V P                  RR4      4      # )z´Prefer explicit ``modalities.input`` (the older ``attachment`` flag can be stale or too broad
for image routing); fall back to it only when the input modalities are absent/invalid.rÆ  rÇ  r&   r'   F)r«   r¡   rª   rš   r   )r¢  r  s   & r   Ú_entry_supports_visionr!  H  sR   € ô   §	¡	¨,¸Ó ;Ó<×@Ñ@ÀÓI€JÜ$.¨z¼4×$@Ò$@ˆ7�jÑ ÐjÄdÈ5Ï9É9ÐUaÐchÓKiÓFjÐjr   c                ó¢   € V ^8„  d   QhR\         R\         R\        R\        \        \         \        3,          ,          R\        \
        ,          /# )r   r¯   r—  rÉ   r¬   r   )r8   r   r   r§   r   rs   )r   s   "r   r   r   O  sL   € ÷  ñ  Üð Üð Ü15ð ÜGOÔPTÔUXÔZ]ÐU]ÕP^ÕG_ð äÔÕ ñ r   c               óö  € \        WVR7      pVe   \        WAV 4      MRpVRJ ;'       d    \        WVR7      RJ p\        WWSR7      pVf   R# \	        \        VP                  RR4      4      V'       d   RV9  d
   RV9  d   RM
\        V4      V'       d
   RV9  d   RM\        VP                  RR4      4      \        VR	4      ;'       g    R
\        VR4      VP                  RR4      ;'       g    RR7      # )um  Capability metadata from the models.dev cache, or None if unresolvable. EXPLICIT ``model_overrides``
patch catalog fields; ``_default`` fills the gap only for models the catalog does not know. Unspecified
fields fall through to the catalog, or to safe defaults. ``allow_network`` defaults to False (hot path).

EXPLICIT ``model_overrides`` entries (per-provider+model) win over catalog values for the fields they
set. ``_default`` entries fill the gap only for models the catalog does not know â€” the supported
self-unblock path for custom/local models (#8731) and for models with wrong metadata in models.dev
(#84482).
)rÉ   r¬   NrÇ   rG   Fr'   rÆ  r:   r¶  rt   rÅ  rQ   r   )rv   r)   rw   rU   rx   ry   )	r”  r­  r  r  rs   r   r¡   r!  r±  )r¯   r—  rÉ   r¬   r`  r¢  Úunknown_baserð  s   &&$$    r   Úget_model_capabilitiesr%  O  sú   € ô " (ÐPVÔW€FØ:@Ò:LÔ˜f¨XÔ6ÐRV€Eà�ˆ÷ 	Lð 	LÜ# H¸FÔCÀtÐKð ô ˜8¨EÔ
A€CØ
‚{ÙÜÜ˜CŸG™G K°Ó7Ó8÷  °CÔ 7¸LÐPSÔ<Sñ ä'¨Ó,ç#/°KÀsÔ4J™4ÔPTÐUX×U\ÑU\Ð]hÐjoÓUpÓPqÜ% c¨9Ó5×?Ð?¸Ü(¨¨hÓ7Ø—W‘W˜X rÓ*×0Ð0¨bôð r   c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# ©r   r¯   rÉ   r   ©r8   r   rš   )r   s   "r   r   r   r  s*   € ÷ zñ z¤3ð z¼$ð zÌ$ÌsÍ)ñ zr   c               óª   € ^ RI Hp V! V 4      ;'       g    T p \        WR7      pVe&   V Uu. uF  p\        W4      '       d   K  VNK  	  up# . # u upi )zœAll model IDs for a provider ([] if unknown). ``allow_network`` defaults to True: the model
picker is interactive and a fresh catalog is worth a short wait.)Únormalize_providerrÈ   )r  r*  r”  Ú"_should_hide_from_provider_catalog)r¯   rÉ   r*  r`  r¤  s   &$   r   Úlist_provider_modelsr,  r  sP   € õ 5Ù! (Ó+×7Ð7¨x€HÜ! (ÔH€FØ_eÒ_q™6Ó[™6�CÔ)KÈH×)Z�CˆC™6Ñ[ÐyÐwyÐyùÒ[s   ­AÁAzZ-tts\b|embedding|live-|-(preview|exp)-\d{2,4}[-_]|-image\b|-image-preview\b|-customtools\bc                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   r¯   Úmodel_idr   )r8   r   )r   s   "r   r   r   ‹  s&   € ÷ Bñ B´ð BÄð BÌñ Br   c                 óÆ   € T ;'       g    R P                  4       P                  4       R9   ;'       d0    T;'       g    R P                  4       P                  4       \        9   # )r   >   r�   rŽ   )r¹   r¼   Ú_GOOGLE_HIDDEN_MODELS)r¯   r.  s   &&r   r+  r+  ‹  s^   € Ø�NˆN˜×!Ñ!Ó#×)Ñ)Ó+Ð/CÑC÷  Bð  BÈÏÈÐUW×H^ÑH^ÓH`×HfÑHfÓHhô  mBñ  IBð  Br   c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# r'  r(  )r   s   "r   r   r   �  s%   € ÷ $ñ $¤#ð $¼ð $ÌÌcÍñ $r   c               ó>  € \        WR7      pVe‡   VP                  4        UUu. uFi  w  r4\        V\        4      '       g   K  \	        W4      '       d   K0  VP                  RR4      '       g   KJ  \        P                  V4      '       d   Kg  VNKk  	  upp# . # u uppi )z³Model IDs suitable for agentic use: tool_call=True, minus hidden and noise models. [] on any
failure. ``allow_network`` defaults to True (called from interactive model selection).rÈ   rG   F)r”  rž   rª   r§   r+  r¡   Ú_NOISE_PATTERNSÚsearch)r¯   rÉ   r`  r¤  r¢  s   &$   r   Úlist_agentic_modelsr5  �  s¦   € ô " (ÔH€Fð 
Ò	ð %Ÿl™lœnôÙ,‘
�Ü�eœT×"ô 	Ü+MÈh×+\ô 	Øaf×ajÑajÐkvÐx}×a~ô 	ô HW÷  H^ñ  H^ð  _b÷  Hc÷ 	ˆ™nòð $ð "$ð$ùó s   ¤BÁBÁBÁ0BÂBc                ój   € V ^8„  d   QhR\         R\        \         \        3,          R\         R\        /# )r   r.  rð  rR   r   )r8   r§   r   r   )r   s   "r   r   r   ™  s0   € ÷ ñ ¤ð ¬$¬s´C¨x­.ð Äsð Ìyñ r   c           !     ó�  aa€ \        VP                  R4      4      o\        VP                  R4      4      oR V3R llpR V3R llp\        R RT RVP                  RR	4      ;'       g    T R
VP                  R
R	4      ;'       g    R	RV/R! Uu/ uF  qU\        VP                  VR4      4      bK   	  upBRV! R4      RV! R4      R\	        VR4      ;'       g    ^ R\	        VR4      ;'       g    ^ R\	        VR4      R\        SP                  R^ 4      ;'       g    ^ 4      R\        SP                  R^ 4      ;'       g    ^ 4      RV! R4      RV! R4      RVP                  RR	4      ;'       g    R	RVP                  RR	4      ;'       g    R	RVP                  RR	4      ;'       g    R	RVP                  RR4      /B # u upi )"zEConvert a raw models.dev model entry dict into a ModelInfo dataclass.ÚcostrÆ  c                óJ   € V ^8„  d   QhR\         R\        \         R3,          /# )r   rÐ   r   .)r8   r^   )r   s   "r   r   Ú'_parse_model_info.<locals>.__annotate__�  s"   € ÷ =ñ =”3ð =œ5¤ c �?ñ =r   c                 ó€   <€ SP                  V 4      ;'       g    . p\        V\        4      '       d   \        V4      # R# )Nr@   )r¡   rª   rš   r^   )rÐ   ÚmodsrÆ  s   & €r   Ú_modsÚ _parse_model_info.<locals>._mods�  s4   ø€ Ø�~‰~˜cÓ"×(Ð( bˆÜ(¨¬t×4Ò4Œu�T‹{Ð<¸"Ð<r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   rÐ   r   )r8   r   r`   )r   s   "r   r   r:     s"   € ÷ Gñ G”3ð Gœ8¤E�?ñ Gr   c                 óR   <€ SP                  V 4      e   \        SV ,          4      # R # r?   )r¡   r`   )rÐ   r8  s   &€r   Ú_costÚ _parse_model_info.<locals>._cost   s$   ø€ Ø#'§8¡8¨C£=Ò#<Œu�T˜#•YÓÐFÀ$ÐFr   rO   rP   r   rQ   rR   Fr(   rÇ  rT   rÅ  rU   r¶  rV   rW   r   r   rX   Ú
cache_readrY   Úcache_writerZ   Ú	knowledger[   r\   r]   r@   )r:   rG   r'   rS   rH   rI   )r«   r¡   r   r   r±  r`   )r.  rð  rR   r=  rA  Úkr8  rÆ  s   &&&   @@r   Ú_parse_model_inforG  ™  s!  ù€ ä˜#Ÿ'™' &›/Ó*€DÜ §¡¨Ó 5Ó6€J÷=ð =÷Gð Gäñ 	Øð	ØŸ'™' &¨"Ó-×9Ð9°ð	ØBEÇ'Á'È(ÐTVÓBW×B]ÐB]Ð[]ð	Økvð	ñ 0Ló  Mñ  0L¨!Œd�3—7‘7˜1˜eÓ$Ó%Ò%ñ  0Lñ  Mñ	ñ ˜w›ð	ñ <AÀ»?ð	ô & c¨9Ó5×:Ð:¸ð		ô HVÐVYÐ[cÓGd×GiÐGiÐhið		ô vDð  EHð  JQó  vRð		ô
 ˜Ÿ™ '¨1Ó-×2Ð2°Ó3ð	ô
 BGÀtÇxÁxÐPXÐZ[ÓG\×GaÐGaÐ`aÓAbð	ñ ˜lÓ+ð	ñ ?DÀMÓ>Rð	ð Ÿ™ ¨bÓ1×7Ð7°Rð	ð GJÇgÁgÈnÐ^`ÓFa×FgÐFgÐegð	ð �w‰w�x Ó$×*Ð*¨ð	ð 9<¿¹ÀÈuÓ8Uò	ð 	ùò Ms   Â$Gc                ó^   € V ^8„  d   QhR\         R\        \         \        3,          R\        /# )r   rR   rð  r   )r8   r§   r   rk   )r   s   "r   r   r   ®  s)   € ÷ ñ ¤cð ´´S¼#°Xµð Ä<ñ r   c                ó¸  € VP                  R4      ;'       g    . pVP                  R4      ;'       g    / p\        YP                  RR4      ;'       g    T \        V\        4      '       d   \	        V4      MRVP                  RR4      ;'       g    RVP                  RR4      ;'       g    R\        V\
        4      '       d   \        V4      R7      # ^ R7      # )	zAConvert a raw models.dev provider entry dict into a ProviderInfo.rm   r`  rP   r   rn   ro   )rO   rP   rm   rn   ro   rp   r@   )r¡   rk   rª   rš   r^   r§   r¾   )rR   rð  rm   r`  s   &&  r   Ú_parse_provider_inforJ  ®  s¸   € à
�'‰'�%‹.×
Ð
˜B€CØ�W‰W�XÓ×$Ð$ "€FÜØŸW™W V¨RÓ0×?Ð?°KÔS]Ð^aÔcg×ShÒShÄUÈ3ÄZÐnpØ�G‰G�E˜2Ó×$Ð$ "¨#¯'©'°%¸Ó*<×*BÐ*BÀÔ_iÐjpÔrv×_wÒ_wÔPSÐTZÓP[ôð à}~ôð r   c          	      ó–   € V ^8„  d   QhR\         R\        R\        \        \         \        3,          ,          R\        \
        ,          /# )r   rR   rÉ   r¬   r   )r8   r   r   r§   r   rk   )r   s   "r   r   r   ¸  sE   € ÷ Kñ KÜðKÜ(,ðKÜ=EÄdÌ3ÔPSÈ8ÅnÕ=UðKäŒlÕñKr   c               óf   € \        WR7      ;'       g    T p\        W14      pVe   \        W44      # R# )zProvider metadata by Hermes or models.dev ID, or None if not cataloged. ``allow_network`` defaults to True (interactive setup).rÇ   N)rÑ   rŽ  rJ  )rR   rÉ   r¬   r™   rð  s   &$$  r   Úget_provider_inforM  ¸  s5   € ô ˜[Ô8×GÐG¸K€GÜ
˜WÓ
4€CØ14²Ô Ó-ÐJÀdÐJr   c                ó¢   € V ^8„  d   QhR\         R\         R\        R\        \        \         \        3,          ,          R\        \
        ,          /# )r   rR   r.  rÉ   r¬   r   )r8   r   r   r§   r   r   )r   s   "r   r   r   Á  sR   € ÷ Mñ MÜðMÜ #ðMÜ7;ðMÜMUÔVZÔ[^Ô`cÐ[cÕVdÕMeðMäŒiÕñMr   c          	     óÌ   € \        WR7      ;'       g    T p\        WBR7      pVe   \        \        WQRV R7      VR34      MVR3w  rg\	        WWsR7      pVe   \        WhV4      # R# )uY  Full model metadata by Hermes or models.dev provider ID (exact match, then case-insensitive), or
None if not found. EXPLICIT ``model_overrides`` patch known catalog models; ``_default`` fills the gap
only for unknown ones. ``allow_network`` defaults to False â€” cost guard and inventory are hot paths.

``model_overrides`` entries use the SAME canonical schema as every other consumer (``context_window``,
``supports_*``, ``model_family``) â€” they are translated into the catalog shape at
this boundary, and sub-dicts (``limit``, ``modalities``) are merged rather than clobbered. See #84482,
#8731.
rÇ   rÈ   NFrŸ  )rÑ   r‘  rÀ   r   r  rG  )	rR   r.  rÉ   r¬   r™   r`  r¤  r¢  rð  s	   &&$$     r   Úget_model_inforP  Á  s…   € ô ˜[Ô8×GÐG¸K€GÜ˜gÔC€Fð @Fò  @R”Ô)¨&ÈEÐ\gÔhÐksÐuyÐjzÔ{ð  Yað  cgð  Xh�J€Cä
˜;°%Ô
G€CØ36²?Ô˜S wÓ/ÐLÈÐLr   c                ó   € V ^8„  d   Qh/ ^ \         9   d   \        \        \        3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d1   \
        \        \        \        \        ,          3,          ,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R	&   ^	\         9   d=   \        \        \        \        3,          \        \        \        3,          3,          ;R
&   ^
\         9   d   \        P                  ;R&   # )r   rZ  rQ  rc  r�   rœ   rÌ   rï  r  Ú_DEEPSEEK_FLASH_VISIONr  r3  )Ú__conditional_annotations__r§   r8   r   r`   r   rš   Úsetr^   ÚreÚPattern)r   s   "r   r   r      sU  € ÷ Tñ T÷< 'Ò &”4œœS˜•>Ñ &ñ=T÷> "Ò !œÑ !ñ?T÷@ #Ò "œÑ "ñAT÷Zò œœS¤#˜X�ñ ñ[T÷H ?Ò >œ¤$¤s¬D´­I ~Õ"6Õ7Ñ >ñIT÷L .Ò -¤#Ñ -ñMT÷X #Ò "”sÑ "ñYT÷^ XÒ W”Tœ#œs˜(•^Ñ Wñ_T÷hò œœS¤#˜X�ñ ñiT÷xò œœe¤C¬ H�o¬t´C¼°H­~Ð=Õ>ñ ñyT÷vvò v”—‘ñ vòwTr   i@8  r?   )r   )F)r~   zgpt-6-astra)r„   rÉ  )r„   zdeepseek-v4-flash)r„   zdeepseek-v4.1-flash)r„   zdeepseek-v4-flash-vision-exp>   ú
gemma-3-1bú
gemma-3-2bú
gemma-3-4búgemma-3-12búgemma-3-27búgemma-3-1b-itúgemma-3-2b-itúgemma-3-4b-itúgemini-1.5-proúgemma-3-12b-itúgemma-3-27b-itúgemma-4-26b-itúgemma-4-31b-itúgemini-1.5-flashúgemini-2.0-flashúgemma-4-26b-a4b-itúgemini-1.5-flash-8búgemini-2.0-flash-lite)urS  re   r  r  ÚloggingrU  r|  r/  Údataclassesr   Úpathlibr   Útypingr   r   r   r   r	   Úutilsr
   r   rÜ   r   rH  Ú	getLoggerra   rÎ   r  rR  rS  rZ  rQ  rc  ÚLockrt  ru  rv  r   rk   rs   r�   rœ   r¤   r«   rÄ   rÑ   rT  rÌ   r¿   rÝ   rá   rå   rë   r÷   r  r  r  r  r"  r  r4  r=  rØ   r?  rM  rT  r[  re  ri  rm  rp  rw  rY  rË   rŽ  r‘  r”  Ú	frozensetr™  rš  r   r­  r±  r·  rÄ  rï  r  rR  r  rÎ  r×  rà  rä  ré  r¾  r½  rÀ  rý  r	  r  r  r¿  r  r!  r%  r,  ÚcompileÚ
IGNORECASEr3  r0  r+  r5  rG  rJ  rM  rP  r   )rS  s   @r   Ú<module>rs     sÿ  øðöTó Û Û Û 	Û Û Ý !Ý ß 3Õ 3ç 6å 4ã à	×	Ò	˜8Ó	$€Ø.€Ø Ð ØÐ à$&Ð Ó &Ø !Ð Ó !Ø!"Ð Ó "Ø"ŸšÓ)Ð Ø$Ÿ>š>Ó+Ð Ø %Ð ð ÷,Hð ,Hó ð,Hð^ ÷ð ó ðð ÷ð ó ðð*Ø�,ð*Ø (¨+ð*Ø7BÀKð*àˆhð*à$ hð*à0>Àð*àJOÐQVð*ð Ðð*ð  -Ð.?ð*ð Ð!ð	*ð $-¨ið	*ð
 Ð'ð*ð
 *3°Ið*ð �Yð*ð !-¨lð*ð =GÈ
ð*ð ˆyñ*ð '¨	ð*ð 4=Ð>Nð*ð �(ð*ð +¨Jð*ð �=ð*ð �ð*ð $ ^ð*ð �=ð*ð #+¨Hð*ð 7?Àð*ð 
ˆ5ð*ð �ð*ð ˆhð*ð ! (ð*ð$ ˆvð%*ð$ ˜vð%*ð$ (.¨vñ%*ð$ 8AÀ)Ø�, ¨l¸HÀhØ�Nñ)*Ð ó ð. ;?Ð Ó >õ4õ4ðØ9=÷ð8Ø9=÷ñ* ),«Ð  Ó -ðÈ$÷ õ$õ
1õ1÷õWõ
,õXõSõ4õ
õ&õ8÷ôN�9ô Nð2¸%÷ 2õ&xõð¸"÷ õjõ"võõ2õIñ&7!È4÷ 7!ð 7!õtFõ8ðWØ,1ðWØVZ÷Wñ !*¨<¨.Ó 9Ð õ*ð0
ØCGð
ØY[÷
÷<hõQõ,ð
[ÐRW÷ [ñ4 !›UÐ Ó "ð (/°¸FÐ0CÀ[ÐRVÐ&WÐ Ó Wð ˆi˜ H¨gÐ6Ø�7˜V WÐ-¨x¸&¸ÐBØ�Ø�ØÐð*Ð ó ð Ø�)˜Y¨°'Ð:Ø�w ¨Ð 1°8¸f¸XÐFØ�TØ�TØ�'ð ð #Ð$:Ø%Ð'=Ø'Ð)?Ø0Ð2HðBÐ ó ð&	%À÷ 	%ðIÐTX÷ Ið
QÐ^b÷ 
QðHÐQU÷ HðqØX\÷qõõ KõUõõ*ð,VØEI÷Võ
cõTðIØfj÷Iõ"kð Ø8=ð Øbf÷ ðFzÀ÷ zð !ŸjšjØeÐgi×gtÑgtóv€ó vñ "ò 	#ó 	Ð õBð$À÷ $õõ*ðKØ/3ðKØX\÷KðMØ>CðMØhl÷Mñ Mr   