
    h>                        d dl Z d dlmZmZmZmZmZmZmZ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 d dlmZmZmZmZmZmZmZ er&d dlmZ d d	lm Z! d d
l"m#Z# d dl$m%Z% d dl&m'Z' e
eef   Zn
eZeZ!eZ#eZ%eZ' G d d      Z(y)    N)	TYPE_CHECKINGAnyAsyncGeneratorDictListLiteralOptionalTupleUnion)	BaseModel)	DualCache)ArgillaItem)AllMessageValuesChatCompletionRequest)AdapterCompletionStreamWrapper	CallTypesLLMResponseTypesModelResponseModelResponseStreamStandardCallbackDynamicParamsStandardLoggingPayload)Span)Logging)UserAPIKeyAuth)MCPPostCallResponseObject)PreRoutingHookResponsec                      e Zd ZdTdeddfdZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Z	 	 	 dUdedee   dedee   dee   dededeee      dee   dee   deeee   ef   fdZ	 	 dVdedee   dedee   dee   dedee   dee   deeee   ef   fdZ	 	 	 	 dWdededeeeeef         deeeef      dee   dee   fdZ	 	 dVdededeee      dee   dee   dee   fd Zd!eeef   d"ee    dee   fd#Z!d$edee   dee   fd%Z"d$edee   fd&Z#d'ed(e$d"ee    dee$   fd)Z%d*e&d+ee   d!efd,Z'd+ed!ed-e&fd.Z(d+ed!ed-e&fd/Z)dee*   fd0Z+d(e,dee-   fd1Z.d2edee/   fd3Z0d4e1d5ee2   dee1   fd6Z3	 d7e4d8e5d9ed"e6d:   deee&eef      f
d;Z7	 dXd'ed-e&d7e4d<ee   fd=Z8d9ed7e4d(e$defd>Z9d!ed?ed"edeeef   fd@Z:d!ed?ed"edeeef   fdAZ;d9ed7e4d"e6dB   defdCZ<d7e4d(edefdDZ=d7e4d(ed'ede>e?df   fdEZ@dF ZAdG ZBdH ZCdI ZDdJeEdeeE   fdKZFdLe2fdMZGdLe2dNedOeddfdPZHdQedOedefdRZI	 dXdee   dee   fdSZJy)YCustomLoggermessage_loggingreturnNc                     || _         y N)r   )selfr   kwargss      ^/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/integrations/custom_logger.py__init__zCustomLogger.__init__2   s    .    c                      y r"    r#   modelmessagesr$   s       r%   log_pre_api_callzCustomLogger.log_pre_api_call6       r'   c                      y r"   r)   r#   r$   response_obj
start_timeend_times        r%   log_post_api_callzCustomLogger.log_post_api_call9   r.   r'   c                      y r"   r)   r0   s        r%   log_stream_eventzCustomLogger.log_stream_event<   r.   r'   c                      y r"   r)   r0   s        r%   log_success_eventzCustomLogger.log_success_event?   r.   r'   c                      y r"   r)   r0   s        r%   log_failure_eventzCustomLogger.log_failure_eventB   r.   r'   c                    K   y wr"   r)   r0   s        r%   async_log_stream_eventz#CustomLogger.async_log_stream_eventG   	        c                    K   y wr"   r)   r*   s       r%   async_log_pre_api_callz#CustomLogger.async_log_pre_api_callJ   r=   r>   c                    K   y wr"   r)   r0   s        r%   async_log_success_eventz$CustomLogger.async_log_success_eventM   r=   r>   c                    K   y wr"   r)   r0   s        r%   async_log_failure_eventz$CustomLogger.async_log_failure_eventP   r=   r>   r+   r,   non_default_params	prompt_idprompt_variablesdynamic_callback_paramslitellm_logging_objtoolsprompt_labelprompt_versionc                    K   |||fS wax  
        Returns:
        - model: str - the model to use (can be pulled from prompt management tool)
        - messages: List[AllMessageValues] - the messages to use (can be pulled from prompt management tool)
        - non_default_params: dict - update with any optional params (e.g. temperature, max_tokens, etc.) to use (can be pulled from prompt management tool)
        r)   )r#   r+   r,   rE   rF   rG   rH   rI   rJ   rK   rL   s              r%    async_get_chat_completion_promptz-CustomLogger.async_get_chat_completion_promptU   s     & h 222s   c	                     |||fS rN   r)   )	r#   r+   r,   rE   rF   rG   rH   rK   rL   s	            r%   get_chat_completion_promptz'CustomLogger.get_chat_completion_promptj   s    " h 222r'   request_kwargsinputspecific_deploymentc                    K   yw)z
        This hook is called before the routing decision is made.

        Used for the litellm auto-router to modify the request before the routing decision is made.
        Nr)   )r#   r+   rR   r,   rS   rT   s         r%   async_pre_routing_hookz#CustomLogger.async_pre_routing_hook   s      r>   healthy_deploymentsparent_otel_spanc                    K   |S wr"   r)   )r#   r+   rW   r,   rR   rX   s         r%   async_filter_deploymentsz%CustomLogger.async_filter_deployments   s      #"s   r$   	call_typec                    K   yw)a  
        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.

        Used in managed_files.py
        Nr)   )r#   r$   r[   s      r%   async_pre_call_deployment_hookz+CustomLogger.async_pre_call_deployment_hook   s      	r>   
deploymentc                    K   y wr"   r)   )r#   r^   rX   s      r%   async_pre_call_checkz!CustomLogger.async_pre_call_check         	r>   c                      y r"   r)   )r#   r^   s     r%   pre_call_checkzCustomLogger.pre_call_check   r.   r'   request_dataresponsec                    K   yw)zh
        Allow modifying / reviewing the response just after it's received from the deployment.
        Nr)   )r#   rd   re   r[   s       r%   'async_post_call_success_deployment_hookz4CustomLogger.async_post_call_success_deployment_hook   s      	r>   	exceptionoriginal_model_groupc                    K   y wr"   r)   )r#   rh   ri   r$   s       r%    log_model_group_rate_limit_errorz-CustomLogger.log_model_group_rate_limit_error   ra   r>   original_exceptionc                    K   y wr"   r)   r#   ri   r$   rl   s       r%   log_success_fallback_eventz'CustomLogger.log_success_fallback_event   ra   r>   c                    K   y wr"   r)   rn   s       r%   log_failure_fallback_eventz'CustomLogger.log_failure_fallback_event   ra   r>   c                      y)zt
        Translates the input params, from the provider's native format to the litellm.completion() format.
        Nr)   )r#   r$   s     r%   !translate_completion_input_paramsz.CustomLogger.translate_completion_input_params        	r'   c                      y)z\
        Translates the output params, from the OpenAI format to the custom format.
        Nr)   )r#   re   s     r%   "translate_completion_output_paramsz/CustomLogger.translate_completion_output_params   rt   r'   completion_streamc                      y)z^
        Translates the streaming chunk, from the OpenAI format to the custom format.
        Nr)   )r#   rw   s     r%   ,translate_completion_output_params_streamingz9CustomLogger.translate_completion_output_params_streaming   rt   r'   logged_itemstandard_logging_payloadc                     K   t        d      w)z
        - Decide if the result should be logged to Argilla.
        - Modify the result before logging to Argilla.
        - Return None if the result should not be logged to Argilla.
        z"async_dataset_hook not implemented)NotImplementedError)r#   rz   r{   s      r%   async_dataset_hookzCustomLogger.async_dataset_hook   s      ""FGGs   user_api_key_dictcachedata)
completiontext_completion
embeddingsimage_generation
moderationaudio_transcriptionpass_through_endpointrerankc                    K   y wr"   r)   )r#   r   r   r   r[   s        r%   async_pre_call_hookz CustomLogger.async_pre_call_hook   s     $ 	r>   traceback_strc                    K   y wr"   r)   )r#   rd   rl   r   r   s        r%   async_post_call_failure_hookz)CustomLogger.async_post_call_failure_hook  s      	r>   c                    K   y wr"   r)   )r#   r   r   re   s       r%   async_post_call_success_hookz)CustomLogger.async_post_call_success_hook  s      	r>   resultc                    K   ||fS wzUFor masking logged request/response. Return a modified version of the request/result.r)   r#   r$   r   r[   s       r%   async_logging_hookzCustomLogger.async_logging_hook  s      v~s   c                 
    ||fS r   r)   r   s       r%   logging_hookzCustomLogger.logging_hook"  s     v~r'   )r   r   r   r   r   	responsesc                    K   y wr"   r)   )r#   r   r   r[   s       r%   async_moderation_hookz"CustomLogger.async_moderation_hook(  s      	r>   c                    K   y wr"   r)   )r#   r   re   s      r%   async_post_call_streaming_hookz+CustomLogger.async_post_call_streaming_hook7  s     
 	r>   c                4   K   |2 3 d {   }| 7 
6 y wr"   r)   )r#   r   re   rd   items        r%   'async_post_call_streaming_iterator_hookz4CustomLogger.async_post_call_streaming_iterator_hook>  s$      # 	 	$J	(s   c                     	 ||d<   ||d<   d|d<    ||        |d|        y # t         $ r   |dt        j                                 Y y w xY wNr+   r,   pre_api_calllog_event_typez$Custom Logger - model call details: Custom Logger Error - 	Exception	traceback
format_excr#   r+   r,   r$   print_verbosecallback_funcs         r%   log_input_eventzCustomLogger.log_input_eventI  sn    		M#F7O!)F:'5F#$ @IJ 	M293G3G3I2JKL	Ms   "% &AAc                    K   	 ||d<   ||d<   d|d<    ||       d {     |d|        y 7 # t         $ r   |dt        j                                 Y y w xY wwr   r   r   s         r%   async_log_input_eventz"CustomLogger.async_log_input_eventU  s     		M#F7O!)F:'5F#$   @IJ  	M293G3G3I2JKL	Ms1   A1 /1 A1 &AAAAc                 ~    	 d|d<    |||||       y # t         $ r   |dt        j                                 Y y w xY wNpost_api_callr   r   r   r#   r$   r1   r2   r3   r   r   s          r%   	log_eventzCustomLogger.log_eventc  sT    
	'6F#$	  	293G3G3I2JKL	s    &<<c                    K   	 d|d<    |||||       d {    y 7 # t         $ r   |dt        j                                 Y y w xY wwr   r   r   s          r%   async_log_eventzCustomLogger.async_log_events  sa     
	'6F#$	    	293G3G3I2JKL	s1   A  A &AAAAr1   c                    K   yw)z
        This log gets called after the MCP tool call is made.

        Useful if you want to modiy the standard logging payload after the MCP tool call is made.
        Nr)   r0   s        r%   async_post_mcp_tool_call_hookz*CustomLogger.async_post_mcp_tool_call_hook  s      r>   standard_logging_objectc                 F    d}g d}|D ]  }| j                  |||        y)a  
        Truncate error strings and message content in logging payload

        Some loggers like DataDog/ GCS Bucket have a limit on the size of the payload. (1MB)

        This function truncates the error string and the message content if they exceed a certain length.
        i'  )	error_strr,   re   )r   
field_name
max_lengthN)_truncate_field)r#   r   MAX_STR_LENGTHfields_to_truncatefields        r%   )truncate_standard_logging_payload_contentz6CustomLogger.truncate_standard_logging_payload_content  s8       C'E  (? ) !  (r'   r   r   c                     |j                  |      }|r1t        |      }t        |      |kD  r| j                  ||      ||<   yyy)aP  
        Helper function to truncate a field in the logging payload

        This converts the field to a string and then truncates it if it exceeds the max length.

        Why convert to string ?
        1. User was sending a poorly formatted list for `messages` field, we could not predict where they would send content
            - Converting to string and then truncating the logged content catches this
        2. We want to avoid modifying the original `messages`, `response`, and `error_str` in the logging payload since these are in kwargs and could be returned to the user
        )textr   N)getstrlen_truncate_text)r#   r   r   r   field_value	str_values         r%   r   zCustomLogger._truncate_field  sX      .11*=K(I9~
*6:6I6I"z 7J 7'
3 + r'   r   c                 2    t        |      |kD  r|d| dz   S |S )z&Truncate text if it exceeds max_lengthNzC...truncated by litellm, this logger does not support large content)r   )r#   r   r   s      r%   r   zCustomLogger._truncate_text  s4    
 4y:% *ST	
 		
r'   c                 (    ddl m}m} |y||v r|S |S )z
        Select the metadata field to use for logging

        1. If `litellm_metadata` is in the request kwargs, use it
        2. Otherwise, use `metadata`
        r   )LITELLM_METADATA_FIELDOLD_LITELLM_METADATA_FIELDN)litellm.constantsr   r   )r#   rR   r   r   s       r%   _select_metadata_fieldz#CustomLogger._select_metadata_field  s%     	Y!!^3))))r'   )T)NNN)NN)NNFr"   )K__name__
__module____qualname__boolr&   r-   r4   r6   r8   r:   r<   r@   rB   rD   r   r   r   dictr	   r   LiteLLMLoggingObjr   intr
   rO   rQ   r   r   rV   r   rZ   r   r   r]   r`   rc   r   rg   r   rk   ro   rq   r   rs   r   r   rv   r   ry   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   0   s
    $ 
 '+&*(,33 '(3 !	3
 C=3 #4.3 "?3 /3 T
#3 sm3 !3 
sD)*D0	13: '+(,33 '(3 !	3
 C=3 #4.3 "?3 sm3 !3 
sD)*D0	13( 48,0.3  4S#X/0	
 c4i() &d^ 
(	)( *.+/## "# 4 012	#
 !# #4.# 
d#
38n
19)1D
	$
2:4.	$
 (4. 		 #	 I&		
 
"	#	":B3-QU
$'15KT
$'15KT	'	(%	)	!$	0	1
H 
H #++A"B
H 
+		
H)  	
 	
 
id"#
2 (, & *	
  } * #	
 
$'47	tSy	$'47	tSy	 * 
	 
)  
	)  	
 
+T1	2
MM &$=	+	,!7,!7  	
 
0
3 
C 
C 
 04*&tn*	#*r'   r   ))r   typingr   r   r   r   r   r   r	   r
   r   pydanticr   litellm.caching.cachingr   "litellm.types.integrations.argillar   litellm.types.llms.openair   r   litellm.types.utilsr   r   r   r   r   r   r   opentelemetry.tracer   _Span*litellm.litellm_core_utils.litellm_loggingr   r   litellm.proxy._typesr   litellm.types.mcpr   litellm.types.routerr   r   r)   r'   r%   <module>r      s    
 
 
  - : M   1W3;;DDN # h* h*r'   