#!/usr/bin/env python3 """ Einmalige Migration: alte SQLite-Fakten (`memories`-Tabelle aus dem v1/v2-Memory) → Mem0. Läuft im ~/.mem0/venv. Idempotent über eine Marker-Datei. Jeder Alt-Eintrag wird VERBATIM übernommen (infer=False), Kategorie/Source als Metadaten. Beim aktuellen Box-Stand ist die DB leer → No-Op, aber für Reproduzierbarkeit/künftige Migrationen vorhanden. Aufruf: ~/.mem0/venv/bin/python migrate.py [pfad/zur/mc2-memory.db] """ import os import sqlite3 import sys from app import USER_ID, mem # nutzt dieselbe Mem0-Instanz/Config DEFAULT_DB = os.environ.get("MC_MEMORY_DB", "/srv/models/mc2-memory.db") MARKER = os.environ.get("MEM0_MIGRATION_MARKER", "/srv/models/mem0/.migrated_sqlite") def main() -> int: db_path = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_DB if os.path.exists(MARKER): print(f"Migration bereits erledigt (Marker {MARKER}).") return 0 if not os.path.exists(db_path): print(f"Keine Alt-DB unter {db_path} — nichts zu migrieren.") os.makedirs(os.path.dirname(MARKER), exist_ok=True) open(MARKER, "w").close() return 0 conn = sqlite3.connect(db_path) conn.row_factory = sqlite3.Row try: rows = conn.execute( "SELECT content, category, source FROM memories ORDER BY created_at" ).fetchall() except sqlite3.OperationalError: rows = [] conn.close() m = mem() n = 0 for r in rows: content = (r["content"] or "").strip() if not content: continue m.add([{"role": "user", "content": content}], user_id=USER_ID, infer=False, metadata={"category": r["category"] or "stable", "source": r["source"] or "migrated"}) n += 1 os.makedirs(os.path.dirname(MARKER), exist_ok=True) open(MARKER, "w").close() print(f"Migriert: {n} Einträge aus {db_path} → Mem0.") return 0 if __name__ == "__main__": raise SystemExit(main())