
    g#*                        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 d ZddZddZd	 Zd
 Zd Zd Zdej.                  fdZdej2                  fdZde
j2                  fdZd Zde
j2                  fdZd Zy)    N)ListOptionalUnion)
get_secretget_secret_str   )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        C/var/www/openai/venv/lib/python3.12/site-packages/litellm/_redis.py_get_redis_kwargsr      sV    %%ekk2HL 7L!)HA!<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   *   sp    ~%%%%ekk&:&:;HL 7L!)HA!<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!)HA!<2GaN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_mappingr.   M   s8    F/@/BC/B!vhqwwyk"A%/BCCCs   .c                  x    t               } i }| j                         D ]  \  }}t        |d       }||||<    |S )N)default_value)r.   itemsr   )mappingreturn_dictkvvalues        r   _redis_kwargs_from_environmentr7   S   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_environmentrE   ^   s    bjj zz+&&2::%RZZ)Gc
 	
 2::%RZZ(89:!< >"2::l#;"<Abjj>V=WXr8   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/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   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 r8   returnc                    t        d      }|	 t        j                  |      | d<   t        j                  d| 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)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$;".s"3N3  ,._-  !4t!45 . _%P,=PPP- ## 	t 	s   B1 1Cc                     | j                  d      }| j                  d      }|r|st        d      t        j                  d       t	        j
                  |d      }|j                  |      S )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                    | j                  d      }| j                  d      }| j                  d      }|r|st        d      t        j                  d       t	        j
                  |d|      }|j                  |      S )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                  ,   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#   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d{".s"3
3   {{##1j11,&*5J*K*W!,// <'Nl,J#L11;;&&&r8   c                  b   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        j                  dd	d
i|S )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~     sk   *;];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 
 r8   c                  f   t        d	i | }t        j                  d|       d|v r)|d   $t        j                  j                  d|d         S t        j                  }d|v r't        j                  }|j                  dd        ||d<   |j                  dd        t        j                  d	ddi|S )
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   