Spaces:
Sleeping
Sleeping
File size: 6,484 Bytes
2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 35db168 2dfc473 | 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 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | """Setup script for Hugging Face Spaces deployment."""
import os
import sys
import logging
import requests
from pathlib import Path
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
def check_environment():
"""Check if running in Hugging Face Space environment."""
is_hf_space = os.getenv("SPACE_ID") is not None
return is_hf_space
def set_hf_space_secrets(hf_token):
"""Set DashScope credentials as HF Space secrets via API.
Args:
hf_token: Hugging Face API token
Returns:
bool: True if secrets were set successfully
"""
space_id = os.getenv("SPACE_ID")
if not space_id:
logger.info("ℹ Not running in HF Space (no SPACE_ID). Skipping secret configuration.")
return True
dashscope_key = os.getenv("DASHSCOPE_API_KEY")
dashscope_url = os.getenv("DASHSCOPE_BASE_URL")
if not dashscope_key or not dashscope_url:
logger.warning("ℹ DashScope credentials not found in environment. Skipping HF secret setup.")
return True
logger.info("Setting up HF Space secrets via API...")
headers = {
"Authorization": f"Bearer {hf_token}",
"Content-Type": "application/json",
}
secrets = [
("DASHSCOPE_API_KEY", dashscope_key),
("DASHSCOPE_BASE_URL", dashscope_url),
]
for secret_name, secret_value in secrets:
try:
url = f"https://huggingface.co/api/spaces/{space_id}/secrets"
payload = {
"key": secret_name,
"value": secret_value,
}
response = requests.post(url, json=payload, headers=headers, timeout=10)
if response.status_code in [200, 201]:
logger.info(f"✓ Secret '{secret_name}' set successfully")
else:
logger.warning(f"⚠ Failed to set '{secret_name}': {response.status_code}")
except Exception as e:
logger.warning(f"⚠ Error setting secret '{secret_name}': {e}")
return True
def validate_secrets():
"""Validate that required secrets are configured."""
required_secrets = [
"HUGGINGFACE_TOKEN",
]
dashscope_secrets = [
"DASHSCOPE_API_KEY",
"DASHSCOPE_BASE_URL",
]
optional_secrets = [
"HUGGINGFACE_DATASET",
"MODEL_NAME",
]
logger.info("=" * 60)
logger.info("Validating Hugging Face Secrets")
logger.info("=" * 60)
missing_secrets = []
# Check required secrets
for secret in required_secrets:
value = os.getenv(secret)
if not value:
logger.error(f"✗ MISSING: {secret}")
missing_secrets.append(secret)
else:
logger.info(f"✓ CONFIGURED: {secret}")
# Check DashScope secrets (log without exposing values)
logger.info("\nDashScope Configuration:")
dashscope_configured = True
for secret in dashscope_secrets:
value = os.getenv(secret)
if value:
logger.info(f"✓ CONFIGURED: {secret} (***hidden***)")
else:
logger.info(f"ℹ NOT SET: {secret}")
dashscope_configured = False
# Check optional secrets
for secret in optional_secrets:
value = os.getenv(secret)
if value:
logger.info(f"✓ CONFIGURED: {secret}")
else:
logger.info(f"ℹ NOT SET: {secret} (using default)")
logger.info("=" * 60)
if missing_secrets:
logger.error(f"\n❌ Missing required secrets: {', '.join(missing_secrets)}")
logger.error("\nPlease add these secrets to your Space:")
logger.error("1. Go to your Space settings")
logger.error("2. Click 'Repository secrets'")
logger.error("3. Add each missing secret")
return False
if not dashscope_configured:
logger.warning("\n⚠ DashScope credentials not fully configured")
logger.warning("The system will attempt to set them via HF API during deployment")
logger.info("\n✅ Required secrets are configured!")
return True
def create_directories():
"""Create necessary directories."""
directories = [
"./data",
"./output",
"./logs",
]
logger.info("\nCreating directories...")
for directory in directories:
Path(directory).mkdir(parents=True, exist_ok=True)
logger.info(f"✓ {directory}")
def print_deployment_info():
"""Print deployment information."""
logger.info("\n" + "=" * 60)
logger.info("Deployment Information")
logger.info("=" * 60)
is_hf_space = check_environment()
if is_hf_space:
space_id = os.getenv("SPACE_ID", "unknown")
logger.info(f"✓ Running in Hugging Face Space: {space_id}")
logger.info(f"✓ Space URL: https://huggingface.co/spaces/{space_id}")
else:
logger.info("ℹ Not running in Hugging Face Space")
logger.info("ℹ Running locally or in different environment")
model = os.getenv("MODEL_NAME", "qwen3.7-plus")
dataset = os.getenv("HUGGINGFACE_DATASET", "factorstudios/Pipeline")
port = os.getenv("PORT", "7860")
logger.info(f"✓ Model: {model}")
logger.info(f"✓ Dataset: {dataset}")
logger.info(f"✓ Port: {port}")
logger.info("\n" + "=" * 60)
logger.info("API Endpoints")
logger.info("=" * 60)
logger.info("Health: GET /health")
logger.info("Docs: GET /docs")
logger.info("Pipeline: POST /api/pipeline/execute")
logger.info("=" * 60)
def main():
"""Run setup checks."""
logger.info("Starting Hugging Face Space setup...\n")
# Get HF token from environment
hf_token = os.getenv("HUGGINGFACE_TOKEN")
# Check environment
is_hf_space = check_environment()
# Validate secrets
secrets_valid = validate_secrets()
# Set HF Space secrets via API if running in Space
if hf_token and is_hf_space:
set_hf_space_secrets(hf_token)
# Create directories
create_directories()
# Print info
print_deployment_info()
if not secrets_valid:
logger.error("\n❌ Setup validation failed!")
sys.exit(1)
logger.info("\n✅ Setup validation passed!")
logger.info("The application is ready to start.\n")
return 0
if __name__ == "__main__":
sys.exit(main())
|