o
    ưi                     @   s   d Z ddlmZmZmZmZmZ ddlmZ er7ddl	m
Z ddlmZmZ ddlmZ eZeZeeef Z
neZeZeZ
G dd deZd	S )
z
Redis Cluster Cache implementation

Key differences:
- RedisClient NEEDs to be re-used across requests, adds 3000ms latency if it's re-created
    )TYPE_CHECKINGAnyListOptionalUnion)
RedisCache)Span)RedisRedisCluster)Pipelinec                       sf   e Zd Z fddZdd Zdee dee fddZdee dee fd	d
Z	de
fddZ  ZS )RedisClusterCachec                    s"   t  j|i | d | _d | _d S )N)super__init__ redis_async_redis_cluster_clientZredis_sync_redis_cluster_client)selfargskwargs	__class__ Z/home/app/Keep/.python/lib/python3.10/site-packages/litellm/caching/redis_cluster_cache.pyr      s   
zRedisClusterCache.__init__c                 C   sN   ddl m} ddlm} | jr| jS |dd| ji| j}t||r%|| _|S )Nr   )r
      )get_redis_async_clientZconnection_poolr   )redis.asyncior
   Z_redisr   r   Zasync_redis_conn_poolredis_kwargs
isinstance)r   r
   r   Z_redis_clientr   r   r   init_async_client    s   
z#RedisClusterCache.init_async_clientkeysreturnc                 C   s   | j j|dS )zI
        Overrides `_run_redis_mget_operation` in redis_cache.py
        r   )redis_clientmget_nonatomic)r   r   r   r   r   _run_redis_mget_operation0   s   z+RedisClusterCache._run_redis_mget_operationc                    s   |   }|j|dI dH S )zO
        Overrides `_async_run_redis_mget_operation` in redis_cache.py
        r   N)r   r!   )r   r   Zasync_redis_cluster_clientr   r   r   _async_run_redis_mget_operation6   s   z1RedisClusterCache._async_run_redis_mget_operationc              
      s   zNddl m} ddlm} | j }|dg }g }|D ]}||di | q|jdd|i|}|	 I dH }|
 I dH  |rJdddW S dd	dW S  ty~ }	 z#dd
lm}
 |
dt|	  ddt|	 t|	dW  Y d}	~	S d}	~	ww )z
        Test the Redis Cluster connection.
        
        Returns:
            dict: {"status": "success" | "failed", "message": str, "error": Optional[str]}
        r   N)ClusterNodestartup_nodessuccessz(Redis Cluster connection test successful)statusmessagefailedz!Redis Cluster ping returned False)verbose_loggerz&Redis Cluster connection test failed: z!Redis Cluster connection failed: )r'   r(   errorr   )r   asyncioZredis.clusterr$   r   copypopappendr
   Zpingaclose	ExceptionZlitellm._loggingr*   r+   str)r   Zredis_asyncr$   Zcluster_kwargsr%   Znew_startup_nodesitemr    Zping_resulter*   r   r   r   test_connection=   s@   
z!RedisClusterCache.test_connection)__name__
__module____qualname__r   r   r   r2   r   r"   r#   dictr5   __classcell__r   r   r   r   r      s    r   N)__doc__typingr   r   r   r   r   Zlitellm.caching.redis_cacher   Zopentelemetry.tracer   _Spanr   r	   r
   Zredis.asyncio.clientr   ZpipelineZasync_redis_clientr   r   r   r   r   <module>   s    