
    	D,j              	          d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZ d dlmZ d dlmZ d dlmZmZ d dlZd dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlm Z m!Z! d dl"m#Z# dZ$dZ%dZ&dZ'dZ(d e()                                D             Z(dZ*d e*)                                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/d0d1d2d1d3d4d5d6Z+e G d7 d8                      Z,g Z-ej.        /                    d9d:          5 Z0 ej1        e0          Z2e2D ]Z3e-4                     e,dJi e3           	 ddd           n# 1 swxY w Y    G d; d<          Z5 e5            Z6 G d= d>e,          Z7d? Z8d@ Z9dA Z:dB Z;dC Z<dD Z=dE Z>dF Z?dG Z@dH ZAeBdIk    r eA             dS dS )K    N)	dataclassfields)datetime)Path)OptionalUnion)Image)__version__)dump)litellm)OpenRouterModelManager)ensure_alternating_rolessanity_check_messages)check_pip_install_extra<   iX  zgpt-4oz)prompt-caching-2024-07-31,pdfs-2024-09-25a  
o1
o1-preview
o1-mini
o3-mini
gpt-4
gpt-4o
gpt-4o-2024-05-13
gpt-4-turbo-preview
gpt-4-0314
gpt-4-0613
gpt-4-32k
gpt-4-32k-0314
gpt-4-32k-0613
gpt-4-turbo
gpt-4-turbo-2024-04-09
gpt-4-1106-preview
gpt-4-0125-preview
gpt-4-vision-preview
gpt-4-1106-vision-preview
gpt-4o-mini
gpt-4o-mini-2024-07-18
gpt-3.5-turbo
gpt-3.5-turbo-0301
gpt-3.5-turbo-0613
gpt-3.5-turbo-1106
gpt-3.5-turbo-0125
gpt-3.5-turbo-16k
gpt-3.5-turbo-16k-0613
c                 ^    g | ]*}|                                 |                                 +S  strip.0lns     [/home/rurouni/.local/share/uv/tools/aider-chat/lib/python3.11/site-packages/aider/models.py
<listcomp>r   @   s-    OOOBHHJJOOOO    aE  
claude-2
claude-2.1
claude-3-haiku-20240307
claude-3-5-haiku-20241022
claude-3-opus-20240229
claude-3-sonnet-20240229
claude-3-5-sonnet-20240620
claude-3-5-sonnet-20241022
claude-sonnet-4-20250514
claude-opus-4-20250514
claude-opus-4-6
claude-sonnet-4-5
claude-sonnet-4-5-20250929
claude-haiku-4-5
claude-haiku-4-5-20251001
c                 ^    g | ]*}|                                 |                                 +S r   r   r   s     r   r   r   T   s-    UUU2"((**UBHHJJUUUr   sonnetclaude-sonnet-4-5haikuclaude-haiku-4-5opusclaude-opus-4-64z
gpt-4-06134oz4-turbozgpt-4-1106-preview35turbozgpt-3.5-turboz35-turbo3deepseekzdeepseek/deepseek-chatflashzgemini/gemini-flash-latestz
flash-litezgemini/gemini-2.5-flash-litequasarz"openrouter/openrouter/quasar-alphar1zdeepseek/deepseek-reasonerzgemini-2.5-prozgemini/gemini-2.5-prozgemini-3-pro-previewzgemini/gemini-3-pro-previewgeminizgemini/gemini-2.5-pro-exp-03-25zxai/grok-3-betaz#openrouter/openrouter/optimus-alpha)z
gemini-expgrok3optimusc                      e Zd ZU 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d	<   dZe	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d<   dZee	ef         ed<   dZe	ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dS )ModelSettingsnamewholeedit_formatNweak_model_nameFuse_repo_mapsend_undo_replylazy	overeageruserreminderexamples_as_sys_msgextra_paramscache_controlcaches_by_defaultTuse_system_promptuse_temperature	streamingeditor_model_nameeditor_edit_formatreasoning_tagremove_reasoningsystem_prompt_prefixaccepts_settings)__name__
__module____qualname__str__annotations__r2   r3   r   r4   boolr5   r6   r7   r9   r:   r;   dictr<   r=   r>   r?   r   floatr@   rA   rB   rC   rD   rE   rF   listr   r   r   r/   r/   s   s         IIIK%)OXc])))L$!OT!!!D$ItHc %%%%#'L(4.'''M4#t###"t"""*.OU4;'...It'+x}+++(,,,,#'M8C='''&*hsm****.(3-...'+htn+++++r   r/   zaider.resourceszmodel-settings.ymlc                   @    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
S )ModelInfoManagerz[https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.jsoniQ c                     t          j                    dz  dz  | _        | j        dz  | _        d | _        i | _        d| _        d| _        t                      | _	        d S )Nz.aidercaches$model_prices_and_context_window.jsonTF)
r   home	cache_dir
cache_filecontentlocal_model_metadata
verify_ssl_cache_loadedr   openrouter_managerselfs    r   __init__zModelInfoManager.__init__   s\    x/(:.+QQ$&!" #9":":r   c                 l    || _         t          | d          r| j                            |           d S d S )Nr\   )rZ   hasattrr\   set_verify_ssl)r^   rZ   s     r   rb   zModelInfoManager.set_verify_ssl   sC    $4-.. 	?#22:>>>>>	? 	?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[   rV   mkdirrW   existstimestatst_mtime	CACHE_TTLjsonloads	read_textrX   JSONDecodeErrorOSError)r^   	cache_ages     r   _load_cachezModelInfoManager._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                    	 dd l }|                    | 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          $ rY}t          t          |                     	 | 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)Nr      timeoutverify      indentz{})requestsgetMODEL_INFO_URLrZ   status_coderl   rX   rW   
write_textdumpsrp   	ExceptionprintrJ   )r^   r|   responseexs       r   _update_cachezModelInfoManager._update_cache   s8   	OOO  ||D$74?|[[H#s**'}}O..tz$,q/Q/Q/QRRRRR   DD	 +*  	 	 	#b''NNN**40000    100000	sZ   A
B 3B 
BB BB 
C8C3<CC3
C$!C3#C$$C33C8c                    | j                             |          }|r|S |                                  | j        s|                                  | j        st                      S | j                            |t                                }|r|S |                    d          }t          |          dk    rC| j                            |d                   }|r!|                    d          |d         k    r|S t                      S )N/      litellm_providerr   )rY   r}   rr   rX   r   rM   splitlen)r^   modeldatainfopiecess        r   get_model_from_cached_json_dbz.ModelInfoManager.get_model_from_cached_json_db   s    (,,U33 	K 	| 	!   | 	66M|tvv.. 	KS!!v;;!<##F1I..D !344q	AAvvr   c                    |                      |          }d }t          j        s|sZ	 t          j        |          }nD# t          $ r7}dt          |          vrt          t          |                     Y d }~nd }~ww xY w|r|S |sL|                    d          r7| j                            |          }|r|S | 	                    |          }|r|S |S )NrT   openrouter/)
r   r   _lazy_moduleget_model_infor   rJ   r   
startswithr\   fetch_openrouter_model_info)r^   r   cached_infolitellm_infor   openrouter_infos         r   r   zModelInfoManager.get_model_info   s   88?? 	#{ 	##&5e<< # # #9RHH#b''NNN#  	  		'u//>> 		'"5DDUKKO '&& #>>uEEO '&&s   < 
A=-A88A=c                    |t          d          d         }d|z   }	 ddl}|                    |d| j                  }|j        dk    ri S |j        }ddl}|                    d|                    |           d	||j	                  rt          d
| d           i S |                    dd|          }|                    d|          }	|	r9|	                    d                              dd          }
t          |
          }nd}|                    d||j	                  }|                    d||j	                  }|r%t          |                    d                    dz  nd}|r%t          |                    d                    dz  nd}|||i S |||||d}|S # t           $ r)}t          dt#          |                     i cY d}~S d}~ww xY w)aG  
        Fetch model info by scraping the openrouter model page.
        Expected URL: https://openrouter.ai/<model_route>
        Example: openrouter/qwen/qwen-2.5-72b-instruct:free
        Returns a dict with keys: max_tokens, max_input_tokens, max_output_tokens,
        input_cost_per_token, output_cost_per_token.
        r   Nzhttps://openrouter.ai/r   rt   ru   rx   zThe model\s*.*z.* is not availablez[91mError: Model 'z' is not available[0mz<[^>]+> z([\d,]+)\s*contextr   , z\$\s*([\d.]+)\s*/M input tokensz \$\s*([\d.]+)\s*/M output tokensi@B )max_input_tokens
max_tokensmax_output_tokensinput_cost_per_tokenoutput_cost_per_tokenzError fetching openrouter info:)r   r|   r}   rZ   r   textresearchescape
IGNORECASEr   subgroupreplaceintrN   r   rJ   )r^   r   url_parturlr|   r   htmlr   r   context_matchcontext_strcontext_sizeinput_cost_matchoutput_cost_match
input_costoutput_costparamses                     r   r   z,ModelInfoManager.fetch_openrouter_model_info  s;    ]++--.&1%	OOO||C4?|KKH#s**	=DIIIyyJ"))H"5"5JJJDRTR_   RxRRRSSS	66*c400DII&;TBBM $+11!44<<S"EE";//#!yy)KTSUS`aa "		*MtUWUb c cGWa/55a8899GCC]aJIZd% 1 7 7 : :;;gEE`dK#z'9[=P	$0*%1(2)4 F M 	 	 	3SVV<<<IIIIII	s1   -F% AF% C;F% 	F% %
G/GGGN)rG   rH   rI   r~   rk   r_   rb   rr   r   r   r   r   r   r   r   rQ   rQ      s        	/  I	; 	; 	;? ? ?
" " "&  (  4  6/ / / / /r   rQ   c                       e Zd Z	 ddZd Zd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd ZdS ) ModelNFc                    t                               ||          }|| _        || _        d| _        d | _        d | _        t          d t          D             d           | _	        | 
                    |          | _        |                                 }|                    d          | _        |                    d          | _        | j                            d          pd}t          t!          |dz  d          d          | _        |                     |           |d	u rd | _        n|                     |           |d	u r	d | _        d S |                     ||           d S )
N   c              3   0   K   | ]}|j         d k    |V  dS )aider/extra_paramsNr0   r   mss     r   	<genexpr>z!Model.__init__.<locals>.<genexpr>M  s/      LLBBG7K,K,KR,K,K,K,KLLr   missing_keyskeys_in_environmentr   r          F)MODEL_ALIASESr}   r0   verbosemax_chat_history_tokens
weak_modeleditor_modelnextMODEL_SETTINGSextra_model_settingsr   r   validate_environmentr   r   minmaxconfigure_model_settingsr3   get_weak_modelrA   get_editor_model)r^   r   r   r   rB   r   resr   s           r   r_   zModel.__init__>  sj    !!%//	'+$  %)LL.LLLd%
 %
! ''..	 ''))GGN33#&77+@#A#A 9==);<<A (+3/?"/Dd+K+KT'R'R$%%e,,,#'D  
+++5  %)D"""!!,0BCCCCCr   c                 6    t                               |          S N)model_info_managerr   )r^   r   s     r   r   zModel.get_model_infog  s    !00777r   c                     t          t                    D ]-}t          ||j                  }t	          | |j        |           .| j        | j        | j        | _        dS dS dS )z;Helper to copy fields from a ModelSettings instance to selfN)r   r/   getattrr0   setattrrC   rD   )r^   sourcefieldvals       r   _copy_fieldszModel._copy_fieldsj  ss    M** 	+ 	+E&%*--CD%*c**** %$*?*K!%!6D &%*K*Kr   c                 2   d}t           D ]&}||j        k    r|                     |           d} n'| j        g | _        |                                }|s|                     |           | j        r| j        j        r| j        j        dk    r| j        si | _        | j        j                                        D ]k\  }}t          |t                    rGt          | j                            |          t                    ri | j        |         || j        |<   a|| j        |<   l| j                            d          rV| j        g | _        d| j        vr| j                            d           d| j        vr| j                            d           d S d S d S )NFTr   r   thinking_tokensreasoning_effort)r   r0   r   rF   lowerapply_generic_model_settingsr   r;   items
isinstancerM   r}   r   append)r^   r   exact_matchr   keyvalues         r   r   zModel.configure_model_settingsu  s     	 	B!!"%%%"    ($&D!  	5--e444 %	3)6	3 ).2FFF $ '$&! #7DJJLL 3 3
UeT** 3z$:K:O:OPS:T:TVZ/[/[ 3-P0A#0F-P%-PD%c** .3D%c** 9.. 	A$,(*% (===%,,->???!)>>>%,,-?@@@@@	A 	A
 ?>r   c                    d|v rHd| _         d| _        d| _        d| _        d| _        d| j        vr| j                            d           d S d|v rd| _         d| _        d| _        d| _        d S d	|v rd| _         d| _        d| _        d| _        d S |                    d
          d         }|dv r3d| _        d| _         d| j        vr| j                            d           d S d|v rd| _        d| _        d| _	        d S d|v rd| _         d| _        d| _        d| _	        d S d|v rHd| _         d| _        d| _        d| _
        d| _        d| j        vr| j                            d           d S d|v r"d|v rd| _         d| _        d| _        d| _        d S d|v r-d|v sd|v r%d| _         d| _        d| _        d| _        d| _        d S d|v sd|v r"d|v rd| _         d| _        d| _        d| _        d S d|v sd|v rd|v rd| _         d| _        d| _        d S d|v sd|v rd| _         d| _        d| _        d S d|v sd|v r	d| _        d S d|v sd |v sd!|v sd"|v sd#|v sd$|v r:d| _         d| _        d| _        d%| j        vr| j                            d%           d S d&|v rAd| _         d| _        d| _        d'| _        d%| j        vr| j                            d%           d S d(|v sd)|v rd| _         d| _        d| _        d'| _        d S |                    d*          sd+|v rd| _	        d| _        d S d,|v r'd-|v r#d.|v sd/|v rd0|v rd| _         d1| _        d| _        d S d2|v rId0|v rEd3|vrAd| _         d1| _        d| _        d| _        d| _        d4| _        t          d56          | _        d S d7|v r-d8|v r)d| _         d| _        d9| _        d:| _        d;d<d=d>| _        d S | j         dk    r	d| _        d S d S )?Nz/o3-minidiffTFzFormatting re-enabled. r   zgpt-4.1-minisyszgpt-4.1r   )zgpt-5zgpt-5-2025-08-07z/o1-miniz/o1-previewz/o1r'   v3r*   	reasoningthinkllama3zllama-370bzgpt-4-turbozgpt-4-z-previewudiffzgpt-4zclaude-3-opuszgpt-3.5z
sonnet-4-5zopus-4-6z	haiku-4-5r   r"   r    r   z
3-7-sonnetr8   z
3.5-sonnetz
3-5-sonnetzo1-z/o1-qwencoderz2.5z2-532bzeditor-diffqwqpreviewg333333?gffffff?)top_pqwen3235bz	/no_thinkgffffff?皙?   g        )r   top_kmin_p)r2   r4   r?   rE   rF   r   r9   r:   r   r>   r@   rC   r5   r   rB   rM   r;   )r^   r   last_segments      r   r   z"Model.apply_generic_model_settings  s   %D $D#(D (AD%(AD%!)>>>%,,-?@@@FU""%D $D!DM',D$F%D $D!DM',D$F{{3''+888#(D %D!)>>>%,,-?@@@F $D#(D %*D"FE!!%D $D#(D %*D"FE>>%D $D#(D "DN(AD%!)>>>%,,-?@@@F45==%D $D!DM'+D$FDEMM[E5I5I%D $D'+D$#(D !(DFe!3!3%%D $D#'D '+D$FE!!h%&7&7J%<O<O&D $D#'D Fe%77%D $D#'D FE!1!1!DMF E!!U""e##"e++ E))!U**%D $D',D$ (===%,,->???F5  %D $D'+D$"DM (===%,,->???F5  LE$9$9%D $D'+D$"DMFE"" 	foo%*D"#(D F eOO5  %5E>>%D&3D# $DFE>>eunn%1G1G%D&3D# $D!(D'+D$#&D  $4 0 0 0DFe%%D $D(3D%#&D *-S I IDF v%% $DF &%r   c                     | j         S r   r   r]   s    r   __str__zModel.__str__I  s
    yr   c                     |r|| _         | j         s	| | _        d S | j         | j        k    r	| | _        d S t          | j         d          | _        | j        S )NFr   )r3   r   r0   r   )r^   provided_weak_model_names     r   r   zModel.get_weak_modelL  sn    # 	<#;D # 	"DOF49,,"DOF 
 
 
 r   c                     | j         | gS r   r  r]   s    r   commit_message_modelszModel.commit_message_models_  s    &&r   c                    |r|| _         |r|| _        | j         r| j         | j        k    r| | _        nt	          | j         d          | _        | j        s)| j        j        | _        | j        dv rd| j        z   | _        | j        S )NF)r   )r   r1   zdiff-fencedzeditor-)rA   rB   r0   r   r   r2   )r^   provided_editor_model_namerB   s      r   r   zModel.get_editor_modelb  s    % 	@%?D" 	9&8D#% 	)?49)L)L $D %&"! ! !D
 & 	N&*&7&CD#&*JJJ*3d6M*M'  r   c                 8    t          j        | j        |          S )N)r   r   )r   encoder0   )r^   r   s     r   	tokenizerzModel.tokenizerx  s    ~DID9999r   c                    t          |          t          u rF	 t          j        | j        |          S # t
          $ r}t          d|            Y d }~dS d }~ww xY w| j        sd S t          |          t          u r|}nt          j
        |          }	 t          |                     |                    S # t
          $ r}t          d|            Y d }~dS d }~ww xY w)N)r   messageszUnable to count tokens: r   )typerO   r   token_counterr0   r   r   r  rJ   rl   r   r   )r^   r  errmsgss       r   token_countzModel.token_count{  s   >>T!!,49xPPPP   666777qqqqq ~ 	F>>S  DD:h''D	t~~d++,,, 	 	 	2S2233311111	s,   3 
AAA!B6 6
C CCc                    |                      |          \  }}t          ||          }|dk    r)d|z  }t          ||z            }t          ||z            }t          ||          }d|z  }t          ||z            }t          ||z            }t	          j        |dz            }t	          j        |dz            }||z  }	|	dz  dz   }
|
S )z
        Calculate the token cost for an image assuming high detail.
        The token cost is determined by the size of the image.
        :param fname: The filename of the image.
        :return: The token cost for the image.
        i   i   i      U   )get_image_sizer   r   r   mathceil)r^   fnamewidthheightmax_dimensionscale_factormin_dimensiontiles_widthtiles_height	num_tiles
token_costs              r   token_count_for_imagezModel.token_count_for_image  s     ++E22v E6**4-/L,--E,.//F E6**]*EL())Vl*++ i,,y#..,.	 _r)
r   c                 l    t          j        |          5 }|j        cddd           S # 1 swxY w Y   dS )z
        Retrieve the size of an image.
        :param fname: The filename of the image.
        :return: A tuple (width, height) representing the image size in pixels.
        N)r	   opensize)r^   r  imgs      r   r  zModel.get_image_size  sz     Z 	#8	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   )--c           	      n   | j         }|                    d          }t          |          dk    r	|d         }nd}t          ddddd	d
d          }d}|t          v rd}n!|t
          v rd	}n|                    |          }|r1t          j                            |          rt          |gg           S dS dS )z;Fast path for common models. Avoids forcing litellm import.r   r   r   NOPENROUTER_API_KEYOPENAI_API_KEYDEEPSEEK_API_KEYGEMINI_API_KEYANTHROPIC_API_KEYGROQ_API_KEYFIREWORKS_API_KEY)
openrouteropenair'   r+   	anthropicgroqfireworks_air   r   )	r0   r   r   rM   OPENAI_MODELSANTHROPIC_MODELSr}   osenviron)r^   r   r   providerkeymapvars         r   fast_validate_environmentzModel.fast_validate_environment  s     	S!!v;;??ayHHH+#'#),
 
 
 M!!"CC&&&%CC**X&&C 	D2:>>#&& 	DSECCCC	D 	D 	D 	Dr   c                    |                                  }|r|S | j        }t          j        |          }|d         rt	          d |d         D                       rk|                    d          s|                    d          rAt          j                            d          r"d |d         D             |d<   |d         sd|d<   |d         r|S |d         r|S | j	                            d	d
          
                                }|dk    rt          dg          S |dk    rt          dg          S |dk    rt          dg          S |S )Nr   c              3      K   | ]}|d v V  	dS )AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYNr   )r   r   s     r   r   z-Model.validate_environment.<locals>.<genexpr>  s9       '
 '
FICAA'
 '
 '
 '
 '
 '
r   bedrock/zus.anthropic.AWS_PROFILEc                     g | ]}|d v|	S )rC  r   )r   ks     r   r   z.Model.validate_environment.<locals>.<listcomp>  s.     + + +$RRR RRRr   Tr   r   r   cohere_chatCOHERE_API_KEYr+   r/  r6  r1  )r@  r0   r   r   anyr   r;  r<  r}   r   r   validate_variables)r^   r   r   r=  s       r   r   zModel.validate_environment  s   ,,.. 	J 	*511 ~ 	:3 '
 '
MPQ_M`'
 '
 '
 $
 $
 	: 
++ :u/?/?/P/P ::>>-00 :+ +!$^!4+ + +C'
 ~. :5912$% 	J~ 	J9==!3R88>>@@}$$%'7&8999x%'7&8999v%~&6777
r   c                     d}| j                             d          }|r%|dz  }t          |d          }t          |d          }|S )Nr   r      i   )r   r}   r   r   )r^   
map_tokensmax_inp_tokenss      r   get_repo_map_tokenszModel.get_repo_map_tokens  sQ    
'9:: 	/'!+JZ..JZ..Jr   c                    || j                             d          r5| j        si | _        d| j        vr
i | j        d<   d|i| j        d         d<   dS | j        si | _        d| j        vr
i | j        d<   || j        d         d<   dS dS )z=Set the reasoning effort parameter for models that support itNr   
extra_bodyeffortr   r   )r0   r   r;   )r^   rU  s     r   set_reasoning_effortzModel.set_reasoning_effort  s    y##M22 M( +(*D%t'88868D%l3@H&?Q!,/<<<( +(*D%t'88868D%l3FL!,/0BCCC r   c                    t          |t                    r|S t          |t                    st          |          S |                                                                }|                    d          rd}|dd         }n$|                    d          rd}|dd         }nd}t          t          |          |z            S )z
        Parse a token value string into an integer.
        Accepts formats: 8096, "8k", "10.5k", "0.5M", "10K", etc.

        Args:
            value: String or int token value

        Returns:
            Integer token value
        Kr   Nr   M   r   )r   r   rJ   r   upperendswithrN   )r^   r   
multipliers      r   parse_token_valuezModel.parse_token_value  s     eS!! 	L%%% 	u::##%%>># 	J#2#JEE^^C   	$J#2#JEEJ 5<<*,---r   c                    ||                      |          }d| _        | j        si | _        | j                            d          rNd| j        vr
i | j        d<   |dk    rd|i| j        d         d<   dS d| j        d         v r| j        d         d= dS dS |dk    rd|d	| j        d
<   dS d
| j        v r| j        d
= dS dS dS )z
        Set the thinking token budget for models that support it.
        Accepts formats: 8096, "8k", "10.5k", "0.5M", "10K", etc.
        Pass "0" to disable thinking tokens.
        NFr   rT  r   r   r   enabled)r  budget_tokensthinking)r^  r?   r;   r0   r   )r^   r   
num_tokenss      r   set_thinking_tokenszModel.set_thinking_tokens7  s    //66J#(D $ '$&! y##M22 :t'88868D%l3>>DPR\C]D%l3K@@@"d&7&EEE -l;KHHH FE >>=FYc4d4dD%j111!T%666 -j999) & 76r   c                 0   d}| j         r| j                            d          rGd| j         v r=d| j         d         v r.d| j         d         d         v r| j         d         d         d         }n+d| j         v r"d| j         d         v r| j         d         d         }|S )z0Get formatted thinking token budget if availableNr   rT  r   r   rb  ra  r;   r0   r   )r^   budgets     r   get_raw_thinking_tokenszModel.get_raw_thinking_tokensS  s     	Hy##M22 H D$555#t'8'FFF$(9,(G(TTT!.|<[I,WF d///OtGXYcGd4d4d*:6Gr   c                     |                                  }|f|dk    r0|dz  }|t          |          k    rt          |           dS |ddS |dz  }|t          |          k    rt          |           dS |ddS d S )NrZ  rY  .1fr   rI  )rh  r   )r^   rg  r   s      r   get_thinking_tokenszModel.get_thinking_tokensh  s    --//$$+.CJJ&&!%jj++++#????*CJJ&&!%jj++++#????*tr   c                 ,   | j         r| j                            d          rGd| j         v r=d| j         d         v r.d| j         d         d         v r| j         d         d         d         S n+d| j         v r"d| j         d         v r| j         d         d         S dS )z'Get reasoning effort value if availabler   rT  r   rU  r   Nrf  r]   s    r   get_reasoning_effortzModel.get_reasoning_effort{  s     	Ky##M22 K D$555#t'8'FFF D$5l$CK$PPP,\:;GQQ  111&$*;L*III(67IJJtr   c                 P    | j                                         }d|vrd S d|v pd|v S )Nr'   r*   reasoner)r0   r   )r^   r0   s     r   is_deepseek_r1zModel.is_deepseek_r1  s7    y  T!!Ft|1zT11r   c                 j    | j                             d          p| j                             d          S )Nzollama/zollama_chat/)r0   r   r]   s    r   	is_ollamazModel.is_ollama  s-    y##I..V$)2F2F~2V2VVr   c                    d}|t           j        vst          t          d t           j        |                             d          D                       d                   t          t          j                                                              k     rwdd l} G d dt                    }dt           j        vrt          d	          t           j        d         }|                                st          d
          dt           j        d          |d         |d         dd}d}|                    ||          }|j        dk    r}d |                                D             }	t          |          dk    r|d d         dz   n|}
d|
 |	d<    |d|j         d| dt!          j        |	d           d|j                   |                                }|                    d          }|s |d          |t           j        |<   d S d S )Nr-  c              3   @   K   | ]}|                     d           V  dS )=N)r   )r   xs     r   r   z<Model.github_copilot_token_to_open_ai_key.<locals>.<genexpr>  s,      QQaQWWS\\QQQQQQr   ;expr   c                       e Zd ZdZdS )JModel.github_copilot_token_to_open_ai_key.<locals>.GitHubCopilotTokenErrorz9Custom exception for GitHub Copilot token-related errors.N)rG   rH   rI   __doc__r   r   r   GitHubCopilotTokenErrorrz    s        OOr   r|  GITHUB_COPILOT_TOKENz3GITHUB_COPILOT_TOKEN environment variable not foundz2GITHUB_COPILOT_TOKEN environment variable is emptyzBearer Editor-VersionCopilot-Integration-Idzapplication/json)Authorizationr~  r  zContent-Typez0https://api.github.com/copilot_internal/v2/token)headersrx   c                 &    i | ]\  }}|d k    ||S )r  r   )r   rI  vs      r   
<dictcomp>z=Model.github_copilot_token_to_open_ai_key.<locals>.<dictcomp>  s(    YYYAADXDX1DXDXDXr   rt   z...r  z+GitHub Copilot API request failed (Status: z)
URL: z

Headers: r   rz   z
JSON: tokenzResponse missing 'token' field)r;  r<  r   rM   r   r   now	timestampr|   r   KeyErrorr   r}   r   r   r   rl   r   r   )r^   extra_headersopenai_api_keyr|   r|  github_tokenr  r   r   safe_headerstoken_previewresponse_datar  s                r   #github_copilot_token_to_open_ai_keyz)Model.github_copilot_token_to_open_ai_key  st    *++QQ2:n+E+K+KC+P+PQQQQQRWXYY(,..**,,--. . OOO    )    &RZ77TUUU:&<=L%%'' USTTT "P2:6L+M!O!O"/0@"A*78P*Q 2	 G EC,,sG,44C#%%YYYYY<?<M<MQR<R<RRaR 05 8 8Xd0I-0I0I_---(#/ ( (( ( $
< B B B( ( !X( (    HHJJM!%%g..E P--.NOOO).BJ~&&&W. .r   c                    t           j                            d          rt          |           |                                 rt          |          }t          | j        |          }| j        dur8|1t          | j        t                    rd}nt          | j                  }||d<   |-|d         }t          d|          g|d<   dd	|d	         id|d
<   | j        r|                    | j                   |                                 r1d|vr-t          |                     |          dz            dz   }||d<   t#          j        |d                                          }t)          j        |          }	d|vr
t,          |d<   | j        rt1          |           ||d<   dt           j        v r/d|vrdt2           dd|d<   |                     |d                    t7          j        di |}
|	|
fS )NAIDER_SANITY_CHECK_TURNS)r   streamFr   temperaturefunction)r  r  toolsr0   tool_choicenum_ctxg      ?r   T)	sort_keysrv   r  r}  r  zaider/zvscode-chat)r~  r  r   )r;  r<  r}   r   rp  r   rM   r0   r?   r   rL   rN   r;   updaterr  r   r  rl   r   r  hashlibsha1request_timeoutr   r   r
   r  r   
completion)r^   r  	functionsr  r  kwargsr  r  r   hash_objectr   s              r   send_completionzModel.send_completion  s:   :>>455 	,!(+++   	:/99H)
 
 

 u,,"d2D99 >"#KK"'(<"="=K$/F=!  |H#hGGGHF7O-7fhW]N^E_$`$`F=! 	-MM$+,,,>> 	(	 7 7$**844t;<<tCG 'F9j40007799 l3''F"" /F9< 	LLL%z "RZ//f,,&<{&<&<.;+ +'
 44VO5LMMM **6**Cr   c                    ddl m}  |            }d| j        v rt          |          }d}| j        rt          |           	 	 |d dd} | j        di |\  }}|rt          |d          r|j        sd S |j        d         j	        j
        }dd	lm}	  |	|| j                  S # |                                $ r}
|                    |
          }t!          t#          |
                     |j        rt!          |j                   |j        }|r|d
z  }|t(          k    rd}|sY d }
~
d S t!          d|dd           t+          j        |           Y d }
~
d }
~
wt.          $ r Y d S w xY w)Nr   )LiteLLMExceptionszdeepseek-reasonerg      ?TF)r  r  r  choices)remove_reasoning_contentr   zRetrying in rj  z seconds...r   )aider.exceptionsr  r0   r   r   r   r  ra   r  messagerX   aider.reasoning_tagsr  rC   exceptions_tupleget_ex_infor   rJ   descriptionretryRETRY_TIMEOUTrh   sleepAttributeError)r^   r  r  
litellm_exretry_delayr  _hashr   r   r  r  ex_infoshould_retrys                r   simple_send_with_retrieszModel.simple_send_with_retries   s   666666&&((
$)++/99H< 	NNN 	 (!%#  #7$"6"@"@"@"@x  wx'C'C  8K[  4&q)19IIIIII//T5GHHH..00   $0055c#hh& /'-...&} -1$K"]22',#  44444A[AAAABBB
;'''!   tts+   /B" 4-B" "E'9A)E((EE'&E')NNNFr   )rG   rH   rI   r_   r   r   r   r   r  r   r	  r   r  r  r&  r  r@  r   rR  rV  r^  rd  rh  rk  rm  rp  rr  r  r  r  r   r   r   r   r   =  s       Z_'D 'D 'D 'DR8 8 8	7 	7 	7.A .A .A`b b bH    &' ' '! ! !,: : :  ,  >  D D D>% % %N  M M M . . .>: : :8  *  &  &2 2 2W W W1/ 1/ 1/f4  4  4  4 l+ + + + +r   r   c                 F   g }| D ]}t           j                            |          s#t          |                                                                          sW	 t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   |D ]E}t          di |fdt          D             t          d d <   t                                         Fn'# t          $ r}t          d| d|           d }~ww xY w|                    |           |S )Nrc                 4    g | ]}|j         j         k    |S r   r   )r   r   model_settingss     r   r   z#register_models.<locals>.<listcomp>?  s(    $c$c$cBBG~ObDbDbRDbDbDbr   z"Error loading model settings from : r   )r;  pathrg   r   rn   r   r(  yaml	safe_loadr/   r   r   r   )model_settings_fnamesfiles_loadedmodel_settings_fnamemodel_settings_filemodel_settings_listmodel_settings_dictr   r  s          @r   register_modelsr  .  s   L 5 2 2w~~233 	())3355;;== 		^*C00 J4G&*n5H&I&I#J J J J J J J J J J J J J J J (; 6 6#!.!E!E1D!E!E %d$c$c$c.$c$c$cqqq!%%n55556  	^ 	^ 	^\AU\\YZ\\]]]	^01111s=   C#.BC#B	C#B	AC##
D-DDc                    g }| D ]}t           j                            |          s"	 t          |                                          }|                                sYt          j        |          }|spt          j	        
                    |           n'# t          $ r}t          d| d|           d }~ww xY w|                    |           |S )Nz$Error loading model definition from r  )r;  r  rg   r   rn   r   json5rm   r   rY   r  r   r   )model_fnamesr  model_fnamer   	model_defr   s         r   register_litellm_modelsr  I  s    L# ) )w~~k** 		W$$..00D::<< D))I  3::9EEEE 	W 	W 	WU;UURSUUVVV	W 	K((((s#   5BB5B
B9B44B9c                     g }| D ]%}|t           j        vr|                    |           &|rt          d|          S t          d|          S )NFr8  T)r;  r<  r   rM   )varsmissingr?  s      r   rM  rM  a  se    G    bj  NN3 EGDDDDDw????r   c                     t          | |          }d }|j        r|j        |urt          | |j                  }d }|j        r,|j        |ur#|j        |j        urt          | |j                  }|p|p|S r   )sanity_check_modelr   r   )io
main_modelproblem_mainproblem_weakproblem_editors        r   sanity_check_modelsr  k  s    %b*55LL E!6j!H!H)"j.CDDNI#:55#:+@@@+B
0GHH9<9>9r   c                    d}|j         rd}|                     d| d           |j         D ]C}t          j                            |d          }|rdnd}|                     d| d	|            Dt          j                    d
k    r|                     d           n"|j        sd}|                     d| d           t          | |j
                   |j        scd}|                     d| d           t          |j
                  }|r2|                     d           |D ]}|                     d|            |S )NFTz	Warning: z$ expects these environment variablesr   SetzNot set- r  WindowszXNote: You may need to restart your terminal or command prompt for `setx` to take effect.zWarning for z3: Unknown which environment variables are required.z=: Unknown context window size and costs, using sane defaults.zDid you mean one of these?)r   tool_warningr;  r<  r}   tool_outputplatformsystemr   check_for_dependenciesr0   r   fuzzy_match_models)r  r   showr   r   statuspossible_matchesmatchs           r   r  r  }  s   D c
OEOOOPPP% 	1 	1CJNN3++E#2UUFNN///v//0000?	))NN  
 & c
auaaabbb 2uz***: 
-
_5___	
 	
 	
 .ej99 	-NN7888) - -|E||,,,,Kr   c                     |                     d          rt          | dddg           dS |                     d          rt          | dddg           dS dS )	z
    Check for model-specific dependencies and install them if needed.

    Args:
        io: The IO object for user interaction
        model_name: The name of the model to check dependencies for
    rF  boto3z-AWS Bedrock models require the boto3 package.z
vertex_ai/zgoogle.cloud.aiplatformzDGoogle Vertex AI models require the google-cloud-aiplatform package.zgoogle-cloud-aiplatformN)r   r   )r  
model_names     r   r  r    s     Z(( 
H7)	
 	
 	
 	
 	

 
		|	,	, 
%R&'		
 	
 	
 	
 	

 
r   c                 P                                       t                      }t          t          j                                                  }|t          t          j                                                  z  }|D ]\  }}|                                 }|                    d          dk    r3|                    dd                                           }|s^|dz  }|	                    |          r|}n||z   }|
                    |           |
                    |           t          |          } fd|D             }|rt          t          |                    S t          |          }	t          j         |	dd	          }t          t          |                    S )
Nmodechatr   r   r   c                     g | ]}|v |	S r   r   )r   mr0   s     r   r   z&fuzzy_match_models.<locals>.<listcomp>  s    ;;;Qqr      r   )ncutoff)r   setrO   r   
model_costr   r   rY   r}   r   addsorteddifflibget_close_matches)
r0   chat_modelsmodel_metadata
orig_modelattrsr   r=  fq_modelmatching_modelsmodelss
   `         r   r  r    s   ::<<D%%K',224455Nd-BHHJJKKKN+ $ $
E  ""99V&&99/44::<< 	CH%% 	-!HH*,H!!!
####%%K <;;;+;;;O ,c/**+++ F/f#NNNO#o&&'''r   c                     t          |          }|r8|                     d| d           |D ]}|                     d|            d S |                     d| d           d S )NzModels which match "z":r  zNo models match "z".)r  r  )r  r   matchesr   s       r   print_matching_modelsr    s     ((G 7
8f888999 	) 	)ENN<<<((((	) 	) 	5655566666r   c                     ddl m}  dd l}g }i } | t                    D ]}|j        ||j        <   d|d<   |                    |           t          t          d           D ]k}i } | t                    D ],}t          ||j                  }||j        k    r
|||j        <   -|                    |           |                    d            l |j
        d |D             dd	          }|                    d
d          S )Nr   )r   z(default values)r0   c                     | j         S r   r   )rv  s    r   <lambda>z,get_model_settings_as_yaml.<locals>.<lambda>  s    16 r   )r   c                     g | ]}||S r   r   r   s     r   r   z.get_model_settings_as_yaml.<locals>.<listcomp>  s    <<<R^^^^r   F)default_flow_styler  z
- z

- )dataclassesr   r  r/   defaultr0   r   r  r   r   r   r   )	r   r  r  defaultsr   r   r  r   yaml_strs	            r   get_model_settings_as_yamlr    sS   """"""KKKH&& - -$})HVx((( ^)9)9::: 	) 	) VM** 	8 	8EB
++E%%27#EJ/""#6777""4(((( ty<<)<<<   H FH---r   c                     t          t          j                  dk     r#t          d           t          j        d           t          j        d         dk    rt                      } t          |            d S t          j        d         }t          |          }|r)t          d| d           |D ]}t          |           d S t          d| d           d S )	Nr   z?Usage: python models.py <model_name> or python models.py --yamlr   z--yamlzMatching models for 'z':zNo matching models found for 'z'.)r   r   argvr   exitr  r  )yaml_stringr  r  r   s       r   mainr    s    
38}}qOPPP
x{h022kXa[
,Z88 	C8*888999(  e  A:AAABBBBBr   __main__r   )Cr  r  importlib.resources	importlibrl   r  r;  r  r   rh   r  r   r   r   pathlibr   typingr   r   r  r  PILr	   aiderr
   
aider.dumpr   	aider.llmr   aider.openrouterr   aider.sendchatr   r   aider.utilsr   r  r  DEFAULT_MODEL_NAMEANTHROPIC_BETA_HEADERr9  
splitlinesr:  r   r/   r   	resources	open_textfr  r  r  r   rQ   r   r   r  r  rM  r  r  r  r  r  r  r  rG   r   r   r   <module>r      s           				  



  ) ) ) ) ) ) ) )             " " " " " " " "                           3 3 3 3 3 3 J J J J J J J J / / / / / / C > POm&>&>&@&@OOO $ VU)9)D)D)F)FUUU !  	  	( #    ( ) 0  2!" 	
&#$ -%& 9'( +)* 44/  8 , , , , , , , ,4 ""#46JKK Dq($.++2 D DmmBB.ABBCCCCDD D D D D D D D D D D D D D Db b b b b b b bJ &%'' n n n n nM n n nb  6  0@ @ @: : :$$ $ $N
 
 
0*( *( *(Z7 7 7 .  .  .FC C C( zDFFFFF s   *1E((E,/E,