Ë
    uPêj€(  ã                   óŽ   — d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	 er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y)z|
In-Memory Cache implementation

Has 4 methods:
    - set_cache
    - get_cache
    - async_set_cache
    - async_get_cache
é    N)ÚTYPE_CHECKINGÚAnyÚFinal)ÚRedisPipelineIncrementOperation)Ú	BaseModel)Ú'MAX_SIZE_PER_ITEM_IN_MEMORY_CACHE_IN_KBé   )Ú	BaseCachec                   óZ  — e Zd Z	 	 	 d$dedz  dedz  dedz  fd„Zdefd„Zded	efd
„Z	ded	dfd„Z
d„ Zded	efd„Zd„ Zd„ Zd%d„Zdededz  fd„Zded	efd„Zd„ Zdefd„Zded	efd„Zd„ Zdefd„Zded	efd„Zded   d	ee   dz  fd„Zd„ Zd„ Zd „ Zded	edz  fd!„Zd"ed	ee   fd#„Zy)&ÚInMemoryCacheÚmax_size_in_memoryNÚdefault_ttlÚmax_size_per_itemc                 óª   — |�|nd| _         |xs d| _        |xs t        | _        i | _        i | _        g | _        t        j                  «       | _	        y)z†
        max_size_in_memory [int]: Maximum number of items in cache. done to prevent memory leaks. Use 200 items as a default
        NéÈ   éX  )
r   r   r   r   Ú
cache_dictÚttl_dictÚexpiration_heapÚ	threadingÚLockÚ_increment_lock)Úselfr   r   r   s       úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/in_memory_cache.pyÚ__init__zInMemoryCache.__init__   s[   € ð #5Ð"@ÑÀcð 	Ôð 'Ò-¨#ˆÔØ!2Ò!]Ô6]ˆÔð !#ˆŒØ ˆŒØ8:ˆÔÜ(Ÿ~™~Ó/ˆÕó    Úvaluec                 óš  — 	 t        |t        t        t        t        f«      r)t        t	        |«      «      | j                  t        z  k  ryt        |t        «      r%t        j                  |«      dz  | j                  k  S t        |d«      r"|j                  «       dz  }|| j                  k  S t        |t        «      rt        |d«      r|j                  «       }nt        |d«      ryt        |t        t        f«      st        j                   |t        ¬«      }t        j                  |«      dz  | j                  k  S # t"        $ r Y yw xY w)z‡
        Check if value size exceeds max_size_per_item (1MB)
        Returns True if value size is acceptable, False otherwise
        Té   Ú
__sizeof__Ú
model_dumpÚ	isoformat)ÚdefaultF)Ú
isinstanceÚboolÚintÚfloatÚstrÚlenr   r   ÚbytesÚsysÚ	getsizeofÚhasattrr    r   r!   ÚjsonÚdumpsÚ	Exception)r   r   Úsizes      r   Úcheck_value_sizezInMemoryCache.check_value_size3   s  € ð
	ô ˜5¤4¬¬e´SÐ"9Ô:Üœ˜E›
“O d×&<Ñ&<Ô?fÑ&fÒfàô ˜%¤Ô'Ü—}‘} UÓ+¨dÑ2°d×6LÑ6LÑLÐLô �u˜lÔ+Ø#×.Ñ.Ó0°4Ñ7�Ø˜t×5Ñ5Ñ5Ð5ô ˜%¤Ô+´¸¸|Ô0LØ×(Ñ(Ó*‘Ü˜ Ô,Øô ˜e¤c¬5 \Ô2ÜŸ
™
 5´#Ô6�ä—=‘= Ó'¨$Ñ.°$×2HÑ2HÑHÐHøäò 	Ùð	ús+   ‚AD> Á4D> Â -D> Â.9D> Ã(AD> Ä>	E
Å	E
ÚkeyÚreturnc                 ój   — || j                   v xr$ t        j                  «       | j                   |   kD  S )z4
        Check if a specific key is expired
        )r   Útime©r   r3   s     r   Ú_is_key_expiredzInMemoryCache._is_key_expiredX   s,   € ð �d—m‘mÐ#ÒH¬¯	©	«°d·m±mÀCÑ6HÑ(HÐHr   c                 ót   — | j                   j                  |d«       | j                  j                  |d«       y)z@
        Remove a key from both cache_dict and ttl_dict
        N)r   Úpopr   r7   s     r   Ú_remove_keyzInMemoryCache._remove_key^   s,   € ð 	�‰×Ñ˜C Ô&Ø�‰×Ñ˜#˜tÕ$r   c                 óš  — t        j                   «       }| j                  r”| j                  d   \  }}|| j                  j                  |«      k7  r t	        j
                  | j                  «       n7||k  r1t	        j
                  | j                  «       | j                  |«       nn| j                  rŒ”t        | j                  «      | j                  k\  rut	        j
                  | j                  «      \  }}| j                  j                  |«      |k(  r| j                  |«       t        | j                  «      | j                  k\  rŒtyy)a  
        Eviction policy:
        1. First, remove expired items from ttl_dict and cache_dict
        2. If cache is still at or above max_size_in_memory, evict items with earliest expiration times


        This guarantees the following:
        - 1. When item ttl not set: At minimum each item will remain in memory for the default ttl
        - 2. When ttl is set: the item will remain in memory for at least that amount of time, unless cache size requires eviction
        - 3. the size of in-memory cache is bounded

        r   N)
r6   r   r   ÚgetÚheapqÚheappopr;   r)   r   r   )r   Úcurrent_timeÚexpiration_timer3   s       r   Úevict_cachezInMemoryCache.evict_cachee   s  € ô #Ÿi™i›kˆð ×"Ò"Ø#'×#7Ñ#7¸Ñ#:Ñ ˆO˜Sð  $§-¡-×"3Ñ"3°CÓ"8Ò8Ü—‘˜d×2Ñ2Õ3à  LÒ0Ü—‘˜d×2Ñ2Ô3Ø× Ñ  Õ%ð ð ×"Ó"ô �$—/‘/Ó" d×&=Ñ&=Ò=Ü#(§=¡=°×1EÑ1EÓ#FÑ ˆO˜Sà�}‰}× Ñ  Ó%¨Ò8Ø× Ñ  Ô%ô	 �$—/‘/Ó" d×&=Ñ&=Õ=r   c                 ó€   — | j                   j                  |«      }|� t        |«      t        j                  «       k  ryy)z/
        Check if ttl is set for a key
        TF)r   r=   r'   r6   )r   r3   Úttl_times      r   Úallow_ttl_overridez InMemoryCache.allow_ttl_override�   s5   € ð Ÿ-™-×+Ñ+¨CÓ0ˆØÐœu X›´·±³Ò<Øàr   c                 ó6  — | j                   dk(  ry | j                  «        | j                  |«      sy || j                  |<   | j	                  |«      rÇd|v re|d   �`t        j
                  «       t        |d   «      z   | j                  |<   t        j                  | j                  | j                  |   |f«       y t        j
                  «       | j                  z   | j                  |<   t        j                  | j                  | j                  |   |f«       y y )Nr   Úttl)r   rB   r2   r   rE   r6   r'   r   r>   Úheappushr   r   ©r   r3   r   Úkwargss       r   Ú	set_cachezInMemoryCache.set_cache™   sè   € à×"Ñ" aÒ'Øð
 	×ÑÔØ×$Ñ$ UÔ+Øà$ˆ�‰˜ÑØ×"Ñ" 3Ô'Ø˜‰ 6¨%¡=Ð#<Ü%)§Y¡Y£[´5¸À¹Ó3GÑ%G�—‘˜cÑ"Ü—‘˜t×3Ñ3°d·m±mÀCÑ6HÈ#Ð5NÕOä%)§Y¡Y£[°4×3CÑ3CÑ%C�—‘˜cÑ"Ü—‘˜t×3Ñ3°d·m±mÀCÑ6HÈ#Ð5NÕOð (r   c              ‹   ó6   K  —  | j                   d||dœ|¤Ž y ­w©N©r3   r   © ©rK   rI   s       r   Úasync_set_cachezInMemoryCache.async_set_cache®   s   è ø€ Øˆ�‰Ð6˜3 eÑ6¨vÓ6ùs   ‚c              ‹   ót   K  — |D ]/  \  }}|�| j                  |||¬«       Œ| j                  ||¬«       Œ1 y ­w)N)r3   r   rG   rN   rP   )r   Ú
cache_listrG   rJ   Ú	cache_keyÚcache_values         r   Úasync_set_cache_pipelinez&InMemoryCache.async_set_cache_pipeline±   sC   è ø€ Ø&0ò 	AÑ"ˆI�{ØˆØ—‘ 9°KÀS�ÕIà—‘ 9°K�Õ@ñ		Aùs   ‚68rG   c              ƒ   ó¢   K  — | j                  |¬«      xs
 t        «       }|D ]  }|j                  |«       Œ | j                  |||¬«       |S ­w)z"
        Add value to set
        ©r3   )rG   )Ú	get_cacheÚsetÚaddrK   )r   r3   r   rG   Ú
init_valueÚvals         r   Úasync_set_cache_saddz"InMemoryCache.async_set_cache_sadd¸   sQ   è ø€ ð
 !ŸN™N¨s˜NÓ3Ò<´s³uˆ
Øò 	 ˆCØ�N‰N˜3Õð	 à�‰�s˜J¨CˆÔ0Øˆùs   ‚AAc                 óJ   — | j                  |«      r| j                  |«       yy)zˆ
        Returns True if the element is expired and removed from the cache

        Returns False if the element is not expired
        TF)r8   r;   r7   s     r   Úevict_element_if_expiredz&InMemoryCache.evict_element_if_expiredÃ   s&   € ð ×Ñ Ô$Ø×Ñ˜SÔ!ØØr   c                 ó¶   — || j                   v r9| j                  |«      ry | j                   |   }	 t        j                  |«      }|S y # t        $ r |}Y |S w xY w©N)r   r`   r.   Úloadsr0   )r   r3   rJ   Úoriginal_cached_responseÚcached_responses        r   rY   zInMemoryCache.get_cacheÎ   si   € Ø�$—/‘/Ñ!Ø×,Ñ,¨SÔ1ØØ.2¯o©o¸cÑ.BÐ$ð;Ü"&§*¡*Ð-EÓ"F�ð #Ð"Øøô ò ;Ø":‘Ø"Ð"ð;ús   ±A	 Á	AÁAÚkeysc                 ób   — g }|D ]'  } | j                   dd|i|¤Ž}|j                  |«       Œ) |S ©Nr3   rO   ©rY   Úappend©r   rf   rJ   Ú
return_valÚkr]   s         r   Úbatch_get_cachezInMemoryCache.batch_get_cacheÚ   sD   € Øˆ
Øò 	#ˆAØ �$—.‘.Ñ1 QÐ1¨&Ñ1ˆCØ×Ñ˜cÕ"ð	#ð Ðr   c                 ó¨   — | j                   5  | j                  |¬«      xs d}||z   } | j                  ||fi |¤Ž |cd d d «       S # 1 sw Y   y xY w)NrX   r   )r   rY   rK   )r   r3   r   rJ   r\   s        r   Úincrement_cachezInMemoryCache.increment_cacheá   sW   € Ø×!Ñ!ñ 	à $§¡°3 Ó 7Ò <¸1ˆJØ Ñ&ˆEØˆD�N‰N˜3 Ñ0¨Ò0Ø÷	÷ 	ò 	ús   �1AÁAc              ‹   ó2   K  —  | j                   dd|i|¤ŽS ­wrh   )rY   )r   r3   rJ   s      r   Úasync_get_cachezInMemoryCache.async_get_cacheé   s   è ø€ Øˆt�~‰~Ñ0 #Ð0¨Ñ0Ð0ùs   ‚c              ‹   ój   K  — g }|D ]'  } | j                   dd|i|¤Ž}|j                  |«       Œ) |S ­wrh   ri   rk   s         r   Úasync_batch_get_cachez#InMemoryCache.async_batch_get_cacheì   sH   è ø€ Øˆ
Øò 	#ˆAØ �$—.‘.Ñ1 QÐ1¨&Ñ1ˆCØ×Ñ˜cÕ"ð	#ð Ðùs   ‚13c              ‹   ó4   K  —  | j                   d||dœ|¤ŽS ­wrM   )rp   rI   s       r   Úasync_incrementzInMemoryCache.async_incrementó   s#   è ø€ Ø#ˆt×#Ñ#ÐC¨°5ÑC¸FÑCÐCùs   ‚Úincrement_listr   c              ‹   óŠ   K  — g }|D ]5  } | j                   |d   |d   fi |¤Žƒ d {  –—† }|j                  |«       Œ7 |S 7 Œ­w)Nr3   Úincrement_value)rv   rj   )r   rw   rJ   ÚresultsÚ	incrementÚresults         r   Úasync_increment_pipelinez&InMemoryCache.async_increment_pipelineö   s]   è ø€ ð ˆØ'ò 	#ˆIØ/˜4×/Ñ/°	¸%Ñ0@À)ÐL]ÑB^ÑiÐbhÑi×iˆFØ�N‰N˜6Õ"ð	#ð ˆð jús   ‚%A§A¨Ac                 ó    — | j                   j                  «        | j                  j                  «        | j                  j                  «        y rb   )r   Úclearr   r   ©r   s    r   Úflush_cachezInMemoryCache.flush_cacheÿ   s4   € Ø�‰×ÑÔØ�‰×ÑÔØ×Ñ×"Ñ"Õ$r   c              ƒ   ó   K  — y ­wrb   rO   r€   s    r   Ú
disconnectzInMemoryCache.disconnect  s	   è ø€ Øùs   ‚c                 ó&   — | j                  |«       y rb   )r;   r7   s     r   Údelete_cachezInMemoryCache.delete_cache  s   € Ø×Ñ˜Õr   c              ƒ   óB   K  — | j                   j                  |d«      S ­w)zC
        Get the remaining TTL of a key in in-memory cache
        N)r   r=   r7   s     r   Úasync_get_ttlzInMemoryCache.async_get_ttl
  s   è ø€ ð �}‰}× Ñ   dÓ+Ð+ùs   ‚Únc              ƒ   ó’   K  — t        | j                  j                  «       d„ ¬«      }|d| D ��cg c]  \  }}|‘Œ	 c}}S c c}}w ­w)z4
        Get the oldest n keys in the cache
        c                 ó   — | d   S )Nr	   rO   )Úxs    r   ú<lambda>z7InMemoryCache.async_get_oldest_n_keys.<locals>.<lambda>  s
   € ÈQÈqÉT€ r   rX   N)Úsortedr   Úitems)r   rˆ   Úsorted_ttl_dictr3   Ú_s        r   Úasync_get_oldest_n_keysz%InMemoryCache.async_get_oldest_n_keys  s@   è ø€ ô
 "(¨¯©×(;Ñ(;Ó(=Á>Ô!RˆØ"1°"°1Ð"5×6™˜˜Q’Ó6Ð6ùÓ6ùs   ‚/A±A½
A)r   r   r   rb   ) Ú__name__Ú
__module__Ú__qualname__r&   r   r   r2   r(   r%   r8   r;   rB   rE   rK   rQ   rV   Úlistr'   r^   r`   rY   rn   rp   rr   rt   rv   r}   r�   rƒ   r…   r‡   r‘   rO   r   r   r   r      st  „ ð *-àØ(,ñ0à $™Jð0ð Ø
ñð0ð
  ™:ó0ð,# có #ðJI 3ð I¨4ó Ið%˜sð % tó %ò#&ðT cð ¨dó òPò*7óAð	°Tð 	ÀÈÁó 	ð	¨Cð 	°Dó 	ò
ð Dó ð¨%ð ¸eó ò1ð°ó ðD°ð DÀEó DðØ"Ð#DÑEðà	ˆe‰�tÑ	óò%ò
òð, sð ,¨s°T©zó ,ð7¨sð 7°t¸C±yô 7r   r   )Ú__doc__r>   r.   r+   r   r6   Útypingr   r   r   Úlitellm.types.cachingr   Úpydanticr   Úlitellm.constantsr   Ú
base_cacher
   r   rO   r   r   ú<module>rœ      s>   ðñó Û Û 
Û Û ß ,Ñ ,áÝEå å Eå !ôz7�Iõ z7r   