Cross-Session Agent Memory and User Profiling

Hard
Agents

Cross-Session Agent Memory

Agents that remember users across sessions provide dramatically better experiences.

Task

Implement CrossSessionMemoryManager that:

  1. Creates and persists user profiles across sessions.
  2. Extracts durable facts from conversations at session end.
  3. Deduplicates facts before storing.
  4. Builds personalized context strings for system prompt injection.
  5. 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_count
Output: 1
Explanation: 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
Lines: 1Characters: 0
Ready
The AI Interview - Master AI/ML Interviews