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)