
    h$                     ~   U d Z ddlZddlZddlmZmZ ddlmZmZmZm	Z	 ddl
Z
ddl
mZmZmZmZ ddlm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 ddl ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z>m?Z? ddl@mAZA ddlBmCZC 	 ddlDmEZF eFZEeeG   eHd<    e       ZL eeMj                  j                  dd      ZP eeMj                  j                  dd      ZR eeMj                  j                  dd      ZT eeMj                  j                  dd      ZV eeMj                  j                  dd      ZX eeMj                  j                  dd      ZZd e[d!e[fd"Z\d e[fd#Z]d$efd%Z^d&e_d'e`d!e_fd(Zad)e[d*ed+ee>   d,e[d-e?d!eeb   fd.Zcd/e5d0ee[   d!e[fd1Zdd2ee[   d e[d3ee[   d4ee[   d5ee[   d6ee[   d7eee`      d8e[d9ed!ee[ee[   f   fd:Zed9ed8e[d7eee`      d e[d!efe_e[f   f
d;Zg	 dId9ed e[d3e[d4ee[   d5ee[   d6ee[   d<e`d2ee[   d!e_fd=Zh ej                          e
j                  eR       e
j                  eT       e
j                  eV       e
j                  eX       e
j                  eZ       e
j                  eP      fd9ed e[d3e[d4ee[   d5ee[   d6ee[   d2ee[   d!e_fd>       Zk	 dId?eel   d e[d@eem   dAe`d8e[dBedCeen   d!e_fdDZod9edEe[d!e[fdFZpd&e_fdGZqd&e_d!e_fdHZry# eI$ r"ZJ ej                  deJ        dZEY dZJ[JidZJ[Jww xY w)Jz
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)ListOptionalTuplecast)HTTPExceptionRequest	WebSocketstatus)APIKeyHeader)verbose_loggerverbose_proxy_logger)ServiceLogging)	DualCache)tracer)*)ExperimentalUIJWTToken_cache_key_object_get_user_role_is_user_proxy_admin_virtual_key_max_budget_check_virtual_key_soft_budget_checkcan_key_call_modelcommon_checksget_end_user_objectget_key_objectget_team_objectget_user_objectis_valid_fallback_model)UserAPIKeyAuthExceptionHandler)abbreviate_api_key!get_end_user_id_from_request_bodyget_model_from_requestget_request_routepre_db_read_auth_checks route_in_additonal_public_routes)JWTAuthManager
JWTHandler)check_oauth2_token)handle_oauth2_proxy_request)_read_request_body_safe_get_request_headers)PrismaClientProxyLogging)get_secret_bool)ServiceTypes)enterprise_custom_authr2   z!Error in enterprise custom auth: Fz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.z8The default name of the subscription key header of Azureapi_keyreturnc                     | j                  d      r| j                  dd      } | S | j                  d      r| j                  dd      } | S | j                  d      r| j                  dd      } | S NBearer  Basic zbearer 
startswithreplacer6   s    `/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/auth/user_api_key_auth.py%_get_bearer_token_or_received_api_keyrB   h   ss    )$//)R0 N 
		H	%//(B/ N 
		I	&//)R0N    c                     | j                  d      r| j                  dd      } | S | j                  d      r| j                  dd      } | S | j                  d      r| j                  dd      } | S d} | S r9   r=   r@   s    rA   _get_bearer_tokenrE   s   s     )$//)R0 N 
		H	%//(B/
 N	 
		I	&//)R0 N NrC   	websocketc           
        	K   t        d| j                  j                         D cg c]3  \  }}|j                         j	                         |j	                         f5 c}}d      }| j
                  |_        | j                  }|j                  d      		fd}||_	        | j                  j                  d      }|sR| j                  j                  d      }|s| j                  t        j                         d {    t        d	d
      |j                  d      s5| j                  t        j                         d {    t        d	d      |t        d      d  j!                         }	 t#        |d|        d {   S c c}}w 7 7 N7 # t$        $ rY}t'        j(                  |       | j                  t        j                         d {  7   t        d	t+        |            d }~ww xY ww)Nhttp)typeheaders)scopemodelc                  8   K   d d} | j                         S w)Nz{"model": "z"})encode)return_stringrL   s    rA   return_bodyz0user_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requestr6   )r
   rJ   itemslowerrN   url_urlquery_paramsgetbodycloser   WS_1008_POLICY_VIOLATIONr	   r>   lenstripuser_api_key_auth	Exceptionr   	exceptionstr)
rF   kvrW   r\   rP   rQ   r6   erL   s
            @rA   user_api_key_auth_websocketrj      s     =F=N=N=T=T=V59Q!!#QXXZ0
G ==GL))LW%E&
 GL%%))/:M##''	2//v'F'F/GGGC8MNN ''	2//v'F'F/GGG(M   I 01779<&w''@STTTO0 H
 H U <&&q)oo6#B#BoCCCCF;;<sr   $G?8FB"G?FAG?F-G?6F 	F
F G?G?F 	G<#8G7GG77G<<G?valid_tokenend_user_paramsc                     |j                  d      | _        |j                  d      | _        |j                  d      | _        |j                  d      | _        | S )Nend_user_idend_user_tpm_limitend_user_rpm_limitallowed_model_region)r]   rn   ro   rp   rq   rk   rl   s     rA   'update_valid_token_with_end_user_paramsrs      sY     .11-@K%4%8%89M%NK"%4%8%89M%NK"'6':':;Q'RK$rC   litellm_proxy_admin_nameuser_api_key_cacheprisma_clienttokenproxy_logging_objc                   K   d }t         j                  dkD  r|j                  dj                  |              d {   }|Z|Xd}|j                  j                  |       d {   }|d   d   }|j                  dj                  |       |       d {    |Rt        | t         j                  ||t        j                        }t        j                  |j                  d	|
             |S 7 7 7 ^w)Nr   {}:spendkey;SELECT SUM(spend) as total_spend FROM "MonthlyGlobalSpend";querytotal_spendr|   value)user_id
max_budgetspendrw   event_groupproxy_budgetrI   	user_info)litellmr   async_get_cacheformatdb	query_rawasync_set_cacheCallInfoLitellm_EntityTypePROXYasynciocreate_taskbudget_alerts)	rt   ru   rv   rw   rx   global_proxy_spend	sql_queryresponser   s	            rA   get_global_proxy_spendr      s+     A#5#E#E!!":; $F $
 
 %-*C R  +--77i7HHH!)!]!;$44%%&>?( 5    ) 0"--(.44I !//'' 0  ?
 Is4   :C9C3)C9&C5'1C9C7AC95C97C9jwt_handlerscopesc                 j    | j                  |      }|rt        j                  S t        j                  S )N)r   )is_adminLitellmUserRolesPROXY_ADMINTEAM)r   r   r   s      rA   get_rbac_roler      s0    ##6#2H+++$$$rC   custom_litellm_key_headerazure_api_key_headeranthropic_api_key_headergoogle_ai_studio_api_key_headerazure_apim_headerpass_through_endpointsrouterW   c	                 Z   |}d}	t        | t              r| }	t        |       }||	fS t        |t              r|}	t        |      }||	fS t        |t              r|}	|}||	fS t        |t              r|}	|}||	fS t        |t              r|}	|}||	fS t        |t              r|}	|}||	fS ||D ]z  }
|
j	                  dd      |k(  s|
j	                  dd      }|.|j	                  dd      }|j
                  j	                  |      ]|j
                  j	                  |      }|}	| ||	fS )zj
    Returns:
        Tuple[Optional[str], Optional[str]]: Tuple of the api_key and the passed_in_key
    Nr@   pathr;   rJ   litellm_user_api_keyr{   )
isinstancerf   rB   rE   r]   rJ   )r   r6   r   r   r   r   r   r   rW   passed_in_keyendpointrJ   
header_keys                rA   get_api_keyr      s{    G#'M+S1178QR2 M!!1 
GS	!#G4, M!!+ 
(#	.,&& M!!% 
,c	20*  M!! 
3S	971 M!! 
%s	+)# M!! 
 	+.H||FB'50*2,,y$*G&&-kk2H"&MJ**z*:F")//"5"5*"5"E(/ / M!!rC   c                   K   d}t         j                  j                  D ]  }|j                  |      sd} |r:| j                  j                  d      | j                  j                  d      xs d}|M|D ]G  }t        |t              s|j                  dd      |k(  s+|j                  d      durt               c S |j                  d      p|j                  d      dk(  r\	 d	d l	}|j                  d
d      j                         }|j                  |      }|j                  d      }	|	j                  d      d	   }|j                  dd       }
|
|
j                  dd      }t        | j                  t              s| j                  j                  |      ,| j                  j                  |      }J |S w)NFTr   r;   r   authcustom_auth_parserlangfuser   r<   zutf-8:rJ   r{   )LiteLLMRoutesmapped_pass_through_routesr   r>   rJ   r]   r   dictUserAPIKeyAuthbase64r?   rb   	b64decodedecodesplit)rW   r   r   r6   is_mapped_pass_through_routemapped_router   r   decoded_bytesdecoded_strrJ   r   s               rA   :check_api_key_for_custom_headers_or_pass_through_endpointsr   "  s     */ %@@FFL)+/( G $??56Boo))*@AGRG).H(D)hll62.F%.O<<'t3)++ LL!56B %9:jH "%ooh;AACG$*$4$4W$=M"/"6"6w"?K)//4Q7G&ll9d;G*%,[[1G%L
&w= ' 3 3
 3 C O&-oo&9&9j&9&IG; /< Ns*   1GAGG$B4G,GG%!Grequest_datac                 p"  K   ddl m}m}	m}
m}m}m}m}m}m	}m
}m}m} d }t        j                         }t        |       }d }d}	 t!        || |       d {    |j#                  dd       }d }t%        ||||||||| 	      \  }}|j#                  d      }|t'        | |	      }|&|j)                  |t+        | j,                        
      }t.        Tt/        | ||       d {   }|%t1        |t2              rt2        j5                  |      S |>t1        |t6              r.|}d}n)|' || |       d {   }t2        j5                  |      S 	 |t8        j:                  j<                  v st?        |      rt3        t@        jB                        S |j#                  dd      du rDddl m"} |dur&tG        dtH        jJ                  j<                  z         tM        |       d {   S |j#                  dd      du rtO        |        d {   S |j#                  dd      du rddl m"} |dur&tG        dtH        jJ                  j<                         |	jQ                  |      }tS        jT                  d|       |r&tW        jX                  ||||	|||||	       d {   }|d   } |d   }!|d   }"|d   }#|d   }$|d   }%|d   }&|d    }'|d!   }(t[        |
|||(|"       d {   })| rt3        t@        j\                  |#      S t3        d |!|"|"j^                  nd |"|"j`                  nd |"|"jb                  ng |$!|$jd                  tA        |$jd                        nt@        jf                  |#|'||%$
      }ti        | ||"|$|&||)||||%       d {   }*tk        t2        |      S |s<tm        | |||&       d {   }t1        |t6              r|}nt1        |t2              r|S |Gt1        |t6              rt3        |t@        j\                  |'      S t3        t@        j\                  |#      S |to        d(      |d)k(  rto        d*|       |d+k(  r9|j#                  d,d      du r
t3               S tq        tr        jt                  d-.      d }+i },tw        |ty        |             }%|%r	 |%|,d<   t{        |%||||/       d {   }+|+x|+j|                  |,d0<   |+j~                  ]|+j~                  }-|-j^                  |-j^                  |,d1<   |-j`                  |-j`                  |,d2<   |-j                  |-j                  |,d3<   	 t        t        |      ||||d5       d {   }| t        d7      rt        j                  |      }|Ct1        |t2              r3|jd                  t@        j\                  k(  rt        ||,8      }||_K        |S |t1        |t2              r|j                  	 t        |j                  ||||d9       d {   }/|/j                  j|j                  ^|/j                  |j                  kD  rE|/j                  }0|0j                         D ]&  \  }1}2d:|1 }3|3|j                  v st        ||3|2       ( 	 t        j                  ||      }4	 t1        |t6              sJ 	 |4rht        d t@        j\                  ||i |,d|
i||=       d {   }5t        j                  t        t        |      |5||>             t        |5|,8      }5|5S |t8        j                  j<                  v rto        d?| d@      |t        dAt        j                  dBd C      d }6|t1        |t6              r'|j                  dD      sGJ dEj                  |             t        j                  dFj                  |t        |      ndG             t        |H      }7|j                  dD      rt        |      }	 t        |||||I       d {   }|,j#                  d      |_c        |,j#                  d1      |_d        |,j#                  d2      |_e        |,j#                  d0      |_>        t        |      }d }8i }9|w|j                  du rto        dM      |j                  }:|:i k7  r-|:j#                  dNg       };|;}<tS        jT                  dO|<        nt1        |jb                  t              rdP|jb                  v rnt        ||      }=tk        t        t        t              |j#                  dQd             }>|=t        |=|||R       d {    |>^|>D ]Y  }?t        t1        |?t*              r|?dS   n|?|||R       d {    t        t1        |?t*              r|?dS   n|?|d T       d {    [ |j                  $	 t        |j                  ||d||U       d {   }8|j                   ||j                   dW|j                   }@|j                  |@X       d {   }A|Al|j                  }B|j                  }C|BRCP|j                  j                  j                  BCdYdZdi[       d {   }A|j                  @|Ad\]       d {    AYAj~                  MAj~                  j                  }D|D5DdkD  r0|j                  DkD  r!t        j                  |j                  D^      |j                  t        j                  t        j                        }Et1        |j                  t              r|j                  }Fnt        j                  |j                        }FFj                  Fj                  j                  |F       Fj                  t        j                  _      }FtS        jT                  d`F daE        |F|Ek  r#t        dbF daE t        j                  dB|C      |t8        j                   j<                  v rt        |||8c       d {    t        ||d       d {    |j                  }G|j#                  dSd       }H|GLt1        Gt*              r<t	        G      dkD  r-|+H)|j
                  |j                  |He       d {    |j                  lt        |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  f      }Ind }I|j                  |j                  Ig       d })t        j                  dkD  r||j                  dhj                  |
      X       d {   })|)Ydi}J|j                  j!                  |Jj       d {   }|d   dk   })|j                  dhj                  |
      |)g       d {    |)lt#        |j
                  |)t        j                  |
|j                  t$        j&                  l      }Kt        j                  |j)                  dm|Kn             ti        | |I|8|+||)||||%       d {   }*|tq        dJdop      |j
                  tq        dJdqp      |j
                  }t        j                  t        ||||>             |j+                  dr      }9|9j-                  d!d        |+|9j/                  |,       |to        ds      |9t        |8|||9||t       d {   S y 7 7 :7 7 >7 7 7 D7 7 v7 
t# tn        $ rT}.t1        |.t        j                        r|.tS        jT                  d4j                  t7        |.                   Y d }.~.
Pd }.~.ww xY w7 
:# tn        $ r t        jT                  d6       d }Y 
[w xY w7 	# tn        $ r }.t        jT                  |.       Y d }.~.	gd }.~.ww xY w# tn        $ r d}4Y 	fw xY w# tn        $ r' tq        d;d<j                  t        |            h.      w xY w7 	^7 .# t        $ r<}.|.j                  dJk(  s|.j                  dKk(  rdLj                  |7|      |._b        |.d }.~.ww xY w7 <7 7 7 # tn        $ r:}.t        jT                  dVj                  t7        |.                   d }8Y d }.~.d }.~.ww xY w7 7 k7 R7 7 7 J7 u7 O7  7 7 # tn        $ r0}.t1        j2                  |.| ||||u       d {  7  cY d }.~.S d }.~.ww xY ww)vNr   )general_settingsr   rt   llm_model_list
llm_router
master_keymodel_max_budget_limiteropen_telemetry_loggerrv   rx   ru   user_custom_authrW   F)r   rW   r   r   )	r   r6   r   r   r   r   r   r   rW   litellm_key_header_name)rW   custom_litellm_key_header_name)
start_timerJ   )rW   r6   r   TrV   )current_route	user_roleenable_oauth2_auth)premium_userz;Oauth2 token validation is only available for premium users)rw   enable_oauth2_proxy_authenable_jwt_authz(JWT Auth is an enterprise only feature. z
is_jwt: %s)	r   r   r6   r   r   rv   ru   rx   parent_otel_spanis_proxy_adminteam_idteam_objectr   user_objectrn   end_user_objectorg_idrw   )rt   ru   rv   rw   rx   )r   r   )
r6   r   team_tpm_limitteam_rpm_limitteam_modelsr   r   r   r   rn   )rW   request_bodyr   r   r   r   r   r   r   rx   rk   )rW   r   r   r6   )r6   r   r   zNo api key passed in.r;   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 FalserS   )rn   rv   ru   r   rx   rq   ro   rp   end_user_max_budgetz%Unable to find user in db. Error - {})hashed_tokenrv   ru   r   rx   check_cache_onlyzapi key not found in cache.EXPERIMENTAL_UI_LOGINrr   )r   rv   ru   r   rx   r   team_i  z2Master key must be a valid string. Current type={})user_objr   r6   r   valid_token_dictr   r   )r   user_api_key_objru   rx   zTried to access route=z, which is only for MASTER KEYzNo connected db.i  )messagerI   rR   paramzsk-zHLiteLLM Virtual Key expected. Received={}, expected to start with 'sk-'.zZlitellm.proxy.proxy_server.user_api_key_auth(): Warning - Key is not a string. Got type={}Noner@   )r   rv   ru   r   rx   i  401zAuthentication Error, Invalid proxy server token passed. Received API Key = {}, Key Hash (Token) ={}. Unable to find token in cache or `LiteLLM_VerificationTokenTable`z:Key is blocked. Update via `/key/unblock` if you're admin.
model_listz
 new llm router model list zall-team-models	fallbacks)rL   r   rk   r   rL   )rL   r   
user_model)r   rv   ru   user_id_upsertr   rx   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   r   litellm_budget_table)whereinclude   )r|   r   ttl)current_costr   )tzinfoz'Checking if token expired, expiry time z and current time z4Authentication Error - Expired Key. Key Expiry time )rk   rx   r   )rk   rx   )user_api_key_dictrL   )r   r   r   	tpm_limit	rpm_limitblockedmodelsmetadatar   rz   r}   r~   r   )rw   r   r   r   r   r   r   r   zInvalid API key)rU   z$Invalid API key, no token associated)exclude_nonez!Invalid proxy server token passed)r   r6   r   r   r   r   )ri   rW   r   r   r   r6   )litellm.proxy.proxy_serverr   r   rt   r   r   r   r   r   rv   rx   ru   r   r   nowr%   r&   r]   r   get_api_key_from_custom_header)create_litellm_proxy_request_started_spanr   rJ   r2   r   r   model_validaterf   r   public_routesr   r'   r   INTERNAL_USER_VIEW_ONLYr   
ValueErrorCommonProxyErrorsnot_premium_userr*   r+   is_jwtr   debugr(   auth_builderr   r   r   r   r   r   INTERNAL_USERr   r   r   rd   r	   r   HTTP_403_FORBIDDENr#   r-   r   rq   r   r   r   BudgetExceededErrorr   r   
hash_tokenr   r0   r   get_key_object_from_ui_hash_keyrs   r   r   r   last_refreshed_at__dict__rX   
__fields__setattrsecretscompare_digestrI   _return_user_api_key_auth_objr   r   r   master_key_only_routesProxyExceptionProxyErrorTypesno_db_connectionr>   warningr"   rR   r   rn   ro   rp   ,_update_key_budget_with_temp_budget_increaser   configlistr$   r   r   ALL_FALLBACK_MODEL_VALUESr   r    r   r   team_member_spendr   r   litellm_teammembership
find_firstr   expiresr   utcfromisoformatr   	utcoffsetr?   expired_keyllm_api_routesr   r   model_max_budgetra   rw   is_key_within_model_budgetLiteLLM_TeamTableteam_max_budget
team_spendr   r   team_blockedr   team_metadata	set_cacher   r   r   r   r   
model_dumppopupdater!   _handle_authentication_error)LrW   r6   r   r   r   r   r   r   r   r   rt   r   r   r   r   r   rv   rx   ru   r   r   r   r   rk   custom_auth_api_keyr   r   r   r   r   r  resultr   r   r   r   r   rn   r   r   rw   r   r   _end_user_objectrl   budget_infori   team_objteam_obj_dictrg   rh   
field_nameis_master_key_valid_user_api_key_obj
_user_roleabbreviated_api_keyr   r   r!  r   new_model_listrL   fallback_modelsm
_cache_keyteam_member_info_user_id_team_idteam_member_budgetcurrent_timeexpiry_timemax_budget_per_modelcurrent_model	_team_objr   	call_infosL                                                                               rA   _user_api_key_auth_builderrR  Q  sa        (,J"73E,0K %f
 &%
 	
 	

 8H7K7K$d8
 (,!,&?!5%=,K/#9
"
 *:)=)=>W)X&)54/MG
 !,%OO) 1 P   "-3CS H #
8^(L%44X>>%*Xs*C"&*#)-gwOOH!00::	 ]00666/eD ",<,T,TUU  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<-::!-%5# +"/'9&7%5
  
 "((8!9 +$]3 +$]3$]3"():";)w+A-E'9"/&7, &" ")"2">">)9 
 - #1<1H--d 2=1H--d6A6M 2 2SU '2{7L7L7X ))>)>?-;;#!%5 +%* (#!- + +$3%5'9)&7 +  NK88 #W'=	 H (C("Hn5'3'%#.::%5  &.::%5  _344][\i[jk  L ##$5u=E%''# & 9 9F   73G<
 #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 ?3J#K0PPK
 #;7%%)9)E)EE B'K ,<K( #;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#... &C*66"!1"%"7" %' ! !!+J!7%6'9&7	 !H-! %$ M88>>>(/MN  ! *$55	  
 )) ]dd  &&pww)0)<W&
 #5W"E!!%($73$2!("/'9%5&7%  '6&9&9-&HK#-<-@-@AU-VK*-<-@-@AU-VK*/>/B/B&0K, GK 15!#" ""d*P  !''F|#ZZb9
!+$**3N3CD ;--t4%););; .|UC"&T";<= $$[$7#
 $,#'5$/#-	   #.,00:1d0C!G*+9(3'1	   60:1d0C!G*'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k118<"-"5"5K"*"8"89L9L"MK&&."))33K@H"-"5"5X\\"5"JK$**=k]J\]i\jk -("VWbVccu  wC  vD  !E,88 %	  44:::3 +&7%   1'"3   $/#?#? (,,Wd;M %03T:,-1!-!-%%1 /II&1' J    "".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$6$<$<!I '')77!/&/ 8  $)%$ 0!1#5%"3' A "#C0ABB  (#C0VWW!''G !!(%0'9&7	  +5545H  $/+ ''8 ?@@'6!!1!1%   (e	
N PH ; F
,&F(f$2  a!<!<=G$**;BB3q6J   	  !>?K	<8(  $$   	("'	(  	HOOZ( 	!J " 66S=AFFeO !J  !Q  !Q+W!AI ~  ! $"(( m  t  tF
  $H$(0\$:&  Q(X  
3PP%-
 
 
 	

s  AAD6AC: |BAC: &| '*AC: AD6&AC: 8|#9AC: AD6AAC: AD6AAC: (|&)AC: ,AD6-#AC: |)AC: AD6BAC: &|,'AAC: +|/, AC: AD6B	AC: |2AC: *AD6+AC: ?|5 (AC: (AD6)-AC: AD6AC: 1AD62AAC: 4AD656AC: ,|; |8A>|; ~ !~"~ &A&AC: AD6AC: , 
A* 6 4 A@ /,AC: A@9=AC: AD6C AC: ;A@? A@<A@? D8AC: AB2AC: >AB
?*AC: )AB*AC: =AB ABAB  ?AC: AC AAC: 1AC2AC: ACFAC: AC"AC: 1AC%2A,AC: AC(CAC: 6AC+7(AC: AC. 1AC: AC1BAC: AC4B9AC: AC7AC: AD6AC:  AC: #AC: &AC: )AC: ,AC: /AC: 2AC: 5AC: 8|; ;	~A	~AC: ~AC: ~  >AC: AC:  	1,&AC: ,11AC: 4A@?AC: @A@@AC: @0A@6@6AC: @<A@? @?	ABA7AA?A?ABBAC: B
AC: BAC: BAB B	ACB/ACCAC: CACCAC: CAC: CAC: C"AC: C%AC: C(AC: C+AC: C.AC: C1AC: C4AC: C7AC: C:	AD3D AD.D#AD&D$AD.D(AD3D)AD6D.AD3D3AD6c           
         K   t        |        d{   }t        |       }t        | |||||||       d{   }	t        |t	        |             }
|
|
|	_        ||	_        |	S 7 R7 -w)zC
    Parent function to authenticate user api key / jwt token.
    r   N)rW   r6   r   r   r   r   r   r   )r,   r%   rR  r#   r-   rn   request_route)rW   r6   r   r   r   r   r   r   r   user_api_key_auth_objrn   s              rA   rc   rc   Y  s     ( ,G<<L"73E"<1!9(G+!";	# 	 4/8K ,7)*/'  - =	s   A)A%&A)A',A)'A)r   r   r   r   r   c                 ,  K   t        j                         }t        j                  t        j                  t        j                  ||||j                         |j                         z
  |             |xs t        |       xs t        j                  }|||d|}	| 2|	j                  | j                  | j                  | j                         | 7t!        |       r+|	j                  t        j"                         t%        di |	S t%        di |	S w)N)service	call_typer   end_timedurationr   )r   )r6   r   r   )user_tpm_limituser_rpm_limit
user_emailr    )r   r  r   r   user_api_key_service_logger_objasync_service_success_hookr1   AUTH	timestampr   r   r  r7  r   r   r]  r   r   r   )
r   r6   r   r   r   r   r   rY  retrieved_user_roleuser_api_key_kwargss
             rA   r  r    s#     ||~H'BB %%!'')J,@,@,BB- 	C 	
	 	X^X6X:J:X:X 
 ,( 	 ""#--#--** 	# 	

  4h G""&22 	# 	
 4 3444 344s   DDr   c                    d}|j                         }| j                  j                         D ci c]  \  }}|j                         | }}}t        j                  d||       |j                  |      }|r3t        |      }t        j                  dj                  ||             |S t        j                  d| d       |S c c}}w )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=%sr@   z9Found custom API key using header: {}, setting api_key={}z/No LiteLLM Virtual Key pass. Please set header=z: Bearer <api_key>)	rY   rJ   rX   r   r  r]   rE   r   re   )rW   r   r6   rg   rh   _headerscustom_api_keys          rA   r  r    s     G%C%I%I%K")0)>)>)@AA	1AHAI&
 \\"@AN#N;""GNN.	
 N 	&&=>\=]]op	
 N% Bs   Cc                     | j                   }d|v r8d|v r4t        j                  |d         }|t        j                         kD  r|d   S y )Ntemp_budget_increasetemp_budget_expiry)r   r   r)  r  )rk   valid_token_metadataexpirys      rA   _get_temp_budget_increaserm    sT    &//"66 $88''(<=Q(RSHLLN"'(>??rC   c                 h    | j                   | S t        |       xs d}| j                   |z   | _         | S )Ng        )r   rm  )rk   ri  s     rA   r   r     s@     %4[AHS(336JJKrC   )N)s__doc__r   r  r   r   typingr   r   r   r   fastapir	   r
   r   r   fastapi.security.api_keyr   r   litellm._loggingr   r   litellm._service_loggerr   litellm.cachingr   %litellm.litellm_core_utils.dd_tracingr   litellm.proxy._typeslitellm.proxy.auth.auth_checksr   r   r   r   r   r   r   r   r   r   r   r   r    )litellm.proxy.auth.auth_exception_handlerr!   litellm.proxy.auth.auth_utilsr"   r#   r$   r%   r&   r'   litellm.proxy.auth.handle_jwtr(   r)   litellm.proxy.auth.oauth2_checkr*   $litellm.proxy.auth.oauth2_proxy_hookr+   -litellm.proxy.common_utils.http_parsing_utilsr,   r-   litellm.proxy.utilsr.   r/   litellm.secret_managers.mainr0   litellm.types.servicesr1   /litellm_enterprise.proxy.auth.user_api_key_authr2   _enterprise_custom_authCallable__annotations__ImportErrorri   r  r_  SpecialHeaderscustom_litellm_api_keyr   r   openai_authorizationapi_key_headerazure_authorizationr   anthropic_authorizationr   google_ai_studio_authorizationr   azure_apim_authorizationr   rf   rB   rE   rj   r   r   rs   floatr   r   r   Unionr   rR  wrapSecurityrc   LiteLLM_UserTableSpanr   r  r  rm  r   r^  rC   rA   <module>r     s/     ' . .  = = 1  A 2 % 8 "    U  E > L ; 8 /" 2IHX.H
 #1"2 (		.	.	4	4 
 		,	,	2	2
 $		+	+	1	1u 
 (		/	/	5	5+ 
 #/		6	6	<	<2# 
 !		0	0	6	6J 3 3 1< 1<h26)!)!) L)) 	)
 $) e_)X%z %49 % %,"'},"," #3-," 'sm	,"
 &.c],"  }," %T$Z0," ," ," 3,"^,,, %T$Z0, 	,
 >3,n 04E
E
E
 E
 'sm	E

 &.c]E
  }E
 E
  (}E
 E
P  $7##N3 0 0 01E F.>g.>.> / 6FW5E5E'6 (8w'7'78I'J/?w/?/?!0)!)!)! )! 'sm	)! &.c])!  })!  (})! )! )!f -1,5(),5,5 tn,5 	,5
 ,5 ,5 (),5 ,5^""69""J	> 	I%  "!B1#FG!"s   >L L<L77L<