From 2417613b5f6fb7ff2a4aebf9f1cda8d75ad7246a Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Thu, 20 Aug 2026 16:24:20 -0700 Subject: [PATCH] refactor(redis): build the async auth kwargs instead of mutating them twice Both async entrypoints edited the kwargs dict in place with the same five lines. One shared transform returns the swapped copy instead. --- litellm/_redis.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/litellm/_redis.py b/litellm/_redis.py index e67dee0621d..ebbc191dfec 100644 --- a/litellm/_redis.py +++ b/litellm/_redis.py @@ -594,6 +594,18 @@ def _async_credential_provider(redis_connect_func: object | None) -> CredentialP return None +def _async_auth_kwargs(redis_kwargs: dict) -> dict: + """Swaps a connect func an async path cannot run for the equivalent credential provider, + which supersedes any static username or password redis-py would otherwise reject it with.""" + credential_provider: Final = _async_credential_provider(redis_kwargs.get("redis_connect_func")) + if credential_provider is None: + return redis_kwargs + + superseded: Final = frozenset({"redis_connect_func", "username", "password"}) + kept: Final = ((k, v) for k, v in redis_kwargs.items() if k not in superseded) + return dict(kept, credential_provider=credential_provider) # mutable-ok: the branches below mutate these kwargs + + def get_redis_client(**env_overrides): redis_kwargs: Final = _get_redis_client_logic(**env_overrides) @@ -620,12 +632,7 @@ def get_redis_async_client( connection_pool: async_redis.BlockingConnectionPool | None = None, **env_overrides, ) -> async_redis.Redis | async_redis.RedisCluster: - redis_kwargs: Final = _get_redis_client_logic(**env_overrides) - credential_provider: Final = _async_credential_provider(redis_kwargs.get("redis_connect_func")) - if credential_provider is not None: - redis_kwargs["credential_provider"] = credential_provider - for superseded in ("redis_connect_func", "username", "password"): - redis_kwargs.pop(superseded, None) + redis_kwargs: Final = _async_auth_kwargs(_get_redis_client_logic(**env_overrides)) if "startup_nodes" in redis_kwargs: from redis.cluster import ClusterNode @@ -688,12 +695,7 @@ def get_redis_async_client( def get_redis_connection_pool( **env_overrides, ) -> async_redis.BlockingConnectionPool | None: - redis_kwargs: Final = _get_redis_client_logic(**env_overrides) - credential_provider: Final = _async_credential_provider(redis_kwargs.get("redis_connect_func")) - if credential_provider is not None: - redis_kwargs["credential_provider"] = credential_provider - for superseded in ("redis_connect_func", "username", "password"): - redis_kwargs.pop(superseded, None) + redis_kwargs: Final = _async_auth_kwargs(_get_redis_client_logic(**env_overrides)) verbose_logger.debug("get_redis_connection_pool: redis_kwargs", redis_kwargs) if "startup_nodes" in redis_kwargs: