Spaces:
Runtime error
Runtime error
import os | |
import sys | |
import time | |
import subprocess | |
from pathlib import Path | |
import logging | |
import requests | |
from requests.adapters import HTTPAdapter | |
from urllib3.util.retry import Retry | |
from typing import Optional | |
from dotenv import load_dotenv | |
from huggingface_hub import HfApi, create_repo | |
# Configure logging | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
def setup_requests_session( | |
retries: int = 5, | |
backoff_factor: float = 1.0, | |
status_forcelist: Optional[list] = None | |
) -> requests.Session: | |
"""Configure requests session with retries.""" | |
if status_forcelist is None: | |
status_forcelist = [408, 429, 500, 502, 503, 504] | |
session = requests.Session() | |
retry = Retry( | |
total=retries, | |
read=retries, | |
connect=retries, | |
backoff_factor=backoff_factor, | |
status_forcelist=status_forcelist, | |
) | |
adapter = HTTPAdapter(max_retries=retry) | |
session.mount('http://', adapter) | |
session.mount('https://', adapter) | |
return session | |
def check_network_connectivity(host: str = "8.8.8.8", timeout: int = 5) -> bool: | |
"""Check if network is accessible.""" | |
try: | |
# Try DNS resolution first | |
subprocess.run( | |
["ping", "-c", "1", "-W", str(timeout), host], | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE, | |
check=True | |
) | |
return True | |
except subprocess.CalledProcessError: | |
return False | |
def check_huggingface_connectivity(timeout: int = 5) -> bool: | |
"""Check if Hugging Face is accessible.""" | |
session = setup_requests_session() | |
try: | |
response = session.get("https://huggingface.co", timeout=timeout) | |
return response.status_code == 200 | |
except: | |
return False | |
def wait_for_network( | |
max_attempts: int = 5, | |
delay: int = 10, | |
hosts: Optional[list] = None | |
) -> bool: | |
"""Wait for network connectivity.""" | |
if hosts is None: | |
hosts = ["8.8.8.8", "1.1.1.1"] | |
for attempt in range(max_attempts): | |
logger.info(f"Checking network connectivity (attempt {attempt + 1}/{max_attempts})") | |
# Try different DNS servers | |
for host in hosts: | |
if check_network_connectivity(host): | |
logger.info(f"Network connectivity established via {host}") | |
return True | |
# Check Hugging Face specifically | |
if check_huggingface_connectivity(): | |
logger.info("Hugging Face is accessible") | |
return True | |
if attempt < max_attempts - 1: | |
logger.warning(f"Network check failed. Waiting {delay} seconds before retry...") | |
time.sleep(delay) | |
return False | |
def upload_to_huggingface(): | |
"""Upload the project to Hugging Face.""" | |
creds_path = None | |
try: | |
# Load environment variables | |
load_dotenv() | |
token = os.getenv("HUGGINGFACE_TOKEN") | |
if not token: | |
raise ValueError("HUGGINGFACE_TOKEN not found in environment variables") | |
# Check network connectivity | |
if not wait_for_network(): | |
raise ConnectionError("Unable to establish network connectivity") | |
# Initialize Hugging Face API | |
api = HfApi(token=token) | |
logger.info("Starting upload to Hugging Face Space...") | |
# Space configuration | |
space_name = "nananie143/advanced-reasoning" | |
try: | |
# Try to create the space (will fail if it exists) | |
create_repo( | |
repo_id=space_name, | |
token=token, | |
repo_type="space", | |
space_sdk="gradio", | |
private=False | |
) | |
logger.info("Created new Hugging Face Space") | |
except Exception as e: | |
if "409" in str(e): # HTTP 409 Conflict - repo already exists | |
logger.info("Space already exists, continuing with upload...") | |
else: | |
raise | |
# Upload files | |
logger.info("Uploading files to space...") | |
api.upload_folder( | |
folder_path=".", | |
repo_id=space_name, | |
repo_type="space", | |
ignore_patterns=["*.pyc", "__pycache__", ".git", ".env", "*.gguf"] | |
) | |
logger.info("Upload completed successfully!") | |
except Exception as e: | |
logger.error(f"Upload failed: {str(e)}") | |
sys.exit(1) | |
finally: | |
# Clean up credentials if they exist | |
if creds_path and os.path.exists(creds_path): | |
os.unlink(creds_path) | |
if __name__ == "__main__": | |
upload_to_huggingface() | |