
    j%                     F    d dl Z d dlmZ d dlmZ d dlmZ  G d de      Zy)    N)Optional)	DualCache)CustomLoggerc                       e Zd ZU dZeed<   dZeed<   dZeed<   de	fdZ
d Zd	 Zd
 Zd Zd ZdedefdZdedefdZdedefdZy)LeastBusyLoggingHandlerF	test_flagr   logged_successlogged_failurerouter_cachec                     || _         y )N)r   )selfr   s     {/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/router_strategy/least_busy.py__init__z LeastBusyLoggingHandler.__init__   s
    (    c                    	 |d   j                  d      y|d   d   j                  dd      }|d   j                  di       j                  dd      }||yt        |t              rt        |      }| d}| j                  j                  |      xs i }|j                  |d	      d
z   ||<   | j                  j                  ||       y# t        $ r Y yw xY w)zX
        Log when a model is being used.

        Caching based on model group.
        litellm_paramsmetadataNmodel_group
model_infoid_request_countkeyr      r   value)get
isinstanceintstrr   	get_cache	set_cache	Exception)r   modelmessageskwargsr   r   request_count_api_keyrequest_count_dicts           r   log_pre_api_callz(LeastBusyLoggingHandler.log_pre_api_call   s   	&'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+6-~(F% %%//4I/JPb # *<)?)?A)F)J"2&!!++-5G ,   		s   C AC A5C 	CCc                 
   	 |d   j                  d      y |d   d   j                  dd       }|d   j                  di       j                  dd       }||y t        |t              rt        |      }| d}| j                  j                  |      xs i }|j                  |d      }	|	y |	d	z
  ||<   | j                  j                  ||
       | j                  r| xj                  d	z  c_        y y # t        $ r Y y w xY wNr   r   r   r   r   r   r   r   r   r   )
r   r   r   r    r   r!   r"   r   r	   r#   
r   r&   response_obj
start_timeend_timer   r   r'   r(   request_count_values
             r   log_success_eventz)LeastBusyLoggingHandler.log_success_event9   s9   	&'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+6-~(F% %%//4I/JPb # 6H5K5KBPQ5R#&.)<q)@"2&!!++-5G , 
 >>''1,' " 		%   C6 AC6 AC6 .AC6 6	DDc                 
   	 |d   j                  d      y |d   d   j                  dd       }|d   j                  di       j                  dd       }||y t        |t              rt        |      }| d}| j                  j                  |      xs i }|j                  |d      }	|	y |	d	z
  ||<   | j                  j                  ||
       | j                  r| xj                  d	z  c_        y y # t        $ r Y y w xY wr+   )
r   r   r   r    r   r!   r"   r   r
   r#   r,   s
             r   log_failure_eventz)LeastBusyLoggingHandler.log_failure_event[   s9   	&'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+6-~(F% %%//4I/JPb # 6H5K5KBPQ5R#&.)<q)@"2&!!++-5G , 
 >>''1,' " 		r2   c                 :  K   	 |d   j                  d      y |d   d   j                  dd       }|d   j                  di       j                  dd       }||y t        |t              rt        |      }| d}| j                  j                  |       d {   xs i }|j                  |d      }	|	y |	d	z
  ||<   | j                  j                  ||
       d {    | j                  r| xj                  d	z  c_        y y 7 m7 )# t        $ r Y y w xY wwr+   )
r   r   r   r    r   async_get_cacheasync_set_cacher   r	   r#   r,   s
             r   async_log_success_eventz/LeastBusyLoggingHandler.async_log_success_event|   sZ     	&'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+6-~(F% ++;;@U;VV  # 6H5K5KBPQ5R#&.)<q)@"2&''77-5G 8   
 >>''1,' " W  		o   DD DAD D?D DD 7D8(D  D
!%D DD 
D 	DDDDc                 :  K   	 |d   j                  d      y |d   d   j                  dd       }|d   j                  di       j                  dd       }||y t        |t              rt        |      }| d}| j                  j                  |       d {   xs i }|j                  |d      }	|	y |	d	z
  ||<   | j                  j                  ||
       d {    | j                  r| xj                  d	z  c_        y y 7 m7 )# t        $ r Y y w xY wwr+   )
r   r   r   r    r   r6   r7   r   r
   r#   r,   s
             r   async_log_failure_eventz/LeastBusyLoggingHandler.async_log_failure_event   sZ    	&'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+6-~(F% ++;;@U;VV  # 6H5K5KBPQ5R#&.)<q)@"2&''77-5G 8   
 >>''1,' " W  		r9   healthy_deploymentsall_deploymentsc                 &   |D ]  }|d   d   |vsd||d   d   <    t        d      }d}|j                         D ]  \  }}||k  s|}|} |-|D ]  }|d   d   |k(  s|c S  t        j                  |      }|S t        j                  |      }|S )zE
        Helper to get deployments using least busy strategy
        r   r   r   infN)floatitemsrandomchoice)	r   r<   r=   dmin_trafficmin_deploymentkvms	            r   _get_available_deploymentsz2LeastBusyLoggingHandler._get_available_deployments   s     %At$O;9:, 56 % El#))+DAq;!" , %(\?4(N:H ) $]]+>?N  $]]+>?Nr   r   c                 r    | d}| j                   j                  |      xs i }| j                  ||      S )zJ
        Sync helper to get deployments using least busy strategy
        r   r   r<   r=   )r   r!   rJ   r   r   r<   r'   r=   s        r   get_available_deploymentsz1LeastBusyLoggingHandler.get_available_deployments   sO     $/-~ >++55:O5PVTV.. 3+ / 
 	
r   c                    K   | d}| j                   j                  |       d{   xs i }| j                  ||      S 7 w)zK
        Async helper to get deployments using least busy strategy
        r   r   NrL   )r   r6   rJ   rM   s        r   async_get_available_deploymentsz7LeastBusyLoggingHandler.async_get_available_deployments   sa      $/-~ >##338M3NNTRT 	 .. 3+ / 
 	
 Os   %AAAN)__name__
__module____qualname__r   bool__annotations__r	   r   r
   r   r   r)   r1   r4   r8   r;   listdictrJ   r    rN   rP    r   r   r   r      s    ItNCNC)Y )@ DB!F D! <

 "


59
r   r   )rB   typingr   litellm.caching.cachingr   "litellm.integrations.custom_loggerr   r   rX   r   r   <module>r\      s!      - ;k
l k
r   