
    h3#                         d Z ddlZddlZddlZddlmZ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ListOptional)RedisPipelineIncrementOperation)	BaseModel)'MAX_SIZE_PER_ITEM_IN_MEMORY_CACHE_IN_KB   )	BaseCachec                   Z   e Zd Z	 	 	 d$dee   dee   dee   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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 ZdefdZdedefdZded   deee      fdZd Zd Zd  Zdedee   fd!Z d"edee   fd#Z!y
)&InMemoryCachemax_size_in_memorydefault_ttlmax_size_per_itemc                 j    |xs d| _         |xs d| _        |xs t        | _        i | _        i | _        y)z
        max_size_in_memory [int]: Maximum number of items in cache. done to prevent memory leaks. Use 200 items as a default
           X  N)r   r   r	   r   
cache_dictttl_dict)selfr   r   r   s       [/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/caching/in_memory_cache.py__init__zInMemoryCache.__init__   sD     %# 	 '-#H!H 	
 !#     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_size2   s"   
!	 54eS"9:E
O((+RRS  %'}}U+d2d6L6LLL ul+'')D0t5555 %+|1 ((*, ec5\2

5#6=='$.$2H2H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   r0   s     r   _is_key_expiredzInMemoryCache._is_key_expiredZ   s,     dmm#H		dmmC6H(HHr   Nc                 t    | j                   j                  |d       | j                  j                  |d       y)z@
        Remove a key from both cache_dict and ttl_dict
        N)r   popr   r4   s     r   _remove_keyzInMemoryCache._remove_key`   s,     	C&#t$r   c                     t        | j                  j                               D ]%  }| j                  |      s| j	                  |       ' y)a  
        Eviction policy:
        - check if any items in ttl_dict are expired -> remove them from ttl_dict and cache_dict


        This guarantees the following:
        - 1. When item ttl not set: At minimumm each item will remain in memory for 5 minutes
        - 2. When ttl is set: the item will remain in memory for at least that amount of time
        - 3. the size of in-memory cache is bounded

        N)listr   keysr5   r8   r4   s     r   evict_cachezInMemoryCache.evict_cacheg   s<     **,-C##C(  % .r   c                     | j                   j                  |      }|yt        |      t        j                         k  ryy)z/
        Check if ttl is set for a key
        TF)r   getr$   r3   )r   r0   ttl_times      r   allow_ttl_overridez InMemoryCache.allow_ttl_override|   s9     ==$$S)8_tyy{*r   c                    t        | j                        | j                  k\  r| j                          | j	                  |      sy || j                  |<   | j                  |      rid|v r6|d   1t        j                         t        |d         z   | j                  |<   y t        j                         | j                  z   | j                  |<   y y )Nttl)
r&   r   r   r<   r/   r@   r3   r$   r   r   r   r0   r   kwargss       r   	set_cachezInMemoryCache.set_cache   s    t4#:#::$$U+$""3'6%=#<%)YY[53G%Gc"%)YY[43C3C%Cc"	 (r   c                 6   K    | j                   d||d| y w)Nr0   r    rE   rC   s       r   async_set_cachezInMemoryCache.async_set_cache   s     63e6v6s   c                 t   K   |D ]/  \  }}|| j                  |||       | j                  ||       1 y w)N)r0   r   rB   rG   rI   )r   
cache_listrB   rD   	cache_keycache_values         r   async_set_cache_pipelinez&InMemoryCache.async_set_cache_pipeline   s<     &0"I{9KSI9K@	 '1s   68rB   c                    K   | j                  |      xs
 t               }|D ]  }|j                  |        | j                  |||       |S w)z"
        Add value to set
        r0   )rB   )	get_cachesetaddrE   )r   r0   r   rB   
init_valuevals         r   async_set_cache_saddz"InMemoryCache.async_set_cache_sadd   sL     
 ^^^,5
CNN3 sJC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)r5   r8   r4   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   rY   r+   loadsr-   )r   r0   rD   original_cached_responsecached_responses        r   rR   zInMemoryCache.get_cache   si    $//!,,S1'+s';$;"&**-E"F #"  ;":"";s   A	 	AAr;   c                 b    g }|D ]'  } | j                   dd|i|}|j                  |       ) |S Nr0   rH   rR   appendr   r;   rD   
return_valkrV   s         r   batch_get_cachezInMemoryCache.batch_get_cache   s?    
A $..1Q1&1Cc"  r   c                 d    | j                  |      xs d}||z   } | j                  ||fi | |S NrQ   r   )rR   rE   r   r0   r   rD   rU   s        r   increment_cachezInMemoryCache.increment_cache   s;    ^^^,1
U"sE,V,r   c                 2   K    | j                   dd|i|S wr`   )rR   )r   r0   rD   s      r   async_get_cachezInMemoryCache.async_get_cache   s     t~~0#000s   c                 j   K   g }|D ]'  } | j                   dd|i|}|j                  |       ) |S wr`   ra   rc   s         r   async_batch_get_cachez#InMemoryCache.async_batch_get_cache   sC     
A $..1Q1&1Cc"  s   13c                    K   | j                  |       d {   xs d}||z   } | j                  ||fi | d {    |S 7 +7 wrh   )rl   rJ   ri   s        r   async_incrementzInMemoryCache.async_increment   sV     //C/88=A
U""d""38888 98s   AA$AAAAincrement_listr   c                    K   g }|D ]5  } | j                   |d   |d   fi | d {   }|j                  |       7 |S 7 w)Nr0   increment_value)rp   rb   )r   rq   rD   results	incrementresults         r   async_increment_pipelinez&InMemoryCache.async_increment_pipeline   s`      'I/4//% ),=">BH F NN6"	 (
 	s   %AAAc                 l    | j                   j                          | j                  j                          y r[   )r   clearr   r   s    r   flush_cachezInMemoryCache.flush_cache   s"    r   c                    K   y wr[   rH   rz   s    r   
disconnectzInMemoryCache.disconnect   s	     s   c                 &    | j                  |       y r[   )r8   r4   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>   r4   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
   rH   )xs    r   <lambda>z7InMemoryCache.async_get_oldest_n_keys.<locals>.<lambda>  s    adr   rQ   N)sortedr   items)r   r   sorted_ttl_dictr0   _s        r   async_get_oldest_n_keysz%InMemoryCache.async_get_oldest_n_keys   s@     
 !!4!4!6NK"1"1"56Q666s   /AA
A)r   r   r   r[   )"__name__
__module____qualname__r   r#   r   r   r/   r%   r"   r5   r8   r<   r@   rE   rJ   rO   r   r$   rW   rY   rR   r:   rf   rj   rl   rn   rp   rw   r{   r}   r   r   r   rH   r   r   r   r      sr    -0 +/!$SM! 
! $C=!.&c &PI3 I4 I%s %t %&*
c 
d 
D7A	T 	 		C 	D 	
D # C 1  E 	"#DE		$u+		,s ,x} ,7s 7tCy 7r   r   )__doc__r+   r(   r3   typingr   r   r   r   litellm.types.cachingr   pydanticr   litellm.constantsr	   
base_cacher   r   rH   r   r   <module>r      s8     
  5 5E  E !h7I h7r   