An in-memory memory service for prototyping purpose only. Uses keyword matching instead of semantic search. This class is thread-safe, however, it should be used for testing and development only.
| 43 | |
| 44 | |
| 45 | class InMemoryMemoryService(BaseMemoryService): |
| 46 | """An in-memory memory service for prototyping purpose only. |
| 47 | |
| 48 | Uses keyword matching instead of semantic search. |
| 49 | |
| 50 | This class is thread-safe, however, it should be used for testing and |
| 51 | development only. |
| 52 | """ |
| 53 | |
| 54 | def __init__(self): |
| 55 | self._lock = threading.Lock() |
| 56 | |
| 57 | self._session_events: dict[str, dict[str, list[Event]]] = {} |
| 58 | """Keys are "{app_name}/{user_id}". Values are dicts of session_id to |
| 59 | session event lists. |
| 60 | """ |
| 61 | |
| 62 | @override |
| 63 | async def add_session_to_memory(self, session: Session) -> None: |
| 64 | user_key = _user_key(session.app_name, session.user_id) |
| 65 | |
| 66 | with self._lock: |
| 67 | self._session_events[user_key] = self._session_events.get(user_key, {}) |
| 68 | self._session_events[user_key][session.id] = [ |
| 69 | event |
| 70 | for event in session.events |
| 71 | if event.content and event.content.parts |
| 72 | ] |
| 73 | |
| 74 | @override |
| 75 | async def add_events_to_memory( |
| 76 | self, |
| 77 | *, |
| 78 | app_name: str, |
| 79 | user_id: str, |
| 80 | events: Sequence[Event], |
| 81 | session_id: str | None = None, |
| 82 | custom_metadata: Mapping[str, object] | None = None, |
| 83 | ) -> None: |
| 84 | _ = custom_metadata |
| 85 | user_key = _user_key(app_name, user_id) |
| 86 | scoped_session_id = session_id or _UNKNOWN_SESSION_ID |
| 87 | events_to_add = [ |
| 88 | event for event in events if event.content and event.content.parts |
| 89 | ] |
| 90 | |
| 91 | with self._lock: |
| 92 | self._session_events[user_key] = self._session_events.get(user_key, {}) |
| 93 | existing_events = self._session_events[user_key].get( |
| 94 | scoped_session_id, [] |
| 95 | ) |
| 96 | existing_ids = {event.id for event in existing_events} |
| 97 | for event in events_to_add: |
| 98 | if event.id not in existing_ids: |
| 99 | existing_events.append(event) |
| 100 | existing_ids.add(event.id) |
| 101 | self._session_events[user_key][scoped_session_id] = existing_events |
| 102 |
no outgoing calls