From 2bcb57e7f9bd6d9d01acd244468eb72242b70045 Mon Sep 17 00:00:00 2001 From: Giles Odigwe Date: Wed, 18 Feb 2026 01:10:09 -0800 Subject: [PATCH 1/4] Fix Redis samples: add sessions, use configurable URL, fix API changes - Add explicit session creation and pass session to agent.run() calls so Redis context provider can properly scope storage/retrieval - Replace hardcoded redis://localhost:6379 URLs with REDIS_URL env var - Fix alpha -> linear_alpha parameter rename in HybridQuery - Fix SessionContext usage to use input_messages constructor param - Remove obsolete scope_to_per_operation_thread_id parameter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../_context_provider.py | 2 +- .../redis/azure_redis_conversation.py | 15 ++++++---- .../context_providers/redis/redis_basics.py | 30 +++++++++++-------- .../redis/redis_conversation.py | 15 ++++++---- .../context_providers/redis/redis_sessions.py | 15 +++++----- 5 files changed, 44 insertions(+), 33 deletions(-) diff --git a/python/packages/redis/agent_framework_redis/_context_provider.py b/python/packages/redis/agent_framework_redis/_context_provider.py index e44ecbe489..c6de176470 100644 --- a/python/packages/redis/agent_framework_redis/_context_provider.py +++ b/python/packages/redis/agent_framework_redis/_context_provider.py @@ -374,7 +374,7 @@ async def _redis_search( vector_field_name=self.vector_field_name, text_scorer=text_scorer, filter_expression=combined_filter, - alpha=alpha, + linear_alpha=alpha, dtype=self.redis_vectorizer.dtype, num_results=num_results, return_fields=return_fields, diff --git a/python/samples/02-agents/context_providers/redis/azure_redis_conversation.py b/python/samples/02-agents/context_providers/redis/azure_redis_conversation.py index d5e3bd6f8e..71780067c4 100644 --- a/python/samples/02-agents/context_providers/redis/azure_redis_conversation.py +++ b/python/samples/02-agents/context_providers/redis/azure_redis_conversation.py @@ -86,35 +86,38 @@ async def main() -> None: context_providers=[history_provider], ) + # Use a fixed session ID so Redis history persists across separate program runs + session = agent.create_session(session_id="redis-demo-session") + # Conversation query = "Remember that I enjoy gumbo" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) # Ask the agent to recall the stored preference; it should retrieve from memory query = "What do I enjoy?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "What did I say to you just now?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "Remember that I have a meeting at 3pm tomorrow" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "Tulips are red" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "What was the first thing I said to you this conversation?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) diff --git a/python/samples/02-agents/context_providers/redis/redis_basics.py b/python/samples/02-agents/context_providers/redis/redis_basics.py index 079108bd15..997573180a 100644 --- a/python/samples/02-agents/context_providers/redis/redis_basics.py +++ b/python/samples/02-agents/context_providers/redis/redis_basics.py @@ -37,6 +37,10 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + # NOTE: approval_mode="never_require" is for sample brevity. # Use "always_require" in production; see samples/02-agents/tools/function_tool_with_approval.py @@ -121,14 +125,14 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) # The provider manages persistence and retrieval. application_id/agent_id/user_id # scope data for multi-tenant separation; thread_id (set later) narrows to a # specific conversation. provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_basics", application_id="matrix_of_kermits", agent_id="agent_kermit", @@ -151,16 +155,14 @@ async def main() -> None: from agent_framework import AgentSession, SessionContext session = AgentSession(session_id="runA") - context = SessionContext() - context.extend_messages("input", messages) + context = SessionContext(input_messages=messages) state = session.state # Store messages via after_run await provider.after_run(agent=None, session=session, context=context, state=state) # Retrieve relevant memories via before_run - query_context = SessionContext() - query_context.extend_messages("input", [Message("system", ["B: Assistant Message"])]) + query_context = SessionContext(input_messages=[Message("system", ["B: Assistant Message"])]) await provider.before_run(agent=None, session=session, context=query_context, state=state) # Inspect retrieved memories that would be injected into instructions @@ -179,12 +181,12 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) # Recreate a clean index so the next scenario starts fresh provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_basics_2", prefix="context_2", application_id="matrix_of_kermits", @@ -211,14 +213,15 @@ async def main() -> None: ) # Teach a user preference; the agent writes this to the provider's memory + session = agent.create_session(session_id="basics-session-2") query = "Remember that I enjoy glugenflorgle" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) # Ask the agent to recall the stored preference; it should retrieve from memory query = "What do I enjoy?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) @@ -232,7 +235,7 @@ async def main() -> None: # Text-only provider (full-text search only). Omits vectorizer and related params. provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_basics_3", prefix="context_3", application_id="matrix_of_kermits", @@ -253,13 +256,14 @@ async def main() -> None: context_providers=[provider], ) # Invoke the tool; outputs become part of memory/context + session = agent.create_session(session_id="basics-session-3") query = "Are there any flights from new york city (jfk) to la? Give me details" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) # Verify the agent can recall tool-derived context query = "Which flight did I ask about?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) diff --git a/python/samples/02-agents/context_providers/redis/redis_conversation.py b/python/samples/02-agents/context_providers/redis/redis_conversation.py index f25dbbbe52..792ba8c8f0 100644 --- a/python/samples/02-agents/context_providers/redis/redis_conversation.py +++ b/python/samples/02-agents/context_providers/redis/redis_conversation.py @@ -69,35 +69,38 @@ async def main() -> None: context_providers=[provider], ) + # Create a session so the provider can scope storage/retrieval to this conversation + session = agent.create_session(session_id="redis-conversation-session") + # Teach a user preference; the agent writes this to the provider's memory query = "Remember that I enjoy gumbo" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) # Ask the agent to recall the stored preference; it should retrieve from memory query = "What do I enjoy?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "What did I say to you just now?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "Remember that I have a meeting at 3pm tomorro" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "Tulips are red" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) query = "What was the first thing I said to you this conversation?" - result = await agent.run(query) + result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) # Drop / delete the provider index in Redis diff --git a/python/samples/02-agents/context_providers/redis/redis_sessions.py b/python/samples/02-agents/context_providers/redis/redis_sessions.py index aa1b7501f8..ba0b048e5d 100644 --- a/python/samples/02-agents/context_providers/redis/redis_sessions.py +++ b/python/samples/02-agents/context_providers/redis/redis_sessions.py @@ -62,7 +62,6 @@ async def example_global_thread_scope() -> None: application_id="threads_demo_app", agent_id="threads_demo_agent", user_id="threads_demo_user", - scope_to_per_operation_thread_id=False, # Share memories across all sessions ) agent = client.as_agent( @@ -76,9 +75,10 @@ async def example_global_thread_scope() -> None: ) # Store a preference in the global scope + session = agent.create_session(session_id="global-scope-session") query = "Remember that I prefer technical responses with code examples when discussing programming." print(f"User: {query}") - result = await agent.run(query) + result = await agent.run(query, session=session) print(f"Agent: {result}\n") # Create a new session - memories should still be accessible due to global scope @@ -118,7 +118,6 @@ async def example_per_operation_thread_scope() -> None: application_id="threads_demo_app", agent_id="threads_demo_agent", user_id="threads_demo_user", - scope_to_per_operation_thread_id=True, # Isolate memories per session redis_vectorizer=vectorizer, vector_field_name="vector", vector_algorithm="hnsw", @@ -214,25 +213,27 @@ async def example_multiple_agents() -> None: ) # Store personal information + personal_session = personal_agent.create_session(session_id="personal-session") query = "Remember that I like to exercise at 6 AM and prefer outdoor activities." print(f"User to Personal Agent: {query}") - result = await personal_agent.run(query) + result = await personal_agent.run(query, session=personal_session) print(f"Personal Agent: {result}\n") # Store work information + work_session = work_agent.create_session(session_id="work-session") query = "Remember that I have team meetings every Tuesday at 2 PM." print(f"User to Work Agent: {query}") - result = await work_agent.run(query) + result = await work_agent.run(query, session=work_session) print(f"Work Agent: {result}\n") # Test memory isolation query = "What do you know about my schedule?" print(f"User to Personal Agent: {query}") - result = await personal_agent.run(query) + result = await personal_agent.run(query, session=personal_session) print(f"Personal Agent: {result}\n") print(f"User to Work Agent: {query}") - result = await work_agent.run(query) + result = await work_agent.run(query, session=work_session) print(f"Work Agent: {result}\n") # Clean up the Redis index (shared) From bfa2949c965d6e45e5d12be6475d29e5a3cccb6e Mon Sep 17 00:00:00 2001 From: Giles Odigwe Date: Wed, 18 Feb 2026 08:39:22 -0800 Subject: [PATCH 2/4] Replace hardcoded Redis URLs with configurable REDIS_URL env var in all Redis samples All Redis samples now use REDIS_URL environment variable (defaults to redis://localhost:6379) instead of hardcoded URLs. This makes it easy to point samples at remote or authenticated Redis instances. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../redis/redis_conversation.py | 10 +++++++--- .../context_providers/redis/redis_sessions.py | 16 ++++++++++------ .../redis_chat_message_store_session.py | 14 +++++++++----- .../sessions/redis/redis_basics.py | 14 +++++++++----- .../sessions/redis/redis_conversation.py | 8 ++++++-- .../sessions/redis/redis_sessions.py | 16 ++++++++++------ .../sessions/redis_history_provider.py | 14 +++++++++----- 7 files changed, 60 insertions(+), 32 deletions(-) diff --git a/python/samples/02-agents/context_providers/redis/redis_conversation.py b/python/samples/02-agents/context_providers/redis/redis_conversation.py index 792ba8c8f0..eb20061d5a 100644 --- a/python/samples/02-agents/context_providers/redis/redis_conversation.py +++ b/python/samples/02-agents/context_providers/redis/redis_conversation.py @@ -23,6 +23,10 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + async def main() -> None: """Walk through provider and chat message store usage. @@ -34,12 +38,12 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_conversation", prefix="redis_conversation", application_id="matrix_of_kermits", @@ -89,7 +93,7 @@ async def main() -> None: print("User: ", query) print("Agent: ", result) - query = "Remember that I have a meeting at 3pm tomorro" + query = "Remember that I have a meeting at 3pm tomorrow" result = await agent.run(query, session=session) print("User: ", query) print("Agent: ", result) diff --git a/python/samples/02-agents/context_providers/redis/redis_sessions.py b/python/samples/02-agents/context_providers/redis/redis_sessions.py index ba0b048e5d..c2ef11f253 100644 --- a/python/samples/02-agents/context_providers/redis/redis_sessions.py +++ b/python/samples/02-agents/context_providers/redis/redis_sessions.py @@ -35,6 +35,10 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + # Please set OPENAI_API_KEY to use the OpenAI vectorizer. # For chat responses, also set AZURE_AI_PROJECT_ENDPOINT and AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME. @@ -57,7 +61,7 @@ async def example_global_thread_scope() -> None: provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_global", application_id="threads_demo_app", agent_id="threads_demo_agent", @@ -106,12 +110,12 @@ async def example_per_operation_thread_scope() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_dynamic", # overwrite_redis_index=True, # drop_redis_index=True, @@ -171,12 +175,12 @@ async def example_multiple_agents() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) personal_provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_agents", application_id="threads_demo_app", agent_id="agent_personal", @@ -195,7 +199,7 @@ async def example_multiple_agents() -> None: work_provider = RedisContextProvider( source_id="redis_context", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_agents", application_id="threads_demo_app", agent_id="agent_work", diff --git a/python/samples/02-agents/conversations/redis_chat_message_store_session.py b/python/samples/02-agents/conversations/redis_chat_message_store_session.py index f54edd8170..141edc37c4 100644 --- a/python/samples/02-agents/conversations/redis_chat_message_store_session.py +++ b/python/samples/02-agents/conversations/redis_chat_message_store_session.py @@ -8,6 +8,10 @@ from agent_framework.openai import OpenAIChatClient from agent_framework.redis import RedisHistoryProvider +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + """ Redis History Provider Session Example @@ -24,7 +28,7 @@ async def example_manual_memory_store() -> None: # Create Redis history provider redis_provider = RedisHistoryProvider( source_id="redis_basic_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) # Create agent with Redis history provider @@ -62,7 +66,7 @@ async def example_user_session_management() -> None: # Create Redis history provider for specific user session redis_provider = RedisHistoryProvider( source_id=f"redis_{user_id}", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, max_messages=10, # Keep only last 10 messages ) @@ -103,7 +107,7 @@ async def example_conversation_persistence() -> None: print("--- Phase 1: Starting conversation ---") redis_provider = RedisHistoryProvider( source_id="redis_persistent_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) agent = OpenAIChatClient().as_agent( @@ -152,7 +156,7 @@ async def example_session_serialization() -> None: redis_provider = RedisHistoryProvider( source_id="redis_serialization_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) agent = OpenAIChatClient().as_agent( @@ -194,7 +198,7 @@ async def example_message_limits() -> None: # Create provider with small message limit redis_provider = RedisHistoryProvider( source_id="redis_limited_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, max_messages=3, # Keep only 3 most recent messages ) diff --git a/python/samples/getting_started/sessions/redis/redis_basics.py b/python/samples/getting_started/sessions/redis/redis_basics.py index 5f78d65320..191053b1dd 100644 --- a/python/samples/getting_started/sessions/redis/redis_basics.py +++ b/python/samples/getting_started/sessions/redis/redis_basics.py @@ -36,6 +36,10 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + # NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production; see samples/02-agents/tools/function_tool_with_approval.py and samples/02-agents/tools/function_tool_with_approval_and_sessions.py. @tool(approval_mode="never_require") @@ -109,13 +113,13 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) # The provider manages persistence and retrieval. application_id/agent_id/user_id # scope data for multi-tenant separation; thread_id (set later) narrows to a # specific conversation. provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_basics", application_id="matrix_of_kermits", agent_id="agent_kermit", @@ -166,11 +170,11 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) # Recreate a clean index so the next scenario starts fresh provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_basics_2", prefix="context_2", application_id="matrix_of_kermits", @@ -217,7 +221,7 @@ async def main() -> None: print("-" * 40) # Text-only provider (full-text search only). Omits vectorizer and related params. provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_basics_3", prefix="context_3", application_id="matrix_of_kermits", diff --git a/python/samples/getting_started/sessions/redis/redis_conversation.py b/python/samples/getting_started/sessions/redis/redis_conversation.py index 2d345d9930..ee676355ba 100644 --- a/python/samples/getting_started/sessions/redis/redis_conversation.py +++ b/python/samples/getting_started/sessions/redis/redis_conversation.py @@ -22,6 +22,10 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + async def main() -> None: """Walk through provider and chat message store usage. @@ -33,13 +37,13 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) session_id = "test_session" provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_conversation", prefix="redis_conversation", application_id="matrix_of_kermits", diff --git a/python/samples/getting_started/sessions/redis/redis_sessions.py b/python/samples/getting_started/sessions/redis/redis_sessions.py index 34179048d9..0b3e3d2faf 100644 --- a/python/samples/getting_started/sessions/redis/redis_sessions.py +++ b/python/samples/getting_started/sessions/redis/redis_sessions.py @@ -35,6 +35,10 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + # Please set the OPENAI_API_KEY and OPENAI_CHAT_MODEL_ID environment variables to use the OpenAI vectorizer # Recommend default for OPENAI_CHAT_MODEL_ID is gpt-4o-mini @@ -52,7 +56,7 @@ async def example_global_thread_scope() -> None: ) provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_global", application_id="threads_demo_app", agent_id="threads_demo_agent", @@ -105,11 +109,11 @@ async def example_per_operation_thread_scope() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_dynamic", # overwrite_redis_index=True, # drop_redis_index=True, @@ -173,11 +177,11 @@ async def example_multiple_agents() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), ) personal_provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_agents", application_id="threads_demo_app", agent_id="agent_personal", @@ -195,7 +199,7 @@ async def example_multiple_agents() -> None: ) work_provider = RedisContextProvider( - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, index_name="redis_threads_agents", application_id="threads_demo_app", agent_id="agent_work", diff --git a/python/samples/getting_started/sessions/redis_history_provider.py b/python/samples/getting_started/sessions/redis_history_provider.py index f54edd8170..141edc37c4 100644 --- a/python/samples/getting_started/sessions/redis_history_provider.py +++ b/python/samples/getting_started/sessions/redis_history_provider.py @@ -8,6 +8,10 @@ from agent_framework.openai import OpenAIChatClient from agent_framework.redis import RedisHistoryProvider +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + """ Redis History Provider Session Example @@ -24,7 +28,7 @@ async def example_manual_memory_store() -> None: # Create Redis history provider redis_provider = RedisHistoryProvider( source_id="redis_basic_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) # Create agent with Redis history provider @@ -62,7 +66,7 @@ async def example_user_session_management() -> None: # Create Redis history provider for specific user session redis_provider = RedisHistoryProvider( source_id=f"redis_{user_id}", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, max_messages=10, # Keep only last 10 messages ) @@ -103,7 +107,7 @@ async def example_conversation_persistence() -> None: print("--- Phase 1: Starting conversation ---") redis_provider = RedisHistoryProvider( source_id="redis_persistent_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) agent = OpenAIChatClient().as_agent( @@ -152,7 +156,7 @@ async def example_session_serialization() -> None: redis_provider = RedisHistoryProvider( source_id="redis_serialization_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) agent = OpenAIChatClient().as_agent( @@ -194,7 +198,7 @@ async def example_message_limits() -> None: # Create provider with small message limit redis_provider = RedisHistoryProvider( source_id="redis_limited_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, max_messages=3, # Keep only 3 most recent messages ) From 0b77570e5ce298272449f0251aab466e0768bc5c Mon Sep 17 00:00:00 2001 From: Giles Odigwe Date: Wed, 18 Feb 2026 08:43:25 -0800 Subject: [PATCH 3/4] Revert REDIS_URL changes outside context_providers/redis samples Only the 4 samples in 02-agents/context_providers/redis/ should have the REDIS_URL env var change. Reverting the other files. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../redis_chat_message_store_session.py | 14 +++++--------- .../sessions/redis/redis_basics.py | 14 +++++--------- .../sessions/redis/redis_conversation.py | 8 ++------ .../sessions/redis/redis_sessions.py | 16 ++++++---------- .../sessions/redis_history_provider.py | 14 +++++--------- 5 files changed, 23 insertions(+), 43 deletions(-) diff --git a/python/samples/02-agents/conversations/redis_chat_message_store_session.py b/python/samples/02-agents/conversations/redis_chat_message_store_session.py index 141edc37c4..f54edd8170 100644 --- a/python/samples/02-agents/conversations/redis_chat_message_store_session.py +++ b/python/samples/02-agents/conversations/redis_chat_message_store_session.py @@ -8,10 +8,6 @@ from agent_framework.openai import OpenAIChatClient from agent_framework.redis import RedisHistoryProvider -# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). -# Override via the REDIS_URL environment variable for remote or authenticated instances. -REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") - """ Redis History Provider Session Example @@ -28,7 +24,7 @@ async def example_manual_memory_store() -> None: # Create Redis history provider redis_provider = RedisHistoryProvider( source_id="redis_basic_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", ) # Create agent with Redis history provider @@ -66,7 +62,7 @@ async def example_user_session_management() -> None: # Create Redis history provider for specific user session redis_provider = RedisHistoryProvider( source_id=f"redis_{user_id}", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", max_messages=10, # Keep only last 10 messages ) @@ -107,7 +103,7 @@ async def example_conversation_persistence() -> None: print("--- Phase 1: Starting conversation ---") redis_provider = RedisHistoryProvider( source_id="redis_persistent_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", ) agent = OpenAIChatClient().as_agent( @@ -156,7 +152,7 @@ async def example_session_serialization() -> None: redis_provider = RedisHistoryProvider( source_id="redis_serialization_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", ) agent = OpenAIChatClient().as_agent( @@ -198,7 +194,7 @@ async def example_message_limits() -> None: # Create provider with small message limit redis_provider = RedisHistoryProvider( source_id="redis_limited_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", max_messages=3, # Keep only 3 most recent messages ) diff --git a/python/samples/getting_started/sessions/redis/redis_basics.py b/python/samples/getting_started/sessions/redis/redis_basics.py index 191053b1dd..5f78d65320 100644 --- a/python/samples/getting_started/sessions/redis/redis_basics.py +++ b/python/samples/getting_started/sessions/redis/redis_basics.py @@ -36,10 +36,6 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer -# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). -# Override via the REDIS_URL environment variable for remote or authenticated instances. -REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") - # NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production; see samples/02-agents/tools/function_tool_with_approval.py and samples/02-agents/tools/function_tool_with_approval_and_sessions.py. @tool(approval_mode="never_require") @@ -113,13 +109,13 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), ) # The provider manages persistence and retrieval. application_id/agent_id/user_id # scope data for multi-tenant separation; thread_id (set later) narrows to a # specific conversation. provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_basics", application_id="matrix_of_kermits", agent_id="agent_kermit", @@ -170,11 +166,11 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), ) # Recreate a clean index so the next scenario starts fresh provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_basics_2", prefix="context_2", application_id="matrix_of_kermits", @@ -221,7 +217,7 @@ async def main() -> None: print("-" * 40) # Text-only provider (full-text search only). Omits vectorizer and related params. provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_basics_3", prefix="context_3", application_id="matrix_of_kermits", diff --git a/python/samples/getting_started/sessions/redis/redis_conversation.py b/python/samples/getting_started/sessions/redis/redis_conversation.py index ee676355ba..2d345d9930 100644 --- a/python/samples/getting_started/sessions/redis/redis_conversation.py +++ b/python/samples/getting_started/sessions/redis/redis_conversation.py @@ -22,10 +22,6 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer -# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). -# Override via the REDIS_URL environment variable for remote or authenticated instances. -REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") - async def main() -> None: """Walk through provider and chat message store usage. @@ -37,13 +33,13 @@ async def main() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), ) session_id = "test_session" provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_conversation", prefix="redis_conversation", application_id="matrix_of_kermits", diff --git a/python/samples/getting_started/sessions/redis/redis_sessions.py b/python/samples/getting_started/sessions/redis/redis_sessions.py index 0b3e3d2faf..34179048d9 100644 --- a/python/samples/getting_started/sessions/redis/redis_sessions.py +++ b/python/samples/getting_started/sessions/redis/redis_sessions.py @@ -35,10 +35,6 @@ from redisvl.extensions.cache.embeddings import EmbeddingsCache from redisvl.utils.vectorize import OpenAITextVectorizer -# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). -# Override via the REDIS_URL environment variable for remote or authenticated instances. -REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") - # Please set the OPENAI_API_KEY and OPENAI_CHAT_MODEL_ID environment variables to use the OpenAI vectorizer # Recommend default for OPENAI_CHAT_MODEL_ID is gpt-4o-mini @@ -56,7 +52,7 @@ async def example_global_thread_scope() -> None: ) provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_threads_global", application_id="threads_demo_app", agent_id="threads_demo_agent", @@ -109,11 +105,11 @@ async def example_per_operation_thread_scope() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), ) provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_threads_dynamic", # overwrite_redis_index=True, # drop_redis_index=True, @@ -177,11 +173,11 @@ async def example_multiple_agents() -> None: vectorizer = OpenAITextVectorizer( model="text-embedding-ada-002", api_config={"api_key": os.getenv("OPENAI_API_KEY")}, - cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL), + cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url="redis://localhost:6379"), ) personal_provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_threads_agents", application_id="threads_demo_app", agent_id="agent_personal", @@ -199,7 +195,7 @@ async def example_multiple_agents() -> None: ) work_provider = RedisContextProvider( - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", index_name="redis_threads_agents", application_id="threads_demo_app", agent_id="agent_work", diff --git a/python/samples/getting_started/sessions/redis_history_provider.py b/python/samples/getting_started/sessions/redis_history_provider.py index 141edc37c4..f54edd8170 100644 --- a/python/samples/getting_started/sessions/redis_history_provider.py +++ b/python/samples/getting_started/sessions/redis_history_provider.py @@ -8,10 +8,6 @@ from agent_framework.openai import OpenAIChatClient from agent_framework.redis import RedisHistoryProvider -# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). -# Override via the REDIS_URL environment variable for remote or authenticated instances. -REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") - """ Redis History Provider Session Example @@ -28,7 +24,7 @@ async def example_manual_memory_store() -> None: # Create Redis history provider redis_provider = RedisHistoryProvider( source_id="redis_basic_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", ) # Create agent with Redis history provider @@ -66,7 +62,7 @@ async def example_user_session_management() -> None: # Create Redis history provider for specific user session redis_provider = RedisHistoryProvider( source_id=f"redis_{user_id}", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", max_messages=10, # Keep only last 10 messages ) @@ -107,7 +103,7 @@ async def example_conversation_persistence() -> None: print("--- Phase 1: Starting conversation ---") redis_provider = RedisHistoryProvider( source_id="redis_persistent_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", ) agent = OpenAIChatClient().as_agent( @@ -156,7 +152,7 @@ async def example_session_serialization() -> None: redis_provider = RedisHistoryProvider( source_id="redis_serialization_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", ) agent = OpenAIChatClient().as_agent( @@ -198,7 +194,7 @@ async def example_message_limits() -> None: # Create provider with small message limit redis_provider = RedisHistoryProvider( source_id="redis_limited_chat", - redis_url=REDIS_URL, + redis_url="redis://localhost:6379", max_messages=3, # Keep only 3 most recent messages ) From e46febf81bb8963d1533f50166a7201ae0f8b0ae Mon Sep 17 00:00:00 2001 From: Giles Odigwe Date: Wed, 18 Feb 2026 09:12:29 -0800 Subject: [PATCH 4/4] fix redis chat message store sample --- .../redis_chat_message_store_session.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/python/samples/02-agents/conversations/redis_chat_message_store_session.py b/python/samples/02-agents/conversations/redis_chat_message_store_session.py index f54edd8170..7224f5ea9a 100644 --- a/python/samples/02-agents/conversations/redis_chat_message_store_session.py +++ b/python/samples/02-agents/conversations/redis_chat_message_store_session.py @@ -8,6 +8,10 @@ from agent_framework.openai import OpenAIChatClient from agent_framework.redis import RedisHistoryProvider +# Default Redis URL for local Redis Stack (docker run -d -p 6379:6379 redis/redis-stack:latest). +# Override via the REDIS_URL environment variable for remote or authenticated instances. +REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379") + """ Redis History Provider Session Example @@ -24,7 +28,7 @@ async def example_manual_memory_store() -> None: # Create Redis history provider redis_provider = RedisHistoryProvider( source_id="redis_basic_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) # Create agent with Redis history provider @@ -62,7 +66,7 @@ async def example_user_session_management() -> None: # Create Redis history provider for specific user session redis_provider = RedisHistoryProvider( source_id=f"redis_{user_id}", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, max_messages=10, # Keep only last 10 messages ) @@ -103,7 +107,7 @@ async def example_conversation_persistence() -> None: print("--- Phase 1: Starting conversation ---") redis_provider = RedisHistoryProvider( source_id="redis_persistent_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) agent = OpenAIChatClient().as_agent( @@ -152,7 +156,7 @@ async def example_session_serialization() -> None: redis_provider = RedisHistoryProvider( source_id="redis_serialization_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, ) agent = OpenAIChatClient().as_agent( @@ -194,7 +198,7 @@ async def example_message_limits() -> None: # Create provider with small message limit redis_provider = RedisHistoryProvider( source_id="redis_limited_chat", - redis_url="redis://localhost:6379", + redis_url=REDIS_URL, max_messages=3, # Keep only 3 most recent messages ) @@ -229,7 +233,7 @@ async def main() -> None: print("Redis History Provider Examples") print("=" * 50) print("Prerequisites:") - print("- Redis server running on localhost:6379") + print(f"- Redis server running on {REDIS_URL}") print("- OPENAI_API_KEY environment variable set") print("=" * 50)