File size: 3,122 Bytes
4a920c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
سكربت رفع الملفات الكبيرة (الفهرس + المعجم + النموذج) إلى Hugging Face Hub،
بعد بنائها محلياً عبر scripts/build_embeddings.py.

يُشغَّل مرة واحدة فقط (أو عند تحديث المعجم/النموذج)، وليس جزءاً من تشغيل
الحاوية في الإنتاج.

يتطلب:
    - تسجيل دخول إلى Hugging Face (huggingface-cli login)
      أو تعيين متغير البيئة HF_TOKEN

الاستخدام:
    python -m scripts.upload_assets --data      # رفع الفهرس + المعجم
    python -m scripts.upload_assets --model     # رفع نموذج الاسترجاع
    python -m scripts.upload_assets --data --model
"""

import argparse
import sys
from pathlib import Path

from huggingface_hub import HfApi

sys.path.append(str(Path(__file__).resolve().parent.parent))

from app import config  # noqa: E402


def upload_data(api: HfApi) -> None:
    if not config.HF_DATA_REPO:
        raise RuntimeError("متغير البيئة HF_DATA_REPO غير مُعرَّف")

    for path in (config.FAISS_INDEX_PATH, config.LEXICON_WORDS_PATH):
        if not path.exists():
            raise FileNotFoundError(
                f"الملف غير موجود: {path}\n"
                "شغّلي scripts/build_embeddings.py أولاً"
            )

    api.create_repo(repo_id=config.HF_DATA_REPO, repo_type="dataset", exist_ok=True)

    for path in (config.FAISS_INDEX_PATH, config.LEXICON_WORDS_PATH):
        print(f"⬆️  رفع {path.name} إلى {config.HF_DATA_REPO} ...")
        api.upload_file(
            path_or_fileobj=str(path),
            path_in_repo=path.name,
            repo_id=config.HF_DATA_REPO,
            repo_type="dataset",
        )

    print("✅ تم رفع الفهرس والمعجم بنجاح")


def upload_model(api: HfApi) -> None:
    if not config.HF_MODEL_REPO:
        raise RuntimeError("متغير البيئة HF_MODEL_REPO غير مُعرَّف")

    if not config.RETRIEVAL_MODEL_PATH.exists():
        raise FileNotFoundError(f"مجلد النموذج غير موجود: {config.RETRIEVAL_MODEL_PATH}")

    api.create_repo(repo_id=config.HF_MODEL_REPO, repo_type="model", exist_ok=True)

    print(f"⬆️  رفع مجلد النموذج إلى {config.HF_MODEL_REPO} ...")
    api.upload_folder(
        folder_path=str(config.RETRIEVAL_MODEL_PATH),
        repo_id=config.HF_MODEL_REPO,
        repo_type="model",
    )

    print("✅ تم رفع النموذج بنجاح")


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", action="store_true", help="رفع الفهرس + المعجم")
    parser.add_argument("--model", action="store_true", help="رفع نموذج الاسترجاع")
    args = parser.parse_args()

    if not args.data and not args.model:
        parser.error("يجب تحديد --data أو --model أو كلاهما")

    api = HfApi()

    if args.data:
        upload_data(api)
    if args.model:
        upload_model(api)


if __name__ == "__main__":
    main()