diff --git a/src/agents/extensions/memory/redis_session.py b/src/agents/extensions/memory/redis_session.py index d07809934a..43b39334b2 100644 --- a/src/agents/extensions/memory/redis_session.py +++ b/src/agents/extensions/memory/redis_session.py @@ -25,7 +25,7 @@ import json import time from dataclasses import dataclass -from typing import Any +from typing import Any, cast from ._optional_imports import raise_optional_dependency_error @@ -675,7 +675,7 @@ async def _decode_messages(raw_messages: list[Any]) -> list[TResponseInputItem]: self._check_not_closed() if session_limit is None: # Get all messages in chronological order - raw_messages = await self._redis.lrange(self._messages_key, 0, -1) # type: ignore[misc] # Redis library returns Union[Awaitable[T], T] in async context + raw_messages = await self._redis.lrange(self._messages_key, 0, -1) return await _decode_messages(raw_messages) if session_limit <= 0: @@ -687,7 +687,7 @@ async def _decode_messages(raw_messages: list[Any]) -> list[TResponseInputItem]: # limit counts valid conversation items, matching pop_item and the other backends. window = session_limit while True: - raw_messages = await self._redis.lrange(self._messages_key, -window, -1) # type: ignore[misc] # Redis library returns Union[Awaitable[T], T] in async context + raw_messages = await self._redis.lrange(self._messages_key, -window, -1) items = await _decode_messages(raw_messages) if len(items) >= session_limit: return items[-session_limit:] @@ -743,8 +743,8 @@ async def pop_item(self) -> TResponseInputItem | None: async def _pop_item_locked(self) -> TResponseInputItem | None: """Claim one item while the caller retains the session lock.""" while True: - # Use RPOP to atomically remove and return the rightmost (most recent) item - raw_msg = await self._redis.rpop(self._messages_key) # type: ignore[misc] # Redis library returns Union[Awaitable[T], T] in async context + # Without a count, RPOP returns one item rather than a list of items. + raw_msg = cast("bytes | str | None", await self._redis.rpop(self._messages_key)) if raw_msg is None: return None @@ -823,7 +823,7 @@ async def ping(self) -> bool: # Checked outside the try block; the except clause below would swallow it. self._check_not_closed() try: - await self._redis.ping() # type: ignore[misc] # Redis library returns Union[Awaitable[T], T] in async context + await self._redis.ping() return True except Exception: return False diff --git a/tests/extensions/memory/test_redis_session.py b/tests/extensions/memory/test_redis_session.py index e9939de547..4876277837 100644 --- a/tests/extensions/memory/test_redis_session.py +++ b/tests/extensions/memory/test_redis_session.py @@ -835,7 +835,7 @@ async def test_external_client_not_closed(): # Should still be able to use the client for other operations await shared_client.set("test_key", "test_value") value = await shared_client.get("test_key") - assert value.decode("utf-8") == "test_value" + assert value == b"test_value" finally: # Clean up diff --git a/uv.lock b/uv.lock index 184e480d2e..e49aa44be8 100644 --- a/uv.lock +++ b/uv.lock @@ -3834,14 +3834,14 @@ wheels = [ [[package]] name = "redis" -version = "7.0.1" +version = "8.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/8f/f125feec0b958e8d22c8f0b492b30b1991d9499a4315dfde466cf4289edc/redis-7.0.1.tar.gz", hash = "sha256:c949df947dca995dc68fdf5a7863950bf6df24f8d6022394585acc98e81624f1", size = 4755322, upload-time = "2025-10-27T14:34:00.33Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/99/604f0b666d4c616d891cf77ebb9db6bb21601344c051aebf1b72b9ff915f/redis-8.1.0.tar.gz", hash = "sha256:6e1a19beef9225c83efd689c7e6b7da2d5215b1f42cd13b7fc3714d0a09c7b25", size = 5254356, upload-time = "2026-07-30T08:51:00.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/97/9f22a33c475cda519f20aba6babb340fb2f2254a02fb947816960d1e669a/redis-7.0.1-py3-none-any.whl", hash = "sha256:4977af3c7d67f8f0eb8b6fec0dafc9605db9343142f634041fb0235f67c0588a", size = 339938, upload-time = "2025-10-27T14:33:58.553Z" }, + { url = "https://files.pythonhosted.org/packages/66/9d/c5731f6e3608663d4d3656fd8d3aecee8b509c3082818f5a13eae925baea/redis-8.1.0-py3-none-any.whl", hash = "sha256:a4fe1aac3d3b3cc791d4b3d5931c5a956045dc951ee74d1c913ee3ac4d2ee9fb", size = 560618, upload-time = "2026-07-30T08:50:58.497Z" }, ] [[package]]