Ë
    uPêj}"  ã                   óÎ   — U d Z ddlZddlZddlmZ ddl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 erdd
lmZ eez  ZneZ G d„ de
«      ZdZeed<    G d„ d«      Zy)zC
Wrapper around router cache. Meant to handle model cooldown logic
é    N)ÚMapping)ÚTYPE_CHECKINGÚAnyÚFinal)Ú	TypedDict)Úverbose_logger)Ú	DualCache)ÚInMemoryCache)ÚSensitiveDataMasker)ÚSpanc                   ó6   — e Zd ZU eed<   eed<   eed<   eed<   y)ÚCooldownCacheValueÚexception_receivedÚstatus_codeÚ	timestampÚcooldown_timeN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úfloat© ó    úh/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/router_utils/cooldown_cache.pyr   r      s   … ØÓØÓØÓØÔr   r   g      N@Ú$_MAX_CORRECTED_IN_MEMORY_TTL_SECONDSc            	       óF  — e Zd Zdedefd„Zdededeeef   fd„Z	dede
d	eded
z  fd„Ze ej                  d¬«      dedefd„«       «       Zdedeeef   deded
z  fd„Zdee   ded
z  deeeef      fd„Zdee   ded
z  deeeef      fd„Zdee   ded
z  defd„Zy
)ÚCooldownCacheÚcacheÚdefault_cooldown_timec                 óf   — || _         || _        t        «       | _        t	        dddd¬«      | _        y )Né2   r   Ú*F)Úvisible_prefixÚvisible_suffixÚ	mask_charÚmask_short_values)r   r    r
   Úin_memory_cacher   Úexception_masker)Úselfr   r    s      r   Ú__init__zCooldownCache.__init__'   s4   € ØˆŒ
Ø%:ˆÔ"Ü,›ˆÔä 3ØØØØ#ô	!
ˆÕr   Úmodel_idr   Úreturnc                 ó$  — 	 t        j                   «       }t        j                  |«      }t        | j                  j                  t        |«      «      t        |«      ||¬«      }||fS # t        $ r}t        j                  d|«       |‚d }~ww xY w)N)r   r   r   r   zCCooldownCache::_common_add_cooldown_logic - Exception occurred - %s)
Útimer   Úget_cooldown_cache_keyr   r)   Ú_mask_valuer   Ú	Exceptionr   Úerror)	r*   r,   Úoriginal_exceptionÚexception_statusr   Úcurrent_timeÚcooldown_keyÚcooldown_dataÚes	            r   Ú_common_add_cooldown_logicz(CooldownCache._common_add_cooldown_logic3   s‹   € ð	Ü"&§)¡)£+ˆLÜ"/×"FÑ"FÀxÓ"PˆLô $6Ø#'×#8Ñ#8×#DÑ#DÄSÐI[ÓE\Ó#]ÜÐ 0Ó1Ø&Ø+ô	$ˆMð   Ð.Ð.øÜò 	Ü× Ñ Ð!fÐhiÔjØˆGûð	ús   ‚A&A) Á)	BÁ2B
Â
Br4   r5   Nc                 óä   — 	 |}|€| j                   }| j                  ||||¬«      \  }}| j                  j                  |||¬«       y # t        $ r}t        j                  d|«       |‚d }~ww xY w)N)r,   r4   r5   r   )ÚvalueÚkeyÚttlzCCooldownCache::add_deployment_to_cooldown - Exception occurred - %s)r    r:   r   Ú	set_cacher2   r   r3   )	r*   r,   r4   r5   r   Ú_cooldown_timer7   r8   r9   s	            r   Úadd_deployment_to_cooldownz(CooldownCache.add_deployment_to_cooldownG   s“   € ð	ð
 +ˆNØÐ%Ø!%×!;Ñ!;�ð +/×*IÑ*IØ!Ø#5Ø!1Ø,ð	 +Jó +Ñ'ˆL˜-ð �J‰J× Ñ Ø#Ø Ø"ð !õ øô
 ò 	Ü× Ñ Ð!fÐhiÔjØˆGûð	ús   ‚AA	 Á		A/ÁA*Á*A/i   )Úmaxsizec                 ó   — d| z   dz   S )Núdeployment:ú	:cooldownr   )r,   s    r   r0   z$CooldownCache.get_cooldown_cache_keyi   s   € ð ˜xÑ'¨+Ñ5Ð5r   r=   Úresultr6   c                 óÀ  — t        di |¤Ž}|d   |d   z   |z
  }|dk  r&| j                  j                  j                  |«       y| j                  j                  j                  j                  |«      }|�h|||z   dz   kD  r]t        |t        «      }| j                  j                  j                  |«       | j                  j                  j                  |||¬«       |S )a  
        Return a CooldownCacheValue if the cooldown is still active, or None if it has expired.

        Also corrects the in-memory TTL when DualCache promotes a Redis entry using the
        default 600s TTL instead of the true remaining cooldown time.
        r   r   r   Né   )r>   r   )	r   r   r(   Údelete_cacheÚttl_dictÚgetÚminr   r?   )r*   r=   rF   r6   Úcooldown_cache_valueÚ	remainingÚcurrent_expiryÚcorrected_ttls           r   Ú_corrected_active_cooldownz(CooldownCache._corrected_active_cooldownn   sÒ   € ô '9Ñ&B¸6Ñ&BÐØ0°Ñ=Ð@TÐUdÑ@eÑeÐiuÑuˆ	Ø˜Š>Ø�J‰J×&Ñ&×3Ñ3°CÔ8ØØ $§
¡
× :Ñ :× CÑ C× GÑ GÈÓ LˆØÐ%¨.¸<È)Ñ;SÐVWÑ;WÒ*WÜ#& yÔ2VÓ#WˆMØ�J‰J×&Ñ&×3Ñ3°CÔ8Ø�J‰J×&Ñ&×0Ñ0°°fÀ-Ð0ÔPØ#Ð#r   Ú	model_idsÚparent_otel_spanc              ƒ   óÎ  K  — |D �cg c]  }t         j                  |«      ‘Œ }}| j                  j                  ||¬«      ƒ d {  –—† }g }|�t	        d„ |D «       «      r|S t        j
                  «       }t        ||«      D ]W  \  }}|sŒ	t        |t        «      sŒt         j                  |«      }	| j                  |	||«      }
|
€ŒE|j                  ||
f«       ŒY |S c c}w 7 Œ�­w)N©ÚkeysrS   c              3   ó$   K  — | ]  }|d u –— Œ
 y ­w)Nr   )Ú.0Úvs     r   ú	<genexpr>z;CooldownCache.async_get_active_cooldowns.<locals>.<genexpr>”   s   è ø€ Ò!=° ! t¤)Ñ!=ùs   ‚)r   r0   r   Úasync_batch_get_cacheÚallr/   ÚzipÚ
isinstanceÚdictrQ   Úappend©r*   rR   rS   r,   rV   ÚresultsÚactive_cooldownsr6   rF   r=   rM   s              r   Úasync_get_active_cooldownsz(CooldownCache.async_get_active_cooldowns†   sí   è ø€ ð W`Ö`È(”}×;Ñ;¸HÕEÐ`ˆÐ`ð  $Ÿz™z×?Ñ?ÀTÐ\lÐ?Óm×mˆØHJÐàˆ?œcÑ!=°WÔ!=Ô=Ø#Ð#ä"Ÿi™i›kˆÜ # I¨wÓ 7ò 	NÑˆH�fÚœ* V¬TÕ2Ü#×:Ñ:¸8ÓD�Ø'+×'FÑ'FÀsÈFÐT`Ó'aÐ$Ø'Ñ3Ø$×+Ñ+¨XÐ7KÐ,LÕMð	Nð  Ðùò+ að nús.   ‚C%‡C£"C%ÁC#ÁAC%ÂC%Â*C%ÃC%c                 óŽ  — |D �cg c]  }t         j                  |«      ‘Œ }}| j                  j                  ||¬«      xs g }g }t	        j                  «       }t        ||«      D ]W  \  }}|sŒ	t        |t        «      sŒt         j                  |«      }	| j                  |	||«      }
|
€ŒE|j                  ||
f«       ŒY |S c c}w )NrU   )
r   r0   r   Úbatch_get_cacher/   r]   r^   r_   rQ   r`   ra   s              r   Úget_active_cooldownsz"CooldownCache.get_active_cooldowns¡   sÌ   € ð W`Ö`È(”}×;Ñ;¸HÕEÐ`ˆÐ`àŸ™×3Ñ3¸ÐP`Ð3ÓaÒgÐegˆà"$ÐÜ"Ÿi™i›kˆÜ # I¨wÓ 7ò 	NÑˆH�fÚœ* V¬TÕ2Ü#×:Ñ:¸8ÓD�Ø'+×'FÑ'FÀsÈFÐT`Ó'aÐ$Ø'Ñ3Ø$×+Ñ+¨XÐ7KÐ,LÕMð	Nð  Ðùò as   …Cc                 ó  — |D �cg c]  }d|› d�‘Œ
 }}| j                   j                  ||¬«      xs g }d}t        ||«      D ]4  \  }}|sŒ	t        |t        «      sŒt        di |¤Ž}|�	|d   |k  sŒ0|d   }Œ6 |xs | j                  S c c}w )z<Return min cooldown time required for a group of model id's.rD   rE   rU   Nr   r   )r   rf   r]   r^   r_   r   r    )	r*   rR   rS   r,   rV   rb   Úmin_cooldown_timerF   rM   s	            r   Úget_min_cooldownzCooldownCache.get_min_cooldown´   s¹   € ð JSÖS¸X˜ X J¨iÒ8ÐSˆÐSð Ÿ™×3Ñ3¸ÐP`Ð3ÓaÒgÐegˆà*.Ðä # I¨wÓ 7ò 	NÑˆH�fÚœ* V¬TÕ2Ü'9Ñ'C¸FÑ'CÐ$Ø$Ð,Ð0DÀ_Ñ0UÐXiÓ0iØ(<¸_Ñ(MÑ%ð		Nð !Ò> D×$>Ñ$>Ð>ùò Ts   …B
)r   r   r   r	   r   r+   r   Útupler   r:   r2   ÚintrA   ÚstaticmethodÚ	functoolsÚ	lru_cacher0   r   r   rQ   Úlistr   rd   rg   rj   r   r   r   r   r   &   sj  „ ð

˜ið 

Àó 

ðØðØRWðà	ˆsÐ&Ð&Ñ	'óð( àð ð &ð ð ð	 ð
 ˜t‘|ó ðD Ø€Y×Ñ Ô&ð6¨ð 6°ò 6ó 'ó ð6ð$àð$ð ˜˜S˜Ñ!ð$ð ð	$ð
 
˜dÑ	"ó$ð0 Ø˜c™ð Ø6:¸T±kð à	ˆe�CÐ+Ð+Ñ,Ñ	-ó ð6 Ø˜c™ð Ø6:¸T±kð à	ˆe�CÐ+Ð+Ñ,Ñ	-ó ð&?¨$¨s©)ð ?ÀtÈdÁ{ð ?ÐW\ô ?r   r   )Ú__doc__rn   r/   Úcollections.abcr   Útypingr   r   r   Útyping_extensionsr   Úlitellmr   Úlitellm.caching.cachingr	   Úlitellm.caching.in_memory_cacher
   Ú0litellm.litellm_core_utils.sensitive_data_maskerr   Úopentelemetry.tracer   Ú_Spanr   r   r   r   r   r   r   ú<module>r{      sc   ðòó Û Ý #ß ,Ñ ,å 'å "Ý -Ý 9Ý PáÝ1à�3‰;�Dà€Dô˜ô ð /3Ð $ eÓ 2÷_?ò _?r   