From 4f1ac0c69f7458e9220bdda8a55c47d217b958fb Mon Sep 17 00:00:00 2001 From: Guofang Date: Mon, 9 Nov 2026 23:42:12 +0800 Subject: [PATCH] Remember the last selected model across runs Store it in .cache/last_model and restore it on startup, falling back to DEFAULT_MODEL if missing or unknown. Co-Authored-By: Claude Sonnet 5.5 --- .gitignore | 1 + __pycache__/embedlab.cpython-315.pyc | Bin 0 -> 16101 bytes embedlab.py | 24 +++++++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 __pycache__/embedlab.cpython-315.pyc diff --git a/.gitignore b/.gitignore index 21d0b89..0fea4f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .venv/ +.cache/ diff --git a/__pycache__/embedlab.cpython-315.pyc b/__pycache__/embedlab.cpython-315.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaf77604b77eddbe5499c33723c91b5cf5002df5 GIT binary patch literal 16101 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 literal 0 HcmV?d00001 diff --git a/embedlab.py b/embedlab.py index 5dd0ca0..38c2608 100755 --- a/embedlab.py +++ b/embedlab.py @@ -2,6 +2,7 @@ print("Loading torch/transformers, please wait...", flush=True) +import os import readline import torch @@ -20,6 +21,7 @@ MODELS = { } PARAM_KEYS = ["pooling", "max_length", "batch_size"] DEFAULT_MODEL = "BAAI/bge-small-zh-v1.5" +LAST_MODEL_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".cache", "last_model") COMMANDS = ["/select", "/sim", "/tokens", "/params", "/set", "/reset", "/lsmod", "/help", "/quit", "/exit"] device = "cuda" if torch.cuda.is_available() else "cpu" @@ -38,6 +40,25 @@ def is_cached(name): ) +def load_last_model(): + """The model selected last time, or DEFAULT_MODEL if unknown.""" + try: + with open(LAST_MODEL_FILE) as f: + name = f.read().strip() + except OSError: + return DEFAULT_MODEL + return name if name in MODELS else DEFAULT_MODEL + + +def save_last_model(name): + try: + os.makedirs(os.path.dirname(LAST_MODEL_FILE), exist_ok=True) + with open(LAST_MODEL_FILE, "w") as f: + f.write(name) + except OSError: + pass + + def select_model(name): global current if name not in MODELS: @@ -49,6 +70,7 @@ def select_model(name): mod = AutoModel.from_pretrained(name).to(device).eval() _loaded[name] = (tok, mod) current = name + save_last_model(name) print(f"Current model: {name}") @@ -204,7 +226,7 @@ def main(): args = parser.parse_args() setup_readline() - select_model(DEFAULT_MODEL) + select_model(load_last_model()) print(HELP) while True: try: