Cross-Session Agent Memory
Agents that remember users across sessions provide dramatically better experiences.
Task
Implement CrossSessionMemoryManager that:
- Creates and persists user profiles across sessions.
- Extracts durable facts from conversations at session end.
- Deduplicates facts before storing.
- Builds personalized context strings for system prompt injection.
- Tracks interaction count and last-seen timestamp.
Constraints
- Facts extracted from messages using pattern matching:
'I prefer X','My name is X','I work at X'. - Deduplication: exact string match.
build_personalized_context()returns ≤500-token string.
Examples
Example 1:
Input:
mgr.start_session('u1','s1')
mgr.end_session('s1')
profile = mgr.get_or_create_profile('u1')
profile.interaction_countOutput:
1Explanation: Session ended; interaction count incremented.
Starter Code
from typing import Dict, List, Any, Optional
from dataclasses import dataclass, field
from datetime import datetime
@dataclass
class UserProfile:
user_id: str
preferences: Dict[str, Any] = field(default_factory=dict)
long_term_facts: List[str] = field(default_factory=list)
interaction_count: int = 0
last_seen: str = field(default_factory=lambda: datetime.utcnow().isoformat())
@dataclass
class SessionState:
session_id: str
user_id: str
messages: List[Dict]
started_at: str
ended_at: Optional[str] = None
class CrossSessionMemoryManager:
def __init__(self):
self._profiles: Dict[str, UserProfile] = {}
self._sessions: Dict[str, SessionState] = {}
def get_or_create_profile(self, user_id: str) -> UserProfile:
pass
def start_session(self, user_id: str, session_id: str) -> SessionState:
pass
def end_session(self, session_id: str) -> UserProfile:
# Extract facts, update profile, increment interaction_count
pass
def extract_facts(self, messages: List[Dict]) -> List[str]:
# Pattern-based extraction: 'I prefer X', 'My name is X', 'I work at X'
pass
def build_personalized_context(self, user_id: str) -> str:
# Return string for system prompt injection (max ~500 tokens)
pass
Python3
ReadyLines: 1Characters: 0
Ready