87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
# agent/memory.py
|
|
from pathlib import Path
|
|
from typing import Any, Dict
|
|
import json
|
|
|
|
from .config import settings
|
|
from .parameters import validate_parameter, get_parameter_schema
|
|
|
|
|
|
class Memory:
|
|
"""
|
|
Generic memory storage for agent state.
|
|
|
|
Provides a simple key-value store that persists to JSON.
|
|
"""
|
|
|
|
def __init__(self, path: str = "memory.json"):
|
|
self.file = Path(path)
|
|
self.data: Dict[str, Any] = {}
|
|
self.load()
|
|
|
|
def load(self) -> None:
|
|
"""Load memory from file or initialize with defaults."""
|
|
if self.file.exists():
|
|
try:
|
|
self.data = json.loads(self.file.read_text(encoding="utf-8"))
|
|
except (json.JSONDecodeError, IOError) as e:
|
|
print(f"Warning: Could not load memory file: {e}")
|
|
self.data = {
|
|
"config": {},
|
|
"tv_shows": [],
|
|
"history": [],
|
|
}
|
|
else:
|
|
self.data = {
|
|
"config": {},
|
|
"tv_shows": [],
|
|
"history": [],
|
|
}
|
|
|
|
def save(self) -> None:
|
|
self.file.write_text(
|
|
json.dumps(self.data, indent=2, ensure_ascii=False),
|
|
encoding="utf-8",
|
|
)
|
|
|
|
def get(self, key: str, default: Any = None) -> Any:
|
|
"""Get a value from memory by key."""
|
|
return self.data.get(key, default)
|
|
|
|
def set(self, key: str, value: Any) -> None:
|
|
"""
|
|
Set a value in memory and save.
|
|
|
|
Validates the value against the parameter schema if one exists.
|
|
"""
|
|
# Validate if schema exists
|
|
is_valid, error_msg = validate_parameter(key, value)
|
|
if not is_valid:
|
|
print(f'Validation failed for {key}: {error_msg}')
|
|
raise ValueError(f"Invalid value for {key}: {error_msg}")
|
|
|
|
print(f'Setting {key} in memory to: {value}')
|
|
self.data[key] = value
|
|
self.save()
|
|
|
|
def has(self, key: str) -> bool:
|
|
"""Check if a key exists and has a non-None value."""
|
|
return key in self.data and self.data[key] is not None
|
|
|
|
def append_history(self, role: str, content: str) -> None:
|
|
"""
|
|
Append a message to conversation history.
|
|
|
|
Args:
|
|
role: Message role ('user' or 'assistant')
|
|
content: Message content
|
|
"""
|
|
if "history" not in self.data:
|
|
self.data["history"] = []
|
|
|
|
self.data["history"].append({
|
|
"role": role,
|
|
"content": content
|
|
})
|
|
self.save()
|