
    ^h                     @   % S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SKJrJr  S SKJr  S SKJr  S SK J!r!J"r"J#r#  S SK$r$S SK%r%S SK&r&S SK'r'S SK(r(S SK&J)r)  S SK*J+r+  S S	K,J-r-J.r.  S S
K/J0r0  S SK1J2r2  S SK(J3r3  S SK4J5r5  S SK6r6S SK7r6S SK8r6S SK9r6S SK:r6S SK;J<r<  S SK=J>r>J?r?  S SK@JArA  S SKBJCrCJDrD  S SKEJFrF  S SKGJHrHJIrIJJrJ  S SKKJLrLJMrM  S SKNJOrO  S SKPJQrQ  S SKRJSrSJTrTJUrUJVrVJWrW  S SKXJYrY  S SKZJ[r[  S SK\J]r]  S SK^J_r_J`r`  S SKaJbrb  S SKcJdrd  S SKeJfrfJgrg  S SKhJiriJjrj  S S KkJlrlJmrm  S S!KnJoro  S S"KpJqrqJrrrJsrsJtrtJuru  S S#KvJwrw  S S$KxJyry  S S%KxJzrzJ{r{J|r|J}r}J~r~JrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  \GR"                  " S&S'5       r\
GR&                  " \5      rSSS5        \
GR*                  " \5      rS SKrS S(KJr  S S)KJrJrJrJrJrJrJrJrJrJrJrJrJr  S S*K'Jr  S S+KJr  S S,KJr  S S-KJr  S.S/KJr  S.S0KJrJrJrJrJr  S.S1KJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  S.S2KJrJr  S.S3KJrJrJr  S.S4KJr  S5r\" \S69rSrSrSqSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr/ q\\\      \S7'   Sq0 r\\\\4      \S8'   0 r\\\\4      \S9'   SrSr  GSS:\S;\S<   4S= jjrS> rS?\4S@ jrSA r\" SBSC9SD\4SE j5       rGSSG\\   4SH jjrSF/ S4SI\\   SG\\   4SJ jjr        GSSK\\   SL\\   SM\\   SN\\\t      SO\\s   SP\\   SQ\\   4SR jjr GSSS\ST\\   4SU jjrSV\4SW jGr SX GrSY GrSZ Gr        GSSG\\   SL\\\\\   4      SK\\   SP\\   SN\\\t      SO\\s   SQ\\   S[\4S\ jjGrS]\S[\4S^ jGrSD\S]\\   S[\4S_ jGrSD\S]\\   S[\4S` jGr GSSD\S]\\   S[\4Sa jjGrSD\S]\\   Sb\S[\4Sc jGr	GSSD\S]\\   S[\4Sd jjGr
GSSD\S]\\   S[\4Se jjGr GSSD\S]\\   S[\4Sf jjGr GSSD\S]\\   S[\4Sg jjGrGSSD\S]\\   S[\4Sh jjGrSD\4Si jGrSj\Sk\S[\4Sl jGrSm\\\4   4Sn jGr                               GSSo\\   Sp\\   4Sq jjGrS[\4Sr jGrSs\St\Su\\   S[\4Sv jGr       GSSD\Sw\\   Sx\\   Sy\\   Sz\\   S{\\\S|         S]\\   S}\\   4S~ jjGr         GS	SD\\   S\\   S\\   Sy\\   S\\   S\\   S\\   S]\\   Su\\   4S jjGr      GS
SD\S\\   S\\   S\\   S}\\   Su\\   4S jjGrS GrS GrS\S\\\      S[\4S jGr                               GSSD\SK\\\q      4S jjGrSs\S[\4S jGrS\\   S\\   S\\   S\\   S[\\   4
S jGrS\\   S[\4S jGrS]\S\S[\\   4S jGrS\S[\\   4S jGr S\S[\4S jGr!S\S[\4S jGr"S\S\S[\4S jGr#S\S\\   S[\\   4S jGr$S\S[\4S jGr%SL\S[\4S jGr&S\S[\4S jGr'S\S\\   4S jGr(S Gr)SD\S[\\   4S jGr*S[\4S jGr+S[\4S jGr,S\S[\4S jGr-SD\S]\\   S[\4S jGr.Sb\S[\4S jGr/S\S]\\   S[\4S jGr0S SKGJ1Gr1   " S SG\15      Gr2SD\S]\\   S[G\24S jGr3S\S[\\   4S jGr4 GSSD\S]\\   S[\4S jjGr5GSSD\S]\\   S[\4S jjGr6S\4S jGr7S Gr8S Gr9     GSSD\S]\S\Sx\S\S\4S jjGr:S]\S[\\   4S jGr;S Gr<   GSSD\\   S\\   S\\   S[\4S jjGr=S Gr>S Gr?S Gr@SD\S\4S jGrAS\4S jGrBSy\\\\2   \4      S[\\   4S jGrC GSS\\&GR                     4S jjGrE  GSS\S\S\\&GR                     S\S[\G\F\4   4
S jjGrG  GSSD\S\S\S\4S jjGrH " S S5      GrI GSS\\   4S jjGrJ GSS\\   4S jjGrKS[\4S jGrLS GrMS GrNS GrOS GrPS GrQS GrRS GrSSD\\   4S jGrT    GSSD\\   SG\FS\4S jjGrUS[\\   4S jGrVS GrWS GrXS\\   S[\\   4S jGrYGSS jGrZ " S S5      Gr[ " S S5      Gr\ " S S\5      Gr]S\qS[\4S jGr^S\S[\4S jGr_SK\\q   S[\4S jGr`S]\S[\\t   4S jGraS SKpGJbGrbGJcGrcGJdGrdGJeGreGJfGrfGJgGrg  S\\2\4   S[\4S jGrhSK\\q   4S jGriSK\\q   4S jGrj " S S5      Grk GSS\S\S   S[\\   4S jjGrl  GSSD\SK\\\q      SN\\\t      S]\\   S[\4
GS  jjGrmg! , (       d  f       GN= f(      N)	dataclassfield)	lru_cachewraps)	resources)iscoroutine)abspathdirnamejoin)Proxy)get_environment_proxies)_parsing	_pydantic)ResponseFormat)	BaseModel)Encoding)	Tokenizer)	DualCache)CachingHandlerResponseLLMCachingHandler)CustomLogger)map_finish_reasonprocess_response_headers)encoding)_get_response_headersexception_typeget_error_message)_is_non_openai_azure_modelget_llm_provider)get_supported_openai_params)_ensure_extra_body_is_safe)LiteLLMResponseObjectHandler#_handle_invalid_parallel_tool_calls convert_to_model_response_objectconvert_to_streaming_response#convert_to_streaming_response_async)get_api_base)get_formatted_prompt)get_response_headers)LiteLLMLoggingObject(redact_message_input_output_from_logging)Rules)CustomStreamWrapper)calculate_img_tokensget_modified_max_tokens)AsyncHTTPHandlerHTTPHandler)!get_num_retries_from_retry_policyreset_retry_policy)
get_secret)AllMessageValuesChatCompletionAssistantToolCall"ChatCompletionNamedToolChoiceParamChatCompletionToolParam$ChatCompletionToolParamFunctionChunk)RerankResponse)	FileTypes)OPENAI_RESPONSE_HEADERS	CallTypesChatCompletionDeltaToolCallChatCompletionMessageToolCallChoicesCostPerTokenDelta	EmbeddingEmbeddingResponseFunctionImageResponseLlmProvidersMessage	ModelInfoModelInfoBaseModelResponseModelResponseStreamProviderFieldStreamingChoicesTextChoicesTextCompletionResponseTranscriptionResponseUsagez%litellm.litellm_core_utils.tokenizerszanthropic_tokenizer.json)ThreadPoolExecutor)TYPE_CHECKINGAnyCallableDictIterableListLiteralOptionalTupleTypeUnioncastget_args)OpenAIError)
BaseConfig)BaseEmbeddingConfig)BaseRerankConfig   )verbose_logger)CacheQdrantSemanticCache
RedisCacheRedisSemanticCacheS3Cache)APIConnectionErrorAPIErrorAuthenticationErrorBadRequestErrorBudgetExceededErrorContentPolicyViolationErrorContextWindowExceededErrorNotFoundErrorra   PermissionDeniedErrorRateLimitErrorServiceUnavailableErrorTimeoutUnprocessableEntityErrorUnsupportedParamsError)AllowedModelRegionKeyManagementSystem) ChatCompletionDeltaToolCallChunkChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunk)LiteLLM_Paramsd   )max_workerscallback_listadditional_detailslocal_cachelogger_only	log_level)DEBUGINFOERRORc                     US:X  a  [         R                  " U 5        O9US:X  a  [         R                  " U 5        OUS:X  a  [         R                  " U 5        [        R
                  SL a  USL a  [        U 5        g g g ! [         a     g f = f)Nr   r   r   TF)rf   debuginfoerrorlitellmset_verboseprint	Exception)print_statementr   r   s      G/home/james-whalen/.local/lib/python3.13/site-packages/litellm/utils.pyprint_verboser     s    

  1& 0'!  1$&;%+?/" ,@& s   A9A> >
B
Bc                     [         R                   Hw  n U S   [         R                  ;  a"  [         R                  R                  U S   5        U S   [         R                  ;  d  MU  [         R                  R                  U S   5        My     g)z*
Add custom_llm provider to provider list
providerN)r   custom_provider_mapprovider_listappend_custom_providers)
custom_llms    r   custom_llm_setupr      sl     11
j!)>)>>!!((J)?@j!)B)BB%%,,Z
-CD 2    original_functionc                   ^^ SSK Jn  SSKJn  [         R                  SL a  [
        R                  " S5         [        5         SU;   a  US   OS n[        [         R                  5      S:  Ga  [         R                   GHq  m[        T[        5      (       aV  [         R                  R                  R                  TS S S9mTb(  [        U4S j[         R                    5       5      (       a  Mo  T[         R"                  ;  a  [         R"                  R%                  T5        T[         R&                  ;  a  [         R&                  R%                  T5        T[         R(                  ;  a  [         R(                  R%                  T5        T[         R                   ;  a  [         R                   R%                  T5        T[         R*                  ;  d  GMR  [         R*                  R%                  T5        GMt     [-        S	[         R                    35        [        [         R"                  5      S:  d:  [        [         R&                  5      S:  d  [        [         R(                  5      S:  ab  [        [.        5      S:X  aO  [1        [3        [         R"                  [         R&                  -   [         R(                  -   5      5      qU" [.        US
9  [        [         R"                  5      S:  a  / n[5        [         R"                  5       HS  u  n	m[6        R8                  " T5      (       d  M#  [         R:                  R%                  T5        UR%                  U	5        MU     [=        U5       H"  n	[         R"                  R?                  U	5        M$     [        [         R&                  5      S:  Ga  / n[5        [         R&                  5       GH  u  n	m[6        R8                  " T5      (       a2  [         R                   R%                  T5        UR%                  U	5        MT  TS:X  d  TS:X  a2  [         R                   R%                  T5        UR%                  U	5        M  T[         R@                  ;   d  M  SSKJn
  U
" TS S S9mTc  M  [        U4S j[         R                   5       5      (       a  M  [         R                  R%                  T5        [         R"                  R%                  T5        [         R&                  R%                  T5        [         R(                  R%                  T5        [         R                   R%                  T5        [         R*                  R%                  T5        GM     [=        U5       H"  n	[         R&                  R?                  U	5        M$     [        [         R(                  5      S:  a  / n[5        [         R(                  5       HS  u  n	m[6        R8                  " T5      (       d  M#  [         R*                  R%                  T5        UR%                  U	5        MU     [=        U5       H"  n	[         R(                  R?                  U	5        M$     S nS nS nS nURC                  SS 5      b  [        US   [0        5      (       a  / n[5        US   5       Hm  u  n	m[6        R8                  " T5      (       d  TS:X  d  TS:X  d  M/  Ub'  [        U[0        5      (       a  UR%                  T5        OT/nUR%                  U	5        Mo     [=        U5       H  n	US   R?                  U	5        M     UR?                  S5      nURC                  SS 5      b)  [        US   [0        5      (       a  UR?                  S5      n[D        (       as   [F        RH                  " U5      n[         RL                  (       a6  UR?                  SS 5        UR?                  SS 5        UR?                  SS 5        [E        SSU SU 3SS9  SU;   a  US   q'[        U5      S:  a  US   OURC                  SS 5      nU nU[P        RR                  RT                  :X  d  U[P        RV                  RT                  :X  a  S n[        U5      S:  a  US   nOURC                  SS 5      (       a  US   n[        U[0        5      (       aV  [        U5      S:  aG  [        US   [X        5      (       a/  SUS   ;   a&  UR[                  SR]                  S U 5       5      US 9  GOU[P        R^                  RT                  :X  d  U[P        R`                  RT                  :X  a(  [        U5      S:  a  US   OURC                  SS 5      nGOCU[P        Rb                  RT                  :X  d  U[P        Rd                  RT                  :X  a  [        U5      S:  a  US   OUS   nGOU[P        Rf                  RT                  :X  d  U[P        Rh                  RT                  :X  a  [        U5      S:  a  US   OUS   nGOU[P        Rj                  RT                  :X  d  U[P        Rl                  RT                  :X  a  [        U5      S:  a  US   OUS   nGO>U[P        Rn                  RT                  :X  d  U[P        Rp                  RT                  :X  a  URC                  S!5      nOU[P        Rr                  RT                  :X  d  U[P        Rt                  RT                  :X  ac  [        U5      S:  a  US   OUS"   n[         R                  Rv                  Rx                  R{                  US#9nS$U;   a	  UUS$   S%'   OS%U0US$'   UnOQU[P        R|                  RT                  :X  d  U[P        R~                  RT                  :X  a  URC                  SS&5      nOS'nS(U;   a
  US(   SL a  SOS)nU" UUUUS*   URC                  S+5      U=(       d    SUUUUUUUS,9nS-S0nS$U;   a  US$   US$'   UR                  US0 UURC                  S.S 5      S/9  UU4$ ! [J         a    Un GNf = f! [J         a9  n[
        R                  " S0[        R                  " 5        S1U S2U 35        UeS nAff = f)3Nr   )Logging)set_callbacksTze`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs.id)internal_usage_cache
llm_routerc              3   N   >#    U  H  n[        U[        T5      5      v   M     g 7fN
isinstancetype).0cbcallbacks     r   	<genexpr>!function_setup.<locals>.<genexpr>G  s&      /"AB #2tH~66"A   "%z8Initialized litellm callbacks, Async Success Callbacks: )r   function_iddynamodb	openmeter)$_init_custom_logger_compatible_classc              3   N   >#    U  H  n[        U[        T5      5      v   M     g 7fr   r   )r   r   callback_classs     r   r   r     s$      >GX
2tN';<<GXr   success_callbacks3failure_callbackmessagesinputpromptzlitellm.llm_callzPositional Args: z, Keyword Args: r   )categorymessagelevel	logger_fnmodelre   content c              3      #    U  H9  nS U;   d  M  [        US    [        5      (       d  M%  UR                  S S5      v   M;     g7f)r   r   Nr   strget)r   ms     r   r   r     sA      "!)A$> -.89s.K -i,,!)s   
AAAr   r   queryfile)file_objmetadatafile_checksumspeechzdefault-message-valuestreamFlitellm_call_idlitellm_trace_id)r   r   r   r   r   r   	call_type
start_timedynamic_success_callbacksdynamic_failure_callbacksdynamic_async_success_callbacksdynamic_async_failure_callbackskwargsapi_basestream_options)r   useroptional_paramslitellm_paramsr   z4litellm.utils.py::function_setup() - [Non-Blocking] z	; args - z; kwargs - )Dr   r   *litellm.litellm_core_utils.litellm_loggingr   r   rf   warningr   len	callbacksr   r   litellm_core_utilslitellm_loggingr   any_async_success_callbackinput_callbackr   r   r   _async_failure_callbackr   r   listset	enumerateinspectiscoroutinefunction_async_input_callbackreversedpop)_known_custom_logger_compatible_callbacksr   add_breadcrumbcopydeepcopyr   turn_off_message_logginguser_logger_fnr=   
completionvalueacompletiondictpre_call_rulesr   	embedding
aembeddingimage_generationaimage_generation
moderationamoderationatext_completiontext_completionrerankarerankatranscriptiontranscriptionaudio_utilsutilsget_audio_file_nameaspeechr   update_environment_variablesr   	traceback
format_exc)r   	rules_objr   argsr   LiteLLMLoggingr   r   removed_async_itemsindexr   r   r   r   r   details_to_logr   r   r   	_file_objr   r   logging_objr   er   r   s                            @@r   function_setupr  ,  s
    2Hd"s	
N 	 6:V^VD\w  !A%#--h,,&99IInn t  o  H  '3 /")"A"A/ , , !7#9#99**11(;7#;#;;,,33H=7#;#;;,,33H=7#B#BB33::8D7#B#BB33::8D) .* J7KjKjJkl
 &&'!+7++,q07++,q0
 !**../../M ;Ow%%&*"$#,W-C-C#Dx..x881188B'..u5 $E ""56&&**51 7w''(1,"$#,W-E-E#Fx..x8833::8D'..u5+x;/F 33::8D'..u5!R!RR &J -1#'&N &1# >GNGXGX> ; ;  ))00@..55nE0077G0077G77>>~N77>>~N; $G@ ""56((,,U3 7 w''(1,"$#,W-E-E#Fx..x8833::8D'..u5 $G ""56((,,U3 7
  	"
  	(
  	"
  	( ::($/;
%&A
 A
 #%#,V4F-G#Hx//99:-4'6Bz7H H 8>>xH;C*7'..u5 $I ""56)*..u5 7(.

3E(F%::($/;
%&A
 A
 )/

3E(F%>(!%v!6 //"":t4""7D1""8T2++D61A.AQR
 & #K0Nt9q=Qfjj$.G%	--333I11777H4y1}7J--!*- 8T**MA%x{D11!,(('' "!)" 
   )  ,,222I00666"%d)a-tAwVZZ5NH33999I77==="%d)a-tAwVH5EH--333I11777"%d)a-tAwVG_H33999I55;;;"%d)a-tAwVH5EH))///9	@Q@Q@W@W3Wzz'*H11777I33999.1$i!m47I**66<<PP& Q  
 V#6Cz"?3&5}%Ez"$H**000IAQAQAWAW4Wzz'84H.H!V+x0@D0He$"#45#ZZ(:;#)r!&?&?,K,K
" +5b)9)/
);N:&00)!::&6= 	1 	
 F""g  (!'(h  B9CWCWCYBZZcdhciitu{t|}	
 	sl   Fp= Ep= $Ep= *p= =&p= 'Ep= 2Cp= 	C p= 
p*  R	p= *p:6p= 9p::p= =
r 4q;;r c           
        ^ ^^^^ [        5       mS[        4S jmS[        [           4UU U4S jjmS[        [
        [        4   S[        S[        [        [           [        [
        [        4   4   4S jm[        T 5      U UU4S j5       n[        T 5      UU UU4S	 j5       n[        R                  " T 5      nU(       a  U$ U$ )
Nreturnc                 t    [         R                  " U 5      (       a  g[         R                  " U 5      (       a  ggNTF)r   r   r   )r   s    r   check_coroutineclient.<locals>.check_coroutineK  s-    u%%((//r   r   c                   >  U c  g T	R                   nU[        R                  R                  :X  d  U[        R                  R                  :X  Ga  T" U 5      nUSL a  g [        U [        5      (       Ga  [        U R                  5      S:  Ga  U R                  S   R                  R                  nUGbs  T
R                  XQS9  [        R                  SL a   Ub  SU;   a  US    b  S n[        US   [        5      (       a  US   R                  S5       b  US   nO3[         R"                  R%                  US   5      (       a  ['        US   S9nUb.  [        R(                  R*                  R-                  US   S   US9  Ub  SU;   a  [        US   [        5      (       a  S	US   ;   ax  US   S	   S
:X  ak  SUS   ;   aa  [        US   S   [        5      (       aE  SUS   ;   a;  US   S   SL a/  [        R(                  R*                  R-                  US   S   US9  g g g g g g g g g g g g g g ! [.         a     Nf = f! [0         a  nUeS nAff = f)NTr   r   response_formatjson_schemar  schema)r"  responser   json_objectresponse_schemaenforce_validation)__name__r=   r   r   r   r   rK   r   choicesr   r   post_call_rulesr   enable_json_schema_validationr   r   r   _completionsis_basemodel_typetype_to_response_format_paramr   json_validation_rulevalidate_schema	TypeErrorr   )original_responser   r   r   is_coroutinemodel_responsejson_response_formatr  r  r   r  s           r   post_call_processing$client.<locals>.post_call_processingS  s+   d	 (-66	!5!5!;!;; I$9$9$?$??#23D#EL#t+ ''8-HH #$5$=$= > B<M<U<U !=%ggg +  .9 ) 9 9*8 !: !" $+#H#HD#P'%-,;,G0A_0T0?@Q0R3718 TX,@0:4CDU4V4812 12 5D4E5225#m2D7;5<
 HW4EH20D 2:1F1F1X1X0?@Q0R2. 2. 5RHW<MI:56 1E 0D/O070J0J0_0_0o0o;O8E<66><@ >L	 1p 12 %4$?(9_(L(2(78I(JD)& )& )//BS2T(T(78I(J6(R'4)5(9'67H'I)J(2(78I(J,=)* )-	)& )& )='67H'I)J(78I(J(<)& (,), %,$>$>$S$S$c$c/>?P/Q,=0* 2@	 %d %&),)J)&)J)5 )U)& )M %@a  : !C I @t ,5 %-(,%-D  	G	sJ   H< AH< A9H< B*H, BH< ,
H96H< 8H99H< <
IIIr   	exceptionc                     U R                  SS 5      =(       d    [        R                  =(       d    S nU R                  SS 5      (       a&  [        UU R                  S5      S9n[	        5       U S'   X 4$ )Nnum_retriesretry_policyr7  r:  )r   r   r9  r2   r3   )r   r7  r9  s      r   _get_num_retries client.<locals>._get_num_retries  sg     jj5T9L9LTPT::nd++;##ZZ7K &8%9F>"""r   c                  T  > UR                  SS5      SL d  UR                  SS5      SL d~  UR                  SS5      SL di  UR                  SS5      SL dT  UR                  SS5      SL d?  UR                  SS5      SL d*  UR                  S	S5      SL d  UR                  S
S5      SL a  [        R                  bM  UR                  S0 5      R                  SS 5      nUb(  [        R                  [        U5      ::  a  [	        S5      eT" U 0 UD6nSU;   ac  US   SL a[  SU;   aS  US   SL aK  / n[        U5       H  u  pVUR                  U5        M     [        R                  " XAR                  SS 5      S9$ U$ U$ [        TX5        [        R                  R                  5       nS nUR                  SS 5      nTR                  n	SU;  a!  [        [        R                  " 5       5      US'   S n
 [        U 5      S:  a  U S   OUS   n
 Uc  [)        TR                  TU/U Q70 UD6u  pXS'   [+        TUUS9nXl        UR/                  5        HQ  u  pUc  M
  [1        U[        5      (       d  M!  UR3                  S5      (       d  M9  [        R4                  " U5      X'   MS     [        R6                  (       aH  [        R8                  [        R6                  :  a&  [;        [        R8                  [        R6                  S9e[        R                  bM  UR                  S0 5      R                  SS 5      nUb(  [        R                  [        U5      ::  a  [	        S5      e[=        SUR                  SS5       S[        R>                   SUR                  S0 5      R                  SS5       35        UR                  SS 5      c  [        R>                  c  UR                  SS5      SL Ga  UR                  S0 5      R                  SS5      SLa  UR                  SS5      SLa  UR                  SS5      SLa  UR                  SS5      SLa  UR                  SS5      SLa  UR                  SS5      SLaw  UR                  S	S5      SLab  UR                  S
S5      SLaM  [@        RB                  " S 5        URE                  U
=(       d    S!TUUU	UU S"9nURF                  b  URF                  $ UR                  S#S 5      b  U
b  [        RH                  SL a  U	[        RJ                  R"                  :X  d  U	[        RL                  R"                  :X  a   U
nUR                  S$S 5      b  S%UR                  S$5       3nS n[        U 5      S&:  a  U S&   nOUR                  SS 5      (       a  US   nUR                  S#5      n[O        U
UUUS S S'9nUUS#'   T" U 0 UD6n[        R                  R                  5       nSU;   ac  US   SL a[  SU;   aS  US   SL aK  / n[        U5       H  u  pVUR                  U5        M     [        R                  " XAR                  SS 5      S9$ U$ SU;   a
  US   SL a  U$ SU;   a
  US   SL a  U$ SU;   a
  US   SL a  U$ SU;   a
  US   SL a  U$ S)U;   a
  US)   SL a  U$ T" UU
=(       d    S US*9  URQ                  UU US+9  [@        RR                  " S,5        [T        RV                  " URX                  X7U4S-9R[                  5         []        US.5      (       a  UR                  S/0 5      R                  S0S 5      UR^                  S1'   [a        U
=(       d    S![c        US20 5      S39UR^                  S4'   URe                  US59UR^                  S6'   [g        UR^                  R                  S75      =(       d    0 5      UR^                  S7'   Ub  UU-
  Ri                  5       S8-  Ul5        U$ ! [         aM    S n
U	[        R                   R"                  :w  a)  U	[        R$                  R"                  :w  a  ['        S5      e GNJf = f! [         a"  n[=        S([        U5       35         S nAGNS nAff = f! [         Ga  nTR                  n	U	[        RL                  R"                  :X  Ga  UR                  S9S 5      =(       d    [        Rl                  =(       d    S nUR                  S:S 5      (       a&  [o        UUR                  S:5      S;9n[q        5       US:'   S [        l6        UR                  S<0 5      nS=UR                  S0 5      ;   nU(       a  U(       d~  [1        U[r        Rt                  5      (       d>  [1        U[r        Rv                  5      (       d  [1        U[r        Rx                  5      (       a   UUS9'   [        Rz                  " U 0 UD6s S nA$ Oj[1        U[        R|                  R~                  5      (       aA  U(       a:  U
U;   a4  U(       d-  [        U 5      S:  a	  UU
   U S'   OUU
   US'   T" U 0 UD6s S nA$ [        R                  " 5       n[        R                  R                  5       nU(       a  UR                  UUUU5        UeS nAff = f)>Nr   FTr   aimg_generationr   r  r  r  
_arealtimer   previous_modelszMax retries per request hit!r   complete_responser   r   litellm_logging_objr   r   r   model param not passed in.r   request_kwargsr   zos.environ/current_cost
max_budgetzSYNC kwargs[caching]: caching; litellm.cache: z#; kwargs.get('cache')['no-cache']: cachezno-cachezINSIDE CHECKING SYNC CACHEr   r   r   r  r   r   r   r  
max_tokenshf_model_namezhuggingface/re   )r   
base_modelr   user_max_tokens
buffer_numbuffer_percz&Error while checking max token limit: r
  r1  r   r   )resultr  r   z0Wrapper: Completed Call, calling success_handlertargetr  _hidden_params
model_infor   model_idr   r   r   r   rV  response_costadditional_headers  r9  r:  r;  context_window_fallback_dictmodel_group)Cr   r   num_retries_per_requestr   r   r   r   stream_chunk_builderprint_args_passed_to_litellmdatetimenowr'  r   uuiduuid4r=   r   r   r  
ValueErrorr  r   _llm_caching_handleritemsr   
startswithr4   rJ  _current_costrp   r   rM  rf   r   _sync_get_cachecached_resultmodify_paramsr   r   r/   sync_set_cacher   	threadingThreadsuccess_handlerstarthasattrrY  r'   getattr_response_cost_calculatorr   total_seconds_response_msr9  r2   r3   openairm   rw   rl   completion_with_retries
exceptionsrr   r  r  failure_handler)r  r   rA  rV  chunksidxchunkr   r  r   r   rk  kvcaching_handler_responserQ  r   rR  modified_max_tokensr  end_timer9  ra  _is_litellm_router_calltraceback_exceptionr   r5  r  s                            r   wrapperclient.<locals>.wrapper  s
   
 JJ}e,4zz,.$6zz+U3t;zz-/47zz,e4<zz*E2d:zz)U+t3zz,.$6 ..:"(**Z"<"@"@%t# #.66#o:NN'(FGG '77F6!fX&6$&>'6123t;F&/&7
e, '8"77J)E  "MM 	%%6E&&**,
6<jj!47

 &..	F*(+DJJL(9F$%#	?"4y1}DG&/Ed	"&4%..	:'HL'PV'# -8()6G"3%%7 
 0D, =Z3%7%7ALL<W<W ' 2 21 5FI ' !!((7+=+==-%,%:%:#*#5#5  ..:"(**Z"<"@"@%t# #.66#o:NN'(FGG (Iu)E(FFWX_XeXeWf  gJ  KQ  KU  KU  V]  _a  Kb  Kf  Kf  gq  sx  Ky  Jz  { #JJy$7? ' 9!::i74?

7B/33JFdRJJ|U34?JJ159EJJ}e4D@JJ0%8DJJ/7tCJJy%0<JJ|U34? $$%AB(88#kr*;$/#-"+%! 9  ) ,99E3AAA 

<.:%)) !6!6!<!<< I$8$8$>$>>U!&Jzz/48D'3FJJ4O3P%Q
#H4y1}#'7J55#)*#5&,jj&>O*A##-!)(7#'$(+' ,?F<( '77F((,,.H6!fX&6$&>'6123t;F&/&7
e, '8"77J)E  "M&(VM-Bd-J'F<,@D,H"f,8I1Jd1R!V+7G0HD0Pf$	):d)B !"(mt & !// 0   RS"22&h9Wegv/004:JJ|R4P4T4T$5%%j1 5A+2$+K9JB$O5%%j1
  999H %%o6 ?W))--.BCIr?%%&:; !z)-/D')# Mm  	?EY77===!:!:!@!@@ !=>>	?d ! U!$J3q6("STTUJ  5	)22II00666JJ}d3Rw7J7JRd  ::nd33"C"#%+ZZ%?#K
 +, >*  # 06zz2B0, +86::< +'  (? #1foo66%a88%a)B)BCC0;}-&>>OOO D
 q'"4"4"O"OPP4!==34y1}">u"EQ*Fu*Mw,d=f=="+"6"6"8((,,.H ++*J Gk5	s   /_< 	Ab b /b I'b /A%b B a Bb "b $b 4b b b $b 4Eb <Aaa
b a=7b =bb j'Ej"!j''A%j"j'Aj""j'c                    >#    [        TX5        [        R                  R                  5       nS nUR                  SS 5      n[	        TUUS9nTR
                  nSU;  a!  [        [        R                  " 5       5      US'   Sn [        U 5      S:  a  U S   OUS   n Uc  [#        TR
                  TU/U Q70 UD6u  pAXAS'   XTl        [&        R(                  (       aH  [&        R*                  [&        R(                  :  a&  [-        [&        R*                  [&        R(                  S9e[/        S	UR                  S
S5       S[&        R0                   SUR                  SS 5       35        UR3                  UTUUUUU S9I S h  vN nUR4                  b  UR6                  c  UR4                  $ UR8                  SL a  UR6                  $ T" U 0 UD6I S h  vN n[        R                  R                  5       n	SU;   ac  US   SL a[  SU;   aS  US   SL aK  / n
[;        U5       H  u  pU
R=                  U5        M     [&        R>                  " XR                  SS 5      S9$ U$ U[        R@                  R                  :X  a  U$ [C        US5      (       a  [E        USS 5      URF                  S'   UR                  S0 5      R                  SS 5      URF                  S'   [I        UUS9URF                  S'   URK                  US9URF                  S'   [M        URF                  R                  S5      =(       d    0 5      URF                  S'   [O        U[P        5      (       d*  [O        U[R        5      (       d  [O        U[T        5      (       a   [W        USX-
  RY                  5       S-  5        T" X7US 9  UR[                  UTUU S!9I S h  vN   [/        S"UR\                   35        [^        R`                  " UR]                  X2U	5      5        [b        Rd                  " URf                  X2U	4S#9Ri                  5         [O        U[R        5      (       a   UR6                   b  URk                  UUUU	S$9$ U$ ! [         ai    U[        R                  R                  :w  aG  U[        R                  R                  :w  a)  U[        R                  R                  :w  a  [!        S5      e GN<f = f GN^ GN GN%! [         Ga  n[l        Rn                  " 5       n[        R                  R                  5       n	U(       aY   URq                  XX)5        O! [         a  nUeS nAff = f URs                  XX)5      I S h  vN    O! [         a  nUeS nAff = fTR
                  nT" XS%9u  pU[        Rt                  R                  :X  Ga3  UR                  S&0 5      nS'UR                  S(0 5      ;   nU(       a  U(       d   S [&        l;        XS)'   TUS*'   [O        U[x        Rz                  5      (       a  S+US,'   O$[O        U[x        R|                  5      (       a  S-US,'   [&        R~                  " U 0 UD6I S h  vN  s S nA$ ! [         a     Opf = f[O        U[&        R                  R                  5      (       aC  U(       a<  UU;   a6  [        U 5      S:  a	  UU   U S'   OUU   US'   T" U 0 UD6I S h  vN  s S nA$ [W        US)U5        UeS nAff = f7f).NrD  rF  r   r   r   r   rE  rH  zASYNC kwargs[caching]: rK  FrL  z; kwargs.get('cache'): rM  rN  Tr   rB  r   rC  rY  rZ  r   r[  r\  r   r]  r^  r_  r{  r`  rU  )rV  r   r   r  z>Async Wrapper: Completed Call, calling async_success_handler: rW  )_caching_handler_responseembedding_responser   r  )r   r7  ra  rb  r   r9  r   exponential_backoff_retryretry_strategyconstant_retry)Bre  rf  rg  r   r   r'  r   rh  ri  r   r   r=   r   r   r  r   rj  r  rk  r   rJ  rn  rp   r   rM  _async_get_cacherp  final_embedding_cached_response embedding_all_elements_cache_hitr   r   rd  	arealtimerw  rx  rY  r'   ry  r   r   rK   rD   rQ   setattrrz  async_set_cacheasync_success_handlerasynciocreate_taskrs  rt  ru  rv  2_combine_cached_embedding_response_with_api_resultr  r  r  async_failure_handlerr   r9  r|  ru   rm   acompletion_with_retriesr~  rr   )r  r   r   rV  r  rk  r   r   r  r  r  r  r  r  r  r9  ra  r  r<  r   r5  r  s                     r   wrapper_asyncclient.<locals>.wrapper_async  sA    $%6E&&**,
6<jj!47
 3D/!!3
 &..	F*(+DJJL(9F$%	?"4y1}DG&/Ez	"&4%..	:'HL'PV'# -8()/C,!!((7+=+==-%,%:%:#*#5#5  )&**Y*F)GGXY`YfYfXgg~  @F  @J  @J  KR  TX  @Y  Z  [ +;;&7 +)'! <   & *77C-MMU0>>>*KKtS0PPP -d=f==F((,,.H6!fX&6$&>'6123t;F&/&7
e, '8"77J)E  "Mi11777 v/00;B!2D<%%&78 5;JJ|R4P4T4T$5%%j1 5A$*5%%j1
  999H %%o6 ?W))--.BCIr?%%&:; 6=11f&788f&;<<"*99;dB !"(v
 '66"3	 7    PQ\QrQrPst 11&hO "22(3 eg 6#455-MM ,^^.G'-)%	 _   MM  	?Y88>>>!;!;!A!AA!6!6!<!<< !=>>	?8( >jD  ;	"+"6"6"8((,,.H//
 ! G%;;
   ! G *22I"2&"NKI11777/5zz2B0, +86::< +'  (?   + 1<}-6G23%v44  8SF#34'6??;;7GF#34%,%E%Et%Vv%VVVV$  q'"4"4"O"OPP4!==4y1}">u"EQ*Fu*Mw!2D!CF!CCCC=+ Gw;	sv  A?\ Q& C!S% >S?)S% (\ )S% \ S% SBS% \ S% \ S% :\ ;ES% =S">B%S% #\ $S% %\ &A/S\ S\ S% S% "S% %[=0:[8+T>=[8>
UU

U[8U/(U+)U/.[8/
V 9U;;V  A+[8,A6Y-"Y%#Y-'[=(\ -
Y:7[89Y::A$[8[![8#[=$\ )[88[==\ )r,   boolr[   r   rW   r   rU   r   r\   intr   r   r   )r   r  r  r2  r<  r  r5  r  s   `   @@@@r   clientr  H  s    I$ eQU e eN#S#X#+4#	x}d38n,	-# e eN	 V Vp ../@AL r      )maxsizer   c                    U [         R                  ;   a!  SU ;   a  [        R                  " S5      nSUS.$ U [         R                  ;   a%  SU ;  a  [        R
                  " [        5      nSUS.$ SU R                  5       ;   d  SU R                  5       ;   a  [        R                  " S5      nSUS.$ S	U R                  5       ;   a  [        R                  " S
5      nSUS.$ S[        S.$ )Nz	command-rz#Xenova/c4ai-command-r-v01-tokenizerhuggingface_tokenizerr   	tokenizerzclaude-3zllama-2	replicatez#hf-internal-testing/llama-tokenizerzllama-3zXenova/llama-3-tokenizeropenai_tokenizer)	r   cohere_modelsr   from_pretrainedanthropic_modelsfrom_strclaude_json_strlowerr   )r   cohere_tokenizerclaude_tokenizerr  s       r   _select_tokenizerr    s     %%%+*>$441
 0>NOO	'**	*z/F$--o>/>NOO	ekkm	#{ekkm'C--.ST	/iHH	ekkm	#--.HI	/iHH '!
 	
r   r   custom_tokenizerc                     U=(       d	    [        U S9n[        US   [        5      (       a  US   R                  USS9nU$ US   R                  U5      nU$ )a  
Encodes the given text using the specified model.

Args:
    model (str): The name of the model to use for tokenization.
    custom_tokenizer (Optional[dict]): A custom tokenizer created with the `create_pretrained_tokenizer` or `create_tokenizer` method. Must be a dictionary with a string value for `type` and Tokenizer for `tokenizer`. Default is None.
    text (str): The text to be encoded.

Returns:
    enc: The encoded text.
r   r   disallowed_special)r  r   r   encode)r   textr  tokenizer_jsonencs        r   r  r    sc     &G):)GN.-x88[)00"0M J [)006Jr   tokensc                 R    U=(       d	    [        U S9nUS   R                  U5      nU$ )Nr  r  )r  decode)r   r  r  r  decs        r   r  r    s,    %G):)GN

%
,
,V
4CJr   r   r  is_tool_calltoolstool_choicecount_response_tokensuse_default_image_token_countc                 r   [        SU 35         SU;   a  [        R                  " S5      nO[        R                  " U5      n US:X  a  Sn	Sn
OAU[
        R                  ;   a  S	n	S
n
O(U[
        R                  ;   a  S	n	S
n
O[        SU S35      eSnSnU(       a  Ub  [        UR                  " USS95      nGOU Gbp  U  GHh  nX-  nUR                  SS5      S:X  a  SnUR                  5        GH3  u  p[        U[        5      (       a+  U[        UR                  " USS95      -  nUS:X  a  X-  nMD  MF  [        U[        5      (       d  M]  U H  nUS   S:X  a*  UUS   -  nU[        UR                  " US   SS95      -  nM6  US   S:X  d  MA  [        US   [         5      (       aA  US   nUR                  SS5      nUR                  S5      nU[#        UUU=(       d    SS9-  nM  [        US   [        5      (       d  M  US   nU[#        USU=(       d    SS9-  nM     GM6     GMk     OAUb!  USL a  [        UR                  " USS95      nU$ Ub  [        UR                  " USS95      nUS	-  nU(       a,  U[        UR                  " [%        U5      5      5      -  nUS-  nU(       a  U(       a  US-  nUS:X  a  US
-  nU$ [        U[         5      (       a)  US-  nU[        UR                  " US    S   5      5      -  nU$ ! [         a%    [        S5        [        R                  " S5      n GNf = f)!z
Return the number of tokens used by a list of messages.

Borrowed from https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb.
z2LiteLLM: Utils - Counting tokens for OpenAI model=zgpt-4o
o200k_basez5Warning: model not found. Using cl100k_base encoding.cl100k_basezgpt-3.5-turbo-0301      re   z8num_tokens_from_messages() is not implemented for model zz. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.r   FNr  r  rolesystemTnamer   r  	image_urldetailautourldatamoder  	   none   function)r   tiktokenget_encodingencoding_for_modelKeyErrorr   open_ai_chat_completion_models
azure_llmsNotImplementedErrorr   r  r   rl  r   r   rY   r   r.   _format_function_definitions)r   r   r  r  r  r  r  r  r   tokens_per_messagetokens_per_name
num_tokensincludes_system_messager   keyr   cimage_url_dictr  r  image_url_strs                        r   openai_token_counterr  	  sh   " FugNO8u,,\:H2259H $$ 	 	'88	8	'$$	$!H  PJ  M
 	
 J#("EF
		G,J{{64(H4*.'%mmo
eS))#hooePR&S"TTJf}"5
 %t,,"V9. AfI-D&# (&	b Q+ J vY+5)!K.$??12;)7););Hf)M&4&8&8&? *.B),)/B_ C-',	/" !"
 ",AkNC!@!@01+ *.B)6)/B_ C-',	/" !"
' # .	  F 
	3t;"EF
		"EF
!OJc(//*Fu*MNOO
a
(a
 fa

 	 
K	&	&a
c(//+j*A&*IJKK
g  8MN((78s   L L +L65L6
identifier
auth_tokenc                      [         R                  " XUS9nSUS.$ ! [         a8  n[        R                  " SU S35        [         R                  " XS9n SnANBSnAff = f)a  
Creates a tokenizer from an existing file on a HuggingFace repository to be used with `token_counter`.

Args:
identifier (str): The identifier of a Model on the Hugging Face Hub, that contains a tokenizer.json file
revision (str, defaults to main): A branch or commit id
auth_token (str, optional, defaults to None): An optional auth token used to access private repositories on the Hugging Face Hub

Returns:
dict: A dictionary with the tokenizer and its type.
)revisionr  z%Error creating pretrained tokenizer: z-. Defaulting to version without 'auth_token'.)r  Nr  r  )r   r  r   rf   r   )r  r  r  r  r  s        r   create_pretrained_tokenizerr  v  sk    M--j
	 ,)DD  M3A36cd	
 --jL		Ms    
A.AAjsonc                 8    [         R                  " U 5      nSUS.$ )z
Creates a tokenizer from a valid JSON string for use with `token_counter`.

Args:
json (str): A valid JSON string representing a previously serialized tokenizer

Returns:
dict: A dictionary with the tokenizer and its type.
r  r  )r   r  )r  r  s     r   create_tokenizerr    s     ""4(I+)DDr   c                    / nUR                  S5        UR                  S5        U  H  nUR                  S5      nUR                  S5      =n(       a  UR                  SU 35        UR                  S5      nUR                  S0 5      nUR                  S5      nU(       aW  UR                  5       (       aB  UR                  S	U S
35        UR                  [        US5      5        UR                  S5        OUR                  S	U S35        UR                  S5        M     UR                  S5        SR	                  U5      $ )zFormats tool definitions in the format that OpenAI appears to use.
Based on https://github.com/forestwanglin/openai-java/blob/main/jtokkit/src/main/java/xyz/felh/openai/jtokkit/utils/TikTokenUtils.java
znamespace functions {r   r  description// r  
parameters
propertiesztype z = (_: {r   z
}) => any;z = () => any;z} // namespace functions
)r   r   keys_format_object_parametersr   )r  linestoolr  function_descriptionfunction_namer  r  s           r   r  r    s    E	LL()	LL88J'#+<<#>>>LL33456 V,\\,3
^^L1
*//++LL5y9:LL2:qABLL&LL5}=>R  
LL+,99Ur   c           
         U R                  S5      nU(       d  gU R                  S/ 5      n/ nUR                  5        Hc  u  pVUR                  S5      nU(       a  UR                  SU 35        SnU(       a  XS;   a  SnUR                  U U S[        Xa5       S35        Me     S	R	                  U V	s/ s H  n	S
[        SU5      -  U	-   PM     sn	5      $ s  sn	f )Nr  r   requiredr  r  ?z: ,r   r   )r   rl  r   _format_typer   max)
r  indentr  required_paramsr  r  propsr  questionlines
             r   r  r    s    -J nnZ4OE &&(
ii.LL3{m,-s5HuXJbe)D(EQGH ) 99eDedcC6N*T1eDEEDs   4Cc                    U R                  S5      nUS:X  a0  SU ;   a)  SR                  U S    Vs/ s H	  nSU S3PM     sn5      $ gUS:X  a  [        U S   U5       S3$ US	:X  a  S
[        XS-   5       S3$ US;   a0  SU ;   a)  SR                  U S    Vs/ s H	  nSU S3PM     sn5      $ gUS:X  a  gUS:X  a  ggs  snf s  snf )Nr   stringenumz | "arrayrl  z[]objectz{
   z
})integernumberr  booleannullr   )r   r   r  r  )r	  r  r   items       r   r  r    s    99VDxU?::uV}E}t4&{}EFF	uW~v67r::		/zBC4HH	&	&U?::uV}E}t4&{}EFF			 # F Fs   B=Cr  c                    SnSn	UGcr  UGbc  [        SU 35        SnU GHK  n
U
R                  SS5      b  U
R                  S5      n[        U[        5      (       a  X*S   -  nO[        U[        5      (       a  U H  nUS   S:X  a	  X,S   -  nM  US   S	:X  d  M   [        US	   [
        5      (       aA  US	   nUR                  S
S5      nUR                  S5      nU	[        UUU=(       d    SS9-  n	My  [        US	   [        5      (       d  M  US	   nU	[        USU=(       d    SS9-  n	M     U
R                  S5      (       d  GM(  SnU
S    H  nSU;   d  M  US   S   nUU-  nM     GMN     OP[        S5      e[        U[        5      (       a  SR                  S U 5       5      nO[        U[        5      (       a  SnU c  Ub  U=(       d	    [        U S9nUS   S:X  a+  US   R                  U5      n[        UR                  5      n	U	$ US   S:X  a  U [        R                  ;   d  U [        R                  ;   aO  U [        R                  ;   a  U R!                  SS5      n [        SU  35        [#        UU UUUUUU=(       d    SS9n	U	$ [        SU  35        [#        USUUUUUU=(       d    SS9n	U	$ [        [$        R                  " USS95      n	U	$ ) a  
Count the number of tokens in a given text using a specified model.

Args:
model (str): The name of the model to use for tokenization. Default is an empty string.
custom_tokenizer (Optional[dict]): A custom tokenizer created with the `create_pretrained_tokenizer` or `create_tokenizer` method. Must be a dictionary with a string value for `type` and Tokenizer for `tokenizer`. Default is None.
text (str): The raw text string to be passed to the model. Default is None.
messages (Optional[List[Dict[str, str]]]): Alternative to passing in text. A list of dictionaries representing messages with "role" and "content" keys. Default is None.

Returns:
int: The number of tokens in the text.
Fr   Nz!token_counter messages received: r   r   r   r  r  r  r  r  r  
tool_callsTr  	argumentsz%text and messages cannot both be Nonec              3   T   #    U  H  n[        U[        5      (       d  M  Uv   M      g 7fr   )r   r   )r   ts     r   r    token_counter.<locals>.<genexpr>$  s     =$Q*Q*<qq$s   (	(r  r  r  r  z-35z-3.5z6Token Counter - using OpenAI token counter, for model=)r  r   r   r  r  r  r  r  z7Token Counter - using generic token counter, for model=zgpt-3.5-turbor  r  )r   r   r   r   rY   r   r.   rj  r   r  r  r   idsr   r  r  replacer  r   )r   r  r  r   r  r  r  r  r  r  r   r   r  r  r  r  r  	tool_callfunction_argumentsr  r  s                        r   token_counterr"    s"   . LJ|=hZHID#;;y$/;%kk)4G!'3//	 22#GT22!(A yF2 $&	 1!"6k!9#-and#C#C56{^N-;-?-?&-QF*8*<*<U*CC$.2F-0-3Fc G1+0	3& %&J &0+%D%D45kNM$.2F-:-3Fc G1+0	3& %&J! "), ;;|,,#'L%,\%:	%21::1F{1S. $66D &;= $F DEE	D$		ww=$==	D#		 $,8)K->U-K&!%<< -44T:CSWWJR Q F#'99???G...G...!MM%8ELUGT 2%!-*? +2O 3

8 ! MeWU 2)%!-*? +2O 3

  "EF
r   custom_llm_providerc                     / SQnX;   a  gg)zM
Helper function to know if a provider implementation supports httpx timeout
)r|  azurebedrockTFr  )r#  supported_providerss     r   supports_httpx_timeoutr(  X  s     91r   c                     [        U USS9$ )ah  
Check if the given model supports system messages and return a boolean value.

Parameters:
model (str): The model name to be checked.
custom_llm_provider (str): The provider to be checked.

Returns:
bool: True if the model supports system messages, False otherwise.

Raises:
Exception: If the given model is not found in model_prices_and_context_window.json.
supports_system_messagesr   r#  r  _supports_factoryr   r#  s     r   r*  r*  d  s     /& r   c                     [        XS9u  p  n[        R                  R                  [        R                  R                  /nX;   a  g[        U USS9$ )aK  
Check if the given model + provider supports 'response_schema' as a param.

Parameters:
model (str): The model name to be checked.
custom_llm_provider (str): The provider to be checked.

Returns:
bool: True if the model supports response_schema, False otherwise.

Does not raise error. Defaults to 'False'. Outputs logging.error.
r.  Tsupports_response_schemar+  )r   r   rG   	PREDIBASEFIREWORKS_AIr-  )r   r#  _*PROVIDERS_GLOBALLY_SUPPORT_RESPONSE_SCHEMAs       r   r0  r0  y  sa     (8($E1 	&&))2.
 H/& r   c                     [        U USS9$ )m  
Check if the given model supports function calling and return a boolean value.

Parameters:
model (str): The model name to be checked.
custom_llm_provider (Optional[str]): The provider to be checked.

Returns:
bool: True if the model supports function calling, False otherwise.

Raises:
Exception: If the given model is not found or there's an error in retrieval.
supports_function_callingr+  r,  r.  s     r   r7  r7    s      /' r   r  c                      [         R                  " XS9u  p  n[        XS9nUR                  US5      SL a  gg! [         a5  n[
        R                  " SU SU  SU S[        U5       35         SnAgSnAff = f)	r6  r.  FTz%Model not found or error in checking z support. You passed model=, custom_llm_provider=	. Error: N)r   r   _get_model_info_helperr   r   rf   r   r   )r   r#  r  r3  rZ  r  s         r   r-  r-    s    +2+C+C,
(Aq ,

 >>#u%- 3C58STYSZZp  rE  qF  FO  PS  TU  PV  OW  X	
 	s   6: 
A9+A44A9c                     [        XSS9$ )zECheck if a given model supports audio input in a chat completion callsupports_audio_inputr+  r,  r.  s     r   r=  r=    s    BX r   c                     [        XSS9$ )zCCheck if a given model supports pdf input in a chat completion callsupports_pdf_inputr+  r,  r.  s     r   r?  r?    s    BV r   c                     [        XSS9$ )zFCheck if a given model supports audio output in a chat completion callr=  r+  r,  r.  s     r   supports_audio_outputrA    s     BX r   c                     [        U USS9$ )ai  
Check if the given model supports prompt caching and return a boolean value.

Parameters:
model (str): The model name to be checked.
custom_llm_provider (Optional[str]): The provider to be checked.

Returns:
bool: True if the model supports prompt caching, False otherwise.

Raises:
Exception: If the given model is not found or there's an error in retrieval.
supports_prompt_cachingr+  r,  r.  s     r   rC  rC    s      /% r   c                     [         R                  " XS9u  p  n[         R                  " XS9nUR                  SS5      SL a  gg! [         a2  n[
        R                  " SU  SU S[        U5       35         SnAgSnAff = f)	a  
Check if the given model supports vision and return a boolean value.

Parameters:
model (str): The model name to be checked.
custom_llm_provider (Optional[str]): The provider to be checked.

Returns:
bool: True if the model supports vision, False otherwise.
r.  supports_visionFTzFModel not found or error in checking vision support. You passed model=r9  r:  N)r   r   get_model_infor   r   rf   r   r   )r   r#  r3  rZ  r  s        r   rE  rE     s    +2+C+C,
(Aq ++

 >>+U3t; TUZT[[q  sF  rG  GP  QT  UV  QW  PX  Y	
 	s   AA 
B(A<<Bc                     U [         R                  ;   a*  [         R                  U    nUR                  SS5      SL a  gg[        SU  S35      e)ap  
Check if the given model supports parallel function calling and return True if it does, False otherwise.

Parameters:
    model (str): The model to check for support of parallel function calling.

Returns:
    bool: True if the model supports parallel function calling, False otherwise.

Raises:
    Exception: If the model is not found in the model_cost dictionary.
"supports_parallel_function_callingFTz?Model not supports parallel function calling. You passed model=.)r   
model_costr   r   )r   rZ  s     r   rH  rH    sV     """''.
>>>F$NMeWTUV
 	
r   existing_dictnew_dictc                 @    UR                  5        H	  u  p#X0U'   M     U $ r   rl  )rK  rL  r  r  s       r   _update_dictionaryrO  7  s%     a ! r   rJ  c                 	   0 n[        U [        5      (       a  U nO)[        U [        5      (       a  [        R                  " U S9nUR                  5        GHm  u  p# [        US9nUS   n[        R                  R                  U0 5      R                  [        XC5      5        [        R                  " U S35        UR                  S5      S:X  a7  U[        R                  ;  a!  [        R                  R!                  U5        M  M  UR                  S5      S:X  a7  U[        R"                  ;  a!  [        R"                  R!                  U5        M  M  UR                  S5      S:X  a9  U[        R$                  ;  a"  [        R$                  R!                  U5        GMI  GML  UR                  S5      S	:X  a9  U[        R&                  ;  a"  [        R&                  R!                  U5        GM  GM  UR                  S5      S
:X  aN  UR)                  SS5      nU[        R*                  ;  a%  [        R*                  R!                  US   5        GM  GM  UR                  S5      S:X  a9  U[        R,                  ;  a"  [        R,                  R!                  U5        GMH  GMK  UR                  S5      S:X  a9  U[        R.                  ;  a"  [        R.                  R!                  U5        GM  GM  UR                  S5      S:X  a9  U[        R0                  ;  a"  [        R0                  R!                  U5        GM  GM  UR                  S5      S:X  a9  U[        R2                  ;  a"  [        R2                  R!                  U5        GM2  GM5  UR                  S5      S:X  a9  U[        R4                  ;  a"  [        R4                  R!                  U5        GM  GM  UR                  S5      S:X  a9  U[        R6                  ;  a"  [        R6                  R!                  U5        GM  GM  UR                  S5      S:X  a9  U[        R8                  ;  a"  [        R8                  R!                  U5        GM  GM  UR                  S5      S:X  d  GM7  U[        R:                  ;  d  GMN  [        R:                  R!                  U5        GMp     U $ ! [         a    0 nUn GNpf = f)a  
Register new / Override existing models (and their pricing) to specific providers.
Provide EITHER a model cost dictionary or a url to a hosted json blob
Example usage:
model_cost_dict = {
    "gpt-4": {
        "max_tokens": 8192,
        "input_cost_per_token": 0.00003,
        "output_cost_per_token": 0.00006,
        "litellm_provider": "openai",
        "mode": "chat"
    },
}
r  r  r  z added to model cost maplitellm_providerr|  text-completion-openaicohere	anthropic
openrouter/re   zvertex_ai-text-modelszvertex_ai-code-text-modelszvertex_ai-chat-modelszvertex_ai-code-chat-modelsai21	nlp_cloudaleph_alphar&  )r   r   r   r   get_model_cost_maprl  rF  r   rJ  
setdefaultupdaterO  rf   r   r   r  r   open_ai_text_completion_modelsr  r  splitopenrouter_modelsvertex_text_modelsvertex_code_text_modelsvertex_chat_modelsvertex_code_chat_modelsai21_modelsnlp_cloud_modelsaleph_alpha_modelsbedrock_models)rJ  loaded_model_costr  r   existing_modelmodel_cost_keysplit_strings          r   register_modelrm  >  s     *d##&	J	$	$#66:F'--/
	!5C#5NN+E2N
 	%%nb9@@~5	
 	u$<=>99'(H4'@@@66==cB AYY)*.FF'@@@66==cB AYY)*h6'///%%,,S1 0YY)*k9'222((//4 3YY)*l:99S!,L'333))00aA 4YY)*.EE'444**11#6 5YY)*.JJ'999//66s; :YY)*.EE'444**11#6 5YY)*.JJ'999//66s; :YY)*f4'---##**3/ .YY)*k9'222((//4 3YY)*m;'444**11#6 5YY)*i7'000&&--c2k 0l c  	!N N	!s   SSSrP  custom_prompt_dictc                     0 SU_SU _SU_SU_SU_SU_SU	_SU
_S	U_S
U_SU_SU_SU_SU_SU_S0 _SU_UUUUUUUU=(       d	    [        US9UUUS.EnU$ )Nr   api_keyforce_timeoutr   verboser#  r   r   model_alias_mapcompletion_call_idr   rZ  proxy_server_requestpreset_cache_keyzno-logstream_responseinput_cost_per_tokenr   )input_cost_per_secondoutput_cost_per_tokenoutput_cost_per_secondcooldown_timer  azure_ad_token_provideruser_continue_messagerQ  r   rP  rn  )*_get_base_model_from_litellm_call_metadata) rp  rq  r%  r   rr  hugging_facer  together_air#  r   r   rs  rt  r   rZ  ru  r   rv  no_logrz  rx  r{  r|  r}  r  r~  r  rQ  r   rP  rn  r   s                                    r   get_litellm_paramsr    s   B{7 	 	Y	
 	7 	2 	H 	? 	? 	0 	H 	j 	 4 	, 	&  	2!" 	 4#$ "7!6"8&*#:!6  I5xH,&0;N@ r   c                 @    Ub  [        U[        5      (       a  X;   a  ggr  )r   r   r  additional_drop_paramss     r   _should_drop_paramr    s"    *-t44'r   passed_paramsdefault_paramsr  c                     0 nU R                  5        H(  u  pEXA;   d  M  XQU   :w  d  M  [        XBS9SL d  M$  XSU'   M*     U$ )Nr  F)rl  r  )r  r  r  non_default_paramsr  r  s         r   _get_non_default_paramsr    sR     ##%A&&"QV %&q! & r   languager   r  temperaturetimestamp_granularities)wordsegmentdrop_paramsc                   ^^^ [        5       n	U	R                  S5      mU	R                  S5      mU	R                  S5      n
U
R                  5        H	  u  pXU'   M     S S S S S.nU	R                  5        VVs0 s H  u  pX;   d  M  XU   :w  d  M  X_M     snnm0 nUUU4S jnTS:X  d  TS:X  a  TnOYTS:X  aS  [        R                  " 5       R                  5       nU" US	9  [        R                  " 5       R                  TUU Tb  TOS
S9nU	R                  5        H  nXR                  5       ;  d  M  X   X'   M      U$ s  snnf )Nr#  r  r   )r  r   r  r  c                   > [        TR                  5       5      S:  ah  [        TR                  5       5      nU HG  nTSL d  [        R                  SL a  X ;  a  TR                  US 5        M4  X ;  d  M;  [        SST S3S9e   T$ g )Nr   T  z1Setting user/encoding format is not supported by =. To drop it from the call, set `litellm.drop_params = True`.status_coder   r   r  r   r   r  r   ry   )supported_paramsr  r  r#  r  r  s      r   _check_valid_arg;get_optional_params_transcription.<locals>._check_valid_arg  s    !&&()A-*//12D4'7+>+>$+F/&**1d3.0$'"STgSh  if  !g   &% .r   r|  r%  groqr  Fr  r   r   r  )localsr   rl  r   GroqSTTConfigget_supported_openai_params_sttmap_openai_params_sttr  )r   r  r   r  r  r  r#  r  r   r  special_paramsr  r  r  r   r  r  r  s         ``         @r   !get_optional_params_transcriptionr    sp    HM'++,AB##M2K"&&x0N$$&a ' 	N "''))DA 	$%):$: 	)
 O& h&*=*H,		&"002RRT*:;!//1GG1+'2'>E	 H 
 !''))!.!1O " Ks   8EEEnqualitysizestyler   c	                   ^^ [        5       n
U
R                  SS 5      n U
R                  S5      mU
R                  SS 5      nU
R                  S5      nUR                  5        H_  u  pUR                  S5      (       a  TS:w  a  TS:w  a  M)  US:X  a  TS:w  a  M7  UR                  S	5      (       a  TS
:w  a  TS:w  a  M[  XU'   Ma     S S S S S S S.n[	        U
UUS9m0 nUU4S jnTS:X  d  TS:X  d  T[
        R                  ;   a  TnOTS:X  ah  [
        R                  R                  U S9(       a  [
        R                  O[
        R                  nUR                  U S9nU" US9  UR                  T0 S9nO!TS
:X  a  S/n U" US9  Ub  [        U5      US'   U
R                  5        H  nXR                  5       ;  d  M  X   X'   M      U$ )Nr   r#  r  r   aws_r&  	sagemakerrP  vertex_	vertex_aivertex_ai_beta)r  r  r  r  r  r   r  r  r  c           	        > [        TR                  5       5      S:  af  [        TR                  5       5      nU HE  n[        R                  SL a  X ;  a  TR                  US 5        M/  X ;  d  M6  [        SSU ST S3S9e   T$ g )Nr   Tr  z	Setting `z` is not supported by r  r  r  )r  r  r  r#  r  s      r   r  7get_optional_params_image_gen.<locals>._check_valid_arg`  s    !&&()A-*//12D''4/A4M&**1d3.0$'"+A3.DEXDY  ZW  !X   &% .r   r|  r%  r  r  r  r   r  sampleCount)r  r   rl  rm  r  r   openai_compatible_providersAmazonStability3Config_is_stability_3_modelAmazonStabilityConfigr    map_openai_paramsr  r  )r   r  r  r  r  r  r   r#  r  r   r  r  r  r  r  r   r  config_classr  r  s          `           @r   get_optional_params_image_genr  .  s    HMgt,E'++,AB*../GN"&&x0N$$&<<9,1D1S/!&9[&HLL###{2#'77a '  N 1#%5
 O&  	x'')'"E"EE,			) --CC%CP **.. 	
 (CC%CP*:;&8812 9 
 
	+5	 	*:;=-0VOM*!''))!.!1O " r   encoding_format
dimensionsc                 J	  ^ ^^^ [        5       nUR                  SS 5      mUR                  S5      n	U	R                  5        H	  u  pXU
'   M     UR                  SS 5      mUR                  SS 5      nS S S S.nS[        [           4UUU U4S jjn[        UUUS9mTS	:X  a)  T b$  S
T ;  a  STR                  5       ;   a
  [        SSS9eGOTS:X  aC  [        T TSS9nU" US9  [        R                  " 5       R                  T0 T Tb  TOSS9n0 UEUEnU$ TS:X  aE  [        T =(       d    SSSS9nU" US9  [        R                  " 5       R                  T0 S9n0 UEUEnU$ TS:X  a;  [        T =(       d    SSSS9nU" US9  [        R                  R                  T0 US9nU$ TS:X  a@  [        T SSS9nU" US9  [        R                  " 5       R                  T0 US9u  nn0 UEUEnU$ TS:X  aT  [        R                  " 5       R                  5       nU" US9  [        R                  " 5       R                  T0 S9n0 UEUEnU$ TS:X  a  ST ;   a  [        R                   " 5       nObST ;   a  [        R"                  " 5       nOFST ;   a  [        R$                  " 5       nO*S T ;   a  [        R&                  " 5       nO/ nU" US9  0 UEnU$ UR                  5       nU" US9  UR                  T0 S9n0 UEUEnU$ TS!:X  a<  [        T S!SS9nU" US9  [        R(                  " 5       R                  T0 S9n0 UEUEnU$ TS":X  a<  [        T S"SS9nU" US9  [        R*                  " 5       R                  T0 S9n0 UEUEnU$ TS#:X  aC  [        T S#SS9nU" US9  [        R,                  " 5       R                  T0 T Tb  TOSS9n0 UEUEnU$ TS$:X  a=  [        T S$SS9nU" US9  [        R.                  " 5       R                  T0 T S%9n0 UEUEnU$ TS	:w  a  TS&:w  a  T[        R0                  ;  a{  [3        TR                  5       5      S':  a^  [        R4                  S(L d  TS(L a5  [	        TR                  5       5      nU H  n
TR                  U
S 5        M     O[        SS)T S*T S+3S9e0 TEUEnU$ ),Nr#  r   r  r  )r   r  r  r  c           	         > U c  g 0 nTR                  5        H  nX ;  d  M
  TU   X'   M     U(       a/  [        R                  SL d  Tb  TSL a  g [        ST SU ST S3S9eg )NTr   does not support parameters: , for model=f. To drop these, set `litellm.drop_params=True` or for proxy:

`litellm_settings:
 drop_params: true`
r  )r  r   r  ry   )r  unsupported_paramsr  r#  r  r   r  s      r   r  8get_optional_params_embeddings.<locals>._check_valid_arg  s    ##((*A((:1(="% + ""d*'K4,?, #233QRdQeeqrwqx  yc  d  r   r  r|  ztext-embedding-3r  r  zSetting dimensions is not supported for OpenAI `text-embedding-3` and later models. To drop it from the call, set `litellm.drop_params = True`.r  triton
embeddings)r   r#  request_typer  Fr  
databricksr   r  
nvidia_nim)r  r   r   r  	lm_studior&  zamazon.titan-embed-text-v1zamazon.titan-embed-image-v1zamazon.titan-embed-text-v2:0zcohere.embed-multilingual-v3mistraljina_aivoyagefireworks_ai)r  r   r   r%  r   TzSetting z is not supported by r  )r  r   rl  r[   r   r  r  ry   r    r   TritonEmbeddingConfigr  DatabricksEmbeddingConfignvidiaNimEmbeddingConfigVertexAITextEmbeddingConfigLmStudioEmbeddingConfigAmazonTitanG1Config&AmazonTitanMultimodalEmbeddingG1ConfigAmazonTitanV2ConfigBedrockCohereEmbeddingConfigMistralEmbeddingConfigJinaAIEmbeddingConfigVoyageEmbeddingConfigFireworksAIEmbeddingConfigr  r   r  )r   r   r  r  r#  r  r  r   r  r  r  r  r  r  r  r   final_paramsr  r  r  s   `   ``             @r   get_optional_params_embeddingsr    s    HM'++,A4H"&&x0N$$&a '  ##M48K*../GN"t4PN8D>  $ 1#%5 h& "%/ 2 7 7 99( j  
	(6 3%

 	*:;!779KK1'2'>E	 L 
 5/4V4		,6+2 ,%

 	*:;!;;=OO12 P 
 5/4V4		,6+2 ,%

 	*:;!::LL12f M 
 		+6 +%

 	*:; //1CC12f D 
	
 5/4V4		+++-IIK 	 	*:;!99;MM12 N 
 5/4V4			)'50!557F*e3CCEF+u4002F+u499;F!.>?%f:L!==?*:; 2212 3 
 5/4V4			)6 )%

 	*:;!88:LL12 M 
 5/4V4			)6 )%

 	*:;!779KK12 L 
 5/4V4		(6 (%

 	*:;!779KK1'2'>E	 L 
 5/4V4		.6 .%

 	*:;!<<>PP12U Q 
 5/4V4 	x'7*w'J'JJ!&&()A-##t+{d/B.3356A&**1d3  - #&'9&::OPcOd  eb  c  4(3F3Lr   c                     [        U [        5      (       a7  SU ;   a  U S   SL a  U S	 U R                  5        H  u  p[        U5        M     U $ [        U [        5      (       a  U  H  n[        U5        M     U $ )a  
clean out 'additionalProperties = False'. Causes vertexai/gemini OpenAI API Schema errors - https://github.com/langchain-ai/langchainjs/issues/5240

Relevant Issues: https://github.com/BerriAI/litellm/issues/6136, https://github.com/BerriAI/litellm/issues/6088
additionalPropertiesF)r   r   rl  _remove_additional_propertiesr   r"  r  r   r  s       r   r  r  j	  s{     &$!V+7M0NRW0W-. !,,.JC)%0 ) M 
FD	!	!D)$/  Mr   c                     [        U [        5      (       a/  SU ;   a  U S	 U R                  5        H  u  p[        U5        M     U $ [        U [        5      (       a  U  H  n[        U5        M     U $ )zq
Relevant Issues: https://github.com/BerriAI/litellm/issues/6136, https://github.com/BerriAI/litellm/issues/6088
strict)r   r   rl  _remove_strict_from_schemar   r  s       r   r  r  	  sl     &$vx  !,,.JC&u- ) M 
FD	!	!D&t,  Mr   r  supported_openai_paramsc                     / nUc  0 $ U R                  5        H  nX1;  d  M
  UR                  U5        M     U H  nU R                  US5        M     U $ )z3
Remove unsupported params from non_default_params
N)r  r   r   )r  r  remove_keysparamr  s        r   _remove_unsupported_paramsr  	  s]     K&	#((*/u% + sD) r   c                  `3  ^ ^^^^^2^3 [        5       R                  5       m3T3R                  S5      n!U!R                  5        Ha  u  n"n#U"R	                  S5      (       a  TS:w  a  TS:w  a  M*  U"S:X  a  TS:w  a  M8  U"R	                  S5      (       a  TS:w  a  TS:w  a  M\  U#T3U"'   Mc     0 n$[
        R                  n%TU%S	   ;   a   TS
:X  a$  [
        R                  " 5       R                  T3U$S9n$OTS:X  a$  [
        R                  " 5       R                  T3U$S9n$OYTS:X  d  TS:X  a$  [
        R                  " 5       R                  T3U$S9n$O)TS:X  a#  [
        R                  " 5       R                  T3U$S9n$0 SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _SS _S SS S S S S S S S S S S S S S.En&T3R                  5        V"V#s0 s H[  u  n"n#U"S :w  d  M  U"S!:w  d  M  U"S":w  d  M  U"S#:w  d  M&  U"S$:w  d  M.  U"S%:w  d  M6  U"U&;   d  M>  U#U&U"   :w  d  MI  [        U"US&9S'L d  MX  U"U#_M]     sn#n"m2ST2;   d  ST2;   d  S(T2;   GaB  TS):X  Ga;  TS*:w  Ga4  TS
:w  Ga-  TS:w  Ga&  TS+:w  Ga  TS,:w  Ga  TS-:w  Ga  TS.:w  Ga
  TS/:w  Ga  TS0:w  a  TS1:w  a  TS2:w  a  TS3:w  a  TS4:w  a  TS5:w  a  TS6:w  a  TS7:w  a  TS8:w  a  TS:w  a  TS9:w  a  TS::w  a  T[
        R                  ;  a  TS):X  aX  S;U$S<'   S=[
        l        S(T2;   a'  T2R                  S(5      U$S>'   T2R                  S?S 5        OdST2;   a  T2R                  S5      U$S>'   OI[
        R                  (       a&  T2R                  S(T2R                  SS 5      5      U$S>'   O[        S@SAT SB3SC9eSDT2;   a  [!        T2SD   SE9T2SD'   S(T2;   a  [#        T2[$        5      (       ar  T2S(   nU Hg  n'U'R'                  SF0 5      n(U(R'                  SGS 5      n)U)c  M,  [        R(                  " U)5      n*SHU*;   a  U*SH   S'L a  U*R                  SHS 5        U*U(SG'   Mi     UUU UU2U34SI jn+SJ[*        SK[,        S [,        4U4SL jjn,TS6:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R0                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$GO(TSP:X  a  [/        T TSM9n-[
        R6                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$U+" U-SN9  [
        R6                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$GOTS8:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R8                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO;TS7:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R:                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTSR:X  a<  [/        T TSM9n-U+" U-SN9  [
        R<                  " 5       R3                  T2U$T Tb  TOS'SQ9n$GOTSS:X  aN  [/        T TSM9n-U+" U-SN9  U(       a  UU$S'   Ub  UU$S'   U	b  U	U$S'   Ub  UU$S'   Ub  UU$ST'   Ub  UU$SU'   Tb  TU$SV'   GONTSW:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R>                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTSX:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R@                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTSY:X  aQ  [/        T TSM9n-U+" U-SN9  [
        RB                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOITS,:X  aQ  [/        T TSM9n-U+" U-SN9  [
        RD                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS:X  a  T [
        RF                  ;   dd  T [
        RH                  ;   dP  T [
        RJ                  ;   d<  T [
        RL                  ;   d(  T [
        RN                  ;   d  T [
        RP                  ;   au  [/        T TSM9n-U+" U-SN9  [
        RR                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$[
        RT                  b  [
        RT                  U$SZ'   GOTS[:X  aQ  [/        T TSM9n-U+" U-SN9  [
        RV                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS:X  d  TS:X  a{  S[T ;   au  [/        T TSM9n-U+" U-SN9  [
        RR                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$[
        RT                  b  [
        RT                  U$SZ'   GO![
        RX                  R[                  T TSM9(       aQ  [/        T TSM9n-U+" U-SN9  [
        RX                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$GOTS:X  ae  T [
        R\                  ;   aQ  [/        T TSM9n-U+" U-SN9  [
        R^                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOBTS:X  a  T [
        R`                  ;   a  [/        T TSM9n-U+" U-SN9  S4T ;   aA  [
        Rb                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$GO[
        Rd                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$GOTS:X  ae  T [
        Rf                  ;   aQ  [/        T TSM9n-U+" U-SN9  [
        Rh                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO%TS:X  aQ  [/        T TSM9n-U+" U-SN9  [
        Rj                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS:X  Ga  [/        T TSM9n-[
        Rl                  " 5       Ro                  T 5      n.U.[
        Rp                  ;   aH  U+" U-SN9  [
        Rl                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'US\9n$GO=S]T ;   a,  U+" U-SN9  U	b  U	U$S^'   Ub  UU$S'   Ub  UU$S_'   U(       a  UU$S'   GOS6T ;   al  U+" U-SN9  S`T3;   a;  T R	                  Sa5      (       a#  [
        Rr                  " 5       R3                  T2U$S9n$GO[
        Rt                  " 5       R3                  T2U$S9n$GOSbT ;   aA  U+" U-SN9  U	b  U	U$Sc'   Ub  UU$S'   Tb  U," ST0ST Sd9n/U/S   U$Se'   Ub  UU$S_'   U(       a  UU$S'   GORSfT ;   a,  U+" U-SN9  U	b  U	U$Sg'   Ub  UU$S'   Ub  UU$S'   U(       a  UU$S'   GO S8T ;   a$  U+" U-SN9  U(       a  UU$S'   Ub  UU$S'   U	b  U	U$S'   G
OS5T ;   a.  U+" U-SN9  U	b  U	U$S'   Ub  UU$S'   Ub  UU$S'   Tb  TU$S'   Ub  UU$S'   G
OTSh:X  aP  / SiQn-U+" U-SN9  U	b  U	U$Sj'   U(       a  UU$S'   Ub  UU$S'   Ub  UU$S'   Ub  UU$S'   Ub  UU$S'   Tb  TU$S'   Tb  TU$Sk'   G
OjTSl:X  aQ  [/        T TSM9n-U+" U-SN9  [
        Rv                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$G
OTS):X  aQ  [/        T TSM9n-U+" U-SN9  [
        Rx                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$G	OTS9:X  aQ  [/        T TSM9n-U+" U-SN9  [
        Rz                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$G	OeTSm:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R|                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$G	OTSn:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R~                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTSo:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO`TSp:X  ad  [/        T TSM9n-U+" U-SN9  Ub  USq:X  a  T Sr:X  a  SsnUU$S'   U(       a  UU$S'   U(       a  UU$S'   U	(       a  U	U$S'   U(       a  UU$S'   U(       a  UU$S'   GOTS+:X  a[  [/        T TSM9n-T St;   a  U-/ SuQ-  n-U+" U-SN9  T2n$Ub  USq:X  a  T St;   a  SsnUU$S'   U(       a  UU$S'   U(       a  UU$S'   U	(       a  U	U$S'   GOTS5:X  d  TS4:X  aQ  [/        T TSM9n-U+" U-SN9  [
        Rd                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO8TSv:X  aQ  [/        T TSM9n-U+" U-SN9  [
        Rb                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTSw:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS.:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T T2U$Tb  [#        T[4        5      (       a  TOS'SO9n$GO3TS/:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS0:X  a6  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T T2U$Sx9n$GOTS1:X  d  TS]:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOCTSy:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS2:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTSz:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO>TS{:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS-:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS3:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO9TS::X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS:X  a  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$T3R                  5        H:  n0[
        R                  " 5       R                  U05      (       d  M.  [        S|U0 35      e   GO=TS}:X  aQ  [/        T TSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS~:X  aQ  [/        T S~SM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GOTS
:X  Ga9  [/        T S
SM9n-U+" U-SN9  [
        R                  " 5       R                  T S9(       aA  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$GO[        R                  " SR                  U[
        R                  [        S5      5      5        U=(       d9    [
        R                  =(       d"    [        S5      =(       d    [
        R                  n[
        R                  " 5       R3                  T2U$T UTb  [#        T[4        5      (       a  TOS'S9n$OO[/        T SSM9n-U+" U-SN9  [
        R                  " 5       R3                  T2U$T Tb  [#        T[4        5      (       a  TOS'SQ9n$T/ SQ[
        R                  -   ;   a  [        SUS&9S'L at  T3R                  S0 5      n1T3R                  5        H!  n"U"U&R                  5       ;  d  M  T3U"   U1U"'   M#     U$R                  S0 5        0 U$S   EU1EU$S'   [        U$S   S9U$S'   O5T3R                  5        H!  n"U"U&R                  5       ;  d  M  T3U"   U$U"'   M#     [        SU$ 35        U$$ s  sn#n"f )Nr   r  r&  r  rP  r  r  r  	providersr%  r  watsonx	functionsfunction_callr  top_pr  r   r   stoprO  max_completion_tokens
modalities
predictionaudiopresence_penaltyfrequency_penalty
logit_biasr   r   )r   r#  r  seedr  r  max_retrieslogprobstop_logprobsextra_headersapi_versionparallel_tool_callsr  r  r   r   r#  r  r  r  r   r  Fr  ollamarS  anyscaler  r  r  cerebrasxai	ai21_chat
volcenginedeepseek	codestralr  rU  cohere_chatrT  ollama_chatrV  r  formatTfunctions_unsupported_modelr  r  z%Function calling is not supported by rI  r  r  r!  r  r  r  c           	        > [         R                  " ST ST 35        [         R                  " ST 35        [         R                  " ST 35        0 nTR                  5        H;  nX ;  d  M
  US:X  d  US:X  d  US:X  a  M  US:X  a  TS	:X  a  M,  US
:X  a  M4  TU   X'   M=     U(       aX  [        R
                  SL d  Tb/  TSL a*  UR                  5        H  nTR                  US 5        M     g [        ST SU ST S3S9eg )Nz
LiteLLM completion() model= z; provider = z(
LiteLLM: Params passed to completion() z4
LiteLLM: Non-Default params passed to completion() r   r   r   r  re   r  Tr  r  r  r  r  )rf   r   r   r  r   r  r   ry   )	r  r  r  r#  r  r   r  r  r  s	      r   r  -get_optional_params.<locals>._check_valid_arg
  s<   ,UG=AT@UV	
 	7G	
 	CDVCWX	
  #((*A(;!'7"71=8Q& -?q,A&) + ""d*'K4,?+002A&**1d3 3 - #233QRdQeeqrwqx  yc  d  r   r  r   c                   > SnSU ;   ap  [         R                  (       a[  US:X  aU  SU;   aO  / n[        T[        5      (       a8  T H2  n[        R
                  " SU5      (       d  M!  UR                  U5        M4     Ub  X0S'   U $ )zy
filter params to fit the required provider format, drop those that don't fit if user sets `litellm.drop_params = True`.
Nr  r&  amazonz^(\|+|User:)$)r   r  r   r   rematchr   )r  r   r   filtered_stopsr  s        r   _map_and_modify_arg0get_optional_params.<locals>._map_and_modify_arg
  s|     %%'*=*=9$U): "dD))!88$4a88)003 " $'4V$r   r.  r  )r   r  r   r  anthropic_textr  r  maritalkprepetition_penaltystopping_tokensr  	predibasehuggingfacesafety_settingsgemini)r   r  r   r  r   rX  	maxTokenstopPaws_bedrock_clientzanthropic.claude-3r  maxTokenCount)r   r   stopSequencesmetamax_gen_lenrZ  )rO  r   r  r  r  r  r  r  maximum_tokensstop_sequences
cloudflarerY  petals	deepinfra
perplexityr   zmistral-7b-instructg-C6?)z"mistralai/Mistral-7B-Instruct-v0.1z$mistralai/Mixtral-8x7B-Instruct-v0.1)r  r  r  r  r  text-completion-codestralr  )r   r  r   r  hosted_vllmvllmzLiteLLM now defaults to Watsonx's `/text/chat` endpoint. Please use the `watsonx_text` provider instead, to call the `/text/generation` endpoint. Param: watsonx_textr|  r  zoAzure optional params - api_version: api_version={}, litellm.api_version={}, os.environ['AZURE_API_VERSION']={}AZURE_API_VERSION)r  r   r   r  r  custom_openai)r|  r%  rS  
extra_body)r2  z Final returned optional params: )]r  r   r   rl  rm  r   !common_cloud_provider_auth_paramsAzureOpenAIConfigmap_special_auth_paramsAmazonBedrockGlobalConfigVertexAIConfigIBMWatsonXAIConfigr  r  add_function_to_promptry   r-  r   r   r   r   r   r   r    AnthropicConfigr  r  AnthropicTextConfigCohereConfigCohereChatConfigTritonConfigReplicateConfigPredibaseConfigHuggingfaceConfigTogetherAIConfigrc  rd  ra  rb  vertex_language_modelsvertex_vision_modelsVertexGeminiConfigvertex_ai_safety_settingsGoogleAIStudioGeminiConfigVertexAIAnthropicConfigis_supported_modelvertex_llama3_modelsVertexAILlama3Configvertex_mistral_modelsCodestralTextCompletionConfigMistralConfigvertex_ai_ai21_modelsVertexAIAi21ConfigSagemakerConfigAmazonConverseConfig_get_base_modelbedrock_converse_modelsAmazonAnthropicClaude3ConfigAmazonAnthropicConfigCloudflareChatConfigOllamaConfigOllamaChatConfigNLPCloudConfigPetalsConfigDeepInfraConfigDatabricksConfigNvidiaNimConfigCerebrasConfigXAIChatConfigAI21ChatConfigFireworksAIConfigVolcEngineConfigHostedVLLMChatConfig
VLLMConfigGroqChatConfigOpenAIConfigOpenrouterConfigIBMWatsonXChatConfigr  is_watsonx_text_paramrj  AzureOpenAIO1Configis_o1_modelrf   r   r
  r  r4   AZURE_DEFAULT_API_VERSIONOpenAILikeChatConfigr\  r!   r   )4r   r  r  r  r  r  r   r   r  rO  r  r  r  r  r  r  r  r   r#  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r   common_auth_dictr  r  tool_functionr  new_parametersr  r  r  rQ  r  r  r2  r  r  s4   `    `  `         `          `                    @@r   get_optional_paramsrr  	  s     L HMMOM"&&x0N$$&1<<9,1D1S/!&9[&HLL###{2#'77a ' O@@.{;;	 ')%779QQ#0/ R O !I-113KK'4o L    ;."&66%446NN#0/ O O !I-%88:RR#0/ S O!T!! 	t! 		!
 	T! 	$! 	$! 	! 	d! 	 ! 	d! 	d! 	! 	D! 	T!  	d!!" 	#!$ !#"&A!NL "''))DAqL 	 **	 	
 ]" 	 ]" 	 -- 	 Z 	 ^# 	 ^A&& 	 #Q?UV 	1)& 	))00((  8+#'??#w.#{2#z1#}4#v-#|3#z1#u,#{2#|3#z1#{2#y0#{2#}4#x/#y0#}4#|3#7+N+NN"h.,2) . 00*..w7 $$AB '**%t !$66*..{; $$AB ..ASAWAW/33KFB => - #CDWCXXYZ 
 ..0M./@A1
,- $$D* * #7+   !HHZ4M&**<>J%!%z!:*n<&'=>%G"&&'=tD.<l+ # #J d  c  #  $ k)6-@
 	*:;!113EE1+ *z+t/L/L  F 	
 
 0	06-@
 "557II1+ *z+t/L/L  J 	
 	*:;!557II1+ *z+t/L/L  J 	
 
	(6-@
 	*:;!..0BB1+ *z+t/L/L  C 	
 
	-6-@
 	*:;!224FF1+ *z+t/L/L  G 	
 
	(6-@
 	*:;!..0BB1+'2'>E	 C 
 

	*6-@
 	*:;(.OH%"-8OM*!,6OL)!,6OL)#(OC '4DO0115O-.		+6-@
 	*:;!113EE1+ *z+t/L/L  F 	
 
	+6-@
 	*:;!113EE1+ *z+t/L/L  F 	
 
	-6-@
 	*:;!335GG1+ *z+t/L/L  H 	
 
	-6-@
 	*:;!224FF1+ *z+t/L/L  G 	
 
	++++G333G...G333G222G000 7-@
 	*:;!446HH1+ *z+t/L/L  I 	
 ,,8181R1RO-.		(6-@
 	*:;!<<>PP1+ *z+t/L/L  Q 	
 
 0	0{*x5/@6-@
 	*:;!446HH1+ *z+t/L/L  I 	
 ,,8181R1RO-.		(	(	;	;)< 
< 
 7-@
 	*:;!99;MM1+ *z+t/L/L  N 	
 
	+9U9U0U6-@
 	*:;!668JJ1+ *z+t/L/L  K 	
 
	+9V9V0V6-@
 	*:;%%CCEWW#5 / #.:k43P3P   X 	O &335GG#5 / #.:k43P3P   H 	O 
	+9V9V0V6-@
 	*:;!446HH1+ *z+t/L/L  I 	
 
	+6-@
 	*:;!113EE1+ *z+t/L/L  F 	
 
		)6-@
 113CCEJ
888.>?%::<NN#5 / #.:k43P3P  ! O 
O u_.>? %/9,&1<. */',2)E!.>?#}4##$899<<>PP/A,; Q  $ #*"?"?"A"S"S'9$3 #T # .>?%3=0&1<. 3TNYe! 4A3H0 */',2)u_.>?%1;.&1<. +0(,2).>?,2)&1<.%0:-%.>? %0:-&1<. +0(*.'!,2)		-	
 	*:;!0:O,-(.OH%"-8OM*',OG$'2BO./(3DO/0=#$OC 04O,-		,6-@
 	*:;!668JJ1+ *z+t/L/L  K 	
 
	(6-@
 	*:;!..0BB1+ *z+t/L/L  C 	
 
	-6-@
 	*:;!224FF1+ *z+t/L/L  G 	
 
	+6-@
 	*:;!002DD1+ *z+t/L/L  E 	
 
	(6-@
 	*:;!..0BB1+ *z+t/L/L  C 	
 
	+6-@
 	*:;!113EE1+ *z+t/L/L  F 	
 
	,6-@
 	*:;"q U.C%C$-8OM*',OG$(.OH%,6OL)2BO./3DO/0	
	*6-@
  
 
  !  	*:;,"aE . % %-8OM*',OG$(.OH%,6OL)			)-@K-O6-@
 	*:;!//1CC1+ *z+t/L/L  D 	
 
 ;	;6-@
 	*:;!??ASS1+ *z+t/L/L  T 	
 
	,6-@
 	*:;!224FF1+ *z+t/L/L  G 	
 
	,6-@
 	*:;!113EE1+ *z+t/L/L  F 	
 

	*6-@
 	*:;!002DD1+ *z+t/L/L  E 	
 
	%6-@
 	*:;!//1CC1+ D 

 
	+/Bf/L6-@
 	*:;!002DD1+ *z+t/L/L  E 	
 
	.6-@
 	*:;!335GG1+ *z+t/L/L  H 	
 
	,6-@
 	*:;!224FF1+ *z+t/L/L  G 	
 
	-6-@
 	*:;!668JJ1+ *z+t/L/L  K 	
 
	&6-@
 	*:;!,,.@@1+ *z+t/L/L  A 	
 
	&6-@
 	*:;!002DD1+ *z+t/L/L  E 	
 

	*6-@
 	*:;!..0BB1+ *z+t/L/L  C 	
 
	,6-@
 	*:;!224FF1+ *z+t/L/L  G 	
 
		)6-@
 	*:;!668JJ1+ *z+t/L/L  K 	
 #'')E))+AA%HH  p  qv  pw  x  *
 
	.6-@
 	*:;!446HH1+ *z+t/L/L  I 	
 
	(6X
 	*:;!..0BB1+ *z+t/L/L  C 	
 
	'6W
 	*:;&&(4454A%99;MM#5 / #.:k43P3P   N 	O    B  I  I!4!4jAT6U  5&&5125 44	  &779KK#5 /' #.:k43P3P   L 
O 7_
 	*:;!668JJ1+ *z+t/L/L  K 	
 	8

-
-.	. 7M 
 '**<<J"'')N//11$1!$4JqM * &&|R8-!,/--OL)
 -G*<8-OL)
 ##%A++--%21%5" & 4_4EFGU"sF   	Af*Af*"Af**Af*2Af*:Af*Af*
Af*Af*$Af*c                    0 SS _SS _SS _SS _SS _SS _SS _SS _S	S _S
S _SS _SS _SS _SS _SS_SS _SS _S S S S S S S.EnU R                  5        VVs0 s H(  u  p#US:w  d  M  US:w  d  M  X!;   d  M  X1U   :w  d  M&  X#_M*     nnnU$ s  snnf )Nr  r  r  r  r  r   r   r  rO  r  r  r  r   r   r#  r   r  r  )r  r  r  r  r  r  rN  )r  r  r  r  r  s        r   get_non_default_paramsrt  m  s^   T 	t 		
 	T 	$ 	$ 	 	d 	D 	T 	d 	 	 	r  	4!" 	#$ /N8 "'')	)DAL 	 **	 	
 # 	 A&& 	)  	 	s   B"B*B1B;Bmax_parallel_requestsrpmtpmdefault_max_parallel_requestsc                 ^    U b  U $ Ub  U$ Ub  [        US-  S-  5      nUS:X  a  SnU$ Ub  U$ g)a  
Returns the max parallel requests to send to a deployment.

Used in semaphore for async requests on router.

Parameters:
- max_parallel_requests - Optional[int] - max_parallel_requests allowed for that deployment
- rpm - Optional[int] - requests per minute allowed for that deployment
- tpm - Optional[int] - tokens per minute allowed for that deployment
- default_max_parallel_requests - Optional[int] - default_max_parallel_requests allowed for any deployment

Returns:
- int or None (if all params are None)

Order:
max_parallel_requests > rpm > tpm / 6 (azure formula) > default max_parallel_requests

Azure RPM formula:
6 rpm per 1000 TPM
https://learn.microsoft.com/en-us/azure/ai-services/openai/quotas-limits


Nr`     r   re   )r  )ru  rv  rw  rx  calculated_rpms        r   calculate_max_parallel_requestsr|    sS    : ($$	
	S4Z!^,QN	&	2,,r   healthy_deploymentsc                     [        S U  5       S S9nUb.  U  Vs/ s H  nUS   R                  S5      U:X  d  M  UPM!     nnU$ U $ s  snf )Nc              3   H   #    U  H  nS US   ;   d  M  US   S    v   M     g7f)orderr   Nr  )r   
deployments     r   r   2_get_order_filtered_deployments.<locals>.<genexpr>  s2      	
1
*%566 2J'(11s   "")defaultr   r  )minr   )r}  	min_orderr  filtered_deploymentss       r   _get_order_filtered_deploymentsr    st    	
1	

 I  2 
1
*+//8IE 1 	  
 $# 
s
   AAr   c                 v   U S:X  am  UR                   =(       d4    [        R                   =(       d    [        S5      =(       d    [        S5      nUb  [        U[        5      (       a  U$ UR                  $ U S:X  a  UR
                  nUb  U$  UR                  $ U S:X  a  UR                  nUb  U$ UR                  $ )z5
Return the region for a model, for a given provider
r  VERTEXAI_LOCATIONVERTEX_LOCATIONr&  r  )vertex_locationr   r4   r   r   aws_region_namewatsonx_region_nameregion_name)r#  r   vertex_ai_locationr  r  s        r   _get_model_regionr    s     k) ** -&&--.- +,	 	 )j9KS.Q.Q%% %%% 
		)(88&"" ' %%%	 
		),@@*&&%%%r   c                    [         R                  " U R                  U S9u  p  n[        X S9nUc0  [        R
                  " SR                  U R                  5      5        gUS:X  aG  [         R                  " 5       R                  5       n[         R                  " 5       R                  5       nOUS:X  aG  [         R                  " 5       R                  5       n[         R                  " 5       R                  5       nOUS:X  aG  [         R                  " 5       R                  5       n[         R                  " 5       R                  5       nOQUS:X  aG  [         R                  " 5       R                  5       n[         R                  " 5       R                  5       nO/ n/ nU H  nXtR                  5       ;   d  M    g	   U H  nXtR                  5       ;   d  M    g
   g)zq
Infer if a model is in the EU or US region

Returns:
- str (region) - "eu" or "us"
- None (if region not found)
)r   r   )r#  r   Nz'Cannot infer model region for model: {}r%  r  r&  r  euus)r   r   r   r  rf   r   r
  r4  get_eu_regionsget_us_regionsr7  r6  r8  r  )r   r   r#  r3  model_region
eu_regions
us_regionsregions           r   _infer_model_regionr    s    (/'?'?"">($E1 %/L 5<<^=Q=QR	
 g%..0??A
..0??A
		+++-<<>
++-<<>
			)668GGI
668GGI
			)//1@@B
//1@@B


''))  ''))  r   c                 L    U R                   S:X  a  g[        U S9nUb  US:X  a  gg)0
Return true/false if a deployment is in the EU
r  Tr   Fr  r  r   r  s     r   _is_region_eur     4     !!T) 'nELLD$8r   c                 L    U R                   S:X  a  g[        U S9nUb  US:X  a  gg)z0
Return true/false if a deployment is in the US
r  Tr  Fr  r  s     r   _is_region_usr  .  r  r   allowed_model_regionc                 &    U R                   U:X  a  gg)r  TF)r  )r   r  s     r   is_region_allowedr  <  s     !!%99r   r  c           	         SU R                   ;   a  [        U R                  [        5      (       a  [        U R                  [        5      (       a  U R                   R                  SS5      n[        R                  " 5       R                  UU R                  U R                  U R                  =(       d    [        R                  SU=(       d    SS9nUR                  SS5      nU$ g)	zE
Pass the litellm params for an azure model, and get back the region
r%  zazure/r   
   chat)r   rp  r   r  timeoutr  zx-ms-regionN)r   r   rp  r   r   r  r   AzureChatCompletionget_headersr  rm  r   )r   r  _modelr#  r  s        r   get_model_regionr  G  s     	>'''~--s33~..44%%--h; 446BB"**#,,&22Wg6W6W C 
 !)]D Ar   r   c                 f     U R                  S5      n[        U5      S S nU$ ! [         a     gf = f)Nr   r   r   )r   r   r   )r   	_messagess     r   get_first_chars_messagesr  a  s=    JJz*		N4C(	 s    # 
00c                 H    SR                  S U  5       5      n[        U5      $ )Nr   c              3   R   #    U  H  oR                  5       (       a  M  Uv   M     g 7fr   )isspace)r   chars     r   r   $_count_characters.<locals>.<genexpr>l  s     HTTDDTs   '	')r   r   )r  filtered_texts     r   _count_charactersr  j  s!    GGHTHHM}r   response_objc                 T   U R                   nSnU H  n[        U[        5      (       a3  UR                  R                  b  X#R                  R                  -  nMI  MK  [        U[
        5      (       d  Mb  UR                  R                  c  M{  X#R                  R                  -  nM     U$ )Nr   )r(  r   r@   r   r   rN   delta)r  _choicesresponse_strchoices       r   get_response_stringr  p  s    7C7K7KHLfg&&~~%%1 6 66 2 011||##/ 4 44  r   llm_providerdynamic_api_keyc                 x   U=(       d    [         R                  nU S:X  d  U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  d  U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  a-  U=(       d"    [         R
                  =(       d    [        S5      nU$ U S	:X  a-  U=(       d"    [         R                  =(       d    [        S
5      nU$ U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  d  U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  a-  U=(       d"    [         R                  =(       d    [        S5      nU$ U S:X  a=  U=(       d4    [         R                  =(       d    [        S5      =(       d    [        S5      nU$ )Nr|  rS  OPENAI_API_KEYrU  r  ANTHROPIC_API_KEYrX  AI211_API_KEYrZ  ALEPH_ALPHA_API_KEYbasetenBASETEN_API_KEYrT  r  COHERE_API_KEYr  HUGGINGFACE_API_KEYrY  NLP_CLOUD_API_KEYr  REPLICATE_API_KEYr  TOGETHERAI_API_KEYTOGETHER_AI_TOKEN)r   rp  
openai_keyr4   anthropic_keyai21_keyaleph_alpha_keybaseten_key
cohere_keyhuggingface_keynlp_cloud_keyreplicate_keytogetherai_api_key)r  r  rp  s      r   get_api_keyr    s   0Gx<3K#KOW//O:>N3OJ NG 
	$8H(HUW22UjAT6UD NA 
	LW--LO1L> N; 
	&Sw..S*=R2S 	8 N1 
	"QW00QJ?P4Q. N+ 
	!\]%BOW//O:>N3O( N% 
	&Sw..S*=R2S 	" N 
	$UW22UjAT6U N 
	$UW22UjAT6U N 
	& /))/.// -.	 	 Nr   c                      SS K n SSK J n  [        U S5      (       a  UR                  " U R                  5      $ UR                  " 5       $ )Nr   )rf  UTC)rf  rw  rg  r  utcnow)dtrf  s     r   get_utc_datetimer    s5    !r5||BFF##  r   c                 J   S n U [         R                  ;   aZ  S[         R                  U    ;   a  [         R                  U    S   $ S[         R                  U    ;   a  [         R                  U    S   $ [        U S9u  p  nUS:X  a  U" U S9nU$ U [         R                  ;   a\  S[         R                  U    ;   a  [         R                  U    S   $ S[         R                  U    ;   a  [         R                  U    S   $  g[        5       e! [         a    [        SU  S	35      ef = f)
a-  
Get the maximum number of output tokens allowed for a given model.

Parameters:
model (str): The name of the model.

Returns:
    int: The maximum number of tokens allowed for the given model.

Raises:
    Exception: If the model is not mapped yet.

Example:
    >>> get_max_tokens("gpt-4")
    8192
c                     SU  S3n [         R                  R                  U5      nUR                  5         UR	                  5       nUR                  S5      nUb  U$ g ! [
         a     g f = fNzhttps://huggingface.co/z/raw/main/config.jsonmax_position_embeddingsr   module_level_clientr   raise_for_statusr  r   
model_name
config_urlr#  config_jsonr  s        r   _get_max_position_embeddings4get_max_tokens.<locals>._get_max_position_embeddings  sv    .zl:OP
	2266zBH%%' #--/K&1oo6O&P#&2.. 		   AA 
A+*A+max_output_tokensrO  r  r  r  NzModel zr isn't mapped yet. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json)r   rJ  r   r   )r   r  r#  r3  rO  s        r   get_max_tokensr    s:   $&
G&&&"g&8&8&??))%01DEE!3!3E!::))%0>>+;%+H(Aq-/5GJG&&&"g&8&8&??))%01DEE!3!3E!::))%0>> ;  + 
UG  N  O
 	

s1   A D ,D 3D A D ,D <D >
D D"c                 2    [         R                  " SSU 5      $ )Nz-\d+$r   r  subr  s    r   _strip_stable_vertex_versionr    s    66(B
++r   c                 J    [         R                  " 5       R                  U 5      $ r   )r   rR  rS  r  s    r   _strip_bedrock_regionr    s    '')99*EEr   r  c                 2    [         R                  " SSU 5      $ )z
Strips the organization, custom suffix, and ID from an OpenAI fine-tuned model name.

input: ft:gpt-3.5-turbo:my-org:custom_suffix:id
output: ft:gpt-3.5-turbo

Args:
model_name (str): The full model name

Returns:
str: The stripped model name
z(:[^:]+){3}$r   r  r  s    r   !_strip_openai_finetune_model_namer    s     66/2z22r   c                     U(       a  US:X  a  [        U S9nU$ U(       a  US:X  d  US:X  a  [        U S9nU$ U(       a  US:X  a  [        U S9nU$ [        U S9nU$ )Nr&  r  r  r  r  )r  r  r  )r   r#  strip_bedrock_regionstrip_versionstrip_finetunes        r   _strip_model_namer  
  sl    2i?4F##	{*.AX.M4F	"5"E4F:eLr   c                 (    [         R                  U    $ r   )r   rJ  r  s    r   _get_model_info_from_model_costr    s    c""r   rZ  c                     U(       ap  SU ;   aj  U S   U:w  aa  US:X  a  U S   R                  S5      (       a  gUS:X  a  U S   R                  S5      (       a  gUS:X  a  U S   R                  S5      (       a  ggg)z?
Check if the model info provider matches the custom provider.
rR  r  Tr  r&  F)rm  rZ  r#  s     r   _check_provider_matchr    s     j()*.AA+-*3

*[
!3"  N2z8

*^
$8%  I-*3

*Y
3  r   )	TypedDictc                   H    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   Srg)	'PotentialModelNamesAndCustomLLMProvideri<  split_modelcombined_model_namestripped_model_namecombined_stripped_model_namer#  r  N)r'  
__module____qualname____firstlineno__r   __annotations____static_attributes__r  r   r   r  r  <  s     "%%r   r  c           
         Uc   [        U S9u  p!  nU n[        XS9nUnOU(       aJ  U R                  US-   5      (       a1  U R	                  S5      S   nU n[        X!S9nSR                  X5      nO5U nSR                  X5      n[        XS9nSR                  U[        XS95      n[        UUUU[        [        U5      S9$ ! [         a    U n Nf = f)Nr  r.  rW  re   z{}/{})r  r  r  r	  r#  )	r   r   r  rm  r_  r
  r  r_   r   )r   r#  r  r3  r  r  r	  s          r   _get_potential_model_namesr  D  s    "	 5EE5R2Ka $/
 (;$	!1!1c!" " kk#&q)#/
 (/~~(
$ %nn-@H/
 (/~~ES(
$
 3//%A &9: ;  	 K	 s   C CCc                     SU  S3n [         R                  R                  U5      nUR                  5         UR	                  5       nUR                  S5      nUb  U$ g ! [
         a     g f = fr  r  r  s        r   r  r  q  sx    *:,6KLJ..22:>!!# mmo #.//2K"L".** r  c                 H
    0 [         R                  E[         R                  EnX;   a  X    n Ub  US:X  a  SnUb\  US:X  aV  SU -   [         R                  ;   a  SU -   n O9U S-   [         R                  ;   a  U S-   n OU S-   [         R
                  ;   a  U S-   n [        XS9nUS   nUS   nUS	   nUS
   nUS   nUS:X  a  [        U S9n[        U USSSSSSSSSSSSS9$ US:X  d  US:X  a$  [         R                  " 5       R                  U 5      $  Sn	Sn
U[         R                  ;   a  Un
[        U
S9n	[        XS9(       d  Sn	U	c/  U [         R                  ;   a  U n
[        U
S9n	[        XS9(       d  Sn	U	c/  U[         R                  ;   a  Un
[        U
S9n	[        XS9(       d  Sn	U	c/  U[         R                  ;   a  Un
[        U
S9n	[        XS9(       d  Sn	U	c/  U[         R                  ;   a  Un
[        U
S9n	[        XS9(       d  Sn	U	b  U
c  [        S5      eUS:X  a  SU	S'   U	R                  S5      nUc'  [         R"                  " SR%                  X5      5        SnU	R                  S5      nUc'  [         R"                  " SR%                  X5      5        Sn[        S>0 SU
_SU	R                  SS5      _SU	R                  SS5      _S U	R                  S S5      _SU_S!U	R                  S!S5      _S"U	R                  S"S5      _S#U	R                  S#S5      _S$U	R                  S$S5      _S%U	R                  S%S5      _S&U	R                  S&S5      _S'U	R                  S'S5      _SU_S(U	R                  S(S5      _S)U	R                  S)S5      _S*U	R                  S*S5      _S+U	R                  S+S5      _S,U	R                  S,S5      _S-U	R                  S-S5      _S.U	R                  S.S5      _S/U	R                  S/U5      _S0U	R                  S05      _S1U	R                  S1S5      _SU	R                  SS5      _S2U	R                  S2S35      _S4U	R                  S4S35      _S5U	R                  S5S35      _S6U	R                  S6S35      _S7U	R                  S7S35      _S8U	R                  S8S35      _S9U	R                  S9S35      _S:U	R                  S:S5      _S;U	R                  S;S5      _6$ ! [&         a0  nS<[)        U5      ;   a  Ue['        S=R%                  X5      5      eSnAff = f)?zq
Helper for 'get_model_info'. Separated out to avoid infinite loop caused by returning 'supported_openai_param's
Nr  r  zmeta/z@latestr.  r  r  r	  r  r#  r  r  r   r  )r  rO  max_input_tokensr  rx  r{  rR  r  r*  r0  r7  supports_assistant_prefillrC  r?  r   r	  r  r  z|This model isn't mapped yet. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.jsonr  Tr0  rx  z`model={}, custom_llm_provider={} has no input_cost_per_token in model_cost_map. Defaulting to 0.r{  zamodel={}, custom_llm_provider={} has no output_cost_per_token in model_cost_map. Defaulting to 0.r  rO  r  r  cache_creation_input_token_costcache_read_input_token_costinput_cost_per_character&input_cost_per_token_above_128k_tokensinput_cost_per_queryrz  input_cost_per_audio_tokenoutput_cost_per_audio_tokenoutput_cost_per_character'output_cost_per_token_above_128k_tokens+output_cost_per_character_above_128k_tokensr|  output_cost_per_imageoutput_vector_sizerR  r  r*  rE  Fr7  r  rC  r=  rA  r?  rw  rv  OllamaErrorzThis model isn't mapped yet. model={}, custom_llm_provider={}. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.r  )r   r  azure_embedding_modelsrJ  rL  rO  r  r  rJ   rX  rF  rJ  r  r  rj  r   rf   r   r
  r   r   )r   r#  r  potential_model_namesr  r  r	  r  rO  _model_infor  _input_cost_per_token_output_cost_per_tokenr  s                 r   r;  r;    s   H
M**Mg.L.LM
%E*/BFV/V"-*/Bk/Q'">">>%"g&C&CC	)"g&C&CC	) :!
 44IJ34IJ'<*(
$ ,M:34IJ-/5GJ %!%"&%&&'!.)-)-*.+/(,#'   !H,0C}0T'')88?? 59K!%C"g&8&88)=#F,* #'K"u0B0B'B=#F,* #'K#0G4F4FF2=#F,* #'K"':g>P>P'P)=#F,* #'K"{g6H6H'H!=#F,* #'K"ck  S 
 #k1:>675@__&6! %,$$v}}
 )*%6Aoo'7" &-$$w~~
 *+&  @@&??<>@ "-1CT!J@ #.//2Et"L	@
 &;@ 1<5t1@ -8OO14-@ *5.*@ 8C<d8@$ &1__5KT%R%@& '2oo6Mt&T'@( ,7??0$,)@. '=/@0 -8OO14-1@6 +6///+7@< 9D=t9=@B =HOOA4=C@H (37OQU'VI@J '2oo6Mt&TK@L $/??3G#NM@N "-&(;"O@T !__V,U@V *5.*W@\ *5.*]@b !,0A5 Ic@d +6///+e@j ,7??0%,k@p )4-u)q@v &1__5KU%Sw@x '2oo6Mu&Uy@z $/??3G#O{@|  OOE40}@~  OOE40@ @B  
CF"G n  u  u
 	

s%   CS' /S' OS' '
T!1+TT!c                 `    [         R                  " XS9n[        U US9n[        S0 UDSU0D6nU$ )a  
Get a dict for the maximum tokens (context window), input_cost_per_token, output_cost_per_token  for a given model.

Parameters:
- model (str): The name of the model.
- custom_llm_provider (str | null): the provider used for the model. If provided, used to check if the litellm model info is for that provider.

Returns:
    dict: A dictionary containing the following information:
        key: Required[str] # the key in litellm.model_cost which is returned
        max_tokens: Required[Optional[int]]
        max_input_tokens: Required[Optional[int]]
        max_output_tokens: Required[Optional[int]]
        input_cost_per_token: Required[float]
        input_cost_per_character: Optional[float]  # only for vertex ai models
        input_cost_per_token_above_128k_tokens: Optional[float]  # only for vertex ai models
        input_cost_per_character_above_128k_tokens: Optional[
            float
        ]  # only for vertex ai models
        input_cost_per_query: Optional[float] # only for rerank models
        input_cost_per_image: Optional[float]  # only for vertex ai models
        input_cost_per_audio_token: Optional[float]
        input_cost_per_audio_per_second: Optional[float]  # only for vertex ai models
        input_cost_per_video_per_second: Optional[float]  # only for vertex ai models
        output_cost_per_token: Required[float]
        output_cost_per_audio_token: Optional[float]
        output_cost_per_character: Optional[float]  # only for vertex ai models
        output_cost_per_token_above_128k_tokens: Optional[
            float
        ]  # only for vertex ai models
        output_cost_per_character_above_128k_tokens: Optional[
            float
        ]  # only for vertex ai models
        output_cost_per_image: Optional[float]
        output_vector_size: Optional[int]
        output_cost_per_video_per_second: Optional[float]  # only for vertex ai models
        output_cost_per_audio_per_second: Optional[float]  # only for vertex ai models
        litellm_provider: Required[str]
        mode: Required[
            Literal[
                "completion", "embedding", "image_generation", "chat", "audio_transcription"
            ]
        ]
        supported_openai_params: Required[Optional[List[str]]]
        supports_system_messages: Optional[bool]
        supports_response_schema: Optional[bool]
        supports_vision: Optional[bool]
        supports_function_calling: Optional[bool]
        supports_prompt_caching: Optional[bool]
        supports_audio_input: Optional[bool]
        supports_audio_output: Optional[bool]
        supports_pdf_input: Optional[bool]
Raises:
    Exception: If the model is not mapped yet.

Example:
    >>> get_model_info("gpt-4")
    {
        "max_tokens": 8192,
        "input_cost_per_token": 0.00003,
        "output_cost_per_token": 0.00006,
        "litellm_provider": "openai",
        "mode": "chat",
        "supported_openai_params": ["temperature", "max_tokens", "top_p", "frequency_penalty", "presence_penalty"]
    }
r.  r  r  )r   r    r;  rI   )r   r#  r  r$  returned_model_infos        r   rF  rF  Y  sP    F &AA )/K
 $ 
/F r   python_type_namec                     [         R                  S[        R                  S[        R                  S[        R                  S[
        R                  S[        R                  SSS0nUR                  U S5      $ )	zConverts standard python types to json schema types

Parameters
----------
python_type_name : str
    __name__ of type

Returns
-------
str
    a standard JSON schema type, "string" if not recognized.
r  r  r  r  r  r  NoneTyper  )r   r'  r  floatr  r   r   r   )r)  python_to_json_schema_typess     r   json_schema_typer.    s]     	hiywxF# '**+;XFFr   c                     SSK nSSKJn  SSKJn  U R                  nUR                  " U 5      nU" U5      nSR                  US    Vs/ s H  oR                  5       PM     sn5      n	0 n
/ nUR                  " U 5      R                  nUR                  5        GHx  u  p[        US5      (       a   [        UR                  R                  5      nOSnSnSnUS    H  nUR                   U:X  d  M  [        US	5      (       aU  UR"                  nS
U;   a  UR%                  S5      S   nO#SU;   a   ['        [)        U" U5      5      5      nSn[        U5      nSR                  UR*                   Vs/ s H  oR                  5       PM     sn5      nM     UUUS.n[-        UR                  5        VVs/ s H!  u  nn[/        U[&        5      (       d  M  UU4PM#     snn5      X'   UR0                  UR2                  :X  d  GMg  UR5                  U5        GM{     UU	SU
S.S.nU(       a  UUS   S'   U$ ! [
         a  nUeSnAff = fs  snf ! [
         a     GNf = fs  snf s  snnf )a=  Using type hints and numpy-styled docstring,
produce a dictionnary usable for OpenAI function calling

Parameters
----------
input_function : function
    A function with a numpy-style docstring

Returns
-------
dictionnary
    A dictionnary to add to the list passed to `functions` parameter of `litellm.completion`
r   N)literal_eval)NumpyDocStringr  Summary
annotation
Parametersr   optionalr  {r  )r   r  r  r  r   r  r  r  r  r  r  )r   astr0  numpydoc.docscraper1  r   r'  getdocr   strip	signaturer  rl  rw  r.  r3  r  r   r_  r   r   descr   r   r  emptyr   )input_functionr   r0  r1  r  r  	docstringnumpydocr  r  r  r  
param_info
param_namer  
param_typeparam_description
param_enum
param_data
param_dictr  r  rV  s                          r   function_to_dictrJ    sR   $5 ""D~.Ii(H))0CD0C1WWY0CDEK JO"">2==J'--/
5,'')%*:*:*C*CDJJ 
 #<0J*,:v..!+J!Z/%/%5%5c%:1%=

*!),T,z2J-K)LJ)1J "2*!=J$(II*//.R/Qwwy/.R$S!! 1& ,

 "& * 0 0 2I 21jC6HVaV 2I"


 ==EKK'"":.O 0V "$
F +:|Z(MI   E:  ) ! ! /S JsA   H1 
I0I
0I2I I 1
I;H==I

IIc                 b    [         R                  " U 5      nUR                  US9n[        U5      $ )N)path)httpxURL	copy_withr   )original_urlnew_pathr  modified_urls       r   
modify_urlrS  !  s+    
))L
!C==h=/L|r   r   	num_callsrq  c                    SnSnU(       a  UnU(       a  Un[        U5       Vs/ s H	  nSUS./PM     n	n[        R                  " 5       n
 [        R                  " U U	UUUS9  [        R                  " 5       nX-
  nUSSS S.$ s  snf ! [         a*  n[        R                  " 5       nX-
  nUSSUS.s S nA$ S nAff = f)	NzHey, how's it goingr   r   r  r   )r   r   r#  r   rq  success)total_response_time
calls_madestatusr7  failed)rangetimer   batch_completionr   )r   r#  r   r   rT  rq  test_prompt
test_callsr3  r   r   r  response_timer  s                 r   load_test_modelrb  '  s     (KJ
DI*DUVDUq&[9:DUHVJ
   3'	
 99; -#0	
 	
 W$  
99; -#0	
 	

s#   B7B	 	
B=B82B=8B=c                     U S:X  a#  [         R                  " 5       R                  5       $ U S:X  a#  [         R                  " 5       R                  5       $ U S:X  a#  [         R                  " 5       R                  5       $ / $ )z,Return the fields required for each providerr  r   azure_ai)r   r]  get_required_paramsrX  AzureAIStudioConfigr#  s    r   get_provider_fieldsrh  R  sk     l*'')==??		(##%99;;	
	***,@@BB 	r   c            	      L   [        5       R                  5        V Vs0 s H  u  pXc  S O[        US9_M     nn n0 n0 n[        R                  " SS 5      nU(       a  UR                  S5      O/ nUR                  5        Hd  u  pUc0  [        R                  " 5       X0'   [        R                  " 5       X@'   M8  [        R                  " US9X0'   [        R                  " US9X@'   Mf     U H1  n[        R                  " 5       X1'   [        R                  " 5       XA'   M3     X44$ s  snn f )NrQ  NO_PROXYr  )proxy)	r   rl  r   osgetenvr_  rM  HTTPTransportAsyncHTTPTransport)r  r  proxiessync_proxy_mountsasync_proxy_mountsno_proxyno_proxy_urlsrk  s           r   !create_proxy_transport_and_mountsru  b  s    017799HC 	[Ten49  
  yyT*H+3HNN3'Mmmo
=%*%8%8%:"&+&>&>&@#%*%8%8u%E"&+&>&>U&K# & !&!4!4!6"'":":"<  001s   D rp  c                 L   Sn/ nU c  UUS.$  [        U S9u  pV  nU(       Ga  US:X  a+  S[        R                  ;   a  SnG
OOUR	                  S5        G
O<US:X  aU  S	[        R                  ;   a,  S
[        R                  ;   a  S[        R                  ;   a  SnG	OUR                  / SQ5        G	OUS:X  a+  S[        R                  ;   a  SnG	OUR	                  S5        G	OUS:X  a+  S[        R                  ;   a  SnG	OUR	                  S5        G	OUS:X  a+  S[        R                  ;   a  SnG	OaUR	                  S5        G	ONUS:X  a+  S[        R                  ;   a  SnG	O0UR	                  S5        G	OUS:X  aA  S[        R                  ;   a  S[        R                  ;   a  SnGOUR                  SS/5        GOUS:X  a+  S[        R                  ;   a  SnGOUR	                  S5        GOUS:X  a+  S[        R                  ;   a  SnGOUR	                  S5        GOtUS:X  a+  S[        R                  ;   a  SnGOVUR	                  S5        GOCUS:X  a+  S[        R                  ;   a  SnGO%UR	                  S5        GOUS :X  a+  S![        R                  ;   a  SnGOUR	                  S!5        GOUS":X  a+  S#[        R                  ;   a  SnGOUR	                  S#5        GOUS$:X  d  US%:X  aP  S&[        R                  ;   a  S'[        R                  ;   a  SnGOxUR	                  S&5        UR	                  S'5        GOTUS(;   a+  S)[        R                  ;   a  SnGO6UR	                  S)5        GO#US*:X  a+  S+[        R                  ;   a  SnGOUR	                  S+5        GOUS,:X  a+  S-[        R                  ;   a  SnGOUR	                  S-5        GOUS.:X  a+  S/[        R                  ;   a  SnGOUR	                  S/5        GOUS0:X  a+  S1[        R                  ;   a  SnGOrUR	                  S15        GO_US2:X  a+  S3[        R                  ;   a  SnGOAUR	                  S35        GO.US4:X  a+  S5[        R                  ;   a  SnGOUR	                  S55        GOUS6:X  a+  S7[        R                  ;   a  SnGOUR	                  S75        GOUS8:X  a+  S[        R                  ;   a  SnGOUR	                  S5        GOUS9:X  a+  S:[        R                  ;   a  SnGO}UR	                  S:5        GOjUS;:X  d  US<:X  a+  S=[        R                  ;   a  SnGOFUR	                  S=5        GO3US>:X  a+  S?[        R                  ;   a  SnGOUR	                  S?5        GOUS@:X  a+  SA[        R                  ;   a  SnGOUR	                  SA5        GOUSB:X  a+  SC[        R                  ;   a  SnGOUR	                  SC5        GOUSD:X  a+  SE[        R                  ;   a  SnGOUR	                  SE5        GOoUSF:X  a+  SG[        R                  ;   a  SnGOQUR	                  SG5        GO>USH:X  ag  SI[        R                  ;   d<  SJ[        R                  ;   d(  SK[        R                  ;   d  SL[        R                  ;   a  SnGOUR	                  SI5        GOUSM:X  ab  SN[        R                  ;   a,  SO[        R                  ;   d  SP[        R                  ;   a  SnGOUR	                  SN5        UR	                  SP5        GOgU [        R                  ;   d<  U [        R                  ;   d(  U [        R                  ;   d  U [        R                  ;   a+  S[        R                  ;   a  SnGOUR	                  S5        GOU [        R                  ;   a+  S[        R                  ;   a  SnGOUR	                  S5        GOU [        R                  ;   a+  S[        R                  ;   a  SnGOUR	                  S5        GOnU [        R                  ;   a+  S[        R                  ;   a  SnGOBUR	                  S5        GO/U [        R                  ;   a+  S[        R                  ;   a  SnGOUR	                  S5        GOU [        R                  ;   d+  U [        R                   ;   d  U [        R"                  S   ;   aA  S[        R                  ;   a  S[        R                  ;   a  SnGOUR                  SS/5        GOpU [        R$                  ;   a+  S[        R                  ;   a  SnGODUR	                  S5        GO1U [        R&                  ;   a*  S[        R                  ;   a  SnGOUR	                  S5        OU [        R(                  ;   a)  S[        R                  ;   a  SnOUR	                  S5        OU [        R*                  ;   a)  S[        R                  ;   a  SnOUR	                  S5        OyU [        R,                  ;   a)  S![        R                  ;   a  SnONUR	                  S!5        O<U [        R.                  ;   a(  S#[        R                  ;   a  SnOUR	                  S#5        Ub4  / nU H*  nSQUR1                  5       ;  d  M  UR	                  U5        M,     UnUb4  / nU H*  nSRUR1                  5       ;  d  M  UR	                  U5        M,     Un[3        U5      SS:X  a  SnX4S.$ ! [         a    Sn GNf = f)Ta  
Checks if the environment variables are valid for the given model.

Args:
    model (Optional[str]): The name of the model. Defaults to None.
    api_key (Optional[str]): If the user passed in an api key, of their own.

Returns:
    dict: A dictionary containing the following keys:
        - keys_in_environment (bool): True if all the required keys are present in the environment, False otherwise.
        - missing_keys (List[str]): A list of missing keys in the environment.
FN)keys_in_environmentmissing_keysr  r|  r  Tr%  AZURE_API_BASEr0  AZURE_API_KEY)ry  r0  rz  rU  r  rT  r  r  r  rV  OPENROUTER_API_KEYr  VERTEXAI_PROJECTr  r  r  rX  AI21_API_KEYr  r  rZ  r  r  r  rY  r  r&  r  AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)r   r	  OLLAMA_API_BASEr  ANYSCALE_API_KEYr*  DEEPINFRA_API_KEYr  GEMINI_API_KEYr  GROQ_API_KEYr  NVIDIA_NIM_API_KEYr  CEREBRAS_API_KEYr  XAI_API_KEYr  r  VOLCENGINE_API_KEYr  r,  CODESTRAL_API_KEYr  DEEPSEEK_API_KEYr  MISTRAL_API_KEYpalmPALM_API_KEYr+  PERPLEXITYAI_API_KEYr  VOYAGE_API_KEYr  FIREWORKS_AI_API_KEYFIREWORKS_API_KEYFIREWORKSAI_API_KEYFIREWORKS_AI_TOKENr(  CLOUDFLARE_API_KEYCLOUDFLARE_ACCOUNT_IDCLOUDFLARE_API_BASErp  r   r   )r   r   rl  environr   extendr   r  r^  open_ai_embedding_modelsopenai_image_generation_modelsr  r  replicate_modelsr`  rc  ra  models_by_providerhuggingface_modelsre  together_ai_modelsrg  baseten_modelsrf  r  r   )	r   rp  r   rw  rx  r3  r#  new_missing_keysr  s	            r   validate_environmentr  ~  s;	   "   L}#6(
 	

#'7e'D$1 (*2::-&*###$45 G+ BJJ.'2::5#rzz1&*###L !K/"bjj0&*###$78 H,2::-&*###$45 K/"bjj0&*###$78 L0#rzz1&*###$89 K/!RZZ/4G2::4U&*###%79L$MN M1$

2&*###$9: F*+&*###N3 M1#rzz1&*###$89 M1$

2&*###$9: I- BJJ.&*###$56 K/"bjj0&*###$78 I-1D1S#rzz1+rzz9&*###$78##$;< $== BJJ.&*###$56 J.!RZZ/&*###$67 K/"bjj0&*###$78 H,2::-&*###$45 F*+&*###N3 L0#rzz1&*###$89 J.!RZZ/&*###$67 E)

*&*###M2 K/+&*###N3 L0#rzz1&*###$89;."&AA"bjj0&*###$78 J.!RZZ/&*###$67 I- BJJ.&*###$56 F*+&*###N3 L0%3&*###$:; H,2::-&*###$45 N2&"**4&"**4(BJJ6'2::5&*###$:; L0#rzz1'2::5(BJJ6&*###$89##$9: W;;;>>>888>>>2::-&*###$45g..."bjj0&*###$78g+++2::-&*###$45g..."bjj0&*###$78g///#rzz1&*###$89 W///22222;??!RZZ/4G2::4U&*###%79L$MNg000$

2&*###$9:g)))+&*###N3g000#rzz1&*###$89g000$

2&*###$9:g,,, BJJ.&*###$56g..."bjj0&*###$78C		+ '',   (C, '',   (
<A"#6UU}  #"#s   l l#"l#c                  .    [         R                  " U 0 UD6$ r   )r   r   )r  r   s     r   acreater    s    ///r   c                    SR                  S U 5       5      nSnSU ;   a)   SS KnSSKJnJnJn  U" 5       nUR                  U5      nU$ [        [        R                  " U5      5      nU$ ! [         a    [        S5         N\f = f)Nr  c              3   *   #    U  H	  oS    v   M     g7f)r   Nr  )r   r   s     r   r   *prompt_token_calculator.<locals>.<genexpr>  s     ?h7I&hs   r   claudez:Anthropic import failed please run `pip install anthropic`)	AI_PROMPTHUMAN_PROMPT	Anthropic)
r   rU  r   r  r  r  count_tokensr   r   r  )	r   r   r  r  rU  r  r  r  anthropic_objs	            r   prompt_token_calculatorr    s    88?h??DJ5	T 	A@!"//5
  ./
  	TRS	Ts   A+ +BBc                      U [         R                  ;   d  U [         R                  ;   a   [        R                  R                  U 5        g SSS./n[         R                  " XS9  g ! [         a    [        SU SS9ef = f)Nr   zHello WorldrV  r   r   r   )r   r   r  )	r   r  r^  r|  modelsretriever   r   ro   r  s     r   valid_modelr    ss    H W;;;>>>MM""5)!'MBCHU> HbBGGHs   AA% 
A% %A;c                 t    SSS./n [         R                  " XUSS9  g! [         a     g[         a     gf = f)a;  
Checks if a given API key is valid for a specific model by making a litellm.completion call with max_tokens=10

Args:
    model (str): The name of the model to check the API key against.
    api_key (str): The API key to be checked.

Returns:
    bool: True if the API key is valid for the model, False otherwise.
r   zHey, how's it going?rV  r  )r   r   rp  rO  TF)r   r   rn   r   )r   rp  r   s      r   check_valid_keyr    sN      ,BCDHG	
   s    
7	77r  c                 <    U S:X  a  gU S:X  a  gU S:X  a  gU S:  a  gg)a  
Retries on 408, 409, 429 and 500 errors.

Any client error in the 400-499 range that isn't explicitly handled (such as 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, etc.) would not trigger a retry.

Reimplementation of openai's should retry logic, since that one can't be imported.
https://github.com/openai/openai-python/blob/af67cfab4210d8e497c05390ce14f39105c77519/src/openai/_base_client.py#L639
i  Ti  i  r  Fr  )r  s    r   _should_retryr    s9     c c c cr   c                     U c  g[        U [        5      (       a  U $ [        R                  R	                  U 5      (       d  [        SU  35      eS[        R                  " U 5      U R                  SS.S.$ )z|
Re-implementation of openai's 'type_to_response_format_param' function

Used for converting pydantic object to api schema.
Nz#Unsupported response_format type - r   T)r"  r  r  )r   r   )	r   r   r   r+  r,  r0  r   to_strict_json_schemar'  r!  s    r   r-  r-    s{     /4((
   22?CC=o=NOPP 55oF#,,
 r   response_headersc                 \    SSK nU b  U R                  S5      n [        U5      nU$ SnU$ ! [         ac    UR                  R                  U5      nUc  Sn U$ UR                  R                  U5      n[        U[        R                  " 5       -
  5      n U$ f = f! [         a    Sn gf = f)z
Reimplementation of openai's calculate retry after, since that one can't be imported.
https://github.com/openai/openai-python/blob/af67cfab4210d8e497c05390ce14f39105c77519/src/openai/_base_client.py#L631
r   Nzretry-afterr  )emailr   r  r   r  parsedate_tz	mktime_tzr]  )r  r  retry_headerretry_afterretry_date_tuple
retry_dates         r   &_get_retry_after_from_exception_headerr  2  s     '+//>L@!,/  K  @#(;;#;#;L#I #+"$K  "'!6!67G!HJ"%j499;&>"?K @  sB   B , B B *BB <BB BB B+*B+remaining_retriesr  min_timeoutc                     [        U5      nUb  SUs=:  a  S::  a   U$   SnSnX-
  n[        U[        SU5      -  U5      nSS[        R                  " 5       -  -
  n	X-  n
X:  a  U
$ U$ )Nr   <   g      ?g       @g       @re   g      ?)r  r  powrandom)r  r  r  r  r  initial_retry_delaymax_retry_delay
nb_retriessleep_secondsjitterr  s              r   _calculate_retry_afterr  T  s     99IJK 1{#8b#8 $9 O0J +c#z.BBOTM ''F$G,7=+=r   rolesinitial_prompt_valuefinal_prompt_valuec                 h    [        U S9S   n UUUS.[        R                  U '   [        R                  $ )a  
    Register a prompt template to follow your custom format for a given model

    Args:
        model (str): The name of the model.
        roles (dict): A dictionary mapping roles to their respective prompt values.
        initial_prompt_value (str, optional): The initial prompt value. Defaults to "".
        final_prompt_value (str, optional): The final prompt value. Defaults to "".

    Returns:
        dict: The updated custom prompt dictionary.
    Example usage:
    ```
    import litellm
    litellm.register_prompt_template(
            model="llama-2",
        initial_prompt_value="You are a good assistant" # [OPTIONAL]
            roles={
            "system": {
                "pre_message": "[INST] <<SYS>>
", # [OPTIONAL]
                "post_message": "
<</SYS>>
 [/INST]
" # [OPTIONAL]
            },
            "user": {
                "pre_message": "[INST] ", # [OPTIONAL]
                "post_message": " [/INST]" # [OPTIONAL]
            },
            "assistant": {
                "pre_message": "
" # [OPTIONAL]
                "post_message": "
" # [OPTIONAL]
            }
        }
        final_prompt_value="Now answer as best you can:" # [OPTIONAL]
    )
    ```
    r  r   )r  r  r  )r   r   rn  )r   r  r  r  s       r   register_prompt_templater  n  s=    R 5)!,E 40)Gu%
 %%%r   c                   `    \ rS rSr  SS\\   S\\   4S jjrS rS r	S\
4S	 jrS
 rS rSrg)TextCompletionStreamWrapperi  Nr   r#  c                 4    Xl         X l        X0l        X@l        g r   )completion_streamr   r   r#  )selfr  r   r   r#  s        r   __init__$TextCompletionStreamWrapper.__init__  s     "3
,#6 r   c                     U $ r   r  r  s    r   __iter__$TextCompletionStreamWrapper.__iter__      r   c                     U $ r   r  r  s    r   	__aiter__%TextCompletionStreamWrapper.__aiter__  r  r   r  c           	      6    [        5       nUR                  SS 5      US'   SUS'   UR                  SS 5      US'   UR                  SS 5      US'   [        5       n[        U[        5      (       a  [
        eUS   S   S   S	   US
'   US   S   S   US'   US   S   S   US'   U/US'   U R                  (       a4  U R                  R                  SS5      SL a  UR                  SS 5      US'   U$ ! [
         a  n[        SU S[        U5       35      eS nAff = f)Nr   r  r  createdr   r(  r   r  r   r  r  finish_reasoninclude_usageFTusagez=Error occurred converting to text completion object - chunk: z	; Error: )rP   r   rO   r   r@   r   r   r   )r  r  r#  text_choicesr  s        r   !convert_to_text_completion_object=TextCompletionStreamWrapper.convert_to_text_completion_object  sJ   	-/H"YYtT2HTN!2HX"'))It"<HY %		'4 8HW&=Lw   #(#3A#6w#?	#JL $))$4Q$7$@L!,1),<Q,?,PL)#/.HY ##''++OUCtK$)IIgt$<!O 	OPUwV_`cde`f_gh 	s   C,C/ /
D9DDc           	          [        5          U R                   H#  nUS:X  d  Uc  [        eU R                  US9nUs  $    [        e! [         a    [        e[         a/  n[        U R                  U R                  =(       d    SU0 0 S9eS nAff = f)NNoner  r   )r   r#  original_exceptioncompletion_kwargsextra_kwargs)rP   r  r   r  StopIterationr   r   r#  )r  r  processed_chunkr  s       r   __next__$TextCompletionStreamWrapper.__next__  s     	//F?em#O"&"H"Hu"H"U&&	 0
   	  	 jj$($<$<$B#$"$ 	s   0A A B*BBc                    #     U R                     S h  vN nUS:X  d  Uc  [        eU R                  US9nUs  $  N&
 [        e! [         a    [        ef = f7f)Nr  r  )r  r   r  r  StopAsyncIteration)r  r  r  s      r   	__anext__%TextCompletionStreamWrapper.__anext__  sg     	%#55 'eF?em#O"&"H"Hu"H"U&&	'5
   	%$$	%s5   AA =;="A A=A AA)r  r#  r   r   NN)r'  r
  r  r  r[   r   r   r  r  r  rK   r  r  r  r  r  r   r   r  r    sK    
 *.-1
7 !	
7
 &c]
7} <*	%r   r  c              #     #    [        U[        R                  5      (       a  Ue[        S[	        U5      S5       H  n[        SXUS-    S9nUc  XPR                  S   l        Oj/ n[        U5       HS  n[        R                  R                  U[        R                  R                  SXUS-    S9S9nUR                  U5        MU     X`l        U v   M     g 7fNr   r  	assistantrV  )r  r  r   r   MockExceptionr\  r   rB   r(  r  r  rN   r   	r3  mock_responser   r  icompletion_obj_all_choicesj_streaming_choices	            r   mock_completion_streaming_objr    s      -!6!6771c-(!,K1q59QR9.<""1%+L1X$+MM$B$B!----(-AE2J .  %C %! ##$56  &2" -s   CCc                  #    [        U[        R                  5      (       a  Ue[        S[	        U5      S5       H  n[        SXUS-    S9nUc  XPR                  S   l        Oj/ n[        U5       HS  n[        R                  R                  U[        R                  R                  SXUS-    S9S9nUR                  U5        MU     X`l        U 7v   M     g 7fr  r  r  s	            r   #async_mock_completion_streaming_objr  	  s      -!6!6771c-(!,K1q59QR9.<""1%+L1X$+MM$B$B!----(-AE2J .  %C %! ##$56  &2" -s   CCc                      SS K nUR                  " 5         [        U S5       n[        R                  " U5      nS S S 5        U$ ! , (       d  f       W$ = f! [
         a  nUeS nAff = f)Nr   r)rl  getcwdopenr  loadr   )config_pathrl  config_fileconfigr  s        r   read_config_argsr  !  s]    

		+s#{YY{+F $ 	 $#  s3   !A A	A 
AA A 
A' A""A'c                  .   U R                  S0 5      nS n[        5       n0 n[        R                  " 5       nU S   nU S   /UR                  S/ 5      -   nSU;   a  US	 [	        [
        R                  " 5       5      nUGcG  [        R                  " 5       U-
  S:  Ga*  U GH  n	 [        U	[        5      (       a=  U	R                  SS 5      U S'   U	R                  SS 5      U S'   U	R                  SU5      n	OJX;   aE  UR                  U	5      (       a-  [        R                  " 5       XI   :  a  UR                  U	5        OM  U R                  S5      (       a  U S	 [        SU	 35        XS'   0 U EUEn [        R                  " S0 U DSU	0D6n[        S	U 35        Ub  Us  $ GM     Uc  [        R                  " 5       U-
  S:  a  GM*  U$ ! [         aB  n
[        U
5        UR                  U	5        [        R                  " 5       S
-   XI'    S n
A
GMq  S n
A
ff = f)Nr   r   	fallbacks-   rp  r   +trying to make completion call with model: r   
response: r  r  )r   r   r]  r   r   rh  ri  r   r   remover   r   r   r   addr   nested_kwargsr#  rate_limited_modelsmodel_expiration_timesr   original_modelr  r   r   r  s              r   completion_with_fallbacksr  2  s   JJx,MH%JG_N!M$5$5k2$FFIm#+&$**,'O 
tyy{Z7"<E*4  ).		)T(BF9%).:t)DF:&!IIg~>E0 /22599 IIK+A+HH+22! ! ::g&&w KE7ST,;()# #--DDeD
8*56'#O (G  
tyy{Z7"<\ O  a #''.IIK"$ '- s    #BG?AG
H6HHc                  b  #    U R                  S0 5      nS n[        5       n0 n[        R                  " 5       nU S   nU S   /UR                  S/ 5      -   nSU;   a  US	 SU ;   a  U S	 [	        [
        R                  " 5       5      nUGcO  [        R                  " 5       U-
  S:  Ga2  U GH	  n	 [        U	[        5      (       a=  U	R                  SS 5      U S'   U	R                  SS 5      U S'   U	R                  SU5      n	OJX;   aE  UR                  U	5      (       a-  [        R                  " 5       XI   :  a  UR                  U	5        OM  U R                  S5      (       a  U S	 [        SU	 35        XS	'   0 U EUEn [        R                  " S0 U DSU	0D6I S h  vN n[        S
U 35        Ub  Us  $ GM     Uc  [        R                  " 5       U-
  S:  a  GM2  U$  NB! [         aE  n
[        SU
 35        UR                  U	5        [        R                  " 5       S-   XI'    S n
A
GM~  S n
A
ff = f7f)Nr   r   r  r   r  rp  r   r  r   r  zerror: r  r  )r   r   r]  r   r   rh  ri  r   r   r  r   r   r   r   r  r  s              r   async_completion_with_fallbacksr   p  s<    JJx,MH%JG_N!M$5$5k2$FFIm#+&
 $**,'O 
tyy{Z7"<E*4  ).		)T(BF9%).:t)DF:&!IIg~>E0 /22599 IIK+A+HH+22! ! ::g&&w KE7ST,;()# ")!4!4!Kv!KU!KK
8*56'#O (G  
tyy{Z7"<\ O L
  sm,#''.IIK"$ '- sV   B+H/.BGH/
AGGG/'H/H/G
H,'9H' H/'H,,H/c                     SU S.n[        U/U5      nXA:  a$  [        S5        [        X1U5      n[        U/U5      nX1U-
  4$ )Nr  rV  zH`tokentrimmer`: Warning, system message exceeds token limit. Trimming...)get_token_countr   shorten_message_to_fit_limit)system_messagerO  r   system_message_eventsystem_message_tokensnew_system_messages         r   process_system_messager(    sc    $,H+-A,BEJ)V	
 : e
 !01C0De L.C!CCCr   c           	      v    U S S S2   n / nU  H(  n[        X25      nX-
  nUS::  a    U$ [        UUUUUS9nM*     U$ )Nr  r  )final_messagesr   available_tokensrO  r   )r"  attempt_message_addition)r   rO  r   r*  r   used_tokensr+  s          r   process_messagesr.    sg    "~HN%n<%3q   2)-!
  r   c                     U/U -   n[        XTS9nXc::  a  U$ SU;  a#  [        XU5      n[        XpX45      (       a  U/U -   $ U $ )Nr   r   r  )r"  r#  can_add_message)r*  r   r+  rO  r   temp_messagestemp_message_tokensupdated_messages           r   r,  r,    s_     I.M)=N( 
	'6wRWX?JNN#$~55r   c                 ,    [        X/-   U5      U::  a  ggr  )r"  )r   r   rO  r   s       r   r1  r1    s    x)+U3zAr   c                     [        XS9$ )Nr  )r"  r0  s     r   r"  r"    s    u88r   c                     Ub  SU;   a  US::  a  U $ U S   n [        U /U5      nXA::  a   U $ X-  n[        [        U5      U-  5      S-
  n[        SU5      nUS-  nUSU nX7* S n	US-   U	-   n
XS'   U
nM^  )	zW
Shorten a message to fit within a token limit by removing characters from the middle.
Ngptr  r   re   r   r  z..)r"  r  r   r  )r   tokens_neededr   r   total_tokensratio
new_lengthhalf_length	left_half
right_halftrimmed_contents              r   r#  r#    s     Ue^0Ci G
&y%8( N .W-.2
J'
 AoL[)	\]+
#d*Z7,	!# r   
trim_ratioreturn_response_tokensc                 
   [         R                  " U 5      n  Uc[  U[        R                  ;   aE  [        R                  U   R	                  S[        R                  U   S   5      n[        XR-  5      nOU $ SnU  H"  nUS   S:X  d  M  Xf(       a  SOS-  nXgS   -  nM$     / n[        U 5       H  nUS   S	:w  a    OUR                  U5        M!     [        U5      (       a  U S[        U5      *  n [        U=(       d    SU S
9n	[        SU	 SU 35        X:  a  U $ [        SU  SU	 SU 35        Sn
U(       a1  [        XdUS9u  pUS:X  a  U
/$ U  Vs/ s H  owS   S:w  d  M  UPM     n n[        XUS9nU
(       a  U
/U-   n[        U5      S:  a  UR                  U5        U(       a  U[        X5      -
  nX4$ U$ s  snf ! [         a:  n[         R"                  " SR%                  ['        U5      5      5        U s SnA$ SnAff = f)a  
Trim a list of messages to fit within a model's token limit.

Args:
    messages: Input messages to be trimmed. Each message is a dictionary with 'role' and 'content'.
    model: The LiteLLM model being used (determines the token limit).
    trim_ratio: Target ratio of tokens to use after trimming. Default is 0.75, meaning it will trim messages so they use about 75% of the model's token limit.
    return_response_tokens: If True, also return the number of tokens left available for the response after trimming.
    max_tokens: Instead of specifying a model or trim_ratio, you can specify this directly.

Returns:
    Trimmed messages and optionally the number of tokens available for response.
Nr  rO  r   r  r  r  r   r  r  zCurrent tokens: z, max tokens: zNeed to trim input messages: z, current_tokensz, max_tokens: )r$  rO  r   r   )r   rO  r   z'Got exception while token trimming - {})r   r   r   rJ  r   r  r   r   r   r"  r   r(  r.  r  r"  r   rf   r7  r
  r   )r   r   rA  rB  rO  max_tokens_for_modelr$  r   tool_messagescurrent_tokensr%  r*  response_tokensr  s                 r   trim_messagesrH    sE   , }}X&HL***'.'9'9%'@'D'D&(:(:5(A,(O($ !!5!BC

  Gv(*.$b@)"44   )Gv&(  ) *
 } 53}#5"56H&U[b8L((8zlST &O 	+H:5EnEUUcdncop	
 04/E-E0,  Q,-- 08WxG6?h;VxHW)E

  23nDN}!!!-0 #(?>+QQO!22% X&    5<<SVD	
 	sV   AF> 6F> BF> 1F> F> F9 F9&AF> 7F> 9F> >
H/G=7H=Hc                      [         R                  R                  5       n / n/ n[        R                   H@  nUR                  SS5      nUR                  5        S3nX@;   d  M/  UR                  U5        MB     U HM  nUS:X  a  UR                  S5        M  [        R                  R                  U/ 5      nUR                  U5        MO     U$ ! [         a    / s $ f = f)zx
Returns a list of valid LLMs based on the set environment variables

Args:
    None

Returns:
    A list of valid LLMs
r3  r   _API_KEYr%  z	Azure-LLM)rl  r  r  r   r   r  upperr   r  r   r  r   )environ_keysvalid_providersvalid_modelsr   expected_provider_keymodels_for_providers         r   get_valid_modelsrQ    s    zz(--H''R0H (0~~'7&8$A!$4&&x0 . (H7"##K0&-&@&@&D&DXr&R###$78 (  	s   AC #A)C CCc           	          SU;   a  US   SL a  U R                   S:X  a  g SU;   a  US   SL a  U R                   S:X  a  g SU;   a  US   SL a  U R                   S:X  a  g SR                  [        [        U5      5      nSR                  S	 UR	                  5        5       5      n[        S
5        [        S5        U(       a'  U(       a   [        SU R                    SU SU S35        OaU(       a  [        SU R                    SU S35        O=U(       a  [        SU R                    SU S35        O[        SU R                    S35        [        S
5        g ! [         a     g f = f)Nr   Tr   r   r   r?  img_generationz, c              3   F   #    U  H  u  pU S [        U5       3v   M     g7f)=N)repr)r   r  r   s      r   r   /print_args_passed_to_litellm.<locals>.<genexpr>  s!     W*##aU}5s   !r  z[92mRequest to litellm:[0mz[92mlitellm.(z)[0mz()[0m)r'  r   maprV  rl  r   r   )r   r  r   args_str
kwargs_strs        r   re  re    sw   . V#}%-!**l:F"|$,!**k9'()T1!**.>>99St_-YYWWW
	
 	0	
 F"#4#=#=">azJ<W_` "#4#=#=">azR "#4#=#=">a
|8T ,->-G-G,H	RSd s#   E E  E C5E 
E"!E"c                 z     SU R                  S5      -   S-   UR                  S5      -   nU$ ! [         a     g f = f)Nztime-z%H-%M-%S-%fr3  r   )strftimer   r   )r   r  response_ids      r   get_logging_idr_    sO    j))-883>AQAQRVAWW 	  s   *- 
::r   c                 j    U c  g U b,  U R                  S0 5      nUb  UR                  SS 5      nUb  U$ g )NrZ  rQ  r   )r   rZ  rQ  s      r   r  r    sH     \\,3
!#d;J%!!r   c                     U c  g U R                  S0 5      nUb2  UR                  SS 5      nUb  U$ UR                  S0 5      n[        US9$ g )Nr   rQ  r   ry  )r   r  )model_call_detailsr   _base_modelr   s       r   _get_base_model_from_metadatare    sb    !'++,<bAN!$((t<"!%%j"598LLr   c                   B    \ rS rSrSS\S\4S jjrS rS rS r	S r
S	rg
)ModelResponseIteratori  r3  convert_to_deltac                     USL aZ  [        SS9U l        U R                  R                  S   R                  nUR                  S   R                  R
                  Ul        OXl        SU l        g )NT)r   r   F)rK   r3  r(  r  r   r   is_done)r  r3  rh  _deltas       r   r  ModelResponseIterator.__init__  s^    t#"/t"<D((00399F+33A6>>FFFN"0r   c                     U $ r   r  r  s    r   r  ModelResponseIterator.__iter__  r  r   c                 V    U R                   (       a  [        eSU l         U R                  $ NT)rj  r  r3  r  s    r   r  ModelResponseIterator.__next__  s"    <<"""r   c                     U $ r   r  r  s    r   r  ModelResponseIterator.__aiter__  r  r   c                 ^   #    U R                   (       a  [        eSU l         U R                  $ 7frp  )rj  r  r3  r  s    r   r  ModelResponseIterator.__anext__  s%     <<$$"""s   +-)rj  r3  N)F)r'  r
  r  r  rK   r  r  r  r  r  r  r  r  r   r   rg  rg    s)    }  ##r   rg  c                   2    \ rS rSrS rS rS rS rS rSr	g)	ModelResponseListIteratori   c                     Xl         SU l        g Nr   )model_responsesr  )r  rz  s     r   r  "ModelResponseListIterator.__init__!  s    .
r   c                     U $ r   r  r  s    r   r  "ModelResponseListIterator.__iter__&  r  r   c                     U R                   [        U R                  5      :  a  [        eU R                  U R                      nU =R                   S-  sl         U$ Nre   )r  r   rz  r  r  r3  s     r   r  "ModelResponseListIterator.__next__)  sF    ::T1122--djj9

a
r   c                     U $ r   r  r  s    r   r  #ModelResponseListIterator.__aiter__1  r  r   c                    #    U R                   [        U R                  5      :  a  [        eU R                  U R                      nU =R                   S-  sl         U$ 7fr  )r  r   rz  r  r  s     r   r  #ModelResponseListIterator.__anext__4  sI     ::T1122$$--djj9

a
s   AA)r  rz  N)
r'  r
  r  r  r  r  r  r  r  r  r  r   r   rw  rw     s    
r   rw  c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )CustomModelResponseIteratori<  c                 "   > [         TU ]  5         g r   )superr  )r  	__class__s    r   r  $CustomModelResponseIterator.__init__=  s    r   r  )r  N)r'  r
  r  r  r  r  __classcell__)r  s   @r   r  r  <  s     r   r  r   c                     SU ;  a  gU S   b  [        U S   [        5      (       a  gU S    H0  nUS   S:X  d  M  UR                  S5      c  M"  US   S   S:X  d  M0    g   g)z
Returns true, if message is marked as needing to be cached.

Used for anthropic/gemini context caching.

Follows the anthropic format {"cache_control": {"type": "ephemeral"}}
r   Fr   r  cache_control	ephemeralTr   )r   r   s     r   is_cached_messager  A  sr     y!Z	0BC%H%H9%FOv%O,8(0K? & r   r  c                      U R                  S5      (       d  gU R                  S5      S   n [        R                  " U SS9n[        R                  " U5      R                  S5      U :H  $ ! [         a     gf = f)Nzdata:Fr  re   T)validatezutf-8)rm  r_  base64	b64decode	b64encoder  r   )r  decoded_bytess     r   is_base64_encodedr  Y  sz    ||
 
 GGCLO ((T: .55g>!CC s   A* AA* *
A76A7c                 >    U  H  nUR                  S5      c  M    g   g)za
Returns true, if messages has tool call blocks.

Used for anthropic/bedrock message validation.
r  TFra  )r   r   s     r   has_tool_call_blocksr  l  s%     ;;|$0  r   c           
      0    [        S[        SSS0 S.S9S9/$ )z
Prevent Anthropic from raising error when tool_use block exists but no tools are provided.

Relevent Issues: https://github.com/BerriAI/litellm/issues/5388, https://github.com/BerriAI/litellm/issues/5747
r  
dummy_toolzThis is a dummy tool callr  r7  r8  )r   r  )r8   r9   rg  s    r   add_dummy_toolr  x  s2     	 9!7$"$
	
 r   )ChatCompletionAudioObjectChatCompletionImageObjectChatCompletionTextObjectChatCompletionUserMessageOpenAIMessageContentValidUserMessageContentTypesc                     [        U [        5      (       a  U R                  SS9$ [        U [        5      (       a  U $ [	        S[        U 5       S35      e)z
Converts a message to a dictionary if it's a Pydantic model.

Args:
    message: The message, which may be a Pydantic model or a dictionary.

Returns:
    dict: The converted message.
T)exclude_nonezInvalid message type: z". Expected dict or Pydantic model.)r   r   
model_dumpr   r0  r   )r   s    r   convert_to_dictr    sU     '9%%!!t!44	GT	"	"$T']O3UV
 	
r   c                     U  Vs/ s H*  n[        [        [        [        [        U5      5      5      PM,     n n[	        U S9$ s  snf )zA
Ensures all messages are valid OpenAI chat completion messages.
rC  )r_   r5   r  r   &validate_chat_completion_user_messages)r   r   s     r   !validate_chat_completion_messagesr    sG     IQHP1tD!}=>   28DD	s   1Ac           	         [        U 5       H  u  p US   S:X  a  UR                  S5      nUbt  [        U[        5      (       a  M:  [        U[        5      (       aF  U H>  n[        U[
        5      (       d  M  UR                  S5      [        ;  d  M5  [        S5      e   M  M  M  M     U $ ! [         a(  nS[        U5      ;   a  [        SU SU S	35      eUeSnAff = f)
a  
Ensures all user messages are valid OpenAI chat completion messages.

Args:
    messages: List of message dictionaries
    message_content_type: Type to validate content against

Returns:
    List[dict]: The validated messages

Raises:
    ValueError: If any message is invalid
r  r   r   Nr   zinvalid content typezInvalid user message=z
 at index zL. Please ensure all user messages are valid OpenAI chat completion messages.)r   r   r   r   r   r   r  r   )r   r  r   user_contentr  r  s         r   r  r    s     H%	yF" uuY/+!,44 #L$77$0D)$55#'88F#3;W#W*34J*K$K %1 8 , # &( O  	%Q/+A3j  >J  K  	s)   2B+-B+7B+B++
C5#CCc                   t    \ rS rSr\S\S\S\4S j5       r\S\S\S\	4S j5       r
\S\S\S\4S j5       rSrg	)
ProviderConfigManageri  r   r   r  c                    [         R                  R                  U S9(       a  [         R                  " 5       $ [         R                  R
                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                   " 5       $ [         R                  R"                  U:X  a  [         R$                  " 5       $ [         R                  R&                  U:X  a  [         R(                  " 5       $ [         R                  R*                  U:X  a  [         R,                  " 5       $ [         R                  R.                  U:X  a  [         R0                  " 5       $ [         R                  R2                  U:X  a  SU ;   a  [         R4                  " 5       $ GO[         R                  R6                  U:X  a  [         R8                  " 5       $ [         R                  R:                  U:X  a  [         R<                  " 5       $ [         R                  R>                  U:X  a  [         R@                  " 5       $ [         R                  RB                  U:X  a  [         RD                  " 5       $ [         R                  RF                  U:X  a  [         RH                  " 5       $ [         R                  RJ                  U:X  a  [         RL                  " 5       $ [         R                  RN                  U:X  a  [         RP                  " 5       $ [         R                  RR                  U:X  a  [         RT                  " 5       $ [         R                  RV                  U:X  a  [         RX                  " 5       $ [         R                  RZ                  U:X  dZ  [         R                  R\                  U:X  d<  [         R                  R^                  U:X  d  [         R                  R`                  U:X  a  [         Rb                  " 5       $ [         R                  Rd                  U:X  a  [         Rf                  " 5       $ [         R                  Rh                  U:X  a  [         Rj                  " 5       $ [         R                  Rl                  U:X  a  [         Rn                  " 5       $ [         R                  Rp                  U:X  a  [         Rr                  " 5       $ [         R                  Rt                  U:X  a  [         Rv                  " 5       $ [         R                  Rx                  U:X  a  [         Rz                  " 5       $ [         R                  R|                  U:X  a  [         R~                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  d  [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  Rd                  U:X  a  [         Rf                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  d  [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R6                  U:X  a  [         R8                  " 5       $ [         R                  R.                  U:X  a  [         R0                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  " 5       $ )z3
Returns the provider config for a given provider.
r  r  )or   openAIO1Configis_model_o1_reasoning_modelOpenAIO1ConfigrG   DEEPSEEKDeepSeekChatConfigGROQrf  
DATABRICKSr]  XAIr`  TEXT_COMPLETION_OPENAIOpenAITextCompletionConfigCOHERE_CHATr=  COHEREr<  CLARIFAIClarifaiConfig	ANTHROPICr:  ANTHROPIC_TEXTr;  	VERTEX_AIrH  
CLOUDFLARErW  SAGEMAKER_CHATSagemakerChatConfig	SAGEMAKERrQ  r2  rb  
FRIENDLIAIFriendliaiChatConfigWATSONXri  WATSONX_TEXTr8  EMPOWEREmpowerChatConfigGITHUBGithubChatConfigCUSTOMCUSTOM_OPENAIOPENAI_LIKELITELLM_PROXYrn  HOSTED_VLLMrd  	LM_STUDIOLMStudioChatConfig	GALADRIELGaladrielChatConfig	REPLICATEr?  HUGGINGFACErA  TOGETHER_AIrB  
OPENROUTERrh  GEMINIrG  AI21	AI21_CHATra  AZUREr4  AZURE_AIrf  
AZURE_TEXTAzureOpenAITextConfig	NLP_CLOUDrZ  	OOBABOOGAOobaboogaConfigOLLAMA_CHATrY  	DEEPINFRAr\  
PERPLEXITYPerplexityChatConfigMISTRAL	CODESTRALrN  
NVIDIA_NIMr^  CEREBRASr_  
VOLCENGINErc  TEXT_COMPLETION_CODESTRALrM  	SAMBANOVASambanovaConfigMARITALKMaritalkConfigVLLMre  OLLAMArX  r1  r@  TRITONr>  PETALSr[  OpenAIGPTConfigr   r   s     r   get_provider_chat_config.ProviderConfigManager.get_provider_chat_config  s    !!==E=J))++!!**h6--//!!&&(2))++!!,,8++--!!%%1((**!!88HD5577!!--9++--!!((H4''))!!**h6))++!!++x7**,,!!00H<..00!!++x75 6688 !!!,,8//11!!00H<..00!!++x7**,,!!..(:,,..!!,,8//11!!))X5//11!!..(:--//!!))X5,,..!!((H4++--  ''83##11X=##//8;##11X=//11!!--9//11!!++x7--//!!++x7..00!!++x7**,,!!--9,,..!!--9++--!!,,8++--!!((H45577  %%1##--9))++!!''83,,..!!**h6..00!!,,80022!!--9//11!!++x7))++!!++x7**,,!!--9++--!!++x7**,,!!,,8//11  ((H4##--9((**!!,,8**,,!!**h6))++!!,,8++--!!;;xG88::!!++x7**,,!!**h6))++!!,,8//11!!00H<..00!!&&(2%%''!!((H4''))!!++x7**,,!!((H4''))!!((H4''))&&((r   c                     [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R
                  " 5       $ [        SU S35      e)Nz	Provider z" does not support embedding config)r   rG   VOYAGEr  r  r  rj  r  s     r   get_provider_embedding_config3ProviderConfigManager.get_provider_embedding_config^  s_    
 &&(20022!!((H400229XJ.PQRRr   c                 ^   [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  R                  U:X  a  [         R
                  " 5       $ [         R                  R                  U:X  a  [         R                  " 5       $ [         R                  " 5       $ r   )r   rG   r  CohereRerankConfigr  AzureAIRerankConfigINFINITYInfinityRerankConfigr  s     r   get_provider_rerank_config0ProviderConfigManager.get_provider_rerank_configi  s|    
 &&(2--//!!**h6..00!!**h6//11))++r   r  N)r'  r
  r  r  staticmethodr   rG   rb   r  rc   r  rd   r  r  r  r   r   r  r    s    ~)~)*~)	~) ~)@ SSS 
S S 
,
,
, 

, 
,r   r  service_type)r   
prometheusc                 8   [        [        U R                  S0 5      =(       d    0 5      n[        [        [           U R                  S5      =(       d    UR                  S5      5      n[
        R                  (       a  gUS:X  a  [
        R                  (       a  gU$ )z
Used for enforcing `disable_end_user_cost_tracking` param.

service_type: "litellm_logging" or "prometheus" - used to allow prometheus only disable cost tracking.
r   user_api_key_end_user_idNr  )r_   r   r   r[   r   r   disable_end_user_cost_tracking.disable_end_user_cost_tracking_prometheus_only)r   r  	_metadataend_user_ids       r   !get_end_user_id_for_cost_trackingr  w  s|     T>--j"=CDI56 	5==34K
 --$BBr   c                      Uc  Uc  gUb  U R                  U5      (       d  US-   U -   n [        UUU SS9nUS:  $ ! [         a#  n[        R                  " SU 35         SnAgSnAff = f)z
Returns true if the prompt is valid for prompt caching.

OpenAI + Anthropic providers have a minimum token count of 1024 for prompt caching.
NFrW  T)r   r  r   r  i   z)Error in is_prompt_caching_valid_prompt: )rm  r"  r   rf   r   )r   r   r  r#  token_countr  s         r   is_prompt_caching_valid_promptr    s    *53C3C4
 4
 (#-5E#*.	
 d"" HLMs   ; 1; 
A(A##A()Fr   )r   r   N)Nzgpt-3.5-turbo-0613NFNNFF)mainN)r   NNNFNNFr   )NiX  FNFFFFNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNN)	NNNNNNNNN)NNNr   NN)NNNNNFNNNNNNNNNNNr   NNNNNNNNNNNNN)r   r   r   r   r   )NNNry  )r   r   )Ng      ?FN)r   r  (n  r9  r  r  binasciir   rf  hashlibr   io	itertoolsr  loggingrl  r  r  struct
subprocesssystextwraprs  r]  r  rh  dataclassesr   r   	functoolsr   r   	importlibr   r   os.pathr	   r
   r   aiohttpdotenvrM  r|  r  r   httpx._utilsr   
openai.libr   r   *openai.types.chat.completion_create_paramsr   pydanticr   r   
tokenizersr   r   litellm._service_loggerlitellm.litellm_core_utils,litellm.litellm_core_utils.audio_utils.utils/litellm.litellm_core_utils.json_validation_rulelitellm.caching.cachingr   litellm.caching.caching_handlerr   r   "litellm.integrations.custom_loggerr   'litellm.litellm_core_utils.core_helpersr   r   +litellm.litellm_core_utils.default_encodingr   2litellm.litellm_core_utils.exception_mapping_utilsr   r   r   1litellm.litellm_core_utils.get_llm_provider_logicr   r   6litellm.litellm_core_utils.get_supported_openai_paramsr    ,litellm.litellm_core_utils.llm_request_utilsr!   Flitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser"   r#   r$   r%   r&   :litellm.litellm_core_utils.llm_response_utils.get_api_baser'   Blitellm.litellm_core_utils.llm_response_utils.get_formatted_promptr(   9litellm.litellm_core_utils.llm_response_utils.get_headersr)   *litellm.litellm_core_utils.redact_messagesr*   r+    litellm.litellm_core_utils.rulesr,   ,litellm.litellm_core_utils.streaming_handlerr-   (litellm.litellm_core_utils.token_counterr.   r/   &litellm.llms.custom_httpx.http_handlerr0   r1   *litellm.router_utils.get_retry_from_policyr2   r3   litellm.secret_managers.mainr4   litellm.types.llms.openair5   r6   r7   r8   r9   litellm.types.rerankr:   litellm.types.utilsr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   	open_textfr  	json_datadumpsr  importlib.metadataconcurrent.futuresrS   typingrT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   OriginalError)litellm.llms.base_llm.chat.transformationrb   .litellm.llms.base_llm.embedding.transformationrc   +litellm.llms.base_llm.rerank.transformationrd   _loggingrf   caching.cachingrg   rh   ri   rj   rk   r~  rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   proxy._typesrz   r{   types.llms.openair|   r}   r~   types.routerr   MAX_THREADSexecutorsentry_sdk_instancecapture_exceptionr   posthog	slack_appalerts_channelheliconeLoggerathinaLoggerpromptLayerLoggerlangsmithLoggerlogfireLoggerweightsBiasesLoggercustomLoggerlangFuseLoggeropenMeterLogger
lagoLoggerdataDogLoggerprometheusLoggerdynamoLoggers3LoggergenericAPILoggergreenscaleLoggerlunaryLoggeraispendLoggersupabaseClientr   r   r  r   r   r   last_fetched_atlast_fetched_at_keysr  r   r   r  r  r  r   r  r  r  r   r  r  r  r  r  r  r"  r(  r*  r0  r7  r-  r=  r?  rA  rC  rE  rH  rO  rm  r  r  r  r  r  r  r  r  r  rr  rt  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r;  rF  r.  rJ  rS  rb  rh  ru  r  r  r  r  r  r  r-  Headersr  r,  r  r  r  r  r  r  r  r   r(  r.  r,  r1  r"  r#  rH  rQ  re  r_  r  re  rg  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   <module>rn     s:           	    	  	         ( &   * *       0 * E       ! 3 6 - U ; A 
 T  T 3 L Q 4  0 )      4 +-G		!I
 **Y'  1     0 @ N H $     " B 
 )  +6  
	  
   %'xS	" '/1 HT#s(^, 1(*Xd38n% * 2 3: /0(	EYYxF
R 3

 
: ( PT T#Y x~   $
#(59@D 	49jtnj 3-j 4.	j
 D012j <=j $j $,D>j\ CGEE2:3-E6E3 E2F"2 '+,0#,159@D49stns 5d3i(
)s tn	s
 $D>s D012s <=s $,D>s 	sl	 	 	C hsm PT *C hsm PT D 6:%-c]	.S x} 3 SW B (3- SW c  QU  6:%-c]	 6:%-c]	.3 Xc] d <
c 
2d d t LuS$Y/ L` 
 #')-?A< C==A> !?AHT )-GOPT~	$ # %)!%JN)-"&??sm? SM? c]	?
 #? &d73D+E&FG? "#? $?F  !%))--1_C=_}_ c]_ c]	_
 3-_ C=_ 3-_ "#_ %TN_J %) $"&-1WW 3-W c]	W
 W $W %TNWt.*7?S	7J	* 

	
		
15EC CD t,-.ECL&&$ &4 &R(#C=(	#( 
#( $,C=	(
 c](Vd  *&&.<&c]&6, ,8DV;W ,^. T . T ":=	"*23-c]4T c C C m  )c )HSM )X!:
# :
(3- :
z, ,F F3# 3# 3 S x}  "# # #d # SW 4 i **%-c]*,*ZS Xc] 0 6:N
N
%-c]N
N
bP# PHSM PY PfGs G4Xv  "(
(
(
 (
 	(

 (
 (
VS T-5H  1:  !"zVC=zVc]zV smzV 
	zVz	0$H3  .s :eDOT$9:;d^> 15u}}-J 15	>>> u}}-> 	>
 5#:>: !# 	/&/&/& /& 	/&dO% O%f >B-5c]0 >B-5c]0T ";|?DD"*&9   P  #(cC=c c !	cL#$s) #L/dtnc] # #> 8( 
/ D 0  &	4(8#9 	d 	 5L0M *   
U9d?3 
 
(	E5E0F 	E"T:J5K "JX, X,z >O9: c]: 6:)-	t,-. D012 "#	
 
  s   
f
f