pydeploy-studio / utils /deployer.py
codeboosterstech's picture
Fix Hugging Face deployment and improve radio UI
2a26f8e
Raw
History Blame Contribute Delete
2.39 kB
"""
Deployment logic for Hugging Face Spaces
"""
import re
from io import BytesIO
from typing import Dict, Optional
from huggingface_hub import HfApi
def deploy_to_space(
token: str,
space_name: str,
files: Dict[str, str],
username: Optional[str] = None
) -> str:
"""
Deploys the given files to a Hugging Face Space.
Returns the URL of the deployed space.
"""
# Validate inputs
if not token:
raise ValueError("Hugging Face Token is required.")
if not token.startswith('hf_'):
raise ValueError("Invalid Hugging Face token. Should start with 'hf_'")
if not space_name:
raise ValueError("Space name is required.")
# Validate space name format
if not re.match(r'^[a-z0-9-]{3,30}$', space_name):
raise ValueError(
"Space name must be 3-30 characters, lowercase letters, numbers, and hyphens only."
)
# Initialize Hugging Face API
api = HfApi(token=token)
try:
# Get user information
user_info = api.whoami()
if not username:
username = user_info['name']
except Exception as e:
raise ValueError(f"Invalid Token: {str(e)}")
# Create repository ID
repo_id = f"{username}/{space_name}"
try:
# Create or update the Space
api.create_repo(
repo_id=repo_id,
repo_type="space",
space_sdk="gradio",
exist_ok=True,
private=False
)
except Exception as e:
print(f"Note: {e}")
try:
# Upload files
for filename, content in files.items():
# Ensure app.py is clean
if filename == "app.py":
if '```' in content:
content = content.replace('```', '')
# Convert string content to BytesIO object
file_bytes = BytesIO(content.encode('utf-8'))
api.upload_file(
path_or_fileobj=file_bytes,
path_in_repo=filename,
repo_id=repo_id,
repo_type="space",
commit_message=f"Add {filename} via Space Creator"
)
return f"https://huggingface.co/spaces/{repo_id}"
except Exception as e:
raise RuntimeError(f"Deployment failed: {str(e)}")