Ë
    uPêj;L  ã                   óü   — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ e	rddlmZ ddl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 e	rddlmZ ee
z  Zne
ZddlmZ  G d„ de«      Z G d„ de«      Z y)zÃ
Dual Cache implementation - Class to update both Redis and an in-memory cache simultaneously.

Has 4 primary methods:
    - set_cache
    - get_cache
    - async_set_cache
    - async_get_cache
é    N)ÚThreadPoolExecutor)ÚLock)ÚTYPE_CHECKINGÚAnyÚFinal)ÚRedisPipelineIncrementOperation)Úprint_verboseÚverbose_logger)Ú"DEFAULT_MAX_REDIS_BATCH_CACHE_SIZEé   )Ú	BaseCache)ÚInMemoryCache)Ú
RedisCache)ÚSpan)ÚOrderedDictc                   ó.   ‡ — e Zd Zddœˆ fd„
Zˆ fd„Zˆ xZS )ÚLimitedSizeOrderedDictéd   ©Úmax_sizec                ó2   •— t        ‰| �  |i |¤Ž || _        y ©N)ÚsuperÚ__init__r   )Úselfr   ÚargsÚkwargsÚ	__class__s       €ú_/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/dual_cache.pyr   zLimitedSizeOrderedDict.__init__(   s   ø€ Ü‰Ñ˜$Ð) &Ò)Ø ˆ�ó    c                 óz   •— t        | «      | j                  k\  r| j                  d¬«       t        ‰| �  ||«       y )NF)Úlast)Úlenr   Úpopitemr   Ú__setitem__)r   ÚkeyÚvaluer   s      €r   r%   z"LimitedSizeOrderedDict.__setitem__,   s0   ø€ äˆt‹9˜Ÿ™Ò%Ø�L‰L˜eˆLÔ$Ü‰Ñ˜C Õ'r    )Ú__name__Ú
__module__Ú__qualname__r   r%   Ú__classcell__©r   s   @r   r   r   '   s   ø„ Ø'*ö !÷(ð (r    r   c                   ó„  ‡ — e Zd ZdZdddddefdedz  dedz  dedz  dedz  dedz  ded	dfˆ fd
„Z	dedz  dedz  fd„Z
	 d,ddœdedz  dedz  d	dfd„Zd-d„Zd.defd„Zd.deded	efd„Z	 	 d/dedz  defd„Z	 	 d/dededz  defd„Z	 	 d/dedz  defd„Zdedee   dee   d	eee   eeedz  f   f   fd„Zdeeedz  f   d	dfd„Z	 	 d/dededz  defd„Zd.defd„Zd.dedefd „Z	 	 	 d0dededz  ded!ed	edz  f
d"„Z	 	 d1d#ed$   dededz  d	ee   dz  fd%„Zd.deded	dfd&„Z d'„ Z!d(„ Z"d)efd*„Z#d)ed	edz  fd+„Z$ˆ xZ%S )2Ú	DualCachea5  
    DualCache is a cache implementation that updates both Redis and an in-memory cache simultaneously.
    When data is updated or inserted, it is written to both the in-memory cache + Redis.
    This ensures that even if Redis hasn't been updated yet, the in-memory cache reflects the most recent data.
    NÚin_memory_cacheÚredis_cacheÚdefault_in_memory_ttlÚdefault_redis_ttlÚ default_redis_batch_cache_expiryÚ"default_max_redis_batch_cache_sizeÚreturnc                 ó4  •— t         ‰| �  «        |xs
 t        «       | _        || _        t        |¬«      | _        t        «       | _        |xs t        j                  xs d| _        |xs t        j                  | _        |xs t        j                  | _        y )Nr   é
   )r   r   r   r/   r0   r   Úlast_redis_batch_access_timer   Ú"_last_redis_batch_access_time_lockÚlitellmr3   Úredis_batch_cache_expiryr1   r2   )r   r/   r0   r1   r2   r3   r4   r   s          €r   r   zDualCache.__init__:   sƒ   ø€ ô 	‰ÑÔà.ÒA´-³/ˆÔà&ˆÔÜ,BÐLnÔ,oˆÔ)Ü26³&ˆÔ/à,Ò^´×0XÑ0XÒ^Ð\^ð 	Ô%ð &;Ò%[¼g×>[Ñ>[ˆÔ"Ø!2Ò!O´g×6OÑ6OˆÕr    c                 ó*   — |�|| _         |�|| _        y y r   )r1   r2   )r   r1   r2   s      r   Úupdate_cache_ttlzDualCache.update_cache_ttlP   s#   € Ø Ð,Ø)>ˆDÔ&àÐ(Ø%6ˆDÕ"ð )r    )r2   c                óD   — |�| j                   �y|| _         |�|| _        yy)a=  
        Attach a Redis backend if this DualCache does not already have one.

        No-op when ``redis_cache`` is None or when Redis was already set (constructor
        or a prior attach). Use this for lazy wiring after a shared Redis client exists.
        Does not backfill in-memory-only keys to Redis.
        N)r0   r2   )r   r0   r2   s      r   Úattach_redis_cachezDualCache.attach_redis_cacheW   s3   € ð Ð $×"2Ñ"2Ð">ØØ&ˆÔØÐ(Ø%6ˆDÕ"ð )r    c                 óJ   — d|vr| j                   �i |¥d| j                   i¥S |S )a0  
        Kwargs for writing a Redis read result into the in-memory tier.

        Applies ``default_in_memory_ttl`` exactly like the write paths do;
        without it, backfilled entries fall to ``InMemoryCache``'s own default
        TTL and can outlive the TTL this cache was configured with.
        Úttl)r1   )r   r   s     r   Ú_backfill_kwargszDualCache._backfill_kwargsj   s4   € ð ˜Ñ 4×#=Ñ#=Ð#IØ@�fÐ@˜e T×%?Ñ%?Ñ@Ð@Øˆr    Ú
local_onlyc                 ó:  — 	 | j                   �=d|vr| j                  �| j                  |d<    | j                   j                  ||fi |¤Ž | j                  �$|du r | j                  j                  ||fi |¤Ž y y y # t        $ r}t        |«       Y d }~y d }~ww xY w)NrA   F)r/   r1   Ú	set_cacher0   Ú	Exceptionr	   ©r   r&   r'   rC   r   Úes         r   rE   zDualCache.set_cachev   s¦   € ð
	Ø×#Ñ#Ð/Ø Ñ&¨4×+EÑ+EÐ+QØ$(×$>Ñ$>�F˜5‘Mà.�×$Ñ$×.Ñ.¨s°EÑD¸VÒDà×ÑÐ+°
¸eÑ0CØ*�× Ñ ×*Ñ*¨3°Ñ@¸Ó@ð 1DÐ+øäò 	Ü˜!×Ñûð	ús   ‚A7A< Á<	BÂBÂBr'   c                 ó  — 	 |}| j                   � | j                   j                  ||fi |¤Ž}| j                  �"|du r | j                  j                  ||fi |¤Ž}|S # t        $ r}t	        j
                  d|«       |‚d}~ww xY w)z‘
        Key - the key in cache

        Value - int - the value you want to increment by

        Returns - int - the incremented value
        NFú+LiteLLM Cache: Excepton async add_cache: %s)r/   Úincrement_cacher0   rF   r
   Úerror)r   r&   r'   rC   r   ÚresultrH   s          r   rK   zDualCache.increment_cache„   s•   € ð	ØˆFØ×#Ñ#Ð/Ø=˜×-Ñ-×=Ñ=¸cÀ5ÑSÈFÑS�à×ÑÐ+°
¸eÑ0CØ9˜×)Ñ)×9Ñ9¸#¸uÑOÈÑO�àˆMøÜò 	Ü× Ñ Ð!NÐPQÔRØˆGûð	ús   ‚AA Á	BÁ'A?Á?BÚparent_otel_spanc                 ó®  — 	 d }| j                   �! | j                   j                  |fi |¤Ž}|�|}|€^| j                  �R|du rN| j                  j                  ||¬«      }|�- | j                   j                  ||fi | j	                  |«      ¤Ž |}t        d|› �«       |S # t        $ r* t        j                  t        j                  «       «       Y y w xY w)NF©rN   úget cache: cache result: )r/   Ú	get_cacher0   rE   rB   r	   rF   r
   rL   Ú	tracebackÚ
format_exc©r   r&   rN   rC   r   rM   Úin_memory_resultÚredis_results           r   rR   zDualCache.get_cache™   så   € ð	9ØˆFØ×#Ñ#Ð/Ø*H¨$×*>Ñ*>×*HÑ*HÈÑ*WÐPVÑ*WÐ à#Ð/Ø-�Fàˆ~ $×"2Ñ"2Ð">À:ÐQVÑCVà&*×&6Ñ&6×&@Ñ&@ÀÐWgÐ&@Ó&h�àÐ+à2�D×(Ñ(×2Ñ2°3¸ÑfÈ×H]ÑH]Ð^dÓHeÒfà%�äÐ5°f°XÐ>Ô?ØˆMøÜò 	9Ü× Ñ ¤×!5Ñ!5Ó!7Ö8ð	9ús   ‚BB! Â!0CÃCÚkeysc                 ó$  ‡ ‡	— t        «       Š	‰	j                  d«       ˆ	ˆ fd„}	 t        j                  «       }t	        d¬«      5 }|j                  |«      }|j                  «       cd d d «       S # 1 sw Y   y xY w# t        $ r
  |«       cY S w xY w)Nr   c                  ó8  •— t        j                  «       } 	 t        j                  | «       | j                   ‰j                  di ‰¤Ž«      | j                  «        t        j                  d«       S # | j                  «        t        j                  d«       w xY w)z9Run the coroutine in a new event loop within this thread.N© )ÚasyncioÚnew_event_loopÚset_event_loopÚrun_until_completeÚasync_batch_get_cacheÚclose)Únew_loopÚreceived_argsr   s    €€r   Úrun_in_new_loopz2DualCache.batch_get_cache.<locals>.run_in_new_loopÂ   sx   ø€ ä%×4Ñ4Ó6ˆHð-Ü×&Ñ& xÔ0Ø×2Ñ2Ð3M°4×3MÑ3MÑ3^ÐP]Ñ3^Ó_à—‘Ô Ü×&Ñ& tÕ,øð —‘Ô Ü×&Ñ& tÕ,ús   —5A2 Á2'Br   )Úmax_workers)ÚlocalsÚpopr\   Úget_running_loopr   ÚsubmitrM   ÚRuntimeError)
r   rX   rN   rC   r   rd   Ú_ÚexecutorÚfuturerc   s
   `        @r   Úbatch_get_cachezDualCache.batch_get_cache¸   sƒ   ù€ ô  &›xˆØ×Ñ˜&Ô!õ	-ð	%ä×(Ñ(Ó*ˆAô $°Ô2ð '°hØ (§¡°Ó @�Ø—}‘}“÷'÷ 'ò 'ûô ò 	%á"Ó$Ò$ð	%ús/   ¥ A< Á!A0Á&	A< Á0A9Á5A< Á9A< Á<BÂBc              ‹   ó0  K  — 	 t        d|› d|› �«       d }| j                  �7 | j                  j                  |fi |¤Žƒ d {  –—† }t        d|› �«       |�|}|€n| j                  �b|du r^| j                  j                  ||¬«      ƒ d {  –—† }|�5 | j                  j                  ||fi | j                  |«      ¤Žƒ d {  –—†  |}t        d|› �«       |S 7 Œ–7 ŒO7 Œ# t        $ r* t        j                  t        j                  «       «       Y y w xY w­w)Nzasync get cache: cache key: ú; local_only: zin_memory_result: FrP   rQ   )r	   r/   Úasync_get_cacher0   Úasync_set_cacherB   rF   r
   rL   rS   rT   rU   s           r   rq   zDualCache.async_get_cacheÙ   s4  è ø€ ð	9ÜÐ8¸¸¸^ÈJÈ<ÐXÔYØˆFØ×#Ñ#Ð/Ø0T°×0DÑ0D×0TÑ0TÐUXÑ0cÐ\bÑ0c×*cÐ äÐ 2Ð3CÐ2DÐEÔFØ#Ð/Ø-�Fàˆ~ $×"2Ñ"2Ð">À:ÐQVÑCVà,0×,<Ñ,<×,LÑ,LÈSÐcsÐ,LÓ,t×&t�àÐ+à>˜$×.Ñ.×>Ñ>¸sÀLÑrÐTX×TiÑTiÐjpÓTqÑr×rÐrà%�äÐ5°f°XÐ>Ô?ØˆMð# +døð 'uøð sùô ò 	9Ü× Ñ ¤×!5Ñ!5Ó!7Ö8ð	9üs_   ‚D„?C  ÁCÁAC  ÂCÂ6C  ÃCÃC  ÃDÃC  ÃC  ÃC  Ã 0DÄDÄDÄDÚcurrent_timerM   c                 ób  — g }i }| j                   5  t        ||«      D ]t  \  }}|�Œ	|| j                  vs || j                  |   z
  | j                  k\  sŒ7|j	                  |«       | j                  j                  |«      ||<   || j                  |<   Œv 	 ddd«       ||fS # 1 sw Y   ||fS xY w)z¦
        Atomically choose keys to fetch from Redis and reserve their access time.
        This prevents check-then-act races under concurrent async callers.
        N)r9   Úzipr8   r;   ÚappendÚget)r   rs   rX   rM   Úsublist_keysÚprevious_access_timesr&   r'   s           r   Ú_reserve_redis_batch_keysz#DualCache._reserve_redis_batch_keysú   sÖ   € ð *,ˆØ@BÐà×4Ñ4ñ 	JÜ! $¨Ó/ò 
J‘
��UØÐ$Øð ˜t×@Ñ@Ñ@Ø# d×&GÑ&GÈÑ&LÑLÐPT×PmÑPmÓmà ×'Ñ'¨Ô,Ø15×1RÑ1R×1VÑ1VÐWZÓ1[Ð)¨#Ñ.Ø=I�D×5Ñ5°cÒ:ñ
J÷	Jð Ð2Ð2Ð2÷	Jð Ð2Ð2Ð2ús   ‘AB"ÁA B"Â"B.ry   c                 óÔ   — | j                   5  |j                  «       D ]3  \  }}|€| j                  j                  |d «       Œ%|| j                  |<   Œ5 	 d d d «       y # 1 sw Y   y xY wr   )r9   Úitemsr8   rg   )r   ry   r&   Úprevious_times       r   Ú&_rollback_redis_batch_key_reservationsz0DualCache._rollback_redis_batch_key_reservations  so   € Ø×4Ñ4ñ 	KØ&;×&AÑ&AÓ&Cò KÑ"��]Ø Ð(Ø×5Ñ5×9Ñ9¸#¸tÕDà=J�D×5Ñ5°cÒ:ñ	K÷	K÷ 	Kñ 	Kús   �AAÁA'c              ‹   ó–  K  — 	 d gt        |«      z  }| j                  �) | j                  j                  |fi |¤Žƒ d {  –—† }|�|}d |v �r| j                  ��|du �r	 t	        j                  «       }| j                  |||«      \  }}	t        |«      dkD  rÍ	 | j                  j                  ||¬«      ƒ d {  –—† }
|
� t        d„ |
j                  «       D «       «      r|S t        |«      D ��ci c]  \  }}||“Œ
 }}}|
j                  «       D ]R  \  }}||||   <   |€Œ| j                  €Œ | j                  j                  ||fi | j                  |«      ¤Žƒ d {  –—†  ŒT |S 7 �Œ(7 Œ°# t        $ r | j                  |	«       ‚ w xY wc c}}w 7 Œ2# t        $ r* t        j                  t!        j"                  «       «       Y y w xY w­w)NFr   rP   c              3   ó$   K  — | ]  }|d u –— Œ
 y ­wr   r[   )Ú.0Úvs     r   ú	<genexpr>z2DualCache.async_batch_get_cache.<locals>.<genexpr>B  s   è ø€ Ò2\À°1¸´9Ñ2\ùs   ‚)r#   r/   r`   r0   Útimerz   rF   r~   ÚallÚvaluesÚ	enumerater|   rr   rB   r
   rL   rS   rT   )r   rX   rN   rC   r   rM   rV   rs   rx   ry   rW   Úir&   Úkey_to_indexr'   s                  r   r`   zDualCache.async_batch_get_cache  sø  è ø€ ð,	9Ø�Vœc $›iÑ'ˆFØ×#Ñ#Ð/Ø0Z°×0DÑ0D×0ZÑ0ZÐ[_Ñ0jÐciÑ0j×*jÐ à#Ð/Ø-�Fà�vŠ~ $×"2Ñ"2Ñ">À:ÐQVÒCVðô '+§i¡i£k�Ø6:×6TÑ6TÐUaÐcgÐioÓ6pÑ3�Ð3ô �|Ó$ qÒ(ðà48×4DÑ4D×4ZÑ4ZØ(Ð;Kð 5[ó 5÷ /˜ð $Ð+¬sÑ2\Àl×FYÑFYÓF[Ô2\Ô/\Ø%˜ô AJÈ$Ã×*P±f°a¸¨3°©6Ð*P�LÑ*Pð '3×&8Ñ&8Ó&:ò t™
˜˜UØ49˜˜|¨CÑ0Ñ1à Ñ,°×1EÑ1EÑ1QØ"F $×"6Ñ"6×"FÑ"FÀsÈEÑ"sÐUY×UjÑUjÐkqÓUrÑ"s×sÑsð	tð ˆMðO +kùð"/ùô %ò à×CÑCÐDYÔZØðüó +Qð tùô ò 	9Ü× Ñ ¤×!5Ñ!5Ó!7Ö8ð	9üs”   ‚G	„;F ¿E'Á AF Â E, Â9E*Â:E, Â>#F Ã!G	Ã"F Ã0FÃ=#F Ä!F Ä.0F ÅFÅF Å&G	Å'F Å*E, Å,FÆ
F Æ0GÇG	ÇGÇG	c              ‹   ó¨  K  — t        d|› d|› d|› �«       	 | j                  �Ed|vr| j                  �| j                  |d<    | j                  j                  ||fi |¤Žƒ d {  –—†  | j                  �,|du r' | j                  j                  ||fi |¤Žƒ d {  –—†  y y y 7 Œ=7 Œ	# t
        $ r }t        j                  d|«       Y d }~y d }~ww xY w­w)Nzasync set cache: cache key: rp   z	; value: rA   FrJ   )r	   r/   r1   rr   r0   rF   r
   Ú	exceptionrG   s         r   rr   zDualCache.async_set_cacheS  sî   è ø€ ÜÐ4°S°E¸È
À|ÐS\Ð]bÐ\cÐdÔeð		WØ×#Ñ#Ð/Ø Ñ&¨4×+EÑ+EÐ+QØ$(×$>Ñ$>�F˜5‘MØ:�d×*Ñ*×:Ñ:¸3ÀÑPÈÑP×PÐPà×ÑÐ+°
¸eÑ0CØ6�d×&Ñ&×6Ñ6°s¸EÑLÀVÑL×LÑLð 1DÐ+ð Qøð MùÜò 	WÜ×$Ñ$Ð%RÐTU×VÑVûð	WüsS   ‚C˜AB& Á$B"Á%5B& ÂB$ÂB& ÂCÂ"B& Â$B& Â&	CÂ/C
ÃCÃ
CÃCÚ
cache_listc              ‹   óÄ  K  — t        d|› d|› �«       	 | j                  �Ed|vr| j                  �| j                  |d<    | j                  j                  d	d|i|¤Žƒ d{  –—†  | j                  �=|du r8 | j                  j                  d	||j                  dd«      dœ|¤Žƒ d{  –—†  yyy7 ŒN7 Œ	# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)
z1
        Batch write values to the cache
        z#async batch set cache: cache keys: rp   NrA   rŒ   F)rŒ   rA   rJ   r[   )	r	   r/   r1   Úasync_set_cache_pipeliner0   rg   rF   r
   r‹   )r   rŒ   rC   r   rH   s        r   rŽ   z"DualCache.async_set_cache_pipelinea  s  è ø€ ô 	Ð;¸J¸<À~ÐV`ÐUaÐbÔcð	WØ×#Ñ#Ð/Ø Ñ&¨4×+EÑ+EÐ+QØ$(×$>Ñ$>�F˜5‘MØC�d×*Ñ*×CÑCÑdÈzÐdÐ]cÑd×dÐdà×ÑÐ+°
¸eÑ0CØ?�d×&Ñ&×?Ñ?ð Ø)¨v¯z©z¸%ÀÓ/FñØJPñ÷ ñ ð 1DÐ+ð eøðùô ò 	WÜ×$Ñ$Ð%RÐTU×VÑVûð	WüsT   ‚C •AB4 Á!B0Á"AB4 Â(B2Â)B4 Â-C Â0B4 Â2B4 Â4	CÂ=CÃC ÃCÃC Úrefresh_ttlc           	   ‹   ól  K  — d}	 | j                   �& | j                   j                  ||fi |¤Žƒ d{  –—† }| j                  �<|du r8| j                  j                  ||||j                  dd«      |¬«      ƒ d{  –—† }|S 7 ŒN7 Œ# t        $ r"}t        j                  d|«       |cY d}~S d}~ww xY w­w)ay  
        Key - the key in cache

        Value - float - the value you want to increment by

        Refresh_ttl - bool - if True, resets the Redis TTL on every write.
        Default False preserves window-style semantics.

        Returns - the incremented value, or None if no cache backend is
        available (in_memory_cache is None and Redis failed/is absent).
        NFrA   )rN   rA   r�   zHRedis async_increment_cache failed, falling back to in-memory result: %s)r/   Úasync_incrementr0   rw   rF   r
   Úwarning)	r   r&   r'   rN   rC   r�   r   rM   rH   s	            r   Úasync_increment_cachezDualCache.async_increment_caches  sÎ   è ø€ ð(  $ˆð	Ø×#Ñ#Ð/ØC˜t×3Ñ3×CÑCÀCÈÑYÐRXÑY×Y�à×ÑÐ+°
¸eÑ0CØ#×/Ñ/×?Ñ?ØØØ%5ØŸ
™
 5¨$Ó/Ø +ð  @ó  ÷ �ð ˆMð Zøðùô ò 	Ü×"Ñ"ØZØôð �Mûð	üsW   ‚B4†-B ³B´AB Á;BÁ<B ÂB4ÂB ÂB Â	B1ÂB,Â&B1Â'B4Â,B1Â1B4Úincrement_listr   c              ‹   óD  K  — d }	 | j                   �%| j                   j                  ||¬«      ƒ d {  –—† }| j                  �)|du r%| j                  j                  ||¬«      ƒ d {  –—† }|S 7 Œ;7 Œ# t        $ r"}t	        j
                  d|«       |cY d }~S d }~ww xY w­w)N)r”   rN   FzQRedis async_increment_cache_pipeline failed, falling back to in-memory result: %s)r/   Úasync_increment_pipeliner0   rF   r
   r’   )r   r”   rC   rN   r   rM   rH   s          r   Úasync_increment_cache_pipelinez(DualCache.async_increment_cache_pipeline�  s¿   è ø€ ð &*ˆð	Ø×#Ñ#Ð/Ø#×3Ñ3×LÑLØ#1Ø%5ð  Mó  ÷ �ð
 ×ÑÐ+°
¸eÑ0CØ#×/Ñ/×HÑHØ#1Ø%5ð  Ió  ÷ �ð
 ˆMðøðùô ò 	Ü×"Ñ"ØcØôð �Mûð	üsV   ‚B †,A2 ²A.³4A2 Á'A0Á(A2 Á-B Á.A2 Á0A2 Á2	BÁ;BÂBÂB ÂBÂB c              ‹   óL  K  — 	 | j                   �6| j                   j                  |||j                  dd«      ¬«      ƒ d{  –—† }| j                  �:|du r6| j                  j                  |||j                  dd«      ¬«      ƒ d{  –—† }y7 ŒK7 Œ# t        $ r}|‚d}~ww xY w­w)z˜
        Add value to a set

        Key - the key in cache

        Value - str - the value you want to add to the set

        Returns - None
        NrA   )rA   F)r/   Úasync_set_cache_saddrw   r0   rF   )r   r&   r'   rC   r   rk   rH   s          r   r™   zDualCache.async_set_cache_saddº  s°   è ø€ ð		Ø×#Ñ#Ð/Ø×.Ñ.×CÑCÀCÈÐTZ×T^ÑT^Ð_dÐfjÓTkÐCÓl×l�à×ÑÐ+°
¸eÑ0CØ×*Ñ*×?Ñ?ÀÀUÐPV×PZÑPZÐ[`ÐbfÓPgÐ?Óh×h�àð møð iùô ò 	ØˆGûð	üsM   ‚B$„=B ÁBÁAB ÂBÂB ÂB$ÂB ÂB Â	B!ÂBÂB!Â!B$c                 óž   — | j                   �| j                   j                  «        | j                  �| j                  j                  «        y y r   )r/   Úflush_cacher0   )r   s    r   r›   zDualCache.flush_cacheÏ  sC   € Ø×ÑÐ+Ø× Ñ ×,Ñ,Ô.Ø×ÑÐ'Ø×Ñ×(Ñ(Õ*ð (r    c                 ó¢   — | j                   �| j                   j                  |«       | j                  �| j                  j                  |«       yy©z-
        Delete a key from the cache
        N)r/   Údelete_cacher0   ©r   r&   s     r   rž   zDualCache.delete_cacheÕ  sI   € ð ×ÑÐ+Ø× Ñ ×-Ñ-¨cÔ2Ø×ÑÐ'Ø×Ñ×)Ñ)¨#Õ.ð (r    r&   c              ƒ   ó¾   K  — | j                   �| j                   j                  |«       | j                  �$| j                  j                  |«      ƒ d{  –—†  yy7 Œ­wr�   )r/   rž   r0   Úasync_delete_cacherŸ   s     r   r¡   zDualCache.async_delete_cacheÞ  sV   è ø€ ð ×ÑÐ+Ø× Ñ ×-Ñ-¨cÔ2Ø×ÑÐ'Ø×"Ñ"×5Ñ5°cÓ:×:Ñ:ð (Ø:ús   ‚AAÁAÁAc              ƒ   ó¾   K  — | j                   j                  |«      ƒ d{  –—† }|€/| j                  �#| j                  j                  |«      ƒ d{  –—† }|S 7 Œ77 Œ­w)zL
        Get the remaining TTL of a key in in-memory cache or redis
        N)r/   Úasync_get_ttlr0   )r   r&   rA   s      r   r£   zDualCache.async_get_ttlç  sX   è ø€ ð ×(Ñ(×6Ñ6°sÓ;×;ˆØˆ;˜4×+Ñ+Ð7Ø×(Ñ(×6Ñ6°sÓ;×;ˆCØˆ
ð <øà;ús!   ‚A¡A¢0AÁAÁAÁAr   )r   údict[str, object]r5   r¤   )F)NF)NFF)FN)&r(   r)   r*   Ú__doc__r   r   r   ÚfloatÚintr   r=   r?   rB   ÚboolrE   rK   r   rR   Úlistrn   rq   Ústrr   ÚtupleÚdictrz   r~   r`   rr   rŽ   r“   r—   r™   r›   rž   r¡   r£   r+   r,   s   @r   r.   r.   3   s#  ø„ ñð 15Ø)-Ø.2Ø*.Ø9=Ø2TñPà&¨Ñ-ðPð   $Ñ&ðPð  % t™|ð	Pð
 ! 4™<ðPð +0°$©,ðPð -0ðPð 
õPð,7°e¸d±lð 7ÐW\Ð_cÑWcó 7ð *.ð7ð +/ò	7à $Ñ&ð7ð ! 4™<ð	7ð
 
ó7ó&
ñ°ó ñ¨#ð ¸4ð ÐVYó ð0 )-Ø ñ	9ð  ™+ð9ð ó	9ðD )-Ø ñ	%àð%ð  ™+ð%ð ó	%ðH )-Ø ñ	9ð  ™+ð9ð ó	9ðB3àð3ð �3‰ið3ð �S‘	ð	3ð
 
ˆt�C‰y˜$˜s E¨D¡LÐ0Ñ1Ð1Ñ	2ó3ð8KÈDÐQTÐV[Ð^bÑVbÐQbÑLcð KÐhló Kð )-Ø ñ	39àð39ð  ™+ð39ð ó	39ñjW¸Dó WñW¸ð WÈ4ó Wð, )-Ø Ø!ñ(ð ð(ð  ™+ð	(ð
 ð(ð ð(ð 
�‰ó(ðZ !Ø(,ñ	àÐ>Ñ?ðð ðð  ™+ð	ð 
ˆe‰�tÑ	óñ:°Tð Àtð Ðbfó ò*+ò/ð;¨Có ;ð sð ¨s°T©z÷ r    r.   )!r¥   r\   r„   rS   Úconcurrent.futuresr   Ú	threadingr   Útypingr   r   r   Úlitellm.types.cachingr   r:   Úlitellm._loggingr	   r
   Úlitellm.constantsr   Ú
base_cacher   r/   r   r0   r   Úopentelemetry.tracer   Ú_SpanÚcollectionsr   r   r.   r[   r    r   ú<module>r·      sj   ðñó Û Û Ý 1Ý ß ,Ñ ,áÝEã ß :Ý @å !Ý *Ý #áÝ1à�3‰;�Dà€Då #ô	(˜[ô 	(ô{�	õ {r    