
    ^h                         S r SSKrSSKrSSKJrJr  SSKJr  SSKrSSKJrJ	r	J
r
Jr  SSKJr  SSKrSSKJrJr  SSKJr  SS	K7  SS
KJrJrJrJrJrJrJrJrJrJrJ r   SSK!J"r"J#r#J$r$J%r%J&r&J'r'  SSK(J)r)  SSK*J+r+  SSK,J-r-  SSK.J/r/  SSK0J1r1  SSK2J3r3  SSK4J5r5  \" 5       r6\" \7Rp                  Rr                  SSS9r:\" \7Rv                  Rr                  SSS9r<\" \7Rz                  Rr                  SSS9r>\" \7R~                  Rr                  SSS9r@S\A4S jrB S5S\AS\\C   S\D4S jjrE S5S\AS\	S \FS\AS!\\G   S\\C   S\D4S" jjrH S5S\AS#\IS$   S\	S \FS\AS!\\G   S\\C   S\D4S% jjrJS&\
4S' jrK\R                  " \:5      \R                  " \<5      \R                  " \>5      \R                  " \@5      4S\	S\AS(\AS)\\A   S*\\A   S\G4S+ jjrM S5S\\C   S\AS,\\N   S-\FS\AS.\S/\\O   S\G4S0 jjrPS\\C   4S1 jrQS\\C   S\\O   4S2 jrRS\	S3\AS\A4S4 jrSg)6z
This file handles authentication for the LiteLLM Proxy.

it checks if the user passed a valid API Key to the LiteLLM Proxy

Returns a UserAPIKeyAuth object if the API key is valid

    N)datetimetimezone)Optional)HTTPExceptionRequest	WebSocketstatus)APIKeyHeader)verbose_loggerverbose_proxy_logger)ServiceLogging)*)_cache_key_object/_handle_failed_db_connection_for_get_key_objectallowed_routes_checkcan_key_call_modelcommon_checksget_actual_routesget_end_user_objectget_key_objectget_org_objectget_team_objectget_user_object)_get_request_ip_addressget_request_routeis_pass_through_provider_routepre_db_read_auth_checks route_in_additonal_public_routes.should_run_auth_on_pass_through_provider_route)check_oauth2_token)handle_oauth2_proxy_request)RouteChecks)service_account_checks)_read_request_body)_to_ns)ServiceTypesFzBearer token)name
auto_errordescriptionzcSome older versions of the openai Python package will send an API-Key header with just the API key zIf anthropic client used.z If google ai studio client used.api_keyc                    U R                  S5      (       a  U R                  SS5      n U $ U R                  S5      (       a  U R                  SS5      n U $ U R                  S5      (       a  U R                  SS5      n U $ Sn U $ )NBearer  Basic zbearer )
startswithreplacer*   s    ^/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/auth/user_api_key_auth.py_get_bearer_tokenr3   M   s     )$$//)R0 N 
		H	%	%//(B/
 N	 
		I	&	&//)R0 N N    routeuser_objreturnc                    ^  [         R                  R                  nT b0  [        T [        5      (       a  [        U 4S jU 5       5      (       a  g[        U 4S jU 5       5      (       a  gg)z)
- Check if the route is a UI used route
c              3   F   >#    U  H  nTR                  U5      v   M     g 7fN)r/   .0allowed_router5   s     r2   	<genexpr>_is_ui_route.<locals>.<genexpr>h   s     T^M  //^s   !Tc              3   N   >#    U  H  n[         R                  " TUS 9v   M     g7f))r5   patternN)r"   _route_matches_patternr;   s     r2   r>   r?   l   s%      +M 	**N+s   "%F)LiteLLMRoutes	ui_routesvalue
isinstancestrany)r5   r6   allowed_routess   `  r2   _is_ui_routerJ   [   sc     #,,22N 	uc""T^TTT 	 + 
 
 r4   requestrequest_datavalid_tokenc           
          [        US9nUc  [        S5      e[        US9(       d  [        R                  " UUU UUUUS9  g)z4
- Route b/w api token check and normal token check
r6   z4Invalid proxy server token passed. valid_token=None.)r6   
_user_roler5   rK   rL   r*   rM   T)_get_user_role	Exception_is_user_proxy_adminr"   $non_proxy_admin_allowed_routes_check)r5   rK   rL   r*   rM   r6   rP   s          r2   _is_api_route_allowedrU   t   sP      2JNOO288!%#	
 r4   
token_type)uiapic           	      H    US:X  a  [        XS9(       a  g[        U UUUUUS9$ )z3
- Route b/w ui token check and normal token check
rW   )r5   r6   T)r5   rK   rL   r*   rM   r6   )rJ   rU   )r5   rV   rK   rL   r*   rM   r6   s          r2   _is_allowed_routerZ      s5     TlJ$%#
 	
r4   	websocketc                 :  ^#    [        SS0S9nU R                  Ul        U R                  nUR	                  S5      mU4S jnX1l        U R                  R	                  S5      nU(       dR  U R                  R	                  S5      nU(       d/  U R                  [        R                  S9I S h  vN   [        S	S
S9eOaUR                  S5      (       d/  U R                  [        R                  S9I S h  vN   [        S	SS9eU[        S5      S  R                  5       n [        USU 3S9I S h  vN $  N NB N! [         aT  n[         R"                  " U5        U R                  [        R                  S9I S h  vN    [        S	[%        U5      S9eS nAff = f7f)Ntypehttp)scopemodelc                  8   >#    ST S3n U R                  5       $ 7f)Nz{"model": "z"})encode)return_stringr`   s    r2   return_body0user_api_key_auth_websocket.<locals>.return_body   s#     &ugS1##%%s   authorizationzapi-key)codei  zNo API key providedstatus_codedetailr,   z#Invalid Authorization header formatrK   r*   )r   url_urlquery_paramsgetbodyheaderscloser	   WS_1008_POLICY_VIOLATIONr   r/   lenstripuser_api_key_authrR   r   	exceptionrG   )r[   rK   rn   rd   rf   r*   er`   s          @r2   user_api_key_auth_websocketry      s~     VV,-G==GL))LW%E&
 L %%))/:M ##''	2//v'F'F/GGGC8MNN 
 ''	22//v'F'F/GGG(M   I 01779<&w''@STTT H
 H U <&&q)oo6#B#BoCCCCF;;<sg   B*F-D4.AF3D64*FD: /D80D: 3F6F8D: :
F6F:E=;FFFazure_api_key_headeranthropic_api_key_headergoogle_ai_studio_api_key_headerc                 2  #    SSK JnJnJnJnJn	Jn
JnJnJ	nJ
nJnJn  S n[        R                  " 5       n[        U S9n [!        U S9I S h  vN n[#        UU US9I S h  vN   UR%                  SS 5      nS n['        U[(        5      (       a  Un[+        US9nO['        U[(        5      (       a  UnO['        U[(        5      (       a  UnO['        U[(        5      (       a  UnOUb  U Hy  nUR%                  SS5      U:X  d  M  UR%                  S	S 5      nUc  M2  UR%                  S
S5      nU R,                  R%                  US9c  M`  U R,                  R%                  US9nM{     UR%                  S5      nUb
  [/        U US9nUb;  UR0                  R3                  S[5        U5      UR7                  U R,                  S9S9nUb#  U" XS9I S h  vN n[8        R;                  U5      $  U[<        R>                  R@                  ;   d  [C        US9(       a  [9        [D        RF                  S9$ [I        US9(       a#  [K        US9SL a  [9        [D        RF                  S9$ UR%                  SS5      SL aB  SSK J&n  USLa&  [O        S[P        RR                  R@                  -   5      e[U        US9I S h  vN $ UR%                  SS5      SL a  [W        U S9I S h  vN $ UR%                  SS5      SL Ga  SSK J&n  USLa&  [O        S[P        RR                  R@                   35      eURY                  US9n[Z        R\                  " SU5        U(       Gav  UR_                  US9I S h  vN nURa                  US9nURc                  US9n U (       ar  [e        [D        Rf                  UURh                  S 9n!U!(       a  [9        [D        Rf                  US!9$ URh                  Rj                  n"[m        U"S"9n#[o        S#U S$U# 35      eURq                  US S%9n$U$c6  URs                  5       SL a#  [o        S&URh                  Rt                   S'35      eS n%U$bm  [e        [D        Rv                  UURh                  S 9n!U!SL a0  URh                  Rx                  n"[m        U"S"9n#[o        S(U S$U# 35      e[{        U$UUUUS)9I S h  vN n%UR}                  US S%9n&U&b  [        U&UUUUS*9I S h  vN n'S n(S n)UR                  5       (       a&   UR                  US S%9n)U)c  Sn(OUR                  U)S+9n(S n*UR                  UU)S%9n+U+b#  [        U+UUUR                  U(S,9UUS-9I S h  vN n*S n,UR                  US S%9n-U-b  [        U-UUUUS.9I S h  vN n,S n.[        R                  S:  a  UR                  S/R                  U5      S9I S h  vN n.U.cU  UbR  S0n/UR                  R                  U/S19I S h  vN nUS   S2   n.UR                  S/R                  U5      U.S39I S h  vN   U.bA  [        U[        R                  U.US4   S59n0[        R                  " UR                  S6U0S795        [        UU%U*U,UU.UU	S89n'[9        S U%b  U%R                  OS U%b  U%R                  OS U%b  U%R                  OS U%b  U%R                  O/ [D        R                  U+U&UU-S99
$ Sn1[<        R                  R@                   H  n2UR                  U25      (       d  M  Sn1M     U1(       a@  U R,                  R%                  S
5      b$  U R,                  R%                  S
5      =(       d    SnUGb_  U GHX  n['        U[        5      (       d  M  UR%                  SS5      U:X  d  M3  UR%                  S:5      SLa  [9        5       s  $ UR%                  S;5      br  UR%                  S;5      S<:X  a]   SS K\n3UR                  S=S5      R                  5       nU3R                  U5      n4U4R                  S>5      n5U5R                  S?5      S   nM  UR%                  S	S 5      nUc  M  UR%                  S
S5      n['        U R,                  [        5      (       d  GM"  U R,                  R%                  US9c  GM?  U R,                  R%                  US9nGM[     U
cF  ['        U[(        5      (       a  [9        U[D        Rf                  US@9$ [9        [D        Rf                  US!9$ Uc  [o        SA5      eUS:X  a  [o        SBU 35      eUSC:X  a7  UR%                  SDS5      SL a
  [9        5       $ [        [        R                  SESF9eS n60 n7SGU;   a   USG   n-U-U7SH'   [        U-UUUUS.9I S h  vN n6U6b|  U6R                  U7SI'   U6R                  b`  U6R                  n8U8R                  b  U8R                  U7SJ'   U8R                  b  U8R                  U7SK'   U8R                  b  U8R                  U7SL'    [        [        U5      UUUUSSN9I S h  vN n:U:b  ['        U:[8        5      (       a  U:R                  [D        Rf                  :X  aa  U7R%                  SH5      U:ll        U7R%                  SJ5      U:lm        U7R%                  SK5      U:ln        U7R%                  SI5      U:le        UU:lo        U:$ U:b  ['        U:[8        5      (       a  U:R                  b   [{        U:R                  UUUUSSP9I S h  vN n;U;R                  bq  U:R                  bd  U;R                  U:R                  :  aJ  U;R                  n<U<R                  5        H*  u  n=n>SQU= 3n?U?U:R                  ;   d  M  [        U:U?U>5        M,      [        R                  " X5      n@ ['        U
[(        5      (       d   e W@(       aB  [        S [D        Rf                  U
U0 U7ESTU0EUUSU9nA[        [        U
5      UAUUSV9I S h  vN   WA$ U[<        R                  R@                  ;   a  [o        SWU SX35      e['        U[(        5      (       a-  UR                  SY5      (       d   SZR                  U5      5       eO%[        R                  " S[R                  U5      5        Uc  [        [o        S\5      S]9I S h  vN $ S nBUR                  SY5      (       a	  [        US9nU:cn   [        UUUUUS^9I S h  vN n:U7R%                  SH5      U:ll        U7R%                  SJ5      U:lm        U7R%                  SK5      U:ln        U7R%                  SI5      U:le        S nC0 nDU:Gb  U:R                  SL a  [o        S`5      e0 nES nF[        U:Sa5      (       a+  U:GR                   b  0 U:GR                  EU:GR                   EnEO0 U:GR                  EnEWE[        l        U:GR                  nGUG0 :w  a-  WGR%                  Sb/ 5      nHUHnI[Z        R\                  " ScUI 35        G[	        U:R                  5      S:X  a  O['        U:R                  G[
        5      (       a  SdU:R                  ;   a  O]UR%                  SeS 5      nFUR%                  SfS 5      nJUFb  G[        WFUU:U	Sg9I S h  vN   WJb  WJ H  nKG[        UKUU:U	Sg9I S h  vN   M     U:GR                  b"   [        U:GR                  UUSUUS-9I S h  vN nCU:GR                  Gb  UGb   U:R                   SiU:GR                   3nLUR                  ULS9I S h  vN nMUMcj  U:GR                  nNU:R                  nOUNbN  WObK  UR                  GR                  GR                  WNWOSj.SkS0Sl9I S h  vN nMUR                  WLUMS39I S h  vN   WMb]  WMR                  bP  WMR                  R                  nPUPb7  WPS:  a1  U:GR                  WP:  a   [        R                  " U:GR                  WPSm9eU:GR                  b  [        R                  " G[        GR                  5      nQ[        GR                  " U:GR                  5      nRURGR                  b  WRGR                  GR!                  UR5      c  WRR                  G[        GR                  Sn9nR[Z        R\                  " SoWR SpWQ 35        URUQ:  a#  G[#        SqWR SpWQ 3G[$        GR&                  SrUSs9eU:GR(                  b  U:R                  b  S n)WCb  WCGR*                  n)[        U:GR,                  U:GR(                  U:R                  U:GR                  U:R                  U)U:GR.                  St9nS[        R                  " UR                  SuUSS795        U:GR(                  U:R                  :  a*  [        R                  " U:GR(                  U:R                  Sm9eU:GR0                  nTUR%                  SeS 5      nUUTbR  ['        WT[        5      (       a=  G[	        WT5      S:  a-  Ub*  WUb'  U:GR,                  b  UGR3                  U:WUSv9I S h  vN   [        U:Sw5      (       a  U:GR4                  b  [        U:Sx5      (       a  U:GR6                  b  [        U:GR,                  U:GR4                  U:GR6                  U:GR                  U:R                  U:GR8                  Sy9nS[        R                  " UR                  SzUSS795        U:GR4                  U:GR6                  :  a+  [        R                  " U:GR4                  U:GR6                  Sm9eU:R                  bi  G[;        U:R                  U:GR6                  U:GR4                  U:GR<                  U:GR>                  U:GR@                  U:GRB                  U:GRD                  S{9nVOS nVG[G        U:US|9I S h  vN   UGRI                  U:R                  WVS39  S n.[        R                  S:  a  Ub  UR                  S/R                  U5      S9I S h  vN n.U.cR  S0n/UR                  R                  U/S19I S h  vN nUS   S2   n.UR                  S/R                  U5      U.S39I S h  vN   U.bT  [        U:GR,                  U.[        R                  UU:R                  S}9nS[        R                  " UR                  S6USS795        [        UWVWCU6UU.UU	S89n'U:c
  [        S~SS9eU:GR,                  c
  [        S~SS9eU:GR,                  n[        R                  " [        UU:UUSV95        U:GRK                  SS9nDUDGRM                  S4S 5        U6b  WDGRO                  U75        G[Q        U:SS 5      nWUWb  WWS:X  a  SOSnXG[S        UUXWCU UUU:S9nYUY(       d
  [        S~SS9eU:c  [o        S5      eWDb  [        WCUUWDUUS9$ [o        5       e GNT GND GN GN GN GNQ GN GN GNi GNB GN	 GN GN GNQ! [n         aZ  n9['        U9[        R                  5      (       a  U9e[Z        R\                  " SMR                  [)        U95      5      5         S n9A9GN/S n9A9ff = f GN! [n         a    [        R\                  " SO5        S n: GN?f = f GNk! [n         a!  n9[        R\                  " U95         S n9A9GNS n9A9ff = f! [n         a    Sn@ GNf = f! [n         a$    [        SRSSR                  [        U
5      5      1SF9ef = f G
N G
N; G
N! [n         a+    [        R                  " S_R                  U5      5        S n: G	Nf = f GN GN GNX! [n         a;  n9[        R\                  " ShR                  [)        U95      5      5        S nC S n9A9GNS n9A9ff = f GN] GN GN GNZ GN GN GN` GN4! [n         Ga  n9G[U        U UR%                  SS5      S9nZ[Z        GRV                  " SR                  [)        U95      UZ5      SUZ0S9  [9        UUS9n[[!        U S9I S h  vN  n[        R                  " UGRY                  UU9W[G[$        GRZ                  US95        ['        U9[        R                  5      (       a(  G[#        U9GR\                  G[$        GR^                  S SrS9e['        U9[        5      (       a]  G[#        G[Q        U9SS[)        U95       S35      G[$        GRZ                  G[Q        U9SS5      G[Q        U9S[        GR`                  5      S9e['        U9G["        5      (       a  U9eG[#        S[)        U95      -   G[$        GRZ                  G[Q        U9SS5      [        GR`                  S9eS n9A9ff = f7f)Nr   )general_settingsjwt_handlerlitellm_proxy_admin_namellm_model_list
llm_router
master_keymodel_max_budget_limiteropen_telemetry_loggerprisma_clientproxy_logging_objuser_api_key_cacheuser_custom_auth)rK   )rL   rK   r5   pass_through_endpointsr1   pathr-   rq   litellm_user_api_key)keylitellm_key_header_name)rK   custom_litellm_key_header_namezReceived Proxy Server Request)rq   )r'   
start_timecontextrk   )current_route	user_role)r5   Fenable_oauth2_authT)premium_userz;Oauth2 token validation is only available for premium users)tokenenable_oauth2_proxy_authenable_jwt_authz(JWT Auth is an enterprise only feature. z
is_jwt: %s)scopes)r   
user_routelitellm_proxy_roles)r   parent_otel_span)rI   z.Admin not allowed to access this route. Route=z, Allowed Routes=)r   default_valuez4No team id passed in. Field checked in jwt token - ''z-Team not allowed to access this route. Route=)team_idr   r   r   r   )org_idr   r   r   r   )
user_email)valid_user_email)user_idr   r   user_id_upsertr   r   )end_user_idr   r   r   r   z{}:spendz;SELECT SUM(spend) as total_spend FROM "MonthlyGlobalSpend";)querytotal_spend)r   rE   r   )r   
max_budgetspendr   proxy_budget)r]   	user_info)request_bodyteam_objectuser_objectend_user_objectr~   global_proxy_spendr5   r   )
r*   r   team_tpm_limitteam_rpm_limitteam_modelsr   r   r   r   r   authcustom_auth_parserlangfuser.   zutf-8:)r*   r   r   zNo api key passed in.zIMalformed API Key passed in. Ensure Key has `Bearer ` prefix. Passed in: z
/user/authallow_user_authz)'allow_user_auth' not set or set to Falserh   userr   allowed_model_regionend_user_tpm_limitend_user_rpm_limitend_user_max_budgetz%Unable to find user in db. Error - {})hashed_tokenr   r   r   r   check_cache_onlyzapi key not found in cache.)r   r   r   r   r   r   team_i  z2Master key must be a valid string. Current type={}r   )r6   r   r*   r   valid_token_dictr5   r   )r   user_api_key_objr   r   zTried to access route=z, which is only for MASTER KEYzsk-zHLiteLLM Virtual Key expected. Received={}, expected to start with 'sk-'.zQlitellm.proxy.proxy_server.user_api_key_auth(): Warning - Key={} is not a string.zNo connected db.)rx   )r   r   r   r   r   zlitellm.proxy.auth.user_api_key_auth.py::user_api_key_auth() - Unable to find token={} in cache or `LiteLLM_VerificationTokenTable`. Defaulting 'valid_token' to None'z:Key is blocked. Update via `/key/unblock` if you're admin.team_model_aliases
model_listz
 new llm router model list zall-team-modelsr`   	fallbacks)r`   r   rM   r   zlitellm.proxy.auth.user_api_key_auth.py::user_api_key_auth() - Unable to get user from db/cache. Setting user_obj to None. Exception received - {}_)r   r   litellm_budget_table)whereinclude)current_costr   )tzinfoz'Checking if token expired, expiry time z and current time z4Authentication Error - Expired Key. Key Expiry time i  )messager]   rg   param)r   r   r   r   r   r   	key_aliastoken_budget)user_api_key_dictr`   
team_spendteam_max_budget)r   r   r   r   r   
team_aliasteam_budget)r   r   r   	tpm_limit	rpm_limitblockedmodelsmetadata)rM   rL   )r   r   r   r   r   i  zInvalid API key)rj   z$Invalid API key, no token associated)exclude_noner   zlitellm-dashboardrW   rX   )r5   rV   r6   rK   rL   r*   rM   zInvalid route for UI tokenz!Invalid proxy server token passed)r6   r*   r   r   r5   r   use_x_forwarded_for)rK   r   z^litellm.proxy.proxy_server.user_api_key_auth(): Exception occured - {}
Requester IP Address:{}requester_ip)extra)r   r*   )rL   original_exceptionr   
error_typer5   )r   r]   r   rg   rj   zAuthentication Error()r   Noneri   zAuthentication Error, )litellm.proxy.proxy_serverr~   r   r   r   r   r   r   r   r   r   r   r   r   nowr   r$   r   ro   rF   rG   r3   rq   get_api_key_from_custom_headertracer
start_spanr%   get_traceparent_from_headerUserAPIKeyAuthmodel_validaterC   public_routesrE   r   LitellmUserRolesINTERNAL_USER_VIEW_ONLYr   r   r   
ValueErrorCommonProxyErrorsnot_premium_userr    r!   is_jwtr   debugauth_jwt
get_scopesis_adminr   PROXY_ADMINlitellm_jwtauthadmin_allowed_routesr   rR   get_team_idis_required_team_idteam_id_jwt_fieldTEAMteam_allowed_routesr   
get_org_idr   is_enforced_email_domainget_user_emailis_allowed_domainget_user_idr   is_upsert_user_idget_end_user_idr   litellmr   async_get_cacheformatdb	query_rawasync_set_cacheCallInfoasynciocreate_taskbudget_alertsr   r   r   r   r   INTERNAL_USERmapped_pass_through_routesr/   dictbase64r0   ru   	b64decodedecodesplitr   r	   HTTP_403_FORBIDDENr   r   BudgetExceededErrorr   
hash_tokenr   r   r   r   r   r   last_refreshed_at__dict__items
__fields__setattrsecretscompare_digestr]   _return_user_api_key_auth_objr   master_key_only_routeswarningr   infor   hasattrr   aliasesmodel_alias_mapconfigrt   listr   r   team_member_spendlitellm_teammembership
find_firstexpiresr   utcfromisoformatr   	utcoffsetProxyExceptionProxyErrorTypesexpired_keyr   r   r   r   model_max_budgetis_key_within_model_budgetr   r   r   LiteLLM_TeamTabler   r   team_blockedr   team_metadatar#   	set_cache
model_dumppopupdategetattrrZ   r   rw   post_call_failure_hook
auth_errorr   budget_exceededHTTP_401_UNAUTHORIZED)\rK   r*   rz   r{   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   rL   r   passed_in_keyendpointrq   
header_keyr   responser   r   jwt_valid_tokenr   r   
is_allowedrI   actual_routesr   r   r   r   r   r   r   r   r   r   r   	sql_queryr   is_mapped_pass_through_routemapped_router  decoded_bytesdecoded_str_end_user_objectend_user_paramsbudget_inforx   rM   team_objteam_obj_dictkv
field_nameis_master_key_valid_user_api_key_objrP   r6   r   _model_alias_mapr`   r'  r   new_model_listfallback_modelsm
_cache_keyteam_member_info_user_id_team_idteam_member_budgetcurrent_timeexpiry_time	call_infomax_budget_per_modelcurrent_model	_team_obj
token_teamrV   _is_route_allowedr   r   s\                                                                                               r2   rv   rv      sd        (,J"73Ea
/@@%%
 	
 	

 8H7K7K$d8
 (,gs###M'8G,c22*G0#66.G7==5G#/2<<+u4.6ll9d.KG**1++6Lb*Q
"??..:.>J&-oo&9&9j&9&IG 3 *:)=)=>W)X&)54/MG
 !,4;;FF4!*--II#OO J   G   '-gOOH!00::	 ]00666/eD ",<,T,TUU+%8=EJeS%.FF   4e<D @4' Q'88>>? 
 ,'::: :EBdJ4WEEE 159TA?4' >?P?a?a?g?g>hi  !''g'6F &&|V<.9.B.B.B.Q(Q$//o/F '//v/>!5"2">">#(,7,G,G"J
 "-&6&B&B-=   (77LL ' ):(X'LUGSderdst 
 &11) 2  ?{'F'F'HD'P#N{OjOjO|O|N}}~  <@&!5"2"7"7#(,7,G,G"J
 "U*)4)D)D)X)X(9(X'KE7Rcdqcrs 
 )8 '&3+=)9*;) #K %//) 0  %,%&3+=)9*; A 48 ,0
7799 "-!;!;-T "< "J ")+0(+6+H+H'1 ,I ,(
 #%11) 2  &(7 '&3+='2'D'D-= (E ( *:*;	) 	#K #')99) :  *,?$/&3+=)9*;- 'O &*"%%)/A/Q/Q&--.FG 0R 0 *& *1m6O$e	)6)9)9)C)C))C)T#T-5a[-G*0@@ * 1 12J K"4 A    *5$,$<'.'9'9"4"1'":	%	  ++-;;%3*3 <  "!- + +$3%5'9)	 & 3>3JK//PT1<1H--d 2=1H--d6A6M 2 2SU.<<#!%5 + $ .3$)DDJJL--/3, K (""#9:F!//--.DEK!-2h--(,,vr2Je2S||F+47-// !%9:F$LL)=>*L &")//(B"?"E"E"G(.(8(8(A&3&:&:7&C"-"3"3C"8";"*,,y$"?".)05KR)PJ *7??D A A$+OO$7$7J$7$G$S*1//*=*=**=*M; 3< '3''%#.::%5  &.::%5  _344][\i[jk  L ##$5u=E%''# & 9 9F   \!$*621<. *= +"/'9%5&7* $  $/(== $$:; (<<H&6&K&K&00< + 5 5 ,,@A '00< + 5 5 ,,@A '11= + 6 6 ,,AB 	 .'0+#5!1"3!%! K #;77%%)9)E)EE '6&9&9-&HK#-<-@-@AU-VK*-<-@-@AU-VK*/>/B/B&0K, ,<K( #;77##/=L'//"/'9%5&7%)> 8 ..:#55A 22[5R5RR$,$5$5M - 3 3 51',QC[
%)?)??#KQ? !6	(")"8"8"M

	j#....  =*66"!1"%"7" %! $'
3!2#5"3	   %$ M88>>>(/MN 
 S
 
 %%  Y``  ""cjj !H./  
 
e$$ w/G#$2!("/'9%5&7%  +:*=*=m*L'1@1D1D(2. 2A1D1D(2. 4C3F3F*40 15!#" ""d*P 
  "#'E%9::22>$!))$!44$ 
 $;k&9&9#: &6G# ''F|#ZZb9
!+$**3N3CD K&&'1,;--t44%););; $(($77C7G7G8 $,#'5$/#-	   #.,0"#+9(3'1	   - "".$%4 + 3 3&3+=',)9*;&  H" ,,8 ,$/$7$7#8+:M:M9N!OJ-?-O-O& .P . ($ (/#.#6#6#.#6#6#/H4H5B5E5E5\5\5g5g/7/7'" *@(F 6h 6 0, #5"D"D$.&6 #E #   )4,AAM -AALL + .9>PST>T*<<?QQ&-&A&A1<1N1N/A'" !" "".'||HLL9&44[5H5HI&&."))33K@H"-"5"5X\\"5"JK$**=k]J\]i\jk -("VWbVccu  wC  vD  !E,88 %	    ,1G1G1S "
'!)!4!4J$%++%++*55'//'//))33	 ##%33+"+ 4  $$(>(>>!55%0%6%6#.#9#9  $/#?#? (,,Wd;M %03T::,-1!-!-%%1 /II&1' J    \22**6K):;;//;$%++%00*::'//'//*55	 ##%33*"+ 4  ))[-H-HH!55%0%;%;#.#>#>  "".9J'//*::%00)88)88'44&22(66	:	 !	 )')  
 ((''y )  "&""Q&=+D ,>+M+M"))*BC ,N , &" &- aI%2%5%5%?%?i%?%PPH)1!])C&,<<&--.FG0 =   
 &1 ()//0#*#5#5 8 + 3 3!I '')77!/&/ 8  )%$ 0!1#5%	A "#C0ABB  (#C0VWW!''G !!(%0'9&7	  +5545H  $/+ ''8
 [)T:
 %*8K*K  	
 .!%#
 !,HII?@@'0!!1!1%  +Y A	
\ PR ; F )Rl#D	#"'* $Ux$2  a!<!<==G$**;BB3q6J   	  !>?K	68(  $$   	("'	(  	HOOZ( 	.F(  ### }  D  D
 ##L  ! $"(( m  t  tF
  $H$(0v`&  Qn  2
. 0 4 45JE R
 	&&mttA "<0	
 +-
 0@@@44)#$"3*55 5 	
 a4455 		$44	  a'' 8/DSVHA-NO$//a&1Qv/K/KL	  >**G,s1v5 ++!Wf---	
 	
[2
s'  =Ae A]< AV A]< AV# BA]< A]< *A]< BA]< AV&A]< $Ae%AA]< (Ae)0A]< AeAA]< ,AV)-A]< 0Ae1!A]< AV,A]< AeBA]< AV/A*A]< 	Ae
C&A]< 0AV21'A]< AV5A6A]< AV8)A]< 9AV;:;A]< 5AV>6(A]< AW.A]< AWB3A]< Ae3A]< 9A*A]< 'A]< ?A]< AeBA]< :/A]< .A]< AA]< AeA]< 1Ae2AA]< 8Ae9"A]< AW
 6AW7BAW
 ;AX4 AX1AX4 BA]< 0Ae1%A]< AY  2AY3A-AY  $AY  6AZ AZ! $AA]< 'A[(A]< -Ae.B,A]< A[A]< Ae$A]< A[ A[AA[ 1D?A]< 0A\1A]< A\A]< %A\ A\A\ AA]< A]$AA]< A]'A]< 4A]*5JA]< HA]-HFA]< NA]0NAA]< O0A]3O1%A]< PA]6P.A]< QA]9QEA]< VAeVA]< V#A]< V&A]< V)A]< V,A]< V/A]< V2A]< V5A]< V8A]< V;A]< V>A]< WA]< WA]< WAW
 W

AX.WAAX)X#A]< X)AX.X.A]< X1AX4 X4"AYYA]< YAYYA]< YAY  Y 
AZY*AZZ A]< ZAZZA]< ZAZZA]< ZAZZA]< Z!.A[[A]< [A]< [A[ [1A\\A]< \A\\A]< \A]< \A\ \
A]!\&0A]]A]< ]A]!]!A]< ]'A]< ]*A]< ]-A]< ]0A]< ]3A]< ]6A]< ]9A]< ]<Ae^A"Ad<_)A_,_*EAd<d<AeeAer   r   r   r   c           	         [         R                  " 5       n[        R                  [        R
                  UUUUR                  5       UR                  5       -
  US9  U=(       d     [        U S9=(       d    [        R                  nUUUS.UEn	U b$  U	R                  U R                  U R                  S9  U b6  [        U S9(       a(  U	R                  [        R                  S9  [        S0 U	D6$ [        S0 U	D6$ )N)service	call_typer   end_timedurationr   rO   )r*   r   r   )user_tpm_limituser_rpm_limitr    )r   r   user_api_key_service_logger_objservice_success_hookr&   AUTH	timestamprQ   r   r  r;  r   r   rS   r   r   )
r6   r*   r   r   r5   r   r   rk  retrieved_user_roleuser_api_key_kwargss
             r2   r   r     s    ||~H#88!!##%
(<(<(>>) 9  	X^X6X:J:X:X 
 ,( 	 ""#--#-- 	# 	
  4h G""&22 	# 	
 4 3444 344r4   c                     U c  gU R                   b)  U R                   [        R                  R                  :X  a  gU R                   b)  U R                   [        R                  R                  :X  a  gg)NFT)r   r   r   rE   rO   s    r2   rS   rS     sf     	&"2">">"D"DD 	&"2">">"D"DDr4   c                     U c  g U nUR                   n [        U5      nU$ ! [         a    [        R                  s $ f = fr:   )r   r   r   r  )r6   _userrP   roles       r2   rQ   rQ     sN     EJ.
+ K  .---.s   ! >>r   c                    SnUR                  5       nU R                  R                  5        VVs0 s H  u  p4UR                  5       U_M     nnn[        R                  " SUU5        UR                  U5      nU(       a0  [        US9n[        R                  " SR                  X5      5        U$ [        R                  " SU S35        U$ s  snnf )z
Get API key from custom header

Args:
    request (Request): Request object
    custom_litellm_key_header_name (str): Custom header name

Returns:
    Optional[str]: API key
r-   z?searching for custom_litellm_key_header_name= %s, in headers=%sr1   z9Found custom API key using header: {}, setting api_key={}z/No LiteLLM Virtual Key pass. Please set header=z: Bearer <api_key>)	lowerrq   r  r   r   ro   r3   r  rw   )rK   r   r*   rR  rS  _headerscustom_api_keys          r2   r   r   '  s     G%C%I%I%K")0)>)>)@A)@	1)@HAI&
 \\"@AN#N;""GNN.	
 N 	&&=>\=]]op	
 N% Bs   Cr:   )T__doc__r  r  r   r   typingr   fastapir   r   r   r	   fastapi.security.api_keyr
   r  litellm._loggingr   r   litellm._service_loggerr   litellm.proxy._typeslitellm.proxy.auth.auth_checksr   r   r   r   r   r   r   r   r   r   r   litellm.proxy.auth.auth_utilsr   r   r   r   r   r   litellm.proxy.auth.oauth2_checkr    $litellm.proxy.auth.oauth2_proxy_hookr!   litellm.proxy.auth.route_checksr"   )litellm.proxy.auth.service_account_checksr#   -litellm.proxy.common_utils.http_parsing_utilsr$   litellm.proxy.utilsr%   litellm.types.servicesr&   rp  SpecialHeadersopenai_authorizationrE   api_key_headerazure_authorizationrz   anthropic_authorizationr{   google_ai_studio_authorizationr|   rG   r3   LiteLLM_UserTableboolrJ   r  r   rU   LiteralrZ   ry   Securityrv   Spanr   r   rS   rQ   r   ro  r4   r2   <module>r     s>     '   = = 1  A 2 "     ? L 7 L L & /"0"2  		,	,	2	2
 $		+	+	1	1u 
 (		/	/	5	5+ 
 #/		6	6	<	<2#   -1() 
> -1  	
 .) () 
H -1

$
 
 	

 
 .)
 ()
 

2+< +<` ##N3 ' 0 01E F.5.>.> / 6=5E5E'6~
~
~
 ~
 'sm	~
 &.c]~
 ~
P  -1'5()'5'5 tn'5 	'5
 '5 '5 ()'5 '5T8,=#> &()"""69""r4   