From 1ac68f65bffab18f8f46cd29bd1d29328c951ac8 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Mar 2026 17:34:35 -0800 Subject: [PATCH] Python: Fix RedisContextProvider for redisvl 0.14.0 by using AggregateHybridQuery (#3954) * Initial plan * Fix: Replace alpha with linear_alpha in HybridQuery for redisvl 0.14.0 compatibility Co-authored-by: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> * Address code review: Improve test readability and add explanatory comment Co-authored-by: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> * Add CHANGELOG entry for redisvl 0.14.0 compatibility fix Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Use AggregateHybridQuery instead of HybridQuery for backward compatibility Replace HybridQuery with AggregateHybridQuery to preserve existing functionality that works with older Redis versions. The new HybridQuery in redisvl 0.14.0 requires Redis 8.4.0+ and uses a different API, while AggregateHybridQuery maintains compatibility with the original implementation. Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Fix test to use linear_alpha parameter matching _redis_search implementation The test was passing alpha as a keyword argument to _redis_search(), but the method uses linear_alpha to match the redisvl 0.14.0 AggregateHybridQuery API. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix pyright error: use alpha parameter matching AggregateHybridQuery API AggregateHybridQuery expects 'alpha', not 'linear_alpha'. Updated the _redis_search method parameter and the test accordingly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> Co-authored-by: Ben Thomas Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- python/CHANGELOG.md | 4 ++ .../_context_provider.py | 8 ++-- python/packages/redis/tests/test_providers.py | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/python/CHANGELOG.md b/python/CHANGELOG.md index de085490cd..7ecab1b442 100644 --- a/python/CHANGELOG.md +++ b/python/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- **agent-framework-redis**: Fix `RedisContextProvider` compatibility with redisvl 0.14.0 by using `AggregateHybridQuery` ([#3954](https://github.com/microsoft/agent-framework/pull/3954)) + ## [1.0.0rc3] - 2026-03-04 ### Added diff --git a/python/packages/redis/agent_framework_redis/_context_provider.py b/python/packages/redis/agent_framework_redis/_context_provider.py index 32b6a6cc5d..98d5d9917f 100644 --- a/python/packages/redis/agent_framework_redis/_context_provider.py +++ b/python/packages/redis/agent_framework_redis/_context_provider.py @@ -22,7 +22,7 @@ from agent_framework.exceptions import ( IntegrationInvalidRequestException, ) from redisvl.index import AsyncSearchIndex -from redisvl.query import HybridQuery, TextQuery +from redisvl.query import AggregateHybridQuery, TextQuery from redisvl.query.filter import FilterExpression, Tag from redisvl.utils.token_escaper import TokenEscaper from redisvl.utils.vectorize import BaseVectorizer @@ -341,7 +341,7 @@ class RedisContextProvider(BaseContextProvider): filter_expression: Any | None = None, return_fields: list[str] | None = None, num_results: int = 10, - linear_alpha: float = 0.7, + alpha: float = 0.7, ) -> list[dict[str, Any]]: """Runs a text or hybrid vector-text search with optional filters.""" await self._ensure_index() @@ -371,14 +371,14 @@ class RedisContextProvider(BaseContextProvider): try: if self.redis_vectorizer and self.vector_field_name: vector = await self.redis_vectorizer.aembed(q) # pyright: ignore[reportUnknownMemberType] - query = HybridQuery( + query = AggregateHybridQuery( text=q, text_field_name="content", vector=vector, vector_field_name=self.vector_field_name, text_scorer=text_scorer, filter_expression=combined_filter, - linear_alpha=linear_alpha, + alpha=alpha, dtype=self.redis_vectorizer.dtype, # pyright: ignore[reportUnknownMemberType] num_results=num_results, return_fields=return_fields, diff --git a/python/packages/redis/tests/test_providers.py b/python/packages/redis/tests/test_providers.py index 67db227630..dd0ff51cd8 100644 --- a/python/packages/redis/tests/test_providers.py +++ b/python/packages/redis/tests/test_providers.py @@ -271,6 +271,44 @@ class TestRedisContextProviderContextManager: assert p is provider +class TestRedisContextProviderHybridQuery: + """Test for AggregateHybridQuery parameter compatibility with redisvl 0.14.0.""" + + async def test_aggregate_hybrid_query_uses_alpha( + self, + mock_index: AsyncMock, + patch_index_from_dict: MagicMock, # noqa: ARG002 - fixture modifies behavior via side effects + ): + """Ensure AggregateHybridQuery is called with alpha parameter.""" + from redisvl.utils.vectorize import BaseVectorizer + + # Create a mock vectorizer that inherits from BaseVectorizer + mock_vectorizer = MagicMock(spec=BaseVectorizer) + mock_vectorizer.dims = 128 + mock_vectorizer.dtype = "float32" + mock_vectorizer.aembed = AsyncMock(return_value=[0.1] * 128) + + mock_index.query = AsyncMock(return_value=[{"content": "test result"}]) + + provider = RedisContextProvider( + source_id="ctx", + user_id="u1", + redis_vectorizer=mock_vectorizer, + vector_field_name="embedding", + ) + + # Call _redis_search with custom alpha + with patch("agent_framework_redis._context_provider.AggregateHybridQuery") as mock_hybrid_query: + mock_hybrid_query.return_value = MagicMock() + await provider._redis_search(text="test query", alpha=0.5) + + # Verify AggregateHybridQuery was called with alpha parameter + mock_hybrid_query.assert_called_once() + call_kwargs = mock_hybrid_query.call_args.kwargs + assert "alpha" in call_kwargs + assert call_kwargs["alpha"] == 0.5 + + # =========================================================================== # RedisHistoryProvider tests # ===========================================================================