| import argparse | |
| import os | |
| from pathlib import Path | |
| from huggingface_hub import HfApi | |
| def parse_args(): | |
| parser = argparse.ArgumentParser(description="Upload a LoRA adapter folder to a Hugging Face model repo") | |
| parser.add_argument("--repo-id", default="ASTERIZER/LUNA-100M") | |
| parser.add_argument("--folder", default="Base/out/sft/rag_mcp_lora") | |
| parser.add_argument("--path-in-repo", default="rag_mcp_lora") | |
| parser.add_argument("--private", action="store_true") | |
| return parser.parse_args() | |
| def main(): | |
| args = parse_args() | |
| token = os.environ.get("HF_TOKEN") | |
| if not token: | |
| raise RuntimeError("HF_TOKEN is required in the environment to upload the LoRA adapter") | |
| folder = Path(args.folder) | |
| if not folder.exists(): | |
| raise FileNotFoundError(f"LoRA output folder not found: {folder}") | |
| if not folder.is_dir(): | |
| raise NotADirectoryError(f"Expected a folder, got: {folder}") | |
| candidate_files = [ | |
| folder / "adapter_model.pt", | |
| folder / "adapter_bundle.pt", | |
| folder / "final" / "adapter_model.pt", | |
| folder / "final" / "adapter_bundle.pt", | |
| ] | |
| existing = [path for path in candidate_files if path.exists()] | |
| missing = [str(path) for path in candidate_files if not path.exists()] | |
| if not existing: | |
| raise FileNotFoundError(f"Missing expected adapter files: {', '.join(missing)}") | |
| api = HfApi(token=token) | |
| api.create_repo( | |
| repo_id=args.repo_id, | |
| repo_type="model", | |
| private=args.private, | |
| exist_ok=True, | |
| ) | |
| api.upload_folder( | |
| repo_id=args.repo_id, | |
| repo_type="model", | |
| folder_path=str(folder), | |
| path_in_repo=args.path_in_repo, | |
| ) | |
| print( | |
| "uploaded_lora " | |
| f"repo_id={args.repo_id} " | |
| f"folder={folder} " | |
| f"path_in_repo={args.path_in_repo} " | |
| f"url=https://huggingface.co/{args.repo_id}/tree/main/{args.path_in_repo}" | |
| ) | |
| if __name__ == "__main__": | |
| main() |