Spaces:
Running
Running
update
Browse files
README.md
CHANGED
|
@@ -10,6 +10,7 @@ pinned: false
|
|
| 10 |
disable_embedding: true
|
| 11 |
hf_oauth: true
|
| 12 |
hf_oauth_scopes:
|
|
|
|
| 13 |
- write-repos
|
| 14 |
- manage-repos
|
| 15 |
---
|
|
|
|
| 10 |
disable_embedding: true
|
| 11 |
hf_oauth: true
|
| 12 |
hf_oauth_scopes:
|
| 13 |
+
- read-repos
|
| 14 |
- write-repos
|
| 15 |
- manage-repos
|
| 16 |
---
|
app.py
CHANGED
|
@@ -211,6 +211,15 @@ def create_space_from_html(title: str, html_content: str, prompts: List[str] = N
|
|
| 211 |
if not username:
|
| 212 |
username = user_info.get('name', 'user')
|
| 213 |
print(f"Debug: Final username: {username}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 214 |
except Exception as e:
|
| 215 |
print(f"Debug: Could not get user info: {e}")
|
| 216 |
return {
|
|
@@ -232,16 +241,27 @@ def create_space_from_html(title: str, html_content: str, prompts: List[str] = N
|
|
| 232 |
|
| 233 |
# Create the space
|
| 234 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
repo_url = user_hf_api.create_repo(
|
| 236 |
repo_id=repo_name,
|
| 237 |
repo_type="space",
|
| 238 |
space_sdk="static",
|
| 239 |
private=False,
|
| 240 |
-
exist_ok=False
|
|
|
|
| 241 |
)
|
| 242 |
print(f"Debug: Successfully created space: {repo_url}")
|
| 243 |
except Exception as e:
|
| 244 |
print(f"Debug: Failed to create space: {e}")
|
|
|
|
|
|
|
| 245 |
raise e
|
| 246 |
|
| 247 |
# Prepare the HTML content with proper structure
|
|
@@ -311,13 +331,28 @@ def create_space_from_html(title: str, html_content: str, prompts: List[str] = N
|
|
| 311 |
|
| 312 |
full_html = html_template.format(title=title, html_content=html_content)
|
| 313 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 314 |
# Upload the HTML file
|
|
|
|
| 315 |
user_hf_api.upload_file(
|
| 316 |
path_or_fileobj=full_html.encode('utf-8'),
|
| 317 |
path_in_repo="index.html",
|
| 318 |
repo_id=repo_name,
|
| 319 |
-
repo_type="space"
|
|
|
|
| 320 |
)
|
|
|
|
| 321 |
|
| 322 |
# Create README.md with project info
|
| 323 |
prompts_text = "".join([f"- {prompt}\n" for prompt in (prompts or [])])
|
|
@@ -343,12 +378,15 @@ Visit: https://huggingface.co/spaces/{repo_name}
|
|
| 343 |
|
| 344 |
readme_content = readme_template.format(title=title, prompts_text=prompts_text, repo_name=repo_name)
|
| 345 |
|
|
|
|
| 346 |
user_hf_api.upload_file(
|
| 347 |
path_or_fileobj=readme_content.encode('utf-8'),
|
| 348 |
path_in_repo="README.md",
|
| 349 |
repo_id=repo_name,
|
| 350 |
-
repo_type="space"
|
|
|
|
| 351 |
)
|
|
|
|
| 352 |
|
| 353 |
return {
|
| 354 |
"success": True,
|
|
@@ -358,11 +396,39 @@ Visit: https://huggingface.co/spaces/{repo_name}
|
|
| 358 |
}
|
| 359 |
|
| 360 |
except Exception as e:
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 366 |
|
| 367 |
def deploy_to_space(title: str, html_content: str, history: History, oauth_profile: gr.OAuthProfile = None, oauth_token: gr.OAuthToken = None) -> str:
|
| 368 |
"""
|
|
@@ -382,7 +448,10 @@ To deploy your application, you need to be logged in with your Hugging Face acco
|
|
| 382 |
|
| 383 |
**How to log in:**
|
| 384 |
1. Click the "Sign in with Hugging Face" button in the sidebar
|
| 385 |
-
2. Authorize AnyCoder to access your Hugging Face account
|
|
|
|
|
|
|
|
|
|
| 386 |
3. Try deploying again
|
| 387 |
|
| 388 |
**Why login is required:**
|
|
@@ -390,6 +459,8 @@ To deploy your application, you need to be logged in with your Hugging Face acco
|
|
| 390 |
- You need write permissions to create spaces
|
| 391 |
- This ensures you own and can manage your deployed applications
|
| 392 |
|
|
|
|
|
|
|
| 393 |
---
|
| 394 |
*Please log in and try again.*"""
|
| 395 |
|
|
@@ -403,6 +474,80 @@ To deploy your application, you need to be logged in with your Hugging Face acco
|
|
| 403 |
print(f"Debug: Token length: {len(user_token) if user_token else 0}")
|
| 404 |
print(f"Debug: Token starts with: {user_token[:10] if user_token else 'None'}...")
|
| 405 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 406 |
# Extract prompts from history
|
| 407 |
prompts = []
|
| 408 |
for user_msg, _ in history:
|
|
@@ -1177,6 +1322,9 @@ with gr.Blocks(
|
|
| 1177 |
size="sm"
|
| 1178 |
)
|
| 1179 |
|
|
|
|
|
|
|
|
|
|
| 1180 |
# Main input section
|
| 1181 |
input = gr.Textbox(
|
| 1182 |
label="What would you like to build?",
|
|
@@ -1308,7 +1456,35 @@ with gr.Blocks(
|
|
| 1308 |
sandbox = gr.HTML(label="Live preview")
|
| 1309 |
with gr.Tab("Deploy"):
|
| 1310 |
deploy_output = gr.Markdown(
|
| 1311 |
-
value="## π Deploy Your Application
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1312 |
label="Deployment Status"
|
| 1313 |
)
|
| 1314 |
with gr.Tab("History"):
|
|
|
|
| 211 |
if not username:
|
| 212 |
username = user_info.get('name', 'user')
|
| 213 |
print(f"Debug: Final username: {username}")
|
| 214 |
+
|
| 215 |
+
# Additional validation
|
| 216 |
+
if not username or username == 'user':
|
| 217 |
+
return {
|
| 218 |
+
"success": False,
|
| 219 |
+
"error": "Could not retrieve username from token",
|
| 220 |
+
"message": "The authentication token is valid but username could not be retrieved. Please try logging in again."
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
except Exception as e:
|
| 224 |
print(f"Debug: Could not get user info: {e}")
|
| 225 |
return {
|
|
|
|
| 241 |
|
| 242 |
# Create the space
|
| 243 |
try:
|
| 244 |
+
print(f"Debug: Creating space with parameters:")
|
| 245 |
+
print(f" repo_id: {repo_name}")
|
| 246 |
+
print(f" repo_type: space")
|
| 247 |
+
print(f" space_sdk: static")
|
| 248 |
+
print(f" private: False")
|
| 249 |
+
print(f" exist_ok: False")
|
| 250 |
+
print(f" token length: {len(api_token) if api_token else 0}")
|
| 251 |
+
|
| 252 |
repo_url = user_hf_api.create_repo(
|
| 253 |
repo_id=repo_name,
|
| 254 |
repo_type="space",
|
| 255 |
space_sdk="static",
|
| 256 |
private=False,
|
| 257 |
+
exist_ok=False,
|
| 258 |
+
token=api_token
|
| 259 |
)
|
| 260 |
print(f"Debug: Successfully created space: {repo_url}")
|
| 261 |
except Exception as e:
|
| 262 |
print(f"Debug: Failed to create space: {e}")
|
| 263 |
+
print(f"Debug: Exception type: {type(e)}")
|
| 264 |
+
print(f"Debug: Exception args: {e.args}")
|
| 265 |
raise e
|
| 266 |
|
| 267 |
# Prepare the HTML content with proper structure
|
|
|
|
| 331 |
|
| 332 |
full_html = html_template.format(title=title, html_content=html_content)
|
| 333 |
|
| 334 |
+
# Check HTML content size
|
| 335 |
+
html_size = len(full_html.encode('utf-8'))
|
| 336 |
+
print(f"Debug: HTML content size: {html_size} bytes")
|
| 337 |
+
|
| 338 |
+
if html_size > 1000000: # 1MB limit
|
| 339 |
+
print(f"Debug: Warning - HTML content is large ({html_size} bytes)")
|
| 340 |
+
# Truncate if too large
|
| 341 |
+
if len(html_content) > 500000: # 500KB limit for content
|
| 342 |
+
html_content = html_content[:500000] + "\n<!-- Content truncated due to size -->"
|
| 343 |
+
full_html = html_template.format(title=title, html_content=html_content)
|
| 344 |
+
print(f"Debug: HTML content truncated to {len(full_html.encode('utf-8'))} bytes")
|
| 345 |
+
|
| 346 |
# Upload the HTML file
|
| 347 |
+
print(f"Debug: Uploading index.html to {repo_name}")
|
| 348 |
user_hf_api.upload_file(
|
| 349 |
path_or_fileobj=full_html.encode('utf-8'),
|
| 350 |
path_in_repo="index.html",
|
| 351 |
repo_id=repo_name,
|
| 352 |
+
repo_type="space",
|
| 353 |
+
token=api_token
|
| 354 |
)
|
| 355 |
+
print(f"Debug: Successfully uploaded index.html")
|
| 356 |
|
| 357 |
# Create README.md with project info
|
| 358 |
prompts_text = "".join([f"- {prompt}\n" for prompt in (prompts or [])])
|
|
|
|
| 378 |
|
| 379 |
readme_content = readme_template.format(title=title, prompts_text=prompts_text, repo_name=repo_name)
|
| 380 |
|
| 381 |
+
print(f"Debug: Uploading README.md to {repo_name}")
|
| 382 |
user_hf_api.upload_file(
|
| 383 |
path_or_fileobj=readme_content.encode('utf-8'),
|
| 384 |
path_in_repo="README.md",
|
| 385 |
repo_id=repo_name,
|
| 386 |
+
repo_type="space",
|
| 387 |
+
token=api_token
|
| 388 |
)
|
| 389 |
+
print(f"Debug: Successfully uploaded README.md")
|
| 390 |
|
| 391 |
return {
|
| 392 |
"success": True,
|
|
|
|
| 396 |
}
|
| 397 |
|
| 398 |
except Exception as e:
|
| 399 |
+
error_msg = str(e)
|
| 400 |
+
|
| 401 |
+
# Handle specific API errors
|
| 402 |
+
if "401" in error_msg or "Unauthorized" in error_msg:
|
| 403 |
+
return {
|
| 404 |
+
"success": False,
|
| 405 |
+
"error": "Authentication failed - please log in again",
|
| 406 |
+
"message": "Your token may have expired. Please log out and log back in."
|
| 407 |
+
}
|
| 408 |
+
elif "403" in error_msg or "Forbidden" in error_msg:
|
| 409 |
+
return {
|
| 410 |
+
"success": False,
|
| 411 |
+
"error": "Permission denied - insufficient privileges",
|
| 412 |
+
"message": "You may not have permission to create spaces. Please check your Hugging Face account settings."
|
| 413 |
+
}
|
| 414 |
+
elif "409" in error_msg or "Conflict" in error_msg:
|
| 415 |
+
return {
|
| 416 |
+
"success": False,
|
| 417 |
+
"error": "Repository already exists",
|
| 418 |
+
"message": "A space with this name already exists. Please try a different title."
|
| 419 |
+
}
|
| 420 |
+
elif "422" in error_msg or "Validation" in error_msg:
|
| 421 |
+
return {
|
| 422 |
+
"success": False,
|
| 423 |
+
"error": "Invalid repository name",
|
| 424 |
+
"message": "The space title contains invalid characters. Please use only letters, numbers, hyphens, and underscores."
|
| 425 |
+
}
|
| 426 |
+
else:
|
| 427 |
+
return {
|
| 428 |
+
"success": False,
|
| 429 |
+
"error": error_msg,
|
| 430 |
+
"message": f"Failed to create space: {error_msg}"
|
| 431 |
+
}
|
| 432 |
|
| 433 |
def deploy_to_space(title: str, html_content: str, history: History, oauth_profile: gr.OAuthProfile = None, oauth_token: gr.OAuthToken = None) -> str:
|
| 434 |
"""
|
|
|
|
| 448 |
|
| 449 |
**How to log in:**
|
| 450 |
1. Click the "Sign in with Hugging Face" button in the sidebar
|
| 451 |
+
2. Authorize AnyCoder to access your Hugging Face account with the required permissions:
|
| 452 |
+
- read-repos
|
| 453 |
+
- write-repos
|
| 454 |
+
- manage-repos
|
| 455 |
3. Try deploying again
|
| 456 |
|
| 457 |
**Why login is required:**
|
|
|
|
| 459 |
- You need write permissions to create spaces
|
| 460 |
- This ensures you own and can manage your deployed applications
|
| 461 |
|
| 462 |
+
**Note:** Make sure to grant all the requested permissions when authorizing the application.
|
| 463 |
+
|
| 464 |
---
|
| 465 |
*Please log in and try again.*"""
|
| 466 |
|
|
|
|
| 474 |
print(f"Debug: Token length: {len(user_token) if user_token else 0}")
|
| 475 |
print(f"Debug: Token starts with: {user_token[:10] if user_token else 'None'}...")
|
| 476 |
|
| 477 |
+
# Additional debugging for OAuth components
|
| 478 |
+
print(f"Debug: OAuth profile type: {type(oauth_profile)}")
|
| 479 |
+
print(f"Debug: OAuth token type: {type(oauth_token)}")
|
| 480 |
+
print(f"Debug: OAuth profile attributes: {dir(oauth_profile) if oauth_profile else 'None'}")
|
| 481 |
+
print(f"Debug: OAuth token attributes: {dir(oauth_token) if oauth_token else 'None'}")
|
| 482 |
+
|
| 483 |
+
# Validate token format
|
| 484 |
+
if not user_token or not user_token.startswith('hf_'):
|
| 485 |
+
return """β **Invalid Token Format**
|
| 486 |
+
|
| 487 |
+
The OAuth token appears to be invalid or in the wrong format. Please try logging out and logging back in.
|
| 488 |
+
|
| 489 |
+
**Steps to fix:**
|
| 490 |
+
1. Click the logout button in the sidebar
|
| 491 |
+
2. Click "Sign in with Hugging Face" again
|
| 492 |
+
3. Authorize the application with the required permissions (read-repos, write-repos, manage-repos)
|
| 493 |
+
4. Try deploying again
|
| 494 |
+
|
| 495 |
+
**Note:** Make sure you authorize all the required permissions when logging in.
|
| 496 |
+
|
| 497 |
+
---
|
| 498 |
+
*Please try logging in again.*"""
|
| 499 |
+
|
| 500 |
+
# Test the token by making a simple API call
|
| 501 |
+
try:
|
| 502 |
+
test_api = HfApi(token=user_token)
|
| 503 |
+
user_info = test_api.whoami()
|
| 504 |
+
print(f"Debug: Token test successful - user: {user_info.get('name', 'unknown')}")
|
| 505 |
+
|
| 506 |
+
# Check if user has the necessary permissions by trying to list their repos
|
| 507 |
+
try:
|
| 508 |
+
repos = test_api.list_repos(author=username, token=user_token)
|
| 509 |
+
print(f"Debug: User has {len(list(repos))} repositories")
|
| 510 |
+
except Exception as repo_error:
|
| 511 |
+
print(f"Debug: Could not list repos: {repo_error}")
|
| 512 |
+
return """β **Insufficient Permissions**
|
| 513 |
+
|
| 514 |
+
Your Hugging Face account doesn't have the necessary permissions to create spaces. This could be because:
|
| 515 |
+
|
| 516 |
+
1. You didn't grant all the required permissions during login
|
| 517 |
+
2. Your account has restrictions on creating repositories
|
| 518 |
+
3. The OAuth token doesn't include the necessary scopes
|
| 519 |
+
|
| 520 |
+
**Steps to fix:**
|
| 521 |
+
1. Click the logout button in the sidebar
|
| 522 |
+
2. Click "Sign in with Hugging Face" again
|
| 523 |
+
3. Make sure to grant ALL the requested permissions:
|
| 524 |
+
- read-repos
|
| 525 |
+
- write-repos
|
| 526 |
+
- manage-repos
|
| 527 |
+
4. Try deploying again
|
| 528 |
+
|
| 529 |
+
---
|
| 530 |
+
*Please log in again with full permissions.*"""
|
| 531 |
+
|
| 532 |
+
except Exception as token_error:
|
| 533 |
+
print(f"Debug: Token test failed: {token_error}")
|
| 534 |
+
return """β **Token Validation Failed**
|
| 535 |
+
|
| 536 |
+
The OAuth token could not be validated. This could be because:
|
| 537 |
+
|
| 538 |
+
1. The token has expired
|
| 539 |
+
2. The token doesn't have the right permissions
|
| 540 |
+
3. There's an issue with the authentication
|
| 541 |
+
|
| 542 |
+
**Steps to fix:**
|
| 543 |
+
1. Click the logout button in the sidebar
|
| 544 |
+
2. Click "Sign in with Hugging Face" again
|
| 545 |
+
3. Authorize with all required permissions
|
| 546 |
+
4. Try deploying again
|
| 547 |
+
|
| 548 |
+
---
|
| 549 |
+
*Please log in again.*"""
|
| 550 |
+
|
| 551 |
# Extract prompts from history
|
| 552 |
prompts = []
|
| 553 |
for user_msg, _ in history:
|
|
|
|
| 1322 |
size="sm"
|
| 1323 |
)
|
| 1324 |
|
| 1325 |
+
# OAuth components are automatically injected as function parameters
|
| 1326 |
+
# when using gr.LoginButton() - no need to create them separately
|
| 1327 |
+
|
| 1328 |
# Main input section
|
| 1329 |
input = gr.Textbox(
|
| 1330 |
label="What would you like to build?",
|
|
|
|
| 1456 |
sandbox = gr.HTML(label="Live preview")
|
| 1457 |
with gr.Tab("Deploy"):
|
| 1458 |
deploy_output = gr.Markdown(
|
| 1459 |
+
value="""## π Deploy Your Application
|
| 1460 |
+
|
| 1461 |
+
### Prerequisites
|
| 1462 |
+
1. **Login Required**: You must be logged in with your Hugging Face account
|
| 1463 |
+
2. **Permissions**: Grant the following permissions when logging in:
|
| 1464 |
+
- read-repos
|
| 1465 |
+
- write-repos
|
| 1466 |
+
- manage-repos
|
| 1467 |
+
|
| 1468 |
+
### Steps to Deploy
|
| 1469 |
+
1. **Login**: Click "Sign in with Hugging Face" in the sidebar
|
| 1470 |
+
2. **Generate Code**: Generate some HTML code using the AI
|
| 1471 |
+
3. **Enter Title**: In the sidebar, enter a title for your space (e.g., "My Todo App")
|
| 1472 |
+
4. **Deploy**: Click the "π Deploy to Space" button
|
| 1473 |
+
|
| 1474 |
+
### What Happens
|
| 1475 |
+
- Your application will be deployed to Hugging Face Spaces under your account
|
| 1476 |
+
- You'll get a shareable URL (e.g., `https://huggingface.co/spaces/yourusername/my-app-1234567890`)
|
| 1477 |
+
- The deployment includes professional styling and documentation
|
| 1478 |
+
|
| 1479 |
+
### Troubleshooting
|
| 1480 |
+
If deployment fails:
|
| 1481 |
+
- Make sure you're logged in with the correct account
|
| 1482 |
+
- Ensure you granted all required permissions during login
|
| 1483 |
+
- Try logging out and logging back in
|
| 1484 |
+
- Check that your Hugging Face account can create repositories
|
| 1485 |
+
|
| 1486 |
+
---
|
| 1487 |
+
*Your application will be deployed to Hugging Face Spaces and you'll get a shareable URL!*""",
|
| 1488 |
label="Deployment Status"
|
| 1489 |
)
|
| 1490 |
with gr.Tab("History"):
|