
    ^h#*                     &   S SK r S SKrS SKrS SKJrJrJr  S SKrS SKJ	r
  S SKJrJr  SSKJr  S rSS jrSS jrS	 rS
 rS rS rS\R.                  4S jrS\R2                  4S jrS\
R2                  4S jrS rS\
R2                  4S jrS rg)    N)ListOptionalUnion)
get_secretget_secret_str   )verbose_loggerc                      [         R                  " [        R                  5      n 1 SknS/nU R                   Vs/ s H  o3U;  d  M
  UPM     snU-   nU$ s  snf N>   selfretryconnection_poolurl)inspectgetfullargspecredisRedisargs)arg_specexclude_argsinclude_argsxavailable_argss        H/home/james-whalen/.local/lib/python3.13/site-packages/litellm/_redis.py_get_redis_kwargsr      sT    %%ekk2HL 7L!)HA<2GaH<WN Is   	AAc                    U c  [         R                  R                  n [        R                  " [         R                  R                  5      n1 SknS/nUR
                   Vs/ s H  oDU;  d  M
  UPM     snU-   nU$ s  snf r   )r   r   from_urlr   r   r   )clientr   r   r   r   r   s         r   _get_redis_url_kwargsr   *   sn    ~%%%%ekk&:&:;HL 7L!)HA<2GaH<WN Is   !	A<.A<c                 F   U c  [         R                  R                  n [        R                  " [         R
                  5      n1 SknUR                   Vs/ s H  o3U;  d  M
  UPM     nnUR                  S5        UR                  S5        UR                  S5        U$ s  snf )N>   hostportr   r   startup_nodesr   passwordusernamessl)r   r   r   r   r   RedisClusterr   append)r   r   r   r   r   s        r   _get_redis_cluster_kwargsr)   =   s    ~%%%%e&8&89H YL!)HA<2GaNH*%*%%  Is   	B!Bc                  j    Sn [        5        Vs0 s H  o UR                  5        3U_M     sn$ s  snf )NREDIS_)r   upper)PREFIXr   s     r   _get_redis_env_kwarg_mappingr.   M   s6    F/@/BC/B!hqwwyk"A%/BCCCs   0c                  v    [        5       n 0 nU R                  5        H  u  p#[        US S9nUc  M  XAU'   M     U$ )N)default_value)r.   itemsr   )mappingreturn_dictkvvalues        r   _redis_kwargs_from_environmentr7   S   sB    *,GK1D1"N       c                  j   S[         R                  ;   a  [         R                  S   $ S[         R                  ;  d  S[         R                  ;  a  [        S5      eS[         R                  ;   a  S[         R                  S    S3n OSn S	U  [         R                  S    S[         R                  S    3$ )
N	REDIS_URL
REDIS_HOST
REDIS_PORTzUEither 'REDIS_URL' or both 'REDIS_HOST' and 'REDIS_PORT' must be specified for Redis.REDIS_PASSWORD:@ zredis://)osenviron
ValueError)redis_passwords    r   get_redis_url_from_environmentrE   ^   s    bjj zz+&&2::%RZZ)Gc
 	
 2::%RZZ(89:!< >"2::l#;"<Abjj>V=WXr8   c                  
   U R                  5        HU  u  p[        U[        5      (       d  M  UR                  S5      (       d  M4  UR	                  SS5      n[        U5      nX0U'   MW     0 [        5       EU EnUR                  SS5      =(       d    [        S5      nUb.  [        U[        5      (       a  [        R                  " U5      US'   UR                  SS5      =(       d    [        S5      nUb.  [        U[        5      (       a  [        R                  " U5      US'   UR                  SS5      =(       d    [        S	5      nUb  XtS'   UR                  S
S5      =(       d    [        S5      nUb  XS
'   SU;   aP  US   bJ  UR                  SS5        UR                  SS5        UR                  SS5        UR                  SS5        U$ SU;   a	  US   b   U$ SU;   a	  US   b   U$ SU;  d  US   c  [        S5      eU$ )zG
Common functionality across sync + async redis client implementations
zos.environ/r@   r#   NREDIS_CLUSTER_NODESsentinel_nodesREDIS_SENTINEL_NODESsentinel_passwordREDIS_SENTINEL_PASSWORDservice_nameREDIS_SERVICE_NAMEr   r!   r"   dbr$   z3Either 'host' or 'url' must be specified for redis.)r1   
isinstancestr
startswithreplacer   r7   getjsonloadsr   poprC   )	env_overridesr4   r5   r6   redis_kwargs_startup_nodes_sentinel_nodes_sentinel_password_service_names	            r   _get_redis_client_logicr]   q   s3   
 ##%a!,,}"="=		-,AqME$!	 &
(
*
L
 2>1A1A/SW1X 2\f]N !j&E&E(,

>(B_%2>2B2BCSUY2Z 3^h_O "z/3'G'G)-O)D%&(4(8(8T) )3	1	2  %,>()#/#3#3ND#I $ZNM  '4^$e!4!@&&t$T*  
L	(\/-J-V  	L(\:J-K-W
 	 
|	#|F';'CNOO r8   returnc                    [        S5      nUb   [        R                  " U5      U S'   [
        R                  " SU S   5        SSKJn  [        5       n0 nU  H  nXS;   d  M
  X   XE'   M     / nU S    H  nUR                  U" S0 UD65        M     U R                  S5        [        R                  " SSU0UD6$ ! [        R                   a    [	        S5      ef = f)NrG   r#   zbREDIS_CLUSTER_NODES environment variable is not valid JSON. Please ensure it's properly formatted.z#init_redis_cluster: startup nodes: r   ClusterNode )r   rT   rU   JSONDecodeErrorrC   r	   debugredis.clusterra   r)   r(   rV   r   r'   )rX   _redis_cluster_nodes_in_envra   r   cluster_kwargsargnew_startup_nodesitems           r   init_redis_clusterrk      s    1;<Q1R".	,0JJ7R,SL) -|O/L *$&DN;"."3N  ,._-  !4t!45 . _%P,=PPP- ## 	t 	s   B9 9 Cc                     U R                  S5      nU R                  S5      nU(       a  U(       d  [        S5      e[        R                  " S5        [        R
                  " USS9nUR                  U5      $ )NrH   rL   IBoth 'sentinel_nodes' and 'service_name' are required for Redis Sentinel.:init_redis_sentinel: sentinel nodes are being initialized.皙?)socket_timeout)rS   rC   r	   rd   r   Sentinel
master_for)rX   rH   rL   sentinels       r   _init_redis_sentinelrt      sn    !%%&67N##N3LW
 	
 UV ~~nSAH |,,r8   c                    U R                  S5      nU R                  S5      nU R                  S5      nU(       a  U(       d  [        S5      e[        R                  " S5        [        R
                  " USUS9nUR                  U5      $ )NrH   rJ   rL   rm   rn   ro   )rp   r$   )rS   rC   r	   rd   async_redisrq   rr   )rX   rH   rJ   rL   rs   s        r   _init_async_redis_sentinelrw      s    !%%&67N$(()<=##N3LW
 	
 UV ##"H |,,r8   c                  H   [        S0 U D6nSU;   aH  US   bB  [        5       n0 nU H  nXB;   d  M
  X   X4'   M     [        R                  R                  " S0 UD6$ SU;   d  [        S5      b  [        U5      $ SU;   a  SU;   a  [        U5      $ [        R                  " S0 UD6$ )Nr   r#   rG   rH   rL   rb   )r]   r   r   r   r   r   rk   rt   )rW   rX   r   
url_kwargsrh   s        r   get_redis_clientrz      s    *;];Le!4!@$&
C{"."3
   {{##1j11,&*5J*K*W!,// <'Nl,J#L11;;&&&r8   c                     [        S0 U D6nSU;   a  US   b~  [        [        R                  R                  S9n0 nU H5  nXB;   a  X   X4'   M  [
        R                  " SR                  U5      5        M7     [        R                  R                  " S0 UD6$ SU;   av  SSKJ	n  [        5       n0 nU H  nXB;   d  M
  X   Xd'   M     / nUS    H  nUR                  U" S0 UD65        M     UR                  S5        [        R                  " SSU0UD6$ SU;   a  SU;   a  [        U5      $ [        R                  " SS	S
0UD6$ )Nr   )r   zLREDIS: ignoring argument: {}. Not an allowed async_redis.Redis.from_url arg.r#   r   r`   rH   rL   rp      rb   )r]   r   rv   r   r   r	   rd   formatre   ra   r)   r(   rV   r'   rw   )	rW   rX   r   ry   rh   ra   rg   ri   rj   s	            r   get_redis_async_clientr~     s_   *;];Le!4!@$K,=,=,F,FG
C{"."3
$$bii	     ))7J77,&-(*C{&2&7#   02 1D$$[%84%89 2)'' 
+
/=
 	

 <'Nl,J),77 
 r8   c                  l   [        S	0 U D6n[        R                  " SU5        SU;   a'  US   b!  [        R                  R                  SUS   S9$ [        R                  nSU;   a&  [        R                  nUR                  SS 5        X!S'   UR                  SS 5        [        R                  " S	SS0UD6$ )
Nz'get_redis_connection_pool: redis_kwargsr   r|   )timeoutr   r&   connection_classr#   r   rb   )	r]   r	   rd   rv   BlockingConnectionPoolr   
ConnectionSSLConnectionrV   )rW   rX   r   s      r   get_redis_connection_poolr   9  s    *;];LBLQe!4!@11::<. ; 
 	
 #--&44%+;'(_d+--HaH<HHr8   )N)r   rT   rA   typingr   r   r   r   redis.asyncioasynciorv   litellmr   r   _loggingr	   r   r   r)   r.   r7   rE   r]   r'   rk   r   rt   rw   rz   r~   r   rb   r8   r   <module>r      s      
 ( (  # . $"& D&;|Q(:(: Q<-%++ -&-0A0A -0'*){/@/@ )XIr8   