
    h8                     F   d dl Z d dlZd dlZd dlmZmZmZ d dlZd dlm	Z
 d dlmZmZ d dlmZmZ d dlmZ ddlmZ d Zdd	Zdd
Zd Zd Zd Zd Zdej8                  fdZdej<                  fdZde
j<                  fdZ d Z!de
j<                  fdZ"d Z#de$ddfdZ%y)    N)ListOptionalUnion)
get_secretget_secret_str)REDIS_CONNECTION_POOL_TIMEOUTREDIS_SOCKET_TIMEOUT)SensitiveDataMasker   )verbose_loggerc                      t        j                  t        j                        } h d}dg}| j                  D cg c]	  }||vs| c}|z   }|S c c}w N>   selfretryconnection_poolurl)inspectgetfullargspecredisRedisargs)arg_specexclude_argsinclude_argsxavailable_argss        J/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/_redis.py_get_redis_kwargsr      sR    %%ekk2HL 7L!)HA!<2GaH<WN Is   	AAc                     | t         j                  j                  } t        j                  t         j                  j                        }h d}dg}|j
                  D cg c]	  }||vs| c}|z   }|S c c}w r   )r   r   from_urlr   r   r   )clientr   r   r   r   r   s         r   _get_redis_url_kwargsr"   ,   sl    ~%%%%ekk&:&:;HL 7L!)HA!<2GaH<WN Is   	A5)A5c                 8   | t         j                  j                  } t        j                  t         j
                        }h d}|j                  D cg c]	  }||vs| }}|j                  d       |j                  d       |j                  d       |S c c}w )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!)HA!<2GaHNH*%*%%  Is   	BBc                  f    d} t               D ci c]  }|  |j                          | c}S c c}w )NREDIS_)r   upper)PREFIXr   s     r   _get_redis_env_kwarg_mappingr1   O   s2    F/@/BC!vhqwwyk"A%CCCs   .c                  x    t               } i }| j                         D ]  \  }}t        |d       }||||<    |S )N)default_value)r1   itemsr   )mappingreturn_dictkvvalues        r   _redis_kwargs_from_environmentr:   U   sF    *,GK11D1"KN       c                  Z   dt         j                  v rt         j                  d   S dt         j                  vsdt         j                  vrt        d      dt         j                  v rdt         j                  d    d} nd} d	|  t         j                  d    dt         j                  d    S )
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_environmentrH   `   s    bjj zz+&&2::%RZZ)Gc
 	
 2::%RZZ(89:!< >"2::l#;"<Abjj>V=WXr;   c                     | j                         D ]J  \  }}t        |t              s|j                  d      s)|j	                  dd      }t        |      }|| |<   L i t               | }|j                  dd      xs t        d      }|(t        |t              rt        j                  |      |d<   |j                  dd      xs t        d      }|(t        |t              rt        j                  |      |d<   |j                  dd      xs t        d	      }|||d<   |j                  d
d      xs t        d      }|||d
<   d|v rO|d   J|j                  dd       |j                  dd       |j                  dd       |j                  dd       |S d|v r|d   	 |S d|v r|d   	 |S d|vs|d   t        d      |S )zO
    Common functionality across sync + async redis client implementations
    zos.environ/rC   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.)r4   
isinstancestr
startswithreplacer   r:   getjsonloadsr   poprF   )	env_overridesr7   r8   r9   redis_kwargs_startup_nodes_sentinel_nodes_sentinel_password_service_names	            r   _get_redis_client_logicr`   s   s/   
 ##%1a!,,}"=		-,AqME$M!	 &
(
*
L
 2>1A1A/SW1X 2\f]N !j&E(,

>(B_%2>2B2BCSUY2Z 3^h_O "z/3'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 r;   returnc                    t        d      }|	 t        j                  |      | d<   t        j                  d       ddlm} t               }i }| D ]  }||v s| |   ||<    g }| d   D ]  }|j                   |di |        | j                  d       t        j                  dd|i|S # t        j                  $ r t	        d      w xY w)NrJ   r&   zbREDIS_CLUSTER_NODES environment variable is not valid JSON. Please ensure it's properly formatted.z8init_redis_cluster: startup nodes are being initialized.r   ClusterNode )r   rW   rX   JSONDecodeErrorrF   r   debugredis.clusterrd   r,   r+   rY   r   r*   )r[   _redis_cluster_nodes_in_envrd   r   cluster_kwargsargnew_startup_nodesitems           r   init_redis_clusterrn      s    1;<Q1R".	,0JJ7R,SL) ST)$&DN$;".s"3N3  ,._-  !4t!45 . _%P,=PPP) ## 	t 	s   B- -Cc                 
   | j                  d      }| j                  d      }| j                  d      }|r|st        d      t        j                  d       t	        j
                  |t        |      }|j                  |      S NrK   rM   rO   zIBoth 'sentinel_nodes' and 'service_name' are required for Redis Sentinel.z:init_redis_sentinel: sentinel nodes are being initialized.)socket_timeoutr'   )rV   rF   r   rg   r   Sentinelr	   
master_forr[   rK   rM   rO   sentinels        r   _init_redis_sentinelrv      s    !%%&67N$(()<=##N3LW
 	
 UV ~~+"H |,,r;   c                 
   | j                  d      }| j                  d      }| j                  d      }|r|st        d      t        j                  d       t	        j
                  |t        |      }|j                  |      S rp   )rV   rF   r   rg   async_redisrr   r	   rs   rt   s        r   _init_async_redis_sentinelry      s    !%%&67N$(()<=##N3LW
 	
 UV ##+"H |,,r;   c                  ,   t        di | }d|v rD|d   ?t               }i }|D ]  }||v s||   ||<    t        j                  j                  di |S d|v st        d      t        |      S d|v rd|v rt        |      S t        j                  di |S )Nr   r&   rJ   rK   rO   re   )r`   r"   r   r   r    r   rn   rv   )rZ   r[   r   
url_kwargsrk   s        r   get_redis_clientr|      s    *;];Le!4!@$&
Cd{".s"3
3   {{##1j11,&*5J*K*W!,// <'Nl,J#L11;;&&&r;   c                  v   t        d
i | }d|v r|d   }t        t        j                  j                        }i }|D ]3  }||v r	||   ||<   t        j                  dj                  |             5 t        j                  j                  d
i |S d|v rqddlm	} t               }i }|D ]  }||v s||   ||<    g }|d   D ]  }|j                   |d
i |        |j                  d       t        j                  d
d|i|S d|v rd|v rt        |      S t        |	       t        j                  d
i |S )Nr   )r!   zLREDIS: ignoring argument: {}. Not an allowed async_redis.Redis.from_url arg.r&   r   rc   rK   rO   )r[   re   )r`   r"   rx   r   r    r   rg   formatrh   rd   r,   r+   rY   r*   ry   _pretty_print_redis_config)	rZ   r[   r   r{   rk   rd   rj   rl   rm   s	            r   get_redis_async_clientr     sm    +;];Le!4!@$K,=,=,F,FG
Cd{".s"3
3$$bii	     ))7J77,&-(*Cd{&23&7s#   02 1D$$[%84%89 2)'' 
+
/=
 	

 <'Nl,J),77L9 
 r;   c                  v   t        di | }t        j                  d|       d|v r-|d   (t        j                  j                  t        |d         S t        j                  }d|v r't        j                  }|j                  dd        ||d<   |j                  dd        t        j                  ddt        i|S )	Nz'get_redis_connection_pool: redis_kwargsr   )timeoutr   r)   connection_classr&   r   re   )
r`   r   rg   rx   BlockingConnectionPoolr    r   
ConnectionSSLConnectionrY   )rZ   r[   r   s      r   get_redis_connection_poolr   ?  s    *;];LBLQe!4!@11::1|E7J ; 
 	
 #--&44%+;'(_d+-- -1= r;   r[   c                    	 ddl }ddlm} ddlm} ddlm} ddlm} t        j                  |j                        sy |       }t               }|j                  |       } |dd	      }	 |d
ddd      }
|
j                  ddd       |
j                  dd	       |j                         D ]o  \  }}|	t!        |t"              r:|dk(  r|rdt%        |       d}n.|dk(  r|rdt%        |       d}nt'        |      }nt'        |      }|
j)                  ||       q d}|j+                  d      rd}n'|j+                  d      rd}n|j+                  d      rd} |dddd      }|j                  d dd       |j                  dd	       |j)                  d!|       |j-                  d"       |j-                   ||	d#$             |j-                  |       |j-                  |
       |j-                  d"       y# t.        $ r6 t               }|j                  |       }t        j0                  d%|        Y yt2        $ r"}t        j4                  d&|        Y d}~yd}~ww xY w)'zKPretty print the Redis configuration using rich with sensitive data maskingr   N)Console)Panel)Table)TextzRedis Configurationz	bold blue)styleu    🔧 Redis Connection ParametersTzbold magentaleft)titleshow_headerheader_styletitle_justify	Parametercyan)r   no_wrapValueyellowr&   [z cluster nodes]rK   z sentinel nodes]zStandard RediszRedis ClusterzRedis Sentinelr   zRedis (URL-based)u   📊 Connection Infoz
bold greenPropertyzConnection Type
blue)border_stylezRedis configuration: z+Error pretty printing Redis configuration: )loggingrich.consoler   
rich.panelr   
rich.tabler   	rich.textr   r   isEnabledForDEBUGr
   	mask_dict
add_columnr4   rR   listlenrS   add_rowrV   printImportErrorinfo	Exceptionerror)r[   r   r   r   r   r   consolemaskermasked_redis_kwargsr   config_tablekeyr9   	value_strconnection_type
info_tablees                    r   r   r   P  se   RP($$"**7==9) %& %..|< *+> 4' 	
 	64Hx8 .335JC eT*o-%&'E
|?$C	 00U&'E
|3C$D	$'J	 #E
I$$S)4 6$ +""?3-O $$%56.O $$U+1O (% 	

 	jEgX6,o> 	deE78j!l#d K$&$..|<34G3HIJ PJ1#NOOPs*   ;G? A7G? 6EG? ?<I'=I'I""I')N)&r   rW   rD   typingr   r   r   r   redis.asyncioasynciorx   litellmr   r   litellm.constantsr   r	   0litellm.litellm_core_utils.sensitive_data_maskerr
   _loggingr   r   r"   r,   r1   r:   rH   r`   r*   rn   r   rv   ry   r|   r   r   dictr   re   r;   r   <module>r      s      
 ( (  # . Q P $"& D&;|Q(:(: Q8-%++ -0-0A0A -0'***Z"TPT TPd TPr;   