GenerAI / upload_hf.py
amogaddy's picture
Upload upload_hf.py with huggingface_hub
40cba1f verified
Raw
History Blame Contribute Delete
5.08 kB
"""
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()