diff --git a/docs/my-website/docs/proxy/caching.md b/docs/my-website/docs/proxy/caching.md index d81db5b93..3f5342c7e 100644 --- a/docs/my-website/docs/proxy/caching.md +++ b/docs/my-website/docs/proxy/caching.md @@ -136,6 +136,7 @@ litellm_settings: type: "redis" service_name: "mymaster" sentinel_nodes: [["localhost", 26379]] + sentinel_password: "password" # [OPTIONAL] ``` @@ -149,6 +150,7 @@ You can configure redis sentinel in your .env by setting `REDIS_SENTINEL_NODES` ```env REDIS_SENTINEL_NODES='[["localhost", 26379]]' REDIS_SERVICE_NAME = "mymaster" +REDIS_SENTINEL_PASSWORD = "password" ``` :::note diff --git a/litellm/_redis.py b/litellm/_redis.py index c058a0d3a..2fba9d146 100644 --- a/litellm/_redis.py +++ b/litellm/_redis.py @@ -12,13 +12,13 @@ import json # s/o [@Frank Colson](https://www.linkedin.com/in/frank-colson-422b9b183/) for this redis implementation import os -from typing import List, Optional, Union +from typing import Dict, List, Optional, Union import redis # type: ignore import redis.asyncio as async_redis # type: ignore import litellm -from litellm import get_secret +from litellm import get_secret, get_secret_str from ._logging import verbose_logger @@ -141,6 +141,13 @@ def _get_redis_client_logic(**env_overrides): if _sentinel_nodes is not None and isinstance(_sentinel_nodes, str): redis_kwargs["sentinel_nodes"] = json.loads(_sentinel_nodes) + _sentinel_password: Optional[str] = redis_kwargs.get( + "sentinel_password", None + ) or get_secret_str("REDIS_SENTINEL_PASSWORD") + + if _sentinel_password is not None: + redis_kwargs["sentinel_password"] = _sentinel_password + _service_name: Optional[str] = redis_kwargs.get("service_name", None) or get_secret( # type: ignore "REDIS_SERVICE_NAME" ) @@ -217,6 +224,7 @@ def _init_redis_sentinel(redis_kwargs) -> redis.Redis: def _init_async_redis_sentinel(redis_kwargs) -> async_redis.Redis: sentinel_nodes = redis_kwargs.get("sentinel_nodes") + sentinel_password = redis_kwargs.get("sentinel_password") service_name = redis_kwargs.get("service_name") if not sentinel_nodes or not service_name: @@ -227,7 +235,11 @@ def _init_async_redis_sentinel(redis_kwargs) -> async_redis.Redis: verbose_logger.debug("init_redis_sentinel: sentinel nodes are being initialized.") # Set up the Sentinel client - sentinel = async_redis.Sentinel(sentinel_nodes, socket_timeout=0.1) + sentinel = async_redis.Sentinel( + sentinel_nodes, + socket_timeout=0.1, + password=sentinel_password, + ) # Return the master instance for the given service