Ë
    uPêj.  ã                   óŠ   — d Z ddl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z  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ÚFinal)Ú
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      €úh/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/redis_cluster_cache.pyr   zRedisClusterCache.__init__   s%   ø€ Ü‰Ñ˜$Ð) &Ò)ØEIˆÔ-ØDHˆÕ,ó    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    sT   € Ý.å3à×0Ò0Ø×8Ñ8Ð8á5ÑvÀd×F`ÑF`ÐvÐdh×duÑduÑvˆÜ�m \Ô2Ø4AˆDÔ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_operation.   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_operation4   s1   è ø€ ð -1×,BÑ,BÓ,DÐ"Ø/×>Ñ>ÀDÐ>ÓI×IÐIÐIús   ‚&/¨-©/c              ƒ   ó<  K  — 	 ddl m}  |di | j                  ¤Ž}|j                  «       ƒ d{  –—† }|j	                  «       ƒ d{  –—†  |rdddœS dddœS 7 Œ(7 Œ# t
        $ r4}d	d
lm} |j                  d|«       dd|› �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   r   NÚsuccessz(Redis Cluster connection test successful)ÚstatusÚmessageÚfailedz!Redis Cluster ping returned Falser   )Úverbose_loggerz(Redis Cluster connection test failed: %sz!Redis Cluster connection failed: )r1   r2   Úerrorr   )
r   r   r!   ÚpingÚacloseÚ	ExceptionÚlitellm._loggingr4   r5   Ústr)r   r   r)   Úping_resultÚer4   s         r   Útest_connectionz!RedisClusterCache.test_connection;   s»   è ø€ ð	Ý7á"8Ñ"M¸4×;LÑ;LÑ"MˆLð (4×'8Ñ'8Ó':×!:ˆKð ×%Ñ%Ó'×'Ð'áà'ØIñð ð 'ØBñð ð ";øð (ùô ò 	Ý7à× Ñ Ð!KÈQÔOà"Ø>¸q¸cÐBÜ˜Q›ñõ ûð		üsb   ‚B„+A ¯A°A ÁAÁ
A ÁBÁA ÁBÁA ÁA Á	BÁ%)BÂBÂBÂBÂB)Ú__name__Ú
__module__Ú__qualname__r   r$   Úlistr:   r   r+   r.   Údictr=   Ú__classcell__)r   s   @r   r   r      sS   ø„ ôIò
ð;¨d°3©ið ;¸DÀ¹Ió ;ðJ¸$¸s¹)ð JÈÈSÉ	ó Jð$ t÷ $r   r   N)Ú__doc__Útypingr   r   r   Úlitellm.caching.redis_cacher   Úopentelemetry.tracer   Ú_Spanr   r   r	   Úredis.asyncio.clientr
   ÚpipelineÚasync_redis_clientr   r   r   r   ú<module>rL      sS   ðñ÷ -Ñ ,å 2áÝ1ß1Ý-à€HØÐØ�3‰;�Dà€HØÐØ€DôE˜
õ Er   