
    jS                    !   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  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l0m1Z1 d dl2m3Z3 d dl)m4Z4 d dl5m6Z6 d dl7Z7d dl8Z7d dl9Z7d dl:Z7d dl;Z7d dl<Z7d dl=Z7d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZEmFZF d dlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZS d dlTmUZU d dlVmWZW d dlXmYZY d dlZm[Z[m\Z\m]Z] d dl^m_Z_m`Z`maZa d dlbmcZc d dldmeZe d dlfmgZgmhZhmiZi d dljmkZkmlZl d dlmmnZnmoZo d dlpmqZq d dlrmsZs d d ltmuZumvZvmwZwmxZxmyZy d d!lzm{Z{ d d"l|m}Z} d d#l~mZ d d$lmZ d d%lmZ d d&lmZmZ d d'lmZ d d(lmZ d d)lmZ d d*lmZ d d+lmZ d d,lmZ d d-lmZ d d.lmZ d d/lmZ d d0lmZmZ d d1lmZ d d2lmZmZ d d3lmZ d d4lmZmZ d d5lmZmZmZmZmZmZmZmZ d d6lmZ d d7lmZ d d8lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ 	  ej                  d9      j                  d:      j                  d;d<      5 Z ej                  e֫      Zddd        ej                  eث      Zd dlZd d=lmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d d>l(mZ d d?lmZ d d@lmZ d dAlmZ d dBlmZ d dClmZ d dDlmZmZ d dElmZ d dFlm Z  d dGlmZ d dHlmZ d dIlmZ d dJlmZ d dKl	m
Z
 d dLlmZ d dMlmZ d dNlmZ d dOlmZ d dPlmZ d dQlmZ d dRlmZ d dSlmZ d dTlmZ dUdVlmZmZ dUdWl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& dUdXl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/mZm0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 dUdYl6m7Z7m8Z8 dUdZl9m:Z:m;Z;m<Z< dUd[l=m>Z> erd d\l7m?Z? dZ@dZAdaBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdZNdZOdZPdZQdZRdZSdZTdZUdZVdZWg aXeeeY      eZd]<   da[i Z\eeeYeYf      eZd^<   i Z]eeeYeYf      eZd_<   dZ^dZ_	 	 ddae`dbedc   fddZade ZbdfeYdgedh   didfdjZcdkeWdie`fdlZddkeWdie`fdmZedneeYef   dieeY   fdoZfdneeYef   dieeY   fdpZgdnehfdqZidreeeeYeeWf         diefdsZjdteYfduZkdvedwe`fdxZldneeYef   dyemdieeen   eeYef   f   fdzZodneeYef   dyemdieeepene'jf                  f      fd{Zqdie`fd|ZrdneeYef   d}eYfd~Zsdehded}ee   diee   fdZtdeeh   fdZud Zv	 ddneeh   de`die`fdZwdneeYef   d}eeeYf   die`fdZx	 ddeYdee   fdZy eeJ      deYdiefd       ZzdeYdiefdZ{deYdiee   fdZ|ddeeh   fdZ}dg dfdeen   deeh   fdZ~	 ddeYdeeY   fdZdeYfdZ	 	 	 	 	 	 	 	 	 ddeeehef      deeeYeeY   f      dee   dee`   deee      dee   dee`   deen   dienfdZdeYdie`fdZdeYdeeY   die`fdZddeYdeeY   die`fdZddeYdeeY   die`fdZdeYdeeY   die`fdZ	 ddeYdeeY   die`fdZ	 ddeYdeeY   die`fdZ	 ddeYdeeY   die`fdZddeYdeeY   die`fdZdeYdeeY   deYdieed      fdZdeYdeeY   deYdie`fdZddeYdeeY   die`fdZddeYdeeY   die`fdZ	 ddeYdeeY   die`fdZ	 ddeYdeeY   die`fdZ	 ddeYdeeY   die`fdZddeYdeeY   die`fdZddeYdeeY   die`fdZ	 ddeYdeeY   dieeeY      fdZ	 ddeYdeeY   die`fdZdedehdiehfdZd ZdeeYehf   fdZdie`fdZdehdehdee   diehfdZ	 	 	 	 	 	 ddeYdeYdeeY   deeY   deeY   deen   deeed         dee`   fdɄZdeeY   dieYfd˄Z	 	 	 	 	 	 	 	 	 	 	 ddeeY   deen   deeY   deeY   deeY   deeY   deeY   deeY   dee   dee   dee`   fdфZ	 	 	 	 	 	 ddeYdeeY   deeY   deen   dee`   deeeY      fdԄZdՄ Zdք ZddׄZdؐehdeeeY      diehfdڄZdnehdiehfdۄZ G d܄ dݫ      Z	 	 	 ddehdސehdeYdeeeY      deYdߐe`de`dee    diehfdZdehdiehfdZdehdؐehdeYdiehfdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeYdeeeY      deee      dee   dee   deeY   fdZ	 ddehdehdeYdeeY   dee   diehfdZdehdؐehdefdZdehdiehfdZdeen   deen   deen   deen   dieen   f
dZdee   diefdZdeYde>dieeY   fdZde>diee7   fdZde>die`fdZde>die`fdZde>deYdie`fdZde>deeY   dieeY   fdZdnehdieYfdZdeYdienfdZd eeef   dieYfdZdeYdeeY   fdZd ZdeYdieen   fdZdieYfdZdieYfdZd	eYdieYfd
ZdeYdeeY   dieYfdZdeYdiehfdZdehdeeY   die`fdZd dlmZ  G d de      ZdeYdeeY   diefdZÐd	eYdieen   fdZdeYdeeY   diefdZdeYdeeY   diee   fdZƐdedie`fdZ	 ddeYdeeY   diefdZȐddeYdeeY   diefdZɐdeYfdZdiehfdZːd Z	 	 	 	 	 ddeYdeYdeYdÐeYdend enfd!ZdeYdiee   fd"Zΐd# Z	 	 	 	 ddeeY   d$eeY   deeY   d%eeY   diehf
d&ZАd' Zѐd( ZҐd) ZdeYd$eYfd*ZԐd+enfd,Z	 dd-ee'j                     fd.Z	 	 dd/end0end-ee'j                     d1endieepenf   f
d2Zi ddi fdeYd3ehd4eYd5eYd6ehf
d7Z G d8 d9      Z	 ddeen   fd:Z	 dd;eeYd<ef   deen   fd=Zdiehfd>Zݐd? Zސd@ ZߐdA ZdB ZdC Z	 ddeeY   dDe`fdEZdeKd`dfdeeY   dFepdGe`fdHZd dIlmZ  G dJ dKe      Z e       Z	 ddeeY   dieeY   fdLZ	 ddedeYdee>   dieeY   fdMZ	 	 	 	 	 ddNee`   deeY   dee>   d$eeY   deeY   dieeY   fdOZdP ZdQ ZddRZ G dS dT      Z G dU dV      Z G dW dXe      ZdYedie`fdZZd[eYdie`fd\Zd[eYdieYfd]Zdee   die`fd^ZdeYdiee   fd_Zd d`lmZmZmZmZmZmZ dYee3ehf   diehfdaZdefdbZdefdcZdee   dieeeh      fddZ dYefdeZdee   fdfZdeeeheYf      dieeeheYf      fdgZ G dh di      Z	 ddehdjedk   dieeY   fdlZdeeY   dmeeY   fdnZ	 	 ddeYdeee      deee      deeY   die`f
doZdpeYdieep   fdqZd dl'Z'deYdreYdieYfdsZ	dtehdiehfduZ
dnehdiehfdvZdnehdiehfdwZdxeeeYef      dieeeYeYf      fdyZdzednehdiefd{Zdee   diee   fd|Zdiefd}Zd;ee   d~ee   dee   die`fdZy# 1 sw Y   xY w# eeef$ rA  ej                  d9d:      5 Z ej                  e֫      Zddd       n# 1 sw Y   nxY wY w xY w(      N)	dataclassfield)	lru_cachewraps)	resources)iscoroutine)StringIO)abspathdirnamejoin)Proxy)get_environment_proxies)_parsing	_pydantic)ResponseFormat)	BaseModel)Encoding)	Tokenizer)uuid)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)get_coroutine_checkerget_litellm_logging_classget_set_callbacks) get_litellm_metadata_from_kwargs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 convert_to_model_response_objectconvert_to_streaming_response#convert_to_streaming_response_async)get_api_base)get_formatted_prompt)get_response_headers)ResponseMetadata)_parse_content_for_reasoning)LiteLLMLoggingObject(redact_message_input_output_from_logging)Rules)CustomStreamWrapper)get_modified_max_tokens)$BaseGoogleGenAIGenerateContentConfig)BaseOCRConfig)BaseSearchConfigBaseTextToSpeechConfigBedrockModelInfo)CohereModelInfo)AsyncHTTPHandlerHTTPHandler)MistralOCRConfig)!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SearchProviders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MappingOptionalTupleTypeUnioncastget_args)OpenAIError)update_response_metadata)executortoken_counter)BaseAnthropicMessagesConfig)BaseAudioTranscriptionConfig)BaseLLMModelInfotype_to_response_format_param)BaseBatchesConfig)
BaseConfig)BaseTextCompletionConfig)BaseContainerConfig)BaseEmbeddingConfig)BaseFilesConfig)BaseImageEditConfig)BaseImageGenerationConfig)BaseImageVariationConfig)BasePassthroughConfig)BaseRealtimeConfig)BaseRerankConfig)BaseResponsesAPIConfig)BaseVectorStoreConfig)BaseVectorStoreFilesConfig)BaseVideoConfig   )_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)MockException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      f/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/utils.pyprint_verboser   u  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     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    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>  %      LB 	2tN+,L   ")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_callbacksr1    s1     !**//1!!"34r   original_functionc                    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         j*                  vrt         j&                  j-                         t         j                  vrt         j&                  j/                         t         j0                  vs=t         j&                  j3                         ^ t5        d	t         j                          t        t         j                         dkD  s8t        t         j$                        dkD  st        t         j*                        dkD  rlt        t6              dk(  rZt9        t;        t         j                   t         j$                  z   t         j*                  z               a t=               t6        |
       t        t         j                         dkD  rg }	t?        t         j                         D ]O  \  }
tA               jC                        s t         jD                  j#                         |	j#                  |
       Q tG        |	      D ]!  }
t         j                   j                  |
       # t        t         j$                        dkD  rg }	t?        t         j$                        D ]  \  }
tA               jC                        r1t         j&                  j/                         |	j#                  |
       Pdk(  sdk(  r1t         j&                  j/                         |	j#                  |
       t         jH                  v st        t              stK        d        tG        |	      D ]!  }
t         j$                  j                  |
       # t        t         j*                        dkD  rg }	t?        t         j*                        D ]  \  }
tA               jC                        r1t         j&                  j3                         |	j#                  |
       Pt         jH                  v sct        t              sttK        d        tG        |	      D ]!  }
t         j*                  j                  |
       # d }d }d }d }|jM                  dd       t        |d   t8              rg }	t?        |d         D ]a  \  }
tA               jC                        sdk(  sdk(  s*|"t        |t8              r|j#                         ng}|	j#                  |
       c tG        |	      D ]  }
|d   j                  |
        |j                  d      }|jM                  dd       $t        |d   t8              r|j                  d      }tN        rf	 ddl(m)}  ||      }t         jV                  r6|j                  dd        |j                  dd        |j                  dd        tO        dd| d       d|v r|d   a,t        |      dkD  r|d   n|jM                  dd       }| }|tZ        j\                  j^                  k(  s:|tZ        j`                  j^                  k(  s|tZ        jb                  j^                  k(  rd }t        |      dkD  r|d   }n|jM                  dd       r|d   }te        jf                         rt        |t8              rt        |      dkD  rpt        |d   th              r\d|d   v rTtk               }|D ]9  }|jM                  dd      }|t        |t              s)|jm                  |       ; |jo                  |jq                         |       n|tZ        jr                  j^                  k(  s|tZ        jt                  j^                  k(  r't        |      dkD  r|d   n|jM                  dd       }n|tZ        jv                  j^                  k(  s|tZ        jx                  j^                  k(  rt        |      dkD  r|d   n|d   }n4|tZ        jz                  j^                  k(  s|tZ        j|                  j^                  k(  rt        |      dkD  r|d   n|d   }n|tZ        j~                  j^                  k(  s|tZ        j                  j^                  k(  rt        |      dkD  r|d   n|d   }n|tZ        j                  j^                  k(  s|tZ        j                  j^                  k(  r|jM                  d       }n?|tZ        j                  j^                  k(  s|tZ        j                  j^                  k(  rct        |      dkD  r|d   n|d!   }t         j                  j                  j                  j                  |"      }d#|v r	||d#   d$<   nd$|i|d#<   |}n|tZ        j                  j^                  k(  s|tZ        j                  j^                  k(  r|jM                  dd%      }nU|tZ        j                  j^                  k(  s|tZ        j                  j^                  k(  rt        |      dkD  r|d   n|d   }nd&}d'}t        ||(      rd} t               ||||d)   |jM                  d*      |xs d||||||||+      }d,di}d#|v r|d#   |d#<   |j                  |di ||jM                  d-d       .       ||fS # tT        $ r |}Y =w xY w# tT        $ r}t        j                  d/       |d }~ww xY w)0NTze`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs.idr  )r,  r   r   c              3   H   K   | ]  }t        |t                      y wr  r  )r	  r
  r   s     r   r  z!function_setup.<locals>.<genexpr>H  s$      /"AB #2tH~6"Ar  z8Initialized litellm callbacks, Async Success Callbacks: )r   function_iddynamodb	openmeterr   r   r   s3r   )safe_deep_copymessagesinputpromptzlitellm.llm_callzKeyword Args: r   )categorymessagelevel	logger_fnmodelr   content r<  rB  queryfile)file_objr  file_checksumspeechzdefault-message-valueFr  	call_typelitellm_call_idlitellm_trace_id)rB  r;  streamrM  rN  r6  rL  
start_timedynamic_success_callbacksdynamic_failure_callbacksdynamic_async_success_callbacksdynamic_async_failure_callbacksr  r  api_basestream_options)rB  useroptional_paramslitellm_paramsrV  zKlitellm.utils.py::function_setup() - [Non-Blocking] Error in function_setup)Pr   r   r   warningr   r!  popr1  lenr  strlitellm_core_utilslitellm_loggingr   r  r   input_callbackr   r   r   r   r   r   r   r   r   r   r   listsetr+   	enumerater)   is_async_callable_async_input_callbackreversedr   r  r  add_breadcrumb'litellm.litellm_core_utils.core_helpersr:  r   turn_off_message_logginguser_logger_fnre   
completionr*  acompletionanthropic_messagesrG   has_pre_call_rulesdictr	   writepre_call_rulesgetvalue	embedding
aembeddingimage_generationaimage_generation
moderationamoderationatext_completiontext_completionrerankarerankatranscriptiontranscriptionaudio_utilsutilsget_audio_file_nameaspeechrJ  
aresponses	responses_is_streaming_requestr*   update_environment_variables	exception)r2  	rules_objrP  argsr  r  r6  r,  all_callbacksremoved_async_itemsindexrQ  rS  rR  rT  r:  details_to_logrB  rL  r;  buffermrC  	_file_objrI  rO  logging_objrY  er   s                                @r   function_setupr  '  s
    d"s	
e 	 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  mUw%%&*"$#,W-C-C#Dx(*<<XF1188B'..u5 $E ""56&&**51 7w''(1,"$#,W-E-E#Fx(*<<XF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F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)+==hG:-4'6Bz7H 8>>xH;C*7'..u5 $I ""56)*..u5 7(.

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

3E(F%(R!/!7 //"":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-!*- ((*x.MA%x{D1!, "!AeeIr2G*z'3/GW- "
 (( //+ ) 
 ,,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1/1"#45#ZZ(:;#)r!&?&?,K,K1
$ +5b)9)/
);N:&00)!::&6= 	1 	
 F""I  (!'(J    Y	
 	sy   F
o 6Eo D6o o Co *o ;B#o B+o o E?o o *No oo oo 	o?#o::o?r  is_completion_with_fallbacksc                    K   |du rWt        d| j                          ddlm} |j	                  | j                  |||             | j                  |||       y y w)NFz>Async Wrapper: Completed Call, calling async_success_handler: r   )GLOBAL_LOGGING_WORKERresultrP  end_time)async_coroutine)r   async_success_handler)litellm.litellm_core_utils.logging_workerr  ensure_initialized_and_enqueue-handle_sync_success_callbacks_for_async_calls)r  r  rP  r  r  r  s         r   _client_async_logging_helperr  W  s      	%-L[MnMnLop	
 	T<<'==*x >  	= 	
 	AA! 	B 	
' 	.s   AAr  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r  r  )r  r   r  rU   rV   )r  r  r  retry_policy_num_retriess       r   _get_wrapper_num_retriesr  y  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  r  r  s      r   _get_wrapper_timeoutr    s:     uc5==012FJJy$4OG Nr   c                 4    t               j                  |       S r  )r)   rd  r*  s    r   check_coroutiner    s     "44U;;r   rL  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)re   
ValueErrorr.  r   r  r  r'   async_pre_call_deployment_hook)r  rL  typed_call_typemodified_kwargsr   r  s         r   r  r    s     #I. kkmO%%h-#BB F !"( &   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)z`
    Allow modifying / reviewing the response just after it's received from the deployment.
    N)	re   r  r   r  r  r'   'async_post_call_success_deployment_hookr   rs   )r  r  rL  r  r   r  s         r   r  r    s     #I. %%h-#KKd#3X> F ! & O  
s>   A9A& #A9$A9A7A9A9&A41A93A44A9rX  c                 X   	 | y |j                   }|t        j                  j                  k(  s|t        j                  j                  k(  rt        |       }|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 # t0        $ r Y w xY w# t2        $ r}	|	d }	~	ww xY w)NTr   rE  response_formatjson_schemar  schema)r  r  r  json_objectresponse_schemaenforce_validation)__name__re   rk  r*  rl  r  r  rw   r\  choicesr?  rC  post_call_rulesr   enable_json_schema_validationro  r  r   _completionsis_basemodel_typer   r^  json_validation_rulevalidate_schema	TypeErrorr   )
original_responserB  rX  r2  r  rL  is_coroutinemodel_responsejson_response_formatr  s
             r   post_call_processingr    s   `$)22IY11777	 5 5 ; ;;./@A4' ##4mD 1 9 9:Q>8I8Q8Q9!''' ' *5%55NRW5X&DDL'!)(7(C,=,P,;<M,N/3-4 PT(<,60?@Q0R04-. 1@@Q0R0V0V0=1. 4818
 DS0AD.,@ .6-B-B-T-T,;<M,N.* 1NDS8IE612 -A ,@+K,3,F,F,[,[,k,k7K4A822:8< :H	 -l -. !0 ;$5$H$.?P/QSW$X$*o>O.P$P$34E$Fv$N#0%1$5#23D#E%F$.$34E$F(9%& %)	%" %9#23D#E%F$34E$F$8%" $(%( !( : : O O _ _+:;L+M(9,& .<	 !` !"%(%F%"%F%1 %Q %Y %I !<] 6 ? E <p (1 !)$(!)@  sJ   H AH A5H B H
 2B
H 
	HH HH 	H)"H$$H)c                      t               t                fd       }t                fd       }t               j                         }|r|S |S )Nc                     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 tY        ||
xs d |*       |j[                  || |+       t=        j\                  d,       t_        j`                         }tc        jd                  |jf                  |	jh                  |||       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        jj                  xs d }|j	                  d.d       r)tm        ||j	                  d.      /      }to               |d.<   d t        _5        |j	                  d0i       }d1|j	                  di       v }|ro|smt-        |tp        jr                        s4t-        |tp        jt                        st-        |tp        jv                        rw||d-<   t        jx                  | i |cY d }~S t-        |t        jz                  j|                        r4|r2|
|v r.|s,t        |       dkD  r	||
   | d<   n||
   |d<    | i |cY d }~S t        j                         }t        j                  j                         }|	r|	j                  ||||       |d }~ww xY w)2Nr  previous_modelszMax retries per request hit!rK  complete_responseTr;  r;  litellm_logging_objrM  r   rB  r2  request_kwargsrP  zos.environ/current_cost
max_budgetzSYNC kwargs[caching]: cachingF; litellm.cache: z#; kwargs.get('cache')['no-cache']: cachezno-cachert  ry  rl  aimg_generationr}  r|  
_arealtimezINSIDE CHECKING SYNC CACHErD  rB  r2  r  rP  rL  r  r  z
Cache hit!
max_tokenshf_model_namehuggingface/r   rB  
base_modelr;  user_max_tokens
buffer_numbuffer_perc&Error while checking max token limit: r  r  rB  r  rP  r  r  r  rB  rX  r2  r  )r  r  r  z0Wrapper: Completed Call, calling success_handlerr  r  r  context_window_fallback_dictmodel_group)Br  _is_async_requestr   num_retries_per_requestr  r\  r   r  rc  r   stream_chunk_builderprint_args_passed_to_litellmdatetimenowr]  r   uuid4r  r+  r   _llm_caching_handlerr&  r  
startswithrW   r  _current_costr   r   r  r   r   _sync_get_cachecached_resultmodify_paramsre   rl  r*  rk  rm  rI   r   asyncior   r  sync_set_cacher   contextvarscopy_contextr   submitrunsuccess_handlerr  rU   rV   openair   r   r   completion_with_retries
exceptionsr   	traceback
format_excfailure_handler)r  r  rL  r  r  chunksidxchunkrP  r  rB  r  kvcaching_handler_responser  r;  r  modified_max_tokensr  r  ctxr  r  _is_litellm_router_calltraceback_exceptionr2  r  s                             r   wrapperzclient.<locals>.wrapper>  sd	    &..	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t	"&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 &"3# !// 0   RS **,COO++ %'%! Ma ! U!$J3q6("STTUb  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<[ B
\ \ -\ :\ \ \ !\ .\ B\ 	\[<6\ <\\ 
c$D)c7c$=Acc$A
c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 |\  }}t        ||       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        j0                  du r|t2        j4                  j6                  k(  s:|t2        j8                  j6                  k(  s|t2        j:                  j6                  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                         }tA        ||      rkd|v rT|d   du rMg }tC        |      D ]  \  }}|jE                  |        t        jF                  ||j                  dd             S tI        ||||||       |S |t2        jJ                  j6                  k(  r|S tM        |||       |t2        D cg c]  }|j6                   c}v rtO        ||t3        |             d {   }|jQ                  |||        d {    tS        jT                  tW        |||||             |jY                  |||        t[        |t\              r$|
"|
j,                  	 |j_                  |
|||!      S tI        ||||||       |S 7 7 # t>        $ r"}t%        dt        |              Y d }~d }~ww xY w7 c c}w 7 7 # t>        $ r}ta        jb                         }t        j                  j                         }|r[	 |je                  ||||       n# t>        $ r}|d }~ww xY w	 |jg                  ||||       d {  7   n# t>        $ r}|d }~ww xY wj
                  }ti        ||"      \  }}|t2        j4                  j6                  k(  r|j                  d#i       }d$|j                  d%i       v }|r|s	 d t        _5        ||d&<   |d'<   t[        |tl        jn                        rd(|d)<   nt[        |tl        jp                        rd*|d)<   t        jr                  | i | d {  7  cY d }~S # t>        $ r Y ncw xY wt[        |t        jt                  jv                        r;|r9||v r5t        |       dkD  r	||   | d<   n||   |d<    | i | d {  7  cY d }~S ty        |d&|       t{        ||"      }ty        |d+|       |d }~ww xY ww),Nr  r  rM  r   rB  	fallbacksr  zASYNC kwargs[caching]: r  Fr  z; kwargs.get('cache'): r  rD  r  Tr  r  r  r   r;  r  r  rK  r  r  r  r  )r  r  rL  )r  r2  r  r  )r  r  rP  r  r  r  )_caching_handler_responseembedding_responserP  r  )r  r  r  r  r  r  r2  exponential_backoff_retryretry_strategyconstant_retryr  )>r  r  r  r  r   r  r]  r   r  r\  r  r  r+  r  r   r  r  r   r   r  _async_get_cacher  final_embedding_cached_response embedding_all_elements_cache_hitr  re   rl  r*  rk  rm  rI   r   r  rc  r   r  r   	arealtimer  r  async_set_cacher  create_taskr  r  r  rn   2_combine_cached_embedding_response_with_api_resultr  r  r  async_failure_handlerr  r  r   r   r   acompletion_with_retriesr  r   setattrr  )r  r  rP  r  r  r  rL  rB  r  r  r  r  r;  r  r  r  r  r  r  r  ctr  r  r  r  r  r2  r  s                             r   wrapper_asynczclient.<locals>.wrapper_asyncg  s    $%6fE&&**,
6<jj!47
 3D/!!3
 &..	F*(+DJJL(9F$%*-d)a-tAwVZZQU=V'-zz+'>d'J$n	"&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 +)'! <   & )4-;;G1QQ 5BBB.OOSWW4TTT 

<.:%)) !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 "( &"3# 	:	"RXX	::F!'#'	2   '66"3	 7    , +!)%1M EE%! F  6#45-9-MM ,^^.G'-)%	 _   %'%! MQ V*j ! U!$J3q6("STTU >J ;\  ?	"+"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\:/S3 )R3*CS3 R6*S3 /\0S3 	\
A=S3 A<R9 S3 S'BS3 \S3 )\*S3 \	S3 "S*5S3 S/S3 0S11A.S3 \ S3 2\3S3 6S3 9	S$SS3 S$$S3 *S3 1S3 3
\=4[?2U[?	UUU[?U92U53U98[?9	V	VV		A'[?1A,Y(Y Y("\#\(	Y41[?3Y44A[?[[?\\)[??\\)rG   r   r)   rd  )r2  r  r#  r  r  s   `   @r   clientr$  ;  sh    I
f fP	 B BH )*<<=NOL 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.
    Frl  Trt  r  rx  ry  r}  r|  r  acreate_batchacreate_fine_tuning_jobr  )r  r%  s     r   r  r  u  s     ~

=%(D0::lE*d2::'/47::mU+t3::(%0D8::&.$6::i'4/::lE*d2::ou-5::/74?d"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)
    rO  TF)r  r]  re   r  generate_content_streamagenerate_content_streamrK  s     r   r  r    sn     6fX.$6 )S!	!),I
 	Y666	:::  		s   A 	AArB  custom_tokenizerc                 P    |t        |d   |d   |d         }|S t        |       S )N
identifierrevision
auth_token)r.  r/  r0  rB  )create_pretrained_tokenizer_select_tokenizer_helper)rB  r,  
_tokenizers      r   _select_tokenizerr5    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   )rB  r  r  s      r   r3  r3    s    ,,4'..@.u5M  $E**	  @:1#>?? $E**	@s   : 	A/A**A/c                     dt         dS )Nopenai_tokenizerr  	tokenizerr0   r1  s    r   r9  r9    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)rB  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   rD  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.
    r1  r>   )disallowed_special)r5  r  r   encode)rB  textr,  tokenizer_jsonencs        r   rM  rM    s`     &G):)GN.-x8[)00"0M J [)006Jr   tokensc                 N    |xs t        |       }|d   j                  |      }|S )Nr1  r>  )r5  decode)rB  rQ  r,  rO  decs        r   rS  rS     s,    %G):)GN

%
,
,V
4CJr   r.  r0  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/  r0  z%Error creating pretrained tokenizer: z-. Defaulting to version without 'auth_token'.)r/  Nr@  r=  )r   rC  r   r   r   )r.  r/  r0  r>  r  s        r   r2  r2    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   rE  )rV  r>  s     r   create_tokenizerrX  !  s     ""4(I+)DDr   rN  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)	rB  r,  rN  r;  rY  rZ  r[  r\  r]  s	            r   r   r   0  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bedrockTFrK  )ra  supported_providerss     r   supports_httpx_timeoutrf  W  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rB  ra  r)  _supports_factoryrB  ra  s     r   rh  rh  c  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_searchri  rj  rl  s     r   rn  rn  x  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_contextri  rj  rl  s     r   rp  rp    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.
    rl  supports_native_streamingTNzYModel not found or error in checking supports_native_streaming support. You passed model=, custom_llm_provider=	. Error: F)r   r8   _get_model_info_helperr  r   r   r   r]  )rB  ra  _
model_inforr  r  s         r   rr  rr    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.
    rl  zOModel not found or error in checking response schema support. You passed model=rs  rt  NFTsupports_response_schemari  )r8   r   r   r   r]  r   rq   	PREDIBASEFIREWORKS_AI	LM_STUDIONEBIUSrk  )rB  ra  rv  r  *PROVIDERS_GLOBALLY_SUPPORT_RESPONSE_SCHEMAs        r   ry  ry    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_callingri  rj  rl  s     r   r  r    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_callingri  rj  rl  s     r   r  r    s      /' r   c                     t        | |d      S )zU
    Check if the given model supports `tool_choice` and return a boolean value.
    supports_tool_choiceri  rj  rl  s     r   r  r         )<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.
    rl  NFT)get_provider_infor  )rB  ra  r)  provider_infos       r   _supports_provider_info_factoryr    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)	r  rl  FTNz%Model not found or error in checking z support. You passed model=rs  rt  )	r   r8   ru  r  r  r   r   r   r]  )rB  ra  r)  rv  rw  supported_by_providerr  s          r   rk  rk  +  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_inputri  rj  rl  s     r   r  r  Z  s    )<BX r   c                     t        | |d      S )zCCheck if a given model supports pdf input in a chat completion callsupports_pdf_inputri  rj  rl  s     r   r  r  a  s    )<BV r   c                     t        | |d      S )zFCheck if a given model supports audio output in a chat completion callr  ri  rj  rl  s     r   supports_audio_outputr  h  r  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_cachingri  rj  rl  s     r   r  r  q  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_useri  rj  rl  s     r   r  r    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_visionri  rj  rl  s     r   r  r    s     / r   c                     t        | |d      S )zQ
    Check if the given model supports reasoning and return a boolean value.
    supports_reasoningri  rj  rl  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.
    rl  supported_regionsNzQModel not found or error in checking supported_regions support. You passed model=rs  rt  )
r   r8   ru  r  r  ra  r   r   r   r]  )rB  ra  rv  rw  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_inputri  rj  rl  s     r   r  r    s     /, r   existing_dictnew_dictc                     |j                         D ]z  \  }}|	t        |t              rt        |      | |<   (t        |t              r>| j                  |      }t        |t              r|j                  |       || |<   p|| |<   v|| |<   | | S r  )r&  r  r]  _convert_stringified_numbersro  r  update)r  r  r	  r
  existing_nested_dicts        r   _update_dictionaryr    s     1=!S!#?#Ba At$'4'8'8';$2D9(//2';M!$'(M!$#$a  ! 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  r]  rG  r  r  r  r  r  s    r   r  r   	  s]    %		ekkm#se|U|# 5z! L I& 	L	s    A  
A   AA
model_costc                 v
   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(  r5|t        j>                  vslt        j>                  j#                  |       |j                  d      dk(  s|t        j@                  vst        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"
        },
    }
    urlr1  r)  zadded/updated model=z in litellm.model_cost: litellm_providerr   text-completion-openaicohere	anthropic
openrouter/r   vercel_ai_gatewayzvertex_ai-text-modelszvertex_ai-code-text-modelszvertex_ai-chat-modelszvertex_ai-code-chat-modelsai21	nlp_cloudaleph_alphard  novita)!r  ro  r]  r   get_model_cost_mapr&  r   get_model_infor   r  r  
setdefaultr  r   r   r  open_ai_chat_completion_modelsaddopen_ai_text_completion_modelsrB  rD  splitopenrouter_modelsvercel_ai_gateway_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::3?YY)*.FF'@@@66::3?YY)*h6'///%%))#.YY)*k9'222((,,S1YY)*l:99S!,L'333))--l1o>YY)*.AA':::0044S9YY)*.EE'444**..s3YY)*.JJ'999//33C8YY)*.EE'444**..s3YY)*.JJ'999//33C8YY)*f4'---##'',YY)*k9'222((,,S1YY)*m;'444**..s3YY)*i7'000&&**3/YY)*h6'///%%))#.y 0z q  	!N N	!s   T''T87T8c                 2    |t        |t              r| |v ryyNTF)r  ra  r	  additional_drop_paramss     r   _should_drop_paramr  g	  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  r	  s^     ##%1^A&&"Q?UV %&q! & r   languager=  r  temperaturetimestamp_granularities)wordsegmentdrop_paramsc           
      B   ddl m}	 t               }
|
j                  d       |
j                  d      |
j                  d      |
j                  d      }|j	                         D ]
  \  }}||
|<    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_PARAMSr  ra  r  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?  r\  keysra  r   r  r[  r   )supported_paramsr  r	  ra  r  r  s      r   _check_valid_argz;get_optional_params_transcription.<locals>._check_valid_arg	  s    !&&()A-*//12D4'7+>+>$+F//&**1d3..0$'"STgSh  if  !g   &% .r   rB  r   r   rc  groqr  Fr  rX  rB  r  r1  r  rX  r  ra  openai_paramsr  )litellm.constantsr  localsr[  r&  ProviderConfigManager'get_provider_audio_transcription_configrq   r   GroqSTTConfigget_supported_openai_params_sttmap_openai_params_sttr9   map_openai_params/add_provider_specific_params_to_optional_paramsr  )rB  ra  r  r=  r  r  r  r  r  r  r  special_paramsr	  r
  r  rX  r  provider_configr  r  s    `     `           @r   !get_optional_params_transcriptionr  	  s    > HM34'++,AB##M2K"&&x0N$$&1a ' #'N "''))DAq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 ws   Fsizec                 <    | ydddddd}|j                  | d      S )z3Map OpenAI size parameter to Vertex AI aspectRatio.z1:1z16:9z9:16)256x256512x512	1024x1024	1792x1024	1024x1792r  )r  size_to_aspect_ratios     r   *_map_openai_size_to_vertex_ai_aspect_ratior  	  s=    |
   ##e r   nqualitystylerW  r  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}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       }n3dk(  r.ddg}	  ||       |t        |      |d<   |t        |      |d<   t!        |j#                               }|	!|	j                   xs d      }t!        |      }t%        ||xs d||      }|j                         D ci c].  \  }}|'t'        |t(        t         f      rt+        |      dkD  r||0 }}}|S c c}}w )NrB  ra  r  r  r  r  aws_rd  	sagemakerr  vertex_	vertex_aivertex_ai_beta)r  r  r  r  r	  rW  )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	  ra  r  rB  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   rD  r1  r  Fr  r   rc  r  rX  r  r  sampleCountaspectRatior  r   )r  r[  r&  r  r  r9   r  r   openai_compatible_providersAmazonStability3Config_is_stability_3_modelAmazonNovaCanvasConfig_is_nova_modelAmazonStabilityConfigr  r  ra  r  r  r  ro  r\  )rB  r  r  r  r  r	  rW  ra  r  r  r  r  r  r  r	  r
  r  rX  r  r  config_classr  r  s   `      `  `           @r   get_optional_params_image_genr  	  sS    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* -W.OM*  $N$7$7$9:M"*FF+2 G 
 -.E'#/52#5O $))++DAq=*Qt"=Q! 	
1+  
 s   3K
encoding_format
dimensionsc           
      T    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      }nB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*                         }nyd  v rt        j,                         }n`d! v rt        j.                         }nGd" v rt        j0                         }n.d# v sd$ v rt        j2                         }ng } |
|
       i |}|S |j                         } |
|
       |j                  i       }n؉d%k(  r>t         d%d      } |
|
       t        j4                         j                  i       }nd&k(  rDt         d&d      } |
|
       t        j6                         j                  i  nd      }nLd'k(  rt         d'd      } |
|
       t        j8                  j;                         r-t        j8                         j                  i  nd      }nt        j<                         j                  i  nd      }nd(k(  rDt         d(d      } |
|
       t        j>                         j                  i  nd      }nnd)k(  r?t         d)d      } |
|
       t        j@                         j                  i  *      }n*d+k(  rCt         d+d      } |
|
       t        jB                         j                  i  nd      }nd,k(  rCt         d,d      } |
|
       t        jD                         j                  i  nd      }ndk7  rd-k7  rt        jF                  vr|tI        j                               d.kD  r]t        jJ                  d/u sd/u r3t        j                               }|D ]  }j                  |d         nt        dd0 d1 d2      }n}tM        ||t        tO        j                               |jQ                  dd       3      }d4|v r#tI        |d4         d.k(  r|j                  d4d        |S )5Nra  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	  ra  r  rB  r  s      r   r  z8get_optional_params_embeddings.<locals>._check_valid_arg
  s    ##((*A(((:1(="1% + ""d*'K4,?, #233QRdQeeqrwqx  yc  d  r   r  r  ra  r  rB  r  r1  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)rB  ra  request_type
databricksrD  r  
nvidia_nim)r  rX  r  r  gemini	lm_studiord  zamazon.titan-embed-text-v1zamazon.titan-embed-image-v1zamazon.titan-embed-text-v2:0zcohere.embed-multilingual-v3
twelvelabsmarengomistraljina_aivoyageinfinityfireworks_ai)r  rX  rB  	sambanovaovhcloudrc  r   TzSetting z is not supported by r  r  
extra_body))r  r[  r   ra  PreProcessNonDefaultParams(embedding_pre_process_non_default_paramsrq   _member_map_valuesr  get_provider_embedding_configr9   r  r  r   r   TritonEmbeddingConfigDatabricksEmbeddingConfignvidiaNimEmbeddingConfigVertexAITextEmbeddingConfigLmStudioEmbeddingConfigAmazonTitanG1Config&AmazonTitanMultimodalEmbeddingG1ConfigAmazonTitanV2ConfigBedrockCohereEmbeddingConfig TwelveLabsMarengoEmbeddingConfigMistralEmbeddingConfigJinaAIEmbeddingConfigVoyageContextualEmbeddingConfigis_contextualized_embeddingsVoyageEmbeddingConfigInfinityEmbeddingConfigFireworksAIEmbeddingConfigSambaNovaEmbeddingConfigOVHCloudEmbeddingConfigr  r\  r  r  r   r  )rB  rW  r  r  ra  r  r  r  r  r  r  r  rX  r  objectfinal_paramsr  r	  r  s   `   ``            @r   get_optional_params_embeddingsrP  ~
  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U"i5&8==?F!.>?%f:L!==?*:; 2212 3 
 
		)6 )%

 	*:;!88:LL12 M 
 
		)6 )%

 	*:;!779KK1'2'>E	 L 
 
	(6 (%

 	*:;22OOPUV779KK'9$&/:/FE	 L   &;;=OO#5 "+6+BK	 P O 

	*6 *%

 	*:;!99;MM1'2'>E	 N 
 
	.6 .%

 	*:;!<<>PP12U Q 
 
	+6 +%

 	*:;!::<NN1'2'>E	 O 
 

	*6 *%

 	*:;!99;MM1'2'>E	 N 
 	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  ro  r&  _remove_additional_propertiesra  r  r)  r*  items       r   rS  rS    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  ro  r&  _remove_strict_from_schemara  rT  s       r   rX  rX    sh     &$vx  !,,.JC&u- ) M 
FD	!D&t,  Mr   c                    |dk  r| S t        | t              rM| j                  dd       | j                  dd       | j                         D ]  \  }}t	        ||dz
          | S t        | t
              r| D ]  }t	        ||dz
          | S )a  
    Remove JSON schema reference fields like '$id' and '$schema' that can cause issues with some providers.

    These fields are used for schema validation but can cause problems when the schema references
    are not accessible to the provider's validation system.

    Args:
        schema: The schema object to clean (dict, list, or other)
        max_depth: Maximum recursion depth to prevent infinite loops (default: 10)

    Relevant Issues: Mistral API grammar validation fails when schema contains $id and $schema references
    r   z$idNz$schemar   )r  ro  r[  r&  _remove_json_schema_refsra  )r  	max_depthr)  r*  rU  s        r   rZ  rZ    s     A~&$

5$

9d# !,,.JC$UIM: ) M 
FD	!D$T9q=9  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   r[  )r  r\  remove_keysparamr)  s        r   _remove_unsupported_paramsr`    s`     K&	#((*//u% + sD) r   c                 h    | j                         D ci c]  \  }}|t        vs|| c}}S c c}}w )a   
    Filter out LiteLLM internal parameters from kwargs dict.

    Returns a new dict containing only non-LiteLLM parameters that should be
    passed to external provider APIs.

    Args:
        kwargs: Dictionary that may contain LiteLLM internal parameters

    Returns:
        Dictionary with LiteLLM internal parameters filtered out

    Example:
        >>> kwargs = {"query": "test", "shared_session": session_obj, "metadata": {}}
        >>> filtered = filter_out_litellm_params(kwargs)
        >>> # filtered = {"query": "test"}
    )r&  r   )r  r)  r*  s      r   filter_out_litellm_paramsrb    s;    ( &,\\^%3zsEsBT7TU
^  s   ..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)r6  r  r  ra  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  rd  r  r  r  r  r  rB  ra  api_versionr  allowed_openai_paramsr  r  F)r&  r  r  )	r  r  ra  r  rd  re  r	  r
  r  s	            r   #base_pre_process_non_default_paramsz>PreProcessNonDefaultParams.base_pre_process_non_default_params  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rB  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  ra  r  rd  re  )r6  ri  r$   )	r  r  ra  r  rB  rj  rk  r	  r  s	            r   r7  zCPreProcessNonDefaultParams.embedding_pre_process_non_default_paramsL  sT     'JJ+-$7'=7N%O7N!ag7N%O5<I K  	 "! &Ps   
2N)FF)r  
__module____qualname__staticmethodro  r]  r   r   ri  boolr7  rK  r   r   r6  r6    s    -"-"-" !-" !)c 3	-"
 #-" .2#Y-" 
-" -"^  ',-2""" !" !)c 3	"
 "  $" '+" 
" "r   r6  r  rj  rk  c           	         t         j                  | |||t        dg      }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 )zA
    Pre-process non-default params to a standardized format
    r;  rm  r  Nr  rZ  function
parametersrR  Fr  )r6  ri  r   $get_json_schema_from_pydantic_objectr   r  ra  r  r.  deepcopyr[  r  r  remove_sensitive_keys_from_dict)r  r  ra  r  rB  rj  rk  r  r  rZ  tooltool_functionrt  new_parameterss                 r   pre_process_non_default_paramsr{  d  se    4WW#%/5A-7L X  ..&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r   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  rG  )r	  phraser)  s     r   r  z2remove_sensitive_keys_from_dict.<locals>.<genexpr>  s     I3Hv$3Hs   )r  r  r   r[  )r|  sensitive_key_phrasesr^  r)  s      @r   rw  rw    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 r6|dk(  r0|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|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	providersrc  r  rd  r  r  watsonx	functionsfunction_callrZ  ollamar  anyscaletogether_air  r)  cerebrasxai	ai21_chat
volcenginedeepseek	codestralr.  r  cohere_chatr  ollama_chatr  r  nebiuswandbrV  formatTfunctions_unsupported_modelr[  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_promptr[  r   )r  r  ra  rX  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/#w.#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   rh  thinkingweb_search_optionssafety_identifierc&           
      0!   01 t               j                         11j                  d      }'t        1|'|!       0t	        10      }(d })@t
        D *cg c]  }*|*j                   c}*v r t        j                   t                    })dt        t           f 01fd}+t               },|,t         d      },|,xs g },|xs g }|,j                  |        |+|,xs g 	       d
k(  r=t        j                         j                   0|(t!        t"              rnd      }(ndk(  rxt        j$                         j                   0|(t!        t"              rnd      }(t        j$                         j                   0|(t!        t"              rnd      }(ndk(  sdk(  r=t        j&                         j                  0|( t!        t"              rnd      }(nTdk(  r-t        j(                         j                  0|( nd      }(n"dk(  r=t        j*                         j                  0|( t!        t"              rnd      }(ndk(  r=t        j,                         j                  0|( t!        t"              rnd      }(ndk(  r=t        j.                         j                  0|( t!        t"              rnd      }(n\dk(  r=t        j0                         j                  0|( t!        t"              rnd      }(ndk(  r=t        j2                         j                  0|( t!        t"              rnd      }(n؉dk(  r t        j4                  v sZ t        j6                  v sH t        j8                  v s6 t        j:                  v s$ t        j<                  v s t        j>                  v r=t        j@                         j                  0|( t!        t"              rnd      }(n*dk(  r=t        jB                         j                  0|( t!        t"              rnd      }(ndk(  s	dk(  rAd v r=t        j@                         j                  0|( t!        t"              rnd      }(nt        jD                  jG                         r=t        jD                         j                   0|(t!        t"              rnd      }(n?dk(  rI t        jH                  v r~d v r=t        jJ                         j                   0|(t!        t"              rnd      }(
nt        jL                         j                   0|(t!        t"              rnd      }(
n t        jN                  v r=t        jP                         j                  0|( t!        t"              rnd      }(
nZ|)+|)j                  0|( t!        t"              rnd      }(
n-t        jR                         j                  0|( t!        t"              rnd      }(	ndk(  r=t        jT                         j                  0|( t!        t"              rnd      }(	ndk(  r3tW        jX                         }-tW        jZ                         }.|-dk(  s|-dk(  r=t        j\                         j                   0|(t!        t"              rnd      }(	n7d
|.v r|-dk(  r|.j_                  d       r=t        j`                         j                  0|( t!        t"              rnd      }(nt        jb                         j                  0|( t!        t"              rnd      }(n|)|)j                  0|( t!        t"              rnd      }(nud!k(  r=t        jd                         j                   0|(t!        t"              rnd      }(n3d"k(  r=t        jf                         j                  0|( t!        t"              rnd      }(nd#k(  r=t        jh                         j                   0|(t!        t"              rnd      }(nd$k(  r=t        jj                         j                  0|( t!        t"              rnd      }(nmd%k(  r=t        jl                         j                  0|( t!        t"              rnd      }(n+d&k(  r=t        jn                         j                  0|( t!        t"              rnd      }(nd'k(  r-|)+|)j                  0|( t!        t"              rnd      }(nd(k(  sdk(  r=t        jL                         j                  0|( t!        t"              rnd      }(npd)k(  r=t        jJ                         j                  0|( t!        t"              rnd      }(n.d*k(  r=t        jp                         j                  0|( t!        t"              rnd      }(nd+k(  r=t        jr                         j                   0|(t!        t"              rnd      }(nd,k(  r=t        jt                         j                  0|( t!        t"              rnd      }(nhd-k(  r(t        jv                         j                   0|(.      }(n;d/k(  sd0k(  r=t        jx                         j                  0|( t!        t"              rnd      }(nd1k(  r=t        jz                         j                  0|( t!        t"              rnd      }(nd2k(  r=t        j|                         j                  0|( t!        t"              rnd      }(npd3k(  r=t        j~                         j                  0|( t!        t"              rnd      }(n.d4k(  r=t        j                         j                  0|( t!        t"              rnd      }(nd5k(  r=t        j                         j                  0|( t!        t"              rnd      }(nd6k(  r=t        j                         j                  0|( t!        t"              rnd      }(nhd7k(  r=t        j                         j                  0|( t!        t"              rnd      }(n&d8k(  rt        j                         j                  0|( t!        t"              rnd      }(1j                         D ]3  }/t        j                         j                  |/      s't        d9|/        nd:k(  r=t        j                         j                  0|( t!        t"              rnd      }(n\dk(  r=t        j                         j                  0|( t!        t"              rnd      }(nd;k(  r=t        j                         j                  0|( t!        t"              rnd      }(n؉d<k(  rkt        j                         j                   =      r=t        j                         j                  0|( t!        t"              rnd      }(nqt        j                  j                   =      r=t        j                         j                  0|( 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                  0|( |t!        t"              rnd@      }(ng|)*|)j                  0|( t!        t"              rnd      }(n;t        j                         j                  0|( t!        t"              rnd      }(t        |(1t        t        j                               |!A      }(t        dB|(        t        |(0|C      }(|(S c c}*w )DNr  r$  )r  r  ra  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() rW  rV  rO  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  r[  r   ra  )	r  r#  r	  ra  r  rB  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   rl  r   r  r  F)rB  r  rX  r  anthropic_textr  r  r  r%  maritalkrA  	predibasehuggingfacer  r  r*  r  r  r  rd  converseconverse_likeinvokezanthropic.claude-3
cloudflarer  r  r  petals	deepinfra
perplexityr.  text-completion-codestralr(  r)  r  r  )rB  r  rX  r  r  r2  r  hosted_vllmvllmr  r  r  r  zLiteLLM now defaults to Watsonx's `/text/chat` endpoint. Please use the `watsonx_text` provider instead, to call the `/text/generation` endpoint. Param: watsonx_textr  rc  r1  zoAzure optional params - api_version: api_version={}, litellm.api_version={}, os.environ['AZURE_API_VERSION']={}AZURE_API_VERSION)r  rX  rB  rg  r  r  z Final returned optional params: )rX  r  rh  )[r  r.  r[  r{  r  rq   r*  r  get_provider_chat_configr   r]  r9   r/  r   AnthropicConfigr  r  rq  AnthropicTextConfig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SagemakerConfigrP   get_bedrock_routeget_base_modelAmazonConverseConfigr  AmazonAnthropicClaudeConfigAmazonAnthropicConfigCloudflareChatConfigOllamaConfigOllamaChatConfigNLPCloudConfigPetalsConfigDeepInfraConfigDatabricksConfigNvidiaNimConfigCerebrasConfigXAIChatConfigAI21ChatConfigFireworksAIConfigVolcEngineConfigHostedVLLMChatConfig
VLLMConfigGroqChatConfigOpenAIConfigOpenrouterConfigIBMWatsonXChatConfigr  r  is_watsonx_text_paramr  NebiusConfigAzureOpenAIO1Configis_o_series_modelAzureOpenAIGPT5Configis_model_gpt_5_modelr   r   r  rg  rW   AZURE_DEFAULT_API_VERSIONr  OpenAILikeChatConfigr  ra  r   r   _apply_openai_param_overrides)2rB  r  r  r  top_pr  rO  rV  stopr  max_completion_tokens
modalities
predictionaudiopresence_penaltyfrequency_penalty
logit_biasrW  ra  r  seedrZ  r[  r  logprobstop_logprobsextra_headersrg  parallel_tool_callsr  rh  reasoning_effort	verbosityr  r;  r  r  r  r  r  rX  r  r   r  r  bedrock_routebedrock_base_modelr_  r  r  s2   `    `            `          `                  @@r   get_optional_paramsr    s   V HMMOM"&&x0N7#%/5 2#-/O
 -1O&+>'3C'38|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 	
 
	-1D1P!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 (-??#5 / #.:k43P   @ 	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779KK+=(7#  +6:kSW;X (!& L 	   #*"?"?"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 **??e?L%;;=OO#5 / #.:k43P   P 	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
 WCs   AB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   rc  r  r5  r  F)r5  )r   r  r  r[  r  r  r&  r:   )
rX  r  ra  r  r  r5  r	  initial_extra_bodyr
  processed_extra_bodys
             r   r  r  #  sV    	8

-
-.	. 7M 
 '**<<J"'')M)mA.>.J$1!$4JqM * &&|R8"!,/""
 &1 !3 8 8 :( :1 66 qD : % ( (:$,F/-OL)  ##%A%-*:*F%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)r[  )rX  r  rh  r_  s       r   r  r  W  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 )NrB  ra  )r&  r   )r  r	  r
  r  s       r   get_non_default_paramsr  f  si     "'')	)DAq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  v  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)orderrY  NrK  )r	  
deployments     r   r  z2_get_order_filtered_deployments.<locals>.<genexpr>  s1      	
1
*%566 '(11s   )defaultrY  r  )minr  )r  	min_orderr  filtered_deploymentss       r   _get_order_filtered_deploymentsr    st    	
1	

 I  2 
1
*+//8IE 1 	  
 $# 
s    ArY  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_LOCATIONrd  r  )vertex_locationr   rW   r  r]  aws_region_namewatsonx_region_nameregion_name)ra  rY  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)
    )rB  rY  )ra  rY  Nz'Cannot infer model region for model: {}rc  r  rd  r  euus)r   r8   rB  r$  r   r   r  r  get_eu_regionsget_us_regionsr  r  r  rG  )rY  rB  ra  rv  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rY  Fr"  r.  rY  r*  s     r   _is_region_eur4     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'  Tr1  Fr2  r3  s     r   _is_region_usr7    r5  r   allowed_model_regionc                 $    | j                   |k(  ryy)r0  TF)r"  )rY  r8  s     r   is_region_allowedr:    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
    rc  zazure/rD  
   chat)rB  api_keyrU  rg  r  r;  zx-ms-regionN)rB  r  r?  r]  rU  replacer   AzureChatCompletionget_headersrg  r  r  )rY  r;  _modelr  r-  s        r   get_model_regionrD  '  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   rD  )r  r]  r   )r  	_messagess     r   get_first_chars_messagesrH  A  s=    JJz*		N4C(	 s    # 	//c                 H    dj                  d | D              }t        |      S )NrD  c              3   B   K   | ]  }|j                         r|  y wr  )isspace)r	  chars     r   r  z$_count_characters.<locals>.<genexpr>L  s     HTTDTs   )r   r\  )rN  filtered_texts     r   _count_charactersrN  J  s!    GGHTHHM}r   response_objc                    t        | d      rt        | d      rt        | dd       }|ryt        |d      rm|j                  }d}|D ]X  }t        |d      r.|j                  D ]  }t        |d      s||j                  z  }  =t        |d      sJ||j                  z  }Z |S t        | d      rBt        | d      r6t        | dd      }d|v sd	|v r!t        | dd      }t        |t              r|S dS | j                  }d}|D ]  }	t        |	t              r1|	j                  j                  *||	j                  j                  z  }Dt        |	t              sU|	j                  j                  l||	j                  j                  z  } |S )
Nr  r  outputrD  rC  rN  deltaz
text.deltazoutput_text.delta)hasattrgetattrrQ  rC  rN  r  r]  r  rh   r?  r~   rR  )
rO  responses_api_responseoutput_listresponse_stroutput_itemcontent_part
event_typerR  _choiceschoices
             r   get_response_stringr]  P  s   |V$z)J ")z4!H!g.Dh&O077KL*;	2(3(;(;"<8(L,=,==L )< [&1 K$4$44L  +   |V$w)G\626
:%)<
)JL'26E&uc25:: 	  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 | 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  r  COHERE_API_KEYr  HUGGINGFACE_API_KEYr  NLP_CLOUD_API_KEYrA  REPLICATE_API_KEYr  TOGETHERAI_API_KEYTOGETHER_AI_TOKENr  NEBIUS_API_KEYr  WANDB_API_KEY)r   r?  
openai_keyrW   anthropic_keyai21_keyaleph_alpha_keybaseten_key
cohere_keyhuggingface_keynlp_cloud_keyreplicate_keytogetherai_api_key
nebius_key	wandb_key)r^  r_  r?  s      r   get_api_keyr{  |  sW   0Gx<3K#KOW//O:>N3OV NS 
	$8H(HUW22UjAT6UP NM 
	LW--LO1LJ NG 
	&Sw..S*=R2S 	D N= 
	"QW00QJ?P4Q: N7 
	!\]%BOW//O:>N3O4 N1 
	&Sw..S*=R2S 	. N' 
	$UW22UjAT6U$ N! 
	$UW22UjAT6U N 
	& /))/.// -.	 	 N 
	!OW//O:>N3O N 
	 MW..M*_2MNr   c                      dd l } ddl m } t        | d      r |j                  | j                        S  |j                         S )Nr   r  UTC)r  rS  r  r~  utcnow)dtr  s     r   get_utc_datetimer    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_statusrV  r   
model_name
config_urlr  config_jsonr  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  r1  r  r  NzModel zr isn't mapped yet. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json)r   r  r8   r   )rB  r  ra  rv  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+$rD  resubr  s    r   _strip_stable_vertex_versionr    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   rO   )!litellm.llms.bedrock.common_utilsrP   r  )r  rP   s     r   _get_base_bedrock_modelr    s     C***:66r   r  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}$rD  r  r  s    r   !_strip_openai_finetune_model_namer    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)rd  bedrock_converser  r  r*  r(  zft:)r  r  r  )rB  ra  stripped_bedrock_modelstrip_versionstrip_finetunes        r   _strip_model_namer    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_costr  (  s    c""r   rw  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  Tr2  rd  litellm_proxyF)r  rw  ra  s     r   _check_provider_matchr  ,  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_namera  N)r  rn  ro  r]  __annotations__rK  r   r   r  r  M  s     "%%r   r  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)Nr1  rl  r  r   z{}/{})r  r  r  r  ra  )	r8   r   r  r  r  r  r  r   r]  )rB  ra  r  rv  r  r  r  s          r   _get_potential_model_namesr  U  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r  r  r  s        r   r  r    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
    rl  )ru  rl  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  r1  )rr   r  get_provider_model_inforq   r  )rB  ra  r  rw  s       r   r  r    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  r  )r	  potential_model_names     r   r  z9_is_potential_model_name_in_model_cost.<locals>.<genexpr>  s$      $B  	 2 22$Bs   )r  r9  )r  s    r   &_is_potential_model_name_in_model_costr    s'      $9$@$@$B  r   c           	      V   	 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        dWi 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        dWi 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)                  d0d      d1|	j)                  d1d      d2|	j)                  d2d      d3|	j)                  d3d      d4|	j)                  d4d      d5|	j)                  d5d      d6|	j)                  d6d      d7|	j)                  d7      d8|	j)                  d8      d|d9|	j)                  d9d      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      dD|	j)                  dDd      dE|	j)                  dEd      dF|	j)                  dFd      d|	j)                  d|      d|	j)                  d      d|	j)                  dd      d|	j)                  dd      dG|	j)                  dGd      d|	j)                  dd      d|	j)                  dd      d|	j)                  dd      d|	j)                  dd      dH|	j)                  dHd      dI|	j)                  dId      d |	j)                  d d      dJ|	j)                  dJd      dK|	j)                  dKd      dL|	j)                  dLd      dM|	j)                  dMd      dN|	j)                  dNd      d|	j)                  dd      dO|	j)                  dOd      dP|	j)                  dPd      dQ|	j)                  dQd      dR|	j)                  dRd      dS|	j)                  dSd      S # t,        $ rG}t        j                  dT|        dUt#        |      v r|t-        dVj+                  | |            d}~ww xY w)Xzy
    Helper for 'get_model_info'. Separated out to avoid infinite loop caused by returning 'supported_openai_param's
    Nr  r  zmeta/z@latestrl  z6checking potential_model_names in litellm.model_cost: r  r  r  r  ra  r  r  r)  r  max_input_tokensr  input_cost_per_tokenr   output_cost_per_tokenr  r;  r>  rh  ry  r  r  supports_assistant_prefillr  r  r  r  r  r  r  z|This model isn't mapped yet. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.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.input_cost_per_token_flexinput_cost_per_token_prioritycache_creation_input_token_cost1cache_creation_input_token_cost_above_200k_tokenscache_read_input_token_cost-cache_read_input_token_cost_above_200k_tokens cache_read_input_token_cost_flex$cache_read_input_token_cost_priority)cache_creation_input_token_cost_above_1hr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_token_flexoutput_cost_per_token_priority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_video_per_secondoutput_cost_per_imageoutput_vector_sizecitation_cost_per_tokentiered_pricingr  r  r  r  rr  rn  rp  r  search_context_cost_per_queryr  r
  ocr_cost_per_pageannotation_cost_per_pagez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.rK  )r   
azure_llmsazure_embedding_modelsvertex_llama3_modelsr  r  r  r   r   r  rv   r  r  r  r  r  r   r]  r  r  r  r  r   )rB  ra  r  r  r  r  r  r  r  _model_infor)  _input_cost_per_token_output_cost_per_tokenr  s                 r   ru  ru    sE
   S
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
 *+&  CC&??<>C "-1CT!JC #.//2Et"L	C
 &;C +6///+C /:oo3T/C 1<5t1C CN//GCC$ -8OO14-%C* ?JooCT?+C0 2=621C6 6A__:D67C< ;F//?;=CB *5.*CCH 8C<d8ICN 8C<d8OCT &1__5KT%RUCV '2oo6Mt&TWCX ,7??0$,YC^ .9__2._Cd /:oo3/eCj '=kCl ,7??0$,mCr 0;4d0sCx -8OO14-yC~ +6///+CD 1<5t1ECJ 9D=t9KCP =HOOA4=QCV 9D=t9WC\ (37OQU'V]C^ 2=62_Cd '2oo6Mt&TeCf $/??3G#NgCh )4-t)iCn  +/?FoCp "-&(;"qCv !__V,wCx *5.*yC~ *5.*CD !,0A4 HECF +6///+GCL &1__5KT%RMCN ,7??0$,OCT )4-t)UCZ &1__5KT%R[C\ '2oo6Mt&T]C^ $/??3G#N_C` 0;4d0aCf +6///+gCl %0OO4I4$PmCn &1__5KT%RoCp $/??3G#NqCr '2oo6Mt&TsCt /:oo3T/uCz  OOE40{C|  OOE40}C~ #.//2Et"LC@ *5.*AC CH  
9!=>CF"G n  u  u*
 	
	
s&   D] 7] X
] 	^(!A^##^(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"]
        }
    rl  zmodel_info: r\  rK  )r   r9   ru  r   r   ru   )rB  ra  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arrayrN  NoneTypenull)r]  r  r  r  rq  ra  ro  r  )r  python_to_json_schema_typess     r   json_schema_typer  9  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 )ad  Using type hints and numpy-styled docstring,
    produce a dictionary 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enumrN  r  
propertiesnamer  rt  rt  required)inspectastr  numpydoc.docscraper  r   r  getdocr   strip	signaturert  r&  rS  r  r  r  r  r  r]  ra  descro  r  r  emptyr   )input_functionr
  r  r  r  r  	docstringnumpydocsr  rt  required_params
param_info
param_namer_  
param_typeparam_description
param_enum
param_data
param_dictr	  r
  r  s                          r   function_to_dictr  S  sV   $5 ""D~.Ii(H))0CD0C1QWWY0C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*//.R/Qqwwy/.R$S!! 1& ,

 "& * 0 0 2I 21jC6HaV 2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_withr]  )original_urlnew_pathr  modified_urls       r   
modify_urlr'    s+    
))L
!C==h=/L|r   rU  	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 goingrF  rW  rolerC  )rB  r;  ra  rU  r)  r   )total_response_time
calls_madestatusr  failed)rangetimer   batch_completionr   )rB  ra  rU  r=  r(  r)  test_prompt
test_callsrv  r;  rP  r  response_timer  s                 r   load_test_modelr7    s     (KJ
DI*DUVDUq&[9:DUH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(  r  azure_ai)r   r  get_required_paramsr  AzureAIStudioConfigra  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_mountsrJ    s)    017799HC 	S[Ten49  
  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?  rg  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}ne|j                  g d       nP|dk(  r)dt        j                  v rd}n5|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       n|dk(  r)dt        j                  v rd}n}|j	                  d       nj|dk(  r)dt        j                  v rd}nO|j	                  d       n<|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!       
np|d"k(  r)d#t        j                  v rd}
nU|j	                  d#       
nB|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(  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}	nv|j	                  d-       	nc|d.k(  r)d/t        j                  v rd}	nH|j	                  d/       	n5|d0k(  r)d1t        j                  v rd}	n|j	                  d1       	n|d2k(  r)d3t        j                  v rd}n|j	                  d3       n|d4k(  rLd5t        j                  v sd6t        j                  v rd}n|j	                  d5       |j	                  d6       n|d7k(  r)d8t        j                  v rd}nm|j	                  d8       nZ|d9k(  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>       n|d?k(  r)dt        j                  v rd}n|j	                  d       nt|d@k(  r)dAt        j                  v rd}nY|j	                  dA       nF|dBk(  s|dCk(  r)dDt        j                  v rd}n&|j	                  dD       n|dEk(  r)dFt        j                  v rd}n|j	                  dF       n|dGk(  r)dHt        j                  v rd}n|j	                  dH       n|dIk(  r)dJt        j                  v rd}n|j	                  dJ       n|dKk(  r)dLt        j                  v rd}nn|j	                  dL       n[|dMk(  r)dNt        j                  v rd}n@|j	                  dN       n-|dOk(  r)dPt        j                  v rd}n|j	                  dP       n|dQk(  r_dRt        j                  v s6dSt        j                  v s$dTt        j                  v sdUt        j                  v rd}n|j	                  dR       n|dVk(  r^dWt        j                  v r(dXt        j                  v sdYt        j                  v rd}n\|j	                  dW       |j	                  dY       n8|dZk(  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)dat        j                  v rd}n|j	                  da       n|dbk(  rzdct        j                  v rd}nd|j	                  dc       nQ| 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       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       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 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}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        j0                  v r'd%t        j                  v rd}n|j	                  d%       n| t        j2                  v r'd't        j                  v rd}n|j	                  d'       n| t        j4                  v r'd[t        j                  v rd}n|j	                  d[       nq| t        j6                  v r'd]t        j                  v rd}nJ|j	                  d]       n8| t        j8                  v r&d_t        j                  v rd}n|j	                  d_       ddt:        t<           det<        dft:        t<           fdg}|	 ||dh      }|	 ||di      }|	 ||dj      }t?        |      dkk(  rd}||dS # t        $ r d}Y =w xY w)la  
    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_keysr1  r   ra  Trc  AZURE_API_BASEr  AZURE_API_KEY)rN  r  rO  r  rb  r  rg  rA  rj  r  OPENROUTER_API_KEYr  VERCEL_AI_GATEWAY_API_KEY	datarobotDATAROBOT_API_TOKENr  VERTEXAI_PROJECTr  r  rh  r  AI21_API_KEYr  rk  r  rd  re  rf  r  ri  rd  r  AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)r  r  OLLAMA_API_BASEr  ANYSCALE_API_KEYr  DEEPINFRA_API_KEYfeatherless_aiFEATHERLESS_AI_API_KEYr*  GOOGLE_API_KEYGEMINI_API_KEYr  GROQ_API_KEYr)  NVIDIA_NIM_API_KEYr  CEREBRAS_API_KEYr  XAI_API_KEYr  r  VOLCENGINE_API_KEYr  r  CODESTRAL_API_KEYr  DEEPSEEK_API_KEYr.  MISTRAL_API_KEYpalmPALM_API_KEYr  PERPLEXITYAI_API_KEYr0  VOYAGE_API_KEYr1  INFINITY_API_KEYr2  FIREWORKS_AI_API_KEYFIREWORKS_API_KEYFIREWORKSAI_API_KEYFIREWORKS_AI_TOKENr  CLOUDFLARE_API_KEYCLOUDFLARE_ACCOUNT_IDCLOUDFLARE_API_BASEr  NOVITA_API_KEYr  rm  r  rn  	dashscopeDASHSCOPE_API_KEYmoonshotMOONSHOT_API_KEYr  exclude_patternr   c                 R    | D cg c]  }||j                         vs| c}S c c}w )zDFilter out keys that contain the exclude_pattern (case insensitive).r  )r  rx  r)  s      r   filter_missing_keysz1validate_environment.<locals>.filter_missing_keys  s'    #Jtciik'ItJJJs   $$r?  rU  rg  r   ) r8   r   rA  environr   r/  r   r  r  open_ai_embedding_modelsopenai_image_generation_modelsrD  rB  replicate_modelsr  r  datarobot_modelsr  r  models_by_providerhuggingface_modelsr  together_ai_modelsr  baseten_modelsr  r  nebius_modelswandb_modelsr   r]  r\  )	rB  r?  rU  rg  rL  rM  rv  ra  rz  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 $77*bjj8&*###$?@ 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, BJJ.4D

4R&*###$45##$45 F*+&*###N3 L0#rzz1&*###$89 J.!RZZ/&*###$67 I- BJJ.&*###$56 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 G+"**,&*###O4 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666*bjj8&*###$?@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g***"**,&*###O4K$s) Kc Kd3i K *<C*<D*<G
<A"#6UUW  #"#s   u uuc                  ,    t        j                  | i |S r  )r   rl  )r  r  s     r   acreater    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)rC  NrK  )r	  r?  s     r   r  z*prompt_token_calculator.<locals>.<genexpr>  s     ?h7GI&hs   r   claudez:Anthropic import failed please run `pip install anthropic`)	AI_PROMPTHUMAN_PROMPT	Anthropic)
r   r  r   r  r  r  count_tokensr\  r1   rM  )	rB  r;  rN  
num_tokensr  r  r  r  anthropic_objs	            r   prompt_token_calculatorr    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)NrW  zHello Worldr+  rB  r;  rD  )r?  rB  r^  )	r   r  r  r   modelsretrieverk  r   r   r  s     r   valid_modelr    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.
    rW  zHey, how's it going?r+  r=  )rB  r;  r?  r  TF)r   rk  r   r   )rB  r?  r;  s      r   check_valid_keyr    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  FrK  )r  s    r   _should_retryr    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   r  parsedate_tz	mktime_tzr2  )r  r  retry_headerretry_afterretry_date_tuple
retry_dates         r   &_get_retry_after_from_exception_headerr    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        |      }t        t        j                         z  }|d|cxk  r	dk  r||z   S  || z
  }t        t	        d|      z  }t        ||      }t        |t              }||z   S )Nr   <   g       @)r  r    randomr   powmaxr  r!   )r  r  r  r  r  jitterr  sleep_secondss           r   _calculate_retry_afterr    s     99IJK fmmo%F 1{#8b#8V## $9  11K'#c;*??M {3M7M6!!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]
    )
    ```
    r1  r   r   )r>  r/  )r  r  r  )r8   r   r   r   known_tokenizer_configcustom_prompt_dict)rB  r  r  r  r  complete_modelpotential_modelsr  s           r   register_prompt_templater  ,  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)TextCompletionStreamWrapperNrV  ra  c                 <    || _         || _        || _        || _        y r  )completion_streamrB  rV  ra  )selfr  rB  rV  ra  s        r   __init__z$TextCompletionStreamWrapper.__init__o  s#     "3
,#6 r   c                     | S r  rK  r  s    r   __iter__z$TextCompletionStreamWrapper.__iter__{      r   c                     | S r  rK  r  s    r   	__aiter__z%TextCompletionStreamWrapper.__aiter__~  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)Nr4  rz  rN  createdrB  r  r   rR  rC  rN  reasoning_contentr  finish_reasoninclude_usageFTusagez=Error occurred converting to text completion object - chunk: z	; Error: )r   r  r   r  rh   r   rV  r]  )r  r  r  text_choicesrR  r  s         r   !convert_to_text_completion_objectz=TextCompletionStreamWrapper.convert_to_text_completion_object  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  rD  )rB  ra  original_exceptioncompletion_kwargsextra_kwargs)r   r  r   r  StopIterationr3   rB  ra  )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__  si     	%#55 'eF?em#O"&"H"Hu"H"U&&	'5
   	%$$	%s5   AA ><>#A A>A AANN)r  rn  ro  r   ro  r]  r  r  r  rw   r  r  r  rK  r   r   r  r  n  sL    
 *.-1
7 !	
7
 &c]
7} @*	%r   r  c              #     K   t        |t        j                        r|t        |t              r| y 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  rR  r  r   r   rx   r1  r\  rl   r  rR  r  r~   r   	r  mock_responserB  r  icompletion_obj_all_choicesj_streaming_choices	            r   mock_completion_streaming_objr    s      -!6!67-!451c-(!,Kq1q59QR9.<N""1%+L1X$+MM$B$B!----(-AE2J .  %C %! ##$56  &2N" -s   C,C.r  r   c                  K   t        |t        j                        r|t        |t              r| y 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-!451c-(!,Kq1q59QR9.<N""1%+L1X$+MM$B$B!----(-AE2J .  %C %! ##$56  &2N" -s   C.C0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   r   )rA  getcwdopenrV  loadr   )config_pathrA  config_fileconfigr  s        r   read_config_argsr    s\    
		+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  rB  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 )Nr  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  rB  z/final_messages after attempt_message_addition: Final messages: )r   r   r  attempt_message_addition)r;  r  rB  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;  rB  ztemp_message_tokens: r  r  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  rB  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  rB  s       r   r  r  U  s    x7)+U3zAr   c                     t        ||       S )Nr  r   r  s     r   r  r  [  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=  rC  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  r\  r  r   )r?  tokens_neededrB  r  rC  attemptstotal_tokensratio
new_lengthhalf_length	left_half
right_halftrimmed_contents                r   r  r  _  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  rD  r,  r  r  rC  rx  r  zCurrent tokens: z, max tokens: zNeed to trim input messages: z, current_tokensr  )r  r  rB  r   zProcessed system message: )r;  r  rB  zProcessed messages: r  z, return_response_tokens: z'Got exception while token trimming - {})r.  rv  r   r  r  r  rf  r   reverser\  r   r   r  r   r   r  r/  r  r   r  r  r]  )r;  rB  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WxG76?h;VxH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)rA  r{  r&  r  r]  hash	frozenset)r  r	  r
  env_varss       r   _get_env_hashz"AvailableModelsCache._get_env_hash  si     

((*
*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)r5  r+  )r  current_hashs     r   _check_env_changedz'AvailableModelsCache._check_env_changed  s3    ))+>>!)DNt~~--r   ra  rY  c                     d}||j                         }|| d| }t        j                  |j                               j	                         S )NrD  :)model_dump_jsonhashlibsha256rM  	hexdigest)r  ra  rY  	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)r8  
cache_dictclearr@  r   r   r   r]  	get_cacher.  rv  )r  ra  rY  	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.  rv  )r  ra  rY  rG  rE  s        r   set_cached_model_infoz*AvailableModelsCache.set_cached_model_infoA  s/     ''(;^L	y$--0@"ABr   )i,  r  r  )r  rn  ro  r  r  r]  r5  rq  r8  r   r   r@  r   rF  rJ  __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 )Nrv  rD  _API_KEY)rA  r{  r  r   r   r@  upperr   )ra  valid_providersenviron_keysr   env_provider_1env_provider_2expected_provider_key_1expected_provider_key_2s           r   #_infer_valid_provider_from_env_varsrV  P  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?  rU  Error getting valid models: )	_model_cacherF  
get_modelsr?  rU  rJ  r   r   rZ  )r  ra  rY  r  r  r  s         r   #_get_valid_models_from_provider_apir[  k  s    
$::
 $   ++.<.HN**d0>0J^,,PT , 

 	**+>PVW !=aSAB	s#   A$ AA$ $	B-BBBcheck_provider_endpointc                 T   	 |t        d      }|||_        |||_        | 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)a  
    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.
        api_key: If provided, will use the API key to get valid models.
        api_base: If provided, will use the API base to get valid models.
    Returns:
        A list of valid LLMs
    NrD  r1  r  rc  z	Azure-LLMrX  )r   r?  rU  r   r\  rV  r  r  rq   r   r/  r[  r.  rv  r  r  r   r   rZ  )r\  ra  rY  r?  rU  rP  valid_modelsr   r  models_for_providerr  s              r   get_valid_modelsr`    sX   &: !+"5N%,N"&.N# $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   C7C: :	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)Nrl  Trk  rt  rs  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s   r  z[92mRequest to litellm:[0mz[92mlitellm.(z)[0mz()[0m)r   r  r   mapre  r&  r   r   )r2  r  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-%frv  r4  )strftimer  r   )rP  rO  response_ids      r   get_logging_idrm    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 )NrY  r  r  )r  )r  r5   )model_call_detailsrY  _base_modelr  s       r   _get_base_model_from_metadatarq    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)rO  r   F)rw   r  r  rR  r?  rC  is_done)r  r  rt  _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  rK  r  s    r   r  zModelResponseIterator.__iter__*  r  r   c                 L    | j                   rt        d| _         | j                  S NT)rv  r  r  r  s    r   r  zModelResponseIterator.__next__-  s"    <<"""r   c                     | S r  rK  r  s    r   r  zModelResponseIterator.__aiter__4  r  r   c                 T   K   | j                   rt        d| _         | j                  S wrz  )rv  r  r  r  s    r   r  zModelResponseIterator.__anext__7  s&     <<$$"""s   &(NF)
r  rn  ro  rw   rq  r  r  r  r  r  rK  r   r   rs  rs    s)    }  ##r   rs  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  r  r  s      r   r  z"ModelResponseListIterator.__init__?  s    .

r   c                     | S r  rK  r  s    r   r  z"ModelResponseListIterator.__iter__E  r  r   c                    | j                   t        | j                        k\  rt        | j                  | j                      }| xj                   dz  c_         | j                  rt        j                  | j                         |S Nr   )r  r\  r  r  r  r2  sleepr  r  s     r   r  z"ModelResponseListIterator.__next__H  s]    ::T1122--djj9

a
::JJtzz"r   c                     | S r  rK  r  s    r   r  z#ModelResponseListIterator.__aiter__R  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r  )r  r\  r  r  r  r  r  r  s     r   r  z#ModelResponseListIterator.__anext__U  sl     ::T1122$$--djj9

a
::--

+++ ,s   BBBBr  )
r  rn  ro  r   r  r  r  r  r  r  rK  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__`  s    r   )r   N)r  rn  ro  r  rK  rL  s   @r   r  r  _  s     r   r  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"}}
    rC  Fr  rN  cache_control	ephemeralT)r  r]  r  )r?  rC  s     r   is_cached_messager  d  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)validater   )r  r  base64	b64decode	b64encoderS  r   )r  decoded_bytess     r   is_base64_encodedr  |  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_strr    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    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
    rs  
dummy_toolzThis is a dummy tool callrN  r  r  )r  rs  )r^   r_   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_dumpro  r  r  r?  s    r   convert_to_dictr    sO     '9%!!t!44	GT	"$T']O3UV
 	
r   c                     g }| D ]8  }t        t        t        |            }t        |      }|j	                  |       : |S )Nr  )r   rZ   r  cleanup_none_field_in_messager   r;  new_messagesr?  convert_msg_to_dictcleaned_messages        r   convert_list_message_to_dictr    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  r  )rZ  r  r  )r  jsonify_toolsr   rZ   r  r  r   &validate_chat_completion_user_messagesr  s        r    validate_and_fix_openai_messagesr    s     L{{6")GFO;;|$$18M$NGL!"#3_W5MN7@STO,  2<HHr   c                     g }| | S | D ]T  }t        |t              r |j                  |j                                3t        |t              sD|j                  |       V |S )z<
    Ensure tools is List[dict] and not List[BaseModel]
    )r  r   r   r  ro  rZ  	new_toolsrx  s      r   validate_and_fix_openai_toolsr    s\     I}dI&T__./d#T"	 
 r   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   r  r    s>     ,,.K(..0B0TQAMAqD0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,  rW  rC  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.)	rc  r  r  r]  ra  ro  r  r   KeyError)r;  r  r  user_contentrU  r  s         r   r  r    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	  rs  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  r]  ro  r  r   r  )r[  r  r  s      r   $validate_chat_completion_tool_choicer  5  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dee   fd       Z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e$   fd       Z%edededee&   fd       Z'ede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d   fd       Z0eddded   fd        Z1edededed!   fd"       Z2edededee3   fd#       Z4y)%r  rB  r   r   c                 z$   |t         j                  k(  r0t        j                  j	                  |       rt        j                  S |t         j                  k(  r4t        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(  st        j                   j0                  |k(  rBt3        j4                  |       }|dk(  rt        j6                         S 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(  rt        jH                         S t        j                   jJ                  |k(  rt        jL                         S t        j                   jN                  |k(  rd| v rt        jL                         S d| v rt        jP                         S d| v rddl)m*}  |       S | t        jV                  v r,d| v rt        jX                         S t        jZ                         S | t        j\                  v rt        j^                         S 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(  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(  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                         S t        j                   j                  |k(  st        j                   j                  |k(  rt        j                         S t        j                   j                  |k(  rt        j                         j                  |       rt        j                         S t        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        jZ                         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        jX                         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(  rt        jH                         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                   j0                  |k(  rt        j2                         S t        j                   j4                  |k(  rt        j6                         S t        j                   j8                  |k(  rt        j:                         S t        j                   j<                  |k(  rt        j>                         S t        j                   j@                  |k(  rt        jB                         S t        j                   jD                  |k(  rt        jF                         S t        j                   jH                  |k(  rdd	lm}  ||       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 t        j                   j\                  |k(  rt        j^                         S t        j                   j`                  |k(  rt        jb                         S t        j                   jd                  |k(  rt        jf                         S t        j                   jh                  |k(  rt        jj                         S y
)zC
        Returns the provider config for a given provider.
        r1  v2r*  r  zgpt-ossr   )VertexAIGPTOSSTransformationr  )get_bedrock_chat_configN)rq   r.  r   openaiOSeriesConfigis_model_o_series_modelOpenAIGPT5Configr  DEEPSEEKDeepSeekChatConfigGROQr  BYTEZBytezChatConfig
DATABRICKSr  XAIr  	LAMBDA_AILambdaAIChatConfigLLAMALlamaAPIConfigTEXT_COMPLETION_OPENAIOpenAITextCompletionConfigCOHERE_CHATCOHERErQ   get_cohere_routeCohereV2ChatConfigr  	SNOWFLAKESnowflakeConfigCLARIFAIClarifaiConfigr/  r  ANTHROPIC_TEXTr  VERTEX_AI_BETAr  	VERTEX_AIr  Flitellm.llms.vertex_ai.vertex_ai_partner_models.gpt_oss.transformationr  r  r  r  r  r  r  
CLOUDFLAREr  SAGEMAKER_CHATSagemakerChatConfig	SAGEMAKERr  r{  r  
FRIENDLIAIFriendliaiChatConfigWATSONXr  WATSONX_TEXTr  EMPOWEREmpowerChatConfigGITHUBGithubChatConfigCOMPACTIFAICompactifAIChatConfigGITHUB_COPILOTGithubCopilotConfigCUSTOMCUSTOM_OPENAIOPENAI_LIKEr  AIOHTTP_OPENAIAiohttpOpenAIChatConfigHOSTED_VLLMr  	LLAMAFILELlamafileChatConfigr|  LMStudioChatConfig	GALADRIELGaladrielChatConfig	REPLICATEr  HUGGINGFACEr  TOGETHER_AIr  
OPENROUTERr  VERCEL_AI_GATEWAYVercelAIGatewayConfigCOMETAPICometAPIConfig	DATAROBOTDataRobotConfigGEMINIr  AI21	AI21_CHATr  r0  r  r  r  r  AZURE_AIr;  
AZURE_TEXTAzureOpenAITextConfig	NLP_CLOUDr  	OOBABOOGAOobaboogaConfigOLLAMA_CHATr  	DEEPINFRAr  
PERPLEXITYPerplexityChatConfigMISTRAL	CODESTRAL
NVIDIA_NIMr  CEREBRASr  BASETENBasetenConfig
VOLCENGINEr  TEXT_COMPLETION_CODESTRAL	SAMBANOVASambanovaConfigMARITALKr  VLLMr  OLLAMAr  rz  r  TRITONr  PETALSr  FEATHERLESS_AIFeatherlessAIConfigNOVITANovitaConfigr}  r  WANDBWandbConfig	DASHSCOPEDashScopeChatConfigMOONSHOTMoonshotChatConfigV0V0ChatConfigMORPHMorphChatConfigBEDROCKr  r  LITELLM_PROXYLiteLLMProxyChatConfigOpenAIGPTConfigGRADIENT_AIGradientAIConfigNSCALENscaleConfigHEROKUHerokuChatConfigOCIOCIChatConfig
HYPERBOLICHyperbolicChatConfigOVHCLOUDOVHCloudChatConfig)rB  r   router  r  s        r   r  z.ProviderConfigManager.get_provider_chat_configZ  s    +++++CC%CP...+++((==E=J++--!!**h6--//!!&&(2))++!!''83**,,!!,,8++--!!%%1((**!!++x7--//!!''83))++!!88HD5577  ,,8##**h6#44U;E}1133 //11!!++x7**,,!!**h6))++!!++x7**,,!!00H<..00!!00H<--//!!++x75 1133U"6688e# 455'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++--!!--90022!!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++--!!33x?0022!!**h6))++!!++x7**,,!!((H45577  %%1##--9))++!!''83**,>>U>K2244,,AAAN4466,,..!!**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))++!!))X5((**!!,,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''))!!''83&&((!!++x7..00!!**h6--//!!$$0''))!!''83**,,!!))X5Q*77!!//8;1133!!((H4**,,!!--9++--!!((H4''))!!((H4++--!!%%1((**!!,,8//11!!**h6--//r   c                    t         j                  j                  |k(  r3t         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(  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                  j0                  |k(  rt        j2                         S t         j                  j4                  |k(  rt        j6                         S t         j                  j8                  |k(  rddlm} |j?                  |       S y )Nr   )CohereEmbeddingConfig)rF  )VolcEngineEmbeddingConfig)SagemakerEmbeddingConfig) r   rq   VOYAGErG  rH  rI  r(  r;  r  IBMWatsonXEmbeddingConfigINFINITYrJ  r#  rL  r  r  (litellm.llms.cohere.embed.transformationrJ  JINA_AI-litellm.llms.jina_ai.embedding.transformationrF  r!  0litellm.llms.volcengine.embedding.transformationrK  rF  rM  r
  CometAPIEmbeddingConfigr  /litellm.llms.sagemaker.embedding.transformationrL  get_model_config)rB  r   rJ  rF  rK  rL  s         r   r:  z3ProviderConfigManager.get_provider_embedding_config<  s      ''8377TT ::<<!!((H40022!!((H40022!!))X54466!!**h62244!!++x73355  ''83##//8;V(**!!))X5 )**!!,,8 -..!!**h62244!!**h62244!!++x7 ,<<UCCr   rU  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                  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   rq   r  r  should_use_cohere_v1_clientCohereRerankConfigCohereRerankV2Configr  AzureAIRerankConfigrO  InfinityRerankConfigrQ  JinaAIRerankConfigr  HostedVLLMRerankConfigr  HuggingFaceRerankConfigr  DeepinfraRerankConfigr  NvidiaNimRerankConfigr  VertexAIRerankConfig)rB  r   rU  rW  s       r   get_provider_rerank_configz0ProviderConfigManager.get_provider_rerank_configq  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1133!!--92244!!++x70022!!,,80022!!++x7//11))++r   c                 ,   t         j                  j                  |k(  rt        j                         S t         j                  j                  |k(  rddlm}  |j                  |       S t         j                  j                  |k(  rd| v rddl	m
}  |       S y )Nr   rO   r  ),VertexAIPartnerModelsAnthropicMessagesConfig)r   rq   r/  AnthropicMessagesConfigr8  r  rP   ,get_bedrock_provider_config_for_messages_apir  blitellm.llms.vertex_ai.vertex_ai_partner_models.anthropic.experimental_pass_through.transformationrf  )rB  r   rP   rf  s       r   &get_provider_anthropic_messages_configz<ProviderConfigManager.get_provider_anthropic_messages_config  s    
 ))X52244 !!))X5JP#PPQVWW!!++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 t         j                  j                  |k(  rddlm}  |       S y )Nr   )"ElevenLabsAudioTranscriptionConfigzgpt-4o)"HostedVLLMAudioTranscriptionConfig)r   rq   r{  #FireworksAIAudioTranscriptionConfigDEEPGRAM DeepgramAudioTranscriptionConfig
ELEVENLABS:litellm.llms.elevenlabs.audio_transcription.transformationrl  r.  !OpenAIGPTAudioTranscriptionConfig%OpenAIWhisperAudioTranscriptionConfigr  6litellm.llms.hosted_vllm.transcriptions.transformationrm  )rB  r   rl  rm  s       r   r  z=ProviderConfigManager.get_provider_audio_transcription_config  s    
 ,,8>>@@!!**h6;;==!!,,8 677!!((H45 @@BBDDFF!!--9 677r   Nc                 4   t         j                  j                  | k(  rt        j                         S t         j                  j                  | k(  rh|xr d|j                         v }|xr$ d|j                         v xs t        |      xr | }|rt        j                         S t        j                         S t         j                  j                  | k(  rt        j                         S t         j                  j                  | k(  rt        j                         S y )Nr  o_series)r   rq   r.  OpenAIResponsesAPIConfigr0  rG  r  $AzureOpenAIOSeriesResponsesAPIConfigAzureOpenAIResponsesAPIConfigr  XAIResponsesAPIConfigr9  LiteLLMProxyResponsesAPIConfig)r   rB  is_gpt_modelis_o_seriess       r   !get_provider_responses_api_configz7ProviderConfigManager.get_provider_responses_api_config  s    
 &&(23355!!''83 !;Uekkm%;LuZ5;;=%@%tEWX]E^EsgscsKCCEE<<>>!!%%10022!!//8;99;;r   c                     t         j                  |k(  rt        j                         S t         j                  |k(  rt        j
                         S t        j                         S r  )rq   r{  r   FireworksAITextCompletionConfigr  TogetherAITextCompletionConfigr  r  s     r   #get_provider_text_completion_configz9ProviderConfigManager.get_provider_text_completion_config  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ddl	m
}  |       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         j0                  |k(  rddlm}  |       S t         j6                  |k(  rt        j8                         S t         j:                  |k(  rt        j<                         S y )Nr   )VertexAIModelInfo)OllamaModelInfo)VLLMModelInfo)rq   r{  r   r  r.  r;  r  GeminiModelInfor  #litellm.llms.vertex_ai.common_utilsr  r9  r:  TOPAZTopazModelInfor/  AnthropicModelInfor  XAIModelInfor'  r   litellm.llms.ollama.common_utilsr  r&  r  litellm.llms.vllm.common_utilsr  LEMONADELemonadeChatConfigr  r  )rB  r   r  r  r  s        r   r  z-ProviderConfigManager.get_provider_model_info  sw   
 $$0,,..  H,**,,  H,**,,##x/M$&&''8311338+))++##x/--//)''))  H,0H0HH0TH"$$(*l.F.F(.R !?"""h.--//""h.))++r   c                     t         j                  |k(  rddlm}  |       S t         j                  |k(  st         j
                  |k(  rddlm}  |       S t         j                  |k(  rddl	m
}  |       S y )Nr   )BedrockPassthroughConfig)VLLMPassthroughConfig)AzurePassthroughConfig)rq   r8  /litellm.llms.bedrock.passthrough.transformationr  r&  r  ,litellm.llms.vllm.passthrough.transformationr  r0  -litellm.llms.azure.passthrough.transformationr  )rB  r   r  r  r  s        r   get_provider_passthrough_configz5ProviderConfigManager.get_provider_passthrough_config  sn    
 8+ ,--(*l.F.F(.R )**8+ *++r   c                     t         j                  |k(  rt        j                         S t         j                  |k(  rt        j
                         S y r  )rq   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 t         j                  |k(  rddlm	}  |       S y )Nr   )GoogleAIStudioFilesHandler)VertexAIFilesConfig)BedrockFilesConfig)
rq   r  (litellm.llms.gemini.files.transformationr  r  +litellm.llms.vertex_ai.files.transformationr  r8  )litellm.llms.bedrock.files.transformationr  )rB  r   r  r  r  s        r   get_provider_files_configz/ProviderConfigManager.get_provider_files_config3  sY    
 (* .//##x/W&((!!X-T%''r   c                 D    t         j                  |k(  rddlm}  |       S y )Nr   )BedrockBatchesConfig)rq   r8  +litellm.llms.bedrock.batches.transformationr  )rB  r   r  s      r   get_provider_batches_configz1ProviderConfigManager.get_provider_batches_configH  s!    
 8+X'))r   c                 V    ddl m} t        j                  | k(  r|j	                         S y )Nr   )BedrockVectorStore)Clitellm.integrations.vector_store_integrations.bedrock_vector_storer  rq   r8  get_initialized_custom_logger)r   r  s     r    get_provider_vector_store_configz6ProviderConfigManager.get_provider_vector_store_configS  s)    	
 8+%CCEEr   api_typec                    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k(  s|ddl	m
}  |       S |dk(  rddlm}  |       S y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rag_apiN)VertexVectorStoreConfig
search_api) VertexSearchAPIVectorStoreConfig)BedrockVectorStoreConfig)PGVectorStoreConfig)AzureAIVectorStoreConfig)MilvusVectorStoreConfig)r   rq   r.  0litellm.llms.openai.vector_stores.transformationr  r0  /litellm.llms.azure.vector_stores.transformationr  r  ;litellm.llms.vertex_ai.vector_stores.rag_api.transformationr  >litellm.llms.vertex_ai.vector_stores.search_api.transformationr  r8  1litellm.llms.bedrock.vector_stores.transformationr  	PG_VECTOR3litellm.llms.pg_vector.vector_stores.transformationr  r  2litellm.llms.azure_ai.vector_stores.transformationr  MILVUS0litellm.llms.milvus.vector_stores.transformationr  )
r   r  r  r  r  r  r  r  r  r  s
             r   !get_provider_vector_stores_configz7ProviderConfigManager.get_provider_vector_stores_config_  s/    &&(2 +,,!!''83 011!!++x79$(8 /00\) 8992 1 !!))X5 ,--!!++x7 '((!!**h6 ,--!!((H4 +,,r   c                 X    t         j                  j                  | k(  rddlm}  |       S y )Nr   )OpenAIVectorStoreFilesConfig)r   rq   r.  5litellm.llms.openai.vector_store_files.transformationr  )r   r  s     r   &get_provider_vector_store_files_configz<ProviderConfigManager.get_provider_vector_store_files_config  s+     &&(2 011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 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 t         j2                  |k(  rdd
lm}
  |
       S t         j8                  |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_azure_ai_image_generation_config)&get_xinference_image_generation_config)#get_recraft_image_generation_config) get_aiml_image_generation_config)$get_cometapi_image_generation_config)"get_gemini_image_generation_config)!LiteLLMProxyImageGenerationConfig)"get_fal_ai_image_generation_config)$get_runwayml_image_generation_config)"rq   r.  $litellm.llms.openai.image_generationr  r0  #litellm.llms.azure.image_generationr  r  &litellm.llms.azure_ai.image_generationr  
XINFERENCE(litellm.llms.xinference.image_generationr  RECRAFT%litellm.llms.recraft.image_generationr  AIML"litellm.llms.aiml.image_generationr  r
  &litellm.llms.cometapi.image_generationr  r  $litellm.llms.gemini.image_generationr  r9  :litellm.llms.litellm_proxy.image_generation.transformationr  FAL_AI$litellm.llms.fal_ai.image_generationr  RUNWAYML&litellm.llms.runwayml.image_generationr  )rB  r   r  r  r  r  r  r  r  r  r  r  r  s                r   $get_provider_image_generation_configz:ProviderConfigManager.get_provider_image_generation_config  se   
 (* 6e<<8+ 5U;;""h. 8>>$$0 :%@@!!X- 7u==(* 4E::""h. 8>>  H, 6e<<''83 566  H, 6e<<""h. 8>>r   c                 D   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 t         j                  |k(  rddlm}  |       S y )Nr   )OpenAIVideoConfig)AzureVideoConfig)GeminiVideoConfig)VertexAIVideoConfig)RunwayMLVideoConfig)rq   r.  )litellm.llms.openai.videos.transformationr  r0  (litellm.llms.azure.videos.transformationr  r  )litellm.llms.gemini.videos.transformationr  r  ,litellm.llms.vertex_ai.videos.transformationr  r  +litellm.llms.runwayml.videos.transformationr  )rB  r   r  r  r  r  r  s          r   get_provider_video_configz/ProviderConfigManager.get_provider_video_config  s    
 (*S$&&8+Q#%%  H,S$&&##x/ '((""h.W&((r   c                 D    t         j                  | k(  rddlm}  |       S y )Nr   )OpenAIContainerConfig)rq   r.  -litellm.llms.openai.containers.transformationr  )r   r  s     r   get_provider_container_configz3ProviderConfigManager.get_provider_container_config  s%     (* )**r   c                 D    t         j                  |k(  rddlm}  |       S y )Nr   )GeminiRealtimeConfig)rq   r  +litellm.llms.gemini.realtime.transformationr  )rB  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 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_edit_configr1  )AzureImageEditConfig)RecraftImageEditConfig)get_azure_ai_image_edit_config)get_gemini_image_edit_config)LiteLLMProxyImageEditConfig)rq   r.  litellm.llms.openai.image_editr  r0  ,litellm.llms.azure.image_edit.transformationr  r  .litellm.llms.recraft.image_edit.transformationr  r   litellm.llms.azure_ai.image_editr  r  litellm.llms.gemini.image_editr   r9  4litellm.llms.litellm_proxy.image_edit.transformationr  )rB  r   r  r  r  r  r   r  s           r   get_provider_image_edit_configz4ProviderConfigManager.get_provider_image_edit_config#  s    
 (*S/e<<8+ ())!!X- *++""h.W1%88  H,S/66''83 /00r   rK   c                    ddl m} |t        j                  j                  k(  rddlm}  ||       S t        j                  j                  t        t        j                  j                  |i}|j                  |d      }|y |       S )z=
        Get OCR configuration for a given provider.
        r   )VertexAIOCRConfig)get_azure_ai_ocr_configr1  N))litellm.llms.vertex_ai.ocr.transformationr
  r   rq   r  &litellm.llms.azure_ai.ocr.common_utilsr  r  rT   r  r  )rB  r   r
  r  PROVIDER_TO_CONFIG_MAPr  s         r   get_provider_ocr_configz-ProviderConfigManager.get_provider_ocr_configH  s     	P w++444V*77   ((*:  **,="
 .11(DA~r   r|   rL   c                    ddl m} ddlm} ddlm} ddlm} ddlm	} ddl
m} ddlm} dd	lm} t         j"                  |t         j$                  |t         j&                  |t         j(                  |t         j*                  |t         j,                  |t         j.                  |t         j0                  |i}	|	j3                  | d
      }
|
y
 |
       S )z@
        Get Search configuration for a given provider.
        r   )DataForSEOSearchConfig)ExaAISearchConfig)FirecrawlSearchConfig)GooglePSESearchConfig)ParallelAISearchConfig)PerplexitySearchConfig)SearXNGSearchConfig)TavilySearchConfigN)-litellm.llms.dataforseo.search.transformationr  )litellm.llms.exa_ai.search.transformationr  ,litellm.llms.firecrawl.search.transformationr  -litellm.llms.google_pse.search.transformationr  .litellm.llms.parallel_ai.search.transformationr  -litellm.llms.perplexity.search.transformationr  *litellm.llms.searxng.search.transformationr  )litellm.llms.tavily.search.transformationr  r|   r  TAVILYPARALLEL_AIEXA_AI
GOOGLE_PSE
DATAFORSEO	FIRECRAWLSEARXNGr  )r   r  r  r  r  r  r  r  r  r  r  s              r   get_provider_search_configz0ProviderConfigManager.get_provider_search_configa  s     	YOVW	
 	YRP &&(>""$6'')?""$5&&(=&&(>%%'<##%8	"
 .11(DA~r   rN   c                     ddl m} t        j                  j                  |k(  r| j                  d      rddlm}  |       S yt        j                  j                  |k(  rddl	m
}  |       S y)zH
        Get text-to-speech configuration for a given provider.
        r   rM   zspeech/)AzureAVATextToSpeechConfig)RunwayMLTextToSpeechConfigN)3litellm.llms.base_llm.text_to_speech.transformationrN   r   rq   r0  r  0litellm.llms.azure.text_to_speech.transformationr*  r  3litellm.llms.runwayml.text_to_speech.transformationr+  )rB  r   rN   r*  r+  s        r   "get_provider_text_to_speech_configz8ProviderConfigManager.get_provider_text_to_speech_config  sk    	
 %%1 	* 233  !!**h6 .//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   rq   r  /litellm.llms.gemini.google_genai.transformationr1  r  2litellm.llms.vertex_ai.google_genai.transformationr2  4litellm.llms.vertex_ai.vertex_ai_partner_models.mainr3  is_vertex_partner_model)rB  r   r1  r2  r3  s        r   1get_provider_google_genai_generate_content_configzGProviderConfigManager.get_provider_google_genai_generate_content_config  sg    
 &&(2 %&&!!++x7 %<<UC -..r   r  )5r  rn  ro  rp  r]  rq   r   r   r  r   r:  r   r   rd  r   rj  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r'   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r  r(  r/  rJ   r8  rK  r   r   r  r  Y  s   __*_	*	_ _B 222 
%	&2 2h ,,, 3-, !%S		,
 
, ,@  
-	. *  
.	/ 6   $} 
(	) . 444 
"4 4 %}%% 
"	#% %N  
'	( 0  
*	+   
/	" (  
#	$  			,		 	  #'883-8 
'	(8 8t 			,	-	 	 FFF 
+	,F FP } 
/	" 8 			%	&	 	  
$	%  """ 
%	&" "H  
/	" 0 #	$	% @  
*	+ 8  
6	7 r   r  service_type)r_  
prometheusc                    t        t        t        t        |                   }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.
    r1  user_api_key_end_user_idNr:  T)	r   ro  r,   r   r]  r  r   disable_end_user_cost_tracking-enable_end_user_cost_tracking_prometheus_only)rY  r9  	_metadataend_user_ids       r   !get_end_user_id_for_cost_trackingrA    s     .t>/RSI 56 	5==34K
 -- |#@@Lr   rW  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)rU  rW  uses_v1_paramss      r   rY  rY    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;  rZ  rB  r\  z)Error in is_prompt_caching_valid_prompt: )r  r   r#   r   r   r   )rB  r;  rZ  ra  token_countr  s         r   is_prompt_caching_valid_promptrI    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  r  g     @@)r  findallrg  r  r   r  )
rJ  timestamp_pattern
timestamps	durationsmatchhoursminutessecondsmillisecondstotal_secondss
             r    extract_duration_from_srt_or_vttrV    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  r1  r\  r   r]  rY  )rU  rW  r$  base_url	base_pathend_pathr  base_segmentsend_segmentsfinal_segmentsr  modified_pathr&  s                r   _add_path_to_api_baserc  +  s<    99X&L%%R%0H!!((-I!!#&H !* 4: 41Q 4M:'~~c282!aA2L8 N3}%&-Es=/AA/E FF*2A.=N ' '5 #((>22M%%=%9L |%%\-@-@%ABB% ;8s   'D"/D"D'D'rY  c                 ~    | j                         D ci c]  \  }}|t        j                  v r||| c}}S c c}}w r  )r&  r   OPENAI_CHAT_COMPLETION_PARAMS)rY  r	  r
  s      r   get_standard_openai_paramsrf  Q  sI     LLN"DAq555!- 	
1"  s   !9c                     t         j                  }|t        z   }| j                         D ci c]  \  }}||vs|| }}}|S c c}}w r  )r   re  r   r&  )r  r  r  r	  r
  r  s         r   !get_non_default_completion_paramsrh  Y  sV    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  r   r&  )r  r  r  r	  r
  r  s         r   $get_non_default_transcription_paramsrj  c  sF    =03EEN+1<<>U>41aQn=T!Q$>U Vs   ::r  c                 ,   | y| j                         D ci c]&  \  }}|dk7  rt        |t              rt        |      |( }}}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  r]  r\  r.  )r  r	  r
  visible_metadatafiltered_metadatar  s         r   add_openai_metadatarp  k  s      NN$($DAqJq#$6 	A	$  ( 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   r}  )Loggingzgpt-3.5-turborW  hir+  Frl  1234T)rB  r;  rO  rL  rM  rP  r6  log_raw_request_responserD  zmy-fake-api-key)r  r?  Nraw_request_typed_dict)r   rK  )r  r   rs  r  rT  r   r*  r   r]  ro  r  r   r{   )	rq  r  r  rs  r  llm_api_endpointreceived_exceptionr  rw  s	            r   return_raw_requestrz    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
    Tr  )r  r   r  ro  r.  r   r  s      r   r  r    sb     IdI&???5Dd#99;DdD!T"  r   c                      t        ddd      S )Nr   )prompt_tokenscompletion_tokensr  )r   rK  r   r   get_empty_usager    s     r   mock_tool_callsmock_timeoutc                     | s|s|ryyr  rK  )r  r  r  s      r   should_run_mock_completionr    s    
 <r   )Fr   r}  r  )rD  rD  N)mainN)	rD  NNNFNNFN)NNNNNN)NNNNNNNNNNN)NNNrD  NN)r=  )FFN)%NNNNNFNNNNNNNNNNNrD  NNNNNNNNNNNNNNNNNNN)rD  rD  rD  r   r   )NNNNr  )NNNNN)r_  r  (  r  r  r  binasciir  r.  r  r<  r
  io	itertoolsrV  loggingrA  r  r  struct
subprocesssystextwrap	threadingr2  r  dataclassesr   r   	functoolsr   r   	importlibr   r   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._uuidr   #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.cached_importsr)   r*   r+   rh  r,   r-   r.   .litellm.litellm_core_utils.credential_accessorr/   +litellm.litellm_core_utils.default_encodingr1   2litellm.litellm_core_utils.exception_mapping_utilsr2   r3   r4   -litellm.litellm_core_utils.get_litellm_paramsr5   r6   1litellm.litellm_core_utils.get_llm_provider_logicr7   r8   6litellm.litellm_core_utils.get_supported_openai_paramsr9   ,litellm.litellm_core_utils.llm_request_utilsr:   Flitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser;   r<   r=   r>   r?   :litellm.litellm_core_utils.llm_response_utils.get_api_baser@   Blitellm.litellm_core_utils.llm_response_utils.get_formatted_promptrA   9litellm.litellm_core_utils.llm_response_utils.get_headersrB   ?litellm.litellm_core_utils.llm_response_utils.response_metadatarC   8litellm.litellm_core_utils.prompt_templates.common_utilsrD   *litellm.litellm_core_utils.redact_messagesrE   rF    litellm.litellm_core_utils.rulesrG   ,litellm.litellm_core_utils.streaming_handlerrH   (litellm.litellm_core_utils.token_counterrI   1litellm.llms.base_llm.google_genai.transformationrJ   (litellm.llms.base_llm.ocr.transformationrK   +litellm.llms.base_llm.search.transformationrL   r,  rN   r  rP    litellm.llms.cohere.common_utilsrQ   &litellm.llms.custom_httpx.http_handlerrR   rS   'litellm.llms.mistral.ocr.transformationrT   *litellm.router_utils.get_retry_from_policyrU   rV   litellm.secret_managers.mainrW   litellm.types.llms.anthropicrX   rY   r  rZ   r[   r\   r]   r^   r_   r`   ra   litellm.types.rerankrb   litellm.types.utilsrc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   filesjoinpathr  fr  	json_dataImportErrorAttributeErrorr  	open_textdumpsrF  importlib.metadatatypingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   OriginalErrorr   /litellm.litellm_core_utils.thread_pool_executorr   r   r`  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.batches.transformationr   )litellm.llms.base_llm.chat.transformationr   /litellm.llms.base_llm.completion.transformationr   /litellm.llms.base_llm.containers.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   7litellm.llms.base_llm.vector_store_files.transformationr   +litellm.llms.base_llm.videos.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   r   sentry_sdk_instancecapture_exceptionrg  posthog	slack_appalerts_channelheliconeLoggerathinaLoggerpromptLayerLoggerlangsmithLoggerlogfireLoggerweightsBiasesLoggercustomLoggerlangFuseLoggeropenMeterLogger
lagoLoggerdataDogLoggerprometheusLoggerdynamoLoggers3LoggergreenscaleLoggerlunaryLoggeraispendLoggersupabaseClientr   r]  r  rj  r   r   last_fetched_atlast_fetched_at_keysrq  r   r   r  r   r   r  r!  ro  r+  r1  r  r  r   r  r  r  r  r  r  r  r  r$  r  r  r5  r3  r9  r:  rM  rS  r2  rX  rf  rh  rn  rp  rr  ry  r  r  r  r  rk  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  r  r  r  r  rP  rS  rX  rZ  r`  rb  r6  r{  rw  r  r  r  r  r  r  r  r$  r.  r4  r7  r:  rD  rH  rN  r]  r{  r  r  r  r  r  r  r  r  typing_extensionsr  r  r  r  r  r  r  ru  r  r  r  r'  r7  r=  rJ  r  r  r  r  r  r  Headersr  r  r  r  r  r  r  r  r  r  r  r  r  r#  litellm.caching.in_memory_cacher$  r&  rY  rV  r[  r`  r  rm  rq  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rA  rY  rI  rV  rc  rf  rh  rj  rp  rz  r  r  r  rK  r   r   <module>r	     sa            	    	  	        ( &    * *       0 * E       ! 3 6    A - U    B ;
 
 
 N @ 
 T  T 3 L L C H V > < P D 4	 	 	 0 )! ! ! ! ! ! ! ! !F
!	@	A	J	J"

d3d!
"%&DIIaL	
" $**Y'    " 0 E W K @ T T O O N N F F O O   S R L L H H Q Q S S  H G 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	mm`	
%

 #'
DcN'0
8C=$sCx.().cN'0eE3-./<d <c3h C 0"%2:92Ec],g d^gTwx "TN 
@cNY^$ 
@ 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 & TuS$Y/ TnT )-GOPT~	& # %)!%JN"&ZZZ smZ SM	Z
 c]Z #Z &d73D+E&FGZ $ZzXc] s (  !%))--1;?"&IC=I}I c]I c]	I
 3-I C=I 3-I "#I %TNI 78I $I^ %) $"&26dd 3-d c]	d
 d $d %T#Y/dN	.*B7?S	7J	"d t 0F" F"^ #().,0CCC C %T#Y/	C
 C  C #'C j)C 
CLt  ``-1`HK`	`N 

	
		
151515;?'+QE EB $DI.CEJ t,-.KEL -.MEN !!78OEP  }QEZ .2111 1 9	1
 %TN1 
1h/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 )X/c /HSM /d!:
# :
(3- :
z, ,	73 	73# 3# 3 S x}  &# # #d # SW < ( 'i **%-c]*,*ZS Xc] .XX%-c]XX%-c]'((	B			 6:Y
Y
%-c]Y
Y
xV# VHSM VY VrGs G4X Xv  "(
(
(
 (
 	(

 (
 (
VS T-5H  1:  !"!%	HVC=HVc]HV smHV #	HV
 
HVV0$H3  .s < 15u}}-J 15	""" u}}-" 	"
 5#:":  " ?&?&?& ?& 	?&
 ?&DQ% Q%j >B-5c]< 	o/BBC }	<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!"M%d^M!#M ^,M c]	M
 smM 
#YM`1h# #> B( 
/ D 0  &c c 	4(8#9 	d 	 5L0M *   
U9d?3 
 
(4 It I&$ HT$Z<P C+; C&T:J5K &R!%c	*+!eD#I!Hf fV >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  $  #(738+<"=  #(4PSUXPX>BZ  #F*
 *
D *
=P *
Zc tDz " C=c] 3- 
	Ax
" 
" 	^Y/ !			/1K
	
DIIaL	
 
 
!sU   '5AA A@60AA @6AA @;AA AABAAA<A3	ABA<AB	BABBAB