
    hR*              
       
   d dl Z d dlZd dlmZ d dl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mZ 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 d dlmZmZ d dlmZ  G d de      Zdee    dee    dee    dee    de!f
dZ"y)    N)datetime)AnyOptionalUnioncast)verbose_proxy_logger)CustomLogger)!_get_parent_otel_span_from_kwargs get_litellm_metadata_from_kwargs)StandardLoggingPayloadSetup)UserAPIKeyAuth)log_db_metrics)RouteChecks)ProxyUpdateSpend)StandardLoggingPayload!StandardLoggingUserAPIKeyMetadata)!get_end_user_id_for_cost_trackingc            
           e Zd Zd Z	 ddedededee   fdZ	e
	 	 ddeeej                  ef      fd	       Zed
        Zy)_ProxyDBLoggerc                 H   K   | j                  ||||       d {    y 7 wN)_PROXY_track_cost_callback)selfkwargsresponse_obj
start_timeend_times        i/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/hooks/proxy_track_cost_callback.pyasync_log_success_eventz&_ProxyDBLogger.async_log_success_event   s'     --L*h
 	
 	
s   " "Nrequest_dataoriginal_exceptionuser_api_key_dicttraceback_strc                   K   |j                   }t        j                         du ry |t        j                  |      sy ddlm} t        t        |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   |j                   	            }|j                  |d<   d|d<   t#        j$                  ||	      |d
<   |j'                  dd       xs i }|j)                  |       d|vri |d<   |j'                  d      xs i |d   d<   ||d   d<   |j*                  j-                  |j                  d|j                  |j                   |j                  ||t/        j0                         t/        j0                         |j                  
       d {    y 7 w)NF)router   )proxy_logging_obj)	user_api_key_hashuser_api_key_aliasuser_api_key_user_emailuser_api_key_user_iduser_api_key_team_iduser_api_key_org_iduser_api_key_team_aliasuser_api_key_end_user_iduser_api_key_request_routeuser_api_keyfailurestatus)r!   r#   error_informationmetadatalitellm_paramsproxy_server_request        
tokenresponse_costuser_idend_user_idteam_idr   completion_responser   r   org_id)request_router   _should_track_errors_in_dbr   is_llm_api_routelitellm.proxy.proxy_serverr&   dictr   api_key	key_alias
user_emailr;   r=   r?   
team_aliasr<   r   get_error_informationgetupdatedb_spend_update_writerupdate_databaser   now)	r   r    r!   r"   r#   r@   r&   	_metadataexisting_metadatas	            r   async_post_call_failure_hookz+_ProxyDBLogger.async_post_call_failure_hook   s     *77446%?&{/K/K0
 @-"3";";#4#>#>(9(D(D%6%>%>%6%>%>$5$<$<(9(D(D):)F)F+<+J+J

	 %6$=$=	.!'	( (==1'
 		
 #/"2"2:t"D"J  +</-/L)*34: 	%&'=> 6G%&z266FF#++%--)55%-- 2||~\\^$++ G 
 	
 	
s   F9G;G<Gr>   c                   K   ddl m}m} t        j                  d       	 t        j                  d|j                  dd        d|j                  dd               t        |      }|j                  d	i       xs i }t        |      }	t        |      }
t        t        t           |
j                  d
d             }t        t        t           |
j                  dd             }t        t        t           |
j                  dd             }t        t        t           |
j                  dd             }|
j                  dd       }|j                  dd       }||j                  dd       n|j                  dd       }||
j                  dd       }|j                  dd      du rd}t        j                  d| d|        t        j                  d| d| d| d|	        t        ||||	      rw|j                  j                  ||||	||||||
       d {    t!        j"                   ||||	|||             |j$                  j'                  |||	||       d {    y t)        d       |d   dus|d   du r6d|v r1|
|d!   xs d"}nd#}|j                  d$      }t)        d%| d&| d'      y y 7 7 W# t(        $ r}d(t        |       d)t+        j,                          }|j                  d$d*      }t        |      }
|j                  d	i       j                  d+i       }|j                  d	i       j                  d,i       }|j                  d-d*      }|d.| d/|
 d0| d1| d2| d3z  }t!        j"                  |j/                  ||4             t        j0                  d5t        |             Y d }~y d }~ww xY ww)6Nr   )r&   update_cachez!INSIDE _PROXY_track_cost_callbackzkwargs stream: streamz  + complete streaming response: complete_streaming_response)r   r5   r*   r+   r,   r(   user_api_end_user_max_budgetstandard_logging_objectr:   r0   	cache_hitFTr7   zCache Hit: response_cost z, for user_id zuser_api_key z
, user_id z
, team_id z, end_user_id r0   r;   r=   r<   r8   )r9   r;   r<   r:   r=   parent_otel_span)r9   rF   r<   r:   
max_budgetzBUser API key and team id and user id missing from custom callback. response_cost_failure_debug_infozCresponse_cost_failure_debug_info is None in standard_logging_objectz!standard_logging_object not foundmodelzCost tracking failed for model=z.
Debug info - zG
Add custom pricing - https://docs.litellm.ai/docs/proxy/custom_pricingz"Error in tracking cost callback - z
 Traceback: litellm_metadatar4   	call_typez-
 Args to _PROXY_track_cost_callback
 model: z
 chosen_metadata: z
 litellm_metadata: z
 old_metadata: z
 call_type: 
)error_messagefailing_modelz$Error in tracking cost callback - %s)rC   r&   rS   r   debugrJ   r
   r   r   r   r   strinfo_should_track_cost_callbackrL   rM   asynciocreate_taskslack_alerting_instancecustomer_spend_alert	Exception	traceback
format_excfailed_tracking_alert	exception)r   r   r>   r   r   r&   rS   rZ   r5   r<   r4   r;   r=   r?   rF   end_user_max_budget	sl_objectr:   r0    cost_tracking_failure_debug_infor]   e	error_msgr_   old_metadatar`   s                             r   r   z)_ProxyDBLogger._PROXY_track_cost_callback\   s     	O""#FGp	 &&!&**Xt"<!==]^d^h^h  jG  IM  _N  ^O  P  AO#ZZ(8"=CN;NKK7vFH8C=(,,7Mt*TUG8C=(,,7Mt*TUG(3-6KT)RSFXc]HLL9Mt,TUI"*,,/Mt"T:@**)4;I
 ( ot4ZZ6  ('||NDA::k51T9$'M(--3M?.QXPYZ %**#L>G9JwiWefqers /!-## +	 ,BBRR*&3 '$/ '%,?#-!)% S    ''$".$+(3*7$+-=	 ,CCXX*"+$/&3#6 Y    $\  (#4/8$,1NRX1X ,%&HI ed 9 @ 9 #JJw/E#9%@PQqPr  s{  |  2Y,M28  	<SVHMR[RfRfRhQijIJJw+E7vFH%zz*:B?CC"B  "::&6;??
BOL

;3IJ5'Qefneo  pE  FV  EW  Wh  iu  hv  vD  EN  DO  OQ  R  RI!77"+"' 8  !**6A #	sb   OG7J; J7AJ; !J9"J; &O'AJ; 5O7J; 9J; ;	N?C1N:5O:N??Oc                  8    ddl m}  | j                  d      du ryy)z
        Returns True if errors should be tracked in the database

        By default, errors are tracked in the database

        If users want to disable error tracking, they can set the disable_error_logs flag in the general_settings
        r   general_settingsdisable_error_logsTFN)rC   ry   rJ   rx   s    r   rA   z)_ProxyDBLogger._should_track_errors_in_db   s"     	@ 45=    r   )NN)__name__
__module____qualname__r   rD   rl   r   r   re   rQ   r   r   litellmModelResponser   r   staticmethodrA    r{   r   r   r      s    
 (,;
;
 &;
 *	;

  };
z  | &''',-
| ||  r{   r   r0   r;   r=   r<   returnc                 D    t        j                         du ry| |||yy)zN
    Determine if the cost callback should be tracked based on the kwargs
    TF)r   disable_spend_updatesrY   s       r   rg   rg      s8     --/47 	 "r{   )#rh   rm   r   typingr   r   r   r   r   litellm._loggingr   "litellm.integrations.custom_loggerr	   'litellm.litellm_core_utils.core_helpersr
   r   *litellm.litellm_core_utils.litellm_loggingr   litellm.proxy._typesr   litellm.proxy.auth.auth_checksr   litellm.proxy.auth.route_checksr   litellm.proxy.utilsr   litellm.types.utilsr   r   litellm.utilsr   r   re   boolrg   r   r{   r   <module>r      s       - -  1 ; S / 9 7 0 <O\ Od3-c] c] #	
 
r{   