emo-online-api / emo /desktop /memory.py
Emo Online
Deploy Emo API
dd87944
Raw
History Blame Contribute Delete
1.87 kB
"""Mémoire persistante long_term.json."""
from __future__ import annotations
import json
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
DATA_DIR = Path(__file__).resolve().parent / "data"
MEMORY_FILE = DATA_DIR / "long_term.json"
def _default_memory() -> dict[str, Any]:
return {
"preferences": {},
"facts": [],
"journal": [],
"updated_at": None,
}
def load_memory() -> dict[str, Any]:
if not MEMORY_FILE.exists():
return _default_memory()
try:
data = json.loads(MEMORY_FILE.read_text(encoding="utf-8"))
base = _default_memory()
base.update(data)
return base
except (json.JSONDecodeError, OSError):
return _default_memory()
def save_memory(data: dict[str, Any]) -> None:
DATA_DIR.mkdir(parents=True, exist_ok=True)
data["updated_at"] = datetime.now(timezone.utc).isoformat()
MEMORY_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
def set_preference(key: str, value: Any) -> None:
mem = load_memory()
mem.setdefault("preferences", {})[key] = value
save_memory(mem)
def get_preference(key: str, default: Any = None) -> Any:
return load_memory().get("preferences", {}).get(key, default)
def add_fact(text: str) -> None:
mem = load_memory()
mem.setdefault("facts", []).append({
"text": text,
"at": datetime.now(timezone.utc).isoformat(),
})
if len(mem["facts"]) > 200:
mem["facts"] = mem["facts"][-200:]
save_memory(mem)
def append_journal(entry: str) -> None:
mem = load_memory()
mem.setdefault("journal", []).append({
"text": entry,
"at": datetime.now(timezone.utc).isoformat(),
})
if len(mem["journal"]) > 500:
mem["journal"] = mem["journal"][-500:]
save_memory(mem)