@@ -243,127 +243,3 @@ async def __aenter__(self):
243243 async def __aexit__ (self , exc_type , exc_val , exc_tb ):
244244 """Async context manager exit."""
245245 await self .close ()
246-
247-
248- class RedisSessionManager :
249- """Manager class for Redis sessions with connection pooling."""
250-
251- def __init__ (
252- self ,
253- redis_url : str = "redis://localhost:6379" ,
254- db : int = 0 ,
255- session_prefix : str = "agent_session" ,
256- messages_prefix : str = "agent_messages" ,
257- default_ttl : int | None = None ,
258- max_connections : int = 10 ,
259- ):
260- """Initialize the Redis session manager.
261-
262- Args:
263- redis_url: Redis connection URL
264- db: Redis database number
265- session_prefix: Prefix for session metadata keys
266- messages_prefix: Prefix for message list keys
267- default_ttl: Default TTL for sessions in seconds
268- max_connections: Maximum number of Redis connections in the pool
269- """
270- self .redis_url = redis_url
271- self .db = db
272- self .session_prefix = session_prefix
273- self .messages_prefix = messages_prefix
274- self .default_ttl = default_ttl
275-
276- self ._redis_pool = redis .ConnectionPool .from_url (
277- redis_url ,
278- db = db ,
279- max_connections = max_connections ,
280- decode_responses = True ,
281- )
282-
283- def get_session (
284- self ,
285- session_id : str ,
286- ttl : int | None = None ,
287- ) -> RedisSession :
288- """Get a Redis session instance.
289-
290- Args:
291- session_id: Unique identifier for the session
292- ttl: TTL for this session. If None, uses default_ttl
293-
294- Returns:
295- RedisSession instance
296- """
297- session = RedisSession (
298- session_id = session_id ,
299- redis_url = self .redis_url ,
300- db = self .db ,
301- session_prefix = self .session_prefix ,
302- messages_prefix = self .messages_prefix ,
303- ttl = ttl or self .default_ttl ,
304- )
305-
306- # Share the connection pool
307- session ._redis_client = redis .Redis (connection_pool = self ._redis_pool )
308-
309- return session
310-
311- async def list_sessions (self , pattern : str | None = None ) -> list [str ]:
312- """List all session IDs.
313-
314- Args:
315- pattern: Optional pattern to filter session IDs
316-
317- Returns:
318- List of session IDs
319- """
320- client = redis .Redis (connection_pool = self ._redis_pool )
321-
322- if pattern :
323- search_pattern = f"{ self .session_prefix } :{ pattern } "
324- else :
325- search_pattern = f"{ self .session_prefix } :*"
326-
327- keys = await client .keys (search_pattern )
328-
329- # Extract session IDs from keys
330- session_ids = []
331- prefix_len = len (self .session_prefix ) + 1 # +1 for the colon
332-
333- for key in keys :
334- session_id = key [prefix_len :]
335- session_ids .append (session_id )
336-
337- await client .aclose ()
338- return session_ids
339-
340- async def delete_session (self , session_id : str ) -> bool :
341- """Delete a session and all its data.
342-
343- Args:
344- session_id: Session ID to delete
345-
346- Returns:
347- True if session was deleted, False if it didn't exist
348- """
349- client = redis .Redis (connection_pool = self ._redis_pool )
350-
351- session_key = f"{ self .session_prefix } :{ session_id } "
352- messages_key = f"{ self .messages_prefix } :{ session_id } "
353-
354- deleted_count : int = await client .delete (session_key , messages_key )
355- await client .aclose ()
356-
357- return deleted_count > 0
358-
359- async def close (self ) -> None :
360- """Close the connection pool."""
361- await self ._redis_pool .aclose ()
362-
363- async def __aenter__ (self ):
364- """Async context manager entry."""
365- return self
366-
367- async def __aexit__ (self , exc_type , exc_val , exc_tb ):
368- """Async context manager exit."""
369- await self .close ()
0 commit comments