37-AN commited on
Commit
4fe6054
·
1 Parent(s): 780b542

Initial commit for Hugging Face Space deployment

Browse files
Files changed (6) hide show
  1. DEPLOYMENT.md +126 -0
  2. README-HF.md +41 -0
  3. README.md +34 -1
  4. check_git_status.py +141 -0
  5. deploy_to_hf.py +279 -0
  6. space.py +0 -49
DEPLOYMENT.md ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Deploying Your Personal AI Assistant to Hugging Face Spaces
2
+
3
+ This guide provides detailed instructions for deploying your Personal AI Assistant with RAG to Hugging Face Spaces.
4
+
5
+ ## Prerequisites
6
+
7
+ Before you start, make sure you have:
8
+
9
+ 1. **A Hugging Face Account**: Sign up at [https://huggingface.co/join](https://huggingface.co/join) if you don't have one
10
+ 2. **Hugging Face API Token**: Create a token at [https://huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)
11
+ 3. **Git**: Installed and configured on your machine
12
+ 4. **Python 3.8+**: With pip for installing packages
13
+
14
+ ## Step 1: Install Dependencies
15
+
16
+ First, install all required packages:
17
+
18
+ ```bash
19
+ pip install -r requirements.txt
20
+ ```
21
+
22
+ Make sure you have the huggingface_hub package installed:
23
+
24
+ ```bash
25
+ pip install huggingface_hub
26
+ ```
27
+
28
+ ## Step 2: Check Your Git Configuration
29
+
30
+ Run the check script to ensure your Git is properly configured:
31
+
32
+ ```bash
33
+ python check_git_status.py
34
+ ```
35
+
36
+ This will:
37
+ - Verify Git is installed
38
+ - Check your Git configuration
39
+ - Confirm your repository status
40
+ - Verify Hugging Face configuration
41
+
42
+ Follow any prompts to fix issues that are detected.
43
+
44
+ ## Step 3: Deploy to Hugging Face Spaces
45
+
46
+ Run the deployment script:
47
+
48
+ ```bash
49
+ python deploy_to_hf.py
50
+ ```
51
+
52
+ You will be prompted to enter:
53
+ 1. Your Hugging Face username
54
+ 2. Your Hugging Face API token
55
+ 3. A name for your Space (or accept the default: personal-rag-assistant)
56
+
57
+ The script will:
58
+ - Configure your environment
59
+ - Create a new Hugging Face Space
60
+ - Set up Git for pushing to Hugging Face
61
+ - Push your code to the Space
62
+
63
+ ## Step 4: Monitor the Deployment
64
+
65
+ After pushing your code:
66
+
67
+ 1. Visit [https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME](https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME)
68
+ 2. You'll see a "Building" status while Hugging Face builds your Docker container
69
+ 3. This may take 5-10 minutes for the first build
70
+
71
+ ## Step 5: Using Your Deployed Assistant
72
+
73
+ Once deployment is complete:
74
+
75
+ 1. Your app will be accessible at [https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME](https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME)
76
+ 2. Upload documents through the sidebar
77
+ 3. Start asking questions about your documents
78
+ 4. The application automatically saves your conversation history
79
+
80
+ ## Troubleshooting
81
+
82
+ ### Authentication Issues
83
+
84
+ If you encounter Git authentication issues:
85
+
86
+ ```
87
+ remote: HTTP Basic: Access denied
88
+ ```
89
+
90
+ This usually means:
91
+ - Your Hugging Face token is invalid or expired
92
+ - You haven't configured Git to use your token
93
+
94
+ Solution: Re-run the deployment script to update your credentials.
95
+
96
+ ### Build Failures
97
+
98
+ If your Space shows a build failure:
99
+
100
+ 1. Check the build logs in the Hugging Face Space UI
101
+ 2. Common issues include:
102
+ - Missing dependencies in requirements.txt
103
+ - Issues with the Dockerfile
104
+ - Errors in your Python code
105
+
106
+ ### Space Creation Errors
107
+
108
+ If the Space creation fails:
109
+
110
+ 1. Try creating the Space manually in the Hugging Face UI
111
+ 2. Then run the deployment script again, which will detect the existing Space
112
+
113
+ ## Managing Your Space
114
+
115
+ After deployment, you can:
116
+
117
+ - **Update Your App**: Make changes locally, then run `python deploy_to_hf.py` again
118
+ - **Change Hardware**: Upgrade to a more powerful instance in the Hugging Face UI
119
+ - **Monitor Usage**: View usage statistics in the Hugging Face UI
120
+ - **Share Your App**: Share the URL with others to use your assistant
121
+
122
+ ## Additional Resources
123
+
124
+ - [Hugging Face Spaces Documentation](https://huggingface.co/docs/hub/spaces)
125
+ - [Streamlit Documentation](https://docs.streamlit.io/)
126
+ - [LangChain Documentation](https://python.langchain.com/docs/)
README-HF.md ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Personal AI Assistant with RAG
3
+ emoji: 🤗
4
+ colorFrom: indigo
5
+ colorTo: purple
6
+ sdk: docker
7
+ app_port: 7860
8
+ pinned: true
9
+ license: mit
10
+ ---
11
+
12
+ # Personal AI Assistant with RAG
13
+
14
+ A powerful personal AI assistant that uses Retrieval-Augmented Generation (RAG) to provide responses based on your documents and notes.
15
+
16
+ ## Features
17
+
18
+ - Uses free Hugging Face models for language processing and embeddings
19
+ - Stores and retrieves information in a vector database
20
+ - Upload PDF, TXT, and CSV files to expand the knowledge base
21
+ - Add direct text input to your knowledge base
22
+ - View sources for AI responses
23
+ - Conversation history tracking
24
+
25
+ ## How to Use
26
+
27
+ 1. **Upload Documents**: Use the sidebar to upload files (PDF, TXT, CSV)
28
+ 2. **Add Text**: Enter text directly into the knowledge base
29
+ 3. **Ask Questions**: Chat with the assistant about your documents
30
+ 4. **View Sources**: See where information is coming from
31
+
32
+ ## Built With
33
+
34
+ - Hugging Face Models
35
+ - LLM: google/flan-t5-large
36
+ - Embeddings: sentence-transformers/all-MiniLM-L6-v2
37
+ - LangChain for orchestration
38
+ - Qdrant for vector storage
39
+ - Streamlit for UI
40
+
41
+ Created by [p3rc03](https://huggingface.co/p3rc03)
README.md CHANGED
@@ -29,6 +29,35 @@ A powerful personal AI assistant that uses Retrieval-Augmented Generation (RAG)
29
  3. **Ask Questions**: Chat with the assistant about your documents
30
  4. **View Sources**: See where information is coming from
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  ## Built With
33
 
34
  - Hugging Face Models
@@ -38,4 +67,8 @@ A powerful personal AI assistant that uses Retrieval-Augmented Generation (RAG)
38
  - Qdrant for vector storage
39
  - Streamlit for UI
40
 
41
- Created by [p3rc03](https://huggingface.co/p3rc03)
 
 
 
 
 
29
  3. **Ask Questions**: Chat with the assistant about your documents
30
  4. **View Sources**: See where information is coming from
31
 
32
+ ## Deployment
33
+
34
+ ### Local Deployment
35
+
36
+ To run the app locally:
37
+
38
+ 1. Clone this repository
39
+ 2. Install requirements: `pip install -r requirements.txt`
40
+ 3. Run the Streamlit UI: `python run.py --ui`
41
+ 4. Or run the API server: `python run.py --api`
42
+
43
+ ### Deploying to Hugging Face Spaces
44
+
45
+ This application can be easily deployed to Hugging Face Spaces for free hosting:
46
+
47
+ 1. Make sure you have a Hugging Face account
48
+ 2. Create a Hugging Face API token at https://huggingface.co/settings/tokens
49
+ 3. Run the deployment script: `python deploy_to_hf.py`
50
+ 4. Follow the prompts to enter your username, token, and space name
51
+ 5. Wait for the deployment to complete
52
+
53
+ If you encounter any issues during deployment, run `python check_git_status.py` to diagnose and fix common problems.
54
+
55
+ The deployment process:
56
+ - Creates a Hugging Face Space using the Spaces SDK
57
+ - Configures git for pushing to Hugging Face
58
+ - Pushes your code to the Space
59
+ - Builds and deploys the Docker container automatically
60
+
61
  ## Built With
62
 
63
  - Hugging Face Models
 
67
  - Qdrant for vector storage
68
  - Streamlit for UI
69
 
70
+ Created by [p3rc03](https://huggingface.co/p3rc03)
71
+
72
+ ## License
73
+
74
+ MIT License - See LICENSE file for details
check_git_status.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ """
3
+ Check Git status and configuration for Hugging Face Space deployment.
4
+ This script helps troubleshoot git issues when deploying to Hugging Face Spaces.
5
+ """
6
+ import subprocess
7
+ import os
8
+ import sys
9
+
10
+ def run_cmd(cmd, description, show_output=True):
11
+ """Run a command and return the result."""
12
+ print(f"\n{description}:")
13
+ try:
14
+ if show_output:
15
+ subprocess.run(cmd, check=True)
16
+ return True
17
+ else:
18
+ result = subprocess.run(cmd, check=True, capture_output=True, text=True)
19
+ return result.stdout.strip()
20
+ except subprocess.CalledProcessError as e:
21
+ print(f"Error: {e}")
22
+ if e.stderr:
23
+ print(f"Details: {e.stderr}")
24
+ return False
25
+
26
+ def check_git_installation():
27
+ """Check if git is installed and properly configured."""
28
+ print("="*50)
29
+ print("Checking Git Installation and Configuration")
30
+ print("="*50)
31
+
32
+ # Check git version
33
+ if not run_cmd(["git", "--version"], "Git version"):
34
+ print("Git is not installed. Please install Git and try again.")
35
+ return False
36
+
37
+ # Check git configuration
38
+ user_name = run_cmd(["git", "config", "user.name"], "Git user name", False)
39
+ user_email = run_cmd(["git", "config", "user.email"], "Git user email", False)
40
+
41
+ if not user_name or not user_email:
42
+ print("\nGit user name or email is not configured. Please set them:")
43
+ print(" git config --global user.name \"Your Name\"")
44
+ print(" git config --global user.email \"[email protected]\"")
45
+
46
+ # Prompt to set them now
47
+ if input("\nDo you want to set them now? (y/n): ").lower() == 'y':
48
+ name = input("Enter your name: ")
49
+ email = input("Enter your email: ")
50
+ run_cmd(["git", "config", "--global", "user.name", name], "Setting Git user name", False)
51
+ run_cmd(["git", "config", "--global", "user.email", email], "Setting Git user email", False)
52
+ print("Git configuration updated.")
53
+ else:
54
+ return False
55
+ else:
56
+ print(f"\nGit user name: {user_name}")
57
+ print(f"Git user email: {user_email}")
58
+
59
+ return True
60
+
61
+ def check_git_repository():
62
+ """Check the Git repository status."""
63
+ print("\n" + "="*50)
64
+ print("Checking Git Repository Status")
65
+ print("="*50)
66
+
67
+ # Check if this is a git repository
68
+ is_git_repo = os.path.exists(".git")
69
+ print(f"\nIs Git repository: {'Yes' if is_git_repo else 'No'}")
70
+
71
+ if not is_git_repo:
72
+ print("This is not a git repository. You can initialize it with 'git init'")
73
+
74
+ # Prompt to initialize git
75
+ if input("\nDo you want to initialize git now? (y/n): ").lower() == 'y':
76
+ run_cmd(["git", "init"], "Initializing Git repository")
77
+ print("Git repository initialized.")
78
+ else:
79
+ return False
80
+
81
+ # Check git status
82
+ run_cmd(["git", "status"], "Git status")
83
+
84
+ # Check remote repositories
85
+ run_cmd(["git", "remote", "-v"], "Git remotes")
86
+
87
+ return True
88
+
89
+ def check_huggingface_configuration():
90
+ """Check Hugging Face-specific configurations."""
91
+ print("\n" + "="*50)
92
+ print("Checking Hugging Face Configuration")
93
+ print("="*50)
94
+
95
+ # Check if huggingface_hub is installed
96
+ try:
97
+ import huggingface_hub
98
+ print(f"\nhuggingface_hub version: {huggingface_hub.__version__}")
99
+ except ImportError:
100
+ print("\nhuggingface_hub is not installed. Installing...")
101
+ subprocess.run([sys.executable, "-m", "pip", "install", "huggingface_hub"], check=True)
102
+ print("huggingface_hub installed.")
103
+
104
+ # Check environment variables
105
+ hf_username = os.environ.get("HF_USERNAME")
106
+ hf_token = os.environ.get("HF_TOKEN")
107
+
108
+ print(f"\nHF_USERNAME is {'set' if hf_username else 'not set'}")
109
+ print(f"HF_TOKEN is {'set' if hf_token else 'not set'}")
110
+
111
+ if not hf_username or not hf_token:
112
+ print("\nPlease set HF_USERNAME and HF_TOKEN environment variables.")
113
+ print("You can run the deploy_to_hf.py script to do this.")
114
+
115
+ return True
116
+
117
+ def main():
118
+ """Main function to check git status."""
119
+ # Check git installation
120
+ if not check_git_installation():
121
+ print("\nGit installation or configuration issue. Please fix and try again.")
122
+ return
123
+
124
+ # Check git repository
125
+ if not check_git_repository():
126
+ print("\nGit repository issue. Please fix and try again.")
127
+ return
128
+
129
+ # Check Hugging Face configuration
130
+ if not check_huggingface_configuration():
131
+ print("\nHugging Face configuration issue. Please fix and try again.")
132
+ return
133
+
134
+ print("\n" + "="*50)
135
+ print("Git status check completed successfully!")
136
+ print("="*50)
137
+ print("\nYou are ready to deploy to Hugging Face Spaces.")
138
+ print("Run 'python deploy_to_hf.py' to begin deployment.")
139
+
140
+ if __name__ == "__main__":
141
+ main()
deploy_to_hf.py ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ """
3
+ Helper script to deploy to Hugging Face Spaces.
4
+ This script will help you set environment variables and deploy your app.
5
+ """
6
+ import os
7
+ import sys
8
+ import subprocess
9
+ from getpass import getpass
10
+ from huggingface_hub import HfApi, SpaceHardware, SpaceStage
11
+
12
+ def setup_deployment():
13
+ """Set up deployment environment variables and authenticate."""
14
+ print("="*50)
15
+ print("Hugging Face Spaces Deployment Setup")
16
+ print("="*50)
17
+
18
+ # Get user credentials
19
+ username = input("Enter your Hugging Face username: ")
20
+ token = getpass("Enter your Hugging Face token (from https://huggingface.co/settings/tokens): ")
21
+ space_name = input("Enter your Space name (default: personal-rag-assistant): ") or "personal-rag-assistant"
22
+
23
+ # Set environment variables
24
+ os.environ["HF_USERNAME"] = username
25
+ os.environ["HF_TOKEN"] = token
26
+ os.environ["SPACE_NAME"] = space_name
27
+
28
+ # Write credentials to .env file
29
+ with open(".env", "w") as f:
30
+ f.write(f"HF_API_KEY={token}\n")
31
+ f.write(f"HF_USERNAME={username}\n")
32
+ f.write(f"SPACE_NAME={space_name}\n")
33
+ f.write("LLM_MODEL=google/flan-t5-large\n")
34
+ f.write("EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2\n")
35
+ f.write("VECTOR_DB_PATH=./data/vector_db\n")
36
+ f.write("COLLECTION_NAME=personal_assistant\n")
37
+ f.write("DEFAULT_TEMPERATURE=0.7\n")
38
+ f.write("CHUNK_SIZE=1000\n")
39
+ f.write("CHUNK_OVERLAP=200\n")
40
+ f.write("MAX_TOKENS=512\n")
41
+
42
+ # Set up git credential helper for Hugging Face
43
+ try:
44
+ # Configure git to use credential store
45
+ subprocess.run(["git", "config", "--global", "credential.helper", "store"], check=True)
46
+
47
+ # Create .git-credentials file with token
48
+ home_dir = os.path.expanduser("~")
49
+ credentials_path = os.path.join(home_dir, ".git-credentials")
50
+
51
+ # Check if credentials already exist
52
+ credentials_exist = os.path.exists(credentials_path)
53
+
54
+ with open(credentials_path, "a" if credentials_exist else "w") as f:
55
+ f.write(f"https://{username}:{token}@huggingface.co\n")
56
+
57
+ # Make sure credentials file has correct permissions
58
+ if sys.platform != "win32": # Skip on Windows
59
+ os.chmod(credentials_path, 0o600)
60
+
61
+ print("Git credentials configured for Hugging Face.")
62
+ except Exception as e:
63
+ print(f"Warning: Could not set up git credentials: {e}")
64
+ print("You may need to enter your credentials manually during push.")
65
+
66
+ print(f"\nEnvironment variables set for {username}/{space_name}")
67
+ return username, token, space_name
68
+
69
+ def create_space(username, token, space_name):
70
+ """Create a Hugging Face Space directly using the HfApi."""
71
+ print("\nCreating Hugging Face Space...")
72
+
73
+ try:
74
+ # Initialize the API
75
+ api = HfApi(token=token)
76
+
77
+ # Check if space exists
78
+ try:
79
+ spaces = api.list_spaces(author=username)
80
+ exists = any(space.id == f"{username}/{space_name}" for space in spaces)
81
+ if exists:
82
+ print(f"Space {username}/{space_name} exists.")
83
+ else:
84
+ print(f"Space {username}/{space_name} does not exist. Creating...")
85
+ # Create the space
86
+ api.create_space(
87
+ name=space_name,
88
+ organization=None, # Use None for personal account
89
+ private=False,
90
+ sdk="docker",
91
+ hardware=SpaceHardware.CPU_BASIC,
92
+ storage=1,
93
+ sleep_time=3600, # 1 hour of inactivity before sleep
94
+ status=SpaceStage.RUNNING,
95
+ )
96
+ print(f"Space created successfully.")
97
+ except Exception as e:
98
+ print(f"Error checking/creating space: {e}")
99
+ print("You may need to create the Space manually in the Hugging Face UI.")
100
+ print(f"Visit: https://huggingface.co/spaces")
101
+ return False
102
+
103
+ print(f"Space URL: https://huggingface.co/spaces/{username}/{space_name}")
104
+ return True
105
+ except Exception as e:
106
+ print(f"Error creating space: {e}")
107
+ print("\nTrying to proceed anyway, as the space might already exist.")
108
+ return True
109
+
110
+ def prepare_git_push(username, space_name):
111
+ """Prepare git for pushing to Hugging Face Space."""
112
+ print("\nPreparing to push code to Hugging Face Space...")
113
+
114
+ try:
115
+ # Initialize git if not already done
116
+ if not os.path.exists(".git"):
117
+ subprocess.run(["git", "init"], check=True)
118
+ print("Git repository initialized.")
119
+
120
+ # Configure git remote
121
+ remote_url = f"https://huggingface.co/spaces/{username}/{space_name}"
122
+
123
+ # Check all remotes
124
+ result = subprocess.run(["git", "remote"], capture_output=True, text=True)
125
+ remotes = result.stdout.strip().split('\n') if result.stdout else []
126
+
127
+ print(f"Existing remotes: {remotes}")
128
+
129
+ # Check if 'hf' remote exists
130
+ if "hf" not in remotes:
131
+ # Add the remote
132
+ print("Adding 'hf' remote...")
133
+ try:
134
+ add_result = subprocess.run(["git", "remote", "add", "hf", remote_url], capture_output=True, text=True)
135
+ if add_result.returncode != 0:
136
+ print(f"Error adding remote: {add_result.stderr}")
137
+ return False
138
+ print("Successfully added 'hf' remote")
139
+ except Exception as e:
140
+ print(f"Error adding remote: {e}")
141
+ return False
142
+ else:
143
+ # Update existing remote
144
+ print("Updating 'hf' remote...")
145
+ try:
146
+ update_result = subprocess.run(["git", "remote", "set-url", "hf", remote_url], capture_output=True, text=True)
147
+ if update_result.returncode != 0:
148
+ print(f"Error updating remote: {update_result.stderr}")
149
+ return False
150
+ print("Successfully updated 'hf' remote")
151
+ except Exception as e:
152
+ print(f"Error updating remote: {e}")
153
+ return False
154
+
155
+ # Verify remote was added/updated
156
+ verify_remote = subprocess.run(["git", "remote", "-v"], capture_output=True, text=True)
157
+ print(f"Remote verification: {verify_remote.stdout}")
158
+
159
+ # Make sure we have user details
160
+ try:
161
+ user_name = subprocess.run(["git", "config", "user.name"], capture_output=True, text=True).stdout.strip()
162
+ user_email = subprocess.run(["git", "config", "user.email"], capture_output=True, text=True).stdout.strip()
163
+
164
+ if not user_name or not user_email:
165
+ # Set default values if not configured
166
+ name = input("Enter your name for git config: ") or username
167
+ email = input("Enter your email for git config: ") or f"{username}@example.com"
168
+
169
+ subprocess.run(["git", "config", "--global", "user.name", name], check=True)
170
+ subprocess.run(["git", "config", "--global", "user.email", email], check=True)
171
+ print("Git user configuration updated.")
172
+ except subprocess.CalledProcessError:
173
+ print("Warning: Could not check git user configuration.")
174
+
175
+ # Add and commit files
176
+ subprocess.run(["git", "add", "."], check=True)
177
+ try:
178
+ subprocess.run(["git", "commit", "-m", "Initial commit for Hugging Face Space deployment"], check=True)
179
+ except subprocess.CalledProcessError:
180
+ # Check if there are changes to commit
181
+ status = subprocess.run(["git", "status", "--porcelain"], capture_output=True, text=True, check=True).stdout.strip()
182
+ if not status:
183
+ print("No changes to commit.")
184
+ else:
185
+ print("Error making commit. Check git configuration.")
186
+ return False
187
+
188
+ print("\nGit repository prepared for pushing")
189
+ except Exception as e:
190
+ print(f"Error preparing git: {e}")
191
+ return False
192
+
193
+ return True
194
+
195
+ def push_to_space(username, token):
196
+ """Push code to Hugging Face Space."""
197
+ print("\nPushing code to Hugging Face Space...")
198
+ print("This may take a few minutes...")
199
+
200
+ try:
201
+ # Set git credentials environment variables for this push
202
+ env = os.environ.copy()
203
+ env["GIT_USERNAME"] = username
204
+ env["GIT_PASSWORD"] = token
205
+
206
+ # Determine current branch
207
+ current_branch = subprocess.run(
208
+ ["git", "branch", "--show-current"],
209
+ capture_output=True, text=True
210
+ ).stdout.strip()
211
+
212
+ if not current_branch:
213
+ current_branch = "master" # Default to master if no branch is returned
214
+
215
+ # Push code - force push to override any existing content
216
+ print(f"Pushing from branch {current_branch} to main...")
217
+ cmd = ["git", "push", "-f", "hf", f"{current_branch}:main"]
218
+
219
+ print("\nRunning git push command...")
220
+ print(f"Pushing to Space as user: {username}")
221
+
222
+ # Try to push
223
+ try:
224
+ subprocess.run(cmd, check=True, env=env)
225
+ except subprocess.CalledProcessError as e:
226
+ print(f"Error during push: {e}")
227
+
228
+ # Try direct URL push as alternative
229
+ print("\nTrying alternative direct URL push...")
230
+ direct_url = f"https://{username}:{token}@huggingface.co/spaces/{username}/{os.environ.get('SPACE_NAME')}"
231
+ alt_cmd = ["git", "push", "-f", direct_url, f"{current_branch}:main"]
232
+
233
+ try:
234
+ subprocess.run(alt_cmd, check=True, env=env)
235
+ except subprocess.CalledProcessError as e:
236
+ print(f"Direct URL push also failed: {e}")
237
+ raise
238
+
239
+ print("\nCode pushed to Hugging Face Space successfully!")
240
+ except subprocess.CalledProcessError as e:
241
+ print(f"Error pushing code: {e}")
242
+ print("\nTroubleshooting git push issues:")
243
+ print("1. Ensure your Hugging Face token has write access")
244
+ print("2. Try manually setting up git credentials:")
245
+ print(f" git config --global credential.helper store")
246
+ print(f" echo 'https://{username}:{token}@huggingface.co' > ~/.git-credentials")
247
+ print("3. Try pushing directly with:")
248
+ print(f" git push -f https://{username}:{token}@huggingface.co/spaces/{username}/{os.environ.get('SPACE_NAME')} main")
249
+ return False
250
+
251
+ return True
252
+
253
+ def main():
254
+ """Main function to run the deployment process."""
255
+ username, token, space_name = setup_deployment()
256
+
257
+ # Create the Space
258
+ if not create_space(username, token, space_name):
259
+ print("Failed to create Space. Attempting to continue anyway.")
260
+
261
+ # Prepare git for pushing
262
+ if not prepare_git_push(username, space_name):
263
+ print("Failed to prepare git. Exiting.")
264
+ return
265
+
266
+ # Push code to Space
267
+ if not push_to_space(username, token):
268
+ print("Failed to push code. Exiting.")
269
+ return
270
+
271
+ print("\n" + "="*50)
272
+ print(f"Deployment completed! Your app should be available at:")
273
+ print(f"https://huggingface.co/spaces/{username}/{space_name}")
274
+ print("="*50)
275
+ print("\nNote: It may take a few minutes for the Space to build and deploy your app.")
276
+ print("You can monitor the build progress on the Space page.")
277
+
278
+ if __name__ == "__main__":
279
+ main()
space.py DELETED
@@ -1,49 +0,0 @@
1
- #!/usr/bin/env python
2
- """
3
- Register this app with Hugging Face Spaces SDK.
4
- This file is used for deploying the app to Hugging Face Spaces.
5
- """
6
- import os
7
- import subprocess
8
- import sys
9
- from huggingface_hub import SpaceHardware, SpaceStage, SpaceSDK
10
-
11
- def create_space():
12
- """Create or update a Hugging Face Space."""
13
- # Get the Space name or use a default
14
- space_name = os.environ.get("SPACE_NAME", "personal-rag-assistant")
15
- owner = os.environ.get("HF_USERNAME")
16
-
17
- if not owner:
18
- print("Please set the HF_USERNAME environment variable to your Hugging Face username.")
19
- sys.exit(1)
20
-
21
- # Initialize the SDK
22
- sdk = SpaceSDK(
23
- space_id=f"{owner}/{space_name}",
24
- token=os.environ.get("HF_TOKEN")
25
- )
26
-
27
- # Check if space exists, if not create it
28
- try:
29
- space_info = sdk.get_space_runtime()
30
- print(f"Space {owner}/{space_name} exists.")
31
- exists = True
32
- except Exception:
33
- exists = False
34
-
35
- # Create or update the space
36
- if not exists:
37
- print(f"Creating new space: {owner}/{space_name}")
38
- sdk.create_space(
39
- space_hardware=SpaceHardware.CPU_BASIC,
40
- space_storage=1,
41
- space_sleep_time=3600, # 1 hour of inactivity before sleep
42
- space_stage=SpaceStage.RUNNING,
43
- )
44
-
45
- print(f"Space URL: https://huggingface.co/spaces/{owner}/{space_name}")
46
- return sdk
47
-
48
- if __name__ == "__main__":
49
- create_space()