
    i                         d Z ddlmZmZmZmZmZ ddlmZ er d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e      Zy	)
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                   h     e Zd Z fdZd Zdee   dee   fdZdee   dee   fdZ	de
fdZ xZS )RedisClusterCachec                 @    t        |   |i | d | _        d | _        y )N)super__init__ redis_async_redis_cluster_clientredis_sync_redis_cluster_client)selfargskwargs	__class__s      t/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/caching/redis_cluster_cache.pyr   zRedisClusterCache.__init__   s%    $)&)HL-GK,    c                     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_clientconnection_pool )redis.asyncior   _redisr   r   async_redis_conn_poolredis_kwargs
isinstance)r   r   r   _redis_clients       r   init_async_clientz#RedisClusterCache.init_async_client    s]    .300888. 
 66
:>:K:K
 m\24AD1r   keysreturnc                 :    | j                   j                  |      S )zI
        Overrides `_run_redis_mget_operation` in redis_cache.py
        r&   )redis_clientmget_nonatomic)r   r&   s     r   _run_redis_mget_operationz+RedisClusterCache._run_redis_mget_operation0   s       //T/::r   c                 b   K   | j                         }|j                  |       d{   S 7 w)zO
        Overrides `_async_run_redis_mget_operation` in redis_cache.py
        r)   N)r%   r+   )r   r&   async_redis_cluster_clients      r   _async_run_redis_mget_operationz1RedisClusterCache._async_run_redis_mget_operation6   s1      &*%;%;%="/>>D>IIIIs   &/-/c                   K   	 ddl m} ddlm} | j                  j                         }|j                  dg       }g }|D ]  }|j                   |di |         |j                  dd|i|}|j                          d{   }|j                          d{    |rdddS dd	dS 7 (7 # t        $ rH}	dd
lm}
 |
j                  dt        |	              ddt        |	       t        |	      dcY d}	~	S d}	~	ww xY 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: )r4   r5   errorr   )r   asyncioredis.clusterr1   r"   copypopappendr   pingaclose	Exceptionlitellm._loggingr7   r8   str)r   redis_asyncr1   cluster_kwargsr2   new_startup_nodesitemr*   ping_resulter7   s              r   test_connectionz!RedisClusterCache.test_connection=   s*    )	/1 "..335N*..CM35%!(()<t)<= & 4;33 /3AL
 !- 1 1 33K %%''''I  'B  4 (  	7  #I#a&!RS">s1vhGQ 		se   DA?B0 B,B0 B.
B0 &D'B0 +D,B0 .B0 0	D9=C<6D7D<DD)__name__
__module____qualname__r   r%   r   rB   r   r,   r/   dictrI   __classcell__)r   s   @r   r   r      sS    L
 ;d3i ;DI ;J$s) JS	 J0t 0r   r   N)__doc__typingr   r   r   r   r   litellm.caching.redis_cacher   opentelemetry.tracer	   _Spanr   r
   r   redis.asyncio.clientr   pipelineasync_redis_clientr   r   r   r   <module>rW      sX    = < 211-HDHDS
 Sr   