
    ^h[                        S r SSKrSSKrSSKrSSKrSSKrSSKJr  SSKJ	r	J
r
JrJrJr  SSKrSSKJrJr  SSKJr  SSKJr  SSKJr  S	S
KJr  \	(       a  SSKJr  SSKJr  SSKJ r   \ r!\r"\rO\
r!\
r"\
r " S S\5      r#g)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            
         ^  \ rS rSr      S4S\\   S\\   S\\   4U 4S jjjrS r	S\S	\4S
 jr
S r S5S\S\\   S	\4S jjrS6S\S\S	\4S jjrS rS\S\\\\4      S\\   S	\4S jr S5S\\\\4      S\\   4S jjrS\S\S\S\\   S	S4
S jrS\S\\   4S jrS r  S7S\S\\   S\\   S	\4S jjrS rS\4S jrS5S\\   4S  jjrS\\   S	\4S! jr  S5S\\   4S" jjr! S5S#\\   S\\   S	\4S$ jjr"S	\#4S% jr$S	\#4S& jr%S' r&S	\4S( jr'S) r(S* r)S+ r*S, r+S\4S- jr,S. r-S\S/\\.   S	\\\      4S0 jr/S/\\.   S	\\\      4S1 jr0S\S	\\   4S2 jr1S3r2U =r3$ )8
RedisCache)   Nredis_flush_size	namespacestartup_nodesc                   > SSK Jn  SSKJn	Jn
  0 nUb  XS'   Ub  X+S'   Ub  X;S'   Ub  XkS'   UR                  S	S 5      b+  [        US	   U5      (       a  UR                  S	5      U l        OU" 5       U l        UR                  U5        U	" S0 UD6U l
        Xl        U
" S0 UD6U l        XPl        / U l        Uc  S
U l        OX@l        SU l         ["        R$                  " U R                  5      (       d"  U R                  R'                  5       S   U l         [*        R,                  " 5       R/                  U R1                  5       5      n [=        U R                  S5      (       a  U R                  R1                  5         [>        R@                  b%  [B        TU ]  [G        [>        R@                  5      S9  g [B        TU ]  5         g ! [(         a     Nf = f! [(         al  nS[3        U5      ;   a  [4        R6                  " S5         S nAN[4        R8                  " SR;                  [3        U5      5      S[3        U5      0S9   S nANS nAff = f! [(         a*  n[4        R8                  " SS[3        U5      0S9   S nANS nAff = f)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   r2   _e	__class__s                 U/home/james-whalen/.local/lib/python3.13/site-packages/litellm/caching/redis_cache.pyrC   RedisCache.__init__,   sM    	;H#' #' '/$$,9)::*D1=*'(.C
 C
 '-jj1E&FD#&4&6D#F#,<|<(%>%N%N" #02'#),D!$4!&	..t/@/@AA%)%6%6%;%;%=o%N"
	((*66tyy{CA	t((&11!!&&( $$0GW-F-F)GHG=  		  		&#a&0$$G  $$AHHQP"CF+		  	  7Q?P	sI   AG 2G 
5I 
GG
I
%I8II

J I<<Jc                 J    SSK Jn  U" SSU R                  0U R                  D6$ )Nr   )get_redis_async_clientconnection_poolr*   )r,   rM   r3   r2   )rE   rM   s     rJ   init_async_clientRedisCache.init_async_client}   s.    3% 
 66
:>:K:K
 	
    keyreturnc                     U R                   b2  UR                  U R                   5      (       d  U R                   S-   U-   nU$ )z4
Make sure each key starts with the given namespace
:)r   
startswithrE   rR   s     rJ   check_and_fix_namespace"RedisCache.check_and_fix_namespace   s8     >>%cnnT^^.L.L..3&,C
rQ   c           
         U R                   " S
0 UD6n[        SU SU SU SU R                   35        U R                  US9n [        R                  " 5       nU R
                  R                  U[        U5      US9  [        R                  " 5       nXe-
  nU R                  R                  [        R                  USUUS9  g ! [         a!  n[        S	[        U5       35         S nAg S nAff = f)NzSet Redis Cache: key: 
Value 
ttl=, redis_version=rR   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%   rX   timer1   setr<   r"   service_success_hookr   REDISr8   )	rE   rR   ra   rF   ttlrh   ri   	_durationrH   s	            rJ   rc   RedisCache.set_cache   s    ll$V$$SE%seCSTXTfTfSgh	
 **s*3	J!!s#e*!Eyy{H -I##88$**"%%! 9   	NsSTvhW 	s   A=C 
C-C((C-ra   ro   c                    U R                   n[        R                  " 5       nU R                  US9n [        R                  " 5       nUR                  XS9n[        R                  " 5       n	X-
  n
U R                  R                  [        R                  U
SUU	S9  Ub  [        R                  " 5       nUR                  U5      n[        R                  " 5       n	X-
  n
U R                  R                  [        R                  U
SUU	S9  US:X  aj  [        R                  " 5       nUR                  X5        [        R                  " 5       n	X-
  n
U R                  R                  [        R                  U
SUU	S9  U$ ! [         aA  n[        R                  " 5       n	X-
  n
[        R                  " S[        U5      U5        UeS nAff = f)	Nro   r`   amountincrement_cacherd   increment_cache_ttlincrement_cache_expirezXLiteLLM Redis Caching: increment_cache() - Got exception from REDIS %s, Writing value=%s)r1   rk   rj   incrr"   rm   r   rn   ro   expirer8   r
   r&   r<   )rE   rR   ra   ro   rF   _redis_clientrh   set_ttlresultri   rp   current_ttlrH   s                rJ   rv   RedisCache.increment_cache   s    ))YY[
,,3,'1	J',,#,DFyy{H -I##88$**"+%! 9  "!YY[
+//499;$1	''<<(..&3)% =  "$!%J!((6#yy{H ( 5I++@@ , 2 2!*":#-!) A  M 		yy{H -I  jA
 G		s   EE9 9
G<F??Gpatterncountc                   #    SSK Jn  [        R                  " 5       n / nU R                  5       nU IS h  vN nUR	                  US-   US9  S h  vN nUR                  U5        [        U5      U:  d  M+    [        R                  " 5       n	X-
  n
[        R                  " U R                  R                  [        R                  U
SUU	S95        S S S 5      IS h  vN   U$  N N
 Np N! , IS h  vN  (       d  f       U$ = f! [         a`  n[        R                  " 5       n	X-
  n
[        R                  " U R                  R                  [        R                  U
USUU	S95        UeS nAff = f7f)Nr   r   *)matchr   async_scan_iterrd   )re   rf   r&   rg   rh   ri   )redis.asyncior   rk   rO   	scan_iterappendlenr9   r;   r"   async_service_success_hookr   rn   r8   async_service_failure_hook)rE   r   r   r   rh   keysr|   r1   rR   ri   rp   rH   s               rJ   r   RedisCache.async_scan_iter   s\    'YY[
(	D#'#9#9#;M$}!-!7!7!C-u "8 " # KK$4yE)  99;$1	##++FF , 2 2!*"3#-!) G  %}( K) % " %}}( K 	 yy{H -I''BB(..&/)% C 	 G	s   E5D C%D C-C)C'C)C-:AC-D C+D $E5%D 'C))C-+D -D3C64D D E5D 
E2AE--E22E5c                 >  #    SSK Jn  [        R                  " 5       n U R                  5       nU R                  US9nU IS h  vN n
U R                   " S0 UD6n[#        SU SU S	U 35         [%        U
S
5      (       d  [	        S5      eU
R'                  U[(        R*                  " U5      US9I S h  vN   [#        SU SU S	U 35        [        R                  " 5       nX-
  n	[
        R                  " U R                  R-                  [        R                  U	SUU[        U5      SU0S95        S S S 5      IS h  vN   g ! [         a  n[        R                  " 5       nX-
  n	[
        R                  " U R                  R                  [        R                  U	UUU[        U5      SS95        [        R                  " S[        U5      U5        UeS nAff = f GN GN*! [         a  n[        R                  " 5       nX-
  n	[
        R                  " U R                  R                  [        R                  U	USUU[        U5      SU0S95        [        R                  " S[        U5      U5         S nAGNFS nAff = f GNC! , IS h  vN  (       d  f       g = f7f)Nr   r   async_set_cachere   rf   r&   rh   ri   parent_otel_spanrg   RLiteLLM Redis Caching: async set() - Got exception from REDIS %s, Writing value=%sr^   Set ASYNC Redis Cache: key: r[   r\   rl   z3Redis client cannot set cache. Attribute not found.r_   z)Successfully Set ASYNC Redis Cache: key: rR   re   rf   rg   rh   ri   r   event_metadatare   rf   r&   rg   rh   ri   r   r   r*   )r   r   rk   rO   r8   r9   r;   r"   r   r   rn   r   r
   r&   r<   rX   rj   r	   r?   rl   jsondumpsr   )rE   rR   ra   rF   r   rh   r|   rH   ri   rp   r1   ro   s               rJ   r   RedisCache.async_set_cache  s    'YY[
	#'#9#9#;M. **s*3 =L,,((C.se8E7&N*|U33#M  #&&Ctzz%7HS&QQQ?uHUGSYZ]Y^_  99;$1	##++FF , 2 2!*"3#-!))J6)R(-s| G 
# !==/  	yy{H -I''BB(..&)%%Fv%N/ C 
   dA
 G)	. ! R"  99;$1	##++FF , 2 2!*"3#-!))J6)R(-s| G 	 $$hF !9 !===s   JE JGJ'J0AG!4G5A=G!2J=J >J
GBGGJG!!
I=+BI82J8I==J JJ	J
JJpipe
cache_listc           	      $  #    U R                  US9nU H\  u  pEU R                  US9n[        SU SU SU 35        [        R                  " U5      nS nUb	  [        US9nUR                  XFUS9  M^     UR                  5       I S h  vN nU$  N7f)Nrs   r^   z%Set ASYNC Redis Cache PIPELINE: key: r[   r\   seconds)rb   )rj   rX   r	   r   r   r   rl   execute)	rE   r   r   ro   	cache_keycache_valuejson_cache_value_tdresultss	            rJ   _pipeline_helperRedisCache._pipeline_helper[  s      llsl#&0"I444CI7	{(;-W]^a]bc  $zz+6'+C,HHYSH9 '1 & 's   BBBBc                   #    [        U5      S:X  a  gSSKJn  U R                  5       n[        R                  " 5       n[        SU SU SU R                   35        Sn U ISh  vN nUR                  SS9 ISh  vN n	U R                  XU5      I Sh  vN n
SSS5      ISh  vN   SSS5      ISh  vN   [        S	W
 35        [        R                  " 5       nX-
  n[        R                  " U R                  R                  [        R                  US
UU[        U5      S95        g N N N N! , ISh  vN  (       d  f       N= f N! , ISh  vN  (       d  f       N= f! [          a  n[        R                  " 5       nX-
  n[        R                  " U R                  R#                  [        R                  UUS
UU[        U5      S95        [$        R&                  " S[)        U5      U5         SnAgSnAff = f7f)z/
Use Redis Pipelines for bulk write operations
r   Nr   z!Set Async Redis Cache: key list: r\   r]   Ttransactionzpipeline results: async_set_cache_pipelinere   rf   rg   rh   ri   r   re   rf   r&   rg   rh   ri   r   zaLiteLLM Redis Caching: async set_cache_pipeline() - Got exception from REDIS %s, Writing value=%s)r   r   r   rO   rk   r	   r%   pipeliner   r9   r;   r"   r   r   rn   r   r8   r   r
   r&   r<   )rE   r   ro   rF   r   r|   rh   r   r1   r   r   ri   rp   rH   s                 rJ   r   #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+ %D-&E+ )E=D/>ED5D1D5E'D3(E,E+ 7E8A4E+ ,H-E+ /E1D53E5E	;D><E	EE+ E(EE($E+ +
H5BG>9H>HHr1   c                    #    U R                  US9n UR                  " U/UQ76 I Sh  vN   Ub#  [        US9nUR                  X%5      I Sh  vN   gg N+ N! [         a    e f = f7f)z@Helper function for async_set_cache_sadd. Separated for testing.rs   Nr   )rj   saddr   r{   r8   )rE   r1   rR   ra   ro   r   s         rJ   _set_cache_sadd_helper!RedisCache._set_cache_sadd_helper  sx      llsl#	##C0%000,"))#333  1 4 		s>   A(A A$A AA A(A A A%%A(c                   #    SSK Jn  [        R                  " 5       n U R                  5       nU R                  US9nU IS h  vN n[!        SU SU S	U 35         U R#                  XX#S
9I S h  vN   [!        SU SU S	U 35        [        R                  " 5       n	X-
  n
[
        R                  " U R                  R%                  [        R                  U
SUU	[        U5      S95        S S S 5      IS h  vN   g ! [         a  n[        R                  " 5       n	X-
  n
[
        R                  " U R                  R                  [        R                  U
UUU	[        U5      SS95        [        R                  " S[        U5      U5        UeS nAff = f GNQ GN'! [         a  n[        R                  " 5       n	X-
  n
[
        R                  " U R                  R                  [        R                  U
USUU	[        U5      S95        [        R                  " S[        U5      U5         S nAGNCS nAff = f GN@! , IS h  vN  (       d  f       g = f7f)Nr   r   async_set_cache_saddr   r   r^   r   r[   r\   )r1   rR   ra   ro   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   rk   rO   r8   r9   r;   r"   r   r   rn   r   r
   r&   r<   rX   r	   r   r   )rE   rR   ra   ro   rF   r   rh   r|   rH   ri   rp   r1   s               rJ   r   RedisCache.async_set_cache_sadd  sF     	(YY[
	#'#9#9#;M. **s*3 =L.se8E7&N&11!-e 2    DSERWQXX^_b^cd  99;$1	##++FF , 2 2!*"8#-!))J6)R G 	 !==/  	yy{H -I''BB(..&)%%Fv%N4 C 
   dA
 G)	. !
$  99;$1	##++FF , 2 2!*"8#-!))J6)R G 
 $$sF / !===s   IC= IFIH:F1F2A:F,I7H78I=
FBFFIF
H4%BH/)H:/H44H:7I:I IIIc                    #    [        S[        U R                  5       35        U R                  US9nU R                  R	                  X45        [        U R                  5      U R
                  :  a  U R                  5       I S h  vN   g g  N7f)Nz-in batch cache writing for redis buffer size=r^   )r	   r   r4   rX   r   r   flush_cache_buffer)rE   rR   ra   rF   s       rJ   batch_cache_writeRedisCache.batch_cache_write  s     ;C@_@_<`;ab	
 **s*3''..|<t../43H3HH))+++ I+s   BBBBr   c                 x  #    SSK Jn  U R                  5       n[        R                  " 5       nU R	                  US9n U IS h  vN n	U	R                  XS9I S h  vN n
Ub8  U	R                  U5      I S h  vN nUS:X  a  U	R                  X5      I S h  vN   [        R                  " 5       nX-
  n[        R                  " U R                  R                  [        R                  USUUUS95        U
sS S S 5      IS h  vN   $  N N N Nv N! , IS h  vN  (       d  f       g = f! [         a  n[        R                  " 5       nX-
  n[        R                  " U R                  R                  [        R                  UUSUUUS95        [         R"                  " S	[%        U5      U5        UeS nAff = f7f)
Nr   r   rs   rt   rx   async_incrementr   r   z^LiteLLM Redis Caching: async async_increment() - Got exception from REDIS %s, Writing value=%s)r   r   rO   rk   rj   incrbyfloatro   r{   r9   r;   r"   r   r   rn   r8   r   r
   r&   r<   )rE   rR   ra   ro   r   r   r|   rh   	_used_ttlr1   r~   r   ri   rp   rH   s                  rJ   r   RedisCache.async_increment  s     	(#557YY[
LLSL)	-	$}+77S7OO((4(8(8(="=K"b(*11#AAA  99;$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7D8DDAD5D+ DD+ F:D+ 	DDDD+ D(DD($D+ 'F:(D+ +
F75A=F22F77F:c                    #    [        S[        U R                  5       35        U R                  U R                  5      I S h  vN   / U l        g  N7f)Nz,flushing to redis....reached size of buffer )r	   r   r4   r   rE   s    rJ   r   RedisCache.flush_cache_bufferL  sM     :3t?^?^;_:`a	
 ++D,K,KLLL*,' 	Ms   A AAAcached_responsec                     Uc  U$ UR                  S5      n [        R                  " U5      nU$ ! [         a    [        R
                  " U5      n U$ f = f)zK
Common 'get_cache_logic' across sync + async redis client implementations
utf-8)decoder   loadsr8   astliteral_eval)rE   r   s     rJ   _get_cache_logicRedisCache._get_cache_logicS  sh     """)009	@"jjO
   	@!..?O	@s   0  AAc           	          U R                  US9n[        SU 35        [        R                  " 5       nU R                  R	                  U5      n[        R                  " 5       nXd-
  nU R
                  R                  [        R                  USUUUS9  [        SU SU 35        U R                  US9$ ! [         a!  n[        R                  " SU5         S nAg S nAff = f)	Nr^   zGet Redis Cache: key: 	get_cacher   zGot Redis Cache: key: , cached_response r   z;litellm.caching.caching: get() - Got exception from REDIS: )rX   r	   rk   r1   r-   r"   rm   r   rn   r   r8   r
   r&   )	rE   rR   r   rF   rh   r   ri   rp   rH   s	            rJ   r   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   B1B4 4
C>CCc           	      b   0 n / nU H#  nU R                  US9nUR                  U5        M%     [        R                  " 5       nU R                  R	                  US9n[        R                  " 5       nX-
  n	U R
                  R                  [        R                  U	SUUUS9  [        [        X5      5      nUR                  5        V
Vs0 s H&  u  pU
R                  S5      U R                  U5      _M(     nn
nU$ s  snn
f ! [         a#  n[        S[!        U5       35        Us SnA$ SnAff = f)$
Use Redis for bulk read operations
r^   r   batch_get_cacher   r   "Error occurred in pipeline read - N)rX   r   rk   r1   mgetr"   rm   r   rn   dictzipitemsr   r   r8   r	   r<   )rE   key_listr   key_value_dict_keysr   rh   r   ri   rp   kvdecoded_resultsrH   s                 rJ   r   RedisCache.batch_get_cache}  s6    	"E%	 88Y8G	Y' & J --222>Gyy{H -I##88$**"+%!!1 9  "#h"89N +0022DA !4#8#8#;;2  
 #"  	">s1vhGH!!	"s0   CD 	-C;6D ;D 
D.D)#D.)D.c                 |  #    SSK Jn  U R                  5       nU R                  US9n[        R                  " 5       nU IS h  vN n [        SU 35        UR                  U5      I S h  vN n[        SU SU 35        U R                  US9n	[        R                  " 5       n
X-
  n[        R                  " U R                  R                  [        R                  USUU
US	U0S
95        U	sS S S 5      IS h  vN   $  N N N	! [         a~  n[        R                  " 5       n
X-
  n[        R                  " U R                  R                  [        R                  UUSUU
US	U0S95        [        S[!        U5       35         S nAOS nAff = fS S S 5      IS h  vN    g ! , IS h  vN  (       d  f       g = f7f)Nr   r   r^   zGet Async Redis Cache: key: zGot Async Redis Cache: key: r   r   async_get_cacherR   r   r   zAlitellm.caching.caching: async get() - Got exception from REDIS: )r   r   rO   rX   rk   r	   r-   r   r9   r;   r"   r   r   rn   r8   r   r<   )rE   rR   r   rF   r   r|   rh   r1   r   responseri   rp   rH   s                rJ   r   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;$1	##++FF , 2 2!*"3#-!))9(-s| G 
  - !== #> !.  99;$1	##++FF , 2 2!*"3#-!))9(-s| G 	 WX[\]X^W_` #/ !=====s   AF<C?F<F"	"D+D,BD-F<9D:F<DF<
FA4FF"FF"F<FF<"F9(F+)F95F<r   c                   #    U R                  5       I Sh  vN n0 n[        R                  " 5       n U ISh  vN n/ nU H#  nU R                  US9nUR                  U5        M%     UR	                  US9I Sh  vN n	SSS5      ISh  vN   [        R                  " 5       n
X-
  n[
        R                  " U R                  R                  [        R                  USUU
US95        [        [        UW	5      5      n0 nUR                  5        H@  u  p[        U[        5      (       a  UR!                  S5      nU R#                  U5      nXU'   MB     U$  GN@ GN  N N! , ISh  vN  (       d  f       N= f! [$         a}  n[        R                  " 5       n
X-
  n[
        R                  " U R                  R'                  [        R                  UUSUU
US95        [)        S[+        U5       35        Us SnA$ SnAff = f7f)	r   Nr^   r   async_batch_get_cacher   r   r   r   )rO   rk   rX   r   r   r9   r;   r"   r   r   rn   r   r   r   r.   bytesr   r   r8   r   r	   r<   )rE   r   r   r|   r   rh   r1   r   r   r   ri   rp   r   r   r   rH   s                   rJ   r    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&,,.a'')A))!,%&"	 / #"I 7 %
 > %}}}B  	"yy{H -I''BB(..&5)%%5 C 
 >s1vhGH!!!	"s   HEHE: EE: >E ;E<E  E: EC	E: HE: E E:  E7&E)'E73E: :
HA2G<6H7H<HHc                    [        S5        [        R                  " 5       n U R                  R                  5       n[        SU 35        [        R                  " 5       nX1-
  nU R                  R                  [        R                  USUUS9  U$ ! [         al  n[        R                  " 5       nX1-
  nU R                  R                  [        R                  UUSS9  [        R                  " S[        U5       35        UeSnAff = f)z4
Tests if the sync redis client is correctly setup.
zPinging Sync Redis CachezRedis Cache PING: 	sync_pingrd   re   rf   r&   rg   7LiteLLM Redis Cache PING: - Got exception from REDIS : N)r	   rk   r1   r(   r"   rm   r   rn   r8   service_failure_hookr
   r&   r<   )rE   rh   r   ri   rp   rH   s         rJ   r   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   A-B 
DA'DDc                   #    U R                  5       n[        R                  " 5       nU IS h  vN n[        S5         UR                  5       I S h  vN n[        R                  " 5       nXR-
  n[        R
                  " U R                  R                  [        R                  USS95        UsS S S 5      IS h  vN   $  N No N	! [         a  n[        R                  " 5       nXR-
  n[        R
                  " U R                  R                  [        R                  UUSS95        [        R                  " S[        U5       35        UeS nAff = f! , IS h  vN  (       d  f       g = f7f)NzPinging Async Redis Cache
async_ping)re   rf   rg   r   r   )rO   rk   r	   r(   r9   r;   r"   r   r   rn   r8   r   r
   r&   r<   )rE   r|   rh   r1   r   ri   rp   rH   s           rJ   r(   RedisCache.ping8  s6    ..0YY[
 =L56!-!2!2!4499;$1	##++FF , 2 2!*". G    !== 5 !    99;$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                    #    U R                  5       nU IS h  vN nUR                  " U6 I S h  vN   S S S 5      IS h  vN   g  N, N N	! , IS h  vN  (       d  f       g = f7fNrO   delete)rE   r   r|   r1   s       rJ   delete_cache_keysRedisCache.delete_cache_keys\  sE     ..0 =L%%t,,, !==, !===sS   A&AA&AAAA& A
A&A
A&A#AA#A&c                 :    U R                   R                  5       nU$ r   )r1   client_list)rE   r   s     rJ   r   RedisCache.client_listb  s     --99;rQ   c                 :    U R                   R                  5       nU$ r   )r1   r7   )rE   r7   s     rJ   r7   RedisCache.infof  s      %%'rQ   c                 8    U R                   R                  5         g r   r1   flushallr   s    rJ   flush_cacheRedisCache.flush_cachej      ""$rQ   c                 8    U R                   R                  5         g r   r   r   s    rJ   r   RedisCache.flushallm  r  rQ   c                 R   #    U R                   R                  SS9I S h  vN   g  N7f)NT)inuse_connections)r3   
disconnectr   s    rJ   r  RedisCache.disconnectp  s"     ((33d3KKKs   '%'c                    #    U R                  5       nU IS h  vN nUR                  U5      I S h  vN   S S S 5      IS h  vN   g  N. N N	! , IS h  vN  (       d  f       g = f7fr   r   )rE   rR   r|   r1   s       rJ   async_delete_cacheRedisCache.async_delete_caches  sE     ..0 =L%%c*** !==* !===sS   A(AA(AA
AA(AA(
AA(A%AA%!A(c                 :    U R                   R                  U5        g r   )r1   r   rW   s     rJ   delete_cacheRedisCache.delete_cachey  s      %rQ   increment_listc           
      :  #    U Hh  nU R                  US   S9n[        SU SUS    SUS    35        UR                  XCS   5        US   c  MK  [        US   S	9nUR	                  XE5        Mj     UR                  5       I Sh  vN n[        S
U 35        U$  N7f)z1Helper function for pipeline increment operationsrR   r^   z+Increment ASYNC Redis Cache PIPELINE: key: r[   increment_valuer\   ro   Nr   z/Increment ASYNC Redis Cache PIPELINE: results: )rX   r	   r   r   r{   r   )rE   r   r  increment_opr   r   r   s          rJ   _pipeline_increment_helper%RedisCache._pipeline_increment_helper|  s      +L44e9L4MI=i[Q]^oQpPqqw  yE  FK  yL  xM  N Y5F(GHE".U(;<I+ + &GyQR 's   A
B4BBBc                   #    [        U5      S:X  a  gSSKJn  U R                  5       n[        R                  " 5       n[        SU 35         U ISh  vN nUR                  SS9 ISh  vN nU R                  Xq5      I Sh  vN nSSS5      ISh  vN   SSS5      ISh  vN   [        SW 35        [        R                  " 5       n	X-
  n
[        R                  " U R                  R                  [        R                  U
SUU	[        U5      S	95        U$  N N N N! , ISh  vN  (       d  f       N= f N! , ISh  vN  (       d  f       N= f! [         a  n[        R                  " 5       n	X-
  n
[        R                  " U R                  R!                  [        R                  U
USUU	[        U5      S
95        ["        R$                  " S['        U5      5        UeSnAff = f7f)z
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   rO   rk   r	   r   r  r9   r;   r"   r   r   rn   r   r8   r   r
   r&   r<   )rE   r  rF   r   r|   rh   r1   r   r   ri   rp   rH   s               rJ   r  #RedisCache.async_increment_pipeline  s     ~!#'#557YY[
D^DTU	
*	$}'00T0BBd$($C$C% 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
G0E DE D?+D,D?/D#DD#	D?D!D?E $D=%A5E G0E D?D#!D?#D:	)D,*D:	6D?=E ?EEEE 
G-#BG((G--G0c                   #     U R                  5       I Sh  vN nU ISh  vN nUR                  U5      I Sh  vN nUS::  a   SSS5      ISh  vN   gUsSSS5      ISh  vN   $  NS NJ N3 N N! , ISh  vN  (       d  f       g= f! [         a#  n[        R                  " SU 35         SnAgSnAff = f7f)z
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/
Nrx   zRedis TTL Error: )rO   ro   r8   r
   r=   )rE   rR   r|   r1   ro   rH   s         rJ   async_get_ttlRedisCache.async_get_ttl  s     		"&"8"8"::M$}(,,S11"9 %}} 	 %}} ;$1 %}}}
  	  #4QC!89	s   B?B A+
B A-B A5A/A5B A1B B?A5B %A3&B *B?+B -B /A51B 3B 5B;A><BB B?B 
B<B72B?7B<<B?)r3   r   r4   r1   r   r2   r%   r"   )NNNr#   NNr   )r#   )NN)4__name__
__module____qualname____firstlineno__r   rD   r<   r   rC   rO   rX   rc   floatrv   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   r7   r   r   r  r
  r  r   r  r  r  __static_attributes____classcell__)rI   s   @rJ   r   r   )   s   
 *-#'(,O
 #3-O C=O  ~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}  rQ   r   )$__doc__r   r9   r5   r   rk   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*   rQ   rJ   <module>r0     sp          < <  : U A / !1#-HDHDA ArQ   