
    g[                         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 ddlm	Z	m
Z
mZmZ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 ddlmZ ddlm Z  e Z!eZ"eZne
Z!e
Z"e
Z G d de      Z#y)z
Redis Cache implementation

Has 4 primary methods:
    - set_cache
    - get_cache
    - async_set_cache
    - async_get_cache
    N)	timedelta)TYPE_CHECKINGAnyListOptionalTuple)print_verboseverbose_logger)!_get_parent_otel_span_from_kwargs)RedisPipelineIncrementOperation)ServiceTypes   )	BaseCache)SpanRedis)Pipelinec            
           e Zd Z	 	 	 	 	 	 d2dee   dee   dee   f fdZd Zdedefd	Z	d
 Z
	 d3dedee   defdZd4dededefdZd Zdedeeeef      dee   defdZ	 d3deeeef      dee   fdZdedededee   ddf
dZdedee   fdZd Z	 	 d5dedee   dee   defdZd ZdefdZd3dee   fdZdee   defd Z	 d3dee   fd!Z 	 d3d"ee   dee   defd#Z!de"fd$Z#de"fd%Z$d& Z%defd'Z&d( Z'd) Z(d* Z)d+ Z*defd,Z+d- Z,ded.ee-   deee      fd/Z.d.ee-   deee      fd0Z/dedee   fd1Z0 xZ1S )6
RedisCacheNredis_flush_size	namespacestartup_nodesc                    ddl m} ddlm}	m}
 i }|||d<   |||d<   |||d<   |||d<   |j                  d	d       &t        |d	   |      r|j                  d	      | _        n |       | _        |j                  |        |	di || _
        || _         |
di || _        || _        g | _        |d
| _        n|| _        d| _        	 t#        j$                  | j                        s"| j                  j'                         d   | _        	 t+        j,                         j/                  | j1                               }	 t=        | j                  d      r| j                  j1                          t>        j@                  (tB        |   tG        t>        j@                               y tB        |           y # t(        $ r Y w xY w# t(        $ rg}dt3        |      v rt5        j6                  d       n:t5        j8                  dj;                  t3        |            dt3        |      i       Y d }~d }~ww xY w# t(        $ r,}t5        j8                  ddt3        |      i       Y d }~d }~ww xY w)Nr   )ServiceLogging   )get_redis_clientget_redis_connection_poolhostportpasswordr   service_logger_objd   Unknownredis_versionzno running event loopz1Ignoring async redis ping. No running event loop.z+Error connecting to Async Redis client - {}error)extrapingz%Error connecting to Sync Redis client)default_ttl )$litellm._service_loggerr   _redisr   r   get
isinstancepopr!   updateredis_clientredis_kwargsasync_redis_conn_poolr   redis_batch_writing_bufferr   r$   inspectiscoroutinefunctioninfo	Exceptionasyncioget_running_loopcreate_taskr'   strr
   debugr%   formathasattrlitellmdefault_redis_ttlsuper__init__int)selfr   r   r    r   r   r   kwargsr   r   r   r1   _e	__class__s                 P/var/www/openai/venv/lib/python3.12/site-packages/litellm/caching/redis_cache.pyrB   zRedisCache.__init__,   sP    	;H#'L #'L '/L$$,9L)::*D1=*'(.C
 '-jj1E&FD#&4&6D#F#,<|<(%>%N%N" #02'#),D!$4D!&	..t/@/@A%)%6%6%;%;%=o%N"
	((*66tyy{CA	t((&1!!&&( $$0GW-F-F)GHG=  		  		&#a&0$$G $$AHHQP"CF+		  	  7Q?P 	sD   AF6 1G ?0H8 6	GG	H5AH00H58	I-"I((I-c                 J    ddl m}  |dd| j                  i| j                  S )Nr   )get_redis_async_clientconnection_poolr)   )r+   rK   r2   r1   )rD   rK   s     rI   init_async_clientzRedisCache.init_async_client}   s.    3% 
 66
:>:K:K
 	
    keyreturnc                 x    | j                   -|j                  | j                         s| j                   dz   |z   }|S )zD
        Make sure each key starts with the given namespace
        :)r   
startswithrD   rO   s     rI   check_and_fix_namespacez"RedisCache.check_and_fix_namespace   s5     >>%cnnT^^.L..3&,C
rN   c           
          | j                   d
i |}t        d| d| d| d| j                          | j                  |      }	 t	        j                         }| j
                  j                  |t        |      |       t	        j                         }||z
  }| j                  j                  t        j                  |d||       y # t        $ r!}t        d	t        |              Y d }~y d }~ww xY w)NzSet Redis Cache: key: 
Value 
ttl=, redis_version=rO   namevalueex	set_cacheserviceduration	call_type
start_timeend_timez<litellm.caching.caching: set() - Got exception from REDIS : r)   )get_ttlr	   r$   rU   timer0   setr;   r!   service_success_hookr   REDISr7   )	rD   rO   r]   rE   ttlrd   re   	_durationrG   s	            rI   r_   zRedisCache.set_cache   s    dll$V$$SE%seCSTXTfTfSgh	
 **s*3	J!!s#e*!Eyy{H :-I##88$**"%%! 9   	NsSTvhW 	s   BC
 
	C4C//C4r]   rk   c                    | j                   }t        j                         }| j                  |      }	 t        j                         }|j                  ||      }t        j                         }	|	|z
  }
| j                  j                  t        j                  |
d||	       |t        j                         }|j                  |      }t        j                         }	|	|z
  }
| j                  j                  t        j                  |
d||	       |dk(  rmt        j                         }|j                  ||       t        j                         }	|	|z
  }
| j                  j                  t        j                  |
d||	       |S # t        $ r@}t        j                         }	|	|z
  }
t        j                  dt        |      |       |d }~ww xY w)	Nrk   r\   amountincrement_cacher`   increment_cache_ttlincrement_cache_expirezXLiteLLM Redis Caching: increment_cache() - Got exception from REDIS %s, Writing value=%s)r0   rg   rf   incrr!   ri   r   rj   rk   expirer7   r
   r%   r;   )rD   rO   r]   rk   rE   _redis_clientrd   set_ttlresultre   rl   current_ttlrG   s                rI   rq   zRedisCache.increment_cache   s    ))YY[
,,3,'1	J',,#e,DFyy{H :-I##88$**"+%! 9  "!YY[
+//499;$z1	''<<(..&3)% =  "$!%J!((g6#yy{H (: 5I++@@ , 2 2!*":#-!) A  M 		yy{H :-I  jA
 G		s   EF 	G;GGpatterncountc                   K   ddl m} t        j                         }	 g }| j                         }|4 d {   }|j	                  |dz   |      2 3 d {   }|j                  |       t        |      |k\  s) t        j                         }	|	|z
  }
t        j                  | j                  j                  t        j                  |
d||	             d d d       d {    |S 7 7 6 r7 # 1 d {  7  sw Y   |S xY w# t        $ rb}t        j                         }	|	|z
  }
t        j                  | j                  j                  t        j                  |
|d||	             |d }~ww xY ww)Nr   r   *)matchr|   async_scan_iterr`   )ra   rb   r%   rc   rd   re   )redis.asyncior   rg   rM   	scan_iterappendlenr8   r:   r!   async_service_success_hookr   rj   r7   async_service_failure_hook)rD   r{   r|   r   rd   keysrw   r0   rO   re   rl   rG   s               rI   r   zRedisCache.async_scan_iter   sg    'YY[
(	D#'#9#9#;M$}!-!7!7!C-u "8 " # KK$4yE)  99;$z1	##++FF , 2 2!*"3#-!) G  %}( K) % " %}}}( K 	 yy{H :-I''BB(..&/)% C 	 G	s   E3D C'D C/C+C)C+ C/:AC/D  C-!D &E3'D )C++C/-D /D5C86D=D E3D 	E0AE++E00E3c                 6  K   ddl m} t        j                         }	 | j                         }| j                  |      }|4 d {   }
 | j                   di |}t#        d| d| d	|        	 t%        |
d
      st	        d      |
j'                  |t)        j*                  |      |       d {    t#        d| d| d	|        t        j                         }||z
  }	t        j                  | j                  j-                  t        j                  |	d||t        |      d|i             d d d       d {    y # t        $ r}t        j                         }||z
  }	t        j                  | j                  j                  t        j                  |	|||t        |      d             t        j                  dt        |      |       |d }~ww xY w7 7 ,# t        $ r}t        j                         }||z
  }	t        j                  | j                  j                  t        j                  |	|d||t        |      d|i             t        j                  dt        |      |       Y d }~Fd }~ww xY w7 C# 1 d {  7  sw Y   y xY ww)Nr   r   async_set_cachera   rb   r%   rd   re   parent_otel_spanrc   RLiteLLM Redis Caching: async set() - Got exception from REDIS %s, Writing value=%srZ   Set ASYNC Redis Cache: key: rW   rX   rh   z3Redis client cannot set cache. Attribute not found.r[   z)Successfully Set ASYNC Redis Cache: key: rO   ra   rb   rc   rd   re   r   event_metadatara   rb   r%   rc   rd   re   r   r   r)   )r   r   rg   rM   r7   r8   r:   r!   r   r   rj   r   r
   r%   r;   rU   rf   r	   r>   rh   jsondumpsr   )rD   rO   r]   rE   r   rd   rw   rG   re   rl   r0   rk   s               rI   r   zRedisCache.async_set_cache  s    'YY[
	#'#9#9#;M. **s*3 =L$,,((C.se8E7&N*|U3#M  #&&Ctzz%7HS&QQQ?uHUGSYZ]Y^_  99;$z1	##++FF , 2 2!*"3#-!))J6)R(-s| G 
# !==/  	yy{H :-I''BB(..&)%%Fv%N/ C 
   dA
 G)	. ! R"  99;$z1	##++FF , 2 2!*"3#-!))J6)R(-s| G 	 $$hF !9 !===s   JE JGJ
'J2AG"3G4A?G"3J>J?J	GBGGJG""	I>+BI93J9I>>JJJ
JJJpipe
cache_listc           	      8  K   | j                  |      }|D ]d  \  }}| j                  |      }t        d| d| d|        t        j                  |      }d }|t        |      }|j                  |||       f |j                          d {   }|S 7 w)Nrn   rZ   z%Set ASYNC Redis Cache PIPELINE: key: rW   rX   seconds)r^   )rf   rU   r	   r   r   r   rh   execute)	rD   r   r   rk   	cache_keycache_valuejson_cache_value_tdresultss	            rI   _pipeline_helperzRedisCache._pipeline_helper[  s      llsl#&0"I{444CI7	{(;-W]^a]bc  $zz+6'+C,HHY 0SH9 '1 & 's   BBBBc                   K   t        |      dk(  ryddlm} | j                         }t	        j                         }t        d| d| d| j                          d}	 |4 d{   }|j                  d      4 d{   }	| j                  |	||       d{   }
ddd      d{    ddd      d{    t        d	
        t	        j                         }||z
  }t        j                  | j                  j                  t        j                  |d
||t        |                   y7 7 7 7 # 1 d{  7  sw Y   xY w7 # 1 d{  7  sw Y   xY w# t         $ r}t	        j                         }||z
  }t        j                  | j                  j#                  t        j                  ||d
||t        |                   t%        j&                  dt)        |      |       Y d}~yd}~ww xY ww)z?
        Use Redis Pipelines for bulk write operations
        r   Nr   z!Set Async Redis Cache: key list: rX   rY   Ttransactionzpipeline results: async_set_cache_pipelinera   rb   rc   rd   re   r   ra   rb   r%   rc   rd   re   r   zaLiteLLM Redis Caching: async set_cache_pipeline() - Got exception from REDIS %s, Writing value=%s)r   r   r   rM   rg   r	   r$   pipeliner   r8   r:   r!   r   r   rj   r   r7   r   r
   r%   r;   )rD   r   rk   rE   r   rw   rd   r   r0   r   r   re   rl   rG   s                 rI   r   z#RedisCache.async_set_cache_pipelineo  s     z?a'#557YY[
/
|6#FVW[WiWiVjk	
  )	$}'00T0BBd$($9$9$
C$PPG CB %} .wi89 yy{H :-I''BB(..&8)%%Fv%N C 	 ' %BP CBBB %}}}(  	yy{H :-I''BB(..&8)%%Fv%N C 
   sA !	s   AH E% #D1$E% 'E>D3?ED9D5D9E)D7*E.E% 9E:A6E% 0H 1E% 3E5D97E9E	?E E	EE% E"EE"E% %	G=.BG83H 8G==H r0   c                    K   | j                  |      }	  |j                  |g|  d{    |'t        |      }|j                  ||       d{    yy7 .7 # t        $ r  w xY ww)z@Helper function for async_set_cache_sadd. Separated for testing.rn   Nr   )rf   saddr   rv   r7   )rD   r0   rO   r]   rk   r   s         rI   _set_cache_sadd_helperz!RedisCache._set_cache_sadd_helper  s~      llsl#	#,##C0%000,"))#s333  1 4 		s>   A-A A'A AA A-A A A**A-c                   K   ddl m} t        j                         }	 | j                         }| j                  |      }|4 d {   }t!        d| d| d	|        	 | j#                  ||||
       d {    t!        d| d| d	|        t        j                         }	|	|z
  }
t        j                  | j                  j%                  t        j                  |
d||	t        |                   d d d       d {    y # t        $ r}t        j                         }	|	|z
  }
t        j                  | j                  j                  t        j                  |
|||	t        |      d             t        j                  dt        |      |       |d }~ww xY w7 X7 )# t        $ r}t        j                         }	|	|z
  }
t        j                  | j                  j                  t        j                  |
|d||	t        |                   t        j                  dt        |      |       Y d }~Cd }~ww xY w7 @# 1 d {  7  sw Y   y xY ww)Nr   r   async_set_cache_saddr   r   rZ   r   rW   rX   )r0   rO   r]   rk   z.Successfully Set ASYNC Redis Cache SADD: key: r   r   z]LiteLLM Redis Caching: async set_cache_sadd() - Got exception from REDIS %s, Writing value=%s)r   r   rg   rM   r7   r8   r:   r!   r   r   rj   r   r
   r%   r;   rU   r	   r   r   )rD   rO   r]   rk   rE   r   rd   rw   rG   re   rl   r0   s               rI   r   zRedisCache.async_set_cache_sadd  sS     	(YY[
	#'#9#9#;M. **s*3 =L.se8E7&N&11!-3e 2    DSERWQXX^_b^cd  99;$z1	##++FF , 2 2!*"8#-!))J6)R G 	 !==/  	yy{H :-I''BB(..&)%%Fv%N4 C 
   dA
 G)	. !
$  99;$z1	##++FF , 2 2!*"8#-!))J6)R G 
 $$sF / !===s   ID IFI
I F$8F!9A<F$5I I I	FBFFI!F$$	H=-BH82I8H==I II	I
IIc                 &  K   t        dt        | j                                | j                  |      }| j                  j	                  ||f       t        | j                        | j
                  k\  r| j                          d {    y y 7 w)Nz-in batch cache writing for redis buffer size=rZ   )r	   r   r3   rU   r   r   flush_cache_buffer)rD   rO   r]   rE   s       rI   batch_cache_writezRedisCache.batch_cache_write  s     ;C@_@_<`;ab	
 **s*3''..U|<t../43H3HH))+++ I+s   BBB	Br   c                 |  K   ddl m} | j                         }t        j                         }| j	                  |      }	 |4 d {   }	|	j                  ||       d {   }
|8|	j                  |       d {   }|dk(  r|	j                  ||       d {    t        j                         }||z
  }t        j                  | j                  j                  t        j                  |d|||             |
cd d d       d {    S 7 7 7 7 x7 # 1 d {  7  sw Y   y xY w# t        $ r}t        j                         }||z
  }t        j                  | j                  j                  t        j                  ||d|||             t!        j"                  d	t%        |      |       |d }~ww xY ww)
Nr   r   rn   ro   rs   async_incrementr   r   z^LiteLLM Redis Caching: async async_increment() - Got exception from REDIS %s, Writing value=%s)r   r   rM   rg   rf   incrbyfloatrk   rv   r8   r:   r!   r   r   rj   r7   r   r
   r%   r;   )rD   rO   r]   rk   r   r   rw   rd   	_used_ttlr0   ry   rz   re   rl   rG   s                  rI   r   zRedisCache.async_increment  s     	(#557YY[
LLSL)	-	$}+77S7OO((4(8(8(="=K"b(*11#yAAA  99;$z1	##++FF , 2 2!*"3#-!))9 G 	 / %}}O #> B %}}}0  	yy{H :-I''BB(..&/)%%5 C 
   pA
 G)	s   =F< D- DD- 
D!D"D<D=DDA D<D- D	D- F<D- DDDD- D*D!D*&D- )F<*D- -	F96A>F44F99F<c                    K   t        dt        | j                                | j                  | j                         d {    g | _        y 7 w)Nz,flushing to redis....reached size of buffer )r	   r   r3   r   rD   s    rI   r   zRedisCache.flush_cache_bufferL  sN     :3t?^?^;_:`a	
 ++D,K,KLLL*,' 	Ms   A AAAcached_responsec                     ||S |j                  d      }	 t        j                  |      }|S # t        $ r t	        j
                  |      }Y |S w xY w)z[
        Common 'get_cache_logic' across sync + async redis client implementations
        utf-8)decoder   loadsr7   astliteral_eval)rD   r   s     rI   _get_cache_logiczRedisCache._get_cache_logicS  sh     """)009	@"jjO
   	@!..?O	@s   . AAc                    	 | j                  |      }t        d|        t        j                         }| j                  j	                  |      }t        j                         }||z
  }| j
                  j                  t        j                  |d|||       t        d| d|        | j                  |      S # t        $ r }t        j                  d|       Y d }~y d }~ww xY w)	NrZ   zGet Redis Cache: key: 	get_cacher   zGot Redis Cache: key: , cached_response r   z;litellm.caching.caching: get() - Got exception from REDIS: )rU   r	   rg   r0   r,   r!   ri   r   rj   r   r7   r
   r%   )	rD   rO   r   rE   rd   r   re   rl   rG   s	            rI   r   zRedisCache.get_cachec  s    	..3.7C23%89J"//33C8Oyy{H :-I##88$**"%%!!1 9  (-??PQ (((II 	  Mq 	s   B9B< <	C%C  C%c                 j   i }	 g }|D ]%  }| j                  |      }|j                  |       ' t        j                         }| j                  j	                  |      }t        j                         }||z
  }	| j
                  j                  t        j                  |	d|||       t        t        ||            }|j                         D 
ci c]&  \  }
}|
j                  d      | j                  |      ( }}
}|S c c}}
w # t        $ r#}t        dt!        |              |cY d}~S d}~ww xY w)4
        Use Redis for bulk read operations
        rZ   r   batch_get_cacher   r   "Error occurred in pipeline read - N)rU   r   rg   r0   mgetr!   ri   r   rj   dictzipitemsr   r   r7   r	   r;   )rD   key_listr   key_value_dict_keysr   rd   r   re   rl   kvdecoded_resultsrG   s                 rI   r   zRedisCache.batch_get_cache}  s<    	"E%	 88Y8G	Y' & J --222>Gyy{H :-I##88$**"+%!!1 9  "#h"89N +0022DAq !4#8#8#;;2  
 #"  	">s1vhGH!!	"s0   CD +D ;D  D 	D2D-'D2-D2c                   K   ddl m} | j                         }| j                  |      }t	        j                         }|4 d {   }	 t        d|        |j                  |       d {   }t        d| d|        | j                  |      }	t	        j                         }
|
|z
  }t        j                  | j                  j                  t        j                  |d||
|d	|i
             |	cd d d       d {    S 7 7 7 	# t        $ r}t	        j                         }
|
|z
  }t        j                  | j                  j                  t        j                  ||d||
|d	|i             t        dt!        |              Y d }~nd }~ww xY wd d d       d {  7   y # 1 d {  7  sw Y   y xY ww)Nr   r   rZ   zGet Async Redis Cache: key: zGot Async Redis Cache: key: r   r   async_get_cacherO   r   r   zAlitellm.caching.caching: async get() - Got exception from REDIS: )r   r   rM   rU   rg   r	   r,   r   r8   r:   r!   r   r   rj   r7   r   r;   )rD   rO   r   rE   r   rw   rd   r0   r   responsere   rl   rG   s                rI   r   zRedisCache.async_get_cache  s     	(#557**s*3YY[
 =L) <SEBC(4(8(8(="=23%7I/IZ[  000Q99;$z1	##++FF , 2 2!*"3#-!))9(-s| G 
  - !== #> !.  99;$z1	##++FF , 2 2!*"3#-!))9(-s| G 	 WX[\]X^W_` #/ !====s   AF?DF?	F*"D-D.BD4F? D
F?D
F?	FA6FF*FF*F?#F&$F?*F<0F31F<8F?r   c                   K   | j                          d{   }i }t        j                         }	 |4 d{   }g }|D ]%  }| j                  |      }|j                  |       ' |j	                  |       d{   }	ddd      d{    t        j                         }
|
|z
  }t        j                  | j                  j                  t        j                  |d||
|             t        t        |	            }i }|j                         D ]<  \  }}t        |t              r|j!                  d      }| j#                  |      }|||<   > |S 7 @7 !7 7 # 1 d{  7  sw Y   xY w# t$        $ r}t        j                         }
|
|z
  }t        j                  | j                  j'                  t        j                  ||d||
|             t)        dt+        |              |cY d}~S d}~ww xY ww)	r   NrZ   r   async_batch_get_cacher   r   r   r   )rM   rg   rU   r   r   r8   r:   r!   r   r   rj   r   r   r   r-   bytesr   r   r7   r   r	   r;   )rD   r   r   rw   r   rd   r0   r   r   r   re   rl   r   r   r   rG   s                   rI   r   z RedisCache.async_batch_get_cache  s     #4466YY[
2	"$}!)I $ < < < KILL+ "* !- 1 1u 1 == %} yy{H :-I''BB(..&5)%%5 C 	 "#h"89N O&,,.1a')A))!,%&"	 / #"I 7 %
 > %}}}B  	"yy{H :-I''BB(..&5)%%5 C 
 >s1vhGH!!!	"s   H EH E5 EE5 AE >E?E E5 ECE5 H E5 E E5  E2&E)'E2.E5 5	G=>A4G82G=3H 8G==H c                    t        d       t        j                         }	 | j                  j                         }t        d|        t        j                         }||z
  }| j                  j                  t        j                  |d||       |S # t        $ rn}t        j                         }||z
  }| j                  j                  t        j                  ||d       t        j                  dt        |              |d}~ww xY w)zD
        Tests if the sync redis client is correctly setup.
        zPinging Sync Redis CachezRedis Cache PING: 	sync_pingr`   ra   rb   r%   rc   7LiteLLM Redis Cache PING: - Got exception from REDIS : N)r	   rg   r0   r'   r!   ri   r   rj   r7   service_failure_hookr
   r%   r;   )rD   rd   r   re   rl   rG   s         rI   r   zRedisCache.sync_ping  s    	01YY[
	!..335H.xj9:yy{H :-I##88$**"%%! 9  O 	 yy{H :-I##88$**"%	 9    I#a&R G	s   A0B 	D	A)DD	c           
        K   | j                         }t        j                         }|4 d {   }t        d       	 |j                          d {   }t        j                         }||z
  }t	        j
                  | j                  j                  t        j                  |d             |cd d d       d {    S 7 7 q7 	# t        $ r}t        j                         }||z
  }t	        j
                  | j                  j                  t        j                  ||d             t        j                  dt        |              |d }~ww xY w# 1 d {  7  sw Y   y xY ww)NzPinging Async Redis Cache
async_ping)ra   rb   rc   r   r   )rM   rg   r	   r'   r8   r:   r!   r   r   rj   r7   r   r
   r%   r;   )rD   rw   rd   r0   r   re   rl   rG   s           rI   r'   zRedisCache.ping8  s=    ..0YY[
 =L56!-!2!2!4499;$z1	##++FF , 2 2!*". G    !== 5 !    99;$z1	##++FF , 2 2!*".	 G  $$McRSfXV ! !==su   +E)CE)ECCAC/E);C<E)CE)	EA<EEEE&EE&"E)c                    K   | j                         }|4 d {   } |j                  |  d {    d d d       d {    y 7 ,7 7 	# 1 d {  7  sw Y   y xY wwNrM   delete)rD   r   rw   r0   s       rI   delete_cache_keyszRedisCache.delete_cache_keys\  sK     ..0 =L%,%%t,,, !==, !===sS   A!AA!AAAA! A
A!A
A!AAAA!c                 :    | j                   j                         }|S r   )r0   client_list)rD   r   s     rI   r   zRedisCache.client_listb  s     --99;rN   c                 :    | j                   j                         }|S r   )r0   r6   )rD   r6   s     rI   r6   zRedisCache.infof  s      %%'rN   c                 8    | j                   j                          y r   r0   flushallr   s    rI   flush_cachezRedisCache.flush_cachej      ""$rN   c                 8    | j                   j                          y r   r   r   s    rI   r   zRedisCache.flushallm  r   rN   c                 X   K   | j                   j                  d       d {    y 7 w)NT)inuse_connections)r2   
disconnectr   s    rI   r   zRedisCache.disconnectp  s#     ((33d3KKKs    *(*c                    K   | j                         }|4 d {   }|j                  |       d {    d d d       d {    y 7 .7 7 	# 1 d {  7  sw Y   y xY wwr   r   )rD   rO   rw   r0   s       rI   async_delete_cachezRedisCache.async_delete_caches  sI     ..0 =L%%c*** !==* !===sS   A#AA#AA
AA#AA#
AA#A AA A#c                 :    | j                   j                  |       y r   )r0   r   rT   s     rI   delete_cachezRedisCache.delete_cachey  s      %rN   increment_listc           
      B  K   |D ]m  }| j                  |d         }t        d| d|d    d|d           |j                  ||d          |d   Mt        |d   	      }|j	                  ||       o |j                          d{   }t        d
|        |S 7 w)z1Helper function for pipeline increment operationsrO   rZ   z+Increment ASYNC Redis Cache PIPELINE: key: rW   increment_valuerX   rk   Nr   z/Increment ASYNC Redis Cache PIPELINE: results: )rU   r	   r   r   rv   r   )rD   r   r   increment_opr   r   r   s          rI   _pipeline_increment_helperz%RedisCache._pipeline_increment_helper|  s      +L44e9L4MI=i[Q]^oQpPqqw  yE  FK  yL  xM  N Y5F(GHE".U(;<Is+ + &GyQR 's   AB6BB	Bc                   K   t        |      dk(  ryddlm} | j                         }t	        j                         }t        d|        	 |4 d{   }|j                  d      4 d{   }| j                  ||       d{   }ddd      d{    ddd      d{    t        d        t	        j                         }	|	|z
  }
t        j                  | j                  j                  t        j                  |
d||	t        |      	             |S 7 7 7 7 # 1 d{  7  sw Y   xY w7 # 1 d{  7  sw Y   xY w# t        $ r}t	        j                         }	|	|z
  }
t        j                  | j                  j!                  t        j                  |
|d||	t        |      
             t#        j$                  dt'        |             |d}~ww xY ww)a  
        Use Redis Pipelines for bulk increment operations
        Args:
            increment_list: List of RedisPipelineIncrementOperation dicts containing:
                - key: str
                - increment_value: float
                - ttl_seconds: int
        r   Nr   z6Increment Async Redis Cache Pipeline: increment list: Tr   zpipeline increment results: async_increment_pipeliner   r   zOLiteLLM Redis Caching: async increment_pipeline() - Got exception from REDIS %s)r   r   r   rM   rg   r	   r   r   r8   r:   r!   r   r   rj   r   r7   r   r
   r%   r;   )rD   r   rE   r   rw   rd   r0   r   r   re   rl   rG   s               rI   r   z#RedisCache.async_increment_pipeline  s     ~!#'#557YY[
D^DTU	
*	$}'00T0BBd$($C$Cn% G CB %} 8	BC yy{H :-I''BB(..&8)%%Fv%N C 	 N+ %B CBBB %}}},  	yy{H :-I''BB(..&8)%%Fv%N C 
   aA G'	s   AG*E DE D>,D!-D>0D'D#D'D>D%D>E &D<'A7E G*E !D>#D'%D>'D9	-D0.D9	5D><E >EEEE 	G'BG""G''G*c                 r  K   	 | j                          d{   }|4 d{   }|j                  |       d{   }|dk  r	 ddd      d{    y|cddd      d{    S 7 R7 I7 27 7 # 1 d{  7  sw Y   yxY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)a  
        Get the remaining TTL of a key in Redis

        Args:
            key (str): The key to get TTL for

        Returns:
            Optional[int]: The remaining TTL in seconds, or None if key doesn't exist

        Redis ref: https://redis.io/docs/latest/commands/ttl/
        Nrs   zRedis TTL Error: )rM   rk   r7   r
   r<   )rD   rO   rw   r0   rk   rG   s         rI   async_get_ttlzRedisCache.async_get_ttl  s     		"&"8"8"::M$}(,,S11"9 %}} 	 %}} ;$1 %}}}}
  	  #4QC!89	s   B7B	 A*
B	 A,B	 A4A.
A4B	 A0B	 B7A4B	 $A2%B	 )B7*B	 ,B	 .A40B	 2B	 4B:A=;BB	 B7B	 		B4B/*B7/B44B7)NNNr"   NNr   )r"   )NN)2__name__
__module____qualname__r   rC   r;   r   rB   rM   rU   r_   floatrq   listr   r   r   r   r   r   r   async_redis_clientr   r   r   r   r   r   r   r   r   r   r   r   boolr   r'   r   r   r6   r   r   r   r   r   r   r   r   r   __classcell__)rH   s   @rI   r   r   )   s   
 *-#'(,O
 #3-O C=O  ~Ob
3 3 2 7;77$,UO7	7r,S , ,t ,\M^*.uS#X*?FNuo	* IM;uS#X/;6>uo;z(  	
 e_ 
"II%-e_IV, "+/9 9 c]	9
 #4.9 
9v-  x~ 4$"(4. $"T $"N 7;2%-d^2j GK;"S	;"5=d^;"	;"z"4 "H"D "H-T %%L+C +& <= 
$u+		*B"#BCB	$u+	BHs x} rN   r   )$__doc__r   r8   r4   r   rg   datetimer   typingr   r   r   r   r   r?   litellm._loggingr	   r
   'litellm.litellm_core_utils.core_helpersr   litellm.types.cachingr   litellm.types.servicesr   
base_cacher   opentelemetry.tracer   _Spanr   r   redis.asyncio.clientr   r   r   r   r)   rN   rI   <module>r     sp          < <  : U A / !1#-HDHDA ArN   