Skip to content

Commit 320ca15

Browse files
authored
fix(memory): apply config defaults in UpdateMemoryTool and fix event memory IDs (#17)
- UpdateMemoryTool now resolves namespace/user_id through _get_namespace and _get_user_id so configured default_namespace/default_owner_id/default_user_id are applied on the managed redis-agent-memory backend when the caller omits them - RedisLongTermMemoryService derives the events memory ID from event ids and timestamps instead of len(events), preventing collisions between distinct event batches of equal length - Type the backend constants as Literal and re-export REDIS_AGENT_MEMORY_BACKEND, OPENSOURCE_AGENT_MEMORY_BACKEND, and MemoryBackendName from adk_redis and adk_redis.memory - Use the public constants in examples and tests; add AGENT_MEMORY_* fallbacks for API key and store ID in the integration conftest
1 parent f1a67b1 commit 320ca15

15 files changed

Lines changed: 88 additions & 40 deletions

File tree

examples/managed_memory_quickstart/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@
2828
from google.adk.cli.service_registry import get_service_registry
2929
import uvicorn
3030

31+
from adk_redis import REDIS_AGENT_MEMORY_BACKEND
3132
from adk_redis.memory import RedisLongTermMemoryService
3233
from adk_redis.memory import RedisLongTermMemoryServiceConfig
3334
from adk_redis.sessions import RedisWorkingMemorySessionService
3435
from adk_redis.sessions import RedisWorkingMemorySessionServiceConfig
3536

3637
load_dotenv()
3738

38-
_BACKEND = "redis-agent-memory"
39+
_BACKEND = REDIS_AGENT_MEMORY_BACKEND
3940

4041

4142
def _api_base_url() -> str:

examples/simple_redis_memory/main.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from google.adk.cli.service_registry import get_service_registry
3333
import uvicorn
3434

35+
from adk_redis import OPENSOURCE_AGENT_MEMORY_BACKEND
3536
from adk_redis.memory import RedisLongTermMemoryService
3637
from adk_redis.memory import RedisLongTermMemoryServiceConfig
3738
from adk_redis.sessions import RedisWorkingMemorySessionService
@@ -55,7 +56,9 @@ def redis_session_factory(uri: str, **kwargs):
5556
"""Factory function for creating RedisWorkingMemorySessionService from URI."""
5657
base_url = parse_base_url(uri)
5758
config = RedisWorkingMemorySessionServiceConfig(
58-
backend=os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory"),
59+
backend=os.getenv(
60+
"REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND
61+
),
5962
api_base_url=base_url,
6063
api_key=os.getenv("AGENT_MEMORY_API_KEY"),
6164
store_id=os.getenv("AGENT_MEMORY_STORE_ID"),
@@ -73,7 +76,9 @@ def redis_memory_factory(uri: str, **kwargs):
7376
"""Factory function for creating RedisLongTermMemoryService from URI."""
7477
base_url = parse_base_url(uri)
7578
config = RedisLongTermMemoryServiceConfig(
76-
backend=os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory"),
79+
backend=os.getenv(
80+
"REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND
81+
),
7782
api_base_url=base_url,
7883
api_key=os.getenv("AGENT_MEMORY_API_KEY"),
7984
store_id=os.getenv("AGENT_MEMORY_STORE_ID"),
@@ -116,7 +121,7 @@ def redis_memory_factory(uri: str, **kwargs):
116121
port = int(os.environ.get("PORT", 8080))
117122
namespace = os.getenv("REDIS_MEMORY_NAMESPACE", "adk_agent_memory")
118123
server = os.getenv("REDIS_MEMORY_SERVER_URL", "http://localhost:8000")
119-
backend = os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory")
124+
backend = os.getenv("REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND)
120125
extraction = os.getenv("REDIS_MEMORY_EXTRACTION_STRATEGY", "discrete")
121126
context_window = os.getenv("REDIS_MEMORY_CONTEXT_WINDOW", "8000")
122127

examples/travel_agent_memory_hybrid/main.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from google.adk.cli.service_registry import get_service_registry
3434
import uvicorn
3535

36+
from adk_redis import OPENSOURCE_AGENT_MEMORY_BACKEND
3637
from adk_redis.memory import RedisLongTermMemoryService
3738
from adk_redis.memory import RedisLongTermMemoryServiceConfig
3839
from adk_redis.sessions import RedisWorkingMemorySessionService
@@ -56,7 +57,9 @@ def redis_session_factory(uri: str, **kwargs):
5657
"""Factory function for creating RedisWorkingMemorySessionService from URI."""
5758
base_url = parse_base_url(uri)
5859
config = RedisWorkingMemorySessionServiceConfig(
59-
backend=os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory"),
60+
backend=os.getenv(
61+
"REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND
62+
),
6063
api_base_url=base_url,
6164
api_key=os.getenv("AGENT_MEMORY_API_KEY"),
6265
store_id=os.getenv("AGENT_MEMORY_STORE_ID"),
@@ -74,7 +77,9 @@ def redis_memory_factory(uri: str, **kwargs):
7477
"""Factory function for creating RedisLongTermMemoryService from URI."""
7578
base_url = parse_base_url(uri)
7679
config = RedisLongTermMemoryServiceConfig(
77-
backend=os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory"),
80+
backend=os.getenv(
81+
"REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND
82+
),
7883
api_base_url=base_url,
7984
api_key=os.getenv("AGENT_MEMORY_API_KEY"),
8085
store_id=os.getenv("AGENT_MEMORY_STORE_ID"),
@@ -117,7 +122,7 @@ def redis_memory_factory(uri: str, **kwargs):
117122
port = int(os.environ.get("PORT", 8080))
118123
namespace = os.getenv("NAMESPACE", "travel_agent_memory_hybrid")
119124
server = os.getenv("MEMORY_SERVER_URL", "http://localhost:8088")
120-
backend = os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory")
125+
backend = os.getenv("REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND)
121126
extraction = os.getenv("REDIS_MEMORY_EXTRACTION_STRATEGY", "discrete")
122127
context_window = os.getenv("REDIS_MEMORY_CONTEXT_WINDOW", "8000")
123128

examples/travel_agent_memory_hybrid/travel_agent/agent.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from tools.itinerary_planner import ItineraryPlannerTool
3838
from tools.tavily_search import TavilySearchTool
3939

40+
from adk_redis import OPENSOURCE_AGENT_MEMORY_BACKEND
4041
from adk_redis.tools.memory import CreateMemoryTool
4142
from adk_redis.tools.memory import DeleteMemoryTool
4243
from adk_redis.tools.memory import MemoryToolConfig
@@ -45,7 +46,9 @@
4546

4647
# Configuration from environment
4748
MEMORY_SERVER_URL = os.getenv("MEMORY_SERVER_URL", "http://localhost:8088")
48-
MEMORY_BACKEND = os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory")
49+
MEMORY_BACKEND = os.getenv(
50+
"REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND
51+
)
4952
NAMESPACE = os.getenv("NAMESPACE", "travel_agent_memory_hybrid")
5053

5154

examples/travel_agent_memory_tools/travel_agent/agent.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from tools.itinerary_planner import ItineraryPlannerTool
3333
from tools.tavily_search import TavilySearchTool
3434

35+
from adk_redis import OPENSOURCE_AGENT_MEMORY_BACKEND
3536
from adk_redis.tools.memory import CreateMemoryTool
3637
from adk_redis.tools.memory import DeleteMemoryTool
3738
from adk_redis.tools.memory import MemoryToolConfig
@@ -40,7 +41,9 @@
4041

4142
# Configuration from environment
4243
MEMORY_SERVER_URL = os.getenv("MEMORY_SERVER_URL", "http://localhost:8088")
43-
MEMORY_BACKEND = os.getenv("REDIS_MEMORY_BACKEND", "opensource-agent-memory")
44+
MEMORY_BACKEND = os.getenv(
45+
"REDIS_MEMORY_BACKEND", OPENSOURCE_AGENT_MEMORY_BACKEND
46+
)
4447
NAMESPACE = os.getenv("NAMESPACE", "travel_agent_memory_tools")
4548

4649

src/adk_redis/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373
"""
7474

7575
from adk_redis._version import __version__
76+
# Memory backend names
77+
from adk_redis.memory import OPENSOURCE_AGENT_MEMORY_BACKEND
78+
from adk_redis.memory import REDIS_AGENT_MEMORY_BACKEND
79+
from adk_redis.memory import MemoryBackendName
7680
# Memory services
7781
from adk_redis.memory import RedisLongTermMemoryService
7882
from adk_redis.memory import RedisLongTermMemoryServiceConfig
@@ -117,6 +121,10 @@
117121
__all__ = [
118122
# Version
119123
"__version__",
124+
# Memory backend names
125+
"MemoryBackendName",
126+
"OPENSOURCE_AGENT_MEMORY_BACKEND",
127+
"REDIS_AGENT_MEMORY_BACKEND",
120128
# Memory services
121129
"RedisLongTermMemoryService",
122130
"RedisLongTermMemoryServiceConfig",

src/adk_redis/memory/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,16 @@
1414

1515
"""Redis memory services for ADK."""
1616

17+
from adk_redis.memory._backends import OPENSOURCE_AGENT_MEMORY_BACKEND
18+
from adk_redis.memory._backends import REDIS_AGENT_MEMORY_BACKEND
19+
from adk_redis.memory._backends import MemoryBackendName
1720
from adk_redis.memory.long_term_memory import RedisLongTermMemoryService
1821
from adk_redis.memory.long_term_memory import RedisLongTermMemoryServiceConfig
1922

2023
__all__ = [
24+
"MemoryBackendName",
25+
"OPENSOURCE_AGENT_MEMORY_BACKEND",
26+
"REDIS_AGENT_MEMORY_BACKEND",
2127
"RedisLongTermMemoryService",
2228
"RedisLongTermMemoryServiceConfig",
2329
]

src/adk_redis/memory/_backends.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
from typing import Literal
2020

21-
REDIS_AGENT_MEMORY_BACKEND = "redis-agent-memory"
22-
OPENSOURCE_AGENT_MEMORY_BACKEND = "opensource-agent-memory"
21+
REDIS_AGENT_MEMORY_BACKEND: Literal["redis-agent-memory"] = "redis-agent-memory"
22+
OPENSOURCE_AGENT_MEMORY_BACKEND: Literal["opensource-agent-memory"] = (
23+
"opensource-agent-memory"
24+
)
2325

2426
MemoryBackendName = Literal[
2527
"redis-agent-memory",

src/adk_redis/memory/long_term_memory.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,8 @@ async def add_events_to_memory(
612612
"events",
613613
app_name,
614614
user_id,
615-
len(events),
615+
*(getattr(event, "id", "") for event in events),
616+
*(getattr(event, "timestamp", "") for event in events),
616617
),
617618
app_name=app_name,
618619
user_id=user_id,

src/adk_redis/tools/memory/update.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ async def run_async(self, **kwargs: Any) -> dict[str, Any]:
129129
memory_id = args.get("memory_id")
130130
content = args.get("content")
131131
topics = args.get("topics")
132-
namespace = args.get("namespace")
133-
user_id = args.get("user_id")
132+
namespace = self._get_namespace(args.get("namespace"))
133+
user_id = self._get_user_id(args.get("user_id"))
134134

135135
if not memory_id:
136136
return {"status": "error", "message": "memory_id is required"}
@@ -149,13 +149,10 @@ async def run_async(self, **kwargs: Any) -> dict[str, Any]:
149149
if topics is not None:
150150
updates["topics"] = topics
151151

152-
response = (
153-
await (
154-
self._get_agent_memory_server_client().edit_long_term_memory(
155-
memory_id=memory_id,
156-
updates=updates,
157-
)
158-
)
152+
client = self._get_agent_memory_server_client()
153+
response = await client.edit_long_term_memory(
154+
memory_id=memory_id,
155+
updates=updates,
159156
)
160157
return {
161158
"status": "success",

0 commit comments

Comments
 (0)