""" scripts/download_models.py Fix #7 — Pre-bakes all model weights into the local HuggingFace cache. Run once before first launch (or bake into Dockerfile RUN step): python scripts/download_models.py """ import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") logger = logging.getLogger("model_downloader") MODELS = [ # (task, model_id, description) ("question-answering", "deepset/bert-base-cased-squad2", "English BERT QA"), ("question-answering", "deepset/xlm-roberta-base-squad2", "Multilingual XLM-RoBERTa QA"), ("text-classification", "nlptown/bert-base-multilingual-uncased-sentiment", "5-class sentiment"), ("zero-shot-classification", "cross-encoder/nli-deberta-v3-small", "Intent router NLI"), ("text2text-generation", "google/flan-t5-base", "Generative fallback (Flan-T5)"), ] SENTENCE_TRANSFORMERS = [ "sentence-transformers/all-MiniLM-L6-v2", # RAG embedder ] def download_hf_pipelines(): from transformers import pipeline for task, model_id, desc in MODELS: logger.info("Downloading %-50s [%s]", model_id, desc) try: _ = pipeline(task, model=model_id, tokenizer=model_id) logger.info(" ✓ %s cached", model_id) except Exception as e: logger.error(" ✗ Failed to download %s: %s", model_id, e) def download_sentence_transformers(): try: from sentence_transformers import SentenceTransformer except ImportError: logger.warning("sentence-transformers not installed — skipping embedder download") return for model_id in SENTENCE_TRANSFORMERS: logger.info("Downloading %-50s [RAG embedder]", model_id) try: _ = SentenceTransformer(model_id) logger.info(" ✓ %s cached", model_id) except Exception as e: logger.error(" ✗ Failed to download %s: %s", model_id, e) def install_playwright_browser(): import subprocess, sys logger.info("Installing Playwright Chromium browser…") try: subprocess.run( [sys.executable, "-m", "playwright", "install", "chromium", "--with-deps"], check=True ) logger.info(" ✓ Chromium installed") except Exception as e: logger.warning(" Playwright browser install failed (optional): %s", e) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Pre-download all model weights") parser.add_argument("--skip-playwright", action="store_true") args = parser.parse_args() logger.info("=" * 60) logger.info(" ecom-qa-bert Model Pre-download") logger.info("=" * 60) download_hf_pipelines() download_sentence_transformers() if not args.skip_playwright: install_playwright_browser() logger.info("=" * 60) logger.info(" All models downloaded. Cold-start overhead eliminated.") logger.info("=" * 60)