
    g#                         d dl Z d dlmZ d dl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 d dlmZ d d	lmZ  G d
 de      Z G d de      Zy)    N)datetime)DictListOptionalUnion)token_counter)verbose_router_logger)	DualCache)CustomLogger)LiteLLMPydanticObjectBase)print_verbosec                       e Zd ZU dZeed<   y)RoutingArgs<   ttlN)__name__
__module____qualname__r   int__annotations__     [/var/www/openai/venv/lib/python3.12/site-packages/litellm/router_strategy/lowest_tpm_rpm.pyr   r      s    Cr   r   c                       e Zd ZU dZeed<   dZeed<   dZeed<   dZ	eed<   i fde
d	ed
efdZd Zd Z	 	 ddededeeeeef         deeeef      fdZy)LowestTPMLoggingHandlerF	test_flagr   logged_successlogged_failurei  default_cache_time_secondsrouter_cache
model_listrouting_argsc                 @    || _         || _        t        di || _        y )Nr   )r    r!   r   r"   )selfr    r!   r"   s       r   __init__z LowestTPMLoggingHandler.__init__   s#     )$'7,7r   c                    	 	 |d   j                  d      y |d   d   j                  dd       }|d   j                  di       j                  dd       }||y t        |t              rt        |      }|d   d   }t	        j
                         j                  d      }| d	| }	| d
| }
| j                  j                  |	      xs i }|j                  |d      |z   ||<   | j                  j                  |	|| j                  j                         | j                  j                  |
      xs i }|j                  |d      dz   ||<   | j                  j                  |
|| j                  j                         | j                  r| xj                  dz  c_        y y # t        $ r^}t        j                   dj#                  t        |                   t        j$                  t'        j(                                Y d }~y d }~ww xY wNlitellm_paramsmetadatamodel_group
model_infoidusagetotal_tokens%H-%M:tpm::rpm:keyr   )r3   valuer      z\litellm.router_strategy.lowest_tpm_rpm.py::async_log_success_event(): Exception occured - {})get
isinstancer   strr   nowstrftimer    	get_cache	set_cacher"   r   r   r   	Exceptionr	   errorformatdebug	traceback
format_excr$   kwargsresponse_obj
start_timeend_timer*   r,   r.   current_minutetpm_keyrpm_keyrequest_count_dictes                r   log_success_eventz)LowestTPMLoggingHandler.log_success_event    s   8	 &'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+G4^D
 "*!8!8!A(M~.>?(M~.>? &*%6%6%@%@W%@%M%SQS");)?)?A)F)U"2&!!++'9t?P?P?T?T , 
 &*%6%6%@%@W%@%M%SQS");)?)?A)F)J"2&!!++'9t?P?P?T?T , 
 >>''1,' " 	!''nuuF
 "''	(<(<(>?	s%   F% AF% E	F% %	H.AHHc                 v  K   	 	 |d   j                  d      y |d   d   j                  dd       }|d   j                  di       j                  dd       }||y t        |t              rt        |      }|d   d   }t	        j
                         j                  d      }| d	| }	| d
| }
| j                  j                  |	       d {   xs i }|j                  |d      |z   ||<   | j                  j                  |	|| j                  j                         d {    | j                  j                  |
       d {   xs i }|j                  |d      dz   ||<   | j                  j                  |
|| j                  j                         d {    | j                  r| xj                  dz  c_        y y 7 7 7 7 -# t        $ r^}t        j                   dj#                  t        |                   t        j$                  t'        j(                                Y d }~y d }~ww xY wwr'   )r6   r7   r   r8   r   r9   r:   r    async_get_cacheasync_set_cacher"   r   r   r   r=   r	   r>   r?   r@   rA   rB   rC   s                r   async_log_success_eventz/LowestTPMLoggingHandler.async_log_success_event[   s\    =	 &'++J7?$%56zBFF!4 ,-11,CGGdS&"*C(RB+G4^D
 "*!8!8!A(M~.>?(M~.>? ++;;;HHNB # *<)?)?A)F)U"2&''77'9t?P?P?T?T 8    ++;;;HHNB # *<)?)?A)F)J"2&''77'9t?P?P?T?T 8   
 >>''1,' "' I I  	!''nuuF
 "''	(<(<(>?	s   H9G H9AG H9A3G GAG %G	&#G 	G
AG G %G H9G 	G G G 	H6AH1,H91H66H9Nr*   healthy_deploymentsmessagesinputc                    t        j                  d| d|        t        j                         j	                  d      }| d| }| d| }| j
                  j                  |      }| j
                  j                  |      }	t        j                  d| d| d	|	        	 t        ||
      }
t        j                  d|
        t        d      }|i }|D ]  }d||d   d   <    n|D ]  }|d   d   |vsd||d   d   <    |}d}|j                         D ]  \  }}d}|D ]  }||d   d   k(  s|} |!d}||j                  d      }|!|j                  di       j                  d      }|!|j                  di       j                  d      }|t        d      }d}||j                  d      }|!|j                  di       j                  d      }|!|j                  di       j                  d      }|t        d      }||
z   |kD  r|	||	v r|	|   dz   |k\  r||k  s|}|} t        d       |S # t        $ r d}
Y w xY w)zE
        Returns a deployment with the lowest TPM/RPM usage.
        z6get_available_deployments - Usage Based. model_group: z, healthy_deployments: r/   r0   r1   r2   ztpm_key=z, tpm_dict: z, rpm_dict: )rS   textr   zinput_tokens=infNr+   r,   tpmr(   rpmr5   z+returning picked lowest tpm/rpm deployment.)r	   r@   r   r9   r:   r    r;   r   r=   floatitemsr6   r   )r$   r*   rR   rS   rT   rH   rI   rJ   tpm_dictrpm_dictinput_tokens
lowest_tpm
deploymentdall_deploymentsitemitem_tpm_deploymentm_deployment_tpm_deployment_rpms                        r   get_available_deploymentsz1LowestTPMLoggingHandler.get_available_deployments   s    	##D[MQhi|h}~	
 "009 M~&67 M~&67$$..7.;$$..7.;##wi|H:\(L	
	((GL 	##mL>$BC 5\
H1
;<L1$78 2 )\?4(867HQ|_T23 )
 #
-335ND(K(1\?400"#K ) ""O&"-//%"8&"-//2BB"G"K"KE"R&"-//,"C"G"G"N&"',"O&"-//%"8&"-//2BB"G"K"KE"R&"-//,"C"G"G"N&"',,&8&48+;"o5J&%
(
M 6N 	CD}  	L	s   $I II)NN)r   r   r   r   boolr   r   r   r   r   r
   listdictr%   rM   rQ   r8   r   r   r   r   ri   r   r   r   r   r      s    ItNCNC&11 OQ8%8378GK89v>H 48,0XX "X 4S#X/0	X
 c4i()Xr   r   )rA   r   typingr   r   r   r   litellmr   litellm._loggingr	   litellm.caching.cachingr
   "litellm.integrations.custom_loggerr   litellm.types.utilsr   litellm.utilsr   r   r   r   r   r   <module>rt      s@      . . ! 2 - ; 9 '+ `l `r   