
    gR                     J    d Z ddlZddlZddlmZ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)ListOptional   )	BaseCachec                       e Zd Z	 	 ddee   dee   fdZd Zd Zd ZddZ	d	e
d
e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 Zd Zd Zdedee   fdZy)InMemoryCachemax_size_in_memorydefault_ttlc                 L    |xs d| _         |xs d| _        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
   
cache_dictttl_dict)selfr	   r
   s      T/var/www/openai/venv/lib/python3.12/site-packages/litellm/caching/in_memory_cache.py__init__zInMemoryCache.__init__   s3     %# 	 '-# !#     c                    t        | j                  j                               D ]_  }t        j                         | j                  |   kD  s(| j                  j                  |d       | j                  j                  |d       a 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   keystimer   popr   keys     r   evict_cachezInMemoryCache.evict_cache&   s_     **,-Cyy{T]]3//##C.!!#t, .r   c                 D   t        | j                        | j                  k\  r| j                          || j                  |<   d|v r-|d   (t	        j                         |d   z   | j
                  |<   y t	        j                         | j                  z   | j
                  |<   y )Nttl)lenr   r	   r   r   r   r
   r   r   valuekwargss       r   	set_cachezInMemoryCache.set_cache<   s    t4#:#::$F?ve}8!%ve}!<DMM#!%t/?/?!?DMM#r   c                 6   K    | j                   d||d| y w)Nr   r     r"   r   s       r   async_set_cachezInMemoryCache.async_set_cacheG   s     63e6v6s   Nc                 t   K   |D ]/  \  }}|| j                  |||       | j                  ||       1 y w)N)r   r    r   r$   r&   )r   
cache_listr   r!   	cache_keycache_values         r   async_set_cache_pipelinez&InMemoryCache.async_set_cache_pipelineJ   s<     &0"I{9KSI9K@	 '1s   68r    r   c                    K   | j                  |      xs
 t               }|D ]  }|j                  |        | j                  |||       |S w)z"
        Add value to set
        r   )r   )	get_cachesetaddr"   )r   r   r    r   
init_valuevals         r   async_set_cache_saddz"InMemoryCache.async_set_cache_saddQ   sL     
 ^^^,5
CNN3 sJC0s   AAc                 0   || j                   v rv|| j                  v rAt        j                         | j                  |   kD  r| j                   j                  |d        y | j                   |   }	 t	        j
                  |      }|S y # t        $ r |}Y |S w xY wN)r   r   r   r   jsonloads	Exception)r   r   r!   original_cached_responsecached_responses        r   r/   zInMemoryCache.get_cache\   s    $//!dmm#99;s!33OO''T2'+s';$;"&**-E"F #"  ;":"";s   .B BBr   c                 b    g }|D ]'  } | j                   dd|i|}|j                  |       ) |S Nr   r%   r/   appendr   r   r!   
return_valkr3   s         r   batch_get_cachezInMemoryCache.batch_get_cachej   s?    
A $..1Q1&1Cc"  r   returnc                 d    | j                  |      xs d}||z   } | j                  ||fi | |S Nr.   r   )r/   r"   r   r   r    r!   r2   s        r   increment_cachezInMemoryCache.increment_cacheq   s;    ^^^,1
U"sE,V,r   c                 2   K    | j                   dd|i|S wr=   )r/   )r   r   r!   s      r   async_get_cachezInMemoryCache.async_get_cachex   s     t~~0#000s   c                 j   K   g }|D ]'  } | j                   dd|i|}|j                  |       ) |S wr=   r>   r@   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rF   )rJ   r'   rG   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c                 l    | j                   j                          | j                  j                          y r6   )r   clearr   r   s    r   flush_cachezInMemoryCache.flush_cache   s"    r   c                    K   y wr6   r%   rQ   s    r   
disconnectzInMemoryCache.disconnect   s	     s   c                 t    | j                   j                  |d        | j                  j                  |d        y r6   )r   r   r   r   s     r   delete_cachezInMemoryCache.delete_cache   s*    C&#t$r   r   c                 B   K   | j                   j                  |d      S w)zC
        Get the remaining TTL of a key in in-memory cache
        N)r   getr   s     r   async_get_ttlzInMemoryCache.async_get_ttl   s      }}  d++s   )r   r   r6   )__name__
__module____qualname__r   intr   r   r"   r'   r,   r   floatr4   r/   r   rC   rH   rJ   rL   rN   rR   rT   rV   strrY   r%   r   r   r   r      s     -0 !$SM! 
!&-,	@7A	T 	 	D # C 1  E %,s ,x} ,r   r   )	__doc__r7   r   typingr   r   
base_cacher   r   r%   r   r   <module>rc      s&      ! !G,I G,r   