§
    ‰eîi¾R  ã                   ó†  — U d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlZ ej        e¦  «        ZdZdZi ae
ee	f         ed	<   daeed
<   e G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Zi dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d#“d$d%d&d'd'd(d)d*d+d,d-d.d/d0d1œ¥Ze
eef         ed2<   dZee
eef                  ed3<   d4efd5„Zd4e
ee	f         fd6„Z d7e
ee	f         d4dfd8„Z!dTd:e"d4e
ee	f         fd;„Z#d<ed=ed4ee$         fd>„Z%d?e
ee	f         d4ee$         fd@„Z&e G dA„ dB¦  «        ¦   «         Z'd<ed4ee
ee	f                  fdC„Z(dDe
ee	f         d=ed4ee
ee	f                  fdE„Z)d<ed=ed4ee'         fdF„Z*d<ed4ee         fdG„Z+ddl,Z, e,j-        dHe,j.        ¦  «        Z/e,j0        edI<    e1h dJ£¦  «        Z2d<edKed4e"fdL„Z3d<ed4ee         fdM„Z4dKedNe
ee	f         dOed4efdP„Z5dOedNe
ee	f         d4efdQ„Z6dOed4ee         fdR„Z7dOedKed4ee         fdS„Z8dS )Uu]  Models.dev registry integration â€” primary database for providers and models.

Fetches from https://models.dev/api.json â€” a community-maintained database
of 4000+ models across 109+ providers.  Provides:

- **Provider metadata**: name, base URL, env vars, documentation link
- **Model metadata**: context window, max output, cost/M tokens, capabilities
  (reasoning, tools, vision, PDF, audio), modalities, knowledge cutoff,
  open-weights flag, family grouping, deprecation status

Data resolution order (like TypeScript OpenCode):
  1. Bundled snapshot (ships with the package â€” offline-first)
  2. Disk cache (~/.hermes/models_dev_cache.json)
  3. Network fetch (https://models.dev/api.json)
  4. Background refresh every 60 minutes

Other modules should import the dataclasses and query functions from here
rather than parsing the raw JSON themselves.
é    N)Ú	dataclass)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)Úatomic_json_writezhttps://models.dev/api.jsoni  Ú_models_dev_cacheÚ_models_dev_cache_timec                   óÒ  — e Zd ZU dZeed<   eed<   eed<   eed<   dZeed<   dZeed<   dZ	eed	<   dZ
eed
<   dZeed<   dZeed<   dZeedf         ed<   dZeedf         ed<   dZeed<   dZeed<   dZee         ed<   dZeed<   dZeed<   dZee         ed<   dZee         ed<   dZeed<   dZeed<   dZeed<   dZeed<   d efd!„Zd efd"„Z d efd#„Z!d efd$„Z"d efd%„Z#d efd&„Z$dS )'Ú	ModelInfoz1Full metadata for a single model from models.dev.ÚidÚnameÚfamilyÚprovider_idFÚ	reasoningÚ	tool_callÚ
attachmentÚtemperatureÚstructured_outputÚopen_weights© .Úinput_modalitiesÚoutput_modalitiesr   Úcontext_windowÚ
max_outputNÚ	max_inputg        Ú
cost_inputÚcost_outputÚcost_cache_readÚcost_cache_writeÚ Úknowledge_cutoffÚrelease_dateÚstatusÚinterleavedÚreturnc                 ó.   — | j         dk    p
| j        dk    S )Nr   )r   r    ©Úselfs    ú2/home/div/.hermes/hermes-agent/agent/models_dev.pyÚhas_cost_datazModelInfo.has_cost_dataT   s   € ØŒ Ò"Ð: dÔ&6¸Ò&:Ð:ó    c                 ó"   — | j         pd| j        v S )NÚimage)r   r   r*   s    r,   Úsupports_visionzModelInfo.supports_visionW   s   € ØŒÐB '¨TÔ-BÐ"BÐBr.   c                 ó   — d| j         v S )NÚpdf©r   r*   s    r,   Úsupports_pdfzModelInfo.supports_pdfZ   s   € Ø˜Ô-Ð-Ð-r.   c                 ó   — d| j         v S )NÚaudior4   r*   s    r,   Úsupports_audio_inputzModelInfo.supports_audio_input]   s   € Ø˜$Ô/Ð/Ð/r.   c                 óÔ   — |                       ¦   «         sdS d| j        d›d�d| j        d›d�g}| j        �|                     d| j        d›d�¦  «         d	                     |¦  «        S )
z<Human-readable cost string, e.g. '$3.00/M in, $15.00/M out'.Úunknownú$z.2fz/M inz/M outNzcache read $z/Mú, )r-   r   r    r!   ÚappendÚjoin)r+   Úpartss     r,   Úformat_costzModelInfo.format_cost`   s†   € à×!Ò!Ñ#Ô#ð 	Ø�9Ø/�T”_Ð/Ð/Ð/Ð/Ð1Q°TÔ5EÐ1QÐ1QÐ1QÐ1QÐRˆØÔÐ+Ø�LŠLÐD¨Ô(<ÐDÐDÐDÐDÑEÔEÐEØ�yŠy˜ÑÔÐr.   c                 ó  — g }| j         r|                     d¦  «         | j        r|                     d¦  «         |                      ¦   «         r|                     d¦  «         |                      ¦   «         r|                     d¦  «         |                      ¦   «         r|                     d¦  «         | j        r|                     d¦  «         | j        r|                     d¦  «         |rd                     |¦  «        nd	S )
zBHuman-readable capabilities, e.g. 'reasoning, tools, vision, PDF'.r   ÚtoolsÚvisionÚPDFr7   zstructured outputzopen weightsr<   Úbasic)	r   r=   r   r1   r5   r8   r   r   r>   )r+   Úcapss     r,   Úformat_capabilitieszModelInfo.format_capabilitiesi   s  € àˆØŒ>ð 	%Ø�KŠK˜Ñ$Ô$Ð$ØŒ>ð 	!Ø�KŠK˜Ñ Ô Ð Ø×ÒÑ!Ô!ð 	"Ø�KŠK˜Ñ!Ô!Ð!Ø×ÒÑÔð 	Ø�KŠK˜ÑÔÐØ×$Ò$Ñ&Ô&ð 	!Ø�KŠK˜Ñ Ô Ð ØÔ!ð 	-Ø�KŠKÐ+Ñ,Ô,Ð,ØÔð 	(Ø�KŠK˜Ñ'Ô'Ð'Ø"&Ð3ˆt�yŠy˜‰Œˆ¨GÐ3r.   )%Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   Úboolr   r   r   r   r   r   r	   r   r   Úintr   r   r   r   Úfloatr    r!   r"   r$   r%   r&   r'   r   r-   r1   r5   r8   r@   rG   r   r.   r,   r   r   .   sE  € € € € € € à;Ð;à€G€G�GØ
€I€I�IØ€K€K�KØÐÐÑð €IˆtÐÐÑØ€IˆtÐÐÑØ€J�ÐÐÑØ€K�ÐÐÑØ#Ð�tÐ#Ð#Ñ#Ø€L�$ÐÐÑð )+Ð�e˜C ˜H”oÐ*Ð*Ñ*Ø)+Ð�u˜S #˜X”Ð+Ð+Ñ+ð €N�CÐÐÑØ€J�ÐÐÑØ#€Iˆx˜Œ}Ð#Ð#Ñ#ð €J�ÐÐÑØ€K�ÐÐÑØ'+€O�X˜e”_Ð+Ð+Ñ+Ø(,Ð�h˜u”oÐ,Ð,Ñ,ð Ð�cÐÐÑØ€L�#ÐÐÑØ€FˆCÐÐÑØ€K�ÐÐÑð;˜tð ;ð ;ð ;ð ;ðC ð Cð Cð Cð Cð.˜dð .ð .ð .ð .ð0 dð 0ð 0ð 0ð 0ð ˜Sð  ð  ð  ð  ð4 Sð 4ð 4ð 4ð 4ð 4ð 4r.   r   c                   óh   — e Zd ZU dZeed<   eed<   eedf         ed<   eed<   dZeed<   d	Ze	ed
<   dS )ÚProviderInfoz-Full metadata for a provider from models.dev.r   r   .ÚenvÚapir#   Údocr   Úmodel_countN)
rH   rI   rJ   rK   rL   rM   r	   rU   rV   rO   r   r.   r,   rR   rR   }   sd   € € € € € € à7Ð7à€G€G�GØ
€I€I�IØ	ˆs�CˆxŒÐÐÑØ	€H€H�HØ€Cˆ€M€M�MØ€K�ÐÐÑÐÐr.   rR   Ú
openrouterÚ	anthropicÚopenaizopenai-codexÚzaizkimi-codingzkimi-for-codingÚstepfunzkimi-coding-cnÚminimaxz
minimax-cnÚdeepseekÚalibabaz
qwen-oauthÚcopilotzgithub-copilotz
ai-gatewayÚvercelzopencode-zenÚopencodezopencode-goÚkilozfireworks-aiÚhuggingfaceÚgoogleÚxaiÚxiaomiÚnvidiaÚgroqÚmistralÚ
togetheraiÚ
perplexityÚcohereúollama-cloud)ÚkilocodeÚ	fireworksrc   Úgeminird   re   rf   rg   rh   ri   rj   rk   rl   rm   ÚPROVIDER_TO_MODELS_DEVÚ_MODELS_DEV_TO_PROVIDERr(   c                  ó(   — ddl m}   | ¦   «         dz  S )zReturn path to disk cache file.r   ©Úget_hermes_homezmodels_dev_cache.json)Úhermes_constantsru   rt   s    r,   Ú_get_cache_pathrw   µ   s(   € à0Ð0Ð0Ð0Ð0Ð0Øˆ?ÑÔÐ6Ñ6Ð6r.   c                  ó,  — 	 t          ¦   «         } |                      ¦   «         r=t          | d¬¦  «        5 }t          j        |¦  «        cddd¦  «         S # 1 swxY w Y   n2# t
          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wi S )z%Load models.dev data from disk cache.zutf-8)ÚencodingNz(Failed to load models.dev disk cache: %s)rw   ÚexistsÚopenÚjsonÚloadÚ	ExceptionÚloggerÚdebug)Ú
cache_pathÚfÚes      r,   Ú_load_disk_cacher„   »   sé   € ðDÝ$Ñ&Ô&ˆ
Ø×ÒÑÔð 	$Ý�j¨7Ð3Ñ3Ô3ð $°qÝ”y ‘|”|ð$ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøåð Dð Dð DÝ�ŠÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøà€Is:   ‚3A" µAÁ	A" ÁAÁA" ÁAÁA" Á"
BÁ,BÂBÚdatac                 ó°   — 	 t          ¦   «         }t          || dd¬¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)z.Save models.dev data to disk cache atomically.N)Ú,ú:)ÚindentÚ
separatorsz(Failed to save models.dev disk cache: %s)rw   r
   r~   r   r€   )r…   r�   rƒ   s      r,   Ú_save_disk_cacher‹   Ç   sz   € ðDÝ$Ñ&Ô&ˆ
Ý˜* d°4ÀJÐOÑOÔOÐOÐOÐOøÝð Dð Dð DÝ�ŠÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCÐCøøøøðDøøøs   ‚!% ¥
A¯AÁAFÚforce_refreshc           	      óR  — | s2t           r+t          j        ¦   «         t          z
  t          k     rt           S 	 t	          j        t          d¬¦  «        }|                     ¦   «          |                     ¦   «         }t          |t          ¦  «        rz|rx|a t          j        ¦   «         at          |¦  «         t                               dt          |¦  «        t          d„ |                     ¦   «         D ¦   «         ¦  «        ¦  «         |S n2# t"          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wt           s`t%          ¦   «         a t           rKt          j        ¦   «         t          z
  dz   at                               dt          t           ¦  «        ¦  «         t           S )	zšFetch models.dev registry. In-memory cache (1hr) + disk fallback.

    Returns the full registry dict keyed by provider ID, or empty dict on failure.
    é   )Útimeoutz:Fetched models.dev registry: %d providers, %d total modelsc              3   ó†   K  — | ]<}t          |t          ¦  «        ¯t          |                     d i ¦  «        ¦  «        V — Œ=dS )ÚmodelsN)Ú
isinstanceÚdictÚlenÚget)Ú.0Úps     r,   ú	<genexpr>z#fetch_models_dev.<locals>.<genexpr>ë   sI   è è € Ð[Ð[°ÅzÐRSÕUYÑGZÔGZÐ[•C˜Ÿš˜h¨Ñ+Ô+Ñ,Ô,Ð[Ð[Ð[Ð[Ð[Ð[r.   zFailed to fetch models.dev: %sNi,  z0Loaded models.dev from disk cache (%d providers))r   Útimer   Ú_MODELS_DEV_CACHE_TTLÚrequestsr•   ÚMODELS_DEV_URLÚraise_for_statusr|   r’   r“   r‹   r   r€   r”   ÚsumÚvaluesr~   r„   )rŒ   Úresponser…   rƒ   s       r,   Úfetch_models_devr¡   Ð   s�  € ð ð!åð!õ ŒY‰[Œ[Õ1Ñ1Õ5JÒJÐJå Ð ð:Ý”<¥¸Ð;Ñ;Ô;ˆØ×!Ò!Ñ#Ô#Ð#Ø�}Š}‰ŒˆÝ�d�DÑ!Ô!ð 		 dð 		Ø $ÐÝ%)¤Y¡[¤[Ð"Ý˜TÑ"Ô"Ð"Ý�LŠLØLÝ�D‘	”	ÝÐ[Ð[°d·k²k±m´mÐ[Ñ[Ô[Ñ[Ô[ñô ð ð
 ˆKøøÝð :ð :ð :Ý�ŠÐ5°qÑ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð:øøøõ
 ð eÝ,Ñ.Ô.ÐÝð 	eÝ%)¤Y¡[¤[Õ3HÑ%HÈ3Ñ%NÐ"Ý�LŠLÐKÍSÕQbÑMcÔMcÑdÔdÐdåÐs   ¶CD	 Ä	
D8ÄD3Ä3D8ÚproviderÚmodelc                 ó  — t                                | ¦  «        }|sdS t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS |                     di ¦  «        }t          |t          ¦  «        sdS |                     |¦  «        }|rt          |¦  «        }|r|S |                     ¦   «         }|                     ¦   «         D ]2\  }	}
|	                     ¦   «         |k    rt          |
¦  «        }|r|c S Œ3dS )zÏLook up context_length for a provider+model combo in models.dev.

    Returns the context window in tokens, or None if not found.
    Handles case-insensitive matching and filters out context=0 entries.
    Nr‘   )rq   r•   r¡   r’   r“   Ú_extract_contextÚlowerÚitems)r¢   r£   Úmdev_provider_idr…   Úprovider_datar‘   ÚentryÚctxÚmodel_lowerÚmidÚmdatas              r,   Úlookup_models_dev_contextr¯   ü   s  € õ .×1Ò1°(Ñ;Ô;ÐØð ØˆtåÑÔ€DØ—H’HÐ-Ñ.Ô.€MÝ�m¥TÑ*Ô*ð Øˆtà×Ò˜x¨Ñ,Ô,€FÝ�f�dÑ#Ô#ð Øˆtð �JŠJ�uÑÔ€EØð Ý˜uÑ%Ô%ˆØð 	ØˆJð —+’+‘-”-€KØ—l’l‘n”nð ð ‰
ˆˆUØ�9Š9‰;Œ;˜+Ò%Ð%Ý" 5Ñ)Ô)ˆCØð Ø�
�
�
øàˆ4r.   rª   c                 ó  — t          | t          ¦  «        sdS |                      d¦  «        }t          |t          ¦  «        sdS |                     d¦  «        }t          |t          t          f¦  «        r|dk    rt          |¦  «        S dS )zŽExtract context_length from a models.dev model entry.

    Returns None for invalid/zero values (some audio/image models have context=0).
    NÚlimitÚcontextr   )r’   r“   r•   rO   rP   )rª   r±   r«   s      r,   r¥   r¥   !  s‚   € õ
 �e�TÑ"Ô"ð ØˆtØ�IŠI�gÑÔ€EÝ�e�TÑ"Ô"ð ØˆtØ
�)Š)�IÑ
Ô
€CÝ�#��U�|Ñ$Ô$ð ¨¨qª¨Ý�3‰xŒxˆØˆ4r.   c                   óh   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	e
ed<   d	Ze
ed
<   dZeed<   dS )ÚModelCapabilitiesz;Structured capability metadata for a model from models.dev.TÚsupports_toolsFr1   Úsupports_reasoningé@ r   é    Úmax_output_tokensr#   Úmodel_familyN)rH   rI   rJ   rK   rµ   rN   rM   r1   r¶   r   rO   r¹   rº   rL   r   r.   r,   r´   r´   6  sz   € € € € € € àEÐEà€N�DÐÐÑØ!€O�TÐ!Ð!Ñ!Ø$Ð˜Ð$Ð$Ñ$Ø €N�CÐ Ð Ñ Ø!Ð�sÐ!Ð!Ñ!Ø€L�#ÐÐÑÐÐr.   r´   c                 ó  — t                                | ¦  «        }|sdS t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS |                     di ¦  «        }t          |t          ¦  «        sdS |S )z•Resolve a Hermes provider ID to its models dict from models.dev.

    Returns the models dict or None if the provider is unknown or has no data.
    Nr‘   )rq   r•   r¡   r’   r“   )r¢   r¨   r…   r©   r‘   s        r,   Ú_get_provider_modelsr¼   B  sŠ   € õ
 .×1Ò1°(Ñ;Ô;ÐØð ØˆtåÑÔ€DØ—H’HÐ-Ñ.Ô.€MÝ�m¥TÑ*Ô*ð Øˆtà×Ò˜x¨Ñ,Ô,€FÝ�f�dÑ#Ô#ð Øˆtà€Mr.   r‘   c                 ó  — |                       |¦  «        }t          |t          ¦  «        r|S |                     ¦   «         }|                      ¦   «         D ]6\  }}|                     ¦   «         |k    rt          |t          ¦  «        r|c S Œ7dS )zBFind a model entry by exact match, then case-insensitive fallback.N)r•   r’   r“   r¦   r§   )r‘   r£   rª   r¬   r­   r®   s         r,   Ú_find_model_entryr¾   W  s‡   € ð �JŠJ�uÑÔ€EÝ�%�ÑÔð Øˆð —+’+‘-”-€KØ—l’l‘n”nð ð ‰
ˆˆUØ�9Š9‰;Œ;˜+Ò%Ð%­*°U½DÑ*AÔ*AÐ%ØˆLˆLˆLøàˆ4r.   c                 ó†  — t          | ¦  «        }|€dS t          ||¦  «        }|€dS t          |                     dd¦  «        ¦  «        }|                     di ¦  «        }t	          |t
          ¦  «        r|                     dg ¦  «        }ng }t          |                     dd¦  «        ¦  «        pd|v }t          |                     dd¦  «        ¦  «        }|                     d	i ¦  «        }t	          |t
          ¦  «        si }|                     d
¦  «        }	t	          |	t          t          f¦  «        r|	dk    rt          |	¦  «        nd}
|                     d¦  «        }t	          |t          t          f¦  «        r|dk    rt          |¦  «        nd}|                     dd¦  «        pd}t          ||||
||¬¦  «        S )uò  Look up full capability metadata from models.dev cache.

    Uses the existing fetch_models_dev() and PROVIDER_TO_MODELS_DEV mapping.
    Returns None if model not found.

    Extracts from model entry fields:
      - reasoning  (bool)  â†’ supports_reasoning
      - tool_call  (bool)  â†’ supports_tools
      - attachment (bool)  â†’ supports_vision
      - limit.context (int) â†’ context_window
      - limit.output  (int) â†’ max_output_tokens
      - family     (str)   â†’ model_family
    Nr   FÚ
modalitiesÚinputr   r0   r   r±   r²   r   r·   Úoutputr¸   r   r#   )rµ   r1   r¶   r   r¹   rº   )	r¼   r¾   rN   r•   r’   r“   rO   rP   r´   )r¢   r£   r‘   rª   rµ   Ú
input_modsr1   r¶   r±   r«   r   Úoutr¹   rº   s                 r,   Úget_model_capabilitiesrÅ   g  s¹  € õ " (Ñ+Ô+€FØ€~Øˆtå˜f eÑ,Ô,€EØ€}Øˆtõ ˜%Ÿ)š) K°Ñ7Ô7Ñ8Ô8€Nð —’˜<¨Ñ,Ô,€JÝ�*�dÑ#Ô#ð Ø—^’^ G¨RÑ0Ô0ˆ
ˆ
àˆ
Ý˜5Ÿ9š9 \°5Ñ9Ô9Ñ:Ô:ÐS¸gÈÐ>S€OÝ˜eŸiši¨°UÑ;Ô;Ñ<Ô<Ðð �IŠI�g˜rÑ"Ô"€EÝ�e�TÑ"Ô"ð Øˆà
�)Š)�IÑ
Ô
€CÝ!+¨Cµ#µu°Ñ!>Ô!>ÐVÀ3ÈÂ7À7•S˜‘X”X�XÐPV€Nà
�)Š)�HÑ
Ô
€CÝ$.¨sµS½%°LÑ$AÔ$AÐWÀcÈAÂgÀg�˜C™œ˜ÐSWÐà—9’9˜X rÑ*Ô*Ð0¨b€LåØ%Ø'Ø-Ø%Ø+Ø!ðñ ô ð r.   c                 ó�   ‡ — ddl m}  |‰ ¦  «        p‰ Š t          ‰ ¦  «        }|€g S ˆ fd„|                     ¦   «         D ¦   «         S )zReturn all model IDs for a provider from models.dev.

    Returns an empty list if the provider is unknown or has no data.
    r   )Únormalize_providerNc                 ó4   •— g | ]}t          ‰|¦  «        °|‘ŒS r   )Ú"_should_hide_from_provider_catalog)r–   r­   r¢   s     €r,   ú
<listcomp>z(list_provider_models.<locals>.<listcomp>«  s9   ø€ ð ð ð ØÝ1°(¸CÑ@Ô@ðØðð ð r.   )Úhermes_cli.modelsrÇ   r¼   Úkeys)r¢   rÇ   r‘   s   `  r,   Úlist_provider_modelsrÍ      sv   ø€ ð
 5Ð4Ð4Ð4Ð4Ð4Ø!Ð! (Ñ+Ô+Ð7¨x€Hå! (Ñ+Ô+€FØ€~Øˆ	ðð ð ð Ø—{’{‘}”}ðñ ô ð r.   zZ-tts\b|embedding|live-|-(preview|exp)-\d{2,4}[-_]|-image\b|-image-preview\b|-customtools\bÚ_NOISE_PATTERNS>   ú
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Úmodel_idc                 óÄ   — | pd                      ¦   «                              ¦   «         }|pd                      ¦   «                              ¦   «         }|dv r|t          v rdS dS )Nr#   >   rp   rd   TF)Ústripr¦   Ú_GOOGLE_HIDDEN_MODELS)r¢   rá   Úprovider_lowerr¬   s       r,   rÉ   rÉ   Ø  se   € Ø�n "×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5€NØ�>˜r×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2€KØÐ-Ð-Ð-°+ÕAVÐ2VÐ2VØˆtØˆ5r.   c                 ó@  — t          | ¦  «        }|€g S g }|                     ¦   «         D ]s\  }}t          |t          ¦  «        sŒt	          | |¦  «        rŒ,|                     dd¦  «        sŒCt                               |¦  «        rŒ^|                     |¦  «         Œt|S )zîReturn model IDs suitable for agentic use from models.dev.

    Filters for tool_call=True and excludes noise (TTS, embedding,
    dated preview snapshots, live/streaming, image-only models).
    Returns an empty list on any failure.
    Nr   F)	r¼   r§   r’   r“   rÉ   r•   rÎ   Úsearchr=   )r¢   r‘   Úresultr­   rª   s        r,   Úlist_agentic_modelsré   à  s±   € õ " (Ñ+Ô+€FØ€~Øˆ	à€FØ—l’l‘n”nð 	ð 	‰
ˆˆUÝ˜%¥Ñ&Ô&ð 	ØÝ-¨h¸Ñ<Ô<ð 	ØØ�yŠy˜ eÑ,Ô,ð 	ØÝ×!Ò! #Ñ&Ô&ð 	ØØ�Š�cÑÔÐÐØ€Mr.   Úrawr   c                 óð  — |                      d¦  «        pi }t          |t          ¦  «        si }|                      d¦  «        pi }t          |t          ¦  «        si }|                      d¦  «        pi }t          |t          ¦  «        si }|                      d¦  «        pg }|                      d¦  «        pg }|                      d¦  «        }t          |t          t          f¦  «        r|dk    rt          |¦  «        nd}	|                      d¦  «        }
t          |
t          t          f¦  «        r|
dk    rt          |
¦  «        nd}|                      d¦  «        }t          |t          t          f¦  «        r|dk    rt          |¦  «        nd}t          di d	| “d
|                      d
d¦  «        p| “d|                      dd¦  «        pd“d|“dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |                      dd¦  «        ¦  «        “dt          |t          ¦  «        rt          |¦  «        nd“dt          |t          ¦  «        rt          |¦  «        nd“d|	“d|“d|“dt	          |                      dd¦  «        pd¦  «        “dt	          |                      dd¦  «        pd¦  «        “dd|v r|d         �t	          |d         ¦  «        nd“dd |v r|d          �t	          |d          ¦  «        nd“d!|                      d"d¦  «        pd“d#|                      d#d¦  «        pd“d$|                      d$d¦  «        pd“d%|                      d%d¦  «        “ŽS )&zEConvert a raw models.dev model entry dict into a ModelInfo dataclass.r±   ÚcostrÀ   rÁ   rÂ   r²   r   Nr   r   r#   r   r   r   Fr   r   r   r   r   r   r   r   r   r   r   r   r    r!   Ú
cache_readr"   Úcache_writer$   Ú	knowledger%   r&   r'   )	r•   r’   r“   rO   rP   r   rN   ÚlistÚtuple)rá   rê   r   r±   rì   rÀ   rÃ   Úoutput_modsr«   Úctx_intrÄ   Úout_intÚinpÚinp_ints                 r,   Ú_parse_model_infor÷   þ  s@  € à�GŠG�GÑÔÐ" €EÝ�e�TÑ"Ô"ð Øˆà�7Š7�6‰?Œ?Ð ˜b€DÝ�d�DÑ!Ô!ð Øˆà—’˜Ñ&Ô&Ð,¨"€JÝ�j¥$Ñ'Ô'ð Øˆ
à—’ Ñ(Ô(Ð.¨B€JØ—.’. Ñ*Ô*Ð0¨b€Kà
�)Š)�IÑ
Ô
€CÝ$ S­3µ¨,Ñ7Ô7ÐJ¸CÀ!ºG¸G�c�#‰hŒhˆhÈ€GØ
�)Š)�HÑ
Ô
€CÝ$ S­3µ¨,Ñ7Ô7ÐJ¸CÀ!ºG¸G�c�#‰hŒhˆhÈ€GØ
�)Š)�GÑ
Ô
€CÝ$ S­3µ¨,Ñ7Ô7ÐM¸CÀ!ºG¸G�c�#‰hŒhˆhÈ€Gåð ð ð Øˆ8ðà�WŠW�V˜RÑ Ô Ð, Høðð �wŠw�x Ñ$Ô$Ð*¨øðð  �Kð	õ
 �s—w’w˜{¨EÑ2Ô2Ñ3Ô3Ð3ðõ �s—w’w˜{¨EÑ2Ô2Ñ3Ô3Ð3ðõ ˜Ÿš ¨eÑ4Ô4Ñ5Ô5Ð5ðõ ˜Ÿš °Ñ6Ô6Ñ7Ô7Ð7ðõ ˜sŸwšwÐ':¸EÑBÔBÑCÔCÐCðõ ˜#Ÿ'š' .°%Ñ8Ô8Ñ9Ô9Ð9ðõ /9¸ÅTÑ.JÔ.JÐR�˜zÑ*Ô*Ð*ÐPRøðõ 1;¸;ÍÑ0MÔ0MÐU�% Ñ,Ô,Ð,ÐSUøðð �wðð �7ðð �'ðõ  ˜Ÿš '¨1Ñ-Ô-Ð2°Ñ3Ô3Ð3ð!õ" ˜$Ÿ(š( 8¨QÑ/Ô/Ð4°1Ñ5Ô5Ð5ð#ð$ 6BÀTÐ5IÐ5IÈdÐS_ÔN`ÐNl�˜d <Ô0Ñ1Ô1Ð1Ðrvøð%ð& 8EÈÐ7LÐ7LÐQUÐVcÔQdÐQp�˜t MÔ2Ñ3Ô3Ð3Ðvzøð'ð( Ÿš ¨bÑ1Ô1Ð7°Røð)ð* —W’W˜^¨RÑ0Ô0Ð6°Bøð+ð, �wŠw�x Ñ$Ô$Ð*¨øð-ð. —G’G˜M¨5Ñ1Ô1Ð1ð/ð r.   c                 óœ  — |                      d¦  «        pg }|                      d¦  «        pi }t          | |                      dd¦  «        p| t          |t          ¦  «        rt	          |¦  «        nd|                      dd¦  «        pd|                      dd¦  «        pdt          |t
          ¦  «        rt          |¦  «        nd¬	¦  «        S )
zAConvert a raw models.dev provider entry dict into a ProviderInfo.rS   r‘   r   r#   r   rT   rU   r   )r   r   rS   rT   rU   rV   )r•   rR   r’   rð   rñ   r“   r”   )r   rê   rS   r‘   s       r,   Ú_parse_provider_inforù   1  sÀ   € à
�'Š'�%‰.Œ.Ð
˜B€CØ�WŠW�XÑÔÐ$ "€FÝØØ�WŠW�V˜RÑ Ô Ð/ KÝ$ S­$Ñ/Ô/Ð7�E�#‰JŒJˆJ°RØ�GŠG�E˜2ÑÔÐ$ "Ø�GŠG�E˜2ÑÔÐ$ "Ý#-¨fµdÑ#;Ô#;ÐB•C˜‘K”K�KÀðñ ô ð r.   c                 óÌ   — t                                | | ¦  «        }t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS t          ||¦  «        S )zÆGet full provider metadata from models.dev.

    Accepts either a Hermes provider ID (e.g. "kilocode") or a models.dev
    ID (e.g. "kilo").  Returns None if the provider is not in the catalog.
    N)rq   r•   r¡   r’   r“   rù   )r   Úmdev_idr…   rê   s       r,   Úget_provider_inforü   C  s\   € õ %×(Ò(¨°kÑBÔB€GåÑÔ€DØ
�(Š(�7Ñ
Ô
€CÝ�c�4Ñ Ô ð Øˆtå ¨Ñ-Ô-Ð-r.   c                 ó\  — t                                | | ¦  «        }t          ¦   «         }|                     |¦  «        }t          |t          ¦  «        sdS |                     di ¦  «        }t          |t          ¦  «        sdS |                     |¦  «        }t          |t          ¦  «        rt          |||¦  «        S |                     ¦   «         }|                     ¦   «         D ]E\  }}	|                     ¦   «         |k    r(t          |	t          ¦  «        rt          ||	|¦  «        c S ŒFdS )z¯Get full model metadata from models.dev.

    Accepts Hermes or models.dev provider ID.  Tries exact match then
    case-insensitive fallback.  Returns None if not found.
    Nr‘   )rq   r•   r¡   r’   r“   r÷   r¦   r§   )
r   rá   rû   r…   Úpdatar‘   rê   r¬   r­   r®   s
             r,   Úget_model_inforÿ   X  s  € õ %×(Ò(¨°kÑBÔB€GåÑÔ€DØ�HŠH�WÑÔ€EÝ�e�TÑ"Ô"ð Øˆtà�YŠY�x Ñ$Ô$€FÝ�f�dÑ#Ô#ð Øˆtð �*Š*�XÑ
Ô
€CÝ�#•tÑÔð 9Ý  ¨3°Ñ8Ô8Ð8ð —.’.Ñ"Ô"€KØ—l’l‘n”nð :ð :‰
ˆˆUØ�9Š9‰;Œ;˜+Ò%Ð%­*°U½DÑ*AÔ*AÐ%Ý$ S¨%°Ñ9Ô9Ð9Ð9Ð9øàˆ4r.   )F)9rK   r|   Úloggingr™   Údataclassesr   Úpathlibr   Útypingr   r   r   r   r	   Úutilsr
   r›   Ú	getLoggerrH   r   rœ   rš   r   rL   rM   r   rP   r   rR   rq   rr   rw   r„   r‹   rN   r¡   rO   r¯   r¥   r´   r¼   r¾   rÅ   rÍ   ÚreÚcompileÚ
IGNORECASErÎ   ÚPatternÚ	frozenseträ   rÉ   ré   r÷   rù   rü   rÿ   r   r.   r,   ú<module>r     s  ððð ð ð( €€€Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à #Ð #Ð #Ð #Ð #Ð #à €€€à	ˆÔ	˜8Ñ	$Ô	$€à.€ØÐ ð %'Ð �4˜˜S˜”>Ð &Ð &Ñ &Ø !Ð ˜Ð !Ð !Ñ !ð ðK4ð K4ð K4ð K4ð K4ñ K4ô K4ñ „ðK4ð\ ðð ð ð ð ñ ô ñ „ðð  *Ø�,ð *à�ð *ð ˆhð *ð �Hð	 *ð
 
ˆ5ð *ð Ð$ð *ð ˆyð *ð Ð'ð *ð ˆyð *ð �,ð *ð �
ð *ð ˆyð *ð �)ð *ð Ðð *ð �(ð *ð  �Jð! *ð" �=ð# *ð$ ØØ ØØØØØØØØØØØ"ð? *ð  *ð  *Ð ˜˜S #˜Xœð  ð  ñ  ðF 59Ð ˜ $ s¨C x¤.Ô1Ð 8Ð 8Ñ 8ð7˜ð 7ð 7ð 7ð 7ð	˜$˜s C˜xœ.ð 	ð 	ð 	ð 	ðD˜4  S œ>ð D¨dð Dð Dð Dð Dð)ð ) Dð )°T¸#¸s¸(´^ð )ð )ð )ð )ðX"¨ð "°Cð "¸HÀS¼Mð "ð "ð "ð "ðJ˜D  c œNð ¨x¸¬}ð ð ð ð ð* ðð ð ð ð ñ ô ñ „ðð 3ð ¨8°D¸¸c¸´NÔ+Cð ð ð ð ð*˜d 3¨ 8œnð °Sð ¸XÀdÈ3ÐPSÈ8ÄnÔ=Uð ð ð ð ð 6 Sð 6°ð 6¸ÐBSÔ9Tð 6ð 6ð 6ð 6ðr 3ð ¨4°¬9ð ð ð ð ð& 
€	€	€	Ø(˜bœjð0à„Mñô €�”ð ð ñ ð "˜	ð #ð #ð #ñ ô Ð ð4°ð Àð Èð ð ð ð ð #ð ¨$¨s¬)ð ð ð ð ð<0 ð 0¨$¨s°C¨x¬.ð 0Àsð 0Èyð 0ð 0ð 0ð 0ðf cð °°S¸#°X´ð À<ð ð ð ð ð$. 3ð .¨8°LÔ+Að .ð .ð .ð .ð*ØðØ #ðàˆiÔðð ð ð ð ð r.   