""" upload_hf.py ============ Carica su HuggingFace solo i file necessari del progetto GenerAI. Uso: python upload_hf.py python upload_hf.py --repo amogaddy/GenerAI --model-weights """ import argparse import os import shutil import tempfile from pathlib import Path # Carica .env se presente if Path(".env").exists(): for line in Path(".env").read_text(encoding="utf-8").splitlines(): if "=" in line and not line.startswith("#"): k, v = line.split("=", 1) os.environ.setdefault(k.strip(), v.strip()) # File del codice da includere SOURCE_FILES = [ "app.py", "brain.py", "knowledge_base.py", "scraper.py", "errors.py", "seed_italian.py", "export_dataset.py", "finetune.py", "upload_hf.py", "requirements.txt", "requirements-train.txt", ] DEFAULT_REPO = "amogaddy/GenerAI" MODEL_DIR = "./generai-finetuned" def check_deps(): try: from huggingface_hub import login, upload_folder, HfApi return login, upload_folder, HfApi except ImportError: print("❌ huggingface_hub non installato.") print(" pip install huggingface-hub") exit(1) def build_model_card(repo_id: str, include_weights: bool) -> str: return f"""--- license: mit base_model: Qwen/Qwen2.5-0.5B-Instruct language: - it tags: - italian - generai - fine-tuned - rag --- # GenerAI 🤖 Assistente AI in italiano con memoria locale (ChromaDB) e ricerca web. ## Come usarlo ```bash pip install -r requirements.txt python app.py ``` ## Fine-tuning ```bash pip install -r requirements-train.txt python export_dataset.py python finetune.py --dataset dataset.jsonl --hf-repo {repo_id} ``` ## Licenza MIT — fai quello che vuoi, basta lasciare il credito. """ def main(): parser = argparse.ArgumentParser(description="Carica GenerAI su HuggingFace") parser.add_argument("--repo", default=DEFAULT_REPO, help=f"repo_id HuggingFace (default: {DEFAULT_REPO})") parser.add_argument("--model-weights", action="store_true", help="Includi anche i pesi del modello fine-tunato") parser.add_argument("--no-login", action="store_true", help="Salta il login (usa token già salvato)") args = parser.parse_args() login, upload_folder, HfApi = check_deps() # ── Login ────────────────────────────────────────────────────────────────── if not args.no_login: token = os.environ.get("HF_TOKEN", "") if token: print("Login HuggingFace con token da .env...") login(token=token) else: print("Login HuggingFace...") login() # ── Crea cartella temporanea con solo i file necessari ───────────────────── with tempfile.TemporaryDirectory() as tmp: tmp_path = Path(tmp) copied = [] missing = [] for fname in SOURCE_FILES: src = Path(fname) if src.exists(): shutil.copy2(src, tmp_path / src.name) copied.append(fname) else: missing.append(fname) # Genera README.md / model card (tmp_path / "README.md").write_text( build_model_card(args.repo, args.model_weights), encoding="utf-8", ) copied.append("README.md (generato)") print(f"\nFile da caricare ({len(copied)}):") for f in copied: print(f" + {f}") if missing: print(f"\nFile non trovati (saltati):") for f in missing: print(f" - {f}") # ── Upload codice ────────────────────────────────────────────────────── print(f"\nUpload codice -> {args.repo} ...") upload_folder( folder_path=str(tmp_path), repo_id=args.repo, repo_type="model", commit_message="Upload GenerAI — codice + grammatica italiana", ) print("Codice caricato.") # ── Upload pesi modello (opzionale) ──────────────────────────────────────── if args.model_weights: if not Path(MODEL_DIR).exists(): print(f"\nCartella pesi non trovata: {MODEL_DIR}") print(" Esegui prima: python finetune.py --dataset dataset.jsonl") else: print(f"\nUpload pesi modello -> {args.repo} ...") upload_folder( folder_path=MODEL_DIR, repo_id=args.repo, repo_type="model", commit_message="Upload pesi modello fine-tunato GenerAI", ) print("Pesi modello caricati.") print(f"\nCompletato! -> https://huggingface.co/{args.repo}") if __name__ == "__main__": main()