Spaces:
Paused
Paused
| #!/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!") | |