Files
microsoft--agent-framework/python/packages/redis
Chinmay V 3aadac53c8 Python: fix(redis): honour a max_messages retention limit of zero (#7470)
* Python: fix(redis): honour a max_messages retention limit of zero

RedisHistoryProvider documents None as the sentinel for unlimited storage,
so max_messages=0 must retain nothing. It retained everything: trimming to
-max_messages emits LTRIM key 0 -1, which is Redis's "keep the whole list",
and the count > max_messages guard is true for any non-empty list, so the
trim ran on every save and did nothing.

Negative values were worse than a no-op. max_messages=-5 emitted
LTRIM key 5 -1, deleting the five oldest messages on every save while the
list still grew without bound.

Handle a limit of zero by deleting the key, which is what clear() in this
class already does, and reject negative values in __init__ alongside the
three ValueErrors it already raises for invalid configuration. None and
positive limits are unchanged.

* Python: never write the payload when Redis retention is disabled

Addresses the automated review on #7470. With max_messages=0 the previous
change still RPUSHed every message and deleted the key afterwards, so the
payload reached Redis - and any AOF or replica stream - before being removed,
and was briefly visible to other readers. Short-circuit instead: drop any
existing history and return before serializing, so nothing is written at all.

Also documents the new ValueError in the Raises: section, and asserts in the
test that the pipeline is never used.

* Python: leave stored history alone when Redis retention is disabled

max_messages=0 deleted the session key. _redis_key omits source_id, so
two providers with the default prefix share {key_prefix}:{session_id},
and the after-run pass persists in reverse provider order - a
zero-retention provider listed first would drop a co-located provider's
just-written history on every turn.

Return before serializing instead: no payload reaches Redis, an AOF or a
replica, and stored history is left as it is. Removing stored history is
what clear() is for.

---------

Co-authored-by: Chinmay V <203952148+chinmayv095@users.noreply.github.com>
2026-08-13 00:44:20 +00:00
..

Get Started with Microsoft Agent Framework Redis

Please install this package via pip:

pip install agent-framework-redis --pre

Components

Memory Context Provider

The RedisContextProvider enables persistent context and memory capabilities for your agents, allowing them to remember user preferences and conversation context across sessions and threads.

Basic Usage Examples

Review the set of getting started examples for using the Redis context provider.

Redis History Provider

The RedisHistoryProvider provides persistent conversation storage using Redis Lists, enabling chat history to survive application restarts and support distributed applications.

Key Features

  • Persistent Storage: Messages survive application restarts
  • Thread Isolation: Each conversation thread has its own Redis key
  • Message Limits: Configurable automatic trimming of old messages
  • Serialization Support: Full compatibility with Agent Framework thread serialization
  • Production Ready: Connection pooling, error handling, and performance optimized

Basic Usage Examples

See the complete Redis history provider examples including:

  • User session management
  • Conversation persistence across restarts
  • Session serialization and deserialization
  • Automatic message trimming
  • Error handling patterns

Installing and running Redis

You have 3 options to set-up Redis:

Option A: Local Redis with Docker

docker run --name redis -p 6379:6379 -d redis:8.0.3

Option B: Redis Cloud

Get a free db at https://redis.io/cloud/

Option C: Azure Managed Redis

Here's a quickstart guide to create Azure Managed Redis for as low as $12 monthly: https://learn.microsoft.com/en-us/azure/redis/quickstart-create-managed-redis