
    g                        d Z ddlZddlZddlmZmZ ddl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 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  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5  e       Z6 ee7jp                  jr                  dd      Z: ee7jv                  jr                  dd      Z< ee7jz                  jr                  dd      Z> ee7j~                  jr                  dd      Z@deAfdZB	 d5deAdeeC   deDfdZE	 d5deAde	d eFdeAd!eeG   deeC   deDfd"ZH	 d5deAd#eId$   de	d eFdeAd!eeG   deeC   deDfd%ZJd&e
fd'ZK ej                  e:       ej                  e<       ej                  e>       ej                  e@      fde	deAd(eAd)eeA   d*eeA   deGfd+ZM	 d5deeC   deAd,eeN   d-eFdeAd.ed/eeO   deGfd0ZPdeeC   fd1ZQdeeC   deeO   fd2ZRde	d3eAdeAfd4ZSy)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                     | j                  d      r| j                  dd      } | S | j                  d      r| j                  dd      } | S | j                  d      r| j                  dd      } | S d} | S )NBearer  Basic zbearer )
startswithreplacer*   s    Y/var/www/openai/venv/lib/python3.12/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                      t         j                  j                  } %t         t              rt         fd|D              ryt         fd|D              ryy)z1
    - Check if the route is a UI used route
    c              3   @   K   | ]  }j                  |        y wN)r/   .0allowed_router5   s     r2   	<genexpr>z_is_ui_route.<locals>.<genexpr>h   s     T^M  /^s   Tc              3   L   K   | ]  }t        j                  |         yw))r5   patternN)r"   _route_matches_patternr;   s     r2   r>   z_is_ui_route.<locals>.<genexpr>l   s)      +M 	**NN+s   !$F)LiteLLMRoutes	ui_routesvalue
isinstancestrany)r5   r6   allowed_routess   `  r2   _is_ui_routerI   [   sX     #,,22N 	uc"T^TT 	 + 
 r4   requestrequest_datavalid_tokenc           	          t        |      }|t        d      t        |      st        j                  ||| ||||       y)z<
    - Route b/w api token check and normal token check
    r6   z4Invalid proxy server token passed. valid_token=None.)r6   
_user_roler5   rJ   rK   r*   rL   T)_get_user_role	Exception_is_user_proxy_adminr"   $non_proxy_admin_allowed_routes_check)r5   rJ   rK   r*   rL   r6   rO   s          r2   _is_api_route_allowedrT   t   sP      2JNOO288!%#	
 r4   
token_type)uiapic                 J    |dk(  rt        | |      ryt        | |||||      S )z;
    - Route b/w ui token check and normal token check
    rV   )r5   r6   T)r5   rJ   rK   r*   rL   r6   )rI   rT   )r5   rU   rJ   rK   r*   rL   r6   s          r2   _is_allowed_routerY      s7     TlJ$%#
 	
r4   	websocketc                 F  K   t        ddi      }| 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 7 7 H7 # t        $ rY}t!        j"                  |       | j                  t        j                         d {  7   t        d	t%        |            d }~ww xY ww)Ntypehttp)scopemodelc                  8   K   d d} | j                         S w)Nz{"model": "z"})encode)return_stringr_   s    r2   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rJ   r*   )r   url_urlquery_paramsgetbodyheaderscloser	   WS_1008_POLICY_VIOLATIONr   r/   lenstripuser_api_key_authrQ   r   	exceptionrF   )rZ   rJ   rl   rc   rd   r*   er_   s          @r2   user_api_key_auth_websocketrw      s{     VV,-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T H
 H U <&&q)oo6#B#BoCCCCF;;<sg   B&F!)D6*AF!/D80-F!D< 1D:2D< 5F!8F!:D< <	F8F=F >FFF!azure_api_key_headeranthropic_api_key_headergoogle_ai_studio_api_key_headerc                 4  K   ddl m}m}m}m}m}	m}
m}m}m	}m
}m}m} d }t        j                         }t        |       }	 t!        |        d {   }t#        || |       d {    |j%                  dd       }d }t'        |t(              r|}t+        |      }nt'        |t(              r|}nt'        |t(              r|}nt'        |t(              r|}n|}|D ]x  }|j%                  dd      |k(  s|j%                  d	d       }|.|j%                  d
d      }| j,                  j%                  |      ]| j,                  j%                  |      }z |j%                  d      }|t/        | |      }|V|j0                  j3                  dt5        |      |j7                  | j,                        |j8                  j:                        }|' || |       d {   }t<        j?                  |      S 	 |t@        jB                  jD                  v stG        |      rt=        tH        jJ                        S tM        |      r(tO        |      du rt=        tH        jJ                        S |j%                  dd      du rDddl m(} |dur&tS        dtT        jV                  jD                  z         tY        |       d {   S |j%                  dd      du rt[        |        d {   S |j%                  dd      du rddl m(} |dur&tS        dtT        jV                  jD                         |j]                  |      }t_        j`                  d|       |r|jc                  |       d {   }|je                  |      }|jg                  |      } | rvti        tH        jj                  ||jl                         }!|!rt=        tH        jj                  |!      S |jl                  jn                  }"tq        |""      }#ts        d#| d$|#       |ju                  |d %      }$|$5|jw                         du r#ts        d&|jl                  jx                   d'      d }%|$uti        tH        jz                  ||jl                         }!|!du r3|jl                  j|                  }"tq        |""      }#ts        d(| d$|#       t        |$||||)       d {   }%|j                  |d %      }&|&t        |&||||*       d {   }'d }(d })|j                         r+	 |j                  |d %      })|)d}(n|j                  |)+      }(d }*|j                  ||)%      }+|+)t        |+|||j                  |(,      ||-       d {   }*d },|j                  |d %      }-|-t        |-||||.       d {   },d }.t        j                  dkD  r|j                  d/j                  |             d {   }.|.Z|Xd0}/|j                  j                  |/1       d {   }|d   d2   }.|j                  d/j                  |      |.3       d {    |.Ft        |t        j                  |.|d4   5      }0t        j                  |j                  d6|07             t        ||%|*|,||.||	8      }'t=        d |%|%j                  nd |%|%j                  nd |%|%j                  nd |%|%j                  ng tH        j                  |+|&||-9
      S d}1t@        j                  jD                  D ]  }2|j                  |2      sd}1 |1r:| 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^}3|j                  d=d      j                         }|3j                  |      }4|4j                  d>      }5|5j                  d?      d   }|j%                  d	d       }||j%                  d
d      }t'        | j,                  t              s| j,                  j%                  |      ,| j,                  j%                  |      }J |
Gt'        |t(              rt=        |tH        jj                  |@      S t=        tH        jj                  |!      S |ts        dA      |dk(  rts        dB|       |dCk(  r9|j%                  dDd      du r
t=               S t        t        j                  dEF      d }6i }7dG|v r	 |dG   }-|-|7dH<   t        |-||||.       d {   }6|6x|6j                  |7dI<   |6j                  ]|6j                  }8|8j                  |8j                  |7dJ<   |8j                  |8j                  |7dK<   |8j                  |8j                  |7dL<   	 t        t        |      ||||dN       d {   }:|:t'        |:t<              r~|:j                  tH        jj                  k(  ra|7j%                  dH      |:_n        |7j%                  dJ      |:_o        |7j%                  dK      |:_p        |7j%                  dI      |:_g        ||:_q        |:S |:t'        |:t<              r|:j                  	 t        |:j                  ||||dP       d {   };|;j                  j|:j                  ^|;j                  |:j                  kD  rE|;j                  }<|<j                         D ]&  \  }=}>dQ|= }?|?|:j                  v st        |:|?|>       ( 	 t        j                  ||
      }@	 t'        |
t(              sJ 	 @r[t        d tH        jj                  |
|i |7dT|i||U       d {   }At        j                  t        t        |
      |A||V             |AS |t@        j                  jD                  v rts        dW| dX      t'        |t(              r'|j                  dY      s:J dZj                  |             t        j                  d[j                  |             |t        ts        d\      ]       d {   S d }B|j                  dY      rt        |      }|:q	 t        |||||^       d {   }:|7j%                  dH      |:_n        |7j%                  dJ      |:_o        |7j%                  dK      |:_p        |7j%                  dI      |:_g        d }Ci }D|:|:j                   du rts        d`      i }Ed }Ft        |:da      r*|:j                  i |:j                  |:j                  }Eni |:j                  }EEt        _        |:j
                  }G|Gi k7  r,Gj%                  dbg       }H|H}It_        j`                  dc|I        t        |:j                        dk(  rnt'        |:j                  t              rdd|:j                  v rn_|j%                  ded       }F|j%                  dfd       }J|Ft        F||:|	g       d {    JJD ]  }Kt        |K||:|	g       d {     |:j                  %	 t        |:j                  ||d||-       d {   }C|:j                  ||:j                   di|:j                   }L|j                  |L       d {   }M|Mn|:j                  }N|:j                  }O|NSOQ|j                  j                  j                  NOdjdkdil       d {   }M|j                  L|M3       d {    M[Mj                  OMj                  j                  }P|P7PdkD  r2|:j                  PkD  r"t        j                  |:j                  Pm      |:j                  t        j                  t        j                        }Qt        j                   |:j                        }R|Rj"                  Rj"                  j%                  |R      "Rj                  t        j                  n      }Rt_        j`                  doR dpQ        |R|Qk  r&t'        dqR dpQ t(        j*                  dr|s      |:j,                  |:j                  d })CCj.                  })t        |:j0                  |:j,                  |:j                  |:j                  |:j                  |)|:j2                  t      }St        j                  |j                  du|S7             |:j,                  |:j                  k\  r,t        j                  |:j,                  |:j                  m      |:j4                  r|:j,                  |:j4                  k\  rt_        j`                  dv|:j0                  |:j,                  |:j4                         t        |:j0                  |:j,                  |:j                  |:j4                  |:j                  |:j                  |:j6                  d |:j2                  w	      }St        j                  |j                  dx|S7             |:j8                  }T|j%                  ded       }U|TLt'        Tt              r<t        T      dkD  r-|+U)|:j0                  |j;                  |:Uy       d {    t        |:dz      r|:j<                  ڐt        |:d{      r|:j>                  t        |:j0                  |:j<                  |:j>                  |:j                  |:j                  |:j6                  |      }St        j                  |j                  d}|S7             |:j<                  |:j>                  k\  r-t        j                  |:j<                  |:j>                  m      |:j                  ltA        |:j                  |:j>                  |:j<                  |:jB                  |:jD                  |:jF                  |:jH                  |:jJ                  ~      }Vnd }VtM        |:|       d {    |jO                  |:j                  V3       d }.t        j                  dkD  r||j                  d/j                  |             d {   }.|.Xd0}/|j                  j                  |/1       d {   }|d   d2   }.|j                  d/j                  |      |.3       d {    |.Yt        |:j0                  |.t        j                  ||:j                        }St        j                  |j                  d6|S7             t        |VC|6||.||	8      }'|:t        dd      |:j0                  t        dd      |:j0                  }t        j                  t        ||:||V             |:jQ                  d      }D|DjS                  d4d        |6DjU                  |7       tW        |:dd       }W|WWdk(  rdnd}XtY        ||XC| |||:      }Y|Yst        dd      |:ts        d      Dt        C||D||       d {   S ts               7 Z7 G7 7 7 7 F7 7 7 D7 7 7 7 7 A# tr        $ rT}9t'        |9t        j                        r|9t_        j`                  dMj                  t)        |9                   Y d }9~9d }9~9ww xY w7 # tr        $ r t        j`                  dO       d }:Y (w xY w7 _# tr        $ r }9t        j`                  |9       Y d }9~9d }9~9ww xY w# tr        $ r d}@Y 
w xY w# tr        $ r' t        dRdSj                  t        |
            hF      w xY w7 7 37 
# tr        $ r* t        j                  d_j                  |             d }:Y 
w xY w7 	7 	7 	Z# tr        $ r:}9t        j`                  dhj                  t)        |9                   d }CY d }9~9	d }9~9ww xY w7 	\7 	
7 7 m7 7 7 l7 =7 # tr        $ r}9t[        | |j%                  dd            }Zt_        j\                  dj                  t)        |9      |Z      d|Zi       t=        ||      }[t!        |        d {  7  }t        j                  |j_                  ||9[t(        j`                  |             t'        |9t        j                        r+t'        |9jb                  t(        jd                  d dr      t'        |9t              r`t'        tW        |9ddt)        |9       d      t(        j`                  tW        |9dd      tW        |9dt        jf                              t'        |9t&              r|9t'        dt)        |9      z   t(        j`                  tW        |9dd      t        jf                        d }9~9ww xY ww)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)rJ   )rK   rJ   r5   pass_through_endpointsr1   pathr-   ro   litellm_user_api_key)keylitellm_key_header_name)rJ   custom_litellm_key_header_namezReceived Proxy Server Request)ro   )r'   
start_timecontextkindri   )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)rH   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   rD   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 Falserf   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.)rv   )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   rL   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\   re   param)r   r   r   r   r   r   	key_aliastoken_budgetz:Crossed Soft Budget for token %s, spend %s, soft_budget %s)	r   r   r   soft_budgetr   r   
team_aliasr   r   r   )user_api_key_dictr_   
team_spendteam_max_budget)r   r   r   r   r   r   team_budget)r   r   r   	tpm_limit	rpm_limitblockedmodelsmetadata)rL   rK   )r   r   r   r   r   i  zInvalid API key)rh   z$Invalid API key, no token associated)exclude_noner   zlitellm-dashboardrV   rW   )r5   rU   r6   rJ   rK   r*   rL   zInvalid route for UI tokenz!Invalid proxy server token passed)r6   r*   r   r   r5   r   use_x_forwarded_for)rJ   r   z^litellm.proxy.proxy_server.user_api_key_auth(): Exception occured - {}
Requester IP Address:{}requester_ip)extra)r   r*   )rK   original_exceptionr   
error_typer5   )r   r\   r   re   rh   zAuthentication Error()r   Nonerg   zAuthentication Error, )litellm.proxy.proxy_serverr|   r}   r~   r   r   r   r   r   r   r   r   r   r   nowr   r$   r   rm   rE   rF   r3   ro   get_api_key_from_custom_headertracer
start_spanr%   get_traceparent_from_header	span_kindSERVERUserAPIKeyAuthmodel_validaterB   public_routesrD   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   rQ   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   rs   	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configrr   listr   r   team_member_spendlitellm_teammembership
find_firstexpiresr   utcfromisoformatr   	utcoffsetProxyExceptionProxyErrorTypesexpired_keyr   r   r   r   r   r   model_max_budgetis_key_within_model_budgetr   r   LiteLLM_TeamTabler   r   team_blockedr   team_metadatar#   	set_cache
model_dumppopupdategetattrrY   r   ru   post_call_failure_hook
auth_errorr   budget_exceededHTTP_401_UNAUTHORIZED)\rJ   r*   rx   ry   rz   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r5   rK   r   passed_in_keyendpointro   
header_keyr   responser   r   jwt_valid_tokenr   r   
is_allowedrH   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_inforv   rL   team_objteam_obj_dictkv
field_nameis_master_key_valid_user_api_key_objrO   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_teamrU   _is_route_allowedr   r   s\                                                                                               r2   rt   rt      s$        (,J"73E}
/@@%%
 	
 	

 8H7K7K$d8
 (,gs##M'8G,c2*G0#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  +44;;  G   '-gw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 "-!;!;-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$+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%%)9)E)EE '6&9&9-&HK#-<-@-@AU-VK*-<-@-@AU-VK*/>/B/B&0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	 %$ 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%););; $(($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  &&;+<+<@W@W+W$**P%%%%++	 %%++%++*55 + 7 7'//'//*55#)33
	 ##%33*"+ 4  $/#?#? (,,Wd;M %03T:,-1!-!-%%1 /II&1' J    \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?@@'6!!1!1%   +Q A	
` PR ; F )Rl#D	#"'* $Ux$2  a!<!<=G$**;BB3q6J   	  !>?K	68(  $$   	("'	(  	HOOZ( 	!b(  ### }  D  D
 ##L  ! $"(( m  t  tF
  $H$(0f`&  QZ  2
. 0 4 45JE R
 	&&mttA "<0	
 +-
 0@@@44)#$"3*55 5 	
 a445 		$44	  a' 8/DSVHA-NO$//a&1Qv/K/KL	  >*G,s1v5 ++!Wf---	
 	
[2
s>  ?Ai
Aa< AZ+Aa< 'AZ.(BAa< 5Aa< 
.Aa< 9B%Aa< AZ1Aa< 7Ai
8AAa< :Ai
;3Aa< .Ai
/AAa< AZ4Aa< Ai
#Aa< *AZ7+Aa< .Ai
/BAa< 4AZ:5A,Aa< !Ai
"C1Aa< AZ=,Aa<  A[ A>Aa< ?A[ .Aa< .A[/=Aa< ,A[	-)Aa< A[1Aa< A[	B9Aa< Ai
0Aa< 4AAa< Aa< $Aa< Ai
BAa< ,Aa< Aa< %AAa< 1Ai
2Aa< Ai
AAa< Ai
#Aa< 4A[ A[A>A[ A\8 .A\5/A\8 3BAa< Ai
Aa< "A]"  A]A*A]" ,A]" <A^ A^  %,Aa< A_0Aa< Ai
B Aa< #A_$Aa< 'Ai
(!Aa< 
A_ A_AA_ :D1Aa< +A`,Aa< 
A`Aa< A` >A`?A` AAa< Aa!AAa< Aa$Aa< 5Aa'6NAa< K=Aa*K>FAa< RAa-RAAa< SAa0S 'Aa< TAa3T1Aa< T9Aa6T:E"Aa< ZAa9ZAa< Z Ai
Z!Aa< Z.Aa< Z1Aa< Z4Aa< Z7Aa< Z:Aa< Z=Aa< [ Aa< [Aa< [Aa< [	Aa< [Aa< [Aa< [A[ [	A\2[A	A\-\'Aa< \-A\2\2Aa< \5A\8 \8 A]]Aa< ]A]]Aa< ]A]" ]"	A^]+A^^ Aa< ^A^^Aa< ^A^^Aa< ^A^^Aa< ^ 0A__Aa< _Aa< _A_ _/A``Aa< `A``Aa< `Aa< `A` `	Aa`$/AaaAa< aAaaAa< a$Aa< a'Aa< a*Aa< a-Aa< a0Aa< a3Aa< a6Aa< a9Aa< a<
AibA-Aic3Ac6c4EAiiAiiAi
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|}	| '|	j                  | j                  | j                         | 7t        |       r+|	j                  t        j                          t#        di |	S t#        di |	S w)N)service	call_typer   end_timedurationr   rN   )r*   r   r   )user_tpm_limituser_rpm_limitr    )r   r   r  r  user_api_key_service_logger_objasync_service_success_hookr&   AUTH	timestamprP   r   r  r=  r   r   rR   r   r   )
r6   r*   r   r   r5   r   r   rm  retrieved_user_roleuser_api_key_kwargss
             r2   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	c                     | y| j                   (| j                   t        j                  j                  k(  ry| j                   (| j                   t        j                  j                  k(  ryy)NFT)r   r   r   rD   rN   s    r2   rR   rR   #  sf     	&"2">">"D"DD 	&"2">">"D"DDr4   c                 ~    | y | }|j                   }	 t        |      }|S # t        $ r t        j                  cY S w xY wr:   )r   r   r   r  )r6   _userrO   roles       r2   rP   rP   6  sN     EJ.
+ K  .---.s     <<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=%sr1   z9Found custom API key using header: {}, setting api_key={}z/No LiteLLM Virtual Key pass. Please set header=z: Bearer <api_key>)	lowerro   r  r   r   rm   r3   r	  ru   )rJ   r   r*   rT  rU  _headerscustom_api_keys          r2   r   r   G  s     G%C%I%I%K")0)>)>)@A)@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&   rr  SpecialHeadersopenai_authorizationrD   api_key_headerazure_authorizationrx   anthropic_authorizationry   google_ai_studio_authorizationrz   rF   r3   LiteLLM_UserTableboolrI   r  r   rT   LiteralrY   rw   Securityrt   Spanr   r"  rR   rP   r   rq  r4   r2   <module>r     sG     '   = = 1  A 2 "     ? L 7 L L & /"0"2  		,	,	2	2
 $		+	+	1	1u 
 (		/	/	5	5+ 
 #/		6	6	<	<2#   -1() 
> -1  	
 .) () 
H -1

$
 
 	

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