o
    ưiS                     @   s  d dl mZmZmZmZmZmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d	Zd
ZerJd dlmZ i fdededededef
ddZdedee fddZdedee fddZ dedeeef fddZ!dedee fddZ"dedee fd d!Z#ded"ee fd#d$Z$ded%eeef fd&d'Z%d(ed) d*efd+d,Z&deded- fd.d/Z'd0ed1ed2edefd3d4Z(d5ee dee fd6d7Z)dS )8    )TYPE_CHECKINGAnyDictIterableListLiteralOptionalN)
get_secret)verbose_proxy_loggerCustomLogger)CommonProxyErrorsLiteLLMPromptInjectionParams)get_instance_fn)#StandardLoggingGuardrailInformationStandardLoggingPayloadz[94mz[0m)Loggingvaluepremium_userconfig_file_pathlitellm_settingscallback_specific_paramsc           2   	   C   s  ddl m} ddlm} ddlm} tt d|  dt	  t
| trag }| D ]}	t
|	tr6||	}	t
|	trF|	tjv rF||	 q)t
|	tr|	dkrddlm}
 |d	d }|d urct|}i }d|v rtt
|d trt|d }d
|i|}|
d@i |}|| q)t
|	tr|	dkrzddlm} W n ty   tdtjj w |durtdtjj | }|| q)t
|	tr|	dkrzddlm} W n ty   tdtjj w |durtdtjj | }|| q)t
|	tr-|	dkr-zddl m!} W n ty   tdtj"j w |dur$tdtjj | }|| q)t
|	trV|	dkrVddl#m$} i }d|v rI|d }|d@i |}|| q)t
|	trp|	dkrpddl%m&} | }|| q)t
|	tr|	dkrzddl'm(} W n ty   tdtj"j w |durtdtjj | }|| q)t
|	tr|	d krzdd!l)m*} W n ty   td"tjj w |durtd"tjj | }|| q)t
|	tr |	d#kr zdd$l+m,} W n ty   td%tj"j w |durtd&tjj ||d}|| q)t
|	trZ|	d'krZzdd(l-m.}  W n tyC   td)tj"j w |durQtd*tjj |  }!||! q)t
|	tr|	d+krdd,l/m0}" d }#d-|v r}|d- }$t1d@i |$}#|"|#d.}%||% q)t
|	tr|	d/krdd0l2m3}& |& }'||' q)t
|	tr|	d1krdd2l4m5}( |d3 })|)6 D ]\}*}+|+d urt
|+tr|+7d4rt8|+|)|*< q|(d@i |)},||, q)t
|	tr|	d5krdd6l9m:}- |-j;||d7}.||. q)t
|	tr|	d8krdd9l<m=}/ |/ }0||0 q)t
|	|r)||	 q)tt d:|	 d;t	  |t>|	|d< q)t
tj?trNtj?@| n|t_?d=| v r`dd>lAmB}1 |1C  nt>| |d<gt_?tt d?tj? d;t	  d S )ANr   r   )LoggingCallbackManager)prisma_clientzinitializing callbacks=z	 on proxyZpresidio)_OPTIONAL_PresidioPIIMaskingpresidio_logging_onlyZlogging_onlyZllamaguard_moderations)_ENTERPRISE_LlamaGuardz MissingTrying to use Llama GuardTzTrying to use Llama GuardZhide_secrets)_ENTERPRISE_SecretDetectionzTrying to use Secret DetectionzTrying to use secret hidingZopenai_moderations)_ENTERPRISE_OpenAI_Moderationz'Trying to use OpenAI Moderations Check,z&Trying to use OpenAI Moderations CheckZlakera_prompt_injection)lakeraAI_ModerationZaporia_prompt_injection)AporiaGuardrailZgoogle_text_moderation) _ENTERPRISE_GoogleTextModerationz%Trying to use Google Text Moderation,z$Trying to use Google Text ModerationZllmguard_moderations)_ENTERPRISE_LLMGuardzTrying to use Llm GuardZblocked_user_check)_ENTERPRISE_BlockedUserListzTrying to use Blocked User Listz$Trying to use ENTERPRISE BlockedUserZbanned_keywords)_ENTERPRISE_BannedKeywordszTrying to use Banned Keywordsz&Trying to use ENTERPRISE BannedKeywordZdetect_prompt_injection)"_OPTIONAL_PromptInjectionDetectionprompt_injection_params)r&   Zbatch_redis_requests)_PROXY_BatchRedisRequestsZazure_content_safety)_PROXY_AzureContentSafetyazure_content_safety_paramszos.environ/Zwebsearch_interception)WebSearchInterceptionLogger)r   r   Zdatadog_cost_management)DatadogCostManagementLoggerz% attempting to import custom calback= )r   r   Z
prometheus)PrometheusLoggerz Initialized Callbacks -  )D"litellm.integrations.custom_loggerr   Z3litellm.litellm_core_utils.logging_callback_managerr   Zlitellm.proxy.proxy_serverr   r
   debugblue_color_codereset_color_code
isinstanceliststrZ$_add_custom_callback_generic_api_strlitellmZ)_known_custom_logger_compatible_callbacksappendZ1litellm.proxy.guardrails.guardrail_hooks.presidior   getbooldictZ3litellm_enterprise.enterprise_callbacks.llama_guardr   ImportError	Exceptionr   Zmissing_enterprise_packager   Znot_premium_userZ8litellm_enterprise.enterprise_callbacks.secret_detectionr   Z-enterprise.enterprise_hooks.openai_moderationr   Z!missing_enterprise_package_dockerZ2litellm.proxy.guardrails.guardrail_hooks.lakera_air   Z<litellm.proxy.guardrails.guardrail_hooks.aporia_ai.aporia_air    Z2enterprise.enterprise_hooks.google_text_moderationr!   Z1litellm_enterprise.enterprise_callbacks.llm_guardr"   Z-enterprise.enterprise_hooks.blocked_user_listr#   Z+enterprise.enterprise_hooks.banned_keywordsr$   Z.litellm.proxy.hooks.prompt_injection_detectionr%   r   Z#litellm.proxy.hooks.batch_redis_getr'   Z(litellm.proxy.hooks.azure_content_safetyr(   items
startswithr	   Z3litellm.integrations.websearch_interception.handlerr*   Zinitialize_from_proxy_configZ4litellm.integrations.datadog.datadog_cost_managementr+   r   	callbacksextendZlitellm.integrations.prometheusr-   Z_mount_metrics_endpoint)2r   r   r   r   r   r   r   r   Zimported_listcallbackr   r   Z_presidio_paramsparamsZpii_masking_objectr   Zllama_guard_objectr   Z_secret_detection_objectr   Zopenai_moderations_objectr   Zinit_paramsZlakera_moderations_objectr    Zaporia_guardrail_objectr!   Zgoogle_text_moderation_objr"   Zllm_guard_moderation_objr#   Zblocked_user_listr$   Zbanned_keywords_objr%   r&   Z!prompt_injection_params_in_configZprompt_injection_detection_objr'   Zbatch_redis_objr(   r)   kvZazure_content_safety_objr*   Zwebsearch_interception_objr+   Zdatadog_cost_management_objr-   r.   r.   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/common_utils/callback_utils.pyinitialize_callbacks_on_proxy   s  












rF   kwargsreturnc                 C   s>   |  dd pi }| t| pi }| dd }|d ur|S d S )NZlitellm_paramsmodel_group)r8   &get_metadata_variable_name_from_kwargs)rG   Z_litellm_params	_metadata_model_groupr.   r.   rE   #get_model_group_from_litellm_kwargsD  s   rM   datac                 C   s,   |  dd pi }| dd }|d ur|S d S )NmetadatarI   )r8   )rN   rK   rL   r.   r.   rE   !get_model_group_from_request_dataP  s
   rP   c           	      C   s   i }|  ddp	i }t| }|r|ddddnd}d| }| |d}|r0||d| < d| }| |d}|rD||d	| < |S )
z
    Helper function to return x-litellm-key-remaining-tokens-{model_group} and x-litellm-key-remaining-requests-{model_group}

    Returns {} when api_key + model rpm/tpm limit is not set

    rO   N/-:zlitellm-key-remaining-requests-z!x-litellm-key-remaining-requests-zlitellm-key-remaining-tokens-zx-litellm-key-remaining-tokens-)r8   rP   replace)	rN   headersrK   rI   Zh11_model_group_nameZ remaining_requests_variable_nameZremaining_requestsZremaining_tokens_variable_nameZremaining_tokensr.   r.   rE   3get_remaining_tokens_and_requests_from_request_dataY  s(   

rV   request_datac                 C   s   |  dd }|s|  dd }t|tsi }i }d|v r$d|d |d< d|v r1d|d |d< d|v rN|d }t|trN|rNd	d
d | D |d< d|v rZt|d |d< | d}t|trk|| |S d|v ryt|d  |d< |S )NrO   litellm_metadataapplied_guardrails,zx-litellm-applied-guardrailsapplied_policieszx-litellm-applied-policiespolicy_sourcesz; c                 s   s"    | ]\}}| d | V  qdS )=Nr.   ).0namereasonr.   r.   rE   	<genexpr>  s    
z.get_logging_caching_headers.<locals>.<genexpr>zx-litellm-policy-sourceszsemantic-similarityzx-litellm-semantic-similarityZpillar_response_headersZpillar_flaggedzx-pillar-flagged)r8   r3   r:   joinr=   r5   updatelower)rW   rK   rU   sourcesZpillar_headersr.   r.   rE   get_logging_caching_headers|  s6   




rf   guardrail_namec                 C   sJ   |d u rd S |  dd pi }d|v r|d | n|g|d< || d< d S )NrO   rY   r8   r7   )rW   rg   rK   r.   r.   rE   *add_guardrail_to_applied_guardrails_header  s   
ri   policy_namec                 C   sV   |du rdS |  ddpi }d|v r ||d vr|d | n|g|d< || d< dS )z
    Add a policy name to the applied_policies list in request metadata.

    This is used to track which policies were applied to a request,
    similar to how applied_guardrails tracks guardrails.
    NrO   r[   rh   )rW   rj   rK   r.   r.   rE   %add_policy_to_applied_policies_header  s   	
rk   r\   c                 C   sP   |sdS |  ddpi }| di }t|tsi }|| ||d< || d< dS )z
    Store policy match reasons in metadata for x-litellm-policy-sources header.

    Args:
        request_data: The request data dict
        policy_sources: Map of policy_name -> matched_via reason
    NrO   r\   )r8   r3   r:   rc   )rW   r\   rK   existingr.   r.   rE   add_policy_sources_to_metadata  s   

rm   litellm_logging_objLiteLLMLoggingguardrail_responsec                 C   sR   | d u rd S | j d}|d u rd S |dg }|d u rg }|| ||d< |S )Nstandard_logging_objectguardrail_information)Zmodel_call_detailsr8   r7   )rn   rp   rq   rr   r.   r.   rE   1add_guardrail_response_to_standard_logging_object  s   

rs   )rO   rX   c                 C   s   d| v rdS dS )a  
    Helper to return what the "metadata" field should be called in the request data

    - New endpoints return `litellm_metadata`
    - Old endpoints return `metadata`

    Context:
    - LiteLLM used `metadata` as an internal field for storing metadata
    - OpenAI then started using this field for their metadata
    - LiteLLM is now moving to using `litellm_metadata` for our metadata
    rX   rO   r.   )rG   r.   r.   rE   rJ     s   rJ   	_callbackcallback_typeenvironment_variablesc                 C   sJ   t | }i }|D ]}||d}|du rd||< q	|||< q	| ||dS )zHProcess a single callback and return its data with environment variablesN)r_   	variablestype)r   Zget_callback_env_varsr8   )rt   ru   rv   Zenv_varsZenv_vars_dictZ_varZenv_variabler.   r.   rE   process_callback  s   


ry   r?   c                 C   s   | d u rg S dd | D S )Nc                 S   s"   g | ]}t |tr| n|qS r.   )r3   r5   rd   )r^   cr.   r.   rE   
<listcomp>  s   " z,normalize_callback_names.<locals>.<listcomp>r.   )r?   r.   r.   rE   normalize_callback_names  s   r|   )*typingr   r   r   r   r   r   r   r6   r	   Zlitellm._loggingr
   r/   r   Zlitellm.proxy._typesr   r   Zlitellm.proxy.types_utils.utilsr   Zlitellm.types.utilsr   r   r1   r2   Z*litellm.litellm_core_utils.litellm_loggingr   ro   r9   r5   r:   rF   rM   rP   rV   rf   ri   rk   rm   rs   rJ   ry   r|   r.   r.   r.   rE   <module>   sz   $ 
  1	##




