File size: 4,287 Bytes
0cabe9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129

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 <text>")
    print("  /forget_tag <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()