import argparse import json import sys from .runtime import NZFCGramLongMemoryChat def main(): parser = argparse.ArgumentParser(description="NZFC-GRAM v1.2 local long-memory chat CLI") parser.add_argument("--repo-dir", default=".", help="Path to cloned Hugging Face repo root") parser.add_argument("--model-id", default="google/gemma-4-E2B-it") parser.add_argument("--memory-db", default=None, help="Optional SQLite memory DB path") parser.add_argument("--user-id", default="default_user") parser.add_argument("--project-id", default="default") parser.add_argument("--session-id", default="main") parser.add_argument("--language", default="ko", choices=["ko", "en", "auto"]) parser.add_argument("--save-scope", default="project", choices=["session", "project", "user"]) parser.add_argument("--debug", action="store_true") parser.add_argument("--no-model", action="store_true", help="Load retrieval stack only; generation will fail unless model is loaded") args = parser.parse_args() print("=" * 100) print("NZFC-GRAM v1.2 Local Long-Memory Chat") print("=" * 100) print("repo_dir:", args.repo_dir) print("model_id:", args.model_id) print("user_id:", args.user_id) print("project_id:", args.project_id) print("session_id:", args.session_id) print("save_scope:", args.save_scope) print("=" * 100) print("Commands:") print(" /exit") print(" /stats") print(" /remember ") print(" /forget_tag ") print(" /reset_session") print("=" * 100) bot = NZFCGramLongMemoryChat( repo_dir=args.repo_dir, model_id=args.model_id, memory_db_path=args.memory_db, load_model=not args.no_model, require_model=not args.no_model, ) while True: try: msg = input("\nUser> ").strip() except EOFError: break except KeyboardInterrupt: print("\n[EXIT]") break if not msg: continue if msg in ["/exit", "exit", "quit", "/quit"]: break if msg == "/stats": print(json.dumps(bot.stats(), ensure_ascii=False, indent=2)) continue if msg.startswith("/remember "): text = msg[len("/remember "):].strip() rec = bot.remember( text, user_id=args.user_id, project_id=args.project_id, session_id=args.session_id, scope=args.save_scope, ) print("[REMEMBERED]", rec["rid"]) continue if msg.startswith("/forget_tag "): tag = msg[len("/forget_tag "):].strip() out = bot.forget_tag( tag, user_id=args.user_id, project_id=args.project_id, session_id=args.session_id, scope=args.save_scope, ) print(json.dumps(out, ensure_ascii=False, indent=2)) continue if msg == "/reset_session": out = bot.reset_session( user_id=args.user_id, project_id=args.project_id, session_id=args.session_id, ) print(json.dumps(out, ensure_ascii=False, indent=2)) continue out = bot.chat( msg, user_id=args.user_id, project_id=args.project_id, session_id=args.session_id, save_turn=True, save_scope=args.save_scope, return_debug=args.debug, response_language=args.language, ) print("\nAssistant>") print(out["answer"]) if args.debug: print("\n[DEBUG]") debug_copy = dict(out) if "debug" in debug_copy: debug_copy["debug"] = { "memory_pack_chars": len(debug_copy["debug"].get("memory_pack", "")), "system_prompt_chars": len(debug_copy["debug"].get("system_prompt", "")), "user_prompt_chars": len(debug_copy["debug"].get("user_prompt", "")), } print(json.dumps(debug_copy, ensure_ascii=False, indent=2)) if __name__ == "__main__": main()