Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/google/adk/memory/in_memory_memory_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
from ..events.event import Event
from ..sessions.session import Session

_UNKNOWN_SESSION_ID = '__unknown_session_id__'
_MAX_SEARCH_RESULTS = 10


Expand Down Expand Up @@ -86,9 +85,12 @@ class InMemoryMemoryService(BaseMemoryService):
def __init__(self) -> None:
self._lock = threading.Lock()

self._session_events: dict[tuple[str, str], dict[str, list[Event]]] = {}
self._session_events: dict[
tuple[str, str], dict[str | None, list[Event]]
] = {}
"""Keys are (app_name, user_id). Values are dicts of session_id to
session event lists.
session event lists. Events added without a session ID are kept under the
None key, which no caller-provided session ID can alias.
"""
self._deleted_memory_ids: dict[tuple[str, str], set[str]] = {}
"""Keys are (app_name, user_id). Values are sets of deleted memory_ids
Expand Down Expand Up @@ -122,7 +124,7 @@ async def add_events_to_memory(
) -> None:
_ = custom_metadata
user_key = _user_key(app_name, user_id)
scoped_session_id = session_id or _UNKNOWN_SESSION_ID
scoped_session_id = session_id or None
events_to_add = [
event for event in events if event.content and event.content.parts
]
Expand Down
28 changes: 28 additions & 0 deletions tests/unittests/memory/test_in_memory_memory_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,34 @@ async def test_add_events_to_memory_without_session_id_uses_default_bucket():
assert unknown_session_events[0].id == 'event-1a'


@pytest.mark.asyncio
@pytest.mark.parametrize(
'session_id', ['ordinary-session', '__unknown_session_id__']
)
async def test_add_session_to_memory_keeps_sessionless_memories(session_id):
"""A session must not replace events added without a session ID."""
memory_service = InMemoryMemoryService()
await memory_service.add_events_to_memory(
app_name=MOCK_APP_NAME,
user_id=MOCK_USER_ID,
events=[MOCK_SESSION_1.events[0]],
)

await memory_service.add_session_to_memory(
Session(
app_name=MOCK_APP_NAME,
user_id=MOCK_USER_ID,
id=session_id,
last_update_time=1000,
)
)

result = await memory_service.search_memory(
app_name=MOCK_APP_NAME, user_id=MOCK_USER_ID, query='toolkit'
)
assert [memory.id for memory in result.memories] == ['event-1a']


@pytest.mark.asyncio
async def test_add_events_to_memory_alias_is_supported():
"""Tests that add_events_to_memory remains a compatibility alias."""
Expand Down
Loading