File size: 2,038 Bytes
38ca42d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
utils/knowledge_loader.py

Downloads the private knowledge base from a HuggingFace Dataset at startup.
This keeps personal knowledge files OUT of the public repo (GitHub + HF Space)
while still making them available inside the running app.

Setup (HuggingFace Space Secrets):
  HF_TOKEN              β†’ your HF read token (huggingface.co/settings/tokens)
  HF_KNOWLEDGE_DATASET  β†’ e.g. "kuldeepmishra3/kuldeep-knowledge"

Locally: just keep files in data/knowledge/ as normal (no download needed).
"""

import os
from pathlib import Path
from utils.logger import get_logger

logger = get_logger(__name__)

KNOWLEDGE_DIR = Path("data/knowledge")


def download_knowledge_from_hf() -> bool:
    """
    Download knowledge files from a private HF Dataset.
    Only runs when HF_TOKEN and HF_KNOWLEDGE_DATASET are set (i.e. on HF Space).
    Returns True if downloaded, False if skipped (local mode).
    """
    hf_token   = os.environ.get("HF_TOKEN", "").strip()
    hf_dataset = os.environ.get("HF_KNOWLEDGE_DATASET", "").strip()

    if not hf_token or not hf_dataset:
        logger.info("[KnowledgeLoader] HF_TOKEN or HF_KNOWLEDGE_DATASET not set β€” using local files.")
        return False

    try:
        from huggingface_hub import snapshot_download

        logger.info(f"[KnowledgeLoader] Downloading knowledge base from private dataset: {hf_dataset}")
        KNOWLEDGE_DIR.mkdir(parents=True, exist_ok=True)

        snapshot_download(
            repo_id=hf_dataset,
            repo_type="dataset",
            local_dir=str(KNOWLEDGE_DIR),
            token=hf_token,
            ignore_patterns=["*.gitattributes", ".gitattributes", "README.md"],
        )

        files = list(KNOWLEDGE_DIR.glob("*.txt")) + list(KNOWLEDGE_DIR.glob("*.pdf"))
        logger.info(f"[KnowledgeLoader] βœ“ Downloaded {len(files)} knowledge file(s): {[f.name for f in files]}")
        return True

    except Exception as e:
        logger.error(f"[KnowledgeLoader] βœ— Failed to download knowledge base: {e}")
        return False