
    h                        d dl Z d dlZd dl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Zd dlmZmZ d dlmZ d dlmZ d dlmZmZ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l%m&Z&m'Z'm(Z(  e       Z)er	d dl*m+Z, e,Z+neZ+d Z-dede.fdZ/de0defdZ1dedee   defdZ2 G d d      Z3dede+dee   fdZ4	 d3dedee.   de0fdZ5 G d d       Z6	 	 d4de0dedede+d!eee.ef      d"ee.   fd#Z7de0deddfd$Z8d!ee0   dedee9   fd%Z:d&ede;fd'Z<d(e0d!ee0   ded)e;de;f
d*Z=d+ee0   d,ee0   de0d-e.ddf
d.Z>de0d/e.defd0Z?de0de0fd1Z@de0defd2ZAy)5    N)TYPE_CHECKINGAnyDictListOptionalUnion)Request)Headers)verbose_loggerverbose_proxy_logger)ServiceLogging)safe_json_loads)AddTeamCallbackCommonProxyErrorsLitellmDataForBackendLLMCallSpecialHeadersTeamCallbackMetadataUserAPIKeyAuth)RouteChecks)Router)ANTHROPIC_API_HEADERS)ServiceTypes)ProviderSpecificHeader!StandardLoggingUserAPIKeyMetadataSupportedCacheControls)ProxyConfigc                     i }| j                  d      }|D ]%  }d|v r|j                  d      \  }}|||<   !d||<   ' |S )Nz, =T)split)cache_control
cache_dict
directives	directivekeyvalues         `/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/litellm_pre_call_utils.pyparse_cache_controlr'   *   sV    J$$T*J	)"-JC#JsO$(Jy!       requestreturnc                     t        j                  |       ryg d}t        |D cg c]  }|| j                  j                  v  c}      ryyc c}w )z
    Helper to return what the "metadata" field should be called in the request data

    For all /thread or /assistant endpoints we need to call this "litellm_metadata"

    For ALL other endpoints we call this "metadata
    litellm_metadata)batchesz/v1/messages	responsesfilesmetadata)r   _is_assistants_api_requestanyurlpath)r)   LITELLM_METADATA_ROUTESlitellm_metadata_routes      r&   _get_metadata_variable_namer7   8   s\     --g6!  +B	
& #gkk&6&66	
 "	
s   Adatac                     	 t        |d      r#t        |j                        }d|v r	|d   | d<   y y y # t        $ r Y y t        $ r)}t        j                  dt        |             Y d }~y d }~ww xY w)Nquery_paramsapi-versionapi_versionz.error checking api version in query params: %s)hasattrdictr:   KeyError	Exceptionr   	exceptionstr)r8   r)   r:   es       r&   &safe_add_api_version_from_query_paramsrD   U   s{    

7N+ 4 45L,&2=&A]# - ,   
  <c!f	
 	

s   -2 	A.A.A))A.team_callback_settings_objc                    |
t               }| j                  dk(  rS|j                  g |_        | j                  |j                  vr|j                  j	                  | j                         nm| j                  dk(  rS|j
                  g |_        | j                  |j
                  vr2|j
                  j	                  | j                         n| j                  r| j                  dk(  r|j                  g |_        |j
                  g |_        |j                  g |_        | j                  |j                  vr%|j                  j	                  | j                         | j                  |j
                  vr%|j
                  j	                  | j                         | j                  |j                  vr%|j                  j	                  | j                         | j                  j                         D ]S  \  }}|j                  i |_        t        t        j                  j                  ||      xs |      |j                  |<   U |S )Nsuccessfailuresuccess_and_failure)default_value)r   callback_typesuccess_callbackcallback_nameappendfailure_callback	callbackscallback_varsitemsrB   litellmutils
get_secret)r8   rE   varr%   s       r&   (convert_key_logging_metadata_to_callbackrW   c   s    ")%9%;"Y&%66>:<&7%?%P%PP&77>>t?Q?QR			y	(%66>:<&7%?%P%PP&77>>t?Q?QR$"4"48M"M%66>:<&7%66>:<&7%//735&0%?%P%PP&77>>t?Q?QR%?%P%PP&77>>t?Q?QR%?%I%II&00778J8JK((..0
U%33;79&48;MM$$U%$@IE9
"005 1 &%r(   c                   <    e Zd ZdZedefd       Zedefd       Zy)KeyAndTeamLoggingSettingszO
    Helper class to get the dynamic logging settings for the key and team
    user_api_key_dictc                 V    | j                   d| j                   v r| j                   d   S y Nloggingr0   rZ   s    r&    get_key_dynamic_logging_settingsz:KeyAndTeamLoggingSettings.get_key_dynamic_logging_settings   s3     &&2.777$--i88r(   c                 V    | j                   d| j                   v r| j                   d   S y r\   )team_metadatar_   s    r&   !get_team_dynamic_logging_settingsz;KeyAndTeamLoggingSettings.get_team_dynamic_logging_settings   s3     ++7.<<<$229==r(   N)__name__
__module____qualname____doc__staticmethodr   r`   rc    r(   r&   rY   rY      s=     N   ^  r(   rY   rZ   proxy_configc                    d }t         j                  |       }t         j                  |       }||D ]  }t        t	        di ||      } |S ||D ]  }t        t	        di ||      } |S | j
                  Td| j
                  v rF	 | j
                  }|j                  dd       xs i }t        di |}t        j                  d|       |S | j                  !t        j                  | j                  |      }|S )N)r8   rE   callback_settingsz$Team callback settings activated: %s)team_idrj   ri   )rY   r`   rc   rW   r   rb   getr   r   debugrm   LiteLLMProxyRequestSetup$add_team_based_callbacks_from_config)rZ   rj   callback_settings_objkey_dynamic_logging_settingsteam_dynamic_logging_settingsitemrb   rl   s           r&   _get_dynamic_logging_metadatarv      sK    =A!BBCTU ! 	"CCDUV " $/0D$L$,t,+@%! 1Z ! K 
'	21D$L$,t,+@%! 2H ! 7 	''3#4#B#BB	 *77)--.A4HNB 4 I7H I""24I	
 !  
	"	"	.$II)11 J  	
 ! r(   headerslitellm_key_header_namec                 @   t         j                  j                         D cg c]  }|j                  j	                          }}|}||j                  |j	                                i }| j                         D ]  \  }}|j	                         |vs|||<    |S c c}w )z.
    Removes litellm api key from headers
    )r   _member_map_valuesr%   lowerrN   rR   )rw   rx   vspecial_headersclean_headersheaderr%   s          r&   r   r      s     1?0K0K0R0R0TU1qww}}UOU%O*6<<>?M <<>0$)M&! )  Vs   !Bc                      e Zd Zededee   fd       Zededee   fd       Z	ede
eef   fd       Zedededee   fd       Ze	 dded	ee   dee   fd
       Ze	 dded	ee   dee   fd       Zedededefd       Zedddeded	eeeef      defd       Zededefd       Zededededefd       Zedededefd       Zedee   dee   defd       Zedededee   fd       Zedee    dededee!e      fd       Z"y)rp   rw   r*   c                 B    | j                  dd      }|t        |      S y)a  
        Workaround for client request from Vercel's AI SDK.

        Allow's user to set a timeout in the request headers.

        Example:

        ```js
        const openaiProvider = createOpenAI({
            baseURL: liteLLM.baseURL,
            apiKey: liteLLM.apiKey,
            compatibility: "compatible",
            headers: {
                "x-litellm-timeout": "90"
            },
        });
        ```
        zx-litellm-timeoutN)rn   float)rw   timeout_headers     r&   _get_timeout_from_requestz2LiteLLMProxyRequestSetup._get_timeout_from_request   s)    ( !%8$?%((r(   c                 B    | j                  dd      }|t        |      S y)zE
        Workaround for client request from Vercel's AI SDK.
        zx-litellm-num-retriesN)rn   int)rw   num_retries_headers     r&   _get_num_retries_from_requestz6LiteLLMProxyRequestSetup._get_num_retries_from_request  s+    
 %[[)@$G))**r(   c                    i }| j                         D ]n  \  }}|j                         j                  d      r%|j                         j                  d      s|||<   J|j                         j                  d      sj|||<   p |S )z
        Get the headers that should be forwarded to the LLM Provider.

        Looks for any `x-` headers and sends them to the LLM Provider.

        [07/09/2025] - Support 'anthropic-beta' header as well.
        zx-zx-stainlesszanthropic-beta)rR   r|   
startswith)rw   forwarded_headersr   r%   s       r&   _get_forwardable_headersz1LiteLLMProxyRequestSetup._get_forwardable_headers  s}     $]]_MFE||~((.v||~7P7P8 -2!&)**+;<,1!&) - ! r(   r$   c                 ~    | j                         D ]*  \  }}|j                         |j                         k(  s(|c S  y)zL
        Get a case-insensitive header from the headers dictionary.
        N)rR   r|   )rw   r$   r   r%   s       r&   _get_case_insensitive_headerz5LiteLLMProxyRequestSetup._get_case_insensitive_header3  s6    
 %]]_MFE||~, - r(   Ngeneral_settingsc                     |y|j                  d      }||dk(  ryt        |t              st        dt	        |             t
        j                  | |      }|t        j                  d| d| d       |S )zg
        Get the user from the specified header if `general_settings.user_header_name` is set.
        Nuser_header_name z.Expected user_header_name to be a str but got zfound user "z" in header "")	rn   
isinstancerB   	TypeErrortyperp   r   r   info)rw   r   header_nameusers       r&   get_user_from_headersz.LiteLLMProxyRequestSetup.get_user_from_headers=  s     #&**+=>+"3+s+@kAR@ST  (DD[
 ,tfM+a PQr(   c                     ||j                  d      dury| j                         D ]5  \  }}|j                         dk(  st        j                  d| d       |c S  y)z9
        Get the OpenAI Org ID from the headers.
        Nforward_openai_org_idTzopenai-organizationzfound openai org id: z, sending to llm)rn   rR   r|   r   r   )rw   r   r   r%   s       r&   get_openai_org_id_from_headersz7LiteLLMProxyRequestSetup.get_openai_org_id_from_headersX  sg     ( $$%<=TI$]]_MFE||~!66##&;E7BR$ST - r(   rZ   c                     t         j                  |       }t        j                  du rEt         j	                  |      }|j                         D ]  \  }}|	||dj                  |      <    |S )z
        Add headers to the LLM call

        - Checks request headers for forwardable headers
        - Checks if user information should be added to the headers
        Tr_   zx-litellm-{})rp   r   rS   #add_user_information_to_llm_headers'get_sanitized_user_information_from_keyrR   format)rw   rZ   returned_headers litellm_logging_metadata_headerskr}   s         r&   add_headers_to_llm_callz0LiteLLMProxyRequestSetup.add_headers_to_llm_callj  s|     4LLWU66$>(PP&7 Q  -
 9>>@1=AB$^%:%:1%=> A  r(   )r   c                 .   t               }|r3|j                  d      du r t        j                  | |      }|i k7  r||d<   t        j	                  | |      }|||d<   t        j                  |       }|||d<   t        j                  |       }|||d<   |S )zc
        - Adds user from headers
        - Adds forwardable headers
        - Adds org id
        !forward_client_headers_to_llm_apiTrw   organizationtimeoutnum_retries)r   rn   rp   r   r   r   r   )rw   rZ   r   r8   _headers_organizationr   r   s           r&   %add_litellm_data_for_backend_llm_callz>LiteLLMProxyRequestSetup.add_litellm_data_for_backend_llm_call  s     ,-  $$%HITQ/GG*H 2~"*Y0OO%
 $#0D *DDWM%DO.LLWU""-Dr(   c                     t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  	      }|S )N)	user_api_key_hashuser_api_key_aliasuser_api_key_team_iduser_api_key_user_iduser_api_key_org_iduser_api_key_team_aliasuser_api_key_end_user_iduser_api_key_user_emailuser_api_key_request_route)
r   api_key	key_aliasrm   user_idorg_id
team_aliasend_user_id
user_emailrequest_route)rZ   user_api_key_logged_metadatas     r&   r   z@LiteLLMProxyRequestSetup.get_sanitized_user_information_from_key  si     (I/770::!2!:!:!2!:!: 1 8 8$5$@$@%6%B%B$5$@$@'8'F'F
(
$ ,+r(   r8   _metadata_variable_namec                     t         j                  |      }| |   j                  |       |j                  | |   d<   t	        |dd      | |   d<   | S )zK
        Adds the `UserAPIKeyAuth` object to the request metadata.
        r_   user_api_keyend_user_max_budgetNuser_api_end_user_max_budget)rp   r   updater   getattr)r8   rZ   r   r   s       r&   )add_user_api_key_auth_to_request_metadatazBLiteLLMProxyRequestSetup.add_user_api_key_auth_to_request_metadata  s     %LL"3 M  	%
 	$%,,-IJ %% 	$%	
 IP4dI
$%&DE r(   key_metadatac                 ,   d| v rDi |d<   t        | d   t              r,| d   j                         D ]  \  }}|t        v s||d   |<    d| v r7| d   2t        j                  ||   j                  d      | d         ||   d<   d| v rmt        | d   t              rZd||   v rHt        ||   d   t              r2| d   j                         D ]  \  }}|||   d   vs|||   d   |<    n| d   ||   d<   d| v rt        | d   t              r| d   |d<   |S )Ncachetagsrequest_tagstags_to_addspend_logs_metadatadisable_fallbacks)r   r>   rR   r   rp   _merge_tagsrn   bool)r   r8   r   r   r}   r$   r%   s          r&   add_key_level_controlsz/LiteLLMProxyRequestSetup.add_key_level_controls  s    l"DM,w/6(1779DAq22+,Wa( :
 \!l6&:&F(44!%&=!>!B!B6!J ,V 4 5  ()&1 !L0Z./6
 %-D(EE*,-.CDdK #//D"E"K"K"MJC4(?#@AV#WW " 456KL	 #N HT)H,-.CD
 ,.:,-t4
 )55H(ID$%r(   r   r   c                     g }| r!t        | t              r|j                  |        |r-t        |t              r|D ]  }||vs|j                  |        |S )a5  
        Helper function to merge two lists of tags, ensuring no duplicates.

        Args:
            request_tags (Optional[list]): List of tags from the original request
            tags_to_add (Optional[list]): List of tags to add

        Returns:
            list: Combined list of unique tags
        )r   listextendrN   )r   r   
final_tagstags       r&   r   z$LiteLLMProxyRequestSetup._merge_tags  sW     
J|T:l+:k48"j(%%c* # r(   rm   rj   c                 P   |j                  |       }t        |j                               dk(  ryi |j                  d|      }|j	                  dd       |j	                  dd       |j	                  dd       t        |j                  dd      |j                  dd      |      S )	z:
        Add team-based callbacks from the config
        )rm   r   NrQ   rm   rL   rO   )rL   rO   rQ   )load_team_configlenkeysrn   popr   )rm   rj   team_configcallback_vars_dicts       r&   rq   z=LiteLLMProxyRequestSetup.add_team_based_callbacks_from_config  s     #33G3D{!"a'N MNy$/148148#(__-?F(__-?F,
 	
r(   
llm_routerc                    d }d|v r]t        |d   t              r2|d   j                  d      }|D cg c]  }|j                          }}nt        |d   t              r|d   }d|v rt        |d   t              r|d   }|S c c}w )Nzx-litellm-tags,r   )r   rB   r   stripr   )r   rw   r8   r   _tagsr   s         r&   add_request_tag_to_metadataz4LiteLLMProxyRequestSetup.add_request_tag_to_metadata0  s      w&'"23S9 0177</45		55G$45t</0T>jft<<D 6s   BN)#rd   re   rf   rh   r>   r   r   r   r   r   r   r
   r   rB   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   r   r   r   ri   r(   r&   rp   rp      s   4 HUO  0 t    !w}%! !* d  #   :>)1$	# 4 :>)1$	# "   *8 	   0 
 6:	$$ *$ #4S>2	$
 
&$ $L ,),	*, ,  ) "% 
	 2 ))"&)AD) )V (4. x~ RV  . 

!
 
&	'
 
, V$  
$s)		 r(   rp   r   versionc           
        K   ddl m}m} ddlm} t        | |       t        |j                  ||j                  d      nd      }	| j                  t        j                  |	||             t        j                  |	|      }
|
|j                  |
|_        d| vr|
| d<   t        |j                        |j                   |	t#        j"                  |       d	| d
<    |t%        |j                              | d<   	 |j&                  }t%        |      }|j                  d      }||| d<   t+        | |	       |j                  }t-        j.                  d|       |j                  dd      }|rt1        |      }|j                  d      | d<   t-        j.                  d|        t3        |      }| j                  |d      i | |<   d| v ru| d   pt5        | d   t              r?t7        | d         | d<   t5        | d   t$              st-        j8                  d| d           t#        j:                  | d         | |   d<   t        j=                  | ||      } || |   d<   ||j                  dd      | |   d<   |j>                  }t        jA                  || |      } |jB                  xs i }d|v r7|d   2t        jE                  | |   j                  d      |d         | |   d<   d|v rmt5        |d   t$              rZd| |   v rHt5        | |   d   t$              r2|d   jG                         D ]  \  }}|| |   d   vs|| |   d   |<    n|d   | |   d<   |jH                  | |   d<   |jJ                  | |   d <   |jL                  | |   d!<   |jN                  | |   d"<   |jP                  | |   d#<   |jR                  | |   d$<   |j>                  | |   d%<   t%        |j                        }	|	jU                  d&d       |	| |   d'<   t        |j                        | |   d(<   |jV                  | |   d)<   tY        | |*       |jZ                  |jZ                  | d+<   t]        j\                         }d,}|d-u r|?|j                  d.      d-u r,|*t_        |d'      rd/|j                  v r|j                  d/   }nF|Dt_        |d0      r8t_        |j`                  d1      r"|j`                  |j`                  jb                  }|| |   d2<   t        je                  |t%        |j                        | 3      }||| |   d<   tg        ||4      }|Q|jh                  | d5<   |jj                  | d6<   |jl                  '|jl                  jG                         D ]
  \  }}|| |<    |j>                  r4d7|j>                  v r&|j>                  d7   }|rt5        |tn              r|| d7<   tq        | ||8       ts        | |9       t-        j.                  d:|        tu        | |||;       t]        j\                         }tw        jx                  tz        j}                  t~        j                  ||z
  d<|||jV                  =             | S # t(        $ r i }Y rw xY ww)>a  
    Adds LiteLLM-specific data to the request.

    Args:
        data (dict): The data dictionary to be modified.
        request (Request): The incoming request.
        user_api_key_dict (UserAPIKeyAuth): The user API key dictionary.
        general_settings (Optional[Dict[str, Any]], optional): General settings. Defaults to None.
        version (Optional[str], optional): Version. Defaults to None.

    Returns:
        dict: The modified data dictionary.

    r   )r   premium_user)SecretFieldsNrx   )rx   )rw   rZ   r   r   )r3   methodrw   bodyproxy_server_request)raw_headerssecret_fieldsr;   r<   )r8   rw   zRequest Headers: %szCache-Controlzs-maxagettlzreceiving data: %sr0   z9Failed to parse 'metadata' as JSON dict. Received value: requester_metadata)r8   rZ   r   litellm_api_versionglobal_max_parallel_requests)r   r8   r   r   r   r   user_api_key_team_max_budgetuser_api_key_team_spendr   user_api_key_spenduser_api_key_max_budgetuser_api_key_model_max_budgetuser_api_key_metadataauthorizationrw   endpointlitellm_parent_otel_span)r)   allowed_model_regionr   Tuse_x_forwarded_forzx-forwarded-forclienthostrequester_ip_address)r   rw   r8   )rZ   rj   rL   rO   litellm_disabled_callbacksr8   r   rZ   )r8   rZ   z5[PROXY] returned data from litellm_pre_call_utils: %s)request_bodyr   rZ   r   add_litellm_data_to_request)serviceduration	call_type
start_timeend_timeparent_otel_span)Alitellm.proxy.proxy_serverr   r   *litellm.types.proxy.litellm_pre_call_utilsr   rD   r   rw   rn   r   rp   r   r   r   rB   r3   r   copyr>   r:   r?   (add_provider_specific_headers_to_requestr   ro   r'   r7   r   r   warningdeepcopyr   r0   r   rb   r   rR   team_max_budget
team_spendr   spend
max_budgetmodel_max_budgetr   r  _add_otel_traceparent_to_datar   timer=   r  r  r   rv   rL   rO   rQ   r   move_guardrails_to_metadata"_update_model_if_team_alias_exists_enforced_params_checkasynciocreate_taskservice_logger_objasync_service_success_hookr   PROXY_PRE_CALL)r8   r)   rZ   rj   r   r   r   r   r   r   r   r:   
query_dictdynamic_api_versionrw   cache_control_headerr!   r   r   rb   r$   r%   r  r  r   rr   r   r}   disabled_callbacksr  s                                 r&   r  r  F  s    . DG*49  +   !:;H 	KK FF/- 	G 	
 $99(DTUD((0,0)DL 7;;..		$	$D	  )T'//5JKD++,'

 *4)F&1] -$I ooG4g>";;=()=>
 nnZ0U3T:9'Bxx'.6(*$% Td:.:d:&,.tJ/?@Dd:.5$,,OPTU_P`Oab ?Cmm?
$%&:; $MM+ 7 N D
 <CD	 !"78#  !?F 	$%&DE
 %--L#::! 7 ; D &339rM=#8#D0H0T0T56::6B%f- 1U 1
$%f- -*+,d3 !D)@$AAj()*?@$G
 ,,ABHHJ
Ut$;<=RSSPUD012GHM	 K DQ%DD()*?@ 	)) 		 !&
 	$$ 		 !!
 	'' 		 !$
 ;L:Q:QD	 !"67 	$$ 		 !!
 	** 		 !' >O=W=WD	 !"9:GOO$HLL 08D	 !),03GKK0@D	 !*- 	** 		 !" "$8 --9'8'M'M#$J t
 ( $$%:;tC#+!W__4#*??3D#E */*#*>>#6#6 <PD	 !"89 $??W__% @ D 04$%f- :+, (#8#I#I #8#I#I  ..:-;;AAC1Q D
 	""(,=,F,FF.778TU*-?"F1CD-.   7+ '+
 ? )+!	 yy{H55 //
*3!.?? 	6 	
	 Ko  
s2   C9Z	<Y7 H+Z	?L8Z	7ZZ	ZZ	c                     | j                  d      }|r,|j                  r ||j                  v r|j                  |   | d<   y)aS  
    Update the model if the team alias exists

    If a alias map has been set on a team, then we want to make the request with the model the team alias is pointing to

    eg.
        - user calls `gpt-4o`
        - team.model_alias_map = {
            "gpt-4o": "gpt-4o-team-1"
        }
        - requested_model = "gpt-4o-team-1"
    modelN)rn   team_model_aliases)r8   rZ   _models      r&   r  r  d  sD      XXgF00':::)<<VDW
r(   c                    d }| C| j                  d      }d| v r.t        |      du r!| d   }d|v r|g }|j                  |d          |j                  j                  dd       "|g }|j                  |j                  d          |S )Nenforced_paramsservice_account_settingsT)rn   !check_if_token_is_service_accountr   r0   )r   rZ   r,  r-  s       r&   _get_enforced_paramsr/  ~  s     '+O#*../@A&*::12CDL'78R'S$ $<<"*&(O&&'?@Q'RS!!%%&7>J" O099:KLMr(   valid_tokenc                 :    | j                   rd| j                   v ryy)zr
    Checks if the token is a service account

    Returns:
        bool: True if token is a service account

    service_account_idTFr^   )r0  s    r&   r.  r.    s!     ;#7#77r(   r  r   c                    t        ||      }|y|-|dur)t        d| dt        j                  j                         |D ]  }|j                  d      }t        |      dk(  r|d   | vs*t        d|d    d	      t        |      d
k(  sK|d   | vrt        d|d    d	      |d   | |d      vsrt        d|d    d|d    d       y)z]
    If enforced params are set, check if the request body contains the enforced params.
    )r   rZ   Tz;Enforced Params is an Enterprise feature. Enforced Params: z. .   r   zBadRequest please pass param=z* in request body. This is a required param   zBadRequest please pass param=[z][z+] in request body. This is a required param)r/  
ValueErrorr   not_premium_userr%   r   r   )r  r   rZ   r   r,  enforced_param_enforced_paramss          r&   r  r    sT    ';)=N'O "|4'?I/IZZ\]n]]  ^F  ^F  ]G  H
 	
 *)//4 A%",6 34DQ4G3HHrs  !"a'",6 34DQ4G3HHrs   ",7G7J*KK 45Ea5H4IL\]^L_K`  aL  M  *" r(   r   rb   metadata_variable_namec                 x    ddl m} | |fD ]-  }|sd|v st        |d         dkD  r |        |d   ||   d<   / y)a[  
    Helper add guardrails from key or team metadata to request data

    Args:
        key_metadata: The key metadata dictionary to check for guardrails
        team_metadata: The team metadata dictionary to check for guardrails
        data: The request data to update
        metadata_variable_name: The name of the metadata field in data

    r   )_premium_user_check
guardrailsN)litellm.proxy.utilsr=  r   )r   rb   r8   r;  r=  _management_object_metadatas         r&   )_add_guardrails_from_key_or_team_metadatarA    sT      8(4m'D#&<;V+V.|<=A#%9T:D'(6 (Er(   r   c                     t        |j                  |j                  | |       d| v r| d   | |   d<   | d= d| v r| d   | |   d<   | d= yy)z
    Helper to add guardrails from request to metadata

    - If guardrails set on API Key metadata then sets guardrails on request metadata
    - If guardrails not set on API key, then checks request metadata
    )r   rb   r8   r;  r>  guardrail_configN)rA  r0   rb   r  s      r&   r  r    sx     .&//'556	 t6:<6H$%l3T!<@AS<T$%&89#$ "r(   c                 l    i }d}t         D ]  }||v s||   }|||<   d} |du rt        d|      | d<   y )NFT	anthropic)custom_llm_providerextra_headersprovider_specific_header)r   r   )r8   rw   anthropic_headersadded_headerr   header_values         r&   r  r    s_     L'W"6?L(4f%L	 ( t+A ++,
'(
 r(   c                     ddl m} | y |y t        j                  du rB|j                  r5d|j                  v r&d| vri | d<   | d   }d|vr|j                  d   |d<   y y y y y )Nr   )open_telemetry_loggerTtraceparentrG  )r  rM  rS   #forward_traceparent_to_llm_providerrw   )r8   r)   rM  _exra_headerss       r&   r  r    s    @|$ 	22d:??/ #$.,.D) $_ 5 53:??=3QM-0 6 0  ;r(   r   )NN)Br  r  r  typingr   r   r   r   r   r   fastapir	   starlette.datastructuresr
   rS   litellm._loggingr   r   litellm._service_loggerr   *litellm.litellm_core_utils.safe_json_loadsr   litellm.proxy._typesr   r   r   r   r   r   litellm.proxy.auth.route_checksr   litellm.routerr   litellm.types.llms.anthropicr   litellm.types.servicesr   litellm.types.utilsr   r   r   r   r  r   _ProxyConfigr'   rB   r7   r>   rD   rW   rY   rv   r   rp   r  r  r   r/  r   r.  r  rA  r  r  r  ri   r(   r&   <module>r^     s      B B  ,  A 2 F  8 ! > /  $%  FKK S :
 
 
+&
+&7?@T7U+&+&\ 0;!%;!5@;!"#;!~ @D/7}	$J Jd
 26![
[[ &[ 	[
 tCH~.[ c][|
% 
4tn9Gd^,> d $$tn$ &$ 	$
 
$N4.D>   	
 
8%
% % &%:
,R Rw Rr(   