o
    ưi%                     @   s@   d dl Z d dlmZ d dlmZ d dlmZ G dd deZdS )    N)Optional)	DualCache)CustomLoggerc                   @   s   e Zd ZU dZeed< dZeed< dZeed< de	fddZ
d	d
 Zdd Zdd Zdd Zdd ZdedefddZdedefddZdedefddZdS )LeastBusyLoggingHandlerF	test_flagr   logged_successlogged_failurerouter_cachec                 C   s
   || _ d S )N)r	   )selfr	    r   Y/home/app/Keep/.python/lib/python3.10/site-packages/litellm/router_strategy/least_busy.py__init__   s   
z LeastBusyLoggingHandler.__init__c                 C   s   zY|d  ddu rW dS |d d  dd}|d  di  dd}|du s+|du r.W dS t|tr7t|}| d}| jj|dpDi }| |d	d
 ||< | jj||d W dS  tyc   Y dS 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_dictr   r   r   log_pre_api_call   s*   

z(LeastBusyLoggingHandler.log_pre_api_callc           
      C      zo|d  dd u rW d S |d d  dd }|d  di  dd }|d u s+|d u r.W d S t|tr7t|}| d}| jj|dpDi }| |d}	|	d u rRW d S |	d	 ||< | jj||d
 | jrm|  jd	7  _W d S W d S  t	yy   Y d S w Nr   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r	   r   r   r   r   r   
r
   r"   Zresponse_obj
start_timeend_timer   r   r#   r$   Zrequest_count_valuer   r   r   log_success_event9   s6   

z)LeastBusyLoggingHandler.log_success_eventc           
      C   r&   r'   )
r   r   r   r   r	   r   r   r   r   r   r(   r   r   r   log_failure_event[   s6   

z)LeastBusyLoggingHandler.log_failure_eventc           
           zu|d  dd u rW d S |d d  dd }|d  di  dd }|d u s,|d u r/W d S t|tr8t|}| d}| jj|dI d H pHi }| |d}	|	d u rVW d S |	d	 ||< | jj||d
I d H  | jrt|  jd	7  _W d S W d S  t	y   Y d S w r'   )
r   r   r   r   r	   async_get_cacheasync_set_cacher   r   r   r(   r   r   r   async_log_success_event|   s:   

z/LeastBusyLoggingHandler.async_log_success_eventc           
         r-   r'   )
r   r   r   r   r	   r.   r/   r   r   r   r(   r   r   r   async_log_failure_event   s:   

z/LeastBusyLoggingHandler.async_log_failure_eventhealthy_deploymentsall_deploymentsc           	      C   s   |D ]}|d d |vrd||d d < qt d}d}| D ]\}}||k r+|}|}q|durH|D ]}|d d |kr@|  S q2t|}|S t|}|S )zE
        Helper to get deployments using least busy strategy
        r   r   r   infN)floatitemsrandomchoice)	r
   r2   r3   dZmin_trafficZmin_deploymentkvmr   r   r   _get_available_deployments   s(   

z2LeastBusyLoggingHandler._get_available_deploymentsr   c                 C   s*   | d}| j j|dpi }| j||dS )zJ
        Sync helper to get deployments using least busy strategy
        r   r   r2   r3   )r	   r   r=   r
   r   r2   r#   r3   r   r   r   get_available_deployments   s   
z1LeastBusyLoggingHandler.get_available_deploymentsc                    s2   | d}| j j|dI dH pi }| j||dS )zK
        Async helper to get deployments using least busy strategy
        r   r   Nr>   )r	   r.   r=   r?   r   r   r   async_get_available_deployments   s   
z7LeastBusyLoggingHandler.async_get_available_deploymentsN)__name__
__module____qualname__r   bool__annotations__r   r   r   r   r   r%   r+   r,   r0   r1   listdictr=   r   r@   rA   r   r   r   r   r      s2   
  "!#"

r   )r7   typingr   Zlitellm.caching.cachingr   Z"litellm.integrations.custom_loggerr   r   r   r   r   r   <module>   s
   