o
    ưi                    @  sx  U d dl 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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(m+Z+ d d
l,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl*m5Z5 d dl6m7Z7 d dl8Z8d dl9Z8d dl:Z8d dl;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM daNdaOdaPdaQdd ZRdd ZSdd ZTdd ZUdaVdd ZWd dlXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` d dlambZb d dlamcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZ d d! edD Zd"ed#< z%e d$d%jd&d'd(ZeeZW d   n	1 sw   Y  W n) eeefy   e d$d%ZeeZW d   n	1 sw   Y  Y nw eeZd dlZd d)lmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d d*l)mZ d d+lmZmZ erd d,lmZmZ d d-lmZ d d.lmZ d d/lmZ d d0lmZ d d1lmZmZ d d2lmZ d d3lmZmZmZmZmZ d d4lmZ d d5lmZ d d6lmZ d d7lmZmZ d d8lmZ d d9lmZ d d:lmZ d d;lmZ d d<lmZ d d=lmZ d d>lmZ d d?lmZ d d@lmZmZmZ d dAlmZmZmZ d dBlmZmZ d dClmZmZ d dDlmZ d dElmZ d dFlmZ d dGlmZ d dHlmZ d dIlmZ d dJlmZ d dKlmZ d dLlmZmZ d dMlmZmZ d dNlmZ d dOlmZ d dPlmZ d dQlmZ d dRl mZ d dSlmZ d dTlmZ d dUlmZ d dVlm	Z	 d dWl
mZ d dXlmZ d dYlmZ d dZlmZ d d[lmZmZ d d\lmZ d d]lXmZmZmZ d d^lmZ d d_lmZ d d`lmZ d dal m!Z! d dbl"m#Z# d dcl$m%Z% dddel&m'Z'm(Z( dddfl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ dddgl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8mZm9Z9m:Z:m;Z;m<Z<m=Z=m>Z> er6d dhl8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 aXdiedj< daYi ZZdkedl< i Z[dkedm< dZ\dZ]	n	odddtduZ^dvdw Z_dd~dZ`dddZadddZbdddZcdddZddddZedddZfdddZgdddZhdddZidddZjdddZkdddZldddZmdddZndddZodddZpdddZqdddZrdddńZsddǄ Zt	nddddʄZuevedjwedjxedjwjyedjxjyhZzddd̈́Z{	ddddфZ|eeDdҍdddՄZ}dddׄZ~dddڄZdddd݄Zdg dfdddZ	ddddZdddZ					n			n	ddddZdddZdddZddddZddd dZdddZ	ddddZ	ddddZ	dddd	Zddd
dZdddZdddZddddZddddZ	ddddZ	ddddZ	ddddZddddZddddZ	ddd d!Z	ddd"d#Zdd'd(Zd)d* Zdd-d.Zdd/d0Zdd5d6Z						ddd>d?ZdÐdAdBZ											dĐdŐdIdJZ							dƐdǐdNdOZdPdQ ZdRdS ZdȐdUdVZdɐdYdZZdʐd[d\ZG d]d^ d^Z	n	n	dːd̐dcddZd͐dfdgZdΐdhdiZ						n																															dϐdАdpdqZ	ddѐdsdtZdҐdvdwZdӐdxdyZdԐd~dZdՐddZd֐ddZdאddZdؐddZdؐddZdِddZdڐddZdېddZdܐddZdݐddZdސddZdd ZdߐddZdddZdddZdddZdddZdadked< dddZdddZÐdddZĐdddZŐdddZƐdddZǐdddZd dlɐmʐZ G ddÄ dÐeʃZːddĐdńZ̐ddƐdǄZeeDdҍ	dddʐd˄Zΐdd͐d΄ZϐddАdфZ		dddҐdӄZeeDdҍ		dddՐdքZҐddؐdلZӐddڐdۄZԐdܐd݄ Z				 	 ddddZ֐dddZאdd Z				ddddZِdd Zڐdd Zېdd ZܐdddZݐdddZ	ddddZ		 ddddZi ddi fdddZG dd dZ	dddd	Z	ddddZdddZdd Zdd Zdd Zdd Zdd Z	nddddZdeEdndfd d d!Zd d"lmZ G d#d$ d$eZe Z	ddd%d&Z	ddd)d*Z					ddd,d-Zd.d/ Zd0d1 Zdd2d3ZG d4d5 d5ZG d6d7 d7ZG d8d9 d9eZdd<d=Zdd?d@ZddAdBZddDdEZddFdGZddHdIZd	dKdLZ d dMlXmZmZmZmZmZmZ d
dOdPZddQdRZddSdTZ	ddVdWZ
ddYdZZdd[d\Zdd]d^Zdd`daZ	dddcddZG dedf dfZ	gdddjdkZddmdnZ		dddodpZddsdtZddvdwZddydzZdʐd{d|Zdʐd}d~ZdddZdddZdddZdddZdddZdddZdddZdS (       )annotationsN)	dataclassfield)	lru_cachewraps)	resources)iscoroutine)StringIO)abspathdirnamejoinProxy)get_environment_proxies)_parsing	_pydantic)ResponseFormat)	BaseModel)Encoding)	Tokenizer)_get_default_encoding_get_modified_max_tokens_get_token_counter_new)uuid)$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_COUNTc                  C     t du rddlm}  | a t S )z
    Get cached CustomLogger class.
    Lazy imports on first call to avoid loading custom_logger at import time.
    Subsequent calls use cached class for better performance.
    Nr   CustomLogger)_CustomLogger"litellm.integrations.custom_loggerr(   r'    r+   D/home/app/Keep/.python/lib/python3.10/site-packages/litellm/utils.py_get_cached_custom_loggerQ      r-   c                  C  r&   )z
    Get cached CustomGuardrail class.
    Lazy imports on first call to avoid loading custom_guardrail at import time.
    Subsequent calls use cached class for better performance.
    Nr   CustomGuardrail)_CustomGuardrailZ%litellm.integrations.custom_guardrailr0   r/   r+   r+   r,   _get_cached_custom_guardrail_   r.   r2   c                  C  r&   )z
    Get cached CachingHandlerResponse class.
    Lazy imports on first call to avoid loading caching_handler at import time.
    Subsequent calls use cached class for better performance.
    Nr   CachingHandlerResponse)_CachingHandlerResponselitellm.caching.caching_handlerr4   r3   r+   r+   r,   $_get_cached_caching_handler_responsem   r.   r7   c                  C  r&   )z
    Get cached LLMCachingHandler class.
    Lazy imports on first call to avoid loading caching_handler at import time.
    Subsequent calls use cached class for better performance.
    Nr   LLMCachingHandler)_LLMCachingHandlerr6   r9   r8   r+   r+   r,   _get_cached_llm_caching_handler{   r.   r;   c                  C  s   t du rddl} | jjja t S )z
    Get cached audio_utils.utils module.
    Lazy imports on first call to avoid loading audio_utils.utils at import time.
    Subsequent calls use cached module for better performance.
    Nr   )_audio_utils_moduleZ,litellm.litellm_core_utils.audio_utils.utilslitellm_core_utilsaudio_utilsutils)litellmr+   r+   r,   _get_cached_audio_utils   s   
rA   )AllMessageValuesAllPromptValuesChatCompletionAssistantToolCall"ChatCompletionNamedToolChoiceParamChatCompletionToolParam$ChatCompletionToolParamFunctionChunkOpenAITextCompletionUserMessageOpenAIWebSearchOptions)	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_paramsc                 C  s   i | ]}|j |qS r+   value).0ctr+   r+   r,   
<dictcomp>       ro   dict_CALL_TYPE_ENUM_MAPz%litellm.litellm_core_utils.tokenizerszanthropic_tokenizer.jsonrutf-8)encoding)TYPE_CHECKINGAnyCallableDictIterableListLiteralMappingOptionalTupleTypeUnioncastget_args)OpenAIError)BaseLLMModelInfotype_to_response_format_param)r4   r9   r'   )BaseFilesConfig)AllowedModelRegion)exception_type)_is_non_openai_azure_modelget_llm_provider)get_supported_openai_params)LiteLLMResponseObjectHandler#_handle_invalid_parallel_tool_calls convert_to_model_response_objectconvert_to_streaming_response#convert_to_streaming_response_async)get_api_base)ResponseMetadata)_parse_content_for_reasoning)LiteLLMLoggingObject(redact_message_input_output_from_logging)CustomStreamWrapper)$BaseGoogleGenAIGenerateContentConfig)BaseOCRConfig)BaseSearchConfigBaseTextToSpeechConfigBedrockModelInfo)CohereModelInfo)MistralOCRConfig)get_coroutine_checkerget_litellm_logging_classget_set_callbacks) get_litellm_metadata_from_kwargsmap_finish_reasonprocess_response_headers)delete_nested_valueis_nested_path)*_get_base_model_from_litellm_call_metadataget_litellm_params)_ensure_extra_body_is_safe)get_formatted_prompt)get_response_headers)update_response_metadata)Rules)executor)BaseAnthropicMessagesConfig)BaseAudioTranscriptionConfig)AsyncHTTPHandlerHTTPHandler)!get_num_retries_from_retry_policyreset_retry_policy)
get_secret)BaseBatchesConfig)BaseContainerConfig)BaseEmbeddingConfig)BaseImageEditConfig)BaseImageGenerationConfig)BaseImageVariationConfig)BasePassthroughConfig)BaseRealtimeConfig)BaseRerankConfig)BaseVectorStoreConfig)BaseVectorStoreFilesConfig)BaseVideoConfig)ANTHROPIC_API_ONLY_HEADERSAnthropicThinkingParam)RerankResponse) ChatCompletionDeltaToolCallChunkChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunkLiteLLM_Params)
BaseConfig)BaseTextCompletionConfig)BaseEvalsAPIConfig)BaseResponsesAPIConfig)BaseSkillsAPIConfig   )_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)MockExceptionOptional[List[str]]callback_listOptional[Dict[str, str]]additional_detailslocal_cacheFDEBUGlogger_onlybool	log_level!Literal['DEBUG', 'INFO', 'ERROR']c                 C  s|   z3|dkrt |  n|dkrt |  n	|dkrt |  tjdu r.|du r1t|  W d S W d S W d S  ty=   Y d S w )Nr   INFOERRORTF)r   debuginfoerrorr@   set_verboseprint	Exception)Zprint_statementr   r   r+   r+   r,   print_verbose  s   
r   c                  C  sL   t jD ] } | d t jvrt j| d  | d t jvr#t j| d  qdS )z2
    Add custom_llm provider to provider list
    providerN)r@   Zcustom_provider_mapprovider_listappendZ_custom_providers)Z
custom_llmr+   r+   r,   custom_llm_setup  s   
r   callbackstrlogging_eventLiteral['success', 'failure']returnNonec                 C  s"  ddl m} ddlm} | t jvrtd|  dt j  dS |t|| ddd}|r|dkr[t|d	u r[t j	
| t j	| | t jv rLt j|  | t jv rYt j|  dS dS |d
krt|d	u rt j	| t j	| | t jv r|t j|  | t jv rt j|  dS dS dS dS dS )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Zinternal_usage_cacheZ
llm_routersuccessFfailure)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_classr+   r+   r,   -_add_custom_logger_callback_to_specific_event  sl   




r  r  'CustomLogger'c                      t  fddtjtj 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      | ]
}t |t V  qd S N
isinstancetyperm   cbr  r+   r,   	<genexpr>A  
    
zC_custom_logger_class_exists_in_success_callbacks.<locals>.<genexpr>)anyr@   r  r  r$  r+   r$  r,   r  7     

r  c                   r  )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  r  r  r  r"  r$  r+   r,   r%  Q  r&  zC_custom_logger_class_exists_in_failure_callbacks.<locals>.<genexpr>)r'  r@   r  r  r$  r+   r$  r,   r  G  r(  r  kwargsDict[str, Any]	List[str]c                 C  s.   |  dpi }| dpi }| dpg }|S )z4
    Get the request guardrails from the kwargs
    metadatarequester_metadataZ
guardrailsget)r)  r,  r-  applied_guardrailsr+   r+   r,   get_request_guardrailsW  s   r1  c                 C  sl   t | }g }t }tjD ]'}|dur3t||r3|jdur3|jdu r(||j q|j|v r3||j q|S )z\
    - Add 'default_on' guardrails to the list
    - Add request guardrails to the list
    NT)r1  r2   r@   	callbacksr   Zguardrail_nameZ
default_onr   )r)  Zrequest_guardrailsr0  r0   r   r+   r+   r,   get_applied_guardrailsa  s   



r3  c                 C  s\   t tjt d}| d}|r(tjr*||}| D ]\}}|| vr'|| |< qdS dS dS )zI
    Updates kwargs with the credentials if credential_name in kwarg
    CredentialAccessorZlitellm_credential_nameN)	getattrsysmodules__name__r/  r@   Zcredential_listZget_credential_valuesitems)r)  r4  Zcredential_nameZcredential_accessorkeyrl   r+   r+   r,   load_credentials_from_listu  s   


r;  dynamic_callbacks4Optional[List[Union[str, Callable, 'CustomLogger']]]r{   c                 C  s   t j }| r||  |S r  )r@   r2  copyextend)r<  Zreturned_callbacksr+   r+   r,   get_dynamic_callbacks  s   

r@  modelOptional[str]custom_llm_providerc                 C  s<   |dv r|dv r| duod|   v S dS | duod|   v S )zJ
    Check if the target model is a Gemini or Vertex AI Gemini model.
    )gemini	vertex_aivertex_ai_beta)rE  rF  NrD  TlowerrA  rC  r+   r+   r,   _is_gemini_model  s
   rJ  tool_call_id	separatorc                 C  s   || v r|  |dd S | S )z7
    Remove thought signature from a tool call ID.
    r   r   split)rK  rL  r+   r+   r,   !_remove_thought_signature_from_id  s   rO  msg_copythought_signature_separatorc                 C  s   |  d}|  d}|dkrTt|trTg }|D ]8}t|dr#| }nt|tr-| }n|| qt| dtrJ||d v rJt	|d ||d< || q|| d< | S )zT
    Process assistant message to remove thought signatures from tool call IDs.
    role
tool_calls	assistant
model_dumpid)
r/  r   listhasattrrU  rq   r>  r   r  rO  )rP  rQ  rR  rS  Znew_tool_callsZtcZtc_dictr+   r+   r,   %_process_assistant_message_tool_calls  s&   






rY  c                 C  s@   |  ddkrt|  dtr|| d v rt| d || d< | S )zM
    Process tool message to remove thought signature from tool_call_id.
    rR  toolrK  )r/  r   r  rO  )rP  rQ  r+   r+   r,   _process_tool_message_id  s   r[  messagesc                 C  sd   g }| D ]+}t |dr| }nt|tr| }n|| qt||}t||}|| q|S )zG
    Remove thought signatures from tool call IDs in all messages.
    rU  )rX  rU  r   rq   r>  r   rY  r[  )r\  rQ  processed_messagesmsgZmsg_dictr+   r+   r,   (_remove_thought_signatures_from_messages  s   





r_  original_functionc           0        s  t jdu r
td zbt  t|}d|v r|d nd }ttjt	 d}| }|
dd }	t|	d}
t|
dkr|
D ]Y t tr]t jjj d d d  d u s\t fd	d
t jD r]q; t jvrht j   t jvrst j   t jvr~t j   t jvrt j   t jvrt j  q;tdt j  tt jdkstt jdkstt jdkrttdkrt t!t jt j t j attjt	 d}| t|d tt jdkrg }t"t jD ]\} |# rt j$  || qt%|D ]}t j
| qtt jdkrcg }t"t jD ]@\} |# r+t j  || q dks5 dkrBt j  || q t j&v rSt trSt' d qt%|D ]	}t j
| qYtt jdkrg }t"t jD ])\} |# rt j  || qr t j&v rt trt' d qrt%|D ]	}t j
| qd }d }d }d }|(dd d urt|d t rg }t"|d D ].\} |# s߈ dks߈ dkr|d urt|t r|  n g}|| qt%|D ]
}|d 
| q|
d}|(dd d ur$t|d t r$|
d}t)r`zddl*m+} ||}W n t,y?   |}Y nw t j-rV|
dd  |
dd  |
dd  t)dd| dd d|v ri|d a.t|dkrt|d n|(dd }| }|t/j0j1ks|t/j2j1ks|t/j3j1krd }t|dkr|d }n|(dd r|d }ttjt	 d }|4 rt|t rt|dkrt|d t5rd!|d v rt6 }|D ]}|(d!d"}|d urt|tr|7| q|j8|9 |d# t|t rt|dkrz^dd$l:m;} dd%l<m=} |(d&}|s7|r7z|||d'\}}}}W n
 t,y6   Y nw t>||sdt?d( t@||}d|v rQ||d< nt|dkrdt |} || d< tA| }W n t,y }! ztd)t|!  W Y d }!~!nd }!~!ww n|t/jBj1ks|t/jCj1krt|dkr|d n|(dd }nv|t/jDj1ks|t/jEj1krt|dkr|d n|d }nW|t/jFj1ks|t/jGj1krt|dkr|d n|d }n8|t/jHj1ks|t/jIj1krt|dkr|d n|d }n|t/jJj1ks|t/jKj1kr|(d*}n|t/jLj1ks(|t/jMj1krUt|dkr3|d n|d+ }"tN }#|#jO|"d,}$d-|v rL|$|d- d.< nd.|$i|d-< |$}n|t/jPj1ksc|t/jQj1krj|(dd/}n|t/jRj1ksx|t/jSj1krt|dkr|d n|(dp|(dd0}n|t/jTj1ks|t/jUj1ks|t/jVj1ks|t/jWj1krzPdd1lXmY}% dd2lZm[}& t|dkr|d n|(d3}'t|dkr|d n|(dd"}(|'r|% })|)j\|(|'|(d4d5}*|*(dg }+|&|+pd0}nd0}W n! t,y }! zt?d6t|!  d0}W Y d }!~!nd }!~!ww d0}d7},t]||d8r)d},ttjt	 d9}-|- |||,|d: |(d;|pAd"||||||||d<}.d=d"i}/d-|v r[|d- |/d-< |.j^|d"i |/|(d>d d? |.|fW S  t,y }! zt_d@ |!d }!~!ww )ANTze`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs.rV  r   r2  )r<  r   r  c                 3  r  r  r  r"  r   r+   r,   r%    r&  z!function_setup.<locals>.<genexpr>z8Initialized litellm callbacks, Async Success Callbacks: r   )r   function_idZdynamodbZ	openmeterr	  r
  r  Zs3r  )safe_deep_copyr\  inputpromptzlitellm.llm_callzKeyword Args: r   )categorymessagelevelZ	logger_fnrA  r   r   content rd  rA  )r   )THOUGHT_SIGNATURE_SEPARATORrC  rI  zCRemoving thought signatures from tool call IDs for non-Gemini modelz6Error removing thought signatures from tool call IDs: queryfile)Zfile_objr,  file_checksumspeechzdefault-message-value)GoogleGenAIAdapter)get_last_user_messagecontentsconfig)rA  rs  rt  z0Error extracting messages from Google contents: Fr)  	call_typer   litellm_call_idlitellm_trace_id)rA  r\  streamrw  rx  rb  rv  
start_timedynamic_success_callbacksdynamic_failure_callbacksdynamic_async_success_callbacksdynamic_async_failure_callbacksr)  r0  api_basestream_options)rA  useroptional_paramslitellm_paramsr  zKlitellm.utils.py::function_setup() - [Non-Blocking] Error in function_setup)`r@   r   r   warningr   r3  r5  r6  r7  r8  popr@  lenr   r  r=   litellm_loggingr  r'  r  Zinput_callbackr   r  r  r  r  r  r  r  r  r   r   rW  set	enumerateis_async_callableZ_async_input_callbackreversedr  r  r/  add_breadcrumb'litellm.litellm_core_utils.core_helpersrc  r   Zturn_off_message_logginguser_logger_fnrL   
completionrl   acompletionanthropic_messagesZhas_pre_call_rulesrq   r	   writeZpre_call_rulesgetvalue1litellm.litellm_core_utils.get_llm_provider_logicr   Z3litellm.litellm_core_utils.prompt_templates.factoryrl  rJ  r   r_  tuple	embedding
aembeddingZimage_generationZaimage_generationZ
moderationamoderationatext_completiontext_completionZrerankarerankatranscriptionZtranscriptionrA   Zget_audio_file_content_hashaspeechrp  
aresponses	responsesZgenerate_contentZagenerate_contentgenerate_content_streamagenerate_content_streamZ,litellm.google_genai.adapters.transformationrq  8litellm.litellm_core_utils.prompt_templates.common_utilsrr  Z(translate_generate_content_to_completion_is_streaming_requestZupdate_environment_variables	exception)0r`  	rules_objrz  argsr)  r0  rb  Zget_coroutine_checker_fnZcoroutine_checkerr<  Zall_callbacksr   Zremoved_async_itemsindexr{  r}  r|  r~  rc  Zdetails_to_logrA  rv  r\  r   buffermri  r   rl  rC  _r]  Z	args_listeZ	_file_objr>   ro  rq  rr  Zcontents_paramZmodel_paramadapterZtransformedZtransformed_messagesry  r   logging_objr  r+   ra  r,   function_setup  s  




















"

	


&"""

 "




r  r  r   is_completion_with_fallbacksc                   sV   |du r)t d| j  ddlm} |j| j|||dd | j|||d d S d S )NFz>Async Wrapper: Completed Call, calling async_success_handler: r   )GLOBAL_LOGGING_WORKERresultrz  end_time)Zasync_coroutine)r   Zasync_success_handlerZ)litellm.litellm_core_utils.logging_workerr  Zensure_initialized_and_enqueue-handle_sync_success_callbacks_for_async_calls)r  r  rz  r  r  r  r+   r+   r,   _client_async_logging_helper  s"   
	
r  r  r   $Tuple[Optional[int], Dict[str, Any]]c                 C  sv   |  dd}|du rtj}|  ddr7ttjt d}ttjt d}|||  dd}| | d< |dur7|}|| fS )zm
    Get the number of retries from the kwargs and the retry policy.
    Used for the wrapper functions.
    num_retriesNretry_policyr   r   r  r  )r/  r@   r  r5  r6  r7  r8  )r)  r  r  r   r   Zretry_policy_num_retriesr+   r+   r,   _get_wrapper_num_retries  s    

r  *Optional[Union[float, int, httpx.Timeout]]c                 C  s&   t tttttjf  | 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  r+   r+   r,   _get_wrapper_timeout  s   r  c                 C  s   t tjt d}| | S )Nr   )r5  r6  r7  r8  r  )rl   r   r+   r+   r,   check_coroutine  s   r  rv  c                   sl   zt |}W n ty   d}Y nw |  }t }tjD ]}t||r3|||I dH }|dur3|}q|S )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)rL   
ValueErrorr>  r-   r@   r2  r   async_pre_call_deployment_hook)r)  rv  typed_call_typemodified_kwargsr(   r   r  r+   r+   r,   r    s"   


r  request_dataresponserw   Optional[CallTypes]Optional[Any]c                   sp   zt |}W n ty   d}Y nw t }tjD ]}t||r5|| tt||I dH }|dur5|  S q|S )z`
    Allow modifying / reviewing the response just after it's received from the deployment.
    N)	rL   r  r-   r@   r2  r   'async_post_call_success_deployment_hookr   rZ   )r  r  rv  r  r(   r   r  r+   r+   r,   r    s    


r  r  Optional[dict]c              
   C  sn  z&| d u r	W d S |j }|tjjks|tjjkrt| }|du r$W d S t| trt| j	dkr| j	d j
j}|d ur
|j||d |d urN|dnd }|d urV|ntj}	|	du rzG|d urd|v r|d d urd }
t|d tr|d dd ur|d }
ntj|d rt|d d}
|
d urtjjj|
d d |d	 W n	 ty   Y nw |d urd|v rt|d trd
|d v r|d d
 dkrd|d v rt|d d trd|d v r"|d d du r%tjjj|d d |d	 W d S W d S W d S W d S W d S W d S W d S W d S W d S W d S W d S W d S W d S W d S  ty6 } z|d }~ww )NTr   rk  enable_json_schema_validationresponse_formatZjson_schemar  schema)r  r  r!  Zjson_objectZresponse_schemaZenforce_validation)r8  rL   r  rl   r  r  r   r^   r  choicesrg  ri  Zpost_call_rulesr/  r@   r  rq   r   Z_completionsZis_basemodel_typer   r=   Zjson_validation_ruleZvalidate_schema	TypeErrorr   )original_responserA  r  r`  r  rv  is_coroutinemodel_responseZ_per_request_validationZ_enable_json_schema_validationZjson_response_formatr  r+   r+   r,   post_call_processing  s   




9r  c                   sj   t tjt d}| t  fdd}t  fdd}t tjt d}|  }|r3|S |S )Nr   c               
     s   j }t|r\tjd ur&|dpi dd }|d ur&tjt|kr&td | i |}t||drZd|v rX|d du rXg }t|D ]	\}}|	| qCtj
||dd dS |S |S t | | tj }d }|d	d }	d
|vr{tt |d
< t| dkr| d n|dd }
z|	d u rt j |g| R i |\}	}|	d usJ dt| |	|d	< t }| ||d}||	_| D ]\}}|d urt|tr|drt|||< qtjrtjtjkrttjtjdtjd ur|dpi dd }|d urtjt|krtdtd|dd dtj d|di dd  |dd d u r8tjd usA|dddu r|di dddur|dddur|dddur|dddur|dddur|dddur|dddur|dddurtd |j |
pd  |	|||| d!}|j!d urtd" |j!W S |d#d d ur8|
d ur8tj"du r8|t#j$j%ks|t#j&j%ks|t#j'j%kr8zB|
}|d$d d urd%|d$ }d }t| d&kr| d& }n|dd r|d }|d#}t( |
|||d d d'}||d#< W n ty7 } ztd(t|  W Y d }~nd }~ww  | i |}tj }t||drd|v rt|d du rtg }t|D ]
\}}|	| q]tj
||dd dW S t)t*j+t  d)}|||	|
|||d* |W S d|v r|d du r|W S d|v r|d du r|W S d|v r|d du r|W S d|v r|d du r|W S d+|v r|d+ du r|W S t,-|r|W S t.||
pd | d, |j/|| |d- t0d. t12 }t)t*j+t  d/}|3|j4|	j5||| t)t*j+t  d)}|||	|
|||d* |W S  tyj } z; j }|t#j&j%kr|d0d pAtj6pAd }|d1d rgt)t*j+t  d2}t)t*j+t  d3}|||d1d4}| |d1< d t_6|d5i }d6|dpxi v }|r|st|t7j8st|t7j9st|t7j:r||d0< tj;| i |W  Y d }~S nt|tj<j=r|r|
|v r|st| dkr||
 | d< n||
 |d<  | i |W  Y d }~S ns|t#j>j%krP|d0d ptj6pd }|d1d rt)t*j+t  d2}t)t*j+t  d3}|||d1d4}| |d1< d t_6d6|dp!i v }|rP|sPt|t7j8s>t|t7j9s>t|t7j:rP||d0< tj?| i |W  Y d }~S t@A }tj }|	rd|	B|||| |d }~ww )7Nr,  previous_modelszMax retries per request hit!ru  complete_responseTr\  r\  litellm_logging_objrw  r   rA  3logging_obj should not be None after function_setupr`  Zrequest_kwargsrz  zos.environ/Zcurrent_cost
max_budgetzSYNC kwargs[caching]: cachingF; litellm.cache: z#; kwargs.get('cache')['no-cache']: cachezno-cacher  r  r  aimg_generationr  r  
_arealtimezINSIDE CHECKING SYNC CACHErj  rA  r`  r  rz  rv  r)  r  z
Cache hit!
max_tokenshf_model_namehuggingface/r   rA  
base_modelr\  user_max_tokensZ
buffer_numZbuffer_perc&Error while checking max token limit: r   r  r  rA  r)  rz  r  r  r  rA  r  r`  r  )r  r  r)  z0Wrapper: Completed Call, calling success_handlerr   r  r  r   r   r  context_window_fallback_dictmodel_group)Cr8  _is_async_requestr@   Znum_retries_per_requestr/  r  r   r  r  r   stream_chunk_builderprint_args_passed_to_litellmdatetimenowr  r   uuid4r  r;  r;   _llm_caching_handlerr9  r   
startswithr   r  _current_costr   r   r  r   r   Z_sync_get_cachecached_resultmodify_paramsrL   r  rl   r  r  r   r5  r6  r7  asyncior   r  Zsync_set_cacher   contextvarscopy_contextsubmitrunZsuccess_handlerr  openair   r   r   Zcompletion_with_retries
exceptionsr   r  Zresponses_with_retries	traceback
format_excfailure_handler)r  r)  rv  r  r  chunksidxchunkrz  r  rA  r9   r  kvZcaching_handler_responser  r\  r  modified_max_tokensr  r  r   ctxr   r  r   r   r  _is_litellm_router_calltraceback_exceptionr`  r  r+   r,   wrapper  sN  

 


.







	













zclient.<locals>.wrapperc                    s  t  | | tj }d }ttjt d}|dd }t }| ||d} j}d|vr5t	t
 |d< t| dkr?| d n|dd }	|dd u}
z|d u rbt j|g| R i |\}}|d usjJ dt||I d H }|d urx|}||d< t| ||_tjrtjtjkrttjtjd	t rtd
|dd dtj d|dd   |j|	pd ||||| dI d H }|d ur|jd ur|jd u r|jW S |jdu r|jW S |dd d ura|	d uratjdu ra|tjjks|tj jks|tj!jkrazB|	}|dd d urd|d }d }t| dkr$| d }n|dd r/|d }|d}t" |	|||d d d}||d< W n t#y` } ztdt	|  W Y d }~nd }~ww  | i |I d H }tj }t$||drd|v r|d du rg }t%|D ]
\}}|&| qtj'||dd dW S ||||	|||d |W S |tj(jkr|W S t)||	| d t*|}|d urt+|||dI d H }|j,| || d I d H  t-.t/|||||
d! |j0|||d" t1|t2r|d ur|jd ur|j3||||d#W S ||||	|||d |W S  t#yu } zLt45 }tj }|rhz
|6|||| W n t#yJ } z|d }~ww z|7||||I d H  W n t#yg } z|d }~ww  j}t8||d$\}}|tjjkr|d%i }d&|d'pi v }|r|sz4d t_9||d(<  |d)< t1|t:j;rd*|d+< nt1|t:j<rd,|d+< tj=| i |I d H W W  Y d }~S  t#y   Y nw t1|tj>j?r|r|	|v r|st| dkr||	 | d< n||	 |d<  | i |I d H W  Y d }~S nV|tj@jkr]d&|d'pi v }|r]|s]z4d t_9||d(<  |d)< t1|t:j;r6d*|d+< nt1|t:j<rAd,|d+< tjA| i |I d H W W  Y d }~S  t#y\   Y nw tB|d(| tC||d$}tB|d-| |d }~ww ).Nr   r  r  rw  r   rA  Z	fallbacksr  r  zASYNC kwargs[caching]: r  Fr  z; kwargs.get('cache'): r  rj  r  Tr  r  r  r   r\  r  r  ru  r  r  r  r  )r  r  rv  )r  r`  r)  r  )r  r  rz  r  r  r  )_caching_handler_responseZembedding_responserz  r  )r)  r  r  r  r,  r  r`  Zexponential_backoff_retryZretry_strategyZconstant_retryr  )Dr  r  r  r5  r6  r7  r8  r/  r;   r  r   r  r  r  r  r;  r  r@   r  r  r   r   r   r  Z_async_get_cacher  Zfinal_embedding_cached_responseZ embedding_all_elements_cache_hitr  rL   r  rl   r  r  r   r   r  r  r   r  Z	arealtimer  rr   r  Zasync_set_cacher  create_taskr  r  r   rU   Z2_combine_cached_embedding_response_with_api_resultr  r  r  Zasync_failure_handlerr  r  r  r   r   Zacompletion_with_retriesr   r   r  Zaresponses_with_retriessetattrr  )r  r)  rz  r  Z_update_response_metadatar  r9   r  rv  rA  r  r  r  r  r\  r  r	  r  r  r  r  r  Z_call_type_enumr  r  r  r  r  r  r+   r,   wrapper_async  s  

 

&









	
	

$
 
$zclient.<locals>.wrapper_asyncr   )r5  r6  r7  r8  r   r  )r`  r   r  r  r   r  r+   r  r,   client  s     a  *r  is_pass_throughc                 C  s   | du rdS |  dddu sZ|  dddu sZ|  dddu sZ|  dddu sZ|  dddu sZ|  d	ddu sZ|  d
ddu sZ|  dddu sZ|  dddu sZ|  dddu sZ|du r\dS dS )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.
    NFr  Tr  r  r  r  r  r  r  Zacreate_batchZacreate_fine_tuning_jobr.  )r)  r  r+   r+   r,   r    s   r  Union[CallTypes, str]c                 C  s    d| v r| d du rdS |t v S )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)
    ry  T)_STREAMING_CALL_TYPESru  r+   r+   r,   r  A  s   
r  custom_tokenizer$Optional[CustomHuggingfaceTokenizer]c                 C  s0   |d urt |d |d |d d}|S t| dS )N
identifierrevision
auth_token)r  r  r  rA  )create_pretrained_tokenizer_select_tokenizer_helper)rA  r  Z
_tokenizerr+   r+   r,   _select_tokenizerP  s   
r  )maxsizerd   c              
   C  sn   t jdu r	t| S zt| }|d ur|W S W t| S  ty6 } ztd|  W Y d }~t| S d }~ww )NTzError selecting tokenizer: )r@   Zdisable_hf_tokenizer_download_return_openai_tokenizer_return_huggingface_tokenizerr   r   r   )rA  r  r  r+   r+   r,   r  ]  s   
r  c                 C  s   dt  dS )NZopenai_tokenizerr!  	tokenizer)r   r  r+   r+   r,   r!  m     r!  !Optional[SelectTokenizerResponse]c                 C  s   | t jv rd| v rtd}d|dS | t jv r&d| vr&tt}d|dS d|  v s2d|  v r<td}d|dS d	|  v rLtd
}d|dS d S )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_strrH  )rA  Zcohere_tokenizerZclaude_tokenizerr$  r+   r+   r,   r"  q  s   






r"  rj  c                 C  sR   |pt | d}t|d tr|d j|dd}n|d |}t|dr'|jS |S )a  
    Encodes the given text using the specified model.

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

    Returns:
        enc: The encoded text.
    r  r$  r+   )Zdisallowed_specialids)r  r   r   encoderX  r.  )rA  textr  tokenizer_jsonencr+   r+   r,   r/    s   
r/  tokens	List[int]c                 C  s    |pt | d}|d |}|S )Nr  r$  )r  decode)rA  r3  r  r1  decr+   r+   r,   r5    s   r5  mainr  r  c              
   C  sd   z
t j| ||d}W n" ty, } ztd| d t j| |d}W Y d}~nd}~ww d|dS )a  
    Creates a tokenizer from an existing file on a HuggingFace repository to be used with `token_counter`.

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

    Returns:
    dict: A dictionary with the tokenizer and its type.
    )r  r  z%Error creating pretrained tokenizer: z-. Defaulting to version without 'auth_token'.)r  Nr'  r#  )r   r*  r   r   r   )r  r  r  r$  r  r+   r+   r,   r    s   


r  jsonc                 C  s   t | }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   r,  )r8  r$  r+   r+   r,   create_tokenizer  s   

r9  .Optional[Union[dict, SelectTokenizerResponse]]r0  Optional[Union[str, List[str]]]Optional[List]count_response_tokensOptional[bool]tools'Optional[List[ChatCompletionToolParam]]tool_choice,Optional[ChatCompletionNamedToolChoiceParam]use_default_image_token_countdefault_token_countOptional[int]r  c	           	   
   C  s(   t jdu rdS t | ||||||||	S )zh
    The same as `litellm.litellm_core_utils.token_counter`.

    Kept for backwards compatibility.
    Tr   )r@   Zdisable_token_counterr   )	rA  r  r0  r\  r=  r?  rA  rC  rD  r+   r+   r,   token_counter  s   
rF  c                 C  s   g d}| |v r
dS dS )zU
    Helper function to know if a provider implementation supports httpx timeout
    )r  azurebedrockTFr+   )rC  Zsupported_providersr+   r+   r,   supports_httpx_timeout  s   rI  c                 C     t | |d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rA  rC  r:  _supports_factoryrI  r+   r+   r,   rK  	  
   rK  c                 C  rJ  )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_searchrL  rM  rI  r+   r+   r,   rP  	  rO  rP  c                 C  rJ  )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_contextrL  rM  rI  r+   r+   r,   rQ  -	  rO  rQ  c                 C  s   z t j| |d\} }}}t| |d}|dd}|du rd}|W S  tyC } ztd|  d| dt|  W Y d}~dS d}~w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.
    rI  supports_native_streamingTNzYModel not found or error in checking supports_native_streaming support. You passed model=, custom_llm_provider=	. Error: F)r@   r   _get_model_info_helperr/  r   r   r   r  )rA  rC  r  
model_inforR  r  r+   r+   r,   rR  B	  s$   rR  c                 C  s   zt tjt d}|| |d\} }}}W n# ty7 } ztd|  d| dt|  W Y d}~dS d}~ww tj	j
tj	jtj	jtj	jtj	jg}||v rOdS t| |d	d
S )ak  
    Check if the given model + provider supports 'response_schema' as a param.

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

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

    Does not raise error. Defaults to 'False'. Outputs logging.error.
    r   rI  zOModel not found or error in checking response schema support. You passed model=rS  rT  NFTsupports_response_schemarL  )r5  r6  r7  r8  r   r   r   r  r@   rX   	PREDIBASEFIREWORKS_AI	LM_STUDIONEBIUS
DATABRICKSrN  )rA  rC  r   r  r  Z*PROVIDERS_GLOBALLY_SUPPORT_RESPONSE_SCHEMAr+   r+   r,   rW  c	  s2   rW  c                 C  rJ  )z[
    Check if the given model supports parallel tool calls and return a boolean value.
    "supports_parallel_function_callingrL  rM  rI  r+   r+   r,   r]  	  
   r]  c                 C  rJ  )  
    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_callingrL  rM  rI  r+   r+   r,   r`  	  
   r`  c                 C  rJ  )zU
    Check if the given model supports `tool_choice` and return a boolean value.
    supports_tool_choicerL  rM  rI  r+   r+   r,   rb  	     rb  r:  Optional[Literal[True]]c                 C  s,   t | |d}|dur||ddu rdS dS )zf
    Check if the given model supports a provider specific model info and return a boolean value.
    rI  NFT)get_provider_infor/  )rA  rC  r:  provider_infor+   r+   r,   _supports_provider_info_factory	  s   rg  c           	      C  s  zNt j| |d\} }}}t| |d}||ddu rW dS ||du rLt| }|dur?t j|p3i }||ddu r?W dS t| ||}|durL|W S W dS  ty } z,t	d| d|  d| dt
|  t| ||}|dur{|W  Y d}~S W Y d}~dS d}~ww )	r_  rI  FTNz%Model not found or error in checking z support. You passed model=rS  rT  )r@   r   rU  r/  _get_model_cost_key
model_costrg  r   r   r   r  )	rA  rC  r:  r  rV  Zbare_model_keyZ
bare_entryZsupported_by_providerr  r+   r+   r,   rN  	  sB   rN  c                 C  rJ  )zECheck if a given model supports audio input in a chat completion callsupports_audio_inputrL  rM  rI  r+   r+   r,   rj  
     rj  c                 C  rJ  )zCCheck if a given model supports pdf input in a chat completion callsupports_pdf_inputrL  rM  rI  r+   r+   r,   rl  
  rk  rl  c                 C  rJ  )zFCheck if a given model supports audio output in a chat completion callrj  rL  rM  rI  r+   r+   r,   supports_audio_output
  rc  rm  c                 C  rJ  )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_cachingrL  rM  rI  r+   r+   r,   rn  
  ra  rn  c                 C  rJ  )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_userL  rM  rI  r+   r+   r,   ro  4
  ra  ro  c                 C  rJ  )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_visionrL  rM  rI  r+   r+   r,   rp  K
  s
   rp  c                 C  rJ  )zQ
    Check if the given model supports reasoning and return a boolean value.
    supports_reasoningrL  rM  rI  r+   r+   r,   rq  ]
  rc  rq  c                 C  s   z<t j| |d\} }}}t| |d}|d}|du rW dS t j|i }|dd}|du r2W dS t|tr:|W S W dS  ty_ } zt	d|  d| dt
|  W Y d}~dS d}~w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.
    rI  r:  Nsupported_regionszQModel not found or error in checking supported_regions support. You passed model=rS  rT  )r@   r   rU  r/  ri  r   rW  r   r   r   r  )rA  rC  r  rV  Z	model_keyZmodel_cost_datarr  r  r+   r+   r,   get_supported_regionsf
  s0   


rs  c                 C  rJ  )z]
    Check if the given model supports embedding image input and return a boolean value.
    supports_embedding_image_inputrL  rM  rI  r+   r+   r,   rt  
  r^  rt  existing_dictry   new_dictc                 C  sz   |  D ]6\}}|d ur:t|trt|| |< qt|tr6| |}t|tr1|| || |< q|| |< q|| |< q| S r  )r9  r   r  _convert_stringified_numbersrq   r/  update)ru  rv  r  r  Zexisting_nested_dictr+   r+   r,   _update_dictionary
  s   






ry  c              	   C  sR   t | tr'zd|  v sd| v rt| W S t| W S  ttfy&   |  Y S w | S )zYConvert stringified numbers (including scientific notation) to appropriate numeric types.r  .)r   r  rH  r  r  r  r  rk   r+   r+   r,   rw  
  s   


rw  ri  Union[str, dict]c           
   	     sz  i }t | tr
| }nt | trtj| d}tjjtjjh}|	 D ]\}}|
dd}t| ||v s?t fdd|D rItj
|i }|}nzttt|d}|d }W n tyd   i }|}Y nw t||}tj|i | t  td| d	|  |
dd
kr|tjvrtj| q!|
ddkr|tjvrtj| q!|
ddkr|tjvrtj| q!|
ddkr|tjvrtj| q!|
ddkr|dd}	|	d tjvrtj|	d  q!|
ddkr|tjvrtj| q!|
ddkr|tjvrtj| q!|
ddkr(|tjvr'tj| q!|
ddkr=|tj vr<tj | q!|
ddkrR|tj!vrQtj!| q!|
ddkrg|tj"vrftj"| q!|
ddkr||tj#vr{tj#| q!|
ddkr|tj$vrtj$| q!|
ddkr|tj%vrtj%| q!|
ddkr|tj&vrtj&| q!| S )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"
        },
    }
    urllitellm_providerrj  c                 3  s     | ]}  | d V  qdS )/Nr  rm   pZ_key_strr+   r,   r%  
  s    
z!register_model.<locals>.<genexpr>r  r:  zadded/updated model=z in litellm.model_cost: r  text-completion-openaicohere	anthropic
openrouterr  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_alpharH  novita)'r   rq   r  r@   Zget_model_cost_maprX   GITHUB_COPILOTrl   CHATGPTr9  r/  r'  ri  r   get_model_infor   ry  
setdefaultrx  $_invalidate_model_cost_lowercase_mapr   r   open_ai_chat_completion_modelsaddopen_ai_text_completion_modelsr)  r+  rN  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_modelsZbedrock_modelsnovita_models)
ri  Zloaded_model_costZ_skip_get_model_info_providersr:  rl   r   Zexisting_modelZmodel_cost_keyZupdated_dictionaryZsplit_stringr+   r  r,   register_model
  s   







r  c                 C  s"   |d urt |tr| |v rdS dS NTF)r   rW  r  additional_drop_paramsr+   r+   r,   _should_drop_param-  s   r  passed_paramsdefault_paramsr  Optional[list]c                 C  sF   i }|   D ]\}}||v r ||| kr t||ddu r |||< q|S )Nr  F)r9  r  )r  r  r  non_default_paramsr  r  r+   r+   r,   _get_non_default_params8  s   
r  languagere  r  temperaturetimestamp_granularities*Optional[List[Literal['word', 'segment']]]drop_paramsc              	     s^  ddl m}	 t }
|
d |
d |
d|
d}| D ]\}}||
|< q!d d d d d dfdd	|
 D i } fd
d}d } d urVtj| t d} dks^ dkra}n? dkrt	 
 }||d t	 j|| d ur}ndd}n|d ur|j| d}||d |j|| d urndd}t||
 |	|dd d}|S )Nr   OPENAI_TRANSCRIPTION_PARAMSr  rC  r  r)  )r  re  r  r  r  c                   s*   i | ]\}}| v r| | kr||qS r+   r+   rm   r  r  r  r+   r,   ro   g  s
    z5get_optional_params_transcription.<locals>.<dictcomp>c                   sr   t  dkr7t }|D ]$}du stjdu r&|| vr&|d  q|| vr4tdd  ddqS d S )Nr   T  z1Setting user/encoding format is not supported by =. To drop it from the call, set `litellm.drop_params = True`.status_coderg  r  keysrW  r@   r  r  r   supported_paramsr  r  )rC  r  r  r+   r,   _check_valid_argo  s   
z;get_optional_params_transcription.<locals>._check_valid_argrA  r   r  rG  groqr  Fr  r  rA  r  r  r  r  r  rC  openai_paramsr  )litellm.constantsr  localsr  r9  ProviderConfigManager'get_provider_audio_transcription_configrX   r@   ZGroqSTTConfigZget_supported_openai_params_sttZmap_openai_params_sttr   map_openai_params/add_provider_specific_params_to_optional_paramsr/  )rA  rC  r  re  r  r  r  r  r)  r  r  special_paramsr  r  r  r  provider_configr  r+   )rC  r  r  r  r,   !get_optional_params_transcriptionH  sj   








r  sizec                 C  s(   | du rdS dddddd}| | dS )z3Map OpenAI size parameter to Vertex AI aspectRatio.Nz1:1z16:9z9:16)Z256x256Z512x512Z	1024x1024Z	1792x1024Z	1024x1792r.  )r  Zsize_to_aspect_ratior+   r+   r,   *_map_openai_size_to_vertex_ai_aspect_ratio  s   r  nqualitystyler  r  #Optional[BaseImageGenerationConfig]c                   s&  t  dd d dd }	dd dd }d}| D ]-\}}|dr; dkr; d	kr;q)|d
krD d	krDq)|drR dkrR dkrRq)||< q)d d d d d d d}t||di } fdd}|	d ur|	jp|dd}||d |	j|pdd urndd}nP dks dks tjv r}n@ dkrtj	j
d}|jd}||d |ji d}n" dkrddg}	 ||d |d urt||d< |d urt||d< t| }|	d ur|	jpdd}t|}t| pd||d}dd  | D }|S )!NrA  rC  r  r  r  r)  aws_rH  	sagemakerr  vertex_rE  rF  )r  r  r  r  r  r  )r  r  r  c              
     s   t  dkrCt }|D ]0}tjdu sdu r,|| vr,|d  |d  q|| vr@tdd| d  d ddqS d S )	Nr   Tr  z	Setting `z` is not supported by , r  r  r  r  rC  r  rA  r  r  r+   r,   r    s   z7get_optional_params_image_gen.<locals>._check_valid_argrj  r  r  Fr  r  rG  r  r  r  r  ZsampleCountZaspectRatior  c                 S  s8   i | ]\}}|d urt |ttfrt|dkr||qS Nr   )r   rq   rW  r  r  r+   r+   r,   ro   4  s
    "z1get_optional_params_image_gen.<locals>.<dictcomp>)r  r  r9  r  r  r   r  r@   openai_compatible_providersZBedrockImageGenerationZget_config_classr  r  rW  r  r  )rA  r  r  r  r  r  r  rC  r  r  r  r)  r  r  r  r  r  r  r  config_classr  r+   r  r,   get_optional_params_image_gen  s   



	



r  encoding_format
dimensionsallowed_openai_paramsc              	     s,  t tjt d}	t }
|
dd  |
d}|
dd |
dd }|
dd p)g }|
dd  d= fd	d
}tj|
| |dd }i } d ur\ tj	
 v r\tjt d}|d ur||jd}||d |ji d urvndd}n dkrd urdvrd v rd|pg vrtddd}nш dkr|	 dd}||d t ji d urndd}n dkr|	pdddd}||d t ji d}n dkr|	pdddd}||d tjji |d}nt dks d kr|	ddd}||d t ji |d\}}nP d!kr:t  }||d t ji d}n5 d"krd#v rIt }nKd$v rSt }nAd%v r]t }n7d&v sgd'v rlt }n(d(v svd)v r{t }nd* v rt }ng }||d i |}|S | }||d |ji d}nɈ d+kr|	d+dd}||d t ji d}n d,kr|	d,dd}||d t ji d urndd}n d-kr,|	d-dd}||d tj !rt  ji d urndd}nt" ji d ur ndd}i ||}|S  d.krQ|	d.dd}||d t# ji d urKndd}n d/kr||	d/dd}||d t$ ji d urpndd}i ||}|S  d0kr|	d0dd}||d t% ji d1}n׈ d2kr|	d2dd}||d t& ji d urndd}n d3kr|	d3dd}||d t' ji d urۈndd}n d4kr&dv rd|d< t( d5kr%tj)d6u sd6u rt* }|D ]	}|d  qnWtdd7 d8  d9dnI dkrm d:krm tj+vrmt( d5krjtj)d6u sJd6u r]t* }|D ]	}|d  qRntdd7 d8  d9d}n}t,||
 t*t- |.dd d;}d<|v rt(|d< d5kr|d<d  |S )>Nr   rC  r)  r  r  r  r  r  c                   sv   | d u rd S i }  D ]}|| vr| ||< q|r9tjdu s(d ur*du r*d S td  d| d ddd S )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  Zunsupported_paramsr  rC  r  rA  r  r+   r,   r  X  s    
z8get_optional_params_embeddings.<locals>._check_valid_arg)r  r  rC  r  rA  r  r  r  Fr  r  ztext-embedding-3r  r  zSetting dimensions is not supported for OpenAI `text-embedding-3` and later models. To drop it from the call, set `litellm.drop_params = True`.r  tritonZ
embeddings)rA  rC  Zrequest_type
databricksrj  r  
nvidia_nim)r  r  r)  rE  rD  Z	lm_studiorH  zamazon.titan-embed-text-v1zamazon.titan-embed-image-v1zamazon.titan-embed-text-v2:0zcohere.embed-multilingual-v3zcohere.embed-v4Z
twelvelabsZmarengoZnovamistralZjina_aivoyageZsapinfinityfireworks_ai)r  r  rA  Z	sambanovaZovhcloudollamar   TzSetting z is not supported by r  rG  r  
extra_body)r  r  )/r5  r6  r7  r8  r  r  PreProcessNonDefaultParams(embedding_pre_process_non_default_paramsrX   _member_map_valuesr  get_provider_embedding_configr   r  r  r   r@   TritonEmbeddingConfigZDatabricksEmbeddingConfigZnvidiaNimEmbeddingConfigZVertexAITextEmbeddingConfigZLmStudioEmbeddingConfigZAmazonTitanG1ConfigZ&AmazonTitanMultimodalEmbeddingG1ConfigZAmazonTitanV2ConfigZBedrockCohereEmbeddingConfigZ TwelveLabsMarengoEmbeddingConfigrH  ZAmazonNovaEmbeddingConfigZMistralEmbeddingConfigJinaAIEmbeddingConfigVoyageContextualEmbeddingConfigis_contextualized_embeddingsVoyageEmbeddingConfigGenAIHubEmbeddingConfigInfinityEmbeddingConfigZFireworksAIEmbeddingConfigSambaNovaEmbeddingConfigOVHCloudEmbeddingConfigr  r  rW  r  r  r   r/  )rA  r  r  r  rC  r  r  r  r)  r   r  r  r  r  r  r  objectZfinal_paramsr  r  r+   r  r,   get_optional_params_embeddings<  s   




































	
















r  c                 C  sb   t | tr!d| v r| d du r| d= |  D ]\}}t| q| S t | tr/| D ]}t| q(| 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   rq   r9  _remove_additional_propertiesrW  r  r:  rl   itemr+   r+   r,   r    s   



r  c                 C  sV   t | trd| v r| d= |  D ]\}}t| q| S t | tr)| D ]}t| q"| S )zy
    Relevant Issues: https://github.com/BerriAI/litellm/issues/6136, https://github.com/BerriAI/litellm/issues/6088
    strict)r   rq   r9  _remove_strict_from_schemarW  r  r+   r+   r,   r     s   



r   
   c                 C  sx   |dkr| S t | tr)| dd | dd |  D ]\}}t||d  q| S t | tr:| D ]	}t||d  q0| 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   rq   r  r9  _remove_json_schema_refsrW  )r  	max_depthr:  rl   r  r+   r+   r,   r    s   

r  r  supported_openai_paramsc                 C  sJ   g }|du ri S |   D ]}||vr|| q|D ]}| |d q| S )z;
    Remove unsupported params from non_default_params
    N)r  r   r  )r  r  remove_keysparamr:  r+   r+   r,   _remove_unsupported_params  s   
r  c                 C     dd |   D S )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"}
    c                 S  s   i | ]\}}|t vr||qS r+   )rj   rm   r:  rl   r+   r+   r,   ro         z-filter_out_litellm_params.<locals>.<dictcomp>r9  )r)  r+   r+   r,   filter_out_litellm_params  s   r  c                   @  s.   e Zd ZedddZe		ddddZdS )r  r  rq   r  rC  r  r  r   default_param_values#additional_endpoint_specific_paramsr+  r  c           	        s   |  D ].\}}|dr|dkr|dsq|dkr |dkr q|dr.|dkr.|dkr.q|| |< q fdd	|   D }|S )
Nr  rH  r  r  r  rE  rF  c                   sr   i | ]5\}}|d kr7|dkr7|dkr7|dkr7|dkr7|dkr7|vr7|v r7|| kr7t | ddu r||qS )rA  rC  api_versionr  r  r  r  F)r  r  r  r  r  r+   r,   ro   !  s$    zRPreProcessNonDefaultParams.base_pre_process_non_default_params.<locals>.<dictcomp>)r9  r  )	r  r  rC  r  r  r  r  r  r  r+   r  r,   #base_pre_process_non_default_params  s$   	

z>PreProcessNonDefaultParams.base_pre_process_non_default_paramsFrA  remove_sensitive_keysr   add_provider_specific_paramsc                 C  s&   t j| |||dd tD dgd}|S )Nc                 S  s   i | ]}|d qS r  r+   rm   r  r+   r+   r,   ro   G  s    zWPreProcessNonDefaultParams.embedding_pre_process_non_default_params.<locals>.<dictcomp>rd  r  r  rC  r  r  r  )r  r  r$   )r  r  rC  r  rA  r  r  r  r+   r+   r,   r  7  s   zCPreProcessNonDefaultParams.embedding_pre_process_non_default_paramsN)r  rq   r  rq   rC  r  r  r   r  rq   r  r+  r  rq   )FF)r  rq   r  rq   rC  r  r  r   rA  r  r  r   r  r   r  rq   )r8  
__module____qualname__staticmethodr  r  r+   r+   r+   r,   r    s    /r  r  r  r  Optional[BaseConfig]c                 C  s   t j| |||tdgd}d|v r(|dur|j|d d|d< n	t|d d|d< d|v rct|trc|d }	|	D ]+}
|
di }|dd}|durbt	|}d	|v r^|d	 d
u r^|
d	d ||d< q7|rrt|| |tt |d}|rxt|}|S )zA
    Pre-process non-default params to a standardized format
    r\  r  r  Nr  r?  function
parametersr  Fr  )r  r  r   Z$get_json_schema_from_pydantic_objectr   r   rW  r/  r>  deepcopyr  r  r  remove_sensitive_keys_from_dict)r  r  rC  r  rA  r  r  r  r  r?  rZ  Ztool_functionr  Znew_parametersr+   r+   r,   pre_process_non_default_paramsO  sX   	



r  dc                   sR   g d}g }|   D ] t fdd|D r|  q
|D ] |   q| S )z1
    Remove sensitive keys from a dictionary
    )r:  secretaccessZ
credentialc                 3  s    | ]	}|   v V  qd S r  rG  )rm   phraser:  r+   r,   r%        z2remove_sensitive_keys_from_dict.<locals>.<genexpr>)r  r'  r   r  )r  Zsensitive_key_phrasesr  r+   r#  r,   r    s   
r  c                 C  s   i }t j}||d v rG	 |dkrt  j| |d}n-|dkr(t  j| |d}n|dks0|dkr:t  j| |d}n|dkrGt  j| |d}d|v sSd	|v sSd
|v r|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|dkr|t jvr|dkrd |d!< d"t _d
|v r|	d
|d#< |	d$d% |S d|v r|	d|d#< |S t jr|	d
|	dd%|d#< |S t
d&d'| d(d)|S )*z-For .completion(), preprocess optional params	providersrG  r  rH  rE  rF  watsonx	functionsfunction_callr?  r  r  anyscaletogether_air  r  cerebrasxai	ai21_chat
volcenginedeepseek	codestralr  r  cohere_chatr  ollama_chatr  r  nebiuswandbr8  formatTZfunctions_unsupported_modelrA  Nr  z%Function calling is not supported by rz  r  )r@   Z!common_cloud_provider_auth_paramsAzureOpenAIConfigZmap_special_auth_paramsAmazonBedrockGlobalConfigVertexAIConfigIBMWatsonXAIConfigr  Zadd_function_to_promptr  r   )r  r  rC  r  Zcommon_auth_dictr+   r+   r,   pre_process_optional_params  s   
	
r:   Optional[List[AllMessageValues]]thinking Optional[AnthropicThinkingParam]web_search_options Optional[OpenAIWebSearchOptions]safety_identifierc&           4        s  t   d}'d }( d ur" dd tD v r"tjt d}(t|' |!|(dt d})dM fd	d
}*tt	j
t d}+|+ d},|,d u rW|+dd},|,pZg },|p^g }|,| |*|,phg d  dkrt j|)d urttrndd})n dkrt j|)d urttrndd})t j|)d urttrndd})n dks dkrt j|)d urttrӈndd})n dkrt j|)d urndd})n dkrt j|)d ur	ttr	ndd})n dkr.t j|)d ur(ttr(ndd})nm dkrMt j|)d urGttrGndd})nN dkrlt j|)d urfttrfndd})n/ dkrt j|)d urttrndd})n dkrΈtjv stjv stjv stjv stjv stjv rt  j|)d urttrȈndd})n͈ dkrt! j|)d urttrndd})n dks dkrdv rt  j|)d urttrndd})ntj"j# dr9t" j|)d ur3ttr3ndd})nb dkrԈtj$v r}dv rct% j|)d ur]ttr]ndd})n8t& j|)d urwttrwndd})ntj'v rt( j|)d urttrndd})n|(d ur|(j|)d urttrndd})nt) j|)d urttrΈndd})nǈ d krt* j|)d urttrndd})n d!krtt	j
t d"}-|-+}.|-,}/|.d#ks|.d$kr.t- j|)d ur(ttr(ndd})nm|.dkrMt. j|)d urGttrGndd})nNd|/v r|.d%kr|/tj/0 v ryt/ j|)d ursttrsndd})n"t1 j|)d urttrndd})n|(d ur|(j|)d urttrndd})n d&krt2 j|)d urttrɈndd})n̈ d'krt3 j|)d urttrndd})n d(krt4 j|)d urttrndd})n d)kr,t5 j|)d ur&ttr&ndd})no d*krKt6 j|)d urEttrEndd})nP d+krjt7 j|)d urdttrdndd})n1 d,kr|(d ur|(j|)d urttrndd})n d-ks dkrt& j|)d urttrndd})n d.krt% j|)d urttrɈndd})n̈ d/krt8 j|)d urttrndd})n d0krt9 j|)d urttrndd})n d1kr,t: j|)d ur&ttr&ndd})no d2kr=t; j|)d3})n^ d4ksG d5krat< j|)d ur[ttr[ndd})n: d6krt= j|)d urzttrzndd})n d7krt> j|)d urttrndd})n d8krt? j|)d urttrndd})n݈ d9krt@ j|)d urttr׈ndd})n d:krtA j|)d urttrndd})n d;krtB j|)d urttrndd})n d<kr:tC j|)d ur4ttr4ndd})na d=krYtD j|)d urSttrSndd})nB d>krtE j|)d urrttrrndd})F D ]}0tG H|0rtId?|0 qzn d@krtG j|)d urttrndd})n dkrtJ j|)d urttrƈndd})nЈ dAkrtK j|)d urttrndd})n dBkrgtL jMdCrtL j|)d urttrndd})ntjNjOdCr1tN j|)d ur,ttr,ndd})njtPQdDR|tjStTdE |pLtjSpLtTdEpLtjU}tV j|)|d urbttrbnddF})n4|(d ur|(j|)d ur~ttr~ndd})ntW j|)d urttrndd})tX|) tYtZF |!dG})t[dH|)  t\|)|dI})|!rtt	j
t dJtt	j
t dK}1fdLd|!D }2|2D ]}3|1|)|3})q|)S )NNr)  c                 S  s   g | ]}|j qS r+   rk   )rm   r   r+   r+   r,   
<listcomp>4  s    z'get_optional_params.<locals>.<listcomp>r  )r  r  rC  r  rA  r  )r  r  rC  r  r+  c                   s  t d d   t d  t d  i } D ]'}|| vrH|dks3|dks3|dkr4q!|dkr=d	kr=q!|d
krBq!| ||< q!|rtjdu sXdurgdu rg| D ]}|d q\dS td  dt|  d dt|  dddS )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() r  r  ry  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   rW  r  )rC  r  rA  r  r  r  r+   r,   r  H  s>   
*z-get_optional_params.<locals>._check_valid_argr   rI  r  r  r  F)rA  r  r  r  anthropic_textr1  r  r  r  Zmaritalkr(  Z	predibasehuggingfacer*  rE  rD  rF  r0  r  rH  r   ZconverseZconverse_likeZinvoke
cloudflarer  r2  r  Zpetals	deepinfra
perplexityr  text-completion-codestralr  r  r+  r,  )rA  r  r  r-  r  r  r.  Zhosted_vllmZvllmr  Zbedrock_mantler/  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: Zwatsonx_textr3  rG  r  zoAzure optional params - api_version: api_version={}, litellm.api_version={}, os.environ['AZURE_API_VERSION']={}AZURE_API_VERSION)r  r  rA  r  r  r  z Final returned optional params: )r  r  r  r   r   c                   s   g | ]} |r|qS r+   r+   r  )r   r+   r,   rA  ,      )r  r+  )]r  r>  r  rX   r  get_provider_chat_configr  r:  r5  r6  r7  r8  r?  r@   AnthropicConfigr  r   r   AnthropicTextConfigCohereChatConfigTritonConfigMaritalkConfigReplicateConfigPredibaseConfigHuggingFaceChatConfigTogetherAIConfigr  r  r  r  Zvertex_language_modelsZvertex_vision_modelsVertexGeminiConfigGoogleAIStudioGeminiConfigVertexAIAnthropicConfigZis_supported_modelvertex_mistral_modelsCodestralTextCompletionConfigMistralConfigvertex_ai_ai21_modelsVertexAIAi21ConfigVertexAILlama3ConfigSagemakerConfigZget_bedrock_routeget_base_modelZAmazonConverseConfigZAmazonBedrockOpenAIConfigZAmazonAnthropicConfigZ get_legacy_anthropic_model_namesZAmazonAnthropicClaudeConfigCloudflareChatConfigOllamaConfigOllamaChatConfigNLPCloudConfigPetalsConfigDeepInfraConfigDatabricksConfigNvidiaNimConfigCerebrasConfigXAIChatConfigAI21ChatConfigFireworksAIConfigVolcEngineConfigHostedVLLMChatConfig
VLLMConfigGroqChatConfigBedrockMantleChatConfigDeepSeekChatConfigOpenrouterConfigIBMWatsonXChatConfigr  r9  Zis_watsonx_text_paramr  ZOpenAIConfigNebiusConfigAzureOpenAIO1Configis_o_series_modelAzureOpenAIGPT5Configis_model_gpt_5_modelr   r   r5  r  r   AZURE_DEFAULT_API_VERSIONr6  OpenAILikeChatConfigr  rW  r   r   _apply_openai_param_overrides)4rA  r'  r(  r  Ztop_pr  ry  r  stopr  Zmax_completion_tokensZ
modalitiesZ
predictionZaudioZpresence_penaltyZfrequency_penaltyZ
logit_biasr  rC  r  seedr?  rA  rB  ZlogprobsZtop_logprobsextra_headersr  Zparallel_tool_callsr  r  Zreasoning_effort	verbosityr  r\  r<  r>  r@  r)  r  r  r  r  r   r  r   Zbedrock_routeZbedrock_base_modelr  r   Znested_pathspathr+   )rC  r  r   rA  r  r  r  r,   get_optional_params  s  
+
+































































































































r  r  c           
        s  |g dt j v rgtd ddu re|ddpi }| D ]}||vr/|| dur/|| ||< qt| dts<i | d< i | d |} durT fdd| D }n|}t	t
jt d}	|	|d	| d< | S | D ]}||vr|| durt| dr~qk|| | |< qk| S )
z9
    Add provider specific params to optional_params
    )r  rG  r  r  r  FNc                      i | ]\}}| vr||qS r+   r+   r  r  r+   r,   ro   V  s
    zCadd_provider_specific_params_to_optional_params.<locals>.<dictcomp>r   )r  )r@   r  r  r  r  r   r/  rq   r9  r5  r6  r7  r8  )
r  r  rC  r  r  r  r  Zinitial_extra_bodyZprocessed_extra_bodyr   r+   r  r,   r  3  sV   


r  rW  c                 C  s*   |r|D ]}|| vr| |d| |< q| 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  )r  r  r  r  r+   r+   r,   r{  o  s   r{  c                 C  s   dd |   D }|S )Nc                 S  s:   i | ]\}}|d kr|dkr|t v r|t | kr||qS rI  )r   r  r+   r+   r,   ro     s    z*get_non_default_params.<locals>.<dictcomp>r  )r  r  r+   r+   r,   get_non_default_params~  s   r  max_parallel_requestsrpmtpmdefault_max_parallel_requestsc                 C  sP   | dur| S |dur|S |dur t |d d }|dkrd}|S |dur&|S dS )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  Zcalculated_rpmr+   r+   r,   calculate_max_parallel_requests  s   r  healthy_deployments
List[Dict]c                   s8   t dd | D d d  d ur fdd| D }|S | S )Nc                 s  s(    | ]}d |d v r|d d  V  qdS )orderr  Nr+   rm   Z
deploymentr+   r+   r,   r%    s    
z2_get_order_filtered_deployments.<locals>.<genexpr>)defaultc                   s"   g | ]}|d   d kr|qS )r  r  r.  r  Z	min_orderr+   r,   rA    s
    z3_get_order_filtered_deployments.<locals>.<listcomp>)min)r  Zfiltered_deploymentsr+   r  r,   _get_order_filtered_deployments  s   	
r  r  r   c                 C  s   | dkr |j ptj ptdptd}|durt|tr|S |jS | dkr0|j}|dur-|S |jS | dkr=|j}|dur=|S |jS )z=
    Return the region for a model, for a given provider
    rE  VERTEXAI_LOCATIONZVERTEX_LOCATIONNrH  r&  )Zvertex_locationr@   r   r   r  aws_region_namewatsonx_region_nameregion_name)rC  r  Zvertex_ai_locationr  r  r+   r+   r,   _get_model_region  s*   	r  Optional[AllowedModelRegion]c                 C  s  t j| j| d\}}}}t|| d}|du r!td| j dS |dkr2t   }t  	 }n7|dkrCt 
  }t 
 	 }n&|dkrTt   }t  	 }n|dkret   }t  	 }ng }g }|D ]}|| v rv d	S qk|D ]}|| v r d
S qydS )z
    Infer if a model is in the EU or US region

    Returns:
    - str (region) - "eu" or "us"
    - None (if region not found)
    )rA  r  )rC  r  Nz'Cannot infer model region for model: {}rG  rE  rH  r&  euus)r@   r   rA  r  r   r   r5  r6  Zget_eu_regionsZget_us_regionsr8  r7  r9  rH  )r  rA  rC  r  model_regionZ
eu_regionsZ
us_regionsregionr+   r+   r,   _infer_model_region  sD   
r  c                 C  0   | j dkrdS t| d}|dur|dkrdS dS )8
    Return true/false if a deployment is in the EU
    r  Tr  NFr  r  r  r  r+   r+   r,   _is_region_eu     

r  c                 C  r  )z8
    Return true/false if a deployment is in the US
    r  Tr  NFr  r  r+   r+   r,   _is_region_us&  r  r  allowed_model_regionc                 C  s   | j |krdS dS )r  TF)r  )r  r  r+   r+   r,   is_region_allowed4  s   
r  modec                 C  sn   d| j v r5t| jtr5t| jtr5| j dd}t j|| j| j| j	p&tj
d|p*dd}|dd}|S dS )	zM
    Pass the litellm params for an azure model, and get back the region
    rG  zazure/rj  r  chat)rA  api_keyr  r  r  r  zx-ms-regionN)rA  r   r  r  r  replacer@   ZAzureChatCompletionZget_headersr  ry  r/  )r  r  _modelr  r  r+   r+   r,   get_model_region?  s"   



	r  c                 C  s6   z|  d}t|d d }|W S  ty   Y dS w )Nr\  d   rj  )r/  r  r   )r)  Z	_messagesr+   r+   r,   get_first_chars_messagesY  s   
r  c                 C  s   d dd | D }t|S )Nrj  c                 s  s    | ]	}|  s|V  qd S r  )isspace)rm   charr+   r+   r,   r%  d  r$  z$_count_characters.<locals>.<genexpr>)r   r  )r0  Zfiltered_textr+   r+   r,   _count_charactersb  s   r  response_obj)Union[ModelResponse, ModelResponseStream]c                 C  sN  t | drHt | drHt| dd }|rHt |drH|j}g }|D ]$}t |dr7|jD ]}t |dr5||j q(qt |drB||j qd|S t | drot | drot| dd}d|v s`d	|v rot| dd}t|trm|S dS | j	}g }	|D ]+}
t|
t
r|
jjd ur|	t|
jj qvt|
tr|
jjd ur|	t|
jj qvd|	S )
Nr!  r  outputri  r0  rj  deltaz
text.deltazoutput_text.delta)rX  r5  r  ri  r   r0  r   r   r  r  rO   rg  re   r  )r  Zresponses_api_responseZoutput_listZresponse_output_partsZoutput_itemZcontent_partZ
event_typer  Z_choicesZresponse_partschoicer+   r+   r,   get_response_stringh  sB   







r  llm_providerdynamic_api_keyc                 C  s  |pt j}| dks| dkr|pt jptd}|S | dks | dkr+|p(t jp(td}|S | dkr:|p7t jp7td}|S | d	krI|pFt jpFtd
}|S | dkrX|pUt jpUtd}|S | dks`| dkrk|pht jphtd}|S | dkrz|pwt j	pwtd}|S | dkr|pt j
ptd}|S | dkr|pt jptd}|S | dkr|pt jptdptd}|S | dkr|pt jptd}|S | dkr|pt jptd}|S )Nr  r  OPENAI_API_KEYr  rC  ANTHROPIC_API_KEYr  ZAI211_API_KEYr  ALEPH_ALPHA_API_KEYbasetenBASETEN_API_KEYr  r1  COHERE_API_KEYrD  HUGGINGFACE_API_KEYr  NLP_CLOUD_API_KEYr(  REPLICATE_API_KEYr*  TOGETHERAI_API_KEYZTOGETHER_AI_TOKENr3  NEBIUS_API_KEYr4  WANDB_API_KEY)r@   r  Z
openai_keyr   Zanthropic_keyZai21_keyZaleph_alpha_keyZbaseten_keyZ
cohere_keyZhuggingface_keyZnlp_cloud_keyZreplicate_keyZtogetherai_api_keyZ
nebius_keyZ	wandb_key)r  r  r  r+   r+   r,   get_api_key  sZ   
+(%"r  c                  C  s2   dd l } ddl m } t| dr|| jS | S )Nr   r  UTC)r  rX  r  r  utcnow)dtr  r+   r+   r,   get_utc_datetime  s
   
r  c                 C  s   dd }zi| t jv r(dt j|  v rt j|  d W S dt j|  v r(t j|  d W S ttjt d}|| d\} }}}|dkrE|| d}|W S | t jv rkdt j|  v rYt j|  d W S dt j|  v rht j|  d W S W d	S t  ty|   td
|  d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                 S  \   d|  d}zt j|}|  | }|d}|d ur!|W S W d S  ty-   Y d S w Nzhttps://huggingface.co/z/raw/main/config.jsonmax_position_embeddingsr@   Zmodule_level_clientr/  raise_for_statusr8  r   
model_nameZ
config_urlr  Zconfig_jsonr  r+   r+   r,   _get_max_position_embeddings  s   
z4get_max_tokens.<locals>._get_max_position_embeddingsmax_output_tokensr  r   r  rD  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@   ri  r5  r6  r7  r8  r   )rA  r  r   rC  r  r  r+   r+   r,   get_max_tokens  s0   



r  c                 C     t dd| S )Nz-\d+$rj  resubr  r+   r+   r,   _strip_stable_vertex_version     r  c                 C     ddl m} || 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   r   )!litellm.llms.bedrock.common_utilsr   r_  )r  r   r+   r+   r,   _get_base_bedrock_model  s   
r  r  c                 C  r  )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}$rj  r  r  r+   r+   r,   !_strip_openai_finetune_model_name   s   r  c                 C  sp   |r|dv rt | d}|S |r|dks|dkrt| d}|S |r+|dkr+t| d}|S d| v r6t| d}|S | S )N)rH  Zbedrock_converser  rE  rD  r  zft:)r  r  r  )rA  rC  Zstripped_bedrock_modelZstrip_versionZstrip_finetuner+   r+   r,   _strip_model_name0  s   



r  _model_cost_lowercase_mapc                   C  s   da t  t  dS )zInvalidate the case-insensitive lookup map for model_cost.

    Call this whenever litellm.model_cost is modified to ensure the map is rebuilt.
    Also clears related LRU caches that depend on model_cost data.
    N)r  r  cache_clear_cached_get_model_info_helperr+   r+   r+   r,   r  G  s   r  Dict[str, str]c                   C  s   dd t jD atS )zRebuild the case-insensitive lookup map from the current model_cost.

    Returns:
        The rebuilt map (guaranteed to be not None).
    c                 S  s   i | ]}|  |qS r+   rG  r  r+   r+   r,   ro   \  s    z5_rebuild_model_cost_lowercase_map.<locals>.<dictcomp>)r@   ri  r  r+   r+   r+   r,   !_rebuild_model_cost_lowercase_mapU  s   r  potential_key_lowerc                 C  s*   t  at| }|dur|tjv r|S dS )z
    Handle stale _model_cost_lowercase_map entry (key was popped).

    Rebuilds the map and retries the lookup.

    Returns:
        The matched key if found after rebuild, None otherwise.
    N)r  r  r/  r@   ri  )r  matched_keyr+   r+   r,   _handle_stale_map_entry_rebuild`  s
   
r  c                 C  s*   t jD ]}| | krt a|  S qdS )z
    Handle new key added to model_cost without invalidating _model_cost_lowercase_map.

    Scans model_cost for case-insensitive match and rebuilds the map if found.

    Returns:
        The matched key if found, None otherwise.
    N)r@   ri  rH  r  r  )r  r:  r+   r+   r,   _handle_new_key_with_scans  s   
r  potential_keyc                 C  sd   | t jv r| S tdu rt a|  }t|}|dur"|t jv r"|S |dur0t|}|dur0|S dS )a  
    Get the actual key from model_cost, with case-insensitive fallback.

    WARNING: Only O(1) lookup operations are acceptable. O(n) lookups will cause severe
    CPU overhead. This function is called frequently during router operations.

    ALLOWED HELPER FUNCTIONS (conditionally called, O(n) operations are acceptable):
    - _rebuild_model_cost_lowercase_map: Rebuilds the lookup map (only when map is None)
    - _handle_stale_map_entry_rebuild: Rebuilds map when stale entry detected (rare case)

    If you need to add a new helper function with O(n) operations that is conditionally
    called and confirmed not to cause performance issues, add it to the allowed_helpers
    list in: tests/code_coverage_tests/check_get_model_cost_key_performance.py
    N)r@   ri  r  r  rH  r/  r  )r  r  r  r+   r+   r,   rh    s   

rh  c                 C  s
   t j|  S r  )r@   ri  r#  r+   r+   r,   _get_model_info_from_model_cost  s   
r  rV  c                 C  s   |rNd| v rN| d |krN|dkr| d  drdS |dkr&| d  dr&dS | dr4| d  dr4dS |dkr:dS |dkrF| d dv rFdS |d	krLdS d
S dS )zG
    Check if the model info provider matches the custom provider.
    r~  rE  Tr  rH  Zlitellm_proxyazure_ai)rG  r  ZgithubFr  rV  rC  r+   r+   r,   _check_provider_match  s:   

r  )	TypedDictc                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )'PotentialModelNamesAndCustomLLMProviderr  split_modelcombined_model_namestripped_model_namecombined_stripped_model_namerC  N)r8  r  r  __annotations__r+   r+   r+   r,   r    s   
 r  c                 C  s   |d u r.zt tjt d}|| d\}}}}W n ty"   | }Y nw | }t| |d}|}n4|rN| |d rN| ddd }| }t||d}d||}n| }d|| }t| |d}d||}t	||||t
t|dS )Nr   r  rI  r  r   z{}/{})r  r  r  r  rC  )r5  r6  r7  r8  r   r  r  rN  r5  r  r   r  )rA  rC  r   r  r  r  r  r  r+   r+   r,   _get_potential_model_names  sN   r  c                 C  r  r  r  r  r+   r+   r,   r    s   
r  r  r]   c                 C  s   t | ||dS )z_
    _get_model_info_helper wrapped with lru_cache

    Speed Optimization to hit high RPS
    rA  rC  r  )rU  r  r+   r+   r,   r  ,  s   r  #Optional[ProviderSpecificModelInfo]c                 C  s:   d }|r|t v rtj| t|d}d }|r|j| d}|S )Nr  r  )rY   r  get_provider_model_inforX   re  )rA  rC  r  rV  r+   r+   r,   re  <  s   re  potential_model_namesc                 C  s   t dd |  D S )zT
    Check if the potential model name is in the model cost (case-insensitive).
    c                 s  s     | ]}t t|d uV  qd S r  )rh  r  )rm   Zpotential_model_namer+   r+   r,   r%  V  s
    
z9_is_potential_model_name_in_model_cost.<locals>.<genexpr>)r'  r  )r  r+   r+   r,   &_is_potential_model_name_in_model_costP  s   r  c              
   C  s  zni t jt j}| |v r||  } |dur|dkrd}|durG|dkrGd|  t jv r0d|  } n| d t jv r<| d } n| d t jv rG| d } t| |d}td|  |d }|d	 }|d
 }|d }|d }|dkrt	| d}	t
d`i 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W S |d!ks|d"krt|st  j| |d#W S 	 d}
d}t|}|dur|}ttt|d$}
t|
|d%sd}
|
du rt| }|dur|}ttt|d$}
t|
|d%sd}
|
du rt|}|dur|}ttt|d$}
t|
|d%sd}
|
du r=t|}|dur=|}ttt|d$}
t|
|d%s=d}
|
du r^t|}|dur^|}ttt|d$}
t|
|d%s^d}
|
du sh|du rltd&|
d}|du rtd'| | d}|
d}|du rtd(| | d}t
d`i 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/|
d/dd0|
d0dd1|
d1dd2|
d2dd3|
d3dd4|
d4dd5|
d5dd6|
d6dd7|
d7dd8|
d8dd9|
d9dd:|
d:dd;|
d;dd<|
d<dd=|
d=dd>|
d>d?|
d?d|d@|
d@ddA|
dAddB|
dBddC|
dCddD|
dDddE|
dEddF|
dFddG|
dGddH|
dHddI|
dIddJ|
dJddK|
dKddL|
dLddM|
dMddN|
dNddO|
dOdd|
d|d|
dd|
ddd|
dddP|
dPdd|
ddd|
ddd|
ddd|
dddQ|
dQddR|
dRdd |
d ddS|
dSddT|
dTddU|
dUddV|
dVddW|
dWdd|
dddX|
dXddY|
dYddZ|
dZdd[|
d[dd\|
d\dd]|
d]dW S  ty } ztd^|  td_| |d}~ww )azy
    Helper for 'get_model_info'. Separated out to avoid infinite loop caused by returning 'supported_openai_param's
    NrF  rE  zmeta/z@latestrI  z6checking potential_model_names in litellm.model_cost: r  r  r  r  rC  rD  r  r:  r  max_input_tokensr  Zinput_cost_per_tokenr   Zoutput_cost_per_tokenr~  r  r  rK  rW  r`  rb  Zsupports_assistant_prefillrn  ro  rl  r  r2  )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.Zinput_cost_per_token_flexZinput_cost_per_token_priorityZcache_creation_input_token_costZ1cache_creation_input_token_cost_above_200k_tokensZcache_read_input_token_costZ-cache_read_input_token_cost_above_200k_tokensZ-cache_read_input_token_cost_above_272k_tokensZ cache_read_input_token_cost_flexZ$cache_read_input_token_cost_priorityZ)cache_creation_input_token_cost_above_1hrZinput_cost_per_characterZ&input_cost_per_token_above_128k_tokensZ&input_cost_per_token_above_200k_tokensZ&input_cost_per_token_above_272k_tokensZinput_cost_per_queryZinput_cost_per_secondZinput_cost_per_audio_tokenZinput_cost_per_image_tokenZinput_cost_per_imageZinput_cost_per_audio_per_secondZinput_cost_per_video_per_secondZinput_cost_per_token_batchesZoutput_cost_per_token_batchesZoutput_cost_per_token_flexZoutput_cost_per_token_priorityZoutput_cost_per_audio_tokenZoutput_cost_per_characterZoutput_cost_per_reasoning_tokenZ'output_cost_per_token_above_128k_tokensZ+output_cost_per_character_above_128k_tokensZ'output_cost_per_token_above_200k_tokensZ'output_cost_per_token_above_272k_tokensZoutput_cost_per_secondZ output_cost_per_video_per_secondZoutput_cost_per_imageZoutput_cost_per_image_tokenZoutput_vector_sizeZcitation_cost_per_tokenZtiered_pricingrp  rj  rm  rt  rR  rP  rQ  rq  Zsearch_context_cost_per_queryr  r  Zocr_cost_per_pageZannotation_cost_per_pageZprovider_specific_entryzError getting model info: zThis model isn't mapped yet. model={}, custom_llm_provider={}. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.r+   )r@   
azure_llmsZazure_embedding_modelsZvertex_llama3_modelsrX  r[  r  r   r   r  r]   r  ra  r  rh  r  r   r  r  r  r/  r5  r   )rA  rC  r  r   r  r  r  r  r  r  _model_infor:  Z_matched_keyZ_input_cost_per_tokenZ_output_cost_per_tokenr  r+   r+   r,   rU  \  s&  


	
	







	!$'*-012589<?BEFILORUX[^abefijmn
qruxy|}           
                      rU  r\   c           	      C  sh   t j| |d}t| ||d}t| |d}|r'| D ]\}}|dur&|||< q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"]
        }
    rI  r  Nr  r+   )r@   r   rU  re  r9  r\   )	rA  rC  r  r  r  rf  r:  rl   Zreturned_model_infor+   r+   r,   r    s,   Lr  python_type_namec                 C  s8   t jdtjdtjdtjdtjdtjdddi}|| dS )	zConverts standard python types to json schema types

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

    Returns
    -------
    str
        a standard JSON schema type, "string" if not recognized.
    stringintegernumberbooleanarrayr  NoneTypenull)r  r8  r  r  r   rW  rq   r/  )r  Zpython_to_json_schema_typesr+   r+   r,   json_schema_type   s   
r
  c              
   C  s  zddl }ddlm} ddlm} W n ty  } z|d}~ww | j}|| }||}ddd |d D }i }	g }
|	| j
}| D ]}\}}t|d	rWt|jj}nd}d}d}|d
 D ]D}|j|krt|dr|j}d|v r||dd }nd|v rztt||}d}W n	 ty   Y nw t|}ddd |jD }qa|||d}tdd | D |	|< |j|jkr|
| qG||d|	dd}|
r|
|d d< |S )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
c                 S     g | ]}|  qS r+   striprm   sr+   r+   r,   rA  4  rp   z$function_to_dict.<locals>.<listcomp>Summary
annotationZ
Parametersr!  optional,{r  c                 S  r  r+   r  r  r+   r+   r,   rA  T  rp   )r!  descriptionenumc                 S  s"   g | ]\}}t |tr||fqS r+   r   r  r  r+   r+   r,   rA  ]  s   " r  r!  
propertiesnamer  r  r  required)inspectastr  Znumpydoc.docscraper  r   r8  getdocr   	signaturer  r9  rX  r
  r  r  r!  rN  r  rW  Zdescrq   r  emptyr   )Zinput_functionr   r  r  r  r  	docstringZnumpydocr  r  Zrequired_paramsZ
param_info
param_namer  Z
param_typeZparam_descriptionZ
param_enumZ
param_dataZ
param_dictr  r+   r+   r,   function_to_dict  sp   





r'  c                 C  s   t | }|j|d}t|S )Nr  )r  URL	copy_withr  )original_urlnew_pathr}  modified_urlr+   r+   r,   
modify_urlu  s   
r.  	num_callsforce_timeoutc              
     s   d d}|r| |r|} fddt |D }t }ztj| ||||d t }	|	| }
|
ddd dW S  tyV } zt }	|	| }
|
dd|dW  Y d }~S d }~ww )	NzHey, how's it goingr  c                   s   g | ]}d  dgqS )r  rR  ri  r+   )rm   r  Ztest_promptr+   r,   rA    rJ  z#load_test_model.<locals>.<listcomp>)rA  r\  rC  r  r0  r	  )Ztotal_response_timeZ
calls_madestatusr  failed)rangetimer@   Zbatch_completionr   )rA  rC  r  re  r/  r0  Z
test_callsr\  rz  r  Zresponse_timer  r+   r2  r,   load_test_model{  sB   r7  List[ProviderField]c                 C  s@   | dkr
t   S | dkrt   S | dkrt   S g S )z,Return the fields required for each providerr  r  r  )r@   rf  Zget_required_paramsra  ZAzureAIStudioConfigrC  r+   r+   r,   get_provider_fields  s   r:  c                  C  s   dd t   D } i }i }tdd }|r|dng }|  D ]%\}}|d u r6t ||< t ||< q!tj|d||< tj|d||< q!|D ]}t ||< t ||< qI||fS )Nc                 S  s(   i | ]\}}||d u rd nt |dqS )Nr|  r   )rm   r:  r}  r+   r+   r,   ro     s    z5create_proxy_transport_and_mounts.<locals>.<dictcomp>ZNO_PROXYr  )proxy)r   r9  osgetenvrN  r  ZHTTPTransportZAsyncHTTPTransport)proxiesZsync_proxy_mountsZasync_proxy_mountsno_proxyZno_proxy_urlsr:  r;  r}  r+   r+   r,   !create_proxy_transport_and_mounts  s"   r@  r  r  c           
      C  s  d}g }| du r||dS zt tjt d}|| d\}}}}W n ty+   d}Y nw |r-|dkrCdtjv r<d}n|d n|d	krcd
tjv rZdtjv rZdtjv rZd}nj|g d na|dkrwdtjv rpd}nT|d nM|dkrdtjv rd}n@|d n9|dkrdtjv rd}n,|d n%|dkrdtjv rd}n|d n|dkrdtjv rd}n|d n|dkrdtjv rd}n|d n|dkrdtjv rdtjv rd}n|ddg n|dkrdtjv rd}n|d n|dkr"d tjv rd}n|d  n|d!kr8d"tjv r1d}n|d" n|d#krNd$tjv rGd}n}|d$ nv|d%krdd&tjv r]d}ng|d& n`|d'krzd(tjv rsd}nQ|d( nJ|d)ks|d*krd+tjv rd,tjv sd-tjv sd.tjv sd/tjv sd0tjv sd1tjv rd}n|d+ |d, n|d2v rd3tjv rd}n|d3 n|d4krd5tjv rd}n|d5 n|d6kr d7tjv rd}n|d7 n|d8krd9tjv rd}n|d9 n|d:kr7d;tjv s'd<tjv r+d}n|d; |d< n|d=krMd>tjv rFd}n~|d> nw|d?krcd@tjv r\d}nh|d@ na|dAkrydBtjv rrd}nR|dB nK|d%krd&tjv rd}n<|d& n5|dCkrdDtjv rd}n&|dD n|dEkrd tjv rd}n|d  n	|dFkrdGtjv rd}n|dG n|dHks|dIkrdJtjv rd}n|dJ n|dKkrdLtjv rd}n|dL n|dMkrdNtjv rd}n|dN n|dOkr.dPtjv r'd}n|dP n|dQkrDdRtjv r=d}n|dR n|dSkrZdTtjv rSd}nq|dT nj|dUkrpdVtjv rid}n[|dV nT|dWkrdXtjv sdYtjv sdZtjv sd[tjv rd}n3|dX n,|d\krd]tjv rd^tjv sd_tjv rd}n|d] |d_ n|d`krdatjv rd}n|da n|dbkrdctjv rd}n|dc n|ddkrdetjv rd}n|de n|dfkrdgtjv rd}n|dg n|dhkr+ditjv r&d}n|di n| t	j
v sE| t	jv sE| t	jv sE| t	jv rVdtjv rOd}nu|d nn| t	jv rmdtjv rfd}n^|d nW| t	jv rdtjv r}d}nG|d n@| t	jv rdtjv rd}n0|d n)| t	jv rdtjv rd}n|d n| t	jv rdtjv rd}n|d n| t	jv rdtjv rd}n|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|ddg n| t	jv rdtjv rd}n|d n| t	jv r2d tjv r,d}n|d  n| t	jv rGd"tjv rAd}n|d" n}| t	jv r\d$tjv rVd}nn|d$ nh| t	jv rqd&tjv rkd}nY|d& nS| t	jv rd(tjv rd}nD|d( n>| t	jv rdatjv rd}n/|da n)| t	jv rdctjv rd}n|dc n| t	jv rdetjv rd}n|de dudodp}	|dur|	|dq}|dur|	|dr}|dur|	|ds}t |dtkrd}||dS )va  
    Checks if the environment variables are valid for the given model.

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

    Returns:
        dict: A dictionary containing the following keys:
            - keys_in_environment (bool): True if all the required keys are present in the environment, False otherwise.
            - missing_keys (List[str]): A list of missing keys in the environment.
    FN)keys_in_environmentmissing_keysr   r  r  r  TrG  AZURE_API_BASErI  AZURE_API_KEY)rC  rI  rD  r  r  r  r  r(  r  r  ZOPENROUTER_API_KEYr  ZVERCEL_AI_GATEWAY_API_KEYZ	datarobotZDATAROBOT_API_TOKENrE  ZVERTEXAI_PROJECTr  rD  r  r  ZAI21_API_KEYr*  r  r  r  r  r  r  r  rH  r  ZAWS_ACCESS_KEY_IDZAWS_SECRET_ACCESS_KEYZAWS_ROLE_ARNZAWS_PROFILEZAWS_WEB_IDENTITY_TOKEN_FILEZ&AWS_CONTAINER_CREDENTIALS_RELATIVE_URIZ"AWS_CONTAINER_CREDENTIALS_FULL_URI)r  r2  ZOLLAMA_API_BASEr)  ZANYSCALE_API_KEYrF  ZDEEPINFRA_API_KEYZfeatherless_aiZFEATHERLESS_AI_API_KEYrD  ZGOOGLE_API_KEYZGEMINI_API_KEYr  ZGROQ_API_KEYr  ZNVIDIA_NIM_API_KEYr+  ZCEREBRAS_API_KEYr,  ZXAI_API_KEYr-  r.  ZVOLCENGINE_API_KEYr0  rH  ZCODESTRAL_API_KEYr/  ZDEEPSEEK_API_KEYr  ZMISTRAL_API_KEYZpalmZPALM_API_KEYrG  ZPERPLEXITYAI_API_KEYr  ZVOYAGE_API_KEYr  ZINFINITY_API_KEYr  ZFIREWORKS_AI_API_KEYZFIREWORKS_API_KEYZFIREWORKSAI_API_KEYZFIREWORKS_AI_TOKENrE  ZCLOUDFLARE_API_KEYZCLOUDFLARE_ACCOUNT_IDZCLOUDFLARE_API_BASEr  ZNOVITA_API_KEYr3  r  r4  r  Z	dashscopeZDASHSCOPE_API_KEYZmoonshotZMOONSHOT_API_KEYr  r+  exclude_patternr  r  c                   s    fdd| D S )zDFilter out keys that contain the exclude_pattern (case insensitive).c                   s   g | ]
} |  vr|qS r+   rG  )rm   r:  rE  r+   r,   rA  V      zEvalidate_environment.<locals>.filter_missing_keys.<locals>.<listcomp>r+   )r  rE  r+   rF  r,   filter_missing_keysT  s   z1validate_environment.<locals>.filter_missing_keysr  r  r  r   )r  r+  rE  r  r  r+  )!r5  r6  r7  r8  r   r<  environr   r?  r@   r  r  Zopen_ai_embedding_modelsZopenai_image_generation_modelsr+  r)  Zreplicate_modelsr  r  Zdatarobot_modelsr  r  models_by_providerZhuggingface_modelsr  Ztogether_ai_modelsr  Zbaseten_modelsr  r  Znebius_modelsZwandb_modelsr  )
rA  r  r  r  rA  rB  r   r  rC  rH  r+   r+   r,   validate_environment  s@  























































rK  c                  O  s   t j| i |S r  )r@   r  )r  r)  r+   r+   r,   acreateg  s   rL  c           	      C  s   d dd |D }d}d| v r8zdd l}W n ty#   td Y nw ddlm}m}m} | }||}|S tt 	|}|S )N c                 s  s    | ]}|d  V  qdS )ri  Nr+   rm   rg  r+   r+   r,   r%  m  s    z*prompt_token_calculator.<locals>.<genexpr>r   claudez:Anthropic import failed please run `pip install anthropic`)	AI_PROMPTHUMAN_PROMPT	Anthropic)
r   r  r   rP  rQ  rR  Zcount_tokensr  r   r/  )	rA  r\  r0  Z
num_tokensr  rP  rQ  rR  Zanthropic_objr+   r+   r,   prompt_token_calculatork  s   
rS  c                 C  sd   z#| t jv s| t jv rtj|  W d S dddg}t j| |d W d S  ty1   td| ddw )Nr  zHello Worldr1  rA  r\  rj  )rg  rA  r  )	r@   r  r  r  modelsretriever  r   r   rT  r+   r+   r,   valid_model}  s   

rW  c                 C  sL   dddg}zt j| ||dd W dS  ty   Y dS  ty%   Y dS 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.
    r  zHey, how's it going?r1  r  )rA  r\  r  r  TF)r@   r  r   r   )rA  r  r\  r+   r+   r,   check_valid_key  s   rX  r  c                 C  s4   | dkrdS | dkrdS | dkrdS | dkrdS dS )a  
    Retries on 408, 409, 429 and 500 errors.

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

    Reimplementation of openai's should retry logic, since that one can't be imported.
    https://github.com/openai/openai-python/blob/af67cfab4210d8e497c05390ce14f39105c77519/src/openai/_base_client.py#L639
    i  Ti  i  r  Fr+   )r  r+   r+   r,   _should_retry  s   rY  response_headersOptional[httpx.Headers]c                 C  s   zEddl }| durA| d}zt|}W |W S  ty@   |j|}|du r*d}n|j|}t|t  }Y |W S Y |W S w d}|W S  tyQ   d}Y dS 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-afterr  )emailr/  r  r   r?   parsedate_tz	mktime_tzr6  )rZ  r\  Zretry_headerretry_afterretry_date_tuple
retry_dater+   r+   r,   &_get_retry_after_from_exception_header  s,   


rb  remaining_retriesrB  min_timeoutUnion[float, int]c                 C  sj   t |}tt  }|d urd|  k rdkr|| S  ||  }ttd| }t||}t|t}|| S )Nr   <   g       @)rb  r    randomr   powmaxr  r!   )rc  rB  rZ  rd  r_  Zjitterr  Zsleep_secondsr+   r+   r,   _calculate_retry_after  s   

rj  rolesinitial_prompt_valuefinal_prompt_valuetokenizer_configc           	      C  s   | }|g}zt tjt d}|| dd } ||  W n	 ty$   Y nw |r7|D ]
}|ddtj|< q)tjS |D ]}|||dtj|< q9tjS )a  
    Register a prompt template to follow your custom format for a given model

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

    Returns:
        dict: The updated custom prompt dictionary.
    Example usage:
    ```
    import litellm
    litellm.register_prompt_template(
            model="llama-2",
        initial_prompt_value="You are a good assistant" # [OPTIONAL]
            roles={
            "system": {
                "pre_message": "[INST] <<SYS>>
", # [OPTIONAL]
                "post_message": "
<</SYS>>
 [/INST]
" # [OPTIONAL]
            },
            "user": {
                "pre_message": "[INST] ", # [OPTIONAL]
                "post_message": " [/INST]" # [OPTIONAL]
            },
            "assistant": {
                "pre_message": "
" # [OPTIONAL]
                "post_message": "
" # [OPTIONAL]
            }
        }
        final_prompt_value="Now answer as best you can:" # [OPTIONAL]
    )
    ```
    r   r  r   r	  )r$  r3  )rk  rl  rm  )	r5  r6  r7  r8  r   r   r@   Zknown_tokenizer_configZcustom_prompt_dict)	rA  rk  rl  rm  rn  Zcomplete_modelZpotential_modelsr   r  r+   r+   r,   register_prompt_template  s*   *ro  c                   @  sF   e Zd Z		ddddZdd	 Zd
d ZdddZdd Zdd ZdS )TextCompletionStreamWrapperNr  r  rC  rB  c                 C  s   || _ || _|| _|| _d S r  )completion_streamrA  r  rC  )selfrq  rA  r  rC  r+   r+   r,   __init__A  s   
z$TextCompletionStreamWrapper.__init__c                 C     | S r  r+   rr  r+   r+   r,   __iter__M     z$TextCompletionStreamWrapper.__iter__c                 C  rt  r  r+   ru  r+   r+   r,   	__aiter__P  rw  z%TextCompletionStreamWrapper.__aiter__r  r^   c              
   C  s  znt  }|dd |d< d|d< |dd |d< |dd |d< t }t|tr*t|d d d }|d	 |d
< |d|d< |d d d |d< |d d d |d< |g|d< | jrl| jdddu rl|dd |d< |W S  ty } ztd| dt| d }~ww )NrV  r  r  createdrA  r  r   r  ri  r0  Zreasoning_contentr  Zfinish_reasonZinclude_usageFTusagez=Error occurred converting to text completion object - chunk: z	; Error: )rg   r/  rf   r   rO   r   r  r  )rr  r  r  Ztext_choicesr  r  r+   r+   r,   !convert_to_text_completion_objectS  s8   
z=TextCompletionStreamWrapper.convert_to_text_completion_objectc              
   C  s   t   z| jD ]}|dks|d u rt| j|d}|  W S t ty(   t tyH } zttjt d}|| j	| j
p>d|i i dd }~ww )Nr  r  r   rj  )rA  rC  Zoriginal_exceptionZcompletion_kwargsextra_kwargs)rg   rq  r   r{  StopIterationr5  r6  r7  r8  rA  rC  )rr  r  processed_chunkr  r   r+   r+   r,   __next__s  s*   

z$TextCompletionStreamWrapper.__next__c                   sX   z!| j 2 z3 d H W }|dks|d u rt| j|d}|  W S 6 t ty+   tw )Nr  r|  )rq  r   r{  r~  StopAsyncIteration)rr  r  r  r+   r+   r,   	__anext__  s   
z%TextCompletionStreamWrapper.__anext__NN)r  r  rC  rB  )r  r^   )	r8  r  r  rs  rv  rx  r{  r  r  r+   r+   r+   r,   rp  @  s    
 rp  c           	   
   c  s    t |tjr	|t |tr|V  d S tdt|dD ]A}td|||d  d}|d u r4|| jd _n%g }t|D ]}tj	j
|tj	jd|||d  dd}|| q:|| _| V  qd S Nr      rT  r1  )r  r  r   r@   r   r_   r5  r  rS   r  r  r?   re   r   	r  mock_responserA  r  iZcompletion_objZ_all_choicesjZ_streaming_choicer+   r+   r,   mock_completion_streaming_obj  s,   
r  r  0Union[str, 'MockException', ModelResponseStream]c           	   
   C s   t |tjr	|t |tr|V  d S tdt|dD ]A}td|||d  d}|d u r4|| jd _n%g }t|D ]}tj	j
|tj	jd|||d  dd}|| q:|| _| V  qd S r  r  r  r+   r+   r,   #async_mock_completion_streaming_obj  s,   
r  c              
   C  sl   z'dd l }|  t| d}t|}W d    |W S 1 s w   Y  |W S  ty5 } z|d }~ww )Nr   rs   )r<  getcwdopenr8  loadr   )Zconfig_pathr<  config_filert  r  r+   r+   r,   read_config_args  s   
r  c                 C  sJ   d| d}t |g|}||krtd t|||}t |g|}||| fS )Nsystemr1  zH`tokentrimmer`: Warning, system message exceeds token limit. Trimming...)get_token_countr   shorten_message_to_fit_limit)system_messager  rA  system_message_eventZsystem_message_tokensZnew_system_messager+   r+   r,   process_system_message  s   
r  c                 C  s   | d d d } g }t d|  d| d|  | D ]5}t d|  t||}|| }t d| d|  |dkr= nt|||||d	}t d
|  qt 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_messagesrg  available_tokensr  rA  z/final_messages after attempt_message_addition: Final messages: )r   r   r  attempt_message_addition)r\  r  rA  r  rg  Zused_tokensr  r+   r+   r,   process_messages  s4   
r  c                 C  s   |g|  }t ||d}td| d|  ||kr|S d|vrAtd t|||}t|| ||r<td |g|  S td | S )Nr\  rA  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  rg  r  r  rA  Ztemp_messagesZtemp_message_tokensZupdated_messager+   r+   r,   r    s"   



r  c                 C  s   t || g ||krdS dS r  )r  )rg  r\  r  rA  r+   r+   r,   r  (  s   r  c                 C  s   t || dS )NrT  )rF  r  r+   r+   r,   r  .  r%  r  raise_error_on_max_limitc                 C  s"  |durd|v r|dkr| S | d }d}t d|  |tk r~t d|   t| g|}t d| d	|  ||kr>n@|| }tt|| d
 }td|}|d }	|d|	 }
||	 d }|
d | }|| d< t d|  |}|d
7 }|tk s |tkr|rt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  ri  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  ri  r   )rg  Ztokens_neededrA  r  ri  Zattemptstotal_tokensratio
new_lengthZhalf_lengthZ	left_halfZ
right_halfZtrimmed_contentr+   r+   r,   r  2  s<   
r  
trim_ratior  return_response_tokensc              
   C  s&  | }t | } z|du r)|tjv r&tj| dtj| d }t|| }n| W S d}| D ]}|d dkrC||r:dnd7 }||d 7 }q-g }	t| D ]}|d d	krT n|	| qJ|	  t	|	rk| dt	|	  } t
|pod| d
}
td|
 d|  |
|k r| |	 W S td|  d|
 d|  d}|rt|||d\}}|dkr|gW S dd | D } td|  t| ||d}td|  |r|g| }t	|	dkr||	 td| d|  |r|t|| }||fW S |W S  ty } ztdt| |W  Y d}~S d}~w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  rj  rR  r  r  ri  rZ  rT  zCurrent tokens: z, max tokens: zNeed to trim input messages: z, current_tokensr  )r  r  rA  r   c                 S  s   g | ]
}|d  dkr|qS )rR  r  r+   rN  r+   r+   r,   rA    rG  z!trim_messages.<locals>.<listcomp>zProcessed system message: )r\  r  rA  zProcessed messages: r  z, return_response_tokens: z'Got exception while token trimming - {})r>  r  r@   ri  r/  r  r  r   reverser  rF  r   r  r   r   r  r?  r  r   r  r5  r  )r\  rA  r  r  r  Zoriginal_messagesZmax_tokens_for_modelr  rg  Ztool_messagesZcurrent_tokensr  r  Zresponse_tokensr  r+   r+   r,   trim_messagesn  s~   







r  )InMemoryCachec                      sX   e Zd Zdd fddZdd
dZd ddZd!ddZ		d"d#ddZd$ddZ  Z	S )%AvailableModelsCache,  r  ttl_secondsr  max_sizec                   s   t  || d | _d S r  )superrs  	_env_hash)rr  r  r  	__class__r+   r,   rs    s   
zAvailableModelsCache.__init__r  r  c                 C  s(   dd t j D }ttt| S )z/Create a hash of relevant environment variablesc                 S  s    i | ]\}}| d r||qS ))OPENAI	ANTHROPICAZUREZAWSr  r  r+   r+   r,   ro     s    z6AvailableModelsCache._get_env_hash.<locals>.<dictcomp>)r<  rI  r9  r  hash	frozenset)rr  Zenv_varsr+   r+   r,   _get_env_hash  s   z"AvailableModelsCache._get_env_hashr   c                 C  s&   |   }| jdu r|| _dS || jkS )z+Check if environment variables have changedNT)r  r  )rr  Zcurrent_hashr+   r+   r,   _check_env_changed  s
   

z'AvailableModelsCache._check_env_changedrC  rB  r  Optional[LiteLLM_Params]c                 C  s<   d}|d ur
|  }|d ur| d| }t|  S )Nrj  :)Zmodel_dump_jsonhashlibsha256r/  	hexdigest)rr  rC  r  Z	valid_strr+   r+   r,   _get_cache_key  s   z#AvailableModelsCache._get_cache_keyNr   c                 C  sX   |du r|   r| j  dS | ||}tttt  | |}|dur*t	
|S |S )zGet cached model infoN)r  Z
cache_dictclearr  r   r~   r{   r  Z	get_cacher>  r  )rr  rC  r  	cache_keyr  r+   r+   r,   get_cached_model_info  s   

z*AvailableModelsCache.get_cached_model_infoavailable_modelsr+  c                 C  s"   |  ||}| |t| dS )zSet cached model infoN)r  Z	set_cacher>  r  )rr  rC  r  r  r  r+   r+   r,   set_cached_model_info  s   z*AvailableModelsCache.set_cached_model_info)r  r  )r  r  r  r  r  r  r  r   )rC  rB  r  r  r  r  r  )rC  rB  r  r  r  r   )rC  r  r  r  r  r+  )
r8  r  r  rs  r  r  r  r  r  __classcell__r+   r+   r  r,   r    s    

	
r  c                 C  sr   g }t j }tjD ],}| r|| krq
|dd}|}|  d}|  d}||v s1||v r6|| q
|S )Nr  rj  Z_API_KEY)r<  rI  r  r@   r   r  upperr   )rC  valid_providersZenviron_keysr   Zenv_provider_1Zenv_provider_2Zexpected_provider_key_1Zexpected_provider_key_2r+   r+   r,   #_infer_valid_provider_from_env_vars#  s   


r  r   r  c              
   C  s   z,t ||}|d ur|W S | j|d ur|jnd |d ur|jnd d}t ||| |W S  tyH } ztd|  g W  Y d }~S d }~ww )N)r  r  Error getting valid models: )	_model_cacher  Z
get_modelsr  r  r  r   r   r  )r  rC  r  r  rU  r  r+   r+   r,   #_get_valid_models_from_provider_api>  s"   r  check_provider_endpointc              
   C  s$  zuddl m} |du r|dd}|dur||_|dur||_| p"tj} g }g }|r-|g}nt|}|D ]?}tjdt	|d}	|rE||krEq3|dkrO|
d q3|	durc| rc|durc|t|	|| q3ttj|g }
||
 q3|W S  ty } ztd	|  g W  Y d}~S d}~w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
    r   r   Nrj  r  r  rG  z	Azure-LLMr  )litellm.types.routerr   r  r  r@   r  r  r  r  rX   r   r?  r  r>  r  rJ  r/  r   r   r  )r  rC  r  r  r  r   r  Zvalid_modelsr   r  Zmodels_for_providerr  r+   r+   r,   get_valid_modelsV  sZ   
r  c                 C  sH  t  sd S zd|v r|d du r| jdkrW d S d|v r*|d du r*| jdkr*W d S d|v r<|d du r<| jdkr<W d S dtt|}dd	d
 | D }td td |rl|rltd| j d| d| d n'|r{td| j d| d n|rtd| j d| d n	td| j d td W d S  ty   Y d S w )Nr  Tr  r  r  r  Zimg_generationr  c                 s  s&    | ]\}}| d t | V  qdS )=N)reprr	  r+   r+   r,   r%    s   $ z/print_args_passed_to_litellm.<locals>.<genexpr>r  z[92mRequest to litellm:[0mz[92mlitellm.(z)[0mz()[0m)r   r8  r   mapr  r9  r   r   )r`  r  r)  args_strZ
kwargs_strr+   r+   r,   r    sP   


r  c                 C  s8   zd|  d d |d }|W S  ty   Y d S w )Nztime-z%H-%M-%S-%fr  rV  )strftimer/  r   )rz  r  Zresponse_idr+   r+   r,   get_logging_id  s   r  c                 C  s   | d u rd S |  di }|d urI| dd }|d ur|S | dp"i }ttjt d}||d}|d ur6|S | di }ttjt d}||dS d S )Nr  r  r,  r   )r,  litellm_metadata)r/  r5  r6  r7  r8  )model_call_detailsr  Z_base_modelr,  r   Zbase_model_from_metadatar  r+   r+   r,   _get_base_model_from_metadata  s,   


r  c                   @  s8   e Zd ZddddZdd	 Zd
d Zdd Zdd ZdS )ModelResponseIteratorFr  r^   convert_to_deltar   c                 C  s>   |du rt  }|jd jj|jd j_|| _n|| _d| _d S )NTr   F)r_   r  rg  ri  r  r  is_done)rr  r  r  _stream_responser+   r+   r,   rs    s   
zModelResponseIterator.__init__c                 C  rt  r  r+   ru  r+   r+   r,   rv    rw  zModelResponseIterator.__iter__c                 C  s   | j rtd| _ | jS NT)r  r~  r  ru  r+   r+   r,   r    s   zModelResponseIterator.__next__c                 C  rt  r  r+   ru  r+   r+   r,   rx    rw  zModelResponseIterator.__aiter__c                   s   | j rtd| _ | jS r  )r  r  r  ru  r+   r+   r,   r    s
   zModelResponseIterator.__anext__NF)r  r^   r  r   r8  r  r  rs  rv  r  rx  r  r+   r+   r+   r,   r    s    r  c                   @  s8   e Zd ZddddZdd Zdd	 Zd
d Zdd ZdS )ModelResponseListIteratorNdelayOptional[float]c                 C  s   || _ d| _|| _d S r  )model_responsesr  r  )rr  r  r  r+   r+   r,   rs  $  s   
z"ModelResponseListIterator.__init__c                 C  rt  r  r+   ru  r+   r+   r,   rv  *  rw  z"ModelResponseListIterator.__iter__c                 C  sD   | j t| jkr
t| j| j  }|  j d7  _ | jr t| j |S Nr   )r  r  r  r~  r  r6  sleeprr  r  r+   r+   r,   r  -  s   z"ModelResponseListIterator.__next__c                 C  rt  r  r+   ru  r+   r+   r,   rx  7  rw  z#ModelResponseListIterator.__aiter__c                   sL   | j t| jkrt| j| j  }|  j d7  _ | jr$t| jI d H  |S r  )r  r  r  r  r  r  r  r  r+   r+   r,   r  :  s   z#ModelResponseListIterator.__anext__r  )r  r  r  r+   r+   r+   r,   r  #  s    
r  c                      s   e Zd Zd fddZ  ZS )CustomModelResponseIteratorr  r  c                   s   t    d S r  )r  rs  ru  r  r+   r,   rs  E  r  z$CustomModelResponseIterator.__init__r  r  )r8  r  r  rs  r  r+   r+   r  r,   r  D  s    r  rg  rB   c                 C  s   t jdu rdS d| vrdS | d }t|tsdS |D ]'}t|ts"q|d}|ddkrA|durAt|trA|ddkrA dS qdS )	a+  
    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"}}

    Can be disabled globally by setting litellm.disable_anthropic_gemini_context_caching_transform = True
    TFri  cache_controlr!  r0  NZ	ephemeral)r@   Z2disable_anthropic_gemini_context_caching_transformr   rW  rq   r/  )rg  ri  Zcontent_itemr  r+   r+   r,   is_cached_messageI  s&   



r  r  c                 C  sX   z!|  ds	W dS | dd } tj| dd}t|d| kW S  ty+   Y dS w )Nzdata:Fr  r   T)validatert   )r  rN  base64	b64decode	b64encoder5  r   )r  Zdecoded_bytesr+   r+   r,   is_base64_encodedq  s   r  c                 C  s   d| v r|  dd S | S )z3
    s: b64str OR data:image/png;base64,b64str
    r  r   rM  )r  r+   r+   r,   get_base64_str  s   r  List[AllMessageValues]c                 C  s"   | D ]}| ddur dS qdS )zm
    Returns true, if messages has tool call blocks.

    Used for anthropic/bedrock message validation.
    rS  NTFr.  )r\  rg  r+   r+   r,   has_tool_call_blocks  s
   r  c                 C  sJ   | D ] }| ddkr"| d}|dur"t|drt|dkr" dS qdS )	a  
    Returns true if ANY assistant message has thinking_blocks.

    This is used to prevent dropping the thinking param when some messages
    in the conversation already contain thinking blocks. Dropping thinking
    when thinking blocks exist causes Anthropic error:
    "When thinking is disabled, an assistant message cannot contain thinking"

    Related issue: https://github.com/BerriAI/litellm/issues/18926
    rR  rT  thinking_blocksN__len__r   TFr/  rX  r  )r\  rg  r  r+   r+   r,   )any_assistant_message_has_thinking_blocks  s   
r  c                 C  sb   d}| D ]}| ddkr| ddur|}q|du rdS | d}|du p0t|do0t|dkS )	a  
    Returns true if the last assistant message with tool_calls has no thinking_blocks.

    This is used to detect when thinking param should be dropped to avoid
    Anthropic error: "Expected thinking or redacted_thinking, but found tool_use"

    When thinking is enabled, assistant messages with tool_calls must include thinking_blocks.
    If the client didn't preserve thinking_blocks, we need to drop the thinking param.

    IMPORTANT: This should only be used in conjunction with
    any_assistant_message_has_thinking_blocks() to ensure we don't drop thinking
    when other messages in the conversation contain thinking blocks.

    Related issues: https://github.com/BerriAI/litellm/issues/14194, https://github.com/BerriAI/litellm/issues/9020
    NrR  rT  rS  Fr  r  r   r  )r\  Zlast_assistant_with_toolsrg  r  r+   r+   r,   5last_assistant_with_tool_calls_has_no_thinking_blocks  s   
r  List[ChatCompletionToolParam]c                 C  s   t dtdddi dd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
    r  Z
dummy_toolzThis is a dummy tool callr  r  r  )r!  r  )rF   rG   r9  r+   r+   r,   add_dummy_tool  s   r  )ChatCompletionAudioObjectChatCompletionImageObjectChatCompletionTextObjectChatCompletionUserMessageOpenAIMessageContentValidUserMessageContentTypesUnion[BaseModel, dict]c                 C  s8   t | tr| jd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Zexclude_nonezInvalid message type: z". Expected dict or Pydantic model.)r   r   rU  rq   r  r!  rg  r+   r+   r,   convert_to_dict  s   


r  c                 C  s4   g }| D ]}t tt|}t|d}|| q|S )Nr  )r   rB   r  cleanup_none_field_in_messager   r\  Znew_messagesrg  Zconvert_msg_to_dictZcleaned_messager+   r+   r,   convert_list_message_to_dict  s   
r	  c                 C  sh   g }| D ]*}| dsd|d< | drt|d d|d< ttt|}t|d}|| qt|dS )z{
    Ensures all messages are valid OpenAI chat completion messages.

    Handles missing role for assistant messages.
    rR  rT  rS  )r?  r  r  )r/  jsonify_toolsr   rB   r  r  r   &validate_chat_completion_user_messagesr  r+   r+   r,    validate_and_fix_openai_messages  s   



r  Optional[List[dict]]c                 C  sL   g }| du r| S | D ]}t |tr||  q
t |tr#|| q
|S )z<
    Ensure tools is List[dict] and not List[BaseModel]
    N)r   r   r   rU  rq   r?  Z	new_toolsrZ  r+   r+   r,   validate_and_fix_openai_tools!  s   


r  "Optional['AnthropicThinkingParam']c                 C  sb   | du s	t | ts| S t| }d|v rd|vr|d|d< nd|v r,d|v r,|d td|S )z
    Normalizes camelCase keys in the thinking param to snake_case.
    Handles clients that send budgetTokens instead of budget_tokens.
    NZbudgetTokensZbudget_tokensr   )r   rq   r  r   )r<  
normalizedr+   r+   r,   validate_and_fix_thinking_param0  s   

r  c                 C  s   |   }dd | D S )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
    c                 S  s   i | ]\}}|d ur||qS r  r+   r  r+   r+   r,   ro   H      z1cleanup_none_field_in_message.<locals>.<dictcomp>)r>  r9  )rg  Znew_messager+   r+   r,   r  A  s   r  c                 C  s   t | D ]e\}}z8|d dkr?|d}|dur?t|trW qt|tr?|D ]}t|tr>|dtvr>td|d q&W q tyi } zt|trUtd| dd	t|v rctd
| d|d}~ww | S )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
    rR  r  ri  Nr!  zinvalid content type=zInvalid message at index zG. Please ensure all messages are valid OpenAI chat completion messages.zinvalid content typezInvalid user message at index zL. Please ensure all user messages are valid OpenAI chat completion messages.)	r  r/  r   r  rW  rq   r  r   KeyError)r\  r  r  Zuser_contentr  r  r+   r+   r,   r  K  s8   






r  Optional[Union[dict, str]]c                 C  s   ddl m}m} | du r| S t| tr| S t| tr?| ddv r'd| vr'| S | ddu s5| ddu r=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$ChatCompletionToolChoiceStringValuesNr!  )autononer  r  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  rq   r/  r   r!  )rA  r  r  r+   r+   r,   $validate_chat_completion_tool_choicev  s"   


r  r|  c                 K  s4   | durt | trtjst| dkr| dd } | S )a  
    Validates and fixes OpenAI optional parameters.

    Args:
        stop: Stop sequences (string or list of strings)
        **kwargs: Additional optional parameters

    Returns:
        Validated stop parameter (truncated to 4 elements if needed)
    N   )r   rW  r@   Zdisable_stop_sequence_limitr  )r|  r)  r+   r+   r,   validate_openai_optional_params  s   r  c                   @  s  e Zd ZU dZded< edmddZednddZednddZednddZ	ednddZ
ednddZedoddZedpddZedqddZedrd$d%Zedsd'd(Zedtd*d+Ze	dudvd-d.Zedwd0d1Zedxd3d4Zedyd6d7Zedzd9d:Zed{d<d=Zed|d?d@Zed}dBdCZed~dEdFZeddHdIZe	duddLdMZeddOdPZeddRdSZeddUdVZeddXdYZ edd[d\Z!edd^d_Z"eddadbZ#eddedfZ$eddhdiZ%eddkdlZ&dS )r  Nz3Optional[dict[LlmProviders, tuple[Callable, bool]]]_PROVIDER_CONFIG_MAPr  )dict[LlmProviders, tuple[Callable, bool]]c                   C  s  i t jdd dft jdd dft jdd dft jdd dft jdd dft jd	d dft jd
d dft jdd dft j	dd dft j
dd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dfi t jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jdd dft jd d dft jd!d dft jd"d dft j d#d dft j!d$d dft j"d%d dfi t j#d&d dft j$d'd dft j%d(d dft j&d)d dft j'd*d dft j(d+d dft j)d,d dft j*d-d dft j+d.d dft j,d/d dft j-d0d dft j.d1d dft j/d2d dft j0d3d dft j1d4d dft j2d5d dft j3d6d dfi t j4d7d dft j5d8d dft j6d9d dft j7d:d dft j8d;d dft j9d<d dft j:d=d dft j;d>d dft j<d?d dft j=d@d dft j>dAd dft j?dBd dft j@dCd dft jAdDd dft jBdEd dft jCdFd dft jDdGd dfi t jEdHd dft jFdId dft jGdJd dft jHdKd dft jIdLd dft jJdMd dft jKdNd dft jLdOd dft jMdPd dft jNdQd dft jOdRd dft jPdSd dft jQdTd dft jRdUd dft jSdVd dft jTdWd dft jUdXd dft jVdYd dft jWdZd dft jXd[d dft jYd\d dft jZd]d dft j[d^d dft j\d_d dft j]d`d dft j^dad dft j_dbd dfi
S )czBuild the provider-to-config mapping dictionary.

        Returns a dict mapping provider to (factory_function, needs_model_parameter).
        This avoids expensive inspect.signature() calls at runtime.
        c                   S     t  S r  )r@   OpenAIGPTConfigr+   r+   r+   r,   <lambda>      zBProviderConfigManager._build_provider_config_map.<locals>.<lambda>Fc                   S  r   r  )r@   rL  r+   r+   r+   r,   r"    r#  c                 S  
   t | S r  )r  _get_azure_configr  r+   r+   r,   r"       
 Tc                 S  r$  r  )r  _get_azure_ai_configr  r+   r+   r,   r"    r&  c                 S  r$  r  )r  _get_vertex_ai_configr  r+   r+   r,   r"    r&  c                 S  r$  r  )r  _get_bedrock_configr  r+   r+   r,   r"    r&  c                 S  r$  r  r  _get_cohere_configr  r+   r+   r,   r"    r&  c                 S  r$  r  r*  r  r+   r+   r,   r"    r&  c                   S  r   r  )r@   rq  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ro  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rp  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   Z	A2AConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZBytezChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rf  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ri  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZZAIChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZLambdaAIChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZLlamaAPIConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   OpenAITextCompletionConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZSnowflakeConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ClarifaiConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rM  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rU  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   r`  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZSagemakerChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   r^  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rk  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZFriendliaiChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rs  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   r9  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZEmpowerChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZMinimaxChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZGithubChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZCompactifAIChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZGithubCopilotConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZChatGPTConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZGigaChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZRAGFlowConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  r@   rz  r+   r+   r+   r,   r"    r#  c                   S  r   r  r.  r+   r+   r+   r,   r"     r#  c                   S  r   r  r.  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZAiohttpOpenAIChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rm  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZLlamafileChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZLMStudioChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZGaladrielChatConfigr+   r+   r+   r,   r"  	  r#  c                   S  r   r  )r@   rQ  r+   r+   r+   r,   r"  
  r#  c                   S  r   r  )r@   rS  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rT  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rr  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZVercelAIGatewayConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZCometAPIConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZDataRobotConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rV  r+   r+   r+   r,   r"    r#  c                   S  r   r  r@   rj  r+   r+   r+   r,   r"    r#  c                   S  r   r  r/  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZAzureOpenAITextConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rc  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZOobaboogaConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rb  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   re  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   ZPerplexityChatConfigr+   r+   r+   r,   r"    r#  c                   S  r   r  r@   rZ  r+   r+   r+   r,   r"    r#  c                   S  r   r  r0  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rg  r+   r+   r+   r,   r"    r#  c                   S  r   r  )r@   rh  r+   r+   r+   r,   r"     r#  c                   S  r   r  )r@   ZBasetenConfigr+   r+   r+   r,   r"  !  r#  c                   S  r   r  )r@   rl  r+   r+   r+   r,   r"  "  r#  c                   S  r   r  )r@   rY  r+   r+   r+   r,   r"  $  r#  c                   S  r   r  )r@   ZSambanovaConfigr+   r+   r+   r,   r"  '  r#  c                   S  r   r  )r@   rP  r+   r+   r+   r,   r"  (  r#  c                   S  r   r  )r@   rn  r+   r+   r+   r,   r"  )  r#  c                   S  r   r  )r@   ra  r+   r+   r+   r,   r"  *  r#  c                   S  r   r  )r@   rR  r+   r+   r+   r,   r"  +  r#  c                   S  r   r  )r@   rO  r+   r+   r+   r,   r"  ,  r#  c                   S  r   r  )r@   rd  r+   r+   r+   r,   r"  -  r#  c                   S  r   r  )r@   ZGenAIHubOrchestrationConfigr+   r+   r+   r,   r"  /  r#  c                   S  r   r  )r@   ZFeatherlessAIConfigr+   r+   r+   r,   r"  2  r#  c                   S  r   r  )r@   ZNovitaConfigr+   r+   r+   r,   r"  3  r#  c                   S  r   r  )r@   rt  r+   r+   r+   r,   r"  4  r#  c                   S  r   r  )r@   ZWandbConfigr+   r+   r+   r,   r"  5  r#  c                   S  r   r  )r@   ZDashScopeChatConfigr+   r+   r+   r,   r"  6  r#  c                   S  r   r  )r@   ZMoonshotChatConfigr+   r+   r+   r,   r"  7  r#  c                   S  r   r  )r@   ZDockerModelRunnerChatConfigr+   r+   r+   r,   r"  9  r#  c                   S  r   r  )r@   ZV0ChatConfigr+   r+   r+   r,   r"  <  r#  c                   S  r   r  )r@   ZMorphChatConfigr+   r+   r+   r,   r"  =  r#  c                   S  r   r  )r@   LiteLLMProxyChatConfigr+   r+   r+   r,   r"  ?  r#  c                   S  r   r  )r@   ZGradientAIConfigr+   r+   r+   r,   r"  B  r#  c                   S  r   r  )r@   ZNscaleConfigr+   r+   r+   r,   r"  C  r#  c                   S  r   r  )r@   ZHerokuChatConfigr+   r+   r+   r,   r"  D  r#  c                   S  r   r  )r@   ZOCIChatConfigr+   r+   r+   r,   r"  E  r#  c                   S  r   r  )r@   ZHyperbolicChatConfigr+   r+   r+   r,   r"  F  r#  c                   S  r   r  )r@   ZOVHCloudChatConfigr+   r+   r+   r,   r"  G  r#  c                   S  r   r  )r@   ZAmazonNovaChatConfigr+   r+   r+   r,   r"  H  r#  c                   S  r   r  )r  _get_langgraph_configr+   r+   r+   r,   r"  J  r#  )`rX   r  r  r  AZURE_AI	VERTEX_AIBEDROCKCOHERECOHERE_CHATZDEEPSEEKZGROQZBEDROCK_MANTLEZA2AZBYTEZr\  XAIZZAIZ	LAMBDA_AIZLLAMAZTEXT_COMPLETION_OPENAI	SNOWFLAKECLARIFAIZANTHROPIC_TEXTZVERTEX_AI_BETAZ
CLOUDFLAREZSAGEMAKER_CHAT	SAGEMAKERrY  Z
FRIENDLIAIWATSONXZWATSONX_TEXTZEMPOWERMINIMAXZGITHUBZCOMPACTIFAIr  r  GIGACHATRAGFLOWZCUSTOMZCUSTOM_OPENAIZOPENAI_LIKEZAIOHTTP_OPENAIHOSTED_VLLMZ	LLAMAFILErZ  Z	GALADRIELZ	REPLICATEHUGGINGFACETOGETHER_AI
OPENROUTERVERCEL_AI_GATEWAYCOMETAPIZ	DATAROBOTGEMINIZAI21Z	AI21_CHATZ
AZURE_TEXTZ	NLP_CLOUDZ	OOBABOOGAOLLAMA_CHAT	DEEPINFRA
PERPLEXITYMISTRALZ	CODESTRAL
NVIDIA_NIMZCEREBRASZBASETEN
VOLCENGINEZTEXT_COMPLETION_CODESTRAL	SAMBANOVAZMARITALKVLLMOLLAMArX  TRITONZPETALSSAP_GENERATIVE_AI_HUBZFEATHERLESS_AIZNOVITAr[  ZWANDBZ	DASHSCOPEZMOONSHOTZDOCKER_MODEL_RUNNERZV0ZMORPHLITELLM_PROXYZGRADIENT_AIZNSCALEZHEROKUZOCIZ
HYPERBOLICOVHCLOUDZAMAZON_NOVAZ	LANGGRAPHr+   r+   r+   r,   _build_provider_config_map  s  	 !"#$%&'(,-./0123456789:;<=>?@ABFGHIJKLMNRSTUVWXYZ[\]^_`abcghijklmnrstuvwx|} z0ProviderConfigManager._build_provider_config_maprA  r  r   c                 C  s6   t  j| drt  S t jj| drt  S t  S )z%Get Azure config based on model type.r  )r@   ru  rv  rw  rx  r6  r  r+   r+   r,   r%  O  s
   z'ProviderConfigManager._get_azure_configc                 C  r  )z(Get Azure AI config based on model type.r   AzureFoundryModelInfo)"litellm.llms.azure_ai.common_utilsrV  Zget_azure_ai_config_for_model)rA  rV  r+   r+   r,   r'  X     
z*ProviderConfigManager._get_azure_ai_configc                 C  sv   d| v rt  S d| v rt  S d| v rddlm} | S | t jv r.d| v r*t  S t  S | t jv r7t 	 S t 
 S )z)Get Vertex AI config based on model type.rD  rO  zgpt-ossr   )VertexAIGPTOSSTransformationr0  )r@   rU  rW  ZFlitellm.llms.vertex_ai.vertex_ai_partner_models.gpt_oss.transformationrY  rX  rY  rZ  r[  r\  r]  )rA  rY  r+   r+   r,   r(  _  s   

z+ProviderConfigManager._get_vertex_ai_configc                 C  s   ddl m} || dS )z"Get Bedrock config based on model.r   )get_bedrock_chat_configr  )r  rZ  )rA  rZ  r+   r+   r,   r)  u  rX  z)ProviderConfigManager._get_bedrock_configc                 C  s2   t tjt d}|| }|dkrt S t S )z!Get Cohere config based on route.r   v2)r5  r6  r7  r8  Zget_cohere_router@   ZCohereV2ChatConfigrN  )rA  r   Zrouter+   r+   r,   r+  |  s
   
z(ProviderConfigManager._get_cohere_configc                  C  s   ddl m}  |  S )zGet LangGraph config.r   LangGraphConfig)Z*litellm.llms.langgraph.chat.transformationr]  r\  r+   r+   r,   r2    s   z+ProviderConfigManager._get_langgraph_configr   rX   r  c                 C  s   ddl m} ddlm} ||jr*||j}|du r%td|j d|| S |tj	krDt
jj| dr9t
jS t
jj| drDt
 S tjdu rNt t_tj|}|du rZdS |\}}|rd|| S | S )z
        Returns the provider config for a given provider.

        Uses O(1) dictionary lookup for fast provider resolution.
        r   )create_config_class)JSONProviderRegistryNz	Provider z
 not foundr  )Z'litellm.llms.openai_like.dynamic_configr^  Z$litellm.llms.openai_like.json_loaderr_  existsrl   r/  r  rX   r  r@   ZopenaiOSeriesConfigZis_model_o_series_modelZOpenAIGPT5Configrx  r  r  rT  )rA  r   r^  r_  r  Zconfig_entryZconfig_factoryZneeds_modelr+   r+   r,   rK    s,   



z.ProviderConfigManager.get_provider_chat_configOptional[BaseEmbeddingConfig]c                 C  s  t jj|krt j| rt  S t jj|krt  S t jj|kr$t  S t jj|kr.t 	 S t jj
|kr8t  S t jj|krBt  S t jj|krLt  S t jj|ksXt jj|kraddlm} | S t jj|krpddlm} | S t jj|krddlm} | S t jj|krt  S t jj|krt  S t jj|krt  S t jj |krt ! S t jj"|krddl#m$} | S t jj%|krddl&m'} | S t jj(|krt ) S t jj*|krt + S t jj,|krddl-m.} |/| S t jj0|krt 1 S d S )Nr   )CohereEmbeddingConfig)r  )VolcEngineEmbeddingConfig)OpenrouterEmbeddingConfig)VercelAIGatewayEmbeddingConfig)SagemakerEmbeddingConfig)2r@   rX   VOYAGEr  r  r  rP  r  r<  ZIBMWatsonXEmbeddingConfigrQ  r  INFINITYr  rM  r  r6  r7  Z(litellm.llms.cohere.embed.transformationrb  JINA_AIZ-litellm.llms.jina_ai.embedding.transformationr  rL  Z0litellm.llms.volcengine.embedding.transformationrc  rS  r  r9  ZSnowflakeEmbeddingConfigrE  ZCometAPIEmbeddingConfigr  ZGithubCopilotEmbeddingConfigrC  Z0litellm.llms.openrouter.embedding.transformationrd  rD  Z7litellm.llms.vercel_ai_gateway.embedding.transformationre  r>  ZGigaChatEmbeddingConfigr@  ZHostedVLLMEmbeddingConfigr;  Z/litellm.llms.sagemaker.embedding.transformationrf  Zget_model_configrI  ZPerplexityEmbeddingConfig)rA  r   rb  r  rc  rd  re  rf  r+   r+   r,   r    sh   
z3ProviderConfigManager.get_provider_embedding_configr  rB  present_version_paramsr+  r   c                 C  s"  t jj|kst jj|krt||rt  S t  S t jj|kr#t  S t jj	|kr-t 
 S t jj|kr7t  S t jj|krAt  S t jj|krKt  S t jj|krUt  S t jj|kreddlm} || S t jj|krot  S t jj|kryt  S t jj|krt  S t jj|krt  S t  S )Nr   )get_nvidia_nim_rerank_config)r@   rX   r6  r7  should_use_cohere_v1_clientZCohereRerankConfigZCohereRerankV2Configr3  ZAzureAIRerankConfigrh  ZInfinityRerankConfigri  ZJinaAIRerankConfigr@  ZHostedVLLMRerankConfigrA  ZHuggingFaceRerankConfigrH  ZDeepinfraRerankConfigrK  Z+litellm.llms.nvidia_nim.rerank.common_utilsrk  r4  ZVertexAIRerankConfigrY  ZFireworksAIRerankConfigrg  ZVoyageRerankConfigr<  ZIBMWatsonXRerankConfig)rA  r   r  rj  rk  r+   r+   r,   get_provider_rerank_config   s:   
z0ProviderConfigManager.get_provider_rerank_config%Optional[BaseAnthropicMessagesConfig]c                 C  s   t jj|kr
t  S t jj|krddlm} || S t jj|kr2d| 	 v r0ddl
m} | S d S t jj|krId| 	 v rGddlm} | S d S t jj|krXddlm} | S d S )Nr   r   rO  ),VertexAIPartnerModelsAnthropicMessagesConfig)AzureAnthropicMessagesConfig)MinimaxMessagesConfig)r@   rX   r  ZAnthropicMessagesConfigr5  r  r   Z,get_bedrock_provider_config_for_messages_apir4  rH  Zblitellm.llms.vertex_ai.vertex_ai_partner_models.anthropic.experimental_pass_through.transformationro  r3  Z7litellm.llms.azure_ai.anthropic.messages_transformationrp  r=  Z,litellm.llms.minimax.messages.transformationrq  )rA  r   r   ro  rp  rq  r+   r+   r,   &get_provider_anthropic_messages_config1   s&   
z<ProviderConfigManager.get_provider_anthropic_messages_config&Optional[BaseAudioTranscriptionConfig]c                 C  s   t jj|kr
t  S t jj|krt  S t jj|kr#ddlm} | S t jj	|kr5d| v r1t 
 S t  S t jj|krDddlm} | S t jj|krSddlm} | S t jj|krbddlm} | S d S )Nr   )"ElevenLabsAudioTranscriptionConfigzgpt-4o)"HostedVLLMAudioTranscriptionConfig)"IBMWatsonXAudioTranscriptionConfig) OVHCloudAudioTranscriptionConfig)r@   rX   rY  Z#FireworksAIAudioTranscriptionConfigZDEEPGRAMZ DeepgramAudioTranscriptionConfig
ELEVENLABSZ:litellm.llms.elevenlabs.audio_transcription.transformationrt  r  Z!OpenAIGPTAudioTranscriptionConfigZ%OpenAIWhisperAudioTranscriptionConfigr@  Z6litellm.llms.hosted_vllm.transcriptions.transformationru  r<  Z7litellm.llms.watsonx.audio_transcription.transformationrv  rS  Z8litellm.llms.ovhcloud.audio_transcription.transformationrw  )rA  r   rt  ru  rv  rw  r+   r+   r,   r  T   s*   z=ProviderConfigManager.get_provider_audio_transcription_config Optional[BaseResponsesAPIConfig]c                 C  s`  t jj| kr
t  S t jj| kr@|od| v }|o&d| v p&t|o&| }|o5d| v p5t|o5| }|r<t  S t  S t jj	| krJt 
 S t jj| krTt  S t jj| kr^t  S t jj| krht  S t jj| krrt  S t jj| kr|t  S t jj| krt  S t jj| kr|rd| v rt  S d S t jj| krt  S t jj| krt  S d S )Nr  Zo_series)r@   rX   r  ZOpenAIResponsesAPIConfigr  rH  rq  Z$AzureOpenAIOSeriesResponsesAPIConfigZAzureOpenAIResponsesAPIConfigr8  ZXAIResponsesAPIConfigr  ZGithubCopilotResponsesAPIConfigr  ZChatGPTResponsesAPIConfigrR  ZLiteLLMProxyResponsesAPIConfigrL  ZVolcEngineResponsesAPIConfigMANUSZManusResponsesAPIConfigrI  ZPerplexityResponsesConfigr\  ZDatabricksResponsesAPIConfigrC  ZOpenRouterResponsesAPIConfigr@  ZHostedVLLMResponsesAPIConfig)r   rA  Zis_gpt_modelZis_o_seriesr+   r+   r,   !get_provider_responses_api_config|   sL   z7ProviderConfigManager.get_provider_responses_api_configOptional['BaseSkillsAPIConfig']c                 C  s   t jj| kr
t  S dS )z
        Get provider-specific Skills API configuration

        Args:
            provider: The LLM provider

        Returns:
            Provider-specific Skills API config or None
        N)r@   rX   r  ZAnthropicSkillsConfig)r   r+   r+   r,   get_provider_skills_api_config   s   z4ProviderConfigManager.get_provider_skills_api_configOptional['BaseEvalsAPIConfig']c                 C  s"   t jj| krddlm} | S dS )z
        Get provider-specific Evals API configuration

        Args:
            provider: The LLM provider

        Returns:
            Provider-specific Evals API config or None
        r   )OpenAIEvalsConfigN)r@   rX   r  Z(litellm.llms.openai.evals.transformationr  )r   r  r+   r+   r,   get_provider_evals_api_config   s   z3ProviderConfigManager.get_provider_evals_api_configr   c                 C  s,   t j|kr	t S t j|krt S t S r  )rX   rY  r@   ZFireworksAITextCompletionConfigrB  ZTogetherAITextCompletionConfigr,  r  r+   r+   r,   #get_provider_text_completion_config   s
   

z9ProviderConfigManager.get_provider_text_completion_configOptional[BaseLLMModelInfo]c                 C  sJ  t j|kr	t S t j|krt S t j|krt S t j|kr)ddl	m
} | S t j|kr2t S t j|kr;t S t j|krDt S t j|krMt S t j|ksWt j|kr`ddlm} | S t j|ksjt j|krsddlm} | S t j|kr|t S t j|krt S t j|krddl m!} | S t j"|krddl#m$} || dS d S )Nr   )VertexAIModelInfo)OllamaModelInfo)VLLMModelInfor   rU  r  )%rX   rY  r@   rk  r  r!  rF  ZGeminiModelInfor4  Z#litellm.llms.vertex_ai.common_utilsr  rR  r1  TOPAZZTopazModelInfor  ZAnthropicModelInfor8  ZXAIModelInforO  rG  Z litellm.llms.ollama.common_utilsr  rN  r@  Zlitellm.llms.vllm.common_utilsr  ZLEMONADEZLemonadeChatConfigr:  r-  r5  r  r   r3  rW  rV  )rA  r   r  r  r  r   rV  r+   r+   r,   r     sD   












z-ProviderConfigManager.get_provider_model_infoOptional[BasePassthroughConfig]c                 C  sb   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 d S )Nr   )BedrockPassthroughConfig)VLLMPassthroughConfig)AzurePassthroughConfig)rX   r5  Z/litellm.llms.bedrock.passthrough.transformationr  rN  r@  Z,litellm.llms.vllm.passthrough.transformationr  r  Z-litellm.llms.azure.passthrough.transformationr  )rA  r   r  r  r  r+   r+   r,   get_provider_passthrough_config!  s   

z5ProviderConfigManager.get_provider_passthrough_config"Optional[BaseImageVariationConfig]c                 C  s(   t j|kr	t S t j|krt S d S r  )rX   r  r@   ZOpenAIImageVariationConfigr  ZTopazImageVariationConfigr  r+   r+   r,   #get_provider_image_variation_config'!  s
   

z9ProviderConfigManager.get_provider_image_variation_configOptional[BaseFilesConfig]c                 C  st   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r8ddlm} | S d S )Nr   )GoogleAIStudioFilesHandler)VertexAIFilesConfig)BedrockFilesConfig)ManusFilesConfig)rX   rF  Z(litellm.llms.gemini.files.transformationr  r4  Z+litellm.llms.vertex_ai.files.transformationr  r5  Z)litellm.llms.bedrock.files.transformationr  rz  Z'litellm.llms.manus.files.transformationr  )rA  r   r  r  r  r  r+   r+   r,   get_provider_files_config2!  s   



z/ProviderConfigManager.get_provider_files_configOptional[BaseBatchesConfig]c                 C      t j|krddlm} | S d S )Nr   )BedrockBatchesConfig)rX   r5  Z+litellm.llms.bedrock.batches.transformationr  )rA  r   r  r+   r+   r,   get_provider_batches_configK!     
z1ProviderConfigManager.get_provider_batches_configOptional[CustomLogger]c                 C  s"   ddl m} tj| kr| S d S )Nr   )BedrockVectorStore)ZClitellm.integrations.vector_store_integrations.bedrock_vector_storer  rX   r5  Zget_initialized_custom_logger)r   r  r+   r+   r,    get_provider_vector_store_configV!  s   
z6ProviderConfigManager.get_provider_vector_store_configapi_typeOptional[BaseVectorStoreConfig]c                 C  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rD|dks,|du r5ddl	m
} | S |dkrBddlm} | S dS t jj| krSdd	lm} | S t jj| krbdd
lm} | S t jj| krqddlm} | S t jj| krddlm}	 |	 S t jj| krddlm}
 |
 S t jj| krddlm} | S t jj| krddl m!} | S dS )zT
        v2 vector store config, use this for new vector store integrations
        r   )OpenAIVectorStoreConfig)AzureOpenAIVectorStoreConfigZrag_apiN)VertexVectorStoreConfigZ
search_api) VertexSearchAPIVectorStoreConfig)BedrockVectorStoreConfig)PGVectorStoreConfig)AzureAIVectorStoreConfig)MilvusVectorStoreConfig)GeminiVectorStoreConfig)RAGFlowVectorStoreConfig)S3VectorsVectorStoreConfig)"r@   rX   r  Z0litellm.llms.openai.vector_stores.transformationr  r  Z/litellm.llms.azure.vector_stores.transformationr  r4  Z;litellm.llms.vertex_ai.vector_stores.rag_api.transformationr  Z>litellm.llms.vertex_ai.vector_stores.search_api.transformationr  r5  Z1litellm.llms.bedrock.vector_stores.transformationr  Z	PG_VECTORZ3litellm.llms.pg_vector.vector_stores.transformationr  r3  Z2litellm.llms.azure_ai.vector_stores.transformationr  ZMILVUSZ0litellm.llms.milvus.vector_stores.transformationr  rF  Z0litellm.llms.gemini.vector_stores.transformationr  r?  Z1litellm.llms.ragflow.vector_stores.transformationr  Z
S3_VECTORSZ4litellm.llms.s3_vectors.vector_stores.transformationr  )r   r  r  r  r  r  r  r  r  r  r  r  r  r+   r+   r,   !get_provider_vector_stores_configb!  sH   +z7ProviderConfigManager.get_provider_vector_stores_config$Optional[BaseVectorStoreFilesConfig]c                 C  s"   t jj| krddlm} | S d S )Nr   )OpenAIVectorStoreFilesConfig)r@   rX   r  Z5litellm.llms.openai.vector_store_files.transformationr  )r   r  r+   r+   r,   &get_provider_vector_store_files_config!  s   z<ProviderConfigManager.get_provider_vector_store_files_configr  c                 C  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rKddlm} || S t j|krZddlm} || S t j|kriddlm} || S t j|krxdd	lm}	 |	| S t j|krdd
lm}
 |
 S t j|krddlm} || S t j|krddl m!} || S t j"|krddl#m$} || S t j%|krddl&m'} || S t j(|krddl)m*} || S d S )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_stability_image_generation_config)$get_runwayml_image_generation_config)%get_vertex_ai_image_generation_config)&get_openrouter_image_generation_config)+rX   r  Z$litellm.llms.openai.image_generationr  r  Z#litellm.llms.azure.image_generationr  r3  Z&litellm.llms.azure_ai.image_generationr  Z
XINFERENCEZ(litellm.llms.xinference.image_generationr  RECRAFTZ%litellm.llms.recraft.image_generationr  ZAIMLZ"litellm.llms.aiml.image_generationr  rE  Z&litellm.llms.cometapi.image_generationr  rF  Z$litellm.llms.gemini.image_generationr  rR  Z:litellm.llms.litellm_proxy.image_generation.transformationr  ZFAL_AIZ$litellm.llms.fal_ai.image_generationr  	STABILITYZ'litellm.llms.stability.image_generationr  RUNWAYMLZ&litellm.llms.runwayml.image_generationr  r4  Z'litellm.llms.vertex_ai.image_generationr  rC  Z(litellm.llms.openrouter.image_generationr  )rA  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+   r+   r,   $get_provider_image_generation_config!  sV   













z:ProviderConfigManager.get_provider_image_generation_configOptional[BaseVideoConfig]c                 C  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r8ddlm} | S t j|krFddlm} | S d S )Nr   )OpenAIVideoConfig)AzureVideoConfig)GeminiVideoConfig)VertexAIVideoConfig)RunwayMLVideoConfig)rX   r  Z)litellm.llms.openai.videos.transformationr  r  Z(litellm.llms.azure.videos.transformationr  rF  Z)litellm.llms.gemini.videos.transformationr  r4  Z,litellm.llms.vertex_ai.videos.transformationr  r  Z+litellm.llms.runwayml.videos.transformationr  )rA  r   r  r  r  r  r  r+   r+   r,   get_provider_video_config"  s    




z/ProviderConfigManager.get_provider_video_configOptional[BaseContainerConfig]c                 C  s    t j| krddlm} | S d S )Nr   )OpenAIContainerConfig)rX   r  Z-litellm.llms.openai.containers.transformationr  )r   r  r+   r+   r,   get_provider_container_config1"  s   
z3ProviderConfigManager.get_provider_container_configOptional[BaseRealtimeConfig]c                 C  r  )Nr   )GeminiRealtimeConfig)rX   rF  Z+litellm.llms.gemini.realtime.transformationr  )rA  r   r  r+   r+   r,   get_provider_realtime_config="  r  z2ProviderConfigManager.get_provider_realtime_configOptional[BaseImageEditConfig]c                 C  s*  t j|krddlm} || d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rJddlm} || S t j|krXddlm} | S t j|krgdd	lm} || S t j|krvdd
lm}	 |	| S t j|krddlm}
 |
 S t j|krddlm} || S d S )Nr   )get_openai_image_edit_configr  )AzureImageEditConfig)RecraftImageEditConfig)get_azure_ai_image_edit_config)get_gemini_image_edit_config)LiteLLMProxyImageEditConfig)get_vertex_ai_image_edit_config)get_stability_image_edit_config)BedrockStabilityImageEditConfig) get_openrouter_image_edit_config)rX   r  Zlitellm.llms.openai.image_editr  r  Z,litellm.llms.azure.image_edit.transformationr  r  Z.litellm.llms.recraft.image_edit.transformationr  r3  Z litellm.llms.azure_ai.image_editr  rF  Zlitellm.llms.gemini.image_editr  rR  Z4litellm.llms.litellm_proxy.image_edit.transformationr  r4  Z!litellm.llms.vertex_ai.image_editr  r  Z!litellm.llms.stability.image_editr  r5  Z8litellm.llms.bedrock.image_edit.stability_transformationr  rC  Z"litellm.llms.openrouter.image_editr  )rA  r   r  r  r  r  r  r  r  r  r  r  r+   r+   r,   get_provider_image_edit_configH"  s>   










z4ProviderConfigManager.get_provider_image_edit_configOptional['BaseOCRConfig']c                 C  s   ddl m} |tjjkrddlm} || dS |tjjkr(ddlm	} || dS t
tjt d}tjj|i}||d}|du rBdS | S )z=
        Get OCR configuration for a given provider.
        r   )VertexAIOCRConfig)get_azure_ai_ocr_configr  )get_vertex_ai_ocr_configr   N)Z)litellm.llms.vertex_ai.ocr.transformationr  r@   rX   r3  Z&litellm.llms.azure_ai.ocr.common_utilsr  r4  Z'litellm.llms.vertex_ai.ocr.common_utilsr  r5  r6  r7  r8  rJ  r/  )rA  r   r  r  r  r   PROVIDER_TO_CONFIG_MAPr  r+   r+   r,   get_provider_ocr_config"  s   

z-ProviderConfigManager.get_provider_ocr_config'SearchProviders'Optional['BaseSearchConfig']c                 C  s  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} 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j"|tj#|tj$|tj%|tj&|
tj'|i}|(| d}|du rdS | S )z@
        Get Search configuration for a given provider.
        r   )BraveSearchConfig)DataForSEOSearchConfig)DuckDuckGoSearchConfig)ExaAISearchConfig)FirecrawlSearchConfig)GooglePSESearchConfig)LinkupSearchConfig)ParallelAISearchConfig)PerplexitySearchConfig)SearchAPIConfig)SearXNGSearchConfig)SerperSearchConfig)TavilySearchConfigN))Z(litellm.llms.brave.search.transformationr  Z-litellm.llms.dataforseo.search.transformationr  Z-litellm.llms.duckduckgo.search.transformationr  Z)litellm.llms.exa_ai.search.transformationr  Z,litellm.llms.firecrawl.search.transformationr  Z-litellm.llms.google_pse.search.transformationr  Z)litellm.llms.linkup.search.transformationr  Z.litellm.llms.parallel_ai.search.transformationr  Z-litellm.llms.perplexity.search.transformationr  Z,litellm.llms.searchapi.search.transformationr  Z*litellm.llms.searxng.search.transformationr  Z)litellm.llms.serper.search.transformationr  Z)litellm.llms.tavily.search.transformationr  rc   rI  ZTAVILYZPARALLEL_AIZEXA_AIZBRAVEZ
GOOGLE_PSEZ
DATAFORSEOZ	FIRECRAWLZSEARXNGZLINKUPZ
DUCKDUCKGOZ	SEARCHAPIZSERPERr/  )r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+   r+   r,   get_provider_search_config"  s>   z0ProviderConfigManager.get_provider_search_config"Optional['BaseTextToSpeechConfig']c           	      C  s   ddl m} tjj|kr| drddlm} | S d
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rIddlm} | S tjj|krXddlm} | S tjj|krgdd	lm} | S d
S )zH
        Get text-to-speech configuration for a given provider.
        r   r   zspeech/)AzureAVATextToSpeechConfig)ElevenLabsTextToSpeechConfig)RunwayMLTextToSpeechConfig)VertexAITextToSpeechConfig)MinimaxTextToSpeechConfig)AWSPollyTextToSpeechConfigN)3litellm.llms.base_llm.text_to_speech.transformationr   r@   rX   r  r  Z0litellm.llms.azure.text_to_speech.transformationr  rx  Z5litellm.llms.elevenlabs.text_to_speech.transformationr  r  Z3litellm.llms.runwayml.text_to_speech.transformationr  r4  Z4litellm.llms.vertex_ai.text_to_speech.transformationr  r=  Z2litellm.llms.minimax.text_to_speech.transformationr  Z	AWS_POLLYZ4litellm.llms.aws_polly.text_to_speech.transformationr  )	rA  r   r   r  r  r  r  r  r  r+   r+   r,   "get_provider_text_to_speech_config"  s,   
z8ProviderConfigManager.get_provider_text_to_speech_config.Optional[BaseGoogleGenAIGenerateContentConfig]c                 C  sZ   t jj|krddlm} | S t jj|kr+ddlm} ddlm	} |
| r(d S | S d S )Nr   )GoogleGenAIConfig)VertexAIGoogleGenAIConfig)VertexAIPartnerModels)r@   rX   rF  Z/litellm.llms.gemini.google_genai.transformationr  r4  Z2litellm.llms.vertex_ai.google_genai.transformationr  Z4litellm.llms.vertex_ai.vertex_ai_partner_models.mainr  Zis_vertex_partner_model)rA  r   r  r  r  r+   r+   r,   1get_provider_google_genai_generate_content_config#  s   
	zGProviderConfigManager.get_provider_google_genai_generate_content_config)r  r  )rA  r  r  r   )r  r   )rA  r  r   rX   r  r  )rA  r  r   rX   r  ra  )
rA  r  r   rX   r  rB  rj  r+  r  r   )rA  r  r   rX   r  rn  )rA  r  r   rX   r  rs  r  )r   rX   rA  rB  r  ry  )r   rX   r  r|  )r   rX   r  r~  )rA  r  r   rX   r  r   )rA  rB  r   rX   r  r  )rA  r  r   rX   r  r  )rA  r  r   rX   r  r  )rA  r  r   rX   r  r  )rA  r  r   rX   r  r  )r   rX   r  r  )r   rX   r  rB  r  r  )r   rX   r  r  )rA  r  r   rX   r  r  )rA  rB  r   rX   r  r  )r   rX   r  r  )rA  r  r   rX   r  r  )rA  r  r   rX   r  r  )rA  r  r   rX   r  r  )r   r  r  r  )rA  r  r   rX   r  r  )rA  r  r   rX   r  r  )'r8  r  r  r  r  r  rT  r%  r'  r(  r)  r+  r2  rK  r  rm  rr  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    s   
  ,L*"'2
/

LZ
<*4r  r  service_type(Literal['litellm_logging', 'prometheus']c                 C  sf   t tjt d}tt|t| d}ttt | dp|d}t	j
r&dS |dkr1t	jdur1dS |S )z
    Used for enforcing `disable_end_user_cost_tracking` param.

    service_type: "litellm_logging" or "prometheus" - used to allow prometheus only disable cost tracking.
    r   r  Zuser_api_key_end_user_idNZ
prometheusT)r5  r6  r7  r8  r   rq   r~   r  r/  r@   Zdisable_end_user_cost_trackingZ-enable_end_user_cost_tracking_prometheus_only)r  r  r   	_metadataZend_user_idr+   r+   r,   !get_end_user_id_for_cost_tracking&#  s"   	


r  rj  c                 C  s2   | sdS d|v od|v}|  dp|o|  d S )NFZmax_chunks_per_docZmax_tokens_per_docz
/v1/rerankz
/v2/rerank)endswith)r  rj  Zuses_v1_paramsr+   r+   r,   rl  H#  s   
rl  c              
   C  s   z'|du r|du rW dS |dur|  |s|d |  } t||| dd}|tkW S  tyB } ztd|  W Y d}~dS d}~w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\  r?  rA  rC  z)Error in is_prompt_caching_valid_prompt: )r  rF  r#   r   r   r   )rA  r\  r?  rC  Ztoken_countr  r+   r+   r,   is_prompt_caching_valid_promptU#  s&   
r  srt_or_vtt_contentr  c           
      C  sn   d}t || }|sdS g }|D ]}tt|\}}}}|d |d  | |d  }	||	 q|r5t|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  rf  g     @@)r  findallr  r  r   ri  )
r  Ztimestamp_patternZ
timestampsZ	durationsmatchhoursminutessecondsZmillisecondstotal_secondsr+   r+   r,    extract_duration_from_srt_or_vtts#  s   r	  ending_pathc                 C  s   t | }|ji d}|jd}|d}dd |dD }dd |dD }g }tt|D ]}	||	d |dt||	  krN|d|	 | } nq2|| }dd	| }
|j|
d}t
|j|jdS )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  c                 S     g | ]}|r|qS r+   r+   r  r+   r+   r,   rA  #  rp   z)_add_path_to_api_base.<locals>.<listcomp>c                 S  r  r+   r+   r  r+   r+   r,   rA  #  rp   Nr(  )r  r)  r*  r  rstriplstriprN  r5  r  r   r  r  )r  r
  r+  base_url	base_pathZend_pathZbase_segmentsZend_segmentsZfinal_segmentsr  Zmodified_pathr-  r+   r+   r,   _add_path_to_api_base#  s    

 r  r  c                 C  r  )Nc                 S  s(   i | ]\}}|t jv r|d ur||qS r  )r@   OPENAI_CHAT_COMPLETION_PARAMSr  r+   r+   r,   ro   #  s
    z.get_standard_openai_params.<locals>.<dictcomp>r  r  r+   r+   r,   get_standard_openai_params#  s   r  c                   s(   t j}|t   fdd|  D }|S )Nc                   r  r+   r+   r  r  r+   r,   ro   #  r
  z5get_non_default_completion_params.<locals>.<dictcomp>)r@   r  rj   r9  )r)  r  r  r+   r  r,   !get_non_default_completion_params#  s   
r  c                   s.   ddl m} |t   fdd|  D }|S )Nr   r  c                   r  r+   r+   r  r  r+   r,   ro   #  r  z8get_non_default_transcription_params.<locals>.<dictcomp>)r  r  rj   r9  )r)  r  r  r+   r  r,   $get_non_default_transcription_params#  s   r  r,  Optional[Mapping[str, Any]]c                 C  sh   | du rdS dd |   D }t|dkr0i }d}|  D ]\}}|dk r)|||< |d7 }q|}| S )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
    Nc                 S  s,   i | ]\}}|d krt |trt||qS )Zhidden_paramsr  r  r+   r+   r,   ro   #  s
    z'add_openai_metadata.<locals>.<dictcomp>   r   r   )r9  r  r>  )r,  Zvisible_metadataZfiltered_metadatar  r  r  r+   r+   r,   add_openai_metadata#  s   
r  c                 C  s@   | sd S |  d}t|trt|}|r|S t| }|r|S d S )Nr-  )r/  r   rq   r  )r,  r-  Zcleaned_metadatar+   r+   r,   get_requester_metadata#  s   

r  endpointrL   rb   c           	   
   C  s   ddl m } ddlm} |ddddgdd	d
| d
dd}tt| j}d}z|di ||dd W n tyJ } z
t|}W Y d}~nd}~ww |j	
d}|rXtt|S t|dS )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-turbor  hir1  Fr  1234T)rA  r\  ry  rv  rw  rz  rb  Zlog_raw_request_responserj  zmy-fake-api-key)r  r  Nraw_request_typed_dict)r   r+   )r  r  r  r  r5  r@   rl   r   r  r  r/  r   rb   )	r  r)  r  r  r  Zllm_api_endpointZreceived_exceptionr  r  r+   r+   r,   return_raw_request$  sB   

r   	List[Any]c                 C  sP   g }| D ]!}t |tr|jdd}n	t |tr| }t |tr%|| q|S )zn
    Fixes https://github.com/BerriAI/litellm/issues/9321

    Where user passes in a pydantic base model
    Tr  )r   r   rU  rq   r>  r   r  r+   r+   r,   r
  2$  s   



r
  ri   c                   C  s   t ddddS )Nr   )Zprompt_tokensZcompletion_tokensr  )ri   r+   r+   r+   r,   get_empty_usageC$  s
   r"  mock_tool_callsmock_timeoutc                 C  s   | s|s|rdS dS r  r+   )r  r#  r$  r+   r+   r,   should_run_mock_completionK$  s   r%  r  c                 C  s>   ddl m} | }| |v r||  }|| S tdtd| )zSLazy import handler for utils module with cached registry for improved performance.r   )_get_lazy_import_registryzmodule z has no attribute )litellm._lazy_importsr&  AttributeErrorr8  )r  r&  registryZhandler_funcr+   r+   r,   __getattr__U$  s   r*  )Fr   )r   r   r   r   )r   r  r  r  r  r  )r  r  r  r   )r)  r*  r  r+  )r)  rq   )r<  r=  r  r{   )rA  rB  rC  rB  r  r   )rK  r  rL  r  r  r  )rP  rq   rQ  r  r  rq   )r\  r{   rQ  r  r  r{   )r`  r  )r  r   r  r   )r)  r*  r  r   r  r  )r)  r*  r  r   r  r  r  )r)  r*  rv  r  )r  rq   r  rw   rv  r  r  r  )r  r  r  )r)  r  r  r   r  r   )r)  r*  rv  r  r  r   r  )rA  r  r  r  )rA  r  r  rd   )rA  r  r  r&  )rj  rj  N)r  r  )r3  r4  r  r  )r7  N)r  r  r  rB  )r8  r  )	rj  NNNFNNFN)r  r:  r0  r;  r\  r<  r=  r>  r?  r@  rA  rB  rC  r>  rD  rE  r  r  )rC  r  r  r   )rA  r  rC  rB  r  r   )rA  r  rC  rB  r:  r  r  rd  )rA  r  rC  rB  r:  r  r  r   )rA  r  rC  rB  r  r   )ru  ry   rv  rq   r  rq   )ri  r{  )r  rq   r  rq   r  r  r  rq   )NNNNNN)rA  r  rC  r  r  rB  re  rB  r  rB  r  rE  r  r  r  r>  )r  rB  r  r  )NNNNNNNNNNN)rA  rB  r  rE  r  rB  r  rB  r  rB  r  rB  r  rB  rC  rB  r  r  r  r  r  r>  )NNNrj  NNN)rA  r  r  rB  r  rB  r  rE  r  r>  r  r   r  r   )r  )r  rq   r  r   r  rq   )r)  rq   r  rq   )FFN)r  rq   r  rq   rC  r  r  r   rA  r  r  r   r  r   r  r  r  rq   )r  rq   r  rq   )r  rq   r  rq   rC  r  r  rq   )%NNNNNFNNNNNNNNNNNrj  NNNNNNNNNNNNNNNNNNN)rA  r  r  r   r\  r;  r<  r=  r>  r?  r@  rB  )r  rq   r  rq   rC  r  r  r+  r  r  r  rq   )r  rq   r  rq   r  rW  )r  rq   r  rq   )
r  rE  r  rE  r  rE  r  rE  r  rE  )r  r  r  r{   )rC  r  r  r   r  rB  )r  r   r  r  )r  r   r  r   )r  r   r  r  r  r   )r  r   r  rB  r  rB  )r)  rq   r  r  )r0  r  r  r  )r  r  r  r  )r  r  r  rB  )rA  r  r  rE  r  )r  r  r  r  )rA  r  rC  rB  r  r  r  )r  r  )r  r  r  rB  )r  r  r  rB  )r:  r  r  rq   )rV  rq   rC  rB  r  r   )rA  r  rC  rB  r  r  )r  r  r  rE  )rA  r  rC  rB  r  rB  r  r]   )rA  r  rC  rB  r  r  )r  r  r  r   r  )rA  r  rC  rB  r  rB  r  r\   )r  r  )r  rq   )rj  rj  rj  r   r   )rA  r  rC  r  r  r  re  r  r/  r  r0  r  )rC  r  r  r8  )NNNN)
rA  rB  r  rB  r  rB  r  rB  r  rq   )rA  r  r  r  )r  r  )rZ  r[  r  )
rc  r  rB  r  rZ  r[  rd  r  r  re  )
rA  r  rk  rq   rl  r  rm  r  rn  rq   )r  rE  )r  r  r  rE  )rA  rB  r  r   )rA  rB  r  r  r  r   )rC  rB  r  r+  )r  r   rC  r  r  r  r  r+  )NNNNN)r  r>  rC  rB  r  r  r  rB  r  rB  r  r+  )rg  rB   r  r   )r  r  r  r   )r  r  r  r  )r\  r  r  r   )rC  r  r  r  )rg  r  r  rq   )r\  r{   )r?  r<  r  r  )r<  r  r  r  )rg  rB   )r\  r  )rA  r  r  r  )r|  r;  r  r;  )r  )r  rq   r  r  r  rB  )r  rB  rj  r+  )
rA  r  r\  r;  r?  r@  rC  rB  r  r   )r  r  r  r  )r  r  r
  r  r  r  )r  rq   r  rq   )r,  r  r  r   )r,  rq   )r  rL   r)  rq   r  rb   )r?  r!  r  r  )r  ri   )r  r  r#  r  r$  r  r  r   )r  r  r  rw   (   
__future__r   r!  r  r  binasciir  r>  r  r  r   io	itertoolsr8  loggingr<  rg  r  struct
subprocessr6  textwrap	threadingr6  r  dataclassesr   r   	functoolsr   r   	importlibr   r   r	   Zos.pathr
   r   r   Zdotenvr  r  Ztiktokenr   Zhttpx._utilsr   Z
openai.libr   r   Z*openai.types.chat.completion_create_paramsr   Zpydanticr   r   Z
tokenizersr   r@   Zlitellm.litellm_core_utilsZ/litellm.litellm_core_utils.json_validation_ruler'  r   r   r   Zlitellm._uuidr   r  r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r5   r:   r1   r)   r-   r2   r7   r;   r<   rA   r  rB   rC   rD   rE   rF   rG   rH   rI   Zlitellm.types.utilsrJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rr   r  filesjoinpathr  fr  Z	json_dataImportErrorr(  r  	open_textdumpsr-  importlib.metadatatypingrv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   ZOriginalErrorZ litellm.llms.base_llm.base_utilsr   r   r6   r4   r9   r*   r(   Z*litellm.llms.base_llm.files.transformationr   Zlitellm.proxy._typesr   Z2litellm.litellm_core_utils.exception_mapping_utilsr   r  r   r   Z6litellm.litellm_core_utils.get_supported_openai_paramsr   ZFlitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser   r   r   r   r   Z:litellm.litellm_core_utils.llm_response_utils.get_api_baser   Z?litellm.litellm_core_utils.llm_response_utils.response_metadatar   r  r   Z*litellm.litellm_core_utils.redact_messagesr   r   Z,litellm.litellm_core_utils.streaming_handlerr   Z1litellm.llms.base_llm.google_genai.transformationr   Z(litellm.llms.base_llm.ocr.transformationr   Z+litellm.llms.base_llm.search.transformationr   r  r   r  r   Z litellm.llms.cohere.common_utilsr   Z'litellm.llms.mistral.ocr.transformationr   Z)litellm.litellm_core_utils.cached_importsr   r   r   r  r   r   r   Z0litellm.litellm_core_utils.dot_notation_indexingr   r   Z-litellm.litellm_core_utils.get_litellm_paramsr   r   Z,litellm.litellm_core_utils.llm_request_utilsr   ZBlitellm.litellm_core_utils.llm_response_utils.get_formatted_promptr   Z9litellm.litellm_core_utils.llm_response_utils.get_headersr   r   Z litellm.litellm_core_utils.rulesr   Z/litellm.litellm_core_utils.thread_pool_executorr   Z7litellm.llms.base_llm.anthropic_messages.transformationr   Z8litellm.llms.base_llm.audio_transcription.transformationr   Z&litellm.llms.custom_httpx.http_handlerr   r   Z*litellm.router_utils.get_retry_from_policyr   r   Zlitellm.secret_managers.mainr   Z,litellm.llms.base_llm.batches.transformationr   Z/litellm.llms.base_llm.containers.transformationr   Z.litellm.llms.base_llm.embedding.transformationr   Z/litellm.llms.base_llm.image_edit.transformationr   Z5litellm.llms.base_llm.image_generation.transformationr   Z5litellm.llms.base_llm.image_variations.transformationr   Z0litellm.llms.base_llm.passthrough.transformationr   Z-litellm.llms.base_llm.realtime.transformationr   Z+litellm.llms.base_llm.rerank.transformationr   Z1litellm.llms.base_llm.vector_store.transformationr   Z7litellm.llms.base_llm.vector_store_files.transformationr   Z+litellm.llms.base_llm.videos.transformationr   Zlitellm.types.llms.anthropicr   r   Zlitellm.types.rerankr   r   r   r   r  r   Z)litellm.llms.base_llm.chat.transformationr   Z/litellm.llms.base_llm.completion.transformationr   Z*litellm.llms.base_llm.evals.transformationr   Z.litellm.llms.base_llm.responses.transformationr   Z+litellm.llms.base_llm.skills.transformationr   Z_loggingr   r   Zcaching.cachingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsentry_sdk_instanceZcapture_exceptionr  ZposthogZ	slack_appZalerts_channelZheliconeLoggerZathinaLoggerZpromptLayerLoggerZlangsmithLoggerZlogfireLoggerZweightsBiasesLoggerZcustomLoggerZlangFuseLoggerZopenMeterLoggerZ
lagoLoggerZdataDogLoggerZprometheusLoggerZdynamoLoggerZs3LoggerZgreenscaleLoggerZlunaryLoggerZaispendLoggerZsupabaseClientr   r  r   r   Zlast_fetched_atZlast_fetched_at_keysr   r   r  r  r  r1  r3  r;  r@  rJ  rO  rY  r[  r_  r  r  r  r  r  r  r  r  r  r  r  r  r  rl   r  r  r  r  r!  r"  r/  r5  r  r9  rF  rI  rK  rP  rQ  rR  rW  r]  r`  rb  rg  rN  rj  rl  rm  rn  ro  rp  rq  rs  rt  ry  rw  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  r  r  r  r  r  r  r  r  rh  r  r  Ztyping_extensionsr  r  r  r  r  re  r  rU  r  r
  r'  r.  r7  r:  r@  rK  rL  rS  rW  rX  rY  rb  rj  ro  rp  r  r  r  r  r  r  r  r  r  r  Zlitellm.caching.in_memory_cacher  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  rl  r  r	  r  r  r  r  r  r  r   r
  r"  r%  r*  r+   r+   r+   r,   <module>   s  8(
#

@ :~
@
		#    "
u      


'".	9

-j]   V!OFg      8<+/	.2
>)).  >g[+   %CV>m
BR4
!!(	":
	
+%        }"&
%-
