
    ht<                     l   d dl m Z  d dlZd dlmZmZmZ d dlZd dlmZ d dl	m
Z
 d dlZd dlZddlmZ e G d d	             Zd
eeef   defdZdee   defdZdee   defdZdee   defdZdej0                  defdZ ej4                         dYd       Zej9                  d       ej:                  dd ej<                  ddg      dd      ej>                  dej0                  ded   ddfd                     Z ej9                  d       ejB                  d        ej:                  d!d"d#d$%       ej:                  d&d'd#d(%      ej>                  dej0                  d)ed*e"ed+f   d,e"ed+f   ddf
d-                                   Z#ej9                  d.       ejB                  d/      ej>                  dej0                  d0eddfd1                     Z$ej9                  d2       ej:                  d3d0d45       ej:                  d6d)d75      ej>                  dej0                  d0ee   d)ee   ddfd8                            Z%ej9                  d,       ej:                  dd ej<                  ddg      dd       ej:                  d9d:d;d<=      ej>                  dej0                  ded   d:eddfd>                            Z&ej9                  d?       ejB                  d/       ej:                  d!d"d#d$%       ej:                  d&d'd#d(%      ej>                  dej0                  d0ed*e"ed+f   d,e"ed+f   ddf
d@                                   Z'dA Z(dBe)e   dCefdDZ*dE Z+dFede)eeef      fdGZ,dH Z-dIe.defdJZ/ej9                  dK       ejB                  dF ej`                  d#dLd#M      N       ej:                  dOd#dPQ       ej:                  dRddS=       ej:                  dTddU=      ej>                  dej0                  dFedIe.dVee   dWee   ddfdX                                          Z1y)Z    )datetimeN)OptionalLiteralAny)	dataclass)defaultdict   )Clientc                   z    e Zd ZU eed<   eeef   ed<   eeef   ed<   eed<   ee   ed<   eed<   edefd       Z	y	)
ModelYamlInfo
model_namemodel_params
model_infomodel_idaccess_groupsproviderreturnc                 T    | j                   rdj                  | j                         S dS )Nz,  )r   join)selfs    d/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/client/cli/commands/models.pyaccess_groups_strzModelYamlInfo.access_groups_str   s$    040B0Btyy++,JJ    N)
__name__
__module____qualname__str__annotations__dictr   listpropertyr    r   r   r   r      sS    OsCx. S#XM9MK3 K Kr   r   modelr   c                     | d   }| d   }| j                  di       }|d   }|j                  dg       }d|v r|j                  dd      d   n|}t        ||||||	      S )
zKExtract model info from a model dict and return as ModelYamlInfo dataclass.r   litellm_paramsr   r$   r   /   r   )r   r   r   r   r   r   )getsplitr   )r$   r   r   r   r   r   r   s          r   _get_model_info_obj_from_yamlr+      s}    L)J#()9#:L!&<!<J )HNN?B7M,/8Ox~~c1%a(H!# r   iso_datetime_strc                     | sy	 t        j                  | j                  dd            }|j                  d      S # t        t
        f$ r t        |       cY S w xY w)zSFormat an ISO format datetime string to human-readable date with minute resolution.r   Zz+00:00%Y-%m-%d %H:%M)r   fromisoformatreplacestrftime	TypeError
ValueErrorr   )r,   dts     r   format_iso_datetime_strr6   1   s[    %##$4$<$<S($KL{{+,,z" %#$$%s   5; AA	timestampc                     | y	 t        j                  |       }|j                  d      S # t        t        f$ r t        |       cY S w xY w)zPFormat a Unix timestamp (integer) to human-readable date with minute resolution.r   r/   )r   fromtimestampr2   r3   r4   r   )r7   r5   s     r   format_timestampr:   =   sN    ##I.{{+,,z" 9~s   %+ AAcostc                 r    | y	 t        |       }d|dz  dS # t        t        f$ r t        |       cY S w xY w)z0Format a per-token cost to cost per 1000 tokens.r   $i  z.4f)floatr3   r4   r   )r;   
cost_floats     r   format_cost_per_1k_tokensr@   H   sK    |4[
:$S)**z" 4ys    66ctxc                 P    t        | j                  d   | j                  d         S )z0Helper function to create a client from context.base_urlapi_key)rC   rD   )r
   obj)rA   s    r   create_clientrF   U   s!    377:.	8JKKr   c                       y)z*Manage models on your LiteLLM proxy serverNr#   r#   r   r   modelsrH   Z   s     	r   r!   z--formatoutput_formattablejsonzOutput format (table or json))typedefaulthelp)rJ   rK   c                 8   t        |       }|j                  j                         }t        |t              sJ |dk(  rt	        j
                  |       yt        j                  j                  d      }|j                  dd       |j                  dd	       |j                  d
d       |j                  dd       |D ]  }|j                  d      }t        |t              r|j                         rt        |      }|j                  t        |j                  dd            t        |j                  dd            t        |t              rt        |      n
t        |      t        |j                  dd                    t	        j                   |       y)zList all available modelsrK   datazAvailable ModelstitleIDcyanstyleObjectgreenCreatedmagentazOwned Byyellowcreatedidr   objectr$   owned_byN)rF   rH   r!   
isinstancerich
print_jsonrJ   Table
add_columnr)   r   isdigitintadd_rowr:   r6   print)rA   rI   clientmodels_listrJ   r$   r]   s          r   list_modelsrl   `   sN    3F--$$&Kk4((([)

  '9 : 	V,1)484 !Eii	*G'3'GOO,=g,MMEIIdB'(EIIh01-7-E )KbcjKkEIIj"-.	 ! 	

5r   addz
model-namez--paramz-pTzFModel parameters in key=value format (can be specified multiple times))multiplerN   z--infoz-iz@Model info in key=value format (can be specified multiple times)r   param.infoc                     t        d |D              }|rt        d |D              nd}t        |       }|j                  j                  |||      }t	        j
                  |       y)zAdd a new model to the proxyc              3   @   K   | ]  }|j                  d d        yw=r(   Nr*   .0ps     r   	<genexpr>zadd_model.<locals>.<genexpr>        7AQ7   c              3   @   K   | ]  }|j                  d d        ywrs   ru   rw   is     r   ry   zadd_model.<locals>.<genexpr>        4!aggc1o4r{   Nr   r   r   rP   )r    rF   rH   newrb   rc   )rA   r   ro   rp   r   r   rj   results           r   	add_modelr      sb    $ 777L8<4t44$J3F]]!  F
 	OO r   deletezmodel-idr   c                 ~    t        |       }|j                  j                  |      }t        j                  |       y)zDelete a model from the proxy)r   rP   N)rF   rH   r   rb   rc   )rA   r   rj   r   s       r   delete_modelr      s1    
 3F]]!!8!4FOO r   r)   z--idzID of the model to retrieve)rN   z--namezName of the model to retrievec                     |s|st        j                  d      t        |       }|j                  j	                  ||      }t        j                  |       y)z&Get information about a specific modelz&Either --id or --name must be provided)r   r   rP   N)click
UsageErrorrF   rH   r)   rb   rc   )rA   r   r   rj   r   s        r   	get_modelr      sJ     JGHH3F]]ZHFOO r   z	--columnscolumnsz&public_model,upstream_model,updated_atzComma-separated list of columns to display. Valid columns: public_model, upstream_model, credential_name, created_at, updated_at, id, input_cost, output_cost. Default: public_model,upstream_model,updated_at)rM   rN   c                    t        |       }|j                  j                         }t        |t              sJ |dk(  rt        j                  |       y)t
        j                  j                  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}|j                  d      D cg c]  }|j                          }}|D ]Q  }	|	|v r0||	   }
|j                  |
d   |
d    |
j                  d!d"      #       7t        j                  d$|	 d%d&'       S |D ]?  }g }|D ]$  }	|	|v s|j                   ||	   d(   |             & |s1 |j                   |  A t        j"                  |       y)c c}w )*z)Get detailed information about all modelsrK   rP   zModels InformationrR   zPublic ModelrU   c                 8    t        | j                  dd            S )Nr   r   r   r)   ms    r   <lambda>z!get_models_info.<locals>.<lambda>   s    s155r+B'Cr   )headerrW   	get_valueUpstream ModelrY   c                 X    t        | j                  di       j                  dd            S )Nr&   r$   r   r   r   s    r   r   z!get_models_info.<locals>.<lambda>   s#    s1551A2+F+J+J7TV+W'Xr   zCredential Namer\   c                 X    t        | j                  di       j                  dd            S )Nr&   litellm_credential_namer   r   r   s    r   r   z!get_models_info.<locals>.<lambda>   s$    s1551A2+F+J+JKdfh+i'jr   z
Created Atr[   c                 V    t        | j                  di       j                  d            S )Nr   
created_atr6   r)   r   s    r   r   z!get_models_info.<locals>.<lambda>   "    '>quu\SU?V?Z?Z[g?h'ir   z
Updated Atc                 V    t        | j                  di       j                  d            S )Nr   
updated_atr   r   s    r   r   z!get_models_info.<locals>.<lambda>   r   r   rT   bluec                 X    t        | j                  di       j                  dd            S )Nr   r^   r   r   r   s    r   r   z!get_models_info.<locals>.<lambda>   s!    s155r+B+F+FtR+P'Qr   z
Input Costrightc                 V    t        | j                  di       j                  d            S )Nr   input_cost_per_tokenr@   r)   r   s    r   r   z!get_models_info.<locals>.<lambda>   s"    '@|UWAXA\A\]sAt'ur   )r   rW   justifyr   zOutput Costc                 V    t        | j                  di       j                  d            S )Nr   output_cost_per_tokenr   r   s    r   r   z!get_models_info.<locals>.<lambda>  s"    '@|UWAXA\A\]tAu'vr   )public_modelupstream_modelcredential_namer   r   r^   
input_costoutput_cost,r   rW   r   left)rW   r   zWarning: Unknown column ''T)errr   N)rF   rH   rp   ra   r!   rb   rc   rJ   rd   r*   stripre   r)   r   echoappendrh   ri   )rA   rI   r   rj   models_inforJ   column_configscolrequested_columnscol_nameconfigr$   
row_valuess                r   get_models_infor      s   " 3F--$$&Kk4((([)

  '; <
 )C + X ,!j  '"i '"i Q ' "u	 ( "v	K+5
\ 5<MM#4FGSSYY[GG)H>)'1  !1RXR\R\]fhnRo p

6xjBM * !EJ-~-%%&KnX&>{&KE&RS . z* ! 	

5# Hs   <Fupdatec                     t        d |D              }|rt        d |D              nd}t        |       }|j                  j                  |||      }t	        j
                  |       y)z(Update an existing model's configurationc              3   @   K   | ]  }|j                  d d        ywrs   ru   rv   s     r   ry   zupdate_model.<locals>.<genexpr>0  rz   r{   c              3   @   K   | ]  }|j                  d d        ywrs   ru   r}   s     r   ry   zupdate_model.<locals>.<genexpr>1  r   r{   N)r   r   r   rP   )r    rF   rH   r   rb   rc   )rA   r   ro   rp   r   r   rj   r   s           r   update_modelr     sb    $ 777L8<4t44$J3F]]!!! " F
 	OO r   c                 \   | j                  d      }| j                  d      }| j                  di       }|r|sy|j                  d      }|rt        |t              sy|r|j                  |      sy|j                  dg       }r&t        |t              syt        fd|D              syy)	Nr   r&   r   Fr$   r   c              3   d   K   | ]'  }t        |t              xr j                  |       ) y w)N)ra   r   search)rw   groupaccess_group_regexs     r   ry   z _filter_model.<locals>.<genexpr>K  s-     jSX:eS)N.@.G.G.NNjs   -0T)r)   ra   r   r   r!   any)r$   model_regexr   r   r   r   r   r   s     `     r   _filter_modelr   <  s    <(J99-.L<,J\(H:h4;--h7NN?B7M-.j\ijjr   added_modelstable_titlec                 V   | sy t         j                  j                  |      }|j                  dd       |j                  dd       |j                  dd       | D ]3  }|j	                  |j
                  |j                  |j                         5 t        j                  |       y )	NrR   z
Model NamerU   rV   r   rY   zAccess Groupsr[   )	rb   rJ   rd   re   rh   r   r   r   ri   )r   r   rJ   r   s       r   _print_models_tabler   P  s    JJ;/E	\0	%W5	_I6allAJJ0C0CD JJur   c                    t         j                  j                  d      }|j                  dd       |j                  dd       | j	                         D ])  \  }}|j                  t        |      t        |             + t        | j                               }|j                  dd	| d
       t        j                  |       y )NzModel Import SummaryrR   ProviderrU   rV   CountrY   z[bold]Total[/bold]z[bold]z[/bold])
rb   rJ   rd   re   itemsrh   r   sumvaluesri   )provider_countssummary_tabler   counttotals        r   _print_summary_tabler   \  s    JJ$$+A$BMZv6WG4*002%c(mSZ8 3 &&()E.&w0GHJJ}r   	yaml_filec                     t        | d      5 }t        j                  |      }ddd       rd|vrt        j                  d      |d   }t        |t              st        j                  d      |S # 1 sw Y   PxY w)z2Load and validate the model list from a YAML file.rN
model_listz@YAML file must contain a 'model_list' key with a list of models.z1'model_list' must be a list of model definitions.)openyaml	safe_loadr   ClickExceptionra   r!   )r   frQ   r   s       r   get_model_list_from_yaml_filer   j  sy    	i	 !~~a !<t+""#effl#Jj$'""#VWW! !s   A22A;c                     |rt        j                  |      nd}|rt        j                  |      nd}| D cg c]  }t        |||      s| c}S c c}w )z6Return a list of models that pass the filter criteria.N)recompiler   )r   only_models_matching_regex!only_access_groups_matching_regexr   r   r$   s         r   _get_filtered_model_listr   v  sK    <V"**78\`KJk$EFqu)ce]5+Oa-bEcccs   A
Adry_runc                 
    | ryy)NzLModels that would be imported if [yellow]--dry-run[/yellow] was not providedzModels Importedr#   )r   s    r   _import_models_get_table_titler   }  s    ] r   importF)existsdir_okayreadable)rL   z	--dry-runz7Show what would be imported without making any changes.)is_flagrN   z--only-models-matching-regexzFOnly import models where litellm_params.model matches the given regex.z#--only-access-groups-matching-regexz_Only import models where at least one item in model_info.access_groups matches the given regex.r   r   c                    t        t              }g }t        |      }t        |||      }|st	        |       }	|D ]t  }
t        |
      }|s=	 	j                  j                  |j                  |j                  |j                         |j                  |       ||j                  xx   dz  cc<   v t        |      }t        ||       t!        |       y# t        $ r Y Xw xY w)z9Import models from a YAML file and add them to the proxy.r   r(   N)r   rg   r   r   rF   r+   rH   r   r   r   r   	Exceptionr   r   r   r   r   )rA   r   r   r   r   r   r   r   filtered_model_listrj   r$   model_info_objr   s                r   import_modelsr     s    , '2#&6O(*L.y9J2.0Q s#$6u=!!-88!/!<!<-88 "  	N+//0A50 % 19Kk2)  s   
<C	CC)r   N)2r   r   typingr   r   r   r   dataclassesr   collectionsr   r   rb   r   r
   r   r    r   r+   r6   rg   r:   r>   r@   ContextrF   r   rH   commandoptionChoicepass_contextrl   argumenttupler   r   r   r   r   r   r!   r   r   r   r   boolr   Pathr   r#   r   r   <module>r      s    	 ) )  ! #    
K 
K 
Kc3h M $	%hsm 	% 	% # 
HUO 
 
Lu}} L L
 	 	
 	w'	(	( U]] 7?3K PT   D 	Q	 	K	 !5== !c !%S/ !QVWZ\_W_Q` !ei !   ! 
!emm !s !t !   ! fj'DEh+JK!5== !HSM !xPS} !Y] !  L F ! 	w'	(	( 4 
Z	 K Kw7O KZ] Kbf K  K\ 
	Q	 	K	 !emm !s !5c? !RWX[]`X`Ra !fj !   !(	d=&9 	 		S 	T$sCx.5I 	d!D !S ! *%**D5SW"XYk4.gh"	Q
 )	j
 "*	"*"* "* !)	"*
 (0}"* 
"*  i Z "*r   