File size: 5,197 Bytes
5a81b95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/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!")