Ë
    uPêjHg  ã                   óö   — d dl Z d dlmZmZmZ d dlZd dl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mZ d d
lmZmZ ddlmZ erd dlmZ eez  ZneZ G d„ de«      Z G d„ dee«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)Útoken_counter)Úverbose_loggerÚverbose_router_logger)Ú	DualCache)ÚCustomLogger)Ú!_get_parent_otel_span_from_kwargs)ÚRouterErrors)ÚLiteLLMPydanticObjectBaseÚStandardLoggingPayload)Úget_utc_datetimeÚprint_verboseé   )ÚBaseRoutingStrategy)ÚSpanc                   ó   — e Zd ZU dZeed<   y)ÚRoutingArgsé<   ÚttlN)Ú__name__Ú
__module__Ú__qualname__r   ÚintÚ__annotations__© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/router_strategy/lowest_tpm_rpm_v2.pyr   r      s   … Ø€CˆÔr   r   c                   ó°  — e Zd ZU dZ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fd„Zdededz  fd„Zdededz  dedz  fd„Zd„ Zd„ Zdee   dededefd„Z	 	 d#dededededz  dededz  deeeef      dz  deez  dz  dedz  fd „Z	 	 d#dededeeeef      dz  deez  dz  fd!„Z	 	 	 d$dededeeeef      dz  deez  dz  dedz  f
d"„Zy)%ÚLowestTPMLoggingHandler_v2zÒ
    Updated version of TPM/RPM Logging.

    Meant to work across instances.

    Caches individual models, not model_groups

    Uses batch get (redis.mget)

    Increments tpm/rpm limit using redis.incr
    FÚ	test_flagr   Úlogged_successÚlogged_failurei  Údefault_cache_time_secondsÚrouter_cacheÚrouting_argsc                 ód   — || _         t        di |¤Ž| _        t        j                  | |dd¬«       y )NTgš™™™™™¹?)Ú
dual_cacheÚshould_batch_redis_writesÚdefault_sync_intervalr   )r&   r   r'   r   Ú__init__)Úselfr&   r'   s      r   r,   z#LowestTPMLoggingHandler_v2.__init__2   s4   € Ø(ˆÔÜ'Ñ7¨,Ñ7ˆÔÜ×$Ñ$ØØ#Ø&*Ø"%ö		
r   Ú
deploymentÚreturnNc                 ó"  — 	 t        «       }|j                  d«      }|j                  di «      j                  d«      }|j                  di «      j                  d«      }|› d|› d|› �}| j                  j	                  |d¬	«      }d
}|€|j                  d«      }|€!|j                  di «      j                  d«      }|€!|j                  di «      j                  d«      }|€t        d«      }|�©||k\  r¤t        j                  d|› d|› �d|j                  di «      j                  d«      t        j                  ddj                  t        j                  j                  ||||j                  dd«      «      t        j                  dd¬«      ¬«      ¬«      ‚| j                  j                  |d| j                   j"                  ¬«      }	|	�Ž|	|kD  r‰t        j                  d|› d|	› �d|j                  di «      j                  d«      t        j                  dt        j                  j                  › d|› d|	› �t        j                  dd¬«      ¬«      ¬«      ‚|S # t$        $ r(}
t'        |
t        j                  «      r|
‚|cY d
}
~
S d
}
~
ww xY w)z—
        Pre-call check + update model rpm

        Returns - deployment

        Raises - RateLimitError if deployment over defined RPM limit
        ú%H-%MÚ
model_infoÚidÚlitellm_paramsÚmodelú:ú:rpm:T©ÚkeyÚ
local_onlyNÚrpmÚinfú"Deployment over defined rpm limit=ú. current usage=Ú é­  zr{} rpm limit={}. current usage={}. id={}, model_group={}. Get the model info by calling 'router.get_model_info(id)Ú
model_nameÚtpm_rpm_limitsú"https://github.com/BerriAI/litellm©ÚmethodÚurl)Ústatus_codeÚcontentÚrequest©ÚmessageÚllm_providerr5   Úresponser   ©r9   Úvaluer   ú rpm limit=)r   ÚstrftimeÚgetr&   Ú	get_cacheÚfloatÚlitellmÚRateLimitErrorÚhttpxÚResponseÚformatr   Úuser_defined_ratelimit_errorrO   ÚRequestÚincrement_cacher'   r   Ú	ExceptionÚ
isinstance)r-   r.   ÚdtÚcurrent_minuteÚmodel_idÚdeployment_nameÚrpm_keyÚlocal_resultÚdeployment_rpmÚresultÚes              r   Úpre_call_checkz)LowestTPMLoggingHandler_v2.pre_call_check<   s¯  € ðA	ô
 )Ó*ˆBØ$&§K¡K°Ó$8ˆNØ(Ÿn™n¨\¸2Ó>×BÑBÀ4ÓHˆHØ%/§^¡^Ð4DÀbÓ%I×%MÑ%MÈgÓ%VˆOØ (˜z¨¨?Ð*;¸5ÀÐ@PÐQˆGà"&×"3Ñ"3×"=Ñ"=À'ÐVZÐ"=Ó"[ˆLà!ˆNØÐ%Ø!+§¡°Ó!6�ØÐ%Ø!+§¡Ð0@À"Ó!E×!IÑ!IÈ%Ó!P�ØÐ%Ø!+§¡°¸bÓ!A×!EÑ!EÀeÓ!L�ØÐ%Ü!& u£�àÐ'¨L¸NÒ,JÜ×,Ñ,Ø@ÀÐ@PÐP`ÐamÐ`nÐoØ!#Ø$Ÿ.™.Ð)9¸2Ó>×BÑBÀ7ÓKÜ"Ÿ^™^Ø$'ð !U÷  !\ñ  !\Ü(×EÑE×KÑKØ*Ø(Ø$Ø&ŸN™N¨<¸Ó<ó!ô !&§¡Ø#3Ø Dô!ôô	ð ð, !%× 1Ñ 1× AÑ AÀgÐUVÐ\`×\mÑ\m×\qÑ\qÐ AÓ r�ØÐ%¨&°>Ò*AÜ!×0Ñ0Ø"DÀ^ÐDTÐTdÐekÐdlÐ mØ%'Ø(Ÿn™nÐ-=¸rÓB×FÑFÀwÓOÜ!&§¡Ø(+Ü'3×'PÑ'P×'VÑ'VÐ&WÐWbÐcqÐbrð  sCð  DJð  CKð  %LÜ$)§M¡MØ'7Ø$Hô%ô"ô	ð ð ÐøÜò 	Ü˜!œW×3Ñ3Ô4Ø�ØÕûð	ús   ‚II É	JÉ&J	ÊJÊ	JÚparent_otel_spanc              ƒ   óz  K  — 	 t        «       }|j                  d«      }|j                  di «      j                  d«      }|j                  di «      j                  d«      }|› d|› d|› �}| j                  j	                  |d¬	«      ƒ d
{  –—† }d
}	|	€|j                  d«      }	|	€!|j                  di «      j                  d«      }	|	€!|j                  di «      j                  d«      }	|	€t        d«      }	|�ª||	k\  r¥t        j                  d|	› d|› �d|j                  di «      j                  d«      t        j                  dt        j                  j                  › d|	› d|› �dt        d«      it        j                  dd¬«      ¬«      |j                  d«      ¬«      ‚| j                  |d| j                   j"                  ¬«      ƒ d
{  –—† }
|
�ª|
|	kD  r¥t        j                  d|	› d|
› �d|j                  di «      j                  d«      t        j                  dt        j                  j                  › d|	› d|
› �dt        d«      it        j                  dd¬«      ¬«      |j                  d«      ¬«      ‚|S 7 �Œ÷7 Œµ# t$        $ r(}t'        |t        j                  «      r|‚|cY d
}~S d
}~ww xY w­w)aI  
        Pre-call check + update model rpm
        - Used inside semaphore
        - raise rate limit error if deployment over limit

        Why? solves concurrency issue - https://github.com/BerriAI/litellm/issues/2994

        Returns - deployment

        Raises - RateLimitError if deployment over defined RPM limit
        r1   r2   r3   r4   r5   r6   r7   Tr8   Nr;   r<   r=   r>   r?   r@   rP   úretry-afterr   rB   rC   rD   ©rG   rH   ÚheadersrI   Únum_retries)rK   rL   r5   rM   rn   r   rN   )r   rQ   rR   r&   Úasync_get_cacherT   rU   rV   rW   rX   r   rZ   rO   Ústrr[   Ú"_increment_value_in_current_windowr'   r   r]   r^   )r-   r.   ri   r_   r`   ra   rb   rc   rd   re   rf   rg   s               r   Úasync_pre_call_checkz/LowestTPMLoggingHandler_v2.async_pre_call_check‡   sð  è ø€ ð>	ô )Ó*ˆBØ$&§K¡K°Ó$8ˆNØ(Ÿn™n¨\¸2Ó>×BÑBÀ4ÓHˆHØ%/§^¡^Ð4DÀbÓ%I×%MÑ%MÈgÓ%VˆOà (˜z¨¨?Ð*;¸5ÀÐ@PÐQˆGØ(,×(9Ñ(9×(IÑ(IØ¨ð )Jó )÷ #ˆLð "ˆNØÐ%Ø!+§¡°Ó!6�ØÐ%Ø!+§¡Ð0@À"Ó!E×!IÑ!IÈ%Ó!P�ØÐ%Ø!+§¡°¸bÓ!A×!EÑ!EÀeÓ!L�ØÐ%Ü!& u£�ØÐ'¨L¸NÒ,JÜ×,Ñ,Ø@ÀÐ@PÐP`ÐamÐ`nÐoØ!#Ø$Ÿ.™.Ð)9¸2Ó>×BÑBÀ7ÓKÜ"Ÿ^™^Ø$'Ü#/×#LÑ#L×#RÑ#RÐ"SÐS^Ð_mÐ^nÐn~ð  @Lð  Mð  !NØ!.´°B³Ð 8Ü %§¡Ø#3Ø Dô!ô	ð !+§¡¨}Ó =ôð ð"  $×FÑFÈ7ÐZ[Ðae×arÑar×avÑavÐFÓw×w�ØÐ%¨&°>Ò*AÜ!×0Ñ0Ø"DÀ^ÐDTÐTdÐekÐdlÐ mØ%'Ø(Ÿn™nÐ-=¸rÓB×FÑFÀwÓOÜ!&§¡Ø(+Ü'3×'PÑ'P×'VÑ'VÐ&WÐWbÐcqÐbrð  sCð  DJð  CKð  %LØ%2´C¸³GÐ$<Ü$)§M¡MØ'7Ø$Hô%ô	"ð %/§N¡N°=Ó$Aôð ð Ðða#ùð> xùô$ ò 	Ü˜!œW×3Ñ3Ô4Ø�ØÕûð	üs[   ‚J;„BJ ÂJÂEJ ÇJÇB1J ÊJ;ÊJ ÊJ Ê	J8ÊJ3Ê-J8Ê.J;Ê3J8Ê8J;c                 ó`  — 	 	 |j                  d«      }|€t        d«      ‚|j                  d«      }|d   j                  d«      }|j                  d«      }|�|�|€y t        |t        «      rt	        |«      }|j                  d«      }	t        «       }
|
j                  d«      }|› d	|› d
|› �}| j                  j                  ||	| j                  j                  ¬«       | j                  r| xj                  dz  c_        y y # t        $ r }t        j                  d|«       Y d }~y d }~ww xY w)NÚstandard_logging_objectú&standard_logging_object not passed in.Úmodel_groupÚhidden_paramsÚlitellm_model_namera   Útotal_tokensr1   r6   ú:tpm:rN   r   zUlitellm.proxy.hooks.lowest_tpm_rpm_v2.py::log_success_event(): Exception occured - %s)rR   Ú
ValueErrorr^   r   rp   r   rQ   r&   r\   r'   r   r"   r#   r]   r   Ú	exception)r-   ÚkwargsÚresponse_objÚ
start_timeÚend_timert   rv   r5   r3   ry   r_   r`   Útpm_keyrg   s                 r   Úlog_success_eventz,LowestTPMLoggingHandler_v2.log_success_eventÓ   s;  € ð%	ðð MSÏJÉJÐWpÓLqÐ#Ø&Ð.Ü Ð!IÓJÐJØ!8×!<Ñ!<¸]Ó!KˆKØ2°?ÑC×GÑGÐH\Ó]ˆEØ(×,Ñ,¨ZÓ8ˆBØÐ" b j°E°MØÜ˜B¤Ô$Ü˜“W�à"9×"=Ñ"=¸nÓ"MˆLô
 )Ó*ˆBØ$&§K¡K°Ó$8ˆNà "˜t 1 U G¨5°Ð0@ÐAˆGð ×Ñ×-Ñ-°'ÀÐSW×SdÑSd×ShÑShÐ-Ôià�~Š~Ø×#Ò# qÑ(Ö#ð øäò 	Ü×$Ñ$ØgÐij÷ñ ûð	ús   ‚AD ÁB$D Ä	D-ÄD(Ä(D-c              ƒ   óx  K  — 	 	 |j                  d«      }|€t        d«      ‚|j                  d«      }|d   d   }|j                  d«      }|�|€y t        |t        «      rt	        |«      }|j                  d«      }	t        «       }
|
j                  d«      }|› d	|› d
|› �}t        |«      }| j                  j                  ||	| j                  j                  |¬«      ƒ d {  –—†  | j                  r| xj                  dz  c_        y y 7 Œ'# t        $ r }t        j                   d|«       Y d }~y d }~ww xY w­w)Nrt   ru   rv   rw   rx   ra   ry   r1   r6   rz   )r9   rO   r   ri   r   z[litellm.proxy.hooks.lowest_tpm_rpm_v2.py::async_log_success_event(): Exception occured - %s)rR   r{   r^   r   rp   r   rQ   r   r&   Úasync_increment_cacher'   r   r"   r#   r]   r   r|   )r-   r}   r~   r   r€   rt   rv   r5   r3   ry   r_   r`   r�   ri   rg   s                  r   Úasync_log_success_eventz2LowestTPMLoggingHandler_v2.async_log_success_eventû   s\  è ø€ ð)	ðð MSÏJÉJÐWpÓLqÐ#Ø&Ð.Ü Ð!IÓJÐJØ!8×!<Ñ!<¸]Ó!KˆKØ2°?ÑCÐDXÑYˆEØ(×,Ñ,¨ZÓ8ˆBØÐ" b jØÜ˜B¤Ô$Ü˜“W�Ø"9×"=Ñ"=¸nÓ"MˆLô )Ó*ˆBØ$&§K¡K°Ó$8ˆNà "˜t 1 U G¨5°Ð0@ÐAˆGô
 'HÈÓ&OÐà×#Ñ#×9Ñ9ØØ"Ø×%Ñ%×)Ñ)Ø!1ð	 :ó ÷ ð ð �~Š~Ø×#Ò# qÑ(Ö#ð ðùô ò 	Ü×$Ñ$ØmÐop÷ñ ûð	üsN   ‚D:„AD ÁD:ÁBD Ã$DÃ%%D Ä
D:ÄD Ä	D7ÄD2Ä-D:Ä2D7Ä7D:Úhealthy_deploymentsÚall_deploymentsÚinput_tokensÚrpm_dictc                 ó:  — t        d«      }g }|D �ci c]$  }|j                  di «      j                  d«      |“Œ& }}|j                  «       D �]E  \  }	}
|	j                  d«      d   }	|j                  |	«      }|€Œ/|
€Œ2d }|€|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  s|�|	|v r||	   �||	   d	z   |k\  r�Œ"|
|k(  r|j	                  |«       �Œ:|
|k  s�ŒA|
}|g}�ŒH |S c c}w )
Nr<   r2   r3   r6   r   Útpmr4   r;   r   )rT   rR   ÚitemsÚsplitÚappend)r-   r†   r‡   rˆ   r‰   Ú
lowest_tpmÚpotential_deploymentsr.   Údeployment_lookupÚitemÚitem_tpmÚ_deploymentÚ_deployment_tpmÚ_deployment_rpms                 r   Ú_return_potential_deploymentsz8LowestTPMLoggingHandler_v2._return_potential_deployments'  sä  € ô ˜5“\ˆ
Ø "ÐàUhö$
ØGQˆJ�N‰N˜<¨Ó,×0Ñ0°Ó6¸
ÑBð$
Ðð $
ð .×3Ñ3Ó5ó &	6‰NˆD�(à—:‘:˜c“? 1Ñ%ˆDØ+×/Ñ/°Ó5ˆKØÐ"ØØÐ!Øà"ˆOØÐ&Ø"-§/¡/°%Ó"8�ØÐ&Ø"-§/¡/Ð2BÀBÓ"G×"KÑ"KÈEÓ"R�ØÐ&Ø"-§/¡/°,ÀÓ"C×"GÑ"GÈÓ"N�ØÐ&Ü"'¨£,�à"ˆOØÐ&Ø"-§/¡/°%Ó"8�ØÐ&Ø"-§/¡/Ð2BÀBÓ"G×"KÑ"KÈEÓ"R�ØÐ&Ø"-§/¡/°,ÀÓ"C×"GÑ"GÈÓ"N�ØÐ&Ü"'¨£,�Ø˜,Ñ&¨Ò8ØÐ%¨$°(Ñ*:Ø˜T‘NÐ.Ø˜d‘^ aÑ'¨?Ò:áØ˜ZÒ'Ø%×,Ñ,¨[Ö9Ø˜JÔ&Ø%�
Ø)4¨Ò%ðM&	6ðN %Ð$ùòU$
s   ’)Frv   Útpm_keysÚ
tpm_valuesÚrpm_keysÚ
rpm_valuesÚmessagesÚinputc	                 ó4  — |�|€yi }	t        |«      D ]"  \  }
}||
   |	||
   j                  d«      d   <   Œ$ i }t        |«      D ]"  \  }
}||
   |||
   j                  d«      d   <   Œ$ 	 t        ||¬«      }t	        j
                  d|«       |	€i }	|D ]  }d|	|d   d   <   Œ n|D ]  }|d   d   }||	vs|	|   �Œd|	|<   Œ |	}| j                  ||||¬«      }t        d	«       t        |«      dkD  rt        j                  |«      S y# t        $ r d}Y Œžw xY w)
za
        Common checks for get available deployment, across sync + async implementations
        Nr6   r   )rœ   Útextzinput_tokens=%sr2   r3   )r†   r‡   rˆ   r‰   z+returning picked lowest tpm/rpm deployment.)Ú	enumerater�   r   r]   r   Údebugr—   r   ÚlenÚrandomÚchoice)r-   rv   r†   r˜   r™   rš   r›   rœ   r�   Útpm_dictÚidxr9   r‰   rˆ   r.   Údr�   r‡   r�   s                      r   Ú#_common_checks_available_deploymentz>LowestTPMLoggingHandler_v2._common_checks_available_deployment\  s‘  € ð Ð Ð!3ØàˆÜ! (Ó+ò 	D‰HˆC�Ø4>¸s±OˆH�X˜c‘]×(Ñ(¨Ó-¨aÑ0Ò1ð	Dð ˆÜ! (Ó+ò 	D‰HˆC�Ø4>¸s±OˆH�X˜c‘]×(Ñ(¨Ó-¨aÑ0Ò1ð	Dð	Ü(°(ÀÔGˆLô 	×#Ñ#Ð$5°|ÔDð
 ÐàˆHØ1ò =�
Ø;<�˜ LÑ1°$Ñ7Ò8ñ=ð )ò *�à˜L™/¨$Ñ/�Ø (Ñ*¨h°wÑ.?Ñ.GØ()�H˜WÒ%ð	*ð "*ˆØ'+×'IÑ'IØ 3Ø+Ø%Øð	 (Jó (
Ðô 	ÐCÔDäÐ$Ó%¨Ò)Ü—=‘=Ð!6Ó7Ð7àøô? ò 	ØŠLð	ús   Á+D	 Ä	DÄDc              ƒ   óä  K  — t        j                  d||«       t        «       }|j                  d«      }g }g }|D ]‹  }	t	        |	t
        «      sŒ|	j                  di «      j                  d«      }
|	j                  di «      j                  d«      }|
› d|› d|› �}|
› d|› d	|› �}|j                  |«       |j                  |«       Œ� ||z   }| j                  j                  |¬
«      ƒ d{  –—† }|�|dt        |«       }|t        |«      d }nd}d}| j                  ||||||||¬«      }	 |€J ‚|S 7 ŒG# t        $ �r¬ i }t        |«      D �]*  \  }}t	        |t
        «      sŒ|j                  di «      j                  d«      }
d}|€|j                  dd«      }|€"|j                  di «      j                  dd«      }|€"|j                  di «      j                  dd«      }|€t        d«      }|r||   nd}d}|€|j                  dd«      }|€"|j                  di «      j                  dd«      }|€"|j                  di «      j                  dd«      }|€t        d«      }|r||   nd}||||dœ||
<   �Œ- t        j                   t"        j$                  j&                  › d|› d|› �d|t)        j*                  dddt-        d«      it)        j.                  dd¬«      ¬«      ¬«      ‚w xY w­w)zz
        Async implementation of get deployments.

        Reduces time to retrieve the tpm/rpm values from cache
        úQget_available_deployments - Usage Based. model_group: %s, healthy_deployments: %sr1   r2   r3   r4   r5   r6   rz   r7   )ÚkeysN©rv   r†   r˜   r™   rš   r›   rœ   r�   r‹   r<   r   r;   ©Úcurrent_tpmÚ	tpm_limitÚcurrent_rpmÚ	rpm_limitú. Passed model=ú. Deployments=r?   r@   rk   r   rB   rC   rD   rl   rJ   )r   r¡   r   rQ   r^   ÚdictrR   rŽ   r&   Úasync_batch_get_cacher¢   r¨   r]   r    rT   rU   rV   r   Úno_deployments_availablerO   rW   rX   rp   r[   )r-   rv   r†   rœ   r�   r_   r`   r˜   rš   Úmr3   rb   r�   rc   Úcombined_tpm_rpm_keysÚcombined_tpm_rpm_valuesr™   r›   r.   Údeployment_dictÚindexr”   r•   r®   r–   r°   s                             r   Úasync_get_available_deploymentsz:LowestTPMLoggingHandler_v2.async_get_available_deployments™  s†  è ø€ ô 	×#Ñ#Ø_ØØô	
ô %Ó&ˆØ "§¡¨GÓ 4ˆàˆØˆØ$ò 
	)ˆAÜ˜!œTÕ"Ø—U‘U˜<¨Ó,×0Ñ0Øó�ð #$§%¡%Ð(8¸"Ó"=×"AÑ"AÀ'Ó"J�Ø˜D  /Ð!2°%¸Ð7GÐH�Ø˜D  /Ð!2°%¸Ð7GÐH�à—‘ Ô(Ø—‘ Õ(ð
	)ð (0°(Ñ':Ðà/3×/@Ñ/@×/VÑ/VØ&ð 0Wó 0
÷ *
Ðð #Ð.Ø0°´3°x³=ÐAˆJØ0´°X³°ÐA‰JàˆJØˆJà ×DÑDØ#Ø 3ØØ!ØØ!ØØð Eó 	
ˆ
ð8	ØÐ)Ð)Ð)ØÐð1*
ùô2 ó 5	à%'ˆOÜ&/Ð0CÓ&Dó $Ñ"��{Ü˜k¬4Õ0Ø$Ÿ™¨°rÓ:×>Ñ>¸tÓD�Bà&*�OØ&Ð.Ø*5¯/©/¸%ÀÓ*F˜Ø&Ð.Ø*5¯/©/Ð:JÈBÓ*O×*SÑ*SÐTYÐ[_Ó*`˜Ø&Ð.Ø*5¯/©/¸,ÈÓ*K×*OÑ*OÐPUÐW[Ó*\˜Ø&Ð.Ü*/°«,˜ñ 8B *¨UÒ"3Àq�Kð '+�OØ&Ð.Ø*5¯/©/¸%ÀÓ*F˜Ø&Ð.Ø*5¯/©/Ð:JÈBÓ*O×*SÑ*SÐTYÐ[_Ó*`˜Ø&Ð.Ø*5¯/©/¸,ÈÓ*K×*OÑ*OÐPUÐW[Ó*\˜Ø&Ð.Ü*/°«,˜ñ 8B *¨UÒ"3Àq�Kð (3Ø%4Ø'2Ø%4ñ	+�O BÓ'ð?$ôJ ×(Ñ(Ü'×@Ñ@×FÑFÐGÀÐWbÐVcÐcqð  sBð  rCð  DØØ!ÜŸ™Ø #ØØ*¬C°«GÐ4Ü!ŸM™MØ/Ø@ôô	ô	ð ðQ5	üs9   ‚AK0ÁBK0Ã-D5Ã.A K0Ä/D7 Ä4K0Ä7.K-Å&FK-Ë-K0c           
      ó*  — t        j                  d||«       t        «       }|j                  d«      }g }g }	|D ]‹  }
t	        |
t
        «      sŒ|
j                  di «      j                  d«      }|
j                  di «      j                  d«      }|› d|› d|› �}|› d|› d	|› �}|j                  |«       |	j                  |«       Œ� | j                  j                  ||¬
«      }| j                  j                  |	|¬
«      }| j                  |||||	|||¬«      }	 |€J ‚|S # t        $ �rg i }t        |«      D �]*  \  }}t	        |t
        «      sŒ|j                  di «      j                  d«      }d}|€|j                  dd«      }|€"|j                  di «      j                  dd«      }|€"|j                  di «      j                  dd«      }|€t        d«      }|r||   nd}d}|€|j                  dd«      }|€"|j                  di «      j                  dd«      }|€"|j                  di «      j                  dd«      }|€t        d«      }|r||   nd}||||dœ||<   �Œ- t        t        j                   j"                  › d|› d|› �«      ‚w xY w)zE
        Returns a deployment with the lowest TPM/RPM usage.
        rª   r1   r2   r3   r4   r5   r6   rz   r7   )r«   ri   r¬   Nr‹   r<   r   r;   r­   r²   r³   )r   r¡   r   rQ   r^   r´   rR   rŽ   r&   Úbatch_get_cacher¨   r]   r    rT   r{   r   r¶   rO   )r-   rv   r†   rœ   r�   ri   r_   r`   r˜   rš   r·   r3   rb   r�   rc   r™   r›   r.   rº   r»   r”   r•   r®   r–   r°   s                            r   Úget_available_deploymentsz4LowestTPMLoggingHandler_v2.get_available_deployments  s  € ô 	×#Ñ#Ø_ØØô	
ô %Ó&ˆØ "§¡¨GÓ 4ˆØˆØˆØ$ò 
	)ˆAÜ˜!œTÕ"Ø—U‘U˜<¨Ó,×0Ñ0Øó�ð #$§%¡%Ð(8¸"Ó"=×"AÑ"AÀ'Ó"J�Ø˜D  /Ð!2°%¸Ð7GÐH�Ø˜D  /Ð!2°%¸Ð7GÐH�à—‘ Ô(Ø—‘ Õ(ð
	)ð !×-Ñ-×=Ñ=ØÐ,<ð >ó 
ˆ
ð !×-Ñ-×=Ñ=ØÐ,<ð >ó 
ˆ
ð !×DÑDØ#Ø 3ØØ!ØØ!ØØð Eó 	
ˆ
ð-	ØÐ)Ð)Ð)ØÐøÜó *	à%'ˆOÜ&/Ð0CÓ&Dó $Ñ"��{Ü˜k¬4Õ0Ø$Ÿ™¨°rÓ:×>Ñ>¸tÓD�Bà&*�OØ&Ð.Ø*5¯/©/¸%ÀÓ*F˜Ø&Ð.Ø*5¯/©/Ð:JÈBÓ*O×*SÑ*SÐTYÐ[_Ó*`˜Ø&Ð.Ø*5¯/©/¸,ÈÓ*K×*OÑ*OÐPUÐW[Ó*\˜Ø&Ð.Ü*/°«,˜ñ 8B *¨UÒ"3Àq�Kð '+�OØ&Ð.Ø*5¯/©/¸%ÀÓ*F˜Ø&Ð.Ø*5¯/©/Ð:JÈBÓ*O×*SÑ*SÐTYÐ[_Ó*`˜Ø&Ð.Ø*5¯/©/¸,ÈÓ*K×*OÑ*OÐPUÐW[Ó*\˜Ø&Ð.Ü*/°«,˜ñ 8B *¨UÒ"3Àq�Kð (3Ø%4Ø'2Ø%4ñ	+�O BÓ'ð?$ôJ Ü×8Ñ8×>Ñ>Ð?¸È{ÈmÐ[iÐjyÐizÐ{óð ðQ*	ús   ÄD! Ä!.JÅEJ)NN)NNN)r   r   r   Ú__doc__r"   Úboolr   r#   r   r$   r%   r	   r´   r,   rh   r   rr   r‚   r…   Úlistr—   rp   r¨   r¼   r¿   r   r   r   r!   r!       s  … ñ
ð €IˆtÓØ€N�CÓØ€N�CÓØ&1Ð Ó1àEGñ 
 Yð 
¸dó 
ðI¨ð I°$¸±+ó IðVJ°Tð JÈTÐTXÉ[ð JÐ]aÐdhÑ]hó JòX&òP*ðX3%à! $™Zð3%ð ð3%ð ð	3%ð
 ó3%ðz 15Ø#'ñ;àð;ð "ð;ð ð	;ð
 ˜4‘Kð;ð ð;ð ˜4‘Kð;ð �t˜C ˜H‘~Ñ&¨Ñ-ð;ð �T‰z˜DÑ ð;ð 
�‰ó;ðB 15Ø#'ñtàðtð "ðtð �t˜C ˜H‘~Ñ&¨Ñ-ð	tð
 �T‰z˜DÑ ótðt 15Ø#'Ø(,ñaàðað "ðað �t˜C ˜H‘~Ñ&¨Ñ-ð	að
 �T‰z˜DÑ ðað  ™+ôar   r!   ) r£   Útypingr   r   r   rW   rU   r   Úlitellm._loggingr   r   Úlitellm.caching.cachingr	   Ú"litellm.integrations.custom_loggerr
   Ú'litellm.litellm_core_utils.core_helpersr   Úlitellm.types.routerr   Úlitellm.types.utilsr   r   Úlitellm.utilsr   r   Úbase_routing_strategyr   Úopentelemetry.tracer   Ú_Spanr   r!   r   r   r   ú<module>rÎ      sc   ðó ß ,Ñ ,ã ã Ý !ß BÝ -Ý ;Ý UÝ -ß Qß 9å 6áÝ1à�3‰;�Dà€DôÐ+ô ôP	Ð!4°lõ P	r   