
    	D,j!                    h    d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	Z	dd
Z
 G d d          ZdS )u,  
OpenRouter model metadata caching and lookup.

This module keeps a local cached copy of the OpenRouter model list
(downloaded from ``https://openrouter.ai/api/v1/models``) and exposes a
helper class that returns metadata for a given model in a format compatible
with litellm’s ``get_model_info``.
    )annotationsN)Path)Dictval
str | Nonereturnfloat | Nonec                `    | dv r
| dk    rdndS 	 t          |           S # t          $ r Y dS w xY w)z2Convert a price string (USD per token) to a float.)N 0r   g        N)float	Exception)r   s    _/home/rurouni/.local/share/uv/tools/aider-chat/lib/python3.11/site-packages/aider/openrouter.py_cost_per_tokenr      sR    
oSjjssd*Szz   tts    
--c                  N    e Zd ZdZdZddZddZddZddZddZ	ddZ
ddZdS )OpenRouterModelManagerz#https://openrouter.ai/api/v1/modelsiQ r   Nonec                    t          j                    dz  dz  | _        | j        dz  | _        d | _        d| _        d| _        d S )Nz.aidercacheszopenrouter_models.jsonTF)r   home	cache_dir
cache_filecontent
verify_ssl_cache_loadedselfs    r   __init__zOpenRouterModelManager.__init__!   sD    x/(:.+CC$( $"    r   boolc                    || _         dS )z1Enable/disable SSL verification for API requests.N)r   )r   r   s     r   set_verify_sslz%OpenRouterModelManager.set_verify_ssl+   s    $r   modelstrr   c           	     z   |                                   | j        r	d| j        vri S |                     |          }|hd|v r/                    |                    dd          d                    t          fd| j        d         D             d          }|si S |                    di                               d          p|                    d          pd}|                    d	i           }|||t          |                    d
                    t          |                    d                    ddS )z
        Return metadata for *model* or an empty ``dict`` when unknown.

        ``model`` should use the aider naming convention, e.g.
        ``openrouter/nousresearch/deephermes-3-mistral-24b-preview:free``.
        data:   r   c              3  J   K   | ]}|                     d           v |V  dS )idN)get).0item
candidatess     r   	<genexpr>z8OpenRouterModelManager.get_model_info.<locals>.<genexpr>A   s8      ]]R\@\@\t@\@\@\@\]]r   Ntop_providercontext_lengthpricingprompt
completion
openrouter)max_input_tokens
max_tokensmax_output_tokensinput_cost_per_tokenoutput_cost_per_tokenlitellm_provider)_ensure_contentr   _strip_prefixaddsplitnextr+   r   )r   r#   routerecordcontext_lenr2   r.   s         @r   get_model_infoz%OpenRouterModelManager.get_model_info/   sW    	| 	vT\99I""5)) W
%<<NN5;;sA..q1222]]]]V(<]]]_cdd 	I JJ~r**../?@@ zz*++ 	 **Y++ +%!,$3GKK4I4I$J$J%4W[[5N5N%O%O ,
 
 	
r   c                ^    |                     d          r|t          d          d          n|S )Nzopenrouter/)
startswithlen)r   r#   s     r   r=   z$OpenRouterModelManager._strip_prefixX   s4    .3.>.>}.M.MXuS''))**SXXr   c                h    |                                   | j        s|                                  d S d S )N)_load_cacher   _update_cacher   s    r   r<   z&OpenRouterModelManager._ensure_content[   s@    | 	!     	! 	!r   c                   | j         rd S 	 | j                            dd           | j                                        rt          j                    | j                                        j        z
  }|| j        k     rN	 t          j
        | j                                                  | _        n# t          j        $ r
 d | _        Y nw xY wn# t          $ r Y nw xY wd| _         d S )NT)parentsexist_ok)r   r   mkdirr   existstimestatst_mtime	CACHE_TTLjsonloads	read_textr   JSONDecodeErrorOSError)r   	cache_ages     r   rI   z"OpenRouterModelManager._load_cache`   s     	F	N   ===%%'' , IKK$/*>*>*@*@*II	t~--,'+z$/2K2K2M2M'N'N/ , , ,'+, 	 	 	D	 "s6   A2C >0B/ .C /CC CC 
CCc                   	 t          j        | j        d| j                  }|j        dk    r`|                                | _        	 | j                            t          j	        | j        d                     d S # t          $ r Y d S w xY wd S # t          $ rO}t          d|            	 | j                            d           n# t          $ r Y n
w xY wY d }~d S Y d }~d S d }~ww xY w)N
   )timeoutverify      )indentz'Failed to fetch OpenRouter model list: z{})requestsr+   
MODELS_URLr   status_coderT   r   r   
write_textdumpsrX   r   print)r   responseexs      r   rJ   z$OpenRouterModelManager._update_cacher   s1   	|DORXXXH#s**'}}O..tz$,q/Q/Q/QRRRRR   DD	 +*  	 	 	@B@@AAA**40000    100000	sZ   AB 3A= =
BB 
BB 
C)C$-CC$
CC$CC$$C)N)r   r   )r   r    r   r   )r#   r$   r   r   )r#   r$   r   r$   )__name__
__module____qualname__rb   rS   r   r"   rD   r=   r<   rI   rJ    r   r   r   r      s        6JI# # # #% % % %$
 $
 $
 $
RY Y Y Y! ! ! !
" " " "$     r   r   )r   r   r   r	   )__doc__
__future__r   rT   rP   pathlibr   typingr   ra   r   r   rl   r   r   <module>rq      s     # " " " " "                  c c c c c c c c c cr   