#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Simple HuggingFace deployment using git repository""" import sys import io # Force UTF-8 encoding for Windows sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') from huggingface_hub import HfApi, login, create_repo import os from pathlib import Path import tempfile import shutil # Configuration HF_TOKEN = os.environ.get("HF_TOKEN") SPACE_NAME = "Kraft102/widgetdc-cortex" print("=" * 50) print("HuggingFace Deployment Script") print("=" * 50) print(f"Target: {SPACE_NAME}\n") # Step 1: Login print("1️⃣ Logging in...") os.environ['HF_TOKEN'] = HF_TOKEN login(token=HF_TOKEN, add_to_git_credential=True) api = HfApi() print(" Logged in\n") # Step 2: Create/verify Space print("2️⃣ Creating Space...") try: create_repo( repo_id=SPACE_NAME, repo_type="space", space_sdk="docker", exist_ok=True, token=HF_TOKEN ) print(" Space ready\n") except Exception as e: print(f" Space exists (or error: {e})\n") # Step 3: Create temp directory with files print("3️⃣ Preparing files...") temp_dir = Path(tempfile.mkdtemp()) print(f"Using temp dir: {temp_dir}") try: # Create structure (temp_dir / "apps/backend").mkdir(parents=True) (temp_dir / "packages/domain-types").mkdir(parents=True) (temp_dir / "packages/mcp-types").mkdir(parents=True) # Copy backend (only essential files) print(" Copying backend...") if Path("apps/backend/src").exists(): shutil.copytree("apps/backend/src", temp_dir / "apps/backend/src") if Path("apps/backend/prisma").exists(): shutil.copytree("apps/backend/prisma", temp_dir / "apps/backend/prisma") shutil.copy("apps/backend/package.json", temp_dir / "apps/backend/") shutil.copy("apps/backend/tsconfig.json", temp_dir / "apps/backend/") # Copy packages print(" Copying packages...") shutil.copytree("packages/domain-types/src", temp_dir / "packages/domain-types/src") shutil.copy("packages/domain-types/package.json", temp_dir / "packages/domain-types/") shutil.copy("packages/domain-types/tsconfig.json", temp_dir / "packages/domain-types/") shutil.copytree("packages/mcp-types/src", temp_dir / "packages/mcp-types/src") shutil.copy("packages/mcp-types/package.json", temp_dir / "packages/mcp-types/") shutil.copy("packages/mcp-types/tsconfig.json", temp_dir / "packages/mcp-types/") # Copy root files print(" Copying root files...") shutil.copy("package.json", temp_dir / "package.json") if Path("tsconfig.json").exists(): shutil.copy("tsconfig.json", temp_dir / "tsconfig.json") # Copy Dockerfile print(" Copying Dockerfile...") if Path("scripts/hf-backend.dockerfile").exists(): shutil.copy("scripts/hf-backend.dockerfile", temp_dir / "Dockerfile") elif Path("Dockerfile").exists(): shutil.copy("Dockerfile", temp_dir / "Dockerfile") # Create README print(" Creating README...") readme = """--- title: WidgeTDC Cortex emoji: 🧠 colorFrom: blue colorTo: purple sdk: docker app_port: 7860 hardware: t4-small --- # WidgeTDC Cortex - Neural Backend Enterprise AI backend with GPU-accelerated embeddings and MCP agents. ## Features - GPU-accelerated embeddings via sentence-transformers - MCP (Model Context Protocol) tool execution - Real-time WebSocket communication - Health monitoring at /health endpoint """ (temp_dir / "README.md").write_text(readme, encoding='utf-8') print(f" Files prepared in {temp_dir}\n") # List files print(" Files to upload:") for root, dirs, files in os.walk(temp_dir): # Skip hidden dirs dirs[:] = [d for d in dirs if not d.startswith('.')] level = root.replace(str(temp_dir), '').count(os.sep) indent = ' ' * 2 * level print(f'{indent}{os.path.basename(root)}/') subindent = ' ' * 2 * (level + 1) for file in files[:5]: # Show max 5 files per dir print(f'{subindent}{file}') if len(files) > 5: print(f'{subindent}... and {len(files) - 5} more files') # Step 4: Upload print(f"\n4️⃣ Uploading to {SPACE_NAME}...") print("This may take 2-5 minutes...\n") api.upload_folder( folder_path=str(temp_dir), repo_id=SPACE_NAME, repo_type="space", commit_message="Deploy WidgeTDC Backend", token=HF_TOKEN ) print("\n Upload complete!") except Exception as e: print(f"\n Error: {e}") import traceback traceback.print_exc() raise finally: # Cleanup if temp_dir.exists(): print(f"\n Cleaning up {temp_dir}...") shutil.rmtree(temp_dir, ignore_errors=True) # Success! print("\n" + "=" * 50) print(" DEPLOYMENT SUCCESSFUL!") print(f"\n Space URL: https://huggingface.co/spaces/{SPACE_NAME}") print(f" API URL: https://{SPACE_NAME.replace('/', '-')}.hf.space/") print("\n Space will now build Docker image (5-10 minutes)") print(" Add environment variables in Space Settings → Variables") print("\n Done!")