
    g%                     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	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_cache
model_listc                 .    || _         i | _        || _        y )N)r   mapping_deployment_to_idr   )selfr   r   s      W/var/www/openai/venv/lib/python3.12/site-packages/litellm/router_strategy/least_busy.py__init__z LeastBusyLoggingHandler.__init__   s    (.0%$    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_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,' " 		%   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,' " 		r4   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   r8   r9   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  		r;   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#   rL   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   NrN   )r   r8   rL   rO   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   listr   r+   r3   r6   r:   r=   dictrL   r"   rP   rR    r   r   r   r      s    ItNCNC%Y %D %
@ DB!F D! <

 "


59
r   r   )rD   typingr   litellm.caching.cachingr   "litellm.integrations.custom_loggerr   r   rZ   r   r   <module>r^      s!      - ;l
l l
r   