Source code for isek.memory.memory
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime
from typing import Any, Dict, List, Optional
from uuid import uuid4
from pydantic import BaseModel
[docs]
class UserMemory(BaseModel):
"""Simple user memory model."""
memory_id: Optional[str] = None
memory: str
topics: Optional[List[str]] = None
last_updated: Optional[datetime] = None
def __post_init__(self):
if self.memory_id is None:
self.memory_id = str(uuid4())
if self.last_updated is None:
self.last_updated = datetime.now()
[docs]
def to_dict(self) -> Dict[str, Any]:
return self.model_dump(exclude_none=True)
[docs]
class SessionSummary(BaseModel):
"""Simple session summary model."""
summary: str
topics: Optional[List[str]] = None
last_updated: Optional[datetime] = None
def __post_init__(self):
if self.last_updated is None:
self.last_updated = datetime.now()
[docs]
def to_dict(self) -> Dict[str, Any]:
return self.model_dump(exclude_none=True)
[docs]
@dataclass
class Memory:
"""Ultra-simplified Memory class with minimal features."""
# Model used for memories and summaries (optional)
model: Optional[Any] = None
# Simple in-memory storage
memories: Dict[str, Dict[str, UserMemory]] = field(default_factory=dict)
summaries: Dict[str, Dict[str, SessionSummary]] = field(default_factory=dict)
runs: Dict[str, List[Any]] = field(default_factory=dict)
# Debug mode
debug_mode: bool = False
version: int = 2
def __post_init__(self):
"""Initialize memory after creation."""
if self.debug_mode:
print(f"Memory initialized (version: {self.version})")
[docs]
def add_user_memory(self, memory: UserMemory, user_id: str = "default") -> str:
"""Add a user memory."""
if memory.memory_id is None:
memory.memory_id = str(uuid4())
if user_id not in self.memories:
self.memories[user_id] = {}
self.memories[user_id][memory.memory_id] = memory
if self.debug_mode:
print(f"Added memory for user {user_id}: {memory.memory_id}")
return memory.memory_id
[docs]
def get_user_memories(self, user_id: str = "default") -> List[UserMemory]:
"""Get all memories for a user."""
if user_id not in self.memories:
return []
return list(self.memories[user_id].values())
[docs]
def get_user_memory(
self, memory_id: str, user_id: str = "default"
) -> Optional[UserMemory]:
"""Get a specific memory by ID."""
if user_id not in self.memories:
return None
return self.memories[user_id].get(memory_id)
[docs]
def delete_user_memory(self, memory_id: str, user_id: str = "default") -> bool:
"""Delete a user memory."""
if user_id in self.memories and memory_id in self.memories[user_id]:
del self.memories[user_id][memory_id]
if self.debug_mode:
print(f"Deleted memory {memory_id} for user {user_id}")
return True
return False
[docs]
def add_session_summary(
self, session_id: str, summary: SessionSummary, user_id: str = "default"
) -> str:
"""Add a session summary."""
if user_id not in self.summaries:
self.summaries[user_id] = {}
self.summaries[user_id][session_id] = summary
if self.debug_mode:
print(f"Added session summary for user {user_id}, session {session_id}")
return session_id
[docs]
def get_session_summary(
self, session_id: str, user_id: str = "default"
) -> Optional[SessionSummary]:
"""Get a session summary."""
if user_id not in self.summaries:
return None
return self.summaries[user_id].get(session_id)
[docs]
def add_run(self, session_id: str, run: Any) -> None:
"""Add a run to memory."""
if session_id not in self.runs:
self.runs[session_id] = []
self.runs[session_id].append(run)
if self.debug_mode:
print(f"Added run to session {session_id}")
[docs]
def get_runs(self, session_id: str) -> List[Any]:
"""Get all runs for a session."""
return self.runs.get(session_id, [])
[docs]
def clear(self) -> None:
"""Clear all memory."""
self.memories.clear()
self.summaries.clear()
self.runs.clear()
if self.debug_mode:
print("Memory cleared")
[docs]
def to_dict(self) -> Dict[str, Any]:
"""Convert memory to dictionary."""
return {
"memories": {
user_id: {
memory_id: memory.to_dict()
for memory_id, memory in user_memories.items()
}
for user_id, user_memories in self.memories.items()
},
"summaries": {
user_id: {
session_id: summary.to_dict()
for session_id, summary in session_summaries.items()
}
for user_id, session_summaries in self.summaries.items()
},
"runs": {
session_id: [str(run) for run in runs]
for session_id, runs in self.runs.items()
},
}
def __repr__(self) -> str:
return f"Memory(users={len(self.memories)}, sessions={len(self.summaries)}, runs={len(self.runs)})"