
    hl                       U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZmZ d dlmZ d dlmZ d dl m!Z!m"Z"m#Z# d dl$Z$d dl%Z%d dl&Z&d dl'Z'd dl(Z(d dl&m)Z) d dl*m+Z+ d d	l,m-Z-m.Z. d d
l/m0Z0 d dl1m2Z2 d dl(m3Z3 d dl4m5Z5 d dl6Z6d dl7Z6d dl8Z6d dl9Z6d dl:Z6d dl;Z6d dl<Z6d dl=m>Z> d dl?m@Z@ d dlAmBZBmCZC d dlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP d dlQmRZR d dlSmTZT d dlUmVZV d dlWmXZXmYZY d dlZm[Z[ d dl\m]Z] d dl^m_Z_m`Z`maZa d dlbmcZcmdZd d dlemfZfmgZg d dlhmiZi d dljmkZk d dllmmZmmnZnmoZompZpmqZqmrZr d dlsmtZt d dlumvZv d d lwmxZx d d!lymzZz d d"l{m|Z|m}Z} d d#l~mZ d d$lmZ d d%lmZ d d&lmZ d d'lmZ d d(lmZmZ d d)lmZmZ d d*lmZ d d+lmZmZ d d,lmZmZmZmZmZmZmZmZ d d-lmZ d d.lmZ d d/lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ 	  ej~                  d0      j                  d1      j                  d2d3      5 Z e
j                  e«      Zddd        e
j                  eī      Zd dlZd d4lmZmZmZmZmZmZmZmZmZmZmZmZmZ d d5l'mZ d d6lmZ d d7lmZ d d8lmZ d d9lmZ d d:lmZmZ d d;lmZ d d<lmZ d d=lmZ d d>lmZ d d?lmZ d d@lmZ d dAlmZ d dBlmZ d dClmZ d dDlmZ d dElmZ d dFlmZ dGdHlm Z mZ dGdIlmZmZmZmZmZmZ dGdJl	m
Z
mZmZmZmZmZmZmZmZڐmZmZmZmZmZmZ dGdKlmZmZ dGdLlmZmZmZ dGdMlm Z  dZ!dZ"da#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8g a9eeҐe:      e;dN<   da<i Z=eeАe:e:f      e;dO<   i Z>eeАe:e:f      e;dP<   dZ?dZ@	 	 djdReAdSedT   fdUZBdV ZCdWe:dXedY   dZdfd[ZDd\eTdZeAfd]ZEd\eTdZeAfd^ZFd_eАe:ef   dZeҐe:   fd`ZGd_eАe:ef   dZeҐe:   fdaZHd_eIfdbZJdceeeאe:eeTf         dZefddZKdee:fdfZLdge|dheAfdiZMd_eАe:ef   djeNdZeeԐeO   eАe:ef   f   fdkZPd_eАe:ef   djeNdZeeאeQeOe&j*                  f      fdlZRdm ZS	 dkd_eԐeI   dneAdZeAfdoZTd_eАe:ef   dpeee:f   dZeAfdqZUdredge|dseԐe:   d_eIdtej
                  duej
                  dZdfdvZV	 dldse:dwee   fdxZW eeGy      dse:dZefdz       ZXdse:dZefd{ZYdse:dZee   fd|ZZdmdweԐeI   fd~Z[d}g dfdeҐeO   dweԐeI   fdZ\	 dnde:deԐe:   fdZ]de:fdZ^	 	 	 	 	 	 	 	 	 dodweeאeIef      deeאe:eҐe:   f      dee   deԐeA   deee      dee   deԐeA   deԐeO   dZeOfdZde:dZeAfdZ_dse:deԐe:   dZeAfdZ`dldse:deԐe:   dZeAfdZadldse:deԐe:   dZeAfdZbdse:deԐe:   dZeAfdZc	 dldse:deԐe:   dZeAfdZd	 dldse:deԐe:   dZeAfdZe	 dldse:deԐe:   dZeAfdZfdldse:deԐe:   dZeAfdZgdse:deԐe:   de:dZeed      fdZhdse:deԐe:   de:dZeAfdZidldse:deԐe:   dZeAfdZjdldse:deԐe:   dZeAfdZk	 dldse:deԐe:   dZeAfdZl	 dldse:deԐe:   dZeAfdZm	 dldse:deԐe:   dZeAfdZndldse:deԐe:   dZeAfdZodldse:deԐe:   dZeAfdZp	 dldse:deԐe:   dZeeҐe:      fdZq	 dldse:deԐe:   dZeAfdZrdedeIdZeIfdZsd Ztdeאe:eIf   fdZudZeAfdZvdeIdeIdeԐeA   dZeIfdZw	 	 	 	 	 	 dpdse:de:deԐe:   deԐe:   deԐe:   deԐeO   deeed         deԐeA   fdZx	 	 	 	 	 	 	 	 	 	 	 	 dqdseԐe:   deԐeO   deԐe:   deԐe:   deԐe:   deԐe:   deԐe:   deԐe:   deԐe:   deԐeA   dee   deԐeA   fdZy	 	 	 	 	 	 drdse:deԐe:   deԐe:   deԐeO   deԐeA   deeҐe:      fdZzdÄ Z{dĄ Z|dŐeIdeeҐe:      dZeIfdǄZ} G dȄ dɫ      Z~	 	 dsdeIdʐeIde:deeҐe:      dse:dːeAd̐eAdZeIfd̈́ZdΐeIdZeIfdτZdeIdŐeIde:dZeIfdЄZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dtdse:deeҐe:      deee      dee   dee   f
dԄZ	 dldՐeIdeIde:deҐe:   deԐe   dZeIfdׄZdՐeIdŐeIdѐefd؄ZdeIdZeIfdلZdeԐeO   deԐeO   deԐeO   deԐeO   dZeԐeO   f
dބZdee   dZefdZde:de dZeԐe:   fdZde dZeԐe   fdZde dZeAfdZde dZeAfdZde de:dZeAfdZde deԐe:   dZeԐe:   fdZd_eIdZe:fdZde:dZeOfdZdeeef   dZe:fdZde:deԐe:   fdZd Zdse:dZeԐeO   fdZdZe:fdZdZe:fdZde:dZe:fdZdse:deԐe:   dZe:fdZde:dZeIfdZdeIdeԐe:   dZeAfdZd dl̐mZ  G d de      Zdse:deԐe:   dZefdZde:dZeԐeO   fdZdse:deԐe:   dZefd Zdse:deԐe:   dZee   fdZdedZeAfdZ	 dldse:deԐe:   dZefdZdldse:deԐe:   dZefdZde:fdZd Zd	 Z	 	 	 	 	 dudse:de:d
e:de:deOdeOfdZde:dZee   fdZd Z	 	 	 dvdseԐe:   deԐe:   d
eԐe:   dZeIfdZd Zd Zd Zdse:de:fdZdeOfdZ	 dldee&j`                     fdZ	 	 dwdeOdeOdee&j`                     deOdZeאeQeOf   f
dZi d}d}i fdse:deIde:d e:d!eIf
d"Z G d# d$      Z	 dldeԐeO   fd%Z	 dldeԐeO   fd&ZdZeIfd'Zd( Zd) Zd* Zd+ Zd, Z	 dkdseԐe:   d-eAfd.ZdeHdQdfdseԐe:   d/eQd0eAfd1Zd d2lmZ  G d3 d4e      Z e       Z	 dldeԐe:   dZeҐe:   fd5Z	 dldede:deԐe    dZeҐe:   fd6Z	 	 	 dvd7eԐeA   deԐe:   deԐe    dZeҐe:   fd8ZŐd9 ZƐd: Zǐdld;Z G d< d=      Z G d> d?      Z G d@ dAeѫ      ZːdBedZeAfdCZ̐dDe:dZeAfdEZ͐dDe:dZe:fdFZdee   dZeAfdGZde:dZee   fdHZd dIlmѐZѐmҐZҐmӐZӐmԐZԐmՐZՐm֐Z dBee2eIf   dZeIfdJZdefdKZdefdLZِdBefdMZdee   fdNZdeeאeIe:f      dZeeאeIe:f      fdOZ G dP dQ      Z	 dxdeIdReӐdS   dZeԐe:   fdTZސd
eԐe:   dUeҐe:   fdVZ	 	 dydse:deee      deee      deԐe:   dZeAf
dWZdXe:dZeԐeQ   fdYZd dl&Z&d
e:dZe:dZe:fd[Zd\eIdZeIfd]Zd_eIdZeIfd^Zd_eIdZeIfd_Zd`eIdZeIfdaZdbed_eIdZefdcZdee   dZee   fddZdZefdeZdfee   dgee   dhee   dZeAfdiZy# 1 sw Y   xY w# eeef$ rA  ej                  d0d1      5 Z e
j                  e«      Zddd       n# 1 sw Y   nxY wY w xY w(z      N)	dataclassfield)	lru_cachewraps)	resources)iscoroutine)abspathdirnamejoin)Proxy)get_environment_proxies)_parsing	_pydantic)ResponseFormat)	BaseModel)Encoding)	Tokenizer)lru_cache_wrapper)	DualCache)CachingHandlerResponseLLMCachingHandler)$DEFAULT_CHAT_COMPLETION_PARAM_VALUESDEFAULT_EMBEDDING_PARAM_VALUESDEFAULT_MAX_LRU_CACHE_SIZEDEFAULT_TRIM_RATIOFUNCTION_DEFINITION_TOKEN_COUNTINITIAL_RETRY_DELAYJITTERMAX_RETRY_DELAYMAX_TOKEN_TRIMMING_ATTEMPTS MINIMUM_PROMPT_CACHE_TOKEN_COUNTOPENAI_EMBEDDING_PARAMSTOOL_CHOICE_OBJECT_TOKEN_COUNT)CustomGuardrail)CustomLogger)BaseVectorStore)map_finish_reasonprocess_response_headers)CredentialAccessorencoding)_get_response_headersexception_typeget_error_message)*_get_base_model_from_litellm_call_metadataget_litellm_params)_is_non_openai_azure_modelget_llm_provider)get_supported_openai_params)_ensure_extra_body_is_safe)LiteLLMResponseObjectHandler#_handle_invalid_parallel_tool_calls_parse_content_for_reasoning convert_to_model_response_objectconvert_to_streaming_response#convert_to_streaming_response_async)get_api_base)get_formatted_prompt)get_response_headers)ResponseMetadata)LiteLLMLoggingObject(redact_message_input_output_from_logging)Rules)CustomStreamWrapper)get_modified_max_tokens)$BaseGoogleGenAIGenerateContentConfigBedrockModelInfo)AsyncHTTPHandlerHTTPHandler)!get_num_retries_from_retry_policyreset_retry_policy)
get_secret)ANTHROPIC_API_ONLY_HEADERSAnthropicThinkingParam)AllMessageValuesAllPromptValuesChatCompletionAssistantToolCall"ChatCompletionNamedToolChoiceParamChatCompletionToolParam$ChatCompletionToolParamFunctionChunkOpenAITextCompletionUserMessageOpenAIWebSearchOptions)RerankResponse)	FileTypes)OPENAI_RESPONSE_HEADERS	CallTypesChatCompletionDeltaToolCallChatCompletionMessageToolCallChoicesCostPerTokenCredentialItemCustomHuggingfaceTokenizerDelta	EmbeddingEmbeddingResponseFunctionImageResponseLlmProvidersLlmProvidersSetLLMResponseTypesMessage	ModelInfoModelInfoBaseModelResponseModelResponseStreamProviderFieldProviderSpecificModelInfoRawRequestTypedDictSelectTokenizerResponseStreamingChoicesTextChoicesTextCompletionResponseTranscriptionResponseUsageall_litellm_paramsz%litellm.litellm_core_utils.tokenizerszanthropic_tokenizer.jsonrutf-8)TYPE_CHECKINGAnyCallableDictIterableListLiteralOptionalTupleTypeUnioncastget_args)OpenAIError)executortoken_counter)BaseAnthropicMessagesConfig)BaseAudioTranscriptionConfig)BaseLLMModelInfotype_to_response_format_param)
BaseConfig)BaseTextCompletionConfig)BaseEmbeddingConfig)BaseFilesConfig)BaseImageEditConfig)BaseImageGenerationConfig)BaseImageVariationConfig)BasePassthroughConfig)BaseRealtimeConfig)BaseRerankConfig)BaseResponsesAPIConfig)BaseVectorStoreConfig   )_is_debugging_onverbose_logger)AzureBlobCacheCacheQdrantSemanticCache
RedisCacheRedisSemanticCacheS3Cache)APIConnectionErrorAPIErrorAuthenticationErrorBadRequestErrorBudgetExceededErrorContentPolicyViolationErrorContextWindowExceededErrorNotFoundErrorr   PermissionDeniedErrorRateLimitErrorServiceUnavailableErrorTimeoutUnprocessableEntityErrorUnsupportedParamsError)AllowedModelRegionKeyManagementSystem) ChatCompletionDeltaToolCallChunkChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunk)LiteLLM_Paramscallback_listadditional_detailslocal_cacheFlogger_only	log_level)DEBUGINFOERRORc                 
   	 |dk(  rt        j                  |        n5|dk(  rt        j                  |        n|dk(  rt        j                  |        t        j
                  du r|du rt        |        y y y # t        $ r Y y w xY w)Nr   r   r   TF)r   debuginfoerrorlitellmset_verboseprint	Exception)print_statementr   r   s      I/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/utils.pyprint_verboser   V  s    

  1& 0'!  1$&;%+?/" ,@& s   A1A6 6	BBc                     t         j                  D ]q  } | d   t         j                  vr"t         j                  j                  | d          | d   t         j                  vsPt         j                  j                  | d          s y)z2
    Add custom_llm provider to provider list
    providerN)r   custom_provider_mapprovider_listappend_custom_providers)
custom_llms    r   custom_llm_setupr   j  sl     11
j!)>)>>!!((J)?@j!)B)BB%%,,Z
-CD 2    callbacklogging_event)successfailurereturnc                    ddl m} ddlm} | t         j                  vr*t        j                  d|  dt         j                          y |t        ||       dd      }|rj|dk(  rt        |      d	u rt         j                  j                  |       t         j                  j                  |       | t         j                  v rt         j                  j                  |        | t         j                  v r t         j                  j                  |        yy|d
k(  rt        |      d	u rt         j                  j!                  |       t         j                  j#                  |       | t         j$                  v rt         j$                  j                  |        | t         j&                  v r t         j&                  j                  |        yyyyy)z<
    Add a custom logger callback to the specific event
    r   )+_custom_logger_compatible_callbacks_literal)$_init_custom_logger_compatible_classz	Callback z@ is not a valid custom logger compatible callback. Known list - Ninternal_usage_cache
llm_routerr   Fr   )r   r   *litellm.litellm_core_utils.litellm_loggingr   )_known_custom_logger_compatible_callbacksr   r   r   0_custom_logger_class_exists_in_success_callbackslogging_callback_manageradd_litellm_success_callback"add_litellm_async_success_callbacksuccess_callbackremove_async_success_callback0_custom_logger_class_exists_in_failure_callbacksadd_litellm_failure_callback"add_litellm_async_failure_callbackfailure_callback_async_failure_callback)r   r   r   r   callback_classs        r   -_add_custom_logger_callback_to_specific_eventr   v  s    D wHHHz!abi  cT  cT  bU  V	
 	98(C!N Y&@P ,,II ,,OO 7333((// 7::://66 ;
 Y&@P ,,II ,,OO 7333((// 7::://66 ; '+ r   r   c                 j     t         fdt        j                  t        j                  z   D              S )a  
    Returns True if an instance of the custom logger exists in litellm.success_callback or litellm._async_success_callback

    e.g if `LangfusePromptManagement` is passed in, it will return True if an instance of `LangfusePromptManagement` exists in litellm.success_callback or litellm._async_success_callback

    Prevents double adding a custom logger callback to the litellm callbacks
    c              3   H   K   | ]  }t        |t                      y wN
isinstancetype.0cbr   s     r   	<genexpr>zC_custom_logger_class_exists_in_success_callbacks.<locals>.<genexpr>  %       	2tN+,   ")anyr   r   r   r   s   `r   r   r     0      **W-L-LL  r   c                 j     t         fdt        j                  t        j                  z   D              S )a  
    Returns True if an instance of the custom logger exists in litellm.failure_callback or litellm._async_failure_callback

    e.g if `LangfusePromptManagement` is passed in, it will return True if an instance of `LangfusePromptManagement` exists in litellm.failure_callback or litellm._async_failure_callback

    Prevents double adding a custom logger callback to the litellm callbacks
    c              3   H   K   | ]  }t        |t                      y wr   r   r   s     r   r   zC_custom_logger_class_exists_in_failure_callbacks.<locals>.<genexpr>  r   r   )r   r   r   r   r   s   `r   r   r     r   r   kwargsc                     | j                  d      xs i }|j                  d      xs i }|j                  d      xs g }|S )z4
    Get the request guardrails from the kwargs
    metadatarequester_metadata
guardrailsget)r   r  r  applied_guardrailss       r   get_request_guardrailsr    sH     zz*%+H!&:;Ar+//=Cr   c                 4   t        |       }g }t        j                  D ]w  }|t        |t              s|j
                  $|j                  du r|j                  |j
                         N|j
                  |v s]|j                  |j
                         y |S )z\
    - Add 'default_on' guardrails to the list
    - Add request guardrails to the list
    T)r  r   	callbacksr   r$   guardrail_name
default_onr   )r   request_guardrailsr  r   s       r   get_applied_guardrailsr    s     07%%Jx$I&&2&&$.&--h.E.EF,,0BB&--h.E.EF & r   c                     | j                  d      }|rIt        j                  r8t        j                  |      }|j                         D ]  \  }}|| vs|| |<    yyy)zI
    Updates kwargs with the credentials if credential_name in kwarg
    litellm_credential_nameN)r  r   credential_listr)   get_credential_valuesitems)r   credential_namecredential_accessorkeyvalues        r   load_credentials_from_listr    s^     jj!:;O7220FFW-335JC& #s 6 3r   dynamic_callbacksc                 h    t         j                  j                         }| r|j                  |        |S r   )r   r	  copyextend)r  returned_callbackss     r   get_dynamic_callbacksr    s1     !**//1!!"34r   original_functionc                 @   ddl m} ddlm} t         j                  du rt        j                  d       	 t                t        |      }d|v r|d   nd }|j                  dd       }	t        |	      }
t        |
      dkD  r}|
D ][  t        t              rQt         j                  j                  j!                  d d 	      "t#        fd
t         j$                  D              ret         j&                  vrt         j&                  j)                         t         j*                  vrt         j,                  j/                         t         j0                  vrt         j,                  j3                         t         j$                  vrt         j,                  j5                         t         j6                  vs=t         j,                  j9                         ^ t;        dt         j$                          t        t         j&                        dkD  s8t        t         j*                        dkD  st        t         j0                        dkD  rdt        t<              dk(  rRt?        tA        t         j&                  t         j*                  z   t         j0                  z               a |t<        |       t        t         j&                        dkD  rg }tC        t         j&                        D ]K  \  }tE        jF                        st         jH                  j)                         |j)                  |       M tK        |      D ]!  }t         j&                  j                  |       # t        t         j*                        dkD  rg }tC        t         j*                        D ]  \  }tE        jF                        r1t         j,                  j5                         |j)                  |       Ldk(  sdk(  r1t         j,                  j5                         |j)                  |       t         jL                  v st        t              stO        d        tK        |      D ]!  }t         j*                  j                  |       # t        t         j0                        dkD  rg }tC        t         j0                        D ]{  \  }tE        jF                        r1t         j,                  j9                         |j)                  |       Lt         jL                  v s_t        t              sptO        d       } tK        |      D ]!  }t         j0                  j                  |       # d }d }d }d }|jQ                  dd       t        |d   t>              rg }tC        |d         D ]]  \  }tE        jF                        sdk(  sdk(  s&|"t        |t>              r|j)                         ng}|j)                  |       _ tK        |      D ]  }|d   j                  |        |j                  d      }|jQ                  dd       $t        |d   t>              r|j                  d      }tR        rm	 tU        jV                  |      }t         jZ                  r6|j                  dd        |j                  dd        |j                  dd        tS        dd| d       d|v r|d   a.t        |      dkD  r|d   n|jQ                  dd       }| }|t^        j`                  jb                  k(  s:|t^        jd                  jb                  k(  s|t^        jf                  jb                  k(  rd }t        |      dkD  r|d   }n|jQ                  dd       r|d   }t        |t>              r?t        |      dkD  r0t        |d   th              rd|d   v r|jk                  djm                  d  |D              |!       n|t^        jn                  jb                  k(  s|t^        jp                  jb                  k(  r't        |      dkD  r|d   n|jQ                  dd       }n|t^        jr                  jb                  k(  s|t^        jt                  jb                  k(  rt        |      dkD  r|d   n|d   }n4|t^        jv                  jb                  k(  s|t^        jx                  jb                  k(  rt        |      dkD  r|d   n|d   }n|t^        jz                  jb                  k(  s|t^        j|                  jb                  k(  rt        |      dkD  r|d   n|d   }n|t^        j~                  jb                  k(  s|t^        j                  jb                  k(  r|jQ                  d"      }n?|t^        j                  jb                  k(  s|t^        j                  jb                  k(  rct        |      dkD  r|d   n|d#   }t         j                  j                  j                  j                  |$      }d%|v r	||d%   d&<   nd&|i|d%<   |}n|t^        j                  jb                  k(  s|t^        j                  jb                  k(  r|jQ                  dd'      }nU|t^        j                  jb                  k(  s|t^        j                  jb                  k(  rt        |      dkD  r|d   n|d   }nd(}d)}t        ||*      rd} |||||d+   |jQ                  d,      |xs d||||||||-      }d.di}d%|v r|d%   |d%<   |j                  |di ||jQ                  d/d       0       ||fS # tX        $ r |}Y w xY w# tX        $ r}t        j                  d1       |d }~ww xY w)2Nr   Logging)set_callbacksTze`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs.idr	  )r  r   c              3   H   K   | ]  }t        |t                      y wr   r   )r   r   r   s     r   r   z!function_setup.<locals>.<genexpr>,  s$      / #2tH~6/r   z8Initialized litellm callbacks, Async Success Callbacks: )r   function_iddynamodb	openmeterr   r   r   s3r   messagesinputpromptzlitellm.llm_callzKeyword Args: r   )categorymessagelevel	logger_fnmodelr   content c              3   n   K   | ]-  }d |v r't        |d    t              r|j                  d d       / yw)r1  r2  Nr   strr  )r   ms     r   r   z!function_setup.<locals>.<genexpr>  s7      "$>j9s.K i,"s   35r*  r0  queryfile)file_objr  file_checksumspeechzdefault-message-valueFr   	call_typelitellm_call_idlitellm_trace_id)r0  r)  streamr?  r@  r%  r>  
start_timedynamic_success_callbacksdynamic_failure_callbacksdynamic_async_success_callbacksdynamic_async_failure_callbacksr   r  api_basestream_options)r0  useroptional_paramslitellm_paramsrH  zKlitellm.utils.py::function_setup() - [Non-Blocking] Error in function_setup)Mr   r!  r   r"  r   r   warningr   r  popr  lenr   r5  litellm_core_utilslitellm_loggingr   r   r   input_callbackr   r   r   r   r   r   r   r   r   r   r   listset	enumerateinspectiscoroutinefunction_async_input_callbackreversedr   r   r  add_breadcrumbr  deepcopyr   turn_off_message_logginguser_logger_fnrY   
completionr  acompletionanthropic_messages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<  
aresponses	responses_is_streaming_requestupdate_environment_variables	exception)r  	rules_objrB  argsr   LiteLLMLoggingr"  r  r%  r  all_callbacksremoved_async_itemsindexrC  rE  rD  rF  details_to_logr0  r>  r)  	_file_objr;  rA  logging_objrK  er   s                              @r   function_setupr    sq
    2Hd"s	
_ 	 4F; 6:V^VD\ JJ{D) 	 .@QR}!)h,&99IInn t  o  H  '3 /")"A"A/ , !7#9#99**11(;7#;#;;44QQRZ[7#;#;;44QQRZ[7#B#BB44WWX`a7#B#BB44WWX`a) ** J7KjKjJkl
 &&'!+7++,q07++,q0
 !**../../M ;Ow%%&*"$#,W-C-C#Dx..x81188B'..u5 $E ""56&&**51 7w''(1,"$#,W-E-E#Fx..x844WW  (..u5+x;/F 44WW  (..u5 Q QQ"8S1A(IV# $G( ""56((,,U3 7 w''(1,"$#,W-E-E#Fx..x844WW  (..u5 Q QQ"8S1A(IV $G ""56((,,U3 7
  	"
  	(
  	"
  	( ::($/;
%&A
 #%#,V4F-G#Hx//9:-4'6Bz7H 8>>xH;C*7'..u5 $I ""56)*..u5 7(.

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

3E(F%(!%v!6 //"":t4""7D1""8T2+((89
 & #K0Nt9q=Qfjj$.G%	--333I11777I88>>>H4y1}7J-!*- 8T*MA%x{D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--333I//555"%d)a-tAwVG_H.H 
 F$"#45#ZZ(:;#)r!&?&?,K,K1
$ +5b)9)/
);N:&00)!::&6= 	1 	
 F""A  (!'(B    Y	
 	sl   F
m8 Em8 D2m8 >m8 Cm8 "m8 3Bm8 B+m8 ?m& Sm8 &m51m8 4m55m8 8	nnnr  is_completion_with_fallbacksc                    K   |du rSt        d| j                          t        j                  | j                  |||             | j	                  |||       y y w)NFz>Async Wrapper: Completed Call, calling async_success_handler: resultrB  end_time)r   async_success_handlerasynciocreate_task-handle_sync_success_callbacks_for_async_callsr  r  rB  r  r  s        r   _client_async_logging_helperr  5  so      	%-L[MnMnLop	
 	--fj(K	
 	AA! 	B 	
 	.s   AArv  c                     | j                  dd      }|t        j                  }| j                  dd      r-t        || j                  d            }t	               | d<   ||}|| fS )zm
    Get the number of retries from the kwargs and the retry policy.
    Used for the wrapper functions.
    num_retriesNretry_policyrv  r  )r  r   r  rI   rJ   )r   rv  r  retry_policy_num_retriess       r   _get_wrapper_num_retriesr  M  sr     **]D1K))zz.$'#DN3$
  "4!5~#/2Kr   c                     t        t        t        t        t        t
        j                  f      | j                  dd            }|S )zM
    Get the timeout from the kwargs
    Used for the wrapper functions.
    timeoutN)r   r   r   floatinthttpxr   r  )r   rv  r  s      r   _get_wrapper_timeoutr  d  s:     uc5==012FJJy$4OG Nr   c           	      |    t               dt        fddt        t        t        f   dt        fddt
        dt        dt        t           dt        t           fdd	t        t
           f fd
t                fd       }t                fd       }t        j                         }|r|S |S )Nr   c                 \    t        j                  |       ryt        j                  |       ryyNTF)rU  r   rV  r  s    r   check_coroutinezclient.<locals>.check_coroutinev  s'    u%((/r   r   r>  c                    K   	 t        |      }| j                         }t        j                  D ]2  }t        |t              s|j                  ||       d{   }|1|}4 |S # t        $ r d}Y dw xY w7 w)z
        Allow modifying the request just before it's sent to the deployment.

        Use this instead of 'async_pre_call_hook' when you need to modify the request AFTER a deployment is selected, but BEFORE the request is sent.
        N)rY   
ValueErrorr  r   r	  r   r%   async_pre_call_deployment_hook)r   r>  typed_call_typemodified_kwargsr   r  s         r   r  z.client.<locals>.async_pre_call_deployment_hook~  s     	#'	2O !++-))H(L1'FF#_   %&,O *   	#"O	#s?   A9A& 3A9A9A7A9 A9&A41A93A44A9request_dataresponsec                    K   	 t        |      }t        j                  D ]B  }t	        |t
              s|j                  | t        t        |      |       d{   }|@|c S  |S # t        $ r d}Y dw xY w7 w)zh
        Allow modifying / reviewing the response just after it's received from the deployment.
        N)	rY   r  r   r	  r   r%   'async_post_call_success_deployment_hookr   rg   )r  r  r>  r  r   r  s         r   r  z7client.<locals>.async_post_call_success_deployment_hook  s     	#'	2O  ))H(L1'OO $'7"BO   %!M *   	#"O	#
s>   A9A& #A9$A9A7A9A9&A41A93A44A9rJ  c                 T   	 | y 	j                   }|t        j                  j                  k(  s|t        j                  j                  k(  r |       }|du ry t        | t              rt        | j                        dkD  r| j                  d   j                  j                  }|Z
j                  ||       t        j                  du r	 |d|v r|d   	 d }t        |d   t              r|d   j                  d      	 |d   }n1t         j"                  j%                  |d         rt'        |d         }|1t        j(                  j*                  j-                  |d   d   |       |d|v rt        |d   t              rxd	|d   v rp|d   d	   d
k(  rdd|d   v r\t        |d   d   t              rEd|d   v r=|d   d   du r2t        j(                  j*                  j-                  |d   d   |       y y y y y y y y y y y y y y # t.        $ r Y w xY w# t0        $ r}|d }~ww xY w)NTr   r7  response_formatjson_schemar  schema)r  r  r   json_objectresponse_schemaenforce_validation)__name__rY   r]  r  r^  r   rk   rN  choicesr-  r1  post_call_rulesr   enable_json_schema_validationr`  r  r   _completionsis_basemodel_typer   rO  json_validation_rulevalidate_schema	TypeErrorr   )original_responser0  rJ  r>  is_coroutinemodel_responsejson_response_formatr  r  r  rw  s           r   post_call_processingz$client.<locals>.post_call_processing  s   d	 (-66	!5!5!;!;; I$9$9$?$??#23D#EL#t+ ''8-H #$5$=$= > B<M<U<U !=%ggg +  .9 ) 9 9*8 !: !" $+#H#HD#P'%-,;,G0A_0T0?@Q0R3718 TX,@0:4CDU4V4812 5D4E5225#m2D7;5<
 HW4EH20D 2:1F1F1X1X0?@Q0R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 A5H B H 0B
H 	HH HH 	H' H""H'c                     j                   }t        |      rt        j                  K|j	                  di       j	                  dd       }|'t        j                  t        |      k  rt        d       | i |}t        ||      rZd|v rT|d   du rMg }t        |      D ]  \  }}|j                  |        t        j                  ||j	                  dd             S |S |S t        | |       t        j                  j                         }d }|j	                  d	d       }	d
|vr t        t        j                                |d
<   t        |       dkD  r| d   n|j	                  dd       }
	 |	t#        j                   |g| i |\  }	}t%        |       |	|d	<   t'        ||      }||	_        |j+                         D ]C  \  }}|	t-        |t              s|j/                  d      s,t        j0                  |      ||<   E t        j2                  rJt        j4                  t        j2                  kD  r)t7        t        j4                  t        j2                        t        j                  K|j	                  di       j	                  dd       }|'t        j                  t        |      k  rt        d      t9        d|j	                  dd       dt        j:                   d|j	                  di       j	                  dd              |j	                  dd       t        j:                  |j	                  dd      du r|j	                  di       j	                  dd      dur|j	                  dd      dur|j	                  dd      dur|j	                  dd      dur|j	                  dd      dur|j	                  dd      dur|j	                  dd      durr|j	                  dd      dur^t=        j>                  d       |jA                  |
xs d|	||||        }|jB                  !t=        j>                  d!       |jB                  S |j	                  d"d       |
t        jD                  du r|tF        jH                  jJ                  k(  s:|tF        jL                  jJ                  k(  s|tF        jN                  jJ                  k(  r}	 |
}|j	                  d#d       d$|j	                  d#       }d }t        |       d%kD  r| d%   }n|j	                  dd       r|d   }|j	                  d"      }tQ        |
|||d d &      }||d"<    | i |}t        j                  j                         }t        ||      rkd|v rT|d   du rMg }t        |      D ]  \  }}|j                  |        t        j                  ||j	                  dd             S tS        ||	|
|||(       |S d|v r	|d   du r|S d|v r	|d   du r|S d|v r	|d   du r|S d|v r	|d   du r|S d)|v r	|d)   du r|S tU        jV                  |      r|S  ||
xs d |*       |jY                  || |+       t=        jZ                  d,       t]        j^                  |	j`                  |||       tS        ||	|
|||(       |S # t        $ r"}t9        d't        |              Y d }~d }~ww xY w# t        $ r}j                   }|tF        jL                  jJ                  k(  r]|j	                  d-d       xs t        jb                  xs d }|j	                  d.d       r)te        ||j	                  d.      /      }tg               |d.<   d t        _1        |j	                  d0i       }d1|j	                  di       v }|ro|smt-        |th        jj                        s4t-        |th        jl                        st-        |th        jn                        rw||d-<   t        jp                  | i |cY d }~S t-        |t        jr                  jt                        r4|r2|
|v r.|s,t        |       dkD  r	||
   | d<   n||
   |d<    | i |cY d }~S tw        jx                         }t        j                  j                         }|	r|	j{                  ||||       |d }~ww xY w)2Nr  previous_modelszMax retries per request hit!r=  complete_responseTr)  r)  litellm_logging_objr?  r   r0  r  request_kwargsrB  zos.environ/current_cost
max_budgetzSYNC kwargs[caching]: cachingF; litellm.cache: z#; kwargs.get('cache')['no-cache']: cachezno-cacherc  rh  r^  aimg_generationrl  rk  
_arealtimezINSIDE CHECKING SYNC CACHEr2  r0  r  r  rB  r>  r   rx  z
Cache hit!
max_tokenshf_model_namehuggingface/r   r0  
base_modelr)  user_max_tokens
buffer_numbuffer_perc&Error while checking max token limit: r  r  r0  r   rB  r  rq  r  r0  rJ  )r  rx  r   z0Wrapper: Completed Call, calling success_handlerr  r  r  context_window_fallback_dictmodel_group)>r  _is_async_requestr   num_retries_per_requestr  rN  r   rt  rT  r   stream_chunk_builderprint_args_passed_to_litellmdatetimenowr5  uuiduuid4r  r  r   _llm_caching_handlerr  r   
startswithrK   r  _current_costr   r   r  r   r   _sync_get_cachecached_resultmodify_paramsrY   r^  r  r]  r_  rC   update_response_metadatar  r   sync_set_cacher   r   submitsuccess_handlerr  rI   rJ   openair   r   r   completion_with_retries
exceptionsr   	traceback
format_excfailure_handler)rx  r   r>  r  r  chunksidxchunkrB  r  r0  r  kvcaching_handler_responser  r)  r  modified_max_tokensr  r  r  r  _is_litellm_router_calltraceback_exceptionr  r  rw  s                            r   wrapperzclient.<locals>.wrapper  sG	    &..	V$..:"(**Z"<"@"@%t# #.66#o:NN'(FGG '77F$#
 (6123t;F&/&7
Ue, '8"77J)E  "MM 	%%6fE&&**,
6<jj!47

 F*(+DJJL(9F$%*-d)a-tAwVZZQU=Vn	"&4%..	:'HL'PV'#V 'v.,7F()6G"3%%7 
 0DK, 1=Z3%7ALL<W ' 2 21 5F1I ' !!((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"((63AAA 

<.:%)) !6!6!<!<< I$8$8$>$>> I$@$@$F$FFU!&Jzz/48D'3FJJ4O3P%Q
#H4y1}#'7J5#)*#5&,jj&>O*A##-!)(7#'$(+' ,?F<( '77F((,,.H$#
 (6123t;F&/&7
Ue, '8"77J)E 
 -%$/#%#-!) "M&(VM-Bd-J'F<,@D,H"f,8I1Jd1R!V+7G0HD0Pf$	):d)B$$V, !"(mt & !// 0   RSOO++	 %'%! MU ! U!$J3q6("STTUV  5	)22II00666JJ}d3Rw7J7JRd  ::nd3"C"#%+ZZ%?#K
 +, >*  # 06zz2B0, +86::< +'  (? #1foo6%a8%a)B)BC0;}-&>>OOOq'"4"4"O"OP4!==34y1}">u"EQ*Fu*Mw,d=f=="+"6"6"8((,,.H ++*J Gk5	s   .A[  [  [  /I%[  A=[  A<Z2 B
[  [  -[  :[  [  [  ![  .[  A,[  2	[;[[  [[   
c *D)b;c Ab;+c 1A
b;;c c                    K   t        | |       t        j                  j                         }d }|j                  dd       }t	        ||      }j
                  }d|vr t        t        j                               |d<   t        |       dkD  r| d   n|j                  dd       }|j                  d      d u}	 |t        j
                  |g| i |\  }} ||       d {   }	|	|	}||d<   t        |       ||_        t        j                  rJt        j                  t        j                  kD  r)t!        t        j                  t        j                        t#        d|j                  d	d
       dt        j$                   d|j                  dd               |j'                  |xs d|||||        d {   }
|
j(                  |
j*                  |
j(                  S |
j,                  du r|
j*                  S |j                  dd       |t        j.                  du r|t0        j2                  j4                  k(  s:|t0        j6                  j4                  k(  s|t0        j8                  j4                  k(  r}	 |}|j                  dd       d|j                  d       }d }t        |       dkD  r| d   }n|j                  dd       r|d   }|j                  d      }t;        ||||d d       }||d<    | i | d {   }t        j                  j                         }t?        ||      rkd|v rT|d   du rMg }tA        |      D ]  \  }}|jC                  |        t        jD                  ||j                  dd             S tG        ||||||       |S |t0        jH                  j4                  k(  r|S  |||       |t0        D cg c]  }|j4                   c}v r ||t1        |             d {    |jK                  |||        d {    tM        jN                  tQ        |||||             |jS                  |||        tU        |tV              r"|
j*                  	 |jY                  |
|||!      S tG        ||||||       |S 7 7 # t<        $ r"}t#        dt        |              Y d }~d }~ww xY w7 c c}w 7 7 # t<        $ r}t[        j\                         }t        j                  j                         }|r[	 |j_                  ||||       n# t<        $ r}|d }~ww xY w	 |ja                  ||||       d {  7   n# t<        $ r}|d }~ww xY wj
                  }tc        ||"      \  }}|t0        j2                  j4                  k(  r|j                  d#i       }d$|j                  d%i       v }|r|s	 d t        _2        ||d&<   |d'<   tU        |tf        jh                        rd(|d)<   ntU        |tf        jj                        rd*|d)<   t        jl                  | i | d {  7  cY d }~S # t<        $ r Y ncw xY wtU        |t        jn                  jp                        r;|r9||v r5t        |       dkD  r	||   | d<   n||   |d<    | i | d {  7  cY d }~S ts        |d&|       tu        ||"      }ts        |d+|       |d }~ww xY ww),Nr  r  r?  r   r0  	fallbacksr  zASYNC kwargs[caching]: r  Fr  z; kwargs.get('cache'): r  r2  r  Tr  r  r  r   r)  r  r  r=  r  r  r  r  )r  r  r>  )r  r  r   rx  r  r  )_caching_handler_responseembedding_responserB  r  )r   rv  r  r  r  r  r  exponential_backoff_retryretry_strategyconstant_retryr  );r  r  r  r  r   r  r5  r  r  rN  r  r  r  r   r  r  r   r   r  _async_get_cacher  final_embedding_cached_response embedding_all_elements_cache_hitr  rY   r^  r  r]  r_  rC   r   rt  rT  r   r  r  	arealtimeasync_set_cacher  r  r  r  r   rb   2_combine_cached_embedding_response_with_api_resultr  r  r  async_failure_handlerr  r  r  r   r   acompletion_with_retriesr  r   setattrr  )rx  r   rB  r  r  r  r>  r0  r  r  r  r  r)  r  r  r  r  r  r  r  ctr  r  r  r  r  r  r  r  r  rw  s                             r   wrapper_asynczclient.<locals>.wrapper_async4  s    $%6fE&&**,
6<jj!47
 3D/!!3
 &..	F*(+DJJL(9F$%*-d)a-tAwVZZQU=V'-zz+'>d'J$g	"&4%..	:'HL'PV'#V %C69$UUO*(,7F()&v./CK,!!((7+=+==-%,%:%:#*#5#5  )&**Y*F)GGXY`YfYfXgg~  @F  @J  @J  KR  TX  @Y  Z  [ +;;+2&7 +)'! <   & *77C-MMU0>>>*KKtS0PPP 

<.:%)) !6!6!<!<< I$8$8$>$>> I$@$@$F$FFU!&Jzz/48D'3FJJ4O3P%Q
#H4y1}#'7J5#)*#5&,jj&>O*A##-!)(7#'$(+' ,?F<(
 -d=f==F((,,.H$#
 (6123t;F&/&7
Ue, '8"77J)E  -%$/#%#-!) "Mi11777 "(v 	:"RXX::=!'#'	2   '66"3	 7    , +!)%1M EE%! F  6#45-MM ,^^.G'-)%	 _   %'%! MC V*f ! U!$J3q6("STTU >B ;Z  ?	"+"6"6"8((,,.H//.
H ! G%;;.
H   ! G *22I":&TU"V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4!==4y1}">u"EQ*Fu*Mw!2D!CF!CCCC=+ +&AFGAy'*G?	s  B6[7:,S# &R#'CS# R&'S# )[7*S# [7A=S# A<R) >S# 	S
BS# [7S# #[7$S# [7S# S*S# SS# "S!#A,S# [7S# "[7#S# &S# )	S2S	S# SS# S# !S# #
[4-4[/"T76[/7	U UU[/U)"U%#U)([/)	U92U44U99A'[/!A,YYY[4[7	Y$![/#Y$$A[/;Z><[/ [4[7)[//[44[7)rA   boolr|   r5  rz   r`  r   rY   r   rU  rV  )	r  r  r  r  r  r  r  r  rw  s	   `   @@@@@r   clientr  s  s    I$ T#s(^ PS .&)6>y6I	#*eQU eN ` `D	 { {z ../@AL r   is_pass_throughc                    | y| j                  dd      du s| j                  dd      du s| j                  dd      du s| j                  dd      du s|| j                  dd      du sh| j                  dd      du sT| j                  d	d      du s@| j                  d
d      du s,| j                  dd      du s| j                  dd      du s|du ryy)aj  
    Returns True if the call type is an internal async request.

    eg. litellm.acompletion, litellm.aimage_generation, litellm.acreate_batch, litellm._arealtime

    Args:
        kwargs (dict): The kwargs passed to the litellm function
        is_pass_through (bool): Whether the call is a pass-through call. By default all pass through calls are async.
    Fr^  Trc  r  rg  rh  rl  rk  r  acreate_batchacreate_fine_tuning_jobr  )r   r  s     r   r  r  ;  s     ~

=%(D0::lE*d2::'/47::mU+t3::(%0D8::&.$6::i'4/::lE*d2::ou-5::/74?d"r   r>  c                     d| v r| d   du ryt        |t              r	 t        |      }|t        j                  k(  s|t        j
                  k(  ryy# t        $ r Y yw xY w)a$  
    Returns True if the call type is a streaming request.
    Returns True if:
        - if "stream=True" in kwargs  (litellm chat completion, litellm text completion, litellm messages)
        - if call_type is generate_content_stream or agenerate_content_stream (litellm google genai)
    rA  TF)r   r5  rY   r  generate_content_streamagenerate_content_streamr=  s     r   rt  rt  [  sn     6fX.$6 )S!	!),I
 	Y666	:::  		s   A 	AAr  r0  rB  r  c                     | yt        |       }|j                  |||       |j                  |||       |j                          y)z
    Updates response metadata, adds the following:
        - response._hidden_params
        - response._hidden_params["litellm_overhead_time_ms"]
        - response.response_time_ms
    N)r  r0  r   )rB  r  r  )r>   set_hidden_paramsset_timing_metricsapply)r  r  r0  r   rB  r  r  s          r   r  r  z  sQ     ~'H;eFSk    NNr   custom_tokenizerc                 P    |t        |d   |d   |d         }|S t        |       S )N
identifierrevision
auth_token)r  r  r  r0  )create_pretrained_tokenizer_select_tokenizer_helper)r0  r  
_tokenizers      r   _select_tokenizerr$    s?     #0'5%j1'5


 #%00r   )maxsizec                     t         j                  du rt        |       S 	 t        |       }||S 	 t        |       S # t        $ r,}t        j                  d|        Y d }~t        |       S d }~ww xY w)NTzError selecting tokenizer: )r   disable_hf_tokenizer_download_return_openai_tokenizer_return_huggingface_tokenizerr   r   r   )r0  r  r  s      r   r"  r"    s    ,,4'..@.u5M  $E**	  @:1#>?? $E**	@s   : 	A/A**A/c                     dt         dS )Nopenai_tokenizerr   	tokenizerr*   r   s    r   r(  r(    s    &X>>r   c                    | t         j                  v rd| v rt        j                  d      }d|dS | t         j                  v r"d| vrt        j
                  t              }d|dS d| j                         v sd| j                         v rt        j                  d      }d|dS d	| j                         v rt        j                  d
      }d|dS y )Nz	command-rz#Xenova/c4ai-command-r-v01-tokenizerhuggingface_tokenizerr,  zclaude-3zllama-2	replicatez#hf-internal-testing/llama-tokenizerzllama-3zXenova/llama-3-tokenizer)r   cohere_modelsr   from_pretrainedanthropic_modelsfrom_strclaude_json_strlower)r0  cohere_tokenizerclaude_tokenizerr-  s       r   r)  r)    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   r2  c                     |xs t        |       }t        |d   t              r|d   j                  |d      }|S |d   j                  |      }|S )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)r0  textr  tokenizer_jsonencs        r   r<  r<    s`     &G):)GN.-x8[)00"0M J [)006Jr   tokensc                 N    |xs t        |       }|d   j                  |      }|S )Nr   r-  )r$  decode)r0  r@  r  r>  decs        r   rB  rB    s,    %G):)GN

%
,
,V
4CJr   r  r  c                     	 t        j                  | ||      }d|dS # t        $ r:}t        j                  d| d       t        j                  | |      }Y d}~Cd}~ww xY w)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.
    )r  r  z%Error creating pretrained tokenizer: z-. Defaulting to version without 'auth_token'.)r  Nr/  r,  )r   r2  r   r   r   )r  r  r  r-  r  s        r   r!  r!    so    M--j
	 ,)DD  M3A36cd	
 --j8L		Ms    	A"0AA"jsonc                 6    t        j                  |       }d|d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   r4  )rE  r-  s     r   create_tokenizerrG     s     ""4(I+)DDr   r=  r)  count_response_tokenstoolstool_choiceuse_default_image_token_countdefault_token_countc	                 N    t         j                  du ryt        | ||||||||	      S )zh
    The same as `litellm.litellm_core_utils.token_counter`.

    Kept for backwards compatibility.
    Tr   )r   disable_token_countertoken_counter_new)	r0  r  r=  r)  rH  rI  rJ  rK  rL  s	            r   r   r     s=    . $$,%
 
r   custom_llm_providerc                     g d}| |v ryy)zU
    Helper function to know if a provider implementation supports httpx timeout
    )r  azurebedrockTFr:  )rP  supported_providerss     r   supports_httpx_timeoutrU  6  s     911r   c                     t        | |d      S )a  
    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r0  rP  r  _supports_factoryr0  rP  s     r   rW  rW  B  s     /& r   c                     t        | |d      S )a  
    Check if the given model supports web search 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 web search, False otherwise.

    Raises:
    Exception: If the given model is not found in model_prices_and_context_window.json.
    supports_web_searchrX  rY  r[  s     r   r]  r]  W  s     /! r   c                     t        | |d      S )a  
    Check if the given model supports URL context 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 URL context, False otherwise.

    Raises:
    Exception: If the given model is not found in model_prices_and_context_window.json.
    supports_url_contextrX  rY  r[  s     r   r_  r_  l  s     /" r   c                     	 t        j                  | |      \  } }}}t        | |      }|j                  dd      }|d}|S # t        $ r1}t        j                  d|  d| dt        |              Y d}~yd}~ww xY w)	a  
    Check if the given model supports native streaming 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 native streaming, False otherwise.

    Raises:
    Exception: If the given model is not found in model_prices_and_context_window.json.
    r[  supports_native_streamingTNzYModel not found or error in checking supports_native_streaming support. You passed model=, custom_llm_provider=	. Error: F)r   r2   _get_model_info_helperr  r   r   r   r5  )r0  rP  _
model_infora  r  s         r   ra  ra    s    +2+C+C-@,
("Aq ,-@

 %/NN3NPT$U!$,(,%(( ghmgn  oE  FY  EZ  Zc  dg  hi  dj  ck  l	
 	s   A A 	A='A88A=c                    	 t        | |      \  } }}}t
        j                  j                  t
        j                  j                  t
        j                  j                  t
        j                  j                  g}||v ryt        | |d	      S # t        $ r1}t        j                  d|  d| dt	        |              Y d}~yd}~ww xY w)
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[  zOModel not found or error in checking response schema support. You passed model=rb  rc  NFTsupports_response_schemarX  )r2   r   r   r   r5  r   re   	PREDIBASEFIREWORKS_AI	LM_STUDIONEBIUSrZ  )r0  rP  re  r  *PROVIDERS_GLOBALLY_SUPPORT_RESPONSE_SCHEMAs        r   rh  rh    s     +;-@,
("Aq 	&&))&&##	2. HH/& !  ]^c]ddz  |O  {P  PY  Z]  ^_  Z`  Ya  b	
 	s   B 	C'CCc                     t        | |d      S )z[
    Check if the given model supports parallel tool calls and return a boolean value.
    "supports_parallel_function_callingrX  rY  r[  s     r   ro  ro    s     /0 r   c                     t        | |d      S )  
    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_callingrX  rY  r[  s     r   rr  rr    s      /' r   c                     t        | |d      S )zU
    Check if the given model supports `tool_choice` and return a boolean value.
    supports_tool_choicerX  rY  r[  s     r   rt  rt         )<BX r   r  Tc                 L    t        | |      }||j                  |d      du ryy)zf
    Check if the given model supports a provider specific model info and return a boolean value.
    r[  NFT)get_provider_infor  )r0  rP  r  provider_infos       r   _supports_provider_info_factoryry    s6     &)<M  ]%6%6sE%Bd%Jr   c                 r   	 t        j                  | |      \  } }}}t        | |      }|j                  |d      du ry|j                  |      t	        | ||      }||S y# t
        $ rJ}t        j                  d| d|  d| dt        |              t	        | ||      }||cY d}~S Y d}~yd}~ww xY w)	rq  r[  FTNz%Model not found or error in checking z support. You passed model=rb  rc  )	r   r2   rd  r  ry  r   r   r   r5  )r0  rP  r  re  rf  supported_by_providerr  s          r   rZ  rZ  
  s   +2+C+C-@,
("Aq ,-@

 >>#u%-^^C ($C*C%! %0,, 3C58STYSZZp  rE  qF  FO  PS  TU  PV  OW  X	
 !@&!
 !,((s#   =A#  !A# #	B6,:B1&B61B6c                     t        | |d      S )zECheck if a given model supports audio input in a chat completion callsupports_audio_inputrX  rY  r[  s     r   r}  r}  9  s    )<BX r   c                     t        | |d      S )zCCheck if a given model supports pdf input in a chat completion callsupports_pdf_inputrX  rY  r[  s     r   r  r  @  s    )<BV r   c                     t        | |d      S )zFCheck if a given model supports audio output in a chat completion callr}  rX  rY  r[  s     r   supports_audio_outputr  G  ru  r   c                     t        | |d      S )a  
    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_cachingrX  rY  r[  s     r   r  r  P  s      /% r   c                     t        | |d      S )a  
    Check if the given model supports computer use 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 computer use, False otherwise.

    Raises:
    Exception: If the given model is not found or there's an error in retrieval.
    supports_computer_userX  rY  r[  s     r   r  r  g  s      /# r   c                     t        | |d      S )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.
    supports_visionrX  rY  r[  s     r   r  r  ~  s     / r   c                     t        | |d      S )zQ
    Check if the given model supports reasoning and return a boolean value.
    supports_reasoningrX  rY  r[  s     r   r  r    s     )<BV r   c                     	 t        j                  | |      \  } }}}t        | |      }|j                  dd      }|yt	        |t
              r|S y# t        $ r1}t        j                  d|  d| dt        |              Y d}~yd}~ww xY w)z
    Get a list of supported regions for a given model and provider.

    Parameters:
    model (str): The model name to be checked.
    custom_llm_provider (Optional[str]): The provider to be checked.
    r[  supported_regionsNzQModel not found or error in checking supported_regions support. You passed model=rb  rc  )
r   r2   rd  r  r   rR  r   r   r   r5  )r0  rP  re  rf  r  r  s         r   get_supported_regionsr    s    +2+C+C-@,
("Aq ,-@

 'NN+>E$
 '.$$ _`e_ff|  ~Q  }R  R[  \_  `a  \b  [c  d	
 	s   =A  A 	B'BBc                     t        | |d      S )z]
    Check if the given model supports embedding image input and return a boolean value.
    supports_embedding_image_inputrX  rY  r[  s     r   r  r    s     /, r   existing_dictnew_dictc                 X    |j                         D ]  \  }}|	t        |      | |<    | S r   )r  _convert_stringified_numbers)r  r  r  r  s       r   _update_dictionaryr    s3     1=;A>M! !
 r   c                     t        | t              r-	 d| j                         v sd| v rt        |       S t	        |       S | S # t
        t        f$ r | cY S w xY w)zYConvert stringified numbers (including scientific notation) to appropriate numeric types.r  .)r   r5  r6  r  r  r  r  r  s    r   r  r    s]    %		ekkm#se|U|# 5z! L I& 	L	s    A  
A   AA
model_costc                 	   i }t        | t              r| }n&t        | t              rt        j                  |       }|j                         D ]  \  }}	 t        t        t        |            }|d   }t        ||      }t        j                  j                  |i       j                  |       t        j                  d| d|        |j                  d      dk(  r3|t        j                   vst        j                   j#                  |       |j                  d      dk(  r4|t        j$                  vst        j$                  j#                  |       |j                  d      d	k(  r5|t        j&                  vs4t        j&                  j#                  |       U|j                  d      d
k(  r5|t        j(                  vs}t        j(                  j#                  |       |j                  d      dk(  rJ|j+                  dd      }|t        j,                  vst        j,                  j#                  |d          |j                  d      dk(  r5|t        j.                  vs$t        j.                  j#                  |       E|j                  d      dk(  r5|t        j0                  vsmt        j0                  j#                  |       |j                  d      dk(  r5|t        j2                  vst        j2                  j#                  |       |j                  d      dk(  r5|t        j4                  vst        j4                  j#                  |        |j                  d      dk(  r5|t        j6                  vsHt        j6                  j#                  |       i|j                  d      dk(  r5|t        j8                  vst        j8                  j#                  |       |j                  d      dk(  r5|t        j:                  vst        j:                  j#                  |       |j                  d      dk(  r5|t        j<                  vs#t        j<                  j#                  |       D|j                  d      dk(  sZ|t        j>                  vsnt        j>                  j#                  |        | S # t        $ r i }|}Y {w xY w)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"
        },
    }
    urlr   r  zadded/updated model=z in litellm.model_cost: litellm_providerr  text-completion-openaicohere	anthropic
openrouter/r   zvertex_ai-text-modelszvertex_ai-code-text-modelszvertex_ai-chat-modelszvertex_ai-code-chat-modelsai21	nlp_cloudaleph_alpharS  novita) r   r`  r5  r   get_model_cost_mapr  r   get_model_infor   r  r  
setdefaultupdater   r   r  open_ai_chat_completion_modelsr   open_ai_text_completion_modelsr1  r3  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novita_models)r  loaded_model_costr  r  existing_modelmodel_cost_keyupdated_dictionarysplit_strings           r   register_modelr    s     *d#&	J	$#66:F'--/
U	!#'n3.G#HN+E2N
 0F%%nb9@@AST">"22J>JZ[	
 99'(H4'@@@66==cBYY)*.FF'@@@66==cBYY)*h6'///%%,,S1YY)*k9'222((//4YY)*l:99S!,L'333))00aAYY)*.EE'444**11#6YY)*.JJ'999//66s;YY)*.EE'444**11#6YY)*.JJ'999//66s;YY)*f4'---##**3/YY)*k9'222((//4YY)*m;'444**11#6YY)*i7'000&&--c2YY)*h6'///%%,,S1s 0t k  	!N N	!s   SS/.S/c                 2    |t        |t              r| |v ryyr  )r   rR  r  additional_drop_paramss     r   _should_drop_paramr  9	  s"    *-t4''r   passed_paramsdefault_paramsr  c                     i }| j                         D ](  \  }}||v s|||   k7  st        ||      du s$|||<   * |S )Nr  F)r  r  )r  r  r  non_default_paramsr  r  s         r   _get_non_default_paramsr  D	  s^     ##%1^A&&"Q?UV %&q! & r   languager+  r  temperaturetimestamp_granularities)wordsegmentdrop_paramsc           
         ddl m}	 t               }
|
j                  d      |
j                  d      |
j                  d      }|j	                         D ]
  \  }}||
|<    d d d d d}|
j	                         D ci c]  \  }}||v r|||   k7  r|| c}}i }fd}d } t
        j                  | t                    }d	k(  sd
k(  r}ndk(  rWt        j                         j                         } ||       t        j                         j                  || nd      }n6|4|j                  |       } ||       |j                  || nd      }t        ||
|	|j                  dd             }|S c c}}w )Nr   OPENAI_TRANSCRIPTION_PARAMSrP  r  r   )r  r+  r  r  c                    t        j                               dkD  rdt        j                               }|D ]D  }du st        j                  du r|| vrj                  |d        0|| vs5t        dd d       S y )Nr   T  z1Setting user/encoding format is not supported by =. To drop it from the call, set `litellm.drop_params = True`.status_coder-  rN  keysrR  r   r  rM  r   )supported_paramsr  r  rP  r  r  s      r   _check_valid_argz;get_optional_params_transcription.<locals>._check_valid_argx	  s    !&&()A-*//12D4'7+>+>$+F//&**1d3..0$'"STgSh  if  !g   &% .r   r0  r   r  rR  groqr  Fr  rJ  r0  r  r   r  rJ  r  rP  openai_paramsr  )litellm.constantsr  localsrM  r  ProviderConfigManager'get_provider_audio_transcription_configre   r   GroqSTTConfigget_supported_openai_params_sttmap_openai_params_sttr3   map_openai_params/add_provider_specific_params_to_optional_paramsr  )r0  rP  r  r+  r  r  r  r  r   r  r  special_paramsr  r  r  rJ  r  provider_configr  r  s    `     `           @r   !get_optional_params_transcriptionr  T	  s    > HM'++,AB##M2K"&&x0N$$&1a ' 	N "'')AqA):$: 	
1
 O& ?CO&/WW!"56 X 

 h&*=*H,		&"002RRT*:;!//1GG1+'2'>E	 H 
 
	$*FFUFS*:;);;1+'2'>E	 < 
 F'#/1%zz*BDIO us   >F	nqualitysizestylerI  input_fidelityr  c                     t               }|j                  dd        |j                  d      |j                  dd       }
|j                  dd       |j                  dd       }	|j                  d      }|j                         D ]M  \  }}|j                  d      rdk7  rd	k7  r"|d
k(  rd	k7  r-|j                  d      rdk7  rdk7  rI|||<   O d d d d d d d d}t	        |||	      i } fd}|
>|
j                   xs d      } ||       |
j                  | xs dnd      }ndk(  sdk(  st        j                  v r}ndk(  rt        j                  j                         rt        j                  n?t        j                  j                         rt        j                  nt        j                  }|j                         } ||       |j                  i       }nDdk(  r?ddg}	  ||       |t        |      |d<   |dddddd}|j                  |d      }||d <   |j!                         D ]  }||j!                         vs||   ||<    |S )!Nr0  rP  r  r  r  r   aws_rS  	sagemakerr  vertex_	vertex_aivertex_ai_beta)r  r  r  r  r  rI  r  )r  r  r  c                    t        j                               dkD  rjt        j                               }|D ]J  }t        j                  du sdu r|| vrj                  |d        0|| vs5t        dd| d d d       S y )	Nr   Tr  z	Setting `z` is not supported by , r  r  r  )r  r  r  rP  r  r0  r  s      r   r  z7get_optional_params_image_gen.<locals>._check_valid_arg	  s    !&&()A-*//12D''4/;$3F//&**1d3..0$'"+A3.DEXDYY[\a[b  c`  !a   &% .r   r2  r   r  Fr  r  rR  r  rJ  r  r  sampleCountz1:1z16:9z9:16)256x256512x512	1024x1024	1792x1024	1024x1792aspectRatio)r  rM  r  r  r  r3   r  r   openai_compatible_providersAmazonStability3Config_is_stability_3_modelAmazonNovaCanvasConfig_is_nova_modelAmazonStabilityConfigr  r  r  )r0  r  r  r  r  r  rI  r  rP  r  r  r  r   r  r  r  r  r  rJ  r  r  config_classsize_to_aspect_ratioaspect_ratior  s   `       `  `            @r   get_optional_params_image_genr  	  s     HMgt,E'++,AB#''(94@O##M48K*../GN"&&x0N$$&1<<9,1D1S/!&9[&HLL##{2#'77a '  N 1#%5
 ')O& "*FF+2 G 
 	*:;);;1++2'2'>E	 < 
 	x'')'"E"EE,			) --CC%CP ** 11@@u@M ..22 	 (CC%CP*:;&8812 9 
 
	+=	 	*:;=-0VOM*  ! "##$  033eL .:OM*!N''))!.q!1OA " r   encoding_format
dimensionsc           
      R    t               }|j                  dd       |j                  d      }	|j                  dd       |j                  dd       }dt        t           f fd}
t        j                  ||	|       d }i }@t        j                  j                         v r t        j                   t                    }|6|j                   	      } |
|
       |j                  i  nd      }nAdk(  r) #d vrdj                         v rt        dd      }ndk(  rDt         d      } |
|
       t        j                          j                  i  nd      }nʉdk(  rBt         xs ddd      } |
|
       t        j"                         j                  i       }ndk(  r?t         xs ddd      } |
|
       t        j$                  j                  i |      }n?dk(  sdk(  rBt         dd      } |
|
       t        j&                         j                  i |      \  }}ndk(  rRt        j(                         j                         } |
|
       t        j(                         j                  i       }ndk(  rd v rt        j*                         }n\d  v rt        j,                         }nCd! v rt        j.                         }n*d" v rt        j0                         }ng } |
|
       i |}|S |j                         } |
|
       |j                  i       }nd#k(  r>t         d#d      } |
|
       t        j2                         j                  i       }nd$k(  r>t         d$d      } |
|
       t        j4                         j                  i       }nnd%k(  rDt         d%d      } |
|
       t        j6                         j                  i  nd      }n%d&k(  rCt         d&d      } |
|
       t        j8                         j                  i  nd      }n݉d'k(  r>t         d'd      } |
|
       t        j:                         j                  i  (      }ndk7  rd)k7  rt        j<                  vr|t?        j                               d*kD  r]t        j@                  d+u sd+u r3t        j                               }|D ]  }j                  |d         nt        dd, d- d.      }n}tC        ||t        tE        j                               |jG                  dd       /      }d0|v r#t?        |d0         d*k(  r|j                  d0d        |S )1NrP  r   r  r  r  c           	          | y i }j                         D ]  }|| vs|   ||<    |r/t        j                  du sdu ry t        d d| d d      y )NTr   does not support parameters: , for model=zf. To drop these, set `litellm.drop_params=True` or for proxy:

`litellm_settings:
 drop_params: true`
r  )r  r   r  r   )r  unsupported_paramsr  rP  r  r0  r  s      r   r  z8get_optional_params_embeddings.<locals>._check_valid_argG
  s    ##((*A(((:1(="1% + ""d*'K4,?, #233QRdQeeqrwqx  yc  d  r   r  r  rP  r  r0  r  r   r  Fr  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)r0  rP  request_type
databricksr2  r  
nvidia_nim)r  rJ  r   r  gemini	lm_studiorS  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infinityfireworks_ai)r  rJ  r0  rR  r   TzSetting z is not supported by r  r  
extra_body)$r  rM  r   rR  PreProcessNonDefaultParams(embedding_pre_process_non_default_paramsre   _member_map_valuesr  get_provider_embedding_configr3   r  r  r   r   TritonEmbeddingConfigDatabricksEmbeddingConfignvidiaNimEmbeddingConfigVertexAITextEmbeddingConfigLmStudioEmbeddingConfigAmazonTitanG1Config&AmazonTitanMultimodalEmbeddingG1ConfigAmazonTitanV2ConfigBedrockCohereEmbeddingConfigMistralEmbeddingConfigJinaAIEmbeddingConfigVoyageEmbeddingConfigInfinityEmbeddingConfigFireworksAIEmbeddingConfigr  rN  r  r  r   r  )r0  rI  r  r  rP  r  r  r   r  r  r  r  rJ  r  objectfinal_paramsr  r  r  s   `   ``            @r   get_optional_params_embeddingsr1  4
  s    HM'++,A4H"&&x0N##M48K*../GN8D>  & 	#KK') 3#9 	L 	
  6:OO'<#<#<#C#C#EE/MM!"56 N 

 "+:+V+V ,W ,
 	*:;);;1'2'>E	 < 
 
	( "%/ 2 7 7 99( j 
 1O		(6 3%

 	*:;!779KK1'2'>E	 L 
 
	,6+2 ,%

 	*:;!;;=OO12 P 
 
	,6+2 ,%

 	*:;!::LL12f M 
 
	+/Bh/N6 +%

 	*:; //1CC12f D 
	
 
	+++-IIK 	 	*:;!99;MM12 N 
 
		)'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 
 
		)6 )%

 	*:;!88:LL12 M 
 
		)6 )%

 	*:;!779KK12 L 
 
	(6 (%

 	*:;!779KK1'2'>E	 L 
 

	*6 *%

 	*:;!99;MM1'2'>E	 N 
 
	.6 .%

 	*:;!<<>PP12U Q 

 	x'7*w'J'JJ!&&()A-##t+{d/B.3356A&**1d3  - #&'9&::OPcOd  eb  c 
 1O,B'#/9>>@A%zz*BDIL |#L,F(G1(Lt,r   c                     t        | t              r3d| v r
| d   du r| d= | j                         D ]  \  }}t        |        | S t        | t              r| D ]  }t        |        | S )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`  r  _remove_additional_propertiesrR  r  r  r  items       r   r4  r4  2  sw     &$!V+7M0NRW0W-. !,,.JC)%0 ) M 
FD	!D)$/  Mr   c                     t        | t              r,d| v r| d= | j                         D ]  \  }}t        |        | S t        | t              r| D ]  }t        |        | S )zy
    Relevant Issues: https://github.com/BerriAI/litellm/issues/6136, https://github.com/BerriAI/litellm/issues/6088
    strict)r   r`  r  _remove_strict_from_schemarR  r5  s       r   r9  r9  I  sh     &$vx  !,,.JC&u- ) M 
FD	!D&t,  Mr   r  supported_openai_paramsc                     g }|i S | j                         D ]  }||vs|j                  |        |D ]  }| j                  |d        | S )z;
    Remove unsupported params from non_default_params
    N)r  r   rM  )r  r:  remove_keysparamr  s        r   _remove_unsupported_paramsr>  ^  s`     K&	#((*//u% + sD) r   c                       e Zd Zededededeee      dedee   defd       Ze	 	 ddedededeee      d	ed
e	de	defd       Z
y)r  r  r  rP  r  default_param_values#additional_endpoint_specific_paramsr   c                    |j                         D ]Y  \  }}|j                  d      r|dk7  r|j                  d      s.|dk(  r|dk7  r9|j                  d      r|dk7  r|dk7  rU|| |<   [ | j                         D ci c]E  \  }}|dk7  r;|d	k7  r6|d
k7  r1|dk7  r,|dk7  r'|dk7  r"||vr||v r|||   k7  rt        ||      du r||G }}}|S c c}}w )Nr  rS  r  r  r  r  r  r0  rP  api_versionr  allowed_openai_paramsr  r  F)r  r  r  )	r  r  rP  r  r@  rA  r  r  r  s	            r   #base_pre_process_non_default_paramsz>PreProcessNonDefaultParams.base_pre_process_non_default_paramsp  s%    #((*DAq||F##y0+66{Co%*=*LY'';6'+;; M! +& &++-
1W..&&0011@@---a00&0F  qD
 
( "!)
s    A
Cr0  remove_sensitive_keysadd_provider_specific_paramsc                 n    t         j                  | |||t        D ci c]  }|d  c}dg      }|S c c}w )Nr*  r  r  rP  r  r@  rA  )r  rE  r"   )	r  r  rP  r  r0  rF  rG  r  r  s	            r   r  zCPreProcessNonDefaultParams.embedding_pre_process_non_default_params  sN     'JJ+-$7'=7N%O!ag%O5<I K  	 "! &Ps   
2NFF)r  
__module____qualname__staticmethodr`  r5  r   r~   rE  r  r  r:  r   r   r  r  o  s    -"-"-" !-" !)c 3	-"
 #-" .2#Y-" 
-" -"^  ',-2""" !" !)c 3	"
 "  $" '+" 
" "r   r  r  rF  rG  c           	         t         j                  | |||t        dg      }d}|@|t        D 	cg c]  }	|	j                   c}	v r t
        j                  |t        |            }d|v r-||j                  |d         |d<   nt        |d         |d<   d|v rzt        |t              rj|d   }
|
D ]`  }|j                  di       }|j                  d	d      }|*t        j                  |      }d
|v r|d
   du r|j                  d
d       ||d	<   b |r+t        || |t        t        j                                |      }|rt#        |      }|S c c}	w )zA
    Pre-process non-default params to a standardized format
    r)  rI  Nr  r  r  rI  function
parametersr3  Fr  )r  rE  r   re   r  r  get_provider_chat_config$get_json_schema_from_pydantic_objectr   r   rR  r  r  rZ  rM  r  r  remove_sensitive_keys_from_dict)r  r  rP  r  r0  rF  rG  r  r  r   rI  tooltool_functionrP  new_parameterss                  r   pre_process_non_default_paramsrW    s    4WW#%/5A-7L X  -1O&+>'3C#C , 0HH,/B"C I 
 ..&DD$67H$I E  01 5R 23D E501 $$D* #7+   !HHZ4M&**<>J%!%z!:*n<&'=>%G"&&'=tD.<l+  $L.' 3CHHJK#9
 <=OPeCs   Edc                     g d}g }| j                         D ](  t        fd|D              s|j                         * |D ]  | j                          | S )z1
    Remove sensitive keys from a dictionary
    )r  secretaccess
credentialc              3   B   K   | ]  }|j                         v   y wr   )r6  )r   phraser  s     r   r   z2remove_sensitive_keys_from_dict.<locals>.<genexpr>  s     Iv$Is   )r  r   r   rM  )rX  sensitive_key_phrasesr<  r  s      @r   rS  rS    sZ     FKvvxI3HIIs#  	c
 Hr   c                    i }t         j                  }||d   v r	 |dk(  r&t        j                         j                  | |      }n|dk(  r&t        j                         j                  | |      }nZ|dk(  s|dk(  r&t        j
                         j                  | |      }n*|dk(  r%t        j                         j                  | |      }d|v s	d	|v sd
|v r*|dk(  r$|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r |dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|dk7  r|t         j                  vr|dk(  rVd|d<   d t         _        d
|v r(|j                  d
      |d!<   |j                  d"d#       |S d|v r|j                  d      |d!<   |S t         j                  r'|j                  d
|j                  dd#            |d!<   |S t        d$d%| d&'      |S )(z-For .completion(), preprocess optional params	providersrR  r  rS  r  r  watsonx	functionsfunction_callrI  ollamar  anyscaletogether_air  r  cerebrasxai	ai21_chat
volcenginedeepseek	codestralr  r  cohere_chatr  ollama_chatr  nebiusrE  formatTfunctions_unsupported_modelrJ  Nr  z%Function calling is not supported by r  r  )r   !common_cloud_provider_auth_paramsAzureOpenAIConfigmap_special_auth_paramsAmazonBedrockGlobalConfigVertexAIConfigIBMWatsonXAIConfigr  add_function_to_promptrM  r   )r  r  rP  rJ  common_auth_dicts        r   pre_process_optional_paramsr{    s    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 	))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#x/#7+N+NN"h.,2) . 00*..w7 $$AB '**%t& ! !$66*..{; $$AB  ..ASAWAW/33KFB =>  - #CDWCXXYZ 
 r   rD  thinkingweb_search_optionsc$           
          ./ t               j                         //j                  d      }%t        /|%|        .t	        /.      }&d }'@t
        D (cg c]  }(|(j                   c}(v r t        j                   t                    }'dt        t           f ./fd})t               }*|*t         d      }*|*xs g }*|xs g }|*j                  |        |)|*xs g 	       d
k(  r=t        j                         j                   .|&t!        t"              rnd      }&nˉdk(  rxt        j$                         j                   .|&t!        t"              rnd      }&t        j$                         j                   .|&t!        t"              rnd      }&nNdk(  r=t        j&                         j                  .|& t!        t"              rnd      }&ndk(  r=t        j(                         j                  .|& t!        t"              rnd      }&nʉdk(  r-t        j*                         j                  .|& nd      }&ndk(  r=t        j,                         j                  .|& t!        t"              rnd      }&nVdk(  r=t        j.                         j                  .|& t!        t"              rnd      }&ndk(  r=t        j0                         j                  .|& t!        t"              rnd      }&n҉dk(  r=t        j2                         j                  .|& t!        t"              rnd      }&ndk(  r=t        j4                         j                  .|& t!        t"              rnd      }&nNdk(  r t        j6                  v sZ t        j8                  v sH t        j:                  v s6 t        j<                  v s$ t        j>                  v s t        j@                  v r=t        jB                         j                  .|& t!        t"              rnd      }&ndk(  r=t        jD                         j                  .|& t!        t"              rnd      }&n^dk(  s	dk(  rAd v r=t        jB                         j                  .|& t!        t"              rnd      }&nt        jF                  jI                         r=t        jF                         j                   .|&t!        t"              rnd      }&
ndk(  r t        jJ                  v r~d v r=t        jL                         j                   .|&t!        t"              rnd      }&
n\t        jN                         j                   .|&t!        t"              rnd      }&
n t        jP                  v r=t        jR                         j                  .|& t!        t"              rnd      }&	nt        jT                         j                  .|& t!        t"              rnd      }&	ndk(  r=t        jV                         j                  .|& t!        t"              rnd      }&	nQdk(  r3tY        jZ                         }+tY        j\                         },|+dk(  s|+dk(  r=t        j^                         j                   .|&t!        t"              rnd      }&nd
|,v r|+dk(  r|,ja                  d       r=t        jb                         j                  .|& t!        t"              rnd      }&nt        jd                         j                  .|& t!        t"              rnd      }&nF|'C|'j                  .|& t!        t"              rnd      }&nd!k(  r=t        jf                         j                   .|&t!        t"              rnd      }&n։d"k(  r=t        jh                         j                  .|& t!        t"              rnd      }&nd#k(  r=t        jj                         j                   .|&t!        t"              rnd      }&nRd$k(  r=t        jl                         j                  .|& t!        t"              rnd      }&nd%k(  r=t        jn                         j                  .|& t!        t"              rnd      }&nΉd&k(  r=t        jp                         j                  .|& t!        t"              rnd      }&nd'k(  r-|'+|'j                  .|& t!        t"              rnd      }&nZd(k(  sdk(  r=t        jN                         j                  .|& t!        t"              rnd      }&nd)k(  r=t        jL                         j                  .|& t!        t"              rnd      }&nщd*k(  r=t        jr                         j                  .|& t!        t"              rnd      }&nd+k(  r=t        jt                         j                   .|&t!        t"              rnd      }&nMd,k(  r=t        jv                         j                  .|& t!        t"              rnd      }&nd-k(  r(t        jx                         j                   .|&.      }&nމd/k(  sd0k(  r=t        jz                         j                  .|& t!        t"              rnd      }&nd1k(  r=t        j|                         j                  .|& t!        t"              rnd      }&nUd2k(  r=t        j~                         j                  .|& t!        t"              rnd      }&nd3k(  r=t        j                         j                  .|& t!        t"              rnd      }&nщd4k(  r=t        j                         j                  .|& t!        t"              rnd      }&nd5k(  r=t        j                         j                  .|& t!        t"              rnd      }&nMd6k(  r=t        j                         j                  .|& t!        t"              rnd      }&nd7k(  r=t        j                         j                  .|& t!        t"              rnd      }&nɉd8k(  rt        j                         j                  .|& t!        t"              rnd      }&/j                         D ]3  }-t        j                         j                  |-      s't        d9|-        nAd:k(  r=t        j                         j                  .|& t!        t"              rnd      }&ndk(  r=t        j                         j                  .|& t!        t"              rnd      }&nd;k(  r=t        j                         j                  .|& t!        t"              rnd      }&n{d<k(  rt        j                         j                   =      r=t        j                         j                  .|& t!        t"              rnd      }&nt        j                  d>j                  |t        j                  t        d?                   |xs/ t        j                  xs t        d?      xs t        j                  }t        j                         j                  .|& |t!        t"              rnd@      }&ng|'*|'j                  .|& t!        t"              rnd      }&n;t        j                         j                  .|& t!        t"              rnd      }&t        |&/t        t        j                               | A      }&t        dB|&        t        |&.|C      }&|&S c c}(w )DNr   r  )r  r  rP  r  r  c                 8   t        j                  d d        t        j                  d        t        j                  d        i }j                         D ]0  }|| vs|dk(  s
|dk(  s|dk(  r|dk(  rd	k(  r#|d
k(  r)|   ||<   2 |rt        j
                  du s,du r(|j                         D ]  }j                  |d        yt        d dt        |j                                d dt        |j                                d      y)z
        Check if the params passed to completion() are supported by the provider

        Args:
            supported_params: List[str] - supported params from the litellm config
        z
LiteLLM completion() model= z; provider = z(
LiteLLM: Params passed to completion() z4
LiteLLM: Non-Default params passed to completion() rI  rH  rA  r  r   max_retriesTNr  r  r  z. To drop these, set `litellm.drop_params=True` or for proxy:

`litellm_settings:
 drop_params: true`
. 
 If you want to use these params dynamically send allowed_openai_params=z in your request.r  )	r   r   r   r  r   r  rM  r   rR  )	r  r  r  rP  r  r0  r  r  r  s	      r   r  z-get_optional_params.<locals>._check_valid_arg  s    	,UG=AT@UV	
 	7G	
 	CDVCWX	
  #((*A((;!'7"71=8Q& -?q,A&q) + ""d*'K4,?+002A&**1d3 3 - #233QRVWiWnWnWpRqQrr~  @E  F  F|  }A  BT  BY  BY  B[  }\  |]  ]n  o  r   r[  r  r  r  F)r0  r  rJ  r  anthropic_textr  r  rn  r  maritalkr0  	predibasehuggingfacerg  r  r  r  rm  r  rS  converseconverse_likeinvokezanthropic.claude-3
cloudflarere  ro  r  petals	deepinfra
perplexityr  text-completion-codestralr  r  rh  ri  )r0  r  rJ  rj  r  r  rk  hosted_vllmvllmr  rl  r  rb  zLiteLLM now defaults to Watsonx's `/text/chat` endpoint. Please use the `watsonx_text` provider instead, to call the `/text/generation` endpoint. Param: watsonx_textrp  rR  r   zoAzure optional params - api_version: api_version={}, litellm.api_version={}, os.environ['AZURE_API_VERSION']={}AZURE_API_VERSION)r  rJ  r0  rC  r  r  z Final returned optional params: )rJ  r  rD  )Zr  r  rM  rW  r{  re   r  r  rQ  r~   r5  r3   r  r   AnthropicConfigr  r   r  AnthropicTextConfigCohereConfigCohereChatConfigTritonConfigMaritalkConfigReplicateConfigPredibaseConfigHuggingFaceChatConfigTogetherAIConfigr  r  r  r  vertex_language_modelsvertex_vision_modelsVertexGeminiConfigGoogleAIStudioGeminiConfigVertexAIAnthropicConfigis_supported_modelvertex_mistral_modelsCodestralTextCompletionConfigMistralConfigvertex_ai_ai21_modelsVertexAIAi21ConfigVertexAILlama3ConfigSagemakerConfigrF   get_bedrock_routeget_base_modelAmazonConverseConfigr  AmazonAnthropicClaude3ConfigAmazonAnthropicConfigCloudflareChatConfigOllamaConfigOllamaChatConfigNLPCloudConfigPetalsConfigDeepInfraConfigDatabricksConfigNvidiaNimConfigCerebrasConfigXAIChatConfigAI21ChatConfigFireworksAIConfigVolcEngineConfigHostedVLLMChatConfig
VLLMConfigGroqChatConfigOpenAIConfigOpenrouterConfigIBMWatsonXChatConfigr  rx  is_watsonx_text_paramr  NebiusConfigAzureOpenAIO1Configis_o_series_modelr   r   rq  rC  rK   AZURE_DEFAULT_API_VERSIONrt  OpenAILikeChatConfigr  rR  r   r   _apply_openai_param_overrides)0r0  rc  rd  r  top_pr  rA  rH  stopr  max_completion_tokens
modalities
predictionaudiopresence_penaltyfrequency_penalty
logit_biasrI  rP  r  seedrI  rJ  r  logprobstop_logprobsextra_headersrC  parallel_tool_callsr  rD  reasoning_effortr  r)  r|  r}  r   r  rJ  r  r   r  r  bedrock_routebedrock_base_modelr=  r  r  s0   `    `            `          `                @@r   get_optional_paramsr  t  sj   R HMMOM"&&x0N7#%/5 2#-/O
 -1O&+>'3C#C , 0HH,/B"C I 
)49 ) )V 3)< 6X
 (-217R12)/R k)!113EE1+ *z+t/L  F 	
 
 0	0!557II1+ *z+t/L  J 	
 "557II1+ *z+t/L  J 	
 
	( "..0BB1+ *z+t/L  C 	
 
	-!224FF1+ *z+t/L  G 	
 
	(!..0BB1+'2'>E	 C 
 

	*!002DD1+ *z+t/L  E 	
 
	+!113EE1+ *z+t/L  F 	
 
	+!113EE1+ *z+t/L  F 	
 
	-!779KK1+ *z+t/L  L 	
 
	-!224FF1+ *z+t/L  G 	
 
	++++G333G...G333G222G000!446HH1+ *z+t/L  I 	
 
	(!<<>PP1+ *z+t/L  Q 	
 
 0	0{*x5/@!446HH1+ *z+t/L  I 	
 
	(	(	;	;)< 
< 
 "99;MM1+ *z+t/L  N 	
 
	+G111e#99;MM#+=(7  +6:kSW;X (!& N 	   #*"7"7"9"K"K'9$3 '2z+t7T $" #L 	# g333%88:LL#5 / #.:k43P   M 	O &::<NN#5 / #.:k43P   O 	O 
	+!113EE1+ *z+t/L  F 	
 
		)(::5A-<<UCJ&-?*J%::<NN#5 / #.:k43P   O 	O ..=H3L!,,-AB88:LL+=(7#  +6:kSW;X (!& M 	   #*"?"?"A"S"S'9$3 '2z+t7T $" #T 	# (-??#5 / #.:k43P   @ 	O 
	,!668JJ1+ *z+t/L  K 	
 
	(!..0BB1+ *z+t/L  C 	
 
	-!224FF1+ *z+t/L  G 	
 
	+!002DD1+ *z+t/L  E 	
 
	(!..0BB1+ *z+t/L  C 	
 
	+!113EE1+ *z+t/L  F 	
 
	,1L);;1+ *z+t/L  < 	
 
		)-@K-O!//1CC1+ *z+t/L  D 	
 
 ;	;!??ASS1+ *z+t/L  T 	
 
	,!224FF1+ *z+t/L  G 	
 
	,!113EE1+ *z+t/L  F 	
 

	*!002DD1+ *z+t/L  E 	
 
	%!//1CC1+ D 

 
	+/Bf/L!002DD1+ *z+t/L  E 	
 
	.!335GG1+ *z+t/L  H 	
 
	,!224FF1+ *z+t/L  G 	
 
	-!668JJ1+ *z+t/L  K 	
 
	&!,,.@@1+ *z+t/L  A 	
 
	&!002DD1+ *z+t/L  E 	
 

	*!..0BB1+ *z+t/L  C 	
 
	,!224FF1+ *z+t/L  G 	
 
		)!668JJ1+ *z+t/L  K 	
 #'')E))+AA%H  p  qv  pw  x  *
 
	.!446HH1+ *z+t/L  I 	
 
	(!..0BB1+ *z+t/L  C 	
 
	(!..0BB1+ *z+t/L  C 	
 
	'&&(:::G%99;MM#5 / #.:k43P   N 	O    B  I  I!4!4jAT6U  5&&5125 44	  &779KK#5 /' #.:k43P   L 
O 
	$);;1+ *z+t/L  < 	
 "668JJ1+ *z+t/L  K 	
 F'#/?DDFG5O 4_4EFG3'-3O
 GCs   AArJ  r  c                    |g dt         j                  z   v rt        d|      du r|j                  di       }|j	                         D ]  }||vs||   ||<    | j                  di        i | d   |}|(|j                         D ci c]  \  }}||vr|| }	}}n|}	t        |	      | d<   | S |j	                         D ]  }||vs||   | |<    | S c c}}w )z9
    Add provider specific params to optional_params
    )r  rR  r  r  r  F)r  )r   r  r  rM  r  r  r  r4   )
rJ  r  rP  r  r  r  r  initial_extra_bodyr  processed_extra_bodys
             r   r  r  r  s@    	8

-
-.	. 7M 
 '**<<J"'')M)$1!$4JqM * &&|R8"!,/""
 &1 !3 8 8 :(1 66 qD($ ( (:$,F/-OL)  ##%A%%21%5" & (s   Cc                 L    |r!|D ]  }|| vs|j                  |d      | |<    | S )z
    If user passes in allowed_openai_params, apply them to optional_params

    These params will get passed as is to the LLM API since the user opted in to passing them in the request
    N)rM  )rJ  r  rD  r=  s       r   r  r    s8     *EO+);)?)?t)L& + r   c                     | j                         D ci c]&  \  }}|dk7  r|dk7  r|t        v r|t        |   k7  r||( }}}|S c c}}w )Nr0  rP  )r  r   )r  r  r  r  s       r   get_non_default_paramsr    sg     "'')	AqL**999!<< 	
1	 	 	s   +Amax_parallel_requestsrpmtpmdefault_max_parallel_requestsc                 T    | | S ||S |t        |dz  dz        }|dk(  rd}|S ||S y)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


    N     r   r   )r  )r  r  r  r  calculated_rpms        r   calculate_max_parallel_requestsr    sS    : ($$	
	S4Z!^,QN	&	2,,r   healthy_deploymentsc                     t        d | D        d       }|(| D cg c]  }|d   j                  d      |k(  r| }}|S | S c c}w )Nc              3   :   K   | ]  }d |d   v r
|d   d      yw)orderrK  Nr:  )r   
deployments     r   r   z2_get_order_filtered_deployments.<locals>.<genexpr>  s1      	
*%566 '(1	
s   )defaultrK  r  )minr  )r  	min_orderr  filtered_deploymentss       r   _get_order_filtered_deploymentsr    sr    	
1	

 I  2 
*+//8IE  
  
 $# 
s    ArK  c                 @   | dk(  rX|j                   xs* t        j                   xs t        d      xs t        d      }|t        |t              r|S |j                  S | dk(  r|j
                  }||S |j                  S | dk(  r|j                  }||S |j                  S )z=
    Return the region for a model, for a given provider
    r  VERTEXAI_LOCATIONVERTEX_LOCATIONrS  rb  )vertex_locationr   rK   r   r5  aws_region_namewatsonx_region_nameregion_name)rP  rK  vertex_ai_locationr  r  s        r   _get_model_regionr    s     k) ** -&&--.- +,	 	 )j9KS.Q%% %%% 
		)(88&""
 %%%	 
		),@@*&&%%%r   c                    t        j                  | j                  |       \  }}}}t        ||       }|/t	        j
                  dj                  | j                               y|dk(  rEt        j                         j                         }t        j                         j                         }n|dk(  rEt        j                         j                         }t        j                         j                         }n|dk(  rEt        j                         j                         }t        j                         j                         }nN|dk(  rEt        j                         j                         }t        j                         j                         }ng }g }|D ]  }||j                         v s y	 |D ]  }||j                         v s y
 y)z
    Infer if a model is in the EU or US region

    Returns:
    - str (region) - "eu" or "us"
    - None (if region not found)
    )r0  rK  )rP  rK  Nz'Cannot infer model region for model: {}rR  r  rS  rb  euus)r   r2   r0  r  r   r   rq  rt  get_eu_regionsget_us_regionsrw  rv  rx  r6  )rK  r0  rP  re  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    | j                   dk(  ryt        |       }||dk(  ryy)8
    Return true/false if a deployment is in the EU
    r  TrK  Fr  r  rK  r   s     r   _is_region_eur
  N  4     !!T) 'nELLD$8r   c                 L    | j                   dk(  ryt        |       }||dk(  ryy)z8
    Return true/false if a deployment is in the US
    r  Tr  Fr  r	  s     r   _is_region_usr  \  r  r   allowed_model_regionc                 $    | j                   |k(  ryy)r  TF)r  )rK  r  s     r   is_region_allowedr  j  s     !!%99r   modec           	         d| j                   v rt        | j                  t              rt        | j                  t              r| j                   j                  dd      }t        j                         j                  || j                  | j                  | j                  xs t        j                  d|xs d      }|j                  dd      }|S y)	zM
    Pass the litellm params for an azure model, and get back the region
    rR  zazure/r2  
   chat)r0  api_keyrG  rC  r  r  zx-ms-regionN)r0  r   r  r5  rG  replacer   AzureChatCompletionget_headersrC  r  r  )rK  r  _modelr  r  s        r   get_model_regionr  u  s     	>'''~--s3~..4%%--h; 446BB"**#,,&22Wg6W6W C 
 !)]D Ar   c                 d    	 | j                  d      }t        |      d d }|S # t        $ r Y yw xY w)Nr)  d   r2  )r  r5  r   )r   	_messagess     r   get_first_chars_messagesr    s=    JJz*		N4C(	 s    # 	//c                 H    dj                  d | D              }t        |      S )Nr2  c              3   B   K   | ]  }|j                         r|  y wr   )isspace)r   chars     r   r   z$_count_characters.<locals>.<genexpr>  s     HTDHs   )r   rN  )r=  filtered_texts     r   _count_charactersr$    s!    GGHTHHM}r   response_objc                 4   | j                   }d}|D ]  }t        |t              r1|j                  j                  *||j                  j                  z  }Dt        |t
              sU|j                  j                  l||j                  j                  z  } |S )Nr2  )r  r   r\   r-  r1  rq   delta)r%  _choicesresponse_strchoices       r   get_response_stringr+    s      Lfg&~~%%1 6 66 01||##/ 4 44  r   llm_providerdynamic_api_keyc                    |xs t         j                  }| dk(  s| dk(  r#|xs t         j                  xs t        d      }|S | dk(  s| dk(  r#|xs t         j                  xs t        d      }|S | dk(  r#|xs t         j
                  xs t        d      }|S | d	k(  r#|xs t         j                  xs t        d
      }|S | dk(  r#|xs t         j                  xs t        d      }|S | dk(  s| dk(  r#|xs t         j                  xs t        d      }|S | dk(  r#|xs t         j                  xs t        d      }|S | dk(  r#|xs t         j                  xs t        d      }|S | dk(  r#|xs t         j                  xs t        d      }|S | dk(  r0|xs* t         j                  xs t        d      xs t        d      }|S | dk(  r!|xs t         j                  xs t        d      }|S )Nr  r  OPENAI_API_KEYr  r  ANTHROPIC_API_KEYr  AI211_API_KEYr  ALEPH_ALPHA_API_KEYbasetenBASETEN_API_KEYr  rn  COHERE_API_KEYr  HUGGINGFACE_API_KEYr  NLP_CLOUD_API_KEYr0  REPLICATE_API_KEYrg  TOGETHERAI_API_KEYTOGETHER_AI_TOKENrp  NEBIUS_API_KEY)r   r  
openai_keyrK   anthropic_keyai21_keyaleph_alpha_keybaseten_key
cohere_keyhuggingface_keynlp_cloud_keyreplicate_keytogetherai_api_key
nebius_key)r,  r-  r  s      r   get_api_keyrG    s+   0Gx<3K#KOW//O:>N3OP NM 
	$8H(HUW22UjAT6UJ NG 
	LW--LO1LD NA 
	&Sw..S*=R2S 	> N7 
	"QW00QJ?P4Q4 N1 
	!\]%BOW//O:>N3O. N+ 
	&Sw..S*=R2S 	( N! 
	$UW22UjAT6U N 
	$UW22UjAT6U N 
	& /))/.// -.	 	 N 
	!OW//O:>N3ONr   c                      dd l } ddl m } t        | d      r |j                  | j                        S  |j                         S )Nr   r  UTC)r  hasattrr  rJ  utcnow)dtr  s     r   get_utc_datetimerN    s6    !r5x||BFF##x  r   c                 :   d }	 | t         j                  v rVdt         j                  |    v rt         j                  |    d   S dt         j                  |    v rt         j                  |    d   S t        |       \  } }}}|dk(  r ||       }|S | t         j                  v rWdt         j                  |    v rt         j                  |    d   S dt         j                  |    v rt         j                  |    d   S yt               # t        $ r t        d|  d	      w xY w)
aY  
    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                     d|  d}	 t         j                  j                  |      }|j                          |j	                         }|j                  d      }||S y # t
        $ r Y y w xY wNzhttps://huggingface.co/z/raw/main/config.jsonmax_position_embeddingsr   module_level_clientr  raise_for_statusrE  r   
model_name
config_urlr  config_jsonrR  s        r   _get_max_position_embeddingsz4get_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_tokensr  r   r  rW  NzModel zr isn't mapped yet. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json)r   r  r2   r   )r0  rZ  rP  re  r  s        r   get_max_tokensr^    s8   $&
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
 	

s)   <D *D - D <D *D 7
D Dc                 0    t        j                  dd|       S )Nz-\d+$r2  resubr]  s    r   _strip_stable_vertex_versionrc  %  s    66(B
++r   c                 2    ddl m}  |j                  |       S )z
    Get the base model from the given model name.

    Handle model names like - "us.meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
    AND "meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
    r   rE   )!litellm.llms.bedrock.common_utilsrF   r  )rW  rF   s     r   _get_base_bedrock_modelrf  )  s     C***:66r   rW  c                 0    t        j                  dd|       S )a  
    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}$r2  r`  r]  s    r   !_strip_openai_finetune_model_namerh  5  s     66/2z22r   c                     |r|dv rt        |       }|S |r|dk(  s|dk(  rt        |       }|S |r|dk(  rt        |       }|S d| v rt        |       }|S | S )N)rS  bedrock_converser]  r  r  r  zft:)rf  rc  rh  )r0  rP  stripped_bedrock_modelstrip_versionstrip_finetunes        r   _strip_model_namern  E  sy    26UU!8E!J%%	{*.AX.M4F	"5"E4F	%:eLr   c                 (    t         j                  |    S r   r   r  r  s    r   _get_model_info_from_model_costrr  X  s    c""r   rf  c                     |rmd| v ri| d   |k7  ra|dk(  r| d   j                  d      ry|dk(  r| d   j                  d      ry|j                  d      r| d   j                  d      ry|dk(  ryyy)zG
    Check if the model info provider matches the custom provider.
    r  r  Tr  rS  litellm_proxyF)r  rf  rP  s     r   _check_provider_matchrv  \  s     j()*.AA+-*3

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

*^
$8%  ++I6:<

*Y
<  ?2r   )	TypedDictc                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)'PotentialModelNamesAndCustomLLMProvidersplit_modelcombined_model_namestripped_model_namecombined_stripped_model_namerP  N)r  rK  rL  r5  __annotations__r:  r   r   ry  ry  }  s     "%%r   ry  c           
         |$	 t        |       \  }}}}| }t        | |      }|}n|rK| j                  |dz         r7| j	                  dd      d   }| }t        ||      }dj                  ||      }n3| }dj                  ||       }t        | |      }dj                  ||      }t        ||||t        t        |            S # t        $ r | }Y w xY w)Nr   r[  r  r   z{}/{})rz  r{  r|  r}  rP  )	r2   r   rn  r  r  rq  ry  r   r5  )r0  rP  rz  re  r{  r|  r}  s          r   _get_potential_model_namesr    s    "	 5EE5R2K,a $/-@
 (;$	!1!1c!" kk#q)!,#/3F
 (/~~!4(
$ %nn-@%H/-@
 (/~~(
$
 3//%A &9: ;  	 K	 s   C CCc                     d|  d}	 t         j                  j                  |      }|j                          |j	                         }|j                  d      }||S y # t
        $ r Y y w xY wrQ  rS  rV  s        r   rZ  rZ    sx    *:,6KLJ..22:>!!# mmo #.//2K"L".** r[  c                     t        | |      S )z_
    _get_model_info_helper wrapped with lru_cache

    Speed Optimization to hit high RPS
    r[  )rd  r[  s     r   _cached_get_model_info_helperr    s     "CVWWr   c                     d }|r(|t         v r t        j                  | t        |            }d }|r|j	                  |       }|S )Nr  r   )rf   r  get_provider_model_infore   rw  )r0  rP  r  rf  s       r   rw  rw    sX     37O2oE/GG,/B"C H 
 7;J$66U6C
r   potential_model_namesc                 B    t        d | j                         D              S )zA
    Check if the potential model name is in the model cost.
    c              3   @   K   | ]  }|t         j                  v   y wr   rp  )r   potential_model_names     r   r   z9_is_potential_model_name_in_model_cost.<locals>.<genexpr>  s#        	 2 22s   )r   r  )r  s    r   &_is_potential_model_name_in_model_costr    s'      $9$@$@$B  r   c           	      h   	 i t         j                  t         j                  }| |v r||    } ||dk(  rd}|U|dk(  rPd| z   t         j                  v rd| z   } n5| dz   t         j                  v r| dz   } n| dz   t         j
                  v r| dz   } t        | |      }t        j                  d|        |d   }|d	   }|d
   }|d   }|d   }|dk(  rEt        |       }t        dJi d| d|ddddddddddddddddddddddddddd dS |d!k(  s|d"k(  r.t        |      s#t        j                         j                  |       S 	 d}	d}
|t         j                  v r+|}
t        t!        t"        |
      #      }	t%        |	|$      sd}	|	=| t         j                  v r+| }
t        t!        t"        |
      #      }	t%        |	|$      sd}	|	=|t         j                  v r+|}
t        t!        t"        |
      #      }	t%        |	|$      sd}	|	=|t         j                  v r+|}
t        t!        t"        |
      #      }	t%        |	|$      sd}	|	=|t         j                  v r+|}
t        t!        t"        |
      #      }	t%        |	|$      sd}	|	|
t'        d%      |	j)                  d      }|'t        j                  d&j+                  | |             d}|	j)                  d      }|'t        j                  d'j+                  | |             d}t        dJi d|
d|	j)                  dd      d|	j)                  dd      d|	j)                  dd      d|d(|	j)                  d(d      d)|	j)                  d)d      d*|	j)                  d*d      d+|	j)                  d+d      d,|	j)                  d,d      d-|	j)                  d-d      d.|	j)                  d.d      d/|	j)                  d/d      d0|	j)                  d0      d1|	j)                  d1      d|d2|	j)                  d2d      d3|	j)                  d3d      d4|	j)                  d4d      d5|	j)                  d5d      d6|	j)                  d6d      d7|	j)                  d7d      d8|	j)                  d8d      d9|	j)                  d9d      d:|	j)                  d:d      d;|	j)                  d;d      d|	j)                  d|      d|	j)                  d      d|	j)                  dd      d|	j)                  dd      d<|	j)                  d<d      d|	j)                  dd      d|	j)                  dd      d|	j)                  dd      d|	j)                  dd      d=|	j)                  d=d      d>|	j)                  d>d      d |	j)                  d d      d?|	j)                  d?d      d@|	j)                  d@d      dA|	j)                  dAd      dB|	j)                  dBd      dC|	j)                  dCd      d|	j)                  dd      dD|	j)                  dDd      dE|	j)                  dEd      dF|	j)                  dFd      S # t,        $ rG}t        j                  dG|        dHt#        |      v r|t-        dIj+                  | |            d}~ww xY w)Kzy
    Helper for 'get_model_info'. Separated out to avoid infinite loop caused by returning 'supported_openai_param's
    Nr  r  zmeta/z@latestr[  z6checking potential_model_names in litellm.model_cost: r{  r|  r}  rz  rP  r  r]  r  r  max_input_tokensr\  input_cost_per_tokenr   output_cost_per_tokenr  r  r  rW  rh  rr  rt  supports_assistant_prefillr  r  r  re  ro  rq  ru  z|This model isn't mapped yet. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.jsonz`model={}, custom_llm_provider={} has no input_cost_per_token in model_cost_map. Defaulting to 0.zamodel={}, custom_llm_provider={} has no output_cost_per_token in model_cost_map. Defaulting to 0.cache_creation_input_token_costcache_read_input_token_costinput_cost_per_character&input_cost_per_token_above_128k_tokens&input_cost_per_token_above_200k_tokensinput_cost_per_queryinput_cost_per_secondinput_cost_per_audio_tokeninput_cost_per_token_batchesoutput_cost_per_token_batchesoutput_cost_per_audio_tokenoutput_cost_per_characteroutput_cost_per_reasoning_token'output_cost_per_token_above_128k_tokens+output_cost_per_character_above_128k_tokens'output_cost_per_token_above_200k_tokensoutput_cost_per_secondoutput_cost_per_imageoutput_vector_sizecitation_cost_per_tokenr  r}  r  r  ra  r]  r_  r  search_context_cost_per_queryr  r  zError getting model info: 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   
azure_llmsazure_embedding_modelsvertex_llama3_modelsr  r  r  r   r   rZ  rj   r  r  r  r  rr  r   r5  rv  r  r  rq  r   )r0  rP  r  r  r{  r|  r}  rz  r  _model_infor  _input_cost_per_token_output_cost_per_tokenr  s                 r   rd  rd    s   p
M**Mg.L.LM
Ju%E*/BFV/V"-*/Bk/Q'">">>%"g&C&CC	)"g&C&CC	) :-@!
 	DEZD[\	
 44IJ34IJ'<*(
$ ,M:34IJ-/5GJ  % "& #'	
 &' '( "/  *. *. +/ &* ,0 )- '+  $(! &  8+/Bm/S89NO'')88?? 59K!%C"g&8&88)=$sC.Q,*@S #'K"u0B0B'B=$sC.Q,*@S #'K#0G4F4FF2=$sC.Q,*@S #'K"':g>P>P'P)=$sC.Q,*@S #'K"{g6H6H'H!=$sC.Q,*@S #'K"ck  S  6A__&6! %,$$v}}2
 )*%6Aoo'7" &-$$w~~2
 *+&  ``&??<>` "-1CT!J` #.//2Et"L	`
 &;` 1<5t1` -8OO14-` *5.*` 8C<d8`$ 8C<d8%`* &1__5KT%R+`, '2oo6Mt&T-`. ,7??0$,/`4 .9__2.5`: /:oo3/;`@ '=A`B -8OO14-C`H +6///+I`N 1<5t1O`T 9D=t9U`Z =HOOA4=[`` 9D=t9a`f (37OQU'Vg`h '2oo6Mt&Ti`j $/??3G#Nk`l )4-t)m`r "-&(;"s`x !__V,y`z *5.*{`@ *5.*A`F !,0A4 HG`H +6///+I`N &1__5KT%RO`P ,7??0$,Q`V )4-t)W`\ &1__5KT%R]`^ '2oo6Mt&T_`` $/??3G#Na`b 0;4d0c`h +6///+i`n %0OO4I4$Po`p &1__5KT%Rq`r $/??3G#Ns`t '2oo6Mt&Tu`v /:oo3T/w`|  OOE40}`~  OOE40` `B  
9!=>CF"G n  u  u*
 	
	
s&   DY! 7Y! TY! !	Z1*AZ,,Z1c                     t        j                  | |      }t        | |      }t        j                  d|        t        di |d|i}|S )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_tool_choice: Optional[bool]
            supports_prompt_caching: Optional[bool]
            supports_audio_input: Optional[bool]
            supports_audio_output: Optional[bool]
            supports_pdf_input: Optional[bool]
            supports_web_search: Optional[bool]
            supports_url_context: Optional[bool]
            supports_reasoning: 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[  zmodel_info: r:  r:  )r   r3   rd  r   r   ri   )r0  rP  r:  r  returned_model_infos        r   r  r    sh    N &AA)< )/K
 <}56# 
/F r   python_type_namec                     t         j                  dt        j                  dt        j                  dt        j                  dt
        j                  dt        j                  dddi}|j                  | d      S )	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.
    stringintegernumberbooleanarrayr/  NoneTypenull)r5  r  r  r  r  rR  r`  r  )r  python_to_json_schema_typess     r   json_schema_typer  F  s]     	hiywxF# '**+;XFFr   c                 z   	 ddl }ddlm} ddlm} | j                  } |j                  |       } ||      }dj                  |d   D cg c]  }|j                          c}      }	i }
g } |j                  |       j                  }|j                         D ]Z  \  }}t        |d      r t        |j                  j                        }nd}d}d}|d   D ]  }|j                   |k(  st        |d	      rQ|j"                  }d
|v r|j%                  d      d   }n!d|v r	 t'        t)         ||                  }d}t        |      }dj                  |j*                  D cg c]  }|j                          c}      } |||d}t-        |j                         D cg c]  \  }}t/        |t&              s||f c}}      |
|<   |j0                  |j2                  k(  sJ|j5                  |       ] ||	d|
dd}|r||d   d<   |S # t
        $ r}|d}~ww xY wc c}w # t
        $ r Y w xY wc c}w c c}}w )ae  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)NumpyDocString
Summary
annotation
Parametersr   optional,{r  )r   descriptionenumr/  r   
propertiesnamer  rP  rP  required)rU  astr  numpydoc.docscraper  r   r  getdocr   strip	signaturerP  r  rK  r  r  r  r   r  r5  rR  descr`  r   r  emptyr   )input_functionrU  r  r  r  r  	docstringnumpydocsr  rP  required_params
param_info
param_namer=  
param_typeparam_description
param_enum
param_data
param_dictr  r  r  s                          r   function_to_dictr  `  sF   $5 ""D~.Ii(H))0CD1QWWYDEK JO""">2==J'--/
E5,')%*:*:*C*CDJJ 
 #<0J*,:v.!+J!Z/%/%5%5c%:1%=

*!),T,z2J-K)LJ)1J "2*!=J$(II*//.RQqwwy.R$S!! 1& ,

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

:
 ==EKK'"":.O 0V "$
F +:|Z(MI   E:  ) ! ! /S JsA   H 
HH#H2H76H7	HHH#	H/.H/c                 f    t        j                  |       }|j                  |      }t        |      S )Npath)r  URL	copy_withr5  )original_urlnew_pathr  modified_urls       r   
modify_urlr    s+    
))L
!C==h=/L|r   rG  	num_callsforce_timeoutc                 f   d}d}|r|}|r|}t        |      D cg c]  }d|dg
 }	}t        j                         }
	 t        j                  | |	|||       t        j                         }||
z
  }|ddd dS c c}w # t        $ r*}t        j                         }||
z
  }|dd|dcY d }~S d }~ww xY w)	NzHey, how's it goingr  rI  roler1  )r0  r)  rP  rG  r  r   )total_response_time
calls_madestatusrv  failed)rangetimer   batch_completionr   )r0  rP  rG  r+  r  r  test_prompt
test_callsre  r)  rB  r  response_timer  s                 r   load_test_modelr    s     (KJ
DI*DUVq&[9:VHVJ
   3'	
 99; :-#0	
 	
 W$  
99; :-#0	
 	

s"   A89A= =	B0B+%B0+B0c                     | dk(  r"t        j                         j                         S | dk(  r"t        j                         j                         S | dk(  r"t        j                         j                         S g S )z,Return the fields required for each providerr  re  azure_ai)r   r  get_required_paramsr  AzureAIStudioConfigrP  s    r   get_provider_fieldsr    sk     l*'')==??		(##%99;;	
	***,@@BB 	r   c                  F   t               j                         D  ci c]  \  } }| |d nt        |       }} }i }i }t        j                  dd       }|r|j                  d      ng }|j                         D ]h  \  } }|/t        j                         || <   t        j                         || <   7t        j                  |      || <   t        j                  |      || <   j |D ]0  }t        j                         ||<   t        j                         ||<   2 ||fS c c}} w )Nr  NO_PROXYr  )proxy)	r   r  r   osgetenvr  r  HTTPTransportAsyncHTTPTransport)r  r  proxiessync_proxy_mountsasync_proxy_mountsno_proxyno_proxy_urlsr  s           r   !create_proxy_transport_and_mountsr	    s&    01779C 	S[Ten4G 
  yyT*H+3HNN3'Mmmo
U=%*%8%8%:c"&+&>&>&@s#%*%8%8u%Ec"&+&>&>U&Ks# & !&!4!4!6#"'":":"<3  0001s   Dr  c                    d}g }| ||dS 	 t        |       \  }}}}|r|dk(  r)dt        j                  v rd}n|j	                  d       n|dk(  rOd	t        j                  v r(d
t        j                  v rdt        j                  v rd}nB|j                  g d       n-|dk(  r)dt        j                  v rd}n|j	                  d       
n|dk(  r)dt        j                  v rd}
n|j	                  d       
n|dk(  r)dt        j                  v rd}
n|j	                  d       
n|dk(  r)dt        j                  v rd}
n|j	                  d       
nu|dk(  r)dt        j                  v rd}
nZ|j	                  d       
nG|dk(  r=dt        j                  v rdt        j                  v rd}
n|j                  ddg       
n|dk(  r)dt        j                  v rd}	n|j	                  d       	n|dk(  r)dt        j                  v rd}	n|j	                  d       	n|dk(  r)dt        j                  v rd}	n|j	                  d       	n{|d k(  r)d!t        j                  v rd}	n`|j	                  d!       	nM|d"k(  r)d#t        j                  v rd}	n2|j	                  d#       	n|d$k(  r)d%t        j                  v rd}	n|j	                  d%       n|d&k(  s|d'k(  rLd(t        j                  v rd)t        j                  v rd}n|j	                  d(       |j	                  d)       n|d*v r)d+t        j                  v rd}n|j	                  d+       nn|d,k(  r)d-t        j                  v rd}nS|j	                  d-       n@|d.k(  r)d/t        j                  v rd}n%|j	                  d/       n|d0k(  r)d1t        j                  v rd}n|j	                  d1       n|d2k(  r)d3t        j                  v rd}n|j	                  d3       n|d4k(  r)d5t        j                  v rd}n|j	                  d5       n|d6k(  r)d7t        j                  v rd}nm|j	                  d7       nZ|d8k(  r)d9t        j                  v rd}n?|j	                  d9       n,|d:k(  r)d;t        j                  v rd}n|j	                  d;       n|d<k(  r)dt        j                  v rd}n|j	                  d       n|d=k(  r)d>t        j                  v rd}n|j	                  d>       n|d?k(  s|d@k(  r)dAt        j                  v rd}n|j	                  dA       no|dBk(  r)dCt        j                  v rd}nT|j	                  dC       nA|dDk(  r)dEt        j                  v rd}n&|j	                  dE       n|dFk(  r)dGt        j                  v rd}n|j	                  dG       n|dHk(  r)dIt        j                  v rd}n|j	                  dI       n|dJk(  r)dKt        j                  v rd}n|j	                  dK       n|dLk(  r)dMt        j                  v rd}nn|j	                  dM       n[|dNk(  r_dOt        j                  v s6dPt        j                  v s$dQt        j                  v sdRt        j                  v rd}n
|j	                  dO       n|dSk(  r^dTt        j                  v r(dUt        j                  v sdVt        j                  v rd}n|j	                  dT       |j	                  dV       n|dWk(  r)dXt        j                  v rd}ny|j	                  dX       nf|dYk(  r)dZt        j                  v rd}nK|j	                  dZ       n8|d[k(  r)d\t        j                  v rd}n|j	                  d\       n
|d]k(  rd^t        j                  v rd}n|j	                  d^       n| t        j                  v s6| t        j                  v s$| t        j                  v s| t        j                  v r)dt        j                  v rd}n}|j	                  d       nj| t        j                  v r)dt        j                  v rd}nB|j	                  d       n/| t        j                  v r)dt        j                  v rd}n|j	                  d       n| t        j                  v r)dt        j                  v rd}n|j	                  d       n| t        j                  v r)dt        j                  v rd}n|j	                  d       n~| t        j                  v r)dt        j                  v rd}nV|j	                  d       nC| t        j                   v s'| t        j"                  v s| t        j$                  d   v r=dt        j                  v rdt        j                  v rd}n|j                  ddg       n| t        j&                  v r)dt        j                  v rd}n|j	                  d       n| t        j(                  v r)dt        j                  v rd}nj|j	                  d       nW| t        j*                  v r)dt        j                  v rd}n/|j	                  d       n| t        j,                  v r'd!t        j                  v rd}n|j	                  d!       n| t        j.                  v r'd#t        j                  v rd}n|j	                  d#       n| t        j0                  v r'd%t        j                  v rd}n|j	                  d%       nq| t        j2                  v r'dXt        j                  v rd}nJ|j	                  dX       n8| t        j4                  v r&dZt        j                  v rd}n|j	                  dZ       |/g }|D ]&  }d_|j7                         vs|j	                  |       ( |}|/g }|D ]&  }d`|j7                         vs|j	                  |       ( |}t9        |      dak(  rd}||dS # t        $ r d}Y 7w xY w)ba  
    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/  TrR  AZURE_API_BASEr  AZURE_API_KEY)r  r  r  r  r0  r  r5  r0  r8  r  OPENROUTER_API_KEY	datarobotDATAROBOT_API_TOKENr  VERTEXAI_PROJECTr  r  r6  r  AI21_API_KEYrg  r9  r  r2  r3  r4  r  r7  rS  r  AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)re  ro  OLLAMA_API_BASErf  ANYSCALE_API_KEYr  DEEPINFRA_API_KEYfeatherless_aiFEATHERLESS_AI_API_KEYr  GEMINI_API_KEYr  GROQ_API_KEYr  NVIDIA_NIM_API_KEYrh  CEREBRAS_API_KEYri  XAI_API_KEYrj  rk  VOLCENGINE_API_KEYrm  r  CODESTRAL_API_KEYrl  DEEPSEEK_API_KEYr  MISTRAL_API_KEYpalmPALM_API_KEYr  PERPLEXITYAI_API_KEYr  VOYAGE_API_KEYr  INFINITY_API_KEYr  FIREWORKS_AI_API_KEYFIREWORKS_API_KEYFIREWORKSAI_API_KEYFIREWORKS_AI_TOKENr  CLOUDFLARE_API_KEYCLOUDFLARE_ACCOUNT_IDCLOUDFLARE_API_BASEr  NOVITA_API_KEYrp  r;  	dashscopeDASHSCOPE_API_KEYmoonshotMOONSHOT_API_KEYr  rG  r   )r2   r   r   environr   r  r   r  r  open_ai_embedding_modelsopenai_image_generation_modelsr3  r1  replicate_modelsr  datarobot_modelsr  r  models_by_providerhuggingface_modelsr  together_ai_modelsr  baseten_modelsr  r  nebius_modelsr6  rN  )	r0  r  rG  r  r  re  rP  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/$

2&*###$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 $44'2::5&*###$<= 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 J.!RZZ/&*###$67 N2&"**4&"**4(BJJ6'2::5&*###$:; L0#rzz1'2::5(BJJ6&*###$89##$9: H,2::-&*###$45 H,2::-&*###$45 K/"bjj0&*###$78 J.!RZZ/&*###$67 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g...$

2&*###$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g+++2::-&*###$45g+++2::-&*###$45C		+ '',   (C, '',   (
<A"#6UUc
  #"#s   q qqc                  ,    t        j                  | i |S r   )r   r^  )rx  r   s     r   acreaterB    s    ///r   c                    dj                  d |D              }d}d| v r)	 dd l}ddlm}m}m}  |       }|j                  |      }|S t        t        j                  |            }|S # t        $ r t        d       Y Zw xY w)N c              3   &   K   | ]	  }|d      yw)r1  Nr:  )r   r-  s     r   r   z*prompt_token_calculator.<locals>.<genexpr>  s     ?7GI&?s   r   claudez:Anthropic import failed please run `pip install anthropic`)	AI_PROMPTHUMAN_PROMPT	Anthropic)
r   r  r   rG  rH  rI  count_tokensrN  r+   r<  )	r0  r)  r=  
num_tokensr  rG  rH  rI  anthropic_objs	            r   prompt_token_calculatorrM    s    88?h??DJ5	T 	A@!"//5
  ./
  	TRS	Ts   A( (A?>A?c                     	 | t         j                  v s| t         j                  v r t        j                  j                  |        y dddg}t        j                  | |       y # t        $ r t        d| d      w xY w)NrI  zHello Worldr  r0  r)  r2  )r-  r0  r,  )	r   r  r  r  modelsretriever]  r   r   rO  s     r   valid_modelrR    su    H W;;;>>>MM""5)!'MBCHUX> HbBGGHs   AA$ A$ $A<c                 v    dddg}	 t        j                  | ||d       y# t        $ r Y yt        $ r Y yw xY w)aW  
    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.
    rI  zHey, how's it going?r  r  )r0  r)  r  r  TF)r   r]  r   r   )r0  r  r)  s      r   check_valid_keyrT    sP      ,BCDH(G	
   s   " 	888r  c                 4    | dk(  ry| dk(  ry| dk(  ry| dk\  ryy)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_retryrV    s9     c c c cr   response_headersc                 N   	 ddl }| | j                  d      }	 t        |      }|S d}|S # t        $ r_ |j                  j                  |      }|d}n;|j                  j                  |      }t        |t        j                         z
        }Y |S w xY w# t        $ r d}Y yw xY w)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-after)emailr  r  r   ro  parsedate_tz	mktime_tzr  )rW  rZ  retry_headerretry_afterretry_date_tuple
retry_dates         r   &_get_retry_after_from_exception_headerra    s     '+//>L@!,/  K  @#(;;#;#;L#I #+"$K!&!6!67G!HJ"%j499;&>"?K @  s7   B + B B A$BB BB B$#B$remaining_retriesr  min_timeoutc                     t        |      }|d|cxk  rdk  r|S  t        }t        }|| z
  }t        |t	        d|      z  |      }t
        t        j                         z  }	||	z  }
|
|k\  r|
S |S )Nr   <   g       @)ra  r   r   r  powr   random)rb  r  rW  rc  r^  initial_retry_delaymax_retry_delay
nb_retriessleep_secondsjitterr  s              r   _calculate_retry_afterrm    s     99IJK 1{#8b#8 $9 .%O00J +c#z.BBOTM fmmo%Ff$G,7=+=r   rolesinitial_prompt_valuefinal_prompt_valuetokenizer_configc                 &   | }|g}	 t        |       d   } |j                  |        |r-|D ]  }|ddt        j                  |<    t        j
                  S |D ]  }|||dt        j
                  |<    t        j
                  S # t        $ r Y hw xY w)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  )rn  ro  rp  )r2   r   r   r   known_tokenizer_configcustom_prompt_dict)r0  rn  ro  rp  rq  complete_modelpotential_modelsr6  s           r   register_prompt_templaterw    s    T N&' u-a0& !A-#1G**1- " %%% "A(<&8-G&&q) " %%%!  s    B 	BBc                   R    e Zd Z	 	 ddee   dee   fdZd Zd Zde	fdZ
d	 Zd
 Zy)TextCompletionStreamWrapperNrH  rP  c                 <    || _         || _        || _        || _        y r   )completion_streamr0  rH  rP  )selfr{  r0  rH  rP  s        r   __init__z$TextCompletionStreamWrapper.__init__`  s#     "3
,#6 r   c                     | S r   r:  r|  s    r   __iter__z$TextCompletionStreamWrapper.__iter__l      r   c                     | S r   r:  r  s    r   	__aiter__z%TextCompletionStreamWrapper.__aiter__o  r  r   r  c           	      J   	 t               }|j                  dd       |d<   d|d<   |j                  dd       |d<   |j                  dd       |d<   t               }t        |t              rt
        |d   d   d   }|d	   |d
<   |j                  d      |d<   |d   d   d   |d<   |d   d   d   |d<   |g|d<   | j                  r3| j                  j                  dd      du r|j                  dd       |d<   |S # t
        $ r}t        d| dt        |             d }~ww xY w)Nr#  ri  r/  createdr0  r  r   r'  r1  r=  reasoning_contentr|  finish_reasoninclude_usageFTusagez=Error occurred converting to text completion object - chunk: z	; Error: )rs   r  rr   r   r\   r   rH  r5  )r|  r  r  text_choicesr'  r  s         r   !convert_to_text_completion_objectz=TextCompletionStreamWrapper.convert_to_text_completion_objectr  s_   	-/H"YYtT2HTN!2HX"'))It"<HY %		'4 8HW&=Lw  )$Q'0E#(#3L 05		:M0NL,-$))$4Q$7$@L!,1),<Q,?,PL)#/.HY ##''++OUCtK$)IIgt$<!O 	OPUwV_`cde`f_gh 	s   C7C: :	D"DD"c                    t                	 | j                  D ]$  }|dk(  s|t        | j                  |      }|c S  t        # t        $ r t        t        $ r-}t        | j                  | j                  xs d|i i       d }~ww xY w)NNoner  r2  )r0  rP  original_exceptioncompletion_kwargsextra_kwargs)rs   r{  r   r  StopIterationr-   r0  rP  )r|  r  processed_chunkr  s       r   __next__z$TextCompletionStreamWrapper.__next__  s     	//F?em#O"&"H"Hu"H"U&&	 0
   	  	 jj$($<$<$B#$"$ 	s   1A A B	(BB	c                    K   	 | j                   2 3 d {   }|dk(  s|t        | j                  |      }|c S 7 '6 t        # t        $ r t        w xY ww)Nr  r  )r{  r   r  r  StopAsyncIteration)r|  r  r  s      r   	__anext__z%TextCompletionStreamWrapper.__anext__  sn     	%#55 ' 'eF?em#O"&"H"Hu"H"U&&	'5
   	%$$	%s5   AA ><>#A A>A AANN)r  rK  rL  r   r`  r5  r}  r  r  rk   r  r  r  r:  r   r   ry  ry  _  sL    
 *.-1
7 !	
7
 &c]
7} @*	%r   ry  c              #     K   t        |t        j                        r|t        dt	        |      d      D ]  }t        d|||dz          }||| j                  d   _        npg }t        |      D ]Y  }t        j                  j                  |t        j                  j                  d|||dz                }|j                  |       [ || _        |   y wNr      	assistantr  )r|  r'  r   r   MockExceptionr  rN  r`   r  r'  ro  rq   r   	r  mock_responser0  r  icompletion_obj_all_choicesj_streaming_choices	            r   mock_completion_streaming_objr    s      -!6!671c-(!,Kq1q59QR9.<N""1%+L1X$+MM$B$B!----(-AE2J .  %C %! ##$56  &2N" -s   CCc                  K   t        |t        j                        r|t        dt	        |      d      D ]  }t        d|||dz          }||| j                  d   _        npg }t        |      D ]Y  }t        j                  j                  |t        j                  j                  d|||dz                }|j                  |       [ || _        |   y wr  r  r  s	            r   #async_mock_completion_streaming_objr    s      -!6!671c-(!,Kq1q59QR9.<N""1%+L1X$+MM$B$B!----(-AE2J .  %C %! ##$56  &2N" -s   CCc                     	 dd l } |j                          t        | d      5 }t        j                  |      }d d d        |S # 1 sw Y   S xY w# t
        $ r}|d }~ww xY w)Nr   rw   )r   getcwdopenrE  loadr   )config_pathr   config_fileconfigr  s        r   read_config_argsr    sa    
		+s# 	,{YY{+F	, 		,  s3   !A A	A AA A 	A AA c                     d| d}t        |g|      }||kD  r%t        d       t        |||      }t        |g|      }|||z
  fS )Nsystemr  zH`tokentrimmer`: Warning, system message exceeds token limit. Trimming...)get_token_countr   shorten_message_to_fit_limit)system_messager  r0  system_message_eventsystem_message_tokensnew_system_messages         r   process_system_messager    si    $,H+-A,BEJz)V	
 : *e
 !01C0De L.C!CCCr   c                 z   | d d d   } g }t        j                  d|  d| d|        | D ]u  }t        j                  d|        t        ||      }||z
  }t        j                  d| d|        |dk  r n*t        |||||	      }t        j                  d
|        w t        j                  d|        |S )NrY  z(calling process_messages with messages: , max_tokens: z	, model: zprocessing final_messages: zused_tokens: z, available_tokens: r  )final_messagesr-  available_tokensr  r0  z/final_messages after attempt_message_addition: Final messages: )r   r   r  attempt_message_addition)r)  r  r0  r  r-  used_tokensr  s          r   process_messagesr    s    "~HN
28*N:,V_`e_fg :>:JKL%ne<%3K=(<=M<NO	
 q 1)-!
 	=n=MN	
# ( +N+;<=r   c                 8   |g| z   }t        ||      }t        j                  d| d|        ||k  r|S d|vr`t        j                  d       t        |||      }t	        || ||      rt        j                  d       |g| z   S t        j                  d       | S )Nr)  r0  ztemp_message_tokens: r  rd  z*attempting to shorten message to fit limitz=can add message, returning [updated_message] + final_messagesz,cannot add message, returning final_messages)r  r   r   r  can_add_message)r  r-  r  r  r0  temp_messagestemp_message_tokensupdated_messages           r   r  r  #  s     I.M)=N
 34N:,O j( 
	'IJ6w@PRWX?NJN  O $$~55  !OPr   c                 ,    t        || gz   |      |k  ryyr  )r  )r-  r)  r  r0  s       r   r  r  =  s    x7)+U3zAr   c                     t        ||       S )NrO  r   r  s     r   r  r  C  s    ux88r   raise_error_on_max_limitc                     |d|v r|dk  r| S | d   }d}t        j                  d|        |t        k  rt        j                  d|         t        | g|      }t        j                  d| d	|        ||k  rnq||z  }t	        t        |      |z        d
z
  }t        d|      }|dz  }	|d|	 }
||	 d }|
dz   |z   }|| d<   t        j                  d|        |}|d
z  }|t        k  r|t        k\  r|rt        d| dt         d      | S )a|  
    Shorten a message to fit within a token limit by removing characters from the middle.

    Args:
        message: The message to shorten
        tokens_needed: The maximum number of tokens allowed
        model: The model being used (optional)
        raise_error_on_max_limit: If True, raises an error when max attempts reached. If False, returns final trimmed content.
    Ngptr  r1  r   z	content: z!getting token count for message: ztotal_tokens: z, tokens_needed: r      z..ztrimmed_content: z%Failed to trim message to fit within z tokens after z	 attempts)r   r   r    r  r  rN  maxr   )r-  tokens_neededr0  r  r1  attemptstotal_tokensratio
new_lengthhalf_length	left_half
right_halftrimmed_contents                r   r  r  G  sj     Ue^0Ci GH9WI./
0
0@	JK&y%8\N*;M?K	
 =(,.W-.2
J'
 AoL[)	k\]+
#d*Z7,	00ABC!A/ 0
02 ..3K3M?.QlPmmvw
 	
 Nr   
trim_ratioreturn_response_tokensc                    | }t        j                  |       } 	 |Z|t        j                  v rFt        j                  |   j	                  dt        j                  |   d         }t        ||z        }n| S d}| D ]  }|d   dk(  s||rdndz  }||d   z  } g }	t        |       D ]  }|d   d	k7  r n|	j                  |        |	j                          t        |	      r| dt        |	        } t        |xs d| 
      }
t        d|
 d|        |
|k  r| |	z   S t        d|  d|
 d|        d}|r1t        |||      \  }}|dk(  r|gS | D cg c]  }|d   dk7  s| } }t        j                  d|        t        | ||      }t        j                  d|        |r|g|z   }t        |	      dkD  r|j!                  |	       t        j                  d| d|        |r|t#        ||      z
  }||fS |S c c}w # t$        $ r9}t        j&                  dj)                  t+        |                   |cY d}~S d}~ww xY w)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  r  r2  r  r  r  r1  rT  rO  zCurrent tokens: z, max tokens: zNeed to trim input messages: z, current_tokensr  )r  r  r0  r   zProcessed system message: )r)  r  r0  zProcessed messages: r  z, return_response_tokens: z'Got exception while token trimming - {})r  rZ  r   r  r  r  rX  r   reverserN  r   r   r  r   r   r  r  r  r   rv  rq  r5  )r)  r0  r  r  r  original_messagesmax_tokens_for_modelr  r-  tool_messagescurrent_tokensr  r  response_tokensr  s                  r   trim_messagesr    s   , !}}X&HR!***'.'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 J&m++ 	+H:5EnEUUcdncop	
 04/E-*E0, * Q,-- 08WG76?h;VWHW9:N9OPQ)*E
 	3N3CDE  23nDN}!!!-0~..HI_H`a	
 #(?>5+QQO!?22/ X0  !  5<<SVD	
 ! 	!sV   AH  5H  BH  0H  H  G;G;"BH  9H  ;H   	I	.H=7I=I)InMemoryCachec            	            e Zd Zddedef fdZdefdZdefdZde	e   de	e
   defd	Z	 	 dde	e   de	e
   de	ee      fd
Zdede	e
   dee   fdZ xZS )AvailableModelsCachettl_secondsmax_sizec                 4    t         |   ||       d | _        y r   )superr}  	_env_hash)r|  r  r  	__class__s      r   r}  zAvailableModelsCache.__init__  s    h/(,r   r   c                     t         j                  j                         D ci c]  \  }}|j                  d      r|| }}}t	        t        t        |j                                           S c c}}w )z/Create a hash of relevant environment variables)OPENAI	ANTHROPICAZUREAWS)r   r5  r  r  r5  hash	frozenset)r|  r  r  env_varss       r   _get_env_hashz"AvailableModelsCache._get_env_hash  sf     

((*
1||CD qD
 

 4	(.."23455
s   A.c                 h    | j                         }| j                  || _        y|| j                  k7  S )z+Check if environment variables have changedT)r  r  )r|  current_hashs     r   _check_env_changedz'AvailableModelsCache._check_env_changed  s3    ))+>>!)DNt~~--r   rP  rK  c                     d}||j                         }|| d| }t        j                  |j                               j	                         S )Nr2  :)model_dump_jsonhashlibsha256r<  	hexdigest)r|  rP  rK  	valid_strs       r   _get_cache_keyz#AvailableModelsCache._get_cache_key	  sU    
 	%&668I*./q<I~~i..01;;==r   c                    |+| j                         r| j                  j                          y| j                  ||      }t	        t
        t        t              | j                  |            }|t        j                  |      S |S )zGet cached model infoN)r  
cache_dictclearr  r   r   r~   r5  	get_cacher  rZ  )r|  rP  rK  	cache_keyr  s        r   get_cached_model_infoz*AvailableModelsCache.get_cached_model_info  ss     !d&=&=&?OO!!#''(;^L	htCy)4>>)+DE==((r   available_modelsc                 r    | j                  ||      }| j                  |t        j                  |             y)zSet cached model infoN)r  	set_cacher  rZ  )r|  rP  rK  r  r  s        r   set_cached_model_infoz*AvailableModelsCache.set_cached_model_info)  s/     ''(;^L	y$--0@"ABr   )i,  r  r  )r  rK  rL  r  r}  r5  r  r  r  r   r   r  r~   r  r  __classcell__r  s   @r   r  r    s    -C - -6s 6.D .>%c]> !0> 
	> .237%c] !0 
$s)		&C C !0C s)	Cr   r  c                 (   g }t         j                  j                         }t        j                  D ]^  }| r|| k7  r|j                  dd      }|}|j                          d}|j                          d}||v s||v sN|j                  |       ` |S )Nre  r2  _API_KEY)r   r5  r  r   r   r  upperr   )rP  valid_providersenviron_keysr   env_provider_1env_provider_2expected_provider_key_1expected_provider_key_2s           r   #_infer_valid_provider_from_env_varsr  8  s     "$O::??$L))8/B#B "))#r2! &4%9%9%;$<H"E%3%9%9%;$<H"E#|3&,6 ""8,# *& r   c                 (   	 t         j                  ||      }||S | j                  ||j                  nd ||j                  nd       }t         j                  |||       |S # t        $ r$}t        j                  d|        g cY d }~S d }~ww xY w)N)r  rG  Error getting valid models: )	_model_cacher  
get_modelsr  rG  r  r   r   rL  )r  rP  rK  r  rP  r  s         r   #_get_valid_models_from_provider_apir  S  s    
$::
 $   ++.<.HN**d0>0J^,,PT , 

 	**+>PVW !=aSAB	s#   A$ AA$ $	B-BBBcheck_provider_endpointc                    	 | xs t         j                  } g }g }|r|g}nt        |      }|D ]  }t        j	                  dt        |            }|r||k7  r+|dk(  r|j                  d       B|!| r||j                  t        |||             et        j                  t         j                  j                  |g             }|j                  |        |S # t        $ r$}t        j                  d|        g cY d}~S d}~ww xY w)aE  
    Returns a list of valid LLMs based on the set environment variables

    Args:
        check_provider_endpoint: If True, will check the provider's endpoint for valid models.
        custom_llm_provider: If provided, will only check the provider's endpoint for valid models.
    Returns:
        A list of valid LLMs
    Nr  rR  z	Azure-LLMr  )r   r  r  r  r  re   r   r  r  r  rZ  r:  r  r   r   rL  )	r  rP  rK  r  valid_modelsr   r  models_for_providerr  s	            r   get_valid_modelsr  k  s(   /#Fw'F'F 	 
 &("$ 23OABUVO'H3KK%h/ L O
 #x3F'F7"##K0++(##7' & '+mm..228R@'# ##$787 (:  !=aSAB	s   CC 	D#D<DDc           	         t               sy 	 d|v r|d   du r| j                  dk(  ry d|v r|d   du r| j                  dk(  ry d|v r|d   du r| j                  dk(  ry dj                  t        t        |            }dj                  d	 |j                         D              }t        d
       t        d       |r"|r t        d| j                   d| d| d       nW|rt        d| j                   d| d       n8|rt        d| j                   d| d       nt        d| j                   d       t        d
       y # t        $ r Y y w xY w)Nr^  Tr]  rc  rb  r  img_generationr  c              3   B   K   | ]  \  }}| d t        |         yw)=N)repr)r   r  r  s      r   r   z/print_args_passed_to_litellm.<locals>.<genexpr>  s#     W*#u#aU}5Ws   r  z[92mRequest to litellm:[0mz[92mlitellm.(z)[0mz()[0m)r   r  r   mapr#  r  r   r   )r  rx  r   args_str
kwargs_strs        r   r  r    s   . 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  C!E   	EEc                 x    	 d| j                  d      z   dz   |j                  d      z   }|S # t        $ r Y y w xY w)Nztime-z%H-%M-%S-%fre  r#  )strftimer  r   )rB  r%  response_ids      r   get_logging_idr+    sO    j))-883>AQAQRVAWW 	  s   *- 	99c                     | y | j                  di       }|4|j                  dd       }||S |j                  di       }t        |      S y )NrK  r  r  )r  )r  r/   )model_call_detailsrK  _base_modelr  s       r   _get_base_model_from_metadatar/    sb    !'++,<bAN!$((t<"!%%j"598LLr   c                   6    e Zd Zd	dedefdZd Zd Zd Zd Z	y)
ModelResponseIteratorr  convert_to_deltac                     |du rdt        d      | _        | j                  j                  d   j                  }|j                  d   j                  j
                  |_        d| _        y || _        d| _        y )NT)rA  r   F)rk   r  r  r'  r-  r1  is_done)r|  r  r2  _deltas       r   r}  zModelResponseIterator.__init__  sk    t#"/t"<D((00399F+33A6>>FFFN  #1Dr   c                     | S r   r:  r  s    r   r  zModelResponseIterator.__iter__  r  r   c                 L    | j                   rt        d| _         | j                  S NT)r4  r  r  r  s    r   r  zModelResponseIterator.__next__  s"    <<"""r   c                     | S r   r:  r  s    r   r  zModelResponseIterator.__aiter__  r  r   c                 T   K   | j                   rt        d| _         | j                  S wr8  )r4  r  r  r  s    r   r  zModelResponseIterator.__anext__  s&     <<$$"""s   &(NF)
r  rK  rL  rk   r  r}  r  r  r  r  r:  r   r   r1  r1    s)    }  ##r   r1  c                   8    e Zd Zddee   fdZd Zd Zd Zd Z	y)	ModelResponseListIteratorNdelayc                 .    || _         d| _        || _        y Nr   )model_responsesr|  r>  )r|  rA  r>  s      r   r}  z"ModelResponseListIterator.__init__  s    .

r   c                     | S r   r:  r  s    r   r  z"ModelResponseListIterator.__iter__  r  r   c                    | j                   t        | j                        k\  rt        | j                  | j                      }| xj                   dz  c_         | j                  rt        j                  | j                         |S Nr   )r|  rN  rA  r  r>  r  sleepr|  r  s     r   r  z"ModelResponseListIterator.__next__!  s]    ::T1122--djj9

a
::JJtzz"r   c                     | S r   r:  r  s    r   r  z#ModelResponseListIterator.__aiter__+  r  r   c                 $  K   | j                   t        | j                        k\  rt        | j                  | j                      }| xj                   dz  c_         | j                  r't        j                  | j                         d {    |S 7 wrD  )r|  rN  rA  r  r>  r  rE  rF  s     r   r  z#ModelResponseListIterator.__anext__.  sl     ::T1122$$--djj9

a
::--

+++ ,s   BBBBr   )
r  rK  rL  r   r  r}  r  r  r  r  r:  r   r   r=  r=    s&    x r   r=  c                         e Zd Zd fdZ xZS )CustomModelResponseIteratorc                 "    t         |           y r   )r  r}  )r|  r  s    r   r}  z$CustomModelResponseIterator.__init__9  s    r   )r   N)r  rK  rL  r}  r	  r
  s   @r   rJ  rJ  8  s     r   rJ  r-  c                     d| vry| d   t        | d   t              ry| d   D ]*  }|d   dk(  s|j                  d      |d   d   dk(  s* y y)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"}}
    r1  Fr   r=  cache_control	ephemeralTr4  )r-  r1  s     r   is_cached_messagerO  =  so     y!Z	0BC%H9%FOv%O,8(0K? & r   r  c                     	 | j                  d      sy| j                  d      d   } t        j                  | d      }t        j                  |      j                  d      | k(  S # t        $ r Y yw xY w)Nzdata:Fr  r   T)validaterx   )r  r  base64	b64decode	b64encoderB  r   )r  decoded_bytess     r   is_base64_encodedrV  U  su    ||
 GGCLO ((T: .55g>!CC s   A& AA& &	A21A2c                 6    d| v r| j                  d      d   S | S )z3
    s: b64str OR data:image/png;base64,b64str
    r  r   )r  )r  s    r   get_base64_strrX  h  s"     axwws|AHr   c                 8    | D ]  }|j                  d       y y)zm
    Returns true, if messages has tool call blocks.

    Used for anthropic/bedrock message validation.
    
tool_callsTFr  )r)  r-  s     r   has_tool_call_blocksr[  q  s%     ;;|$0  r   c           
      <    t        dt        dddi d            gS )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
    rO  
dummy_toolzThis is a dummy tool callr/  r  r  )r   rO  )rR   rS   r  s    r   add_dummy_toolr^  }  s2     	 9!7$"$
	
 r   )ChatCompletionAudioObjectChatCompletionImageObjectChatCompletionTextObjectChatCompletionUserMessageOpenAIMessageContentValidUserMessageContentTypesc                     t        | t              r| j                  d      S t        | t              r| S t	        dt        |        d      )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`  r  r   r-  s    r   convert_to_dictrj    sO     '9%!!t!44	GT	"$T']O3UV
 	
r   c                     g }| D ]8  }t        t        t        |            }t        |      }|j	                  |       : |S )Nri  )r   rN   rj  cleanup_none_field_in_messager   r)  new_messagesr-  convert_msg_to_dictcleaned_messages        r   convert_list_message_to_dictrq    sE    L"#3_W5MN7@STO,  r   c                 
   g }| D ]q  }|j                  d      sd|d<   |j                  d      rt        |d         |d<   t        t        t	        |            }t        |      }|j                  |       s t        |      S )z{
    Ensures all messages are valid OpenAI chat completion messages.

    Handles missing role for assistant messages.
    r  r  rZ  )rI  ri  r  )r  jsonify_toolsr   rN   rj  rl  r   &validate_chat_completion_user_messagesrm  s        r    validate_and_fix_openai_messagesru    s     L{{6")GFO;;|$$18M$NGL!"#3_W5MN7@STO,  2<HHr   c                 |    | j                         }|j                         D ci c]  \  }}|	|| c}}S c c}}w )z
    Cleans up the message by removing the none field.

    remove None fields in the message - e.g. {"function": None} - some providers raise validation errors
    )r  r  )r-  new_messager  r  s       r   rl  rl    s8     ,,.K(..0BTQAMAqDBBBs   
88c           	         t        |       D ]|  \  }}	 |d   dk(  rn|j                  d      }|[t        |t              r3t        |t              r:|D ]5  }t        |t
              s|j                  d      t        vs,t        d       ~ | S # t        $ rH}t        |t              rt        d| d| d	      dt        |      v rt        d
| d| d      |d}~ww xY w)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  rI  r1  Nr   zinvalid content typezInvalid message=z
 at index zG. Please ensure all messages are valid OpenAI chat completion messages.zInvalid user message=zL. Please ensure all user messages are valid OpenAI chat completion messages.)	rT  r  r   r5  rR  r`  rd  r   KeyError)r)  r  r6  user_contentr6  r  s         r   rt  rt    s    H%Q	yF" uuY/+!,4 #L$7$0D)$5#'88F#3;W#W*34J*K$K %1 &0 O  
	!X&&qcC58  A  &Q/+A3j  >J  K  
	s)   +B%B%B=B	CACCc                 ,   ddl m}m} | | S t        | t              r| S t        | t
              rL| j                  d      dv rd| vr| S | j                  d      | j                  d      t        d|  d      | S t        d|  dt        |        d	      )
z
    Confirm the tool choice is passed in the OpenAI format.

    Prevents user errors like: https://github.com/BerriAI/litellm/issues/7483
    r   )#ChatCompletionToolChoiceObjectParam$ChatCompletionToolChoiceStringValuesr   )autononer  rO  z!Invalid tool choice, tool_choice=z3. Please ensure tool_choice follows the OpenAI specz. Got=zW. Expecting str, or dict. Please ensure tool_choice follows the OpenAI tool_choice spec)	litellm.types.llms.openair|  r}  r   r5  r`  r  r   r   )rJ  r|  r}  s      r   $validate_chat_completion_tool_choicer    s    
 	K	%	K	& OOF#'CC+- ??6"*kooj.I.Q3K=@st  

+K=tK?P>Q  Ri  	j r   c                      e Zd Zedededee   fd       Zedededee	   fd       Z
edededee   dee   def
d       Zedededee   fd	       Zedededee   fd
       Ze	 ddedee   dee   fd       Zedededefd       Zedee   dedee   fd       Zedededee   fd       Zedededee   fd       Zedededee   fd       Zededee   fd       Zededee    fd       Z!edededee"   fd       Z#edededee$   fd       Z%edededee&   fd       Z'edededee(   fd       Z)y)r  r0  r   r   c                 "   |t         j                  k(  r0t        j                  j	                  |       rt        j                  S t        j                   j
                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                          S t        j                   j"                  |k(  rt        j$                         S t        j                   j&                  |k(  rt        j(                         S t        j                   j*                  |k(  rt        j,                         S t        j                   j.                  |k(  rt        j0                         S t        j                   j2                  |k(  rt        j4                         S t        j                   j6                  |k(  rt        j8                         S t        j                   j:                  |k(  rt        j<                         S t        j                   j>                  |k(  rt        j@                         S t        j                   jB                  |k(  rt        jD                         S t        j                   jF                  |k(  rd| v rt        jD                         S d| v rt        jH                         S | t        jJ                  v r,d| v rt        jL                         S t        jN                         S | t        jP                  v rt        jR                         S t        jT                         S t        j                   jV                  |k(  rt        jX                         S t        j                   jZ                  |k(  rt        j\                         S t        j                   j^                  |k(  rt        j`                         S t        j                   jb                  |k(  rt        jd                         S t        j                   jf                  |k(  rt        jh                         S t        j                   jj                  |k(  rt        jl                         S t        j                   jn                  |k(  rt        jp                         S t        j                   jr                  |k(  rt        jt                         S t        j                   jv                  |k(  rt        jx                         S t        j                   jz                  |k(  rt        j|                         S t        j                   j~                  |k(  s:t        j                   j                  |k(  st        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  st        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rLt        j                         j                  |       rt        j                         S t        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  st        j                   j                  |k(  rt        jN                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        jL                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   jV                  |k(  rt        jX                         S t        j                   j>                  |k(  rt        j@                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                          S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j
                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                          S t        j                   j"                  |k(  rt        j$                         S t        j                   j&                  |k(  rt)        j*                  |       }t        j,                  j/                  |       }t)        j0                  |       }|dk(  s|dk(  rt        j2                         S |dk(  rdd	lm}  |       S |d
k(  rt        j8                         S |dk(  rL|t        j:                  j=                         v rt        j:                         S t        j>                         S |dk(  s|dk(  rt        j@                         S |dk(  rt        jB                         S |dk(  rt        jD                         S |dk(  rt        jF                         S |dk(  rt        jH                         S |dk(  rt        jJ                         S t        jL                         S t        j                   jN                  |k(  rt        jP                         S t        j                   j                  |k(  rt        jR                         S t        j                   jT                  |k(  rt        jV                         S t        j                   jX                  |k(  rt        jZ                         S y)zC
        Returns the provider config for a given provider.
        r   r  rF  rm  r  r  agentr   )AmazonInvokeAgentConfigamazonr  metallamar  r  r  deepseek_r1novaN)re   r  r   openaiOSeriesConfigis_model_o_series_modelDEEPSEEKDeepSeekChatConfigGROQr  BYTEZBytezChatConfig
DATABRICKSr  XAIr  	LAMBDA_AILambdaAIChatConfigLLAMALlamaAPIConfigTEXT_COMPLETION_OPENAIOpenAITextCompletionConfigCOHERE_CHATr  COHEREr  	SNOWFLAKESnowflakeConfigCLARIFAIClarifaiConfigr  r  ANTHROPIC_TEXTr  VERTEX_AI_BETAr  	VERTEX_AIr  r  r  r  r  r  r  
CLOUDFLAREr  SAGEMAKER_CHATSagemakerChatConfig	SAGEMAKERr  rj  r  
FRIENDLIAIFriendliaiChatConfigWATSONXr  WATSONX_TEXTrx  EMPOWEREmpowerChatConfigGITHUBGithubChatConfigGITHUB_COPILOTGithubCopilotConfigCUSTOMCUSTOM_OPENAIOPENAI_LIKEr  AIOHTTP_OPENAIAiohttpOpenAIChatConfigHOSTED_VLLMr  	LLAMAFILELlamafileChatConfigrk  LMStudioChatConfig	GALADRIELGaladrielChatConfig	REPLICATEr  HUGGINGFACEr  TOGETHER_AIr  
OPENROUTERr  	DATAROBOTDataRobotConfigGEMINIr  AI21	AI21_CHATr  r  r  r  rt  AZURE_AIr  
AZURE_TEXTAzureOpenAITextConfig	NLP_CLOUDr  	OOBABOOGAOobaboogaConfigOLLAMA_CHATr  	DEEPINFRAr  
PERPLEXITYPerplexityChatConfigMISTRAL	CODESTRAL
NVIDIA_NIMr  CEREBRASr  
VOLCENGINEr  TEXT_COMPLETION_CODESTRAL	SAMBANOVASambanovaConfigMARITALKr  VLLMr  OLLAMAr  ri  r  TRITONr  PETALSr  FEATHERLESS_AIFeatherlessAIConfigNOVITANovitaConfigrl  r  	DASHSCOPEDashScopeChatConfigMOONSHOTMoonshotChatConfigV0V0ChatConfigMORPHMorphChatConfigBEDROCKrF   r  
BedrockLLMget_bedrock_invoke_providerr  r  5litellm.llms.bedrock.chat.invoke_agent.transformationr  AmazonTitanConfigr   get_legacy_anthropic_model_namesr  AmazonLlamaConfigAmazonAI21ConfigAmazonCohereConfigAmazonMistralConfigAmazonDeepSeekR1ConfigAmazonInvokeNovaConfigAmazonInvokeConfigLITELLM_PROXYLiteLLMProxyChatConfigOpenAIGPTConfigNSCALENscaleConfig
HYPERBOLICHyperbolicChatConfig)r0  r   r  bedrock_invoke_providerr  r  s         r   rQ  z.ProviderConfigManager.get_provider_chat_config$  s    +++++CC%CP...!!**h6--//!!&&(2))++!!''83**,,!!,,8++--!!%%1((**!!++x7--//!!''83))++!!88HD5577!!--9++--!!((H4''))!!++x7**,,!!**h6))++!!++x7**,,!!00H<..00!!00H<--//!!++x75 1133U"6688'777%'"@@BB"0022'77711333355!!,,8//11!!00H<..00!!++x7**,,!!..(:,,..!!,,8//11!!))X5//11!!..(:--//!!))X5,,..!!((H4++--!!00H<..00  ''83##11X=##//8;//11!!00H<2244!!--9//11!!++x7..00!!++x7--//!!++x7..00!!++x7**,,!!--90022!!--9++--!!,,8++--!!++x7**,,!!((H45577  %%1##--9))++!!''83**,>>U>K2244,,..!!**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''))!!00H<..00!!((H4''))!!((H4''))!!++x7..00!!**h6--//!!$$0''))!!''83**,,!!))X5,>>uEM&-&8&8&T&T 'U '# *88?J
*m.N3355') /00(H40022(K744UUWX #88::"??AA'615LPW5W0022(F2//11(H41133(I52244(M95577(F255771133!!//8;1133!!((H4**,,!!((H4''))!!,,8//11r   c                    t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j
                         S t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  st         j                  j                  |k(  rddlm}  |       S y )Nr   )CohereEmbeddingConfig)r   re   VOYAGEr,  r  r!  r  IBMWatsonXEmbeddingConfigINFINITYr-  r  r  (litellm.llms.cohere.embed.transformationr  )r0  r   r  s      r   r   z3ProviderConfigManager.get_provider_embedding_config  s    
 &&(20022!!((H40022!!))X54466!!**h62244  ''83##//8;V(**r   rG  present_version_paramsc                    t         j                  j                  |k(  st         j                  j                  |k(  r4t	        ||      rt        j
                         S t        j                         S t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j                         S t        j
                         S r   )r   re   r  r  should_use_cohere_v1_clientCohereRerankConfigCohereRerankV2Configr  AzureAIRerankConfigr  InfinityRerankConfigJINA_AIJinaAIRerankConfigr  HuggingFaceRerankConfig)r0  r   rG  r  s       r   get_provider_rerank_configz0ProviderConfigManager.get_provider_rerank_config  s       ''83##//8;*85KL11333355!!**h6..00!!**h6//11!!))X5--//!!--92244))++r   c                 $   t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j
                         S t         j                  j                  |k(  rd| v rddlm}  |       S y )NrF  r   ),VertexAIPartnerModelsAnthropicMessagesConfig)	r   re   r  AnthropicMessagesConfigr  $AmazonAnthropicClaude3MessagesConfigr  blitellm.llms.vertex_ai.vertex_ai_partner_models.anthropic.experimental_pass_through.transformationr  )r0  r   r  s      r   &get_provider_anthropic_messages_configz<ProviderConfigManager.get_provider_anthropic_messages_config6  s|    
 ))X52244 !!))X5??AA!!++x75  DEEr   c                    t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rt        j
                         S t         j                  j                  |k(  rddlm}  |       S t         j                  j                  |k(  r,d| v rt        j                         S t        j                         S y )Nr   )"ElevenLabsAudioTranscriptionConfigzgpt-4o)r   re   rj  #FireworksAIAudioTranscriptionConfigDEEPGRAM DeepgramAudioTranscriptionConfig
ELEVENLABS:litellm.llms.elevenlabs.audio_transcription.transformationr  r  !OpenAIGPTAudioTranscriptionConfig%OpenAIWhisperAudioTranscriptionConfig)r0  r   r  s      r   r  z=ProviderConfigManager.get_provider_audio_transcription_configJ  s    
 ,,8>>@@!!**h6;;==!!,,8 677!!((H45 @@BBDDFFr   Nc                     t         j                  j                  | k(  rt        j                         S t         j                  j                  | k(  rt        j
                         S y r   )r   re   r  OpenAIResponsesAPIConfigr  AzureOpenAIResponsesAPIConfig)r   r0  s     r   !get_provider_responses_api_configz7ProviderConfigManager.get_provider_responses_api_config`  sM    
 &&(23355!!''8388::r   c                     t         j                  |k(  rt        j                         S t         j                  |k(  rt        j
                         S t        j                         S r   )re   rj  r   FireworksAITextCompletionConfigr  TogetherAITextCompletionConfigr  r  s     r   #get_provider_text_completion_configz9ProviderConfigManager.get_provider_text_completion_configk  sM    
 $$0::<<%%199;;1133r   c                    t         j                  |k(  rt        j                         S t         j                  |k(  rt        j
                         S t         j                  |k(  rt        j                         S t         j                  |k(  rt        j                         S t         j                  |k(  rt        j                         S t         j                  |k(  rt        j                         S t         j                  |k(  rt        j                         S t         j                   |k(  st         j"                  |k(  rddlm}  |       S t         j(                  |k(  st         j*                  |k(  rddlm}  |       S y )Nr   )OllamaModelInfo)VLLMModelInfo)re   rj  r   r  r  r  r  GeminiModelInfor  r  TOPAZTopazModelInfor  AnthropicModelInfor  XAIModelInfor  r   litellm.llms.ollama.common_utilsr&  r  r  litellm.llms.vllm.common_utilsr'  )r0  r   r&  r'  s       r   r  z-ProviderConfigManager.get_provider_model_infov  s#   
 $$0,,..  H,**,,  H,**,,''8311338+))++##x/--//)''))  H,0H0HH0TH"$$(*l.F.F(.R !?"r   c                     t         j                  |k(  rddlm}  |       S t         j                  |k(  rddlm}  |       S y )Nr   )BedrockPassthroughConfig)VLLMPassthroughConfig)re   r  /litellm.llms.bedrock.passthrough.transformationr0  r  ,litellm.llms.vllm.passthrough.transformationr1  )r0  r   r0  r1  s       r   get_provider_passthrough_configz5ProviderConfigManager.get_provider_passthrough_config  sC    
 8+ ,--(* )**r   c                     t         j                  |k(  rt        j                         S t         j                  |k(  rt        j
                         S y r   )re   r  r   OpenAIImageVariationConfigr)  TopazImageVariationConfigr  s     r   #get_provider_image_variation_configz9ProviderConfigManager.get_provider_image_variation_config  sA    
 (*55778+4466r   c                     t         j                  |k(  rddlm}  |       S t         j                  |k(  rddlm}  |       S y )Nr   )GoogleAIStudioFilesHandler)VertexAIFilesConfig)re   r  (litellm.llms.gemini.files.transformationr:  r  +litellm.llms.vertex_ai.files.transformationr;  )r0  r   r:  r;  s       r   get_provider_files_configz/ProviderConfigManager.get_provider_files_config  s?    
 (* .//##x/W&((r   c                 V    ddl m} t        j                  | k(  r|j	                         S y )Nr   )BedrockVectorStore)Clitellm.integrations.vector_store_integrations.bedrock_vector_storer@  re   r  get_initialized_custom_logger)r   r@  s     r    get_provider_vector_store_configz6ProviderConfigManager.get_provider_vector_store_config  s)    	
 8+%CCEEr   c                    t         j                  j                  | k(  rddlm}  |       S t         j                  j
                  | k(  rddlm}  |       S t         j                  j                  | k(  rddl	m
}  |       S t         j                  j                  | k(  rddlm}  |       S t         j                  j                  | k(  rddlm}  |       S y)zT
        v2 vector store config, use this for new vector store integrations
        r   )OpenAIVectorStoreConfig)AzureOpenAIVectorStoreConfig)VertexVectorStoreConfig)BedrockVectorStoreConfig)PGVectorStoreConfigN)r   re   r  0litellm.llms.openai.vector_stores.transformationrE  r  /litellm.llms.azure.vector_stores.transformationrF  r  3litellm.llms.vertex_ai.vector_stores.transformationrG  r  1litellm.llms.bedrock.vector_stores.transformationrH  	PG_VECTOR3litellm.llms.pg_vector.vector_stores.transformationrI  )r   rE  rF  rG  rH  rI  s         r   !get_provider_vector_stores_configz7ProviderConfigManager.get_provider_vector_stores_config  s     &&(2 +,,!!''83 011!!++x7 +,,!!))X5 ,--!!++x7 '((r   c                    t         j                  |k(  rddlm}  ||       S t         j                  |k(  rddlm}  ||       S t         j                  |k(  rddlm	}  ||       S t         j                  |k(  rddlm}  ||       S y )Nr   )"get_openai_image_generation_config)!get_azure_image_generation_config)&get_xinference_image_generation_config)#get_recraft_image_generation_config)re   r  $litellm.llms.openai.image_generationrR  r  #litellm.llms.azure.image_generationrS  
XINFERENCE(litellm.llms.xinference.image_generationrT  RECRAFT%litellm.llms.recraft.image_generationrU  )r0  r   rR  rS  rT  rU  s         r   $get_provider_image_generation_configz:ProviderConfigManager.get_provider_image_generation_config  s    
 (* 6e<<8+ 5U;;$$0 :%@@!!X- 7u==r   c                 D    t         j                  |k(  rddlm}  |       S y )Nr   )GeminiRealtimeConfig)re   r  +litellm.llms.gemini.realtime.transformationr^  )r0  r   r^  s      r   get_provider_realtime_configz2ProviderConfigManager.get_provider_realtime_config  s!    
 (*X'))r   c                     t         j                  |k(  rddlm}  |       S t         j                  |k(  rddlm}  |       S t         j                  |k(  rddlm	}  |       S y )Nr   )OpenAIImageEditConfig)AzureImageEditConfig)RecraftImageEditConfig)
re   r  -litellm.llms.openai.image_edit.transformationrb  r  ,litellm.llms.azure.image_edit.transformationrc  rZ  .litellm.llms.recraft.image_edit.transformationrd  )r0  r   rb  rc  rd  s        r   get_provider_image_edit_configz4ProviderConfigManager.get_provider_image_edit_config#  sa    
 (* )**8+ ())!!X- *++r   c                     t         j                  j                  |k(  rddlm}  |       S t         j                  j
                  |k(  r%ddlm} ddlm	} |j                  |       ry  |       S y )Nr   )GoogleGenAIConfig)VertexAIGoogleGenAIConfig)VertexAIPartnerModels)r   re   r  /litellm.llms.gemini.google_genai.transformationrj  r  2litellm.llms.vertex_ai.google_genai.transformationrk  4litellm.llms.vertex_ai.vertex_ai_partner_models.mainrl  is_vertex_partner_model)r0  r   rj  rk  rl  s        r   1get_provider_google_genai_generate_content_configzGProviderConfigManager.get_provider_google_genai_generate_content_config<  sg    
 &&(2 %&&!!++x7 %<<UC -..r   r   )*r  rK  rL  rM  r5  re   r   r   rQ  r   r   r~   r   r  r   r  r   r  r   r   r   r$  r   r  r   r4  r   r8  r   r>  r%   rC  r   rP  r   r\  r   r`  r   rh  rD   rq  r:  r   r   r  r  #  s   ``*`	*	` `D  
%	& * ,,, 3-, !%S		,
 
, ,0  
-	. &  
.	/ *   $} 
(	)  444 
"4 4 } 
"	# >  
'	( &  
*	+   
/	"   			,		 	 $$	'	($ $L  
+	, <  
$	%   
%	& 0  
6	7 r   r  service_type)rP  
prometheusc                    t        t        | j                  di       xs i       }t        t        t           | j                  d      xs |j                  d            }t
        j                  ry|dk(  rt
        j                  dury|S )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_idNrs  T)r   r`  r  r   r5  r   disable_end_user_cost_tracking-enable_end_user_cost_tracking_prometheus_only)rK  rr  	_metadataend_user_ids       r   !get_end_user_id_for_cost_trackingrz  _  s     T>--j"=CDI56 	5==34K
 -- |#@@Lr   r  c                 n    | syd|v xr d|v}| j                  d      xs |xr | j                  d       S )NFmax_chunks_per_docmax_tokens_per_docz
/v1/rerankz
/v2/rerank)endswith)rG  r  uses_v1_paramss      r   r  r  |  sV     *.DD $::  \* >x00>>r   c                     	 ||y|| j                  |      s|dz   | z   } t        ||| d      }|t        k\  S # t        $ r"}t	        j
                  d|        Y d}~yd}~ww xY w)z
    Returns true if the prompt is valid for prompt caching.

    OpenAI + Anthropic providers have a minimum token count of 1024 for prompt caching.
    NFr  T)r)  rI  r0  rK  z)Error in is_prompt_caching_valid_prompt: )r  r   r!   r   r   r   )r0  r)  rI  rP  token_countr  s         r   is_prompt_caching_valid_promptr    s    *53C3C4
 (#-5E#*.	
 >>> HLMs   : 2: 	A%A  A%srt_or_vtt_contentc                     d}t        j                  ||       }|syg }|D ]<  }t        t        |      \  }}}}|dz  |dz  z   |z   |dz  z   }	|j	                  |	       > |rt        |      S dS )a  
    Extracts the total duration (in seconds) from SRT or VTT content.

    Args:
        srt_or_vtt_content (str): The content of an SRT or VTT file as a string.

    Returns:
        Optional[float]: The total duration in seconds, or None if no timestamps are found.
    z"(\d{2}):(\d{2}):(\d{2})[.,](\d{3})Ni  re  g     @@)ra  findallr%  r  r   r  )
r  timestamp_pattern
timestamps	durationsmatchhoursminutessecondsmillisecondstotal_secondss
             r    extract_duration_from_srt_or_vttr    s     >-/ABJ I03C-ww|3g=v@UU' 
 '3y>0D0r   ending_pathc                 X   t        j                  |       }|j                  i       }|j                  j	                  d      }|j                  d      }|j                  d      D cg c]  }|s|	 }}|j                  d      D cg c]  }|s|	 }}g }	t        t        |            D ]#  }
||
d |dt        |      |
z
   k(  s|d|
 |z   }	 n ||z   }	ddj                  |	      z   }|j                  |      }t        |j                  |j                              S c c}w c c}w )z
    Adds an ending path to an API base URL while preventing duplicate path segments.

    Args:
        api_base: Base URL string
        ending_path: Path to append to the base URL

    Returns:
        Modified URL string with proper path handling
    )paramsr  Nr  )r  r  r  r  rstriplstripr  r  rN  r   r5  r  )rG  r  r  base_url	base_pathend_pathr  base_segmentsend_segmentsfinal_segmentsr  modified_pathr  s                r   _add_path_to_api_baser    s6    99X&L%%R%0H!!((-I!!#&H !* 4:1Q:M:'~~c28!aA8L8 N3}%&-Es=/AA/E FF*2A.=N ' '5 #((>22M%%=%9L |%%\-@-@%ABB% ;8s   'D"/D"D'D'r  c                 ~    | j                         D ci c]  \  }}|t        j                  v r||| c}}S c c}}w r   )r  r   OPENAI_CHAT_COMPLETION_PARAMS)r  r  r  s      r   get_standard_openai_paramsr    sD     LLNAq555!- 	
1  s   !9c                     t         j                  }|t        z   }| j                         D ci c]  \  }}||vs|| }}}|S c c}}w r   )r   r  rv   r  )r   r  r  r  r  r  s         r   !get_non_default_completion_paramsr    sU    99M"%77NA1N+B1  	s
   AAc                     ddl m} |t        z   }| j                         D ci c]  \  }}||vs|| }}}|S c c}}w )Nr   r  )r  r  rv   r  )r   r  r  r  r  r  s         r   $get_non_default_transcription_paramsr    sE    =03EEN+1<<>U41aQn=T!Q$UU Vs   ::r  c                    | y| j                         D ci c]  \  }}|dk7  rt        |t              r|| }}}t        |      dkD  r-i }d}|j                         D ]  \  }}|dk  r|||<   |dz  } |}|j	                         S c c}}w )a\  
    Add metadata to openai optional parameters, excluding hidden params.

    OpenAI 'metadata' only supports string values.

    Args:
        params (dict): Dictionary of API parameters
        metadata (dict, optional): Metadata to include in the request

    Returns:
        dict: Updated parameters dictionary with visible metadata only
    Nhidden_params   r   r   )r  r   r5  rN  r  )r  r  r  visible_metadatafiltered_metadatar  s         r   add_openai_metadatar    s      NN$AqJq3$8 	
1  r!$**,DAqRx'(!!$1HC - -  ""!s   "Bendpointc           
      h   ddl m } ddlm}  |ddddgdd	d
 |j                         d
d      }t	        t
        | j                        }d}	  |di ||dd |j                  j                  d      }|rt        t        |      S t        |      S # t        $ r}t        |      }Y d}~Rd}~ww xY w)z
    Return the json str of the request

    This is currently in BETA, and tested for `/chat/completions` -> `litellm.completion` calls.
    r   rI  r   zgpt-3.5-turborI  hir  Fr^  1234T)r0  r)  rA  r>  r?  rB  r%  log_raw_request_responser2  zmy-fake-api-key)r  r  Nraw_request_typed_dict)r   r:  )r  r   r!  r  getattrr   r  r   r5  r-  r  r   ro   )	r  r   r  r!  r  llm_api_endpointreceived_exceptionr  r  s	            r   return_raw_requestr  )  s     "B!!d348<<>!%	 w7$ 	
	
 3%	
 1CCGG  ')?@@"$
 	
  $ V$s   B 	B1B,,B1c                     g }| D ]g  }t        |t              r|j                  d      }n t        |t              r|j	                         }t        |t              sW|j                  |       i |S )zn
    Fixes https://github.com/BerriAI/litellm/issues/9321

    Where user passes in a pydantic base model
    Trf  )r   r   rh  r`  r  r   )rI  	new_toolsrT  s      r   rs  rs  V  sb     IdI&???5Dd#99;DdD!T"  r   c                      t        ddd      S )Nr   )prompt_tokenscompletion_tokensr  )ru   r:  r   r   get_empty_usager  g  s     r   r  mock_tool_callsmock_timeoutc                     | s|s|ryyr  r:  )r  r  r  s      r   should_run_mock_completionr  o  s    
 <r   )Fr   r;  r   )r2  r2  N)mainN)	r2  NNNFNNFN)NNNNNN)NNNNNNNNNNNN)NNNr2  NNrJ  )#NNNNNFNNNNNNNNNNNr2  NNNNNNNNNNNNNNNNN)r2  r2  r2  r   r   )NNNr@  )rP  r  (  r  r  rR  binasciir  r  r  rU  io	itertoolsrE  loggingr   rg  ra  struct
subprocesssystextwrap	threadingr  r  r  dataclassesr   r   	functoolsr   r   	importlibr   r   os.pathr	   r
   r   aiohttpdotenvr  r  tiktokenr   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.llmslitellm.llms.gemini#litellm.caching._internal_lru_cacher   litellm.caching.cachingr   litellm.caching.caching_handlerr   r   r  r   r   r   r   r   r   r   r   r    r!   r"   r#   %litellm.integrations.custom_guardrailr$   "litellm.integrations.custom_loggerr%   @litellm.integrations.vector_store_integrations.base_vector_storer&   'litellm.litellm_core_utils.core_helpersr'   r(   .litellm.litellm_core_utils.credential_accessorr)   +litellm.litellm_core_utils.default_encodingr+   2litellm.litellm_core_utils.exception_mapping_utilsr,   r-   r.   -litellm.litellm_core_utils.get_litellm_paramsr/   r0   1litellm.litellm_core_utils.get_llm_provider_logicr1   r2   6litellm.litellm_core_utils.get_supported_openai_paramsr3   ,litellm.litellm_core_utils.llm_request_utilsr4   Flitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser5   r6   r7   r8   r9   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.llm_response_utils.response_metadatar>   *litellm.litellm_core_utils.redact_messagesr?   r@    litellm.litellm_core_utils.rulesrA   ,litellm.litellm_core_utils.streaming_handlerrB   (litellm.litellm_core_utils.token_counterrC   1litellm.llms.base_llm.google_genai.transformationrD   re  rF   &litellm.llms.custom_httpx.http_handlerrG   rH   *litellm.router_utils.get_retry_from_policyrI   rJ   litellm.secret_managers.mainrK   litellm.types.llms.anthropicrL   rM   r  rN   rO   rP   rQ   rR   rS   rT   rU   litellm.types.rerankrV   litellm.types.utilsrW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   filesjoinpathr  fr  	json_dataImportErrorAttributeErrorr  	open_textdumpsr5  importlib.metadatatypingry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   OriginalError/litellm.litellm_core_utils.thread_pool_executorr   r   rO  7litellm.llms.base_llm.anthropic_messages.transformationr   8litellm.llms.base_llm.audio_transcription.transformationr    litellm.llms.base_llm.base_utilsr   r   )litellm.llms.base_llm.chat.transformationr   /litellm.llms.base_llm.completion.transformationr   .litellm.llms.base_llm.embedding.transformationr   *litellm.llms.base_llm.files.transformationr   /litellm.llms.base_llm.image_edit.transformationr   5litellm.llms.base_llm.image_generation.transformationr   5litellm.llms.base_llm.image_variations.transformationr   0litellm.llms.base_llm.passthrough.transformationr   -litellm.llms.base_llm.realtime.transformationr   +litellm.llms.base_llm.rerank.transformationr   .litellm.llms.base_llm.responses.transformationr   1litellm.llms.base_llm.vector_store.transformationr   _loggingr   r   caching.cachingr   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   proxy._typesr   r   types.llms.openair   r   r   types.routerr   sentry_sdk_instancecapture_exceptionrY  posthog	slack_appalerts_channelheliconeLoggerathinaLoggerpromptLayerLoggerlangsmithLoggerlogfireLoggerweightsBiasesLoggercustomLoggerlangFuseLoggeropenMeterLogger
lagoLoggerdataDogLoggerprometheusLoggerdynamoLoggers3LoggergreenscaleLoggerlunaryLoggeraispendLoggersupabaseClientr   r5  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  rt  r  r$  r"  r(  r)  r<  rB  r!  rG  rU  rW  r]  r_  ra  rh  ro  rr  rt  ry  rZ  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1  r4  r9  r>  r  rW  rS  r{  r  rR  r  r  r  r  r  r  r  r
  r  r  r  r  r$  r+  rG  rN  r^  rc  rf  rh  rn  rr  rv  rw  ry  r  rZ  r  rw  r  rd  r  r  r  r  r  r  r	  r@  rB  rM  rR  rT  rV  Headersra  rm  rw  ry  r  r  r  r  r  r  r  r  r  r  litellm.caching.in_memory_cacher  r  r  r  r  r  r  r+  r/  r1  r=  rJ  rO  rV  rX  r[  r^  r_  r`  ra  rb  rc  rd  rj  rq  ru  rl  rt  r  r  rz  r  r  r  r  r  r  r  r  r  rs  r  r  r:  r   r   <module>r3     s           	    	  	         ( &   * *       0 * E       ! 3 6   A - U    B ; N @ 
 T  T 3 L L ? P 4	 	 	 0 )                 D
!	@	A	J	J"

d3d!!%&DIIaL	! $**Y'      0 D W A T N F O S L H Q S 6 6          " B A  
 ) (   
	  
  %'xS	" '/1 HT#s(^, 1(*Xd38n% * 2 3: /0(	E==")*>"?=	=@ 	  	 4S> d3i 4S> d3i &	$t 	$U3,+F%G HI	jjZ	
%

 #'
0cN'0
8C=$sCx.().cN'0eE3-./ET "TN 
@cNY^$ 
>% C= 	
 !!  
4 JN
1
1"*+E"F
1 -.+C +,C + /+?C ?,C ? :Q1R . ( PT T#Y x~  CGEE2:3-E6E3 E  GK,0#,159@D49)-$uT+B%BCD$ 5d3i(
)$ tn	$
 $D>$ D012$ <=$ $,D>$ "#$ 	$N	 	 	C hsm PT *s # RV * (3- SW *S x} QU D 6:((%-c](	(X 6:

%-c]
	
 6:%-c]	. (3- SW %-c]9<gdm ,S ,x} ,3 ,SW ,^ (3- SW c  QU  6:%-c]	 6:%-c]	0 6:%-c]	.3 Xc] d $c  QU  6:""%-c]"d3i"L 6:

%-c]
	
d d t  QuS$Y/ QhT )-GOPT~	& # %)!%JN"&VVV smV SM	V
 c]V #V &d73D+E&FGV $Vt  !%)$()--1;?"&DC=D}D c]D c]	D
 3-D C=D 3-D SMD "#D %TND 78D $DT %) $"&26{{ 3-{ c]	{
 { ${ %T#Y/{|.*7?S	7J	"F" F"^ #().JJJ J %T#Y/	J
 J  J #'J 
JZt  ^^-1^HK^	^J 

	
		
151515;?M{ {B $DI.C{H t,-.I{J -.K{L !!78M{F .2000 0 9	0
 %TN0 
0f/3LP$ 4  (#C=(	#( 
#( $,C=	(
 c](Vd  *&&.<&c]&6, ,8DV;W ,^. T . T ":=	"*23-c]4T c C C eM;N,N&O TW ",c ,HSM ,^!:
# :
(3- :
z, ,	73 	73# 3# 3 S x}  &# # #d # SW < i **%-c]*,*ZS Xc] .XX%-c]XX%-c]'((	B			 6:v
v
%-c]v
v
rV# VHSM VY VrGs G4Xv  "(
(
(
 (
 	(

 (
 (
VS T-5H  1:  !"mVC=mVc]mV smmV 
	mV`0$H3  .s < 15u}}-J 15	>>> u}}-> 	>
 5#:>8  " ?&?&?& ?& 	?&
 ?&DQ% Q%j >B-5c]0 >B-5c]0T "D">49
 TY6#+C=6LP6|  *#(j!C=j! j! !	j!Z : 9>C= >CD $% *.!#	#Y< 04% ^, 
#Y	2 /3)-/3>%d^>!#> ^,> 
#Y	>B1h# #> B( 
/ D 0  &c c 	4(8#9 	d 	 5L0M *   
U9d?3 
 
(4 It I&C+; C&T:J5K &R!%c	*+!eD#I!Hy y| >O9: c]:
sm
59#Y
  6:)-	t,-. D012 "#	
 
<1 1% 18 #CC #Cc #Cc #CLt  d t  $  #$  #4  #F*
 *
D *
=P *
Zc tDz " C=c] 3- 
	[e! ! 	^Y/ !			/1K
 !	
DIIaL	! ! !!sB   +5|  |4| || }$7}	}$}	}$#}$