widgettdc-api / scripts /deploy_hf_simple.py
Kraft102's picture
fix: sql.js Docker/Alpine compatibility layer for PatternMemory and FailureMemory
5a81b95
#!/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!")