File size: 5,096 Bytes
2a735cc |
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 |
#!/usr/bin/env python
"""
Hugging Face Space Uploader using the new commit endpoint
"""
import os
import sys
import json
import base64
import requests
from getpass import getpass
def upload_files_commit(space_id, token, files_to_upload):
"""Upload files using the commit endpoint"""
# API URL for commits
api_url = f"https://huggingface.co/api/spaces/{space_id}/commit"
# Headers
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Prepare operations (files to add/modify)
operations = []
for file_path in files_to_upload:
# Read the file content and base64 encode it
with open(file_path, 'rb') as f:
content = f.read()
content_b64 = base64.b64encode(content).decode("ascii")
# Add the operation
operations.append({
"operation": "addOrUpdate",
"path": file_path,
"content": content_b64,
"encoding": "base64"
})
# Prepare the commit payload
payload = {
"operations": operations,
"commit_message": "Fix AI responses and file upload handling"
}
# Make the API request
response = requests.post(api_url, headers=headers, json=payload)
# Check response
if response.status_code == 200:
return True, "Commit successful"
else:
return False, f"Error: {response.status_code} - {response.text}"
def main():
print("=" * 60)
print(" Hugging Face Space File Uploader (Commit Method)")
print("=" * 60)
# Get required information
print("\nPlease enter your Hugging Face details:")
username = input("Username: ")
token = getpass("Access Token: ")
# Space name with validation
while True:
space_name = input("Space Name (without username prefix): ")
if "/" in space_name:
print("Error: Please enter just the Space name without username or slashes")
else:
break
# Construct full space ID
space_id = f"{username}/{space_name}"
# Validate the space exists
print(f"\nValidating Space: {space_id}")
validation_url = f"https://huggingface.co/api/spaces/{space_id}"
headers = {"Authorization": f"Bearer {token}"}
try:
validation_response = requests.get(validation_url, headers=headers)
if validation_response.status_code != 200:
print(f"Error: Space '{space_id}' not found or not accessible.")
print(f"Please check the Space name and your permissions.")
print(f"Space URL would be: https://huggingface.co/spaces/{space_id}")
return False
else:
space_info = validation_response.json()
print(f"✅ Space found: {space_info.get('title', space_id)}")
print(f"URL: https://huggingface.co/spaces/{space_id}")
except Exception as e:
print(f"Error validating space: {e}")
return False
# Files to upload
files_to_upload = [
"app/core/memory.py",
"app/core/ingestion.py",
"app/ui/streamlit_app.py"
]
# Verify files exist locally
missing_files = [f for f in files_to_upload if not os.path.exists(f)]
if missing_files:
print(f"Error: The following files don't exist locally: {missing_files}")
return False
# Display summary before upload
print("\nPreparing to upload these files:")
for file_path in files_to_upload:
file_size = os.path.getsize(file_path) / 1024 # KB
print(f" - {file_path} ({file_size:.1f} KB)")
# Confirm upload
confirm = input("\nProceed with upload? (y/n): ").lower()
if confirm != 'y':
print("Upload cancelled by user.")
return False
# Upload files with commit
print("\n📤 Uploading files in a single commit... ", end="", flush=True)
success, message = upload_files_commit(space_id, token, files_to_upload)
if success:
print("✅ Success!")
print("\n✅ All files uploaded successfully!")
print(f"View your Space at: https://huggingface.co/spaces/{space_id}")
print("Note: It may take a few minutes for your Space to rebuild with the new changes.")
return True
else:
print("❌ Failed!")
print(f"Error: {message}")
return False
if __name__ == "__main__":
try:
# Check for required packages
try:
import requests
except ImportError:
print("Installing required package: requests")
import subprocess
subprocess.check_call([sys.executable, "-m", "pip", "install", "requests"])
import requests
# Run the main function
success = main()
if success:
sys.exit(0)
else:
sys.exit(1)
except KeyboardInterrupt:
print("\nUpload cancelled by user.")
sys.exit(1)
except Exception as e:
print(f"\nUnexpected error: {e}")
sys.exit(1) |