akhaliq HF Staff commited on
Commit
1418324
Β·
1 Parent(s): 768e149
Files changed (2) hide show
  1. README.md +22 -5
  2. app.py +257 -27
README.md CHANGED
@@ -80,11 +80,18 @@ AnyCoder now includes one-click deployment to Hugging Face Spaces! This feature
80
 
81
  ### How to Deploy
82
 
83
- 1. **Login**: Click the "Sign in with Hugging Face" button in the sidebar and authorize with your Hugging Face account
84
- 2. **Generate Code**: Generate some HTML code using the AI
85
- 3. **Enter Title**: In the sidebar, enter a title for your space (e.g., "My Todo App")
86
- 4. **Deploy**: Click the "πŸš€ Deploy to Space" button
87
- 5. **Share**: Get a shareable URL for your deployed application
 
 
 
 
 
 
 
88
 
89
  **Note**: You need to be logged in with your Hugging Face account to deploy. This ensures that:
90
  - Deployments are created under your own account namespace
@@ -93,6 +100,16 @@ AnyCoder now includes one-click deployment to Hugging Face Spaces! This feature
93
 
94
  **Technical Note**: The deployment uses your personal OAuth token to create spaces under your account, ensuring full security and ownership of your deployed applications.
95
 
 
 
 
 
 
 
 
 
 
 
96
  ### What Gets Deployed
97
 
98
  - **Complete HTML Application**: Your generated code wrapped in a professional template
 
80
 
81
  ### How to Deploy
82
 
83
+ 1. **Login**: Click the "Sign in with Hugging Face" button in the sidebar
84
+ 2. **Authorize Permissions**: When the authorization page appears, make sure to grant ALL the requested permissions:
85
+ - βœ… **read-repos** - Read access to repositories
86
+ - βœ… **write-repos** - Write access to create repositories
87
+ - βœ… **manage-repos** - Manage repository settings
88
+ 3. **Complete Authorization**: Click "Authorize" to complete the login
89
+ 4. **Generate Code**: Generate some HTML code using the AI
90
+ 5. **Enter Title**: In the sidebar, enter a title for your space (e.g., "My Todo App")
91
+ 6. **Deploy**: Click the "πŸš€ Deploy to Space" button
92
+ 7. **Share**: Get a shareable URL for your deployed application
93
+
94
+ **Important**: You must grant ALL three permissions during the OAuth authorization process. If you only grant partial permissions, deployment will fail.
95
 
96
  **Note**: You need to be logged in with your Hugging Face account to deploy. This ensures that:
97
  - Deployments are created under your own account namespace
 
100
 
101
  **Technical Note**: The deployment uses your personal OAuth token to create spaces under your account, ensuring full security and ownership of your deployed applications.
102
 
103
+ ### Troubleshooting Deployment Issues
104
+
105
+ If you encounter permission errors during deployment:
106
+
107
+ 1. **Check Permissions**: Make sure you granted all three required permissions during login
108
+ 2. **Logout and Login Again**: Click logout and sign in again, ensuring all permissions are granted
109
+ 3. **Account Status**: Verify your Hugging Face account allows repository creation
110
+ 4. **Network Issues**: Check your internet connection and try again
111
+ 5. **Contact Support**: If issues persist, contact Hugging Face support
112
+
113
  ### What Gets Deployed
114
 
115
  - **Complete HTML Application**: Your generated code wrapped in a professional template
app.py CHANGED
@@ -185,6 +185,39 @@ if TAVILY_API_KEY:
185
  print(f"Failed to initialize Tavily client: {e}")
186
  tavily_client = None
187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  # Deployment functions
189
  def create_space_from_html(title: str, html_content: str, prompts: List[str] = None, user_token: str = None, username: str = None) -> Dict:
190
  """
@@ -430,15 +463,15 @@ Visit: https://huggingface.co/spaces/{repo_name}
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
  """
435
  Deploy the generated HTML to a Hugging Face Space
436
  """
437
  if not title or not title.strip():
438
- return "❌ Please enter a title for your space."
439
 
440
  if not html_content or not html_content.strip():
441
- return "❌ No HTML content to deploy. Please generate some code first."
442
 
443
  # Check if user is authenticated
444
  if not oauth_profile or not oauth_token:
@@ -462,7 +495,7 @@ To deploy your application, you need to be logged in with your Hugging Face acco
462
  **Note:** Make sure to grant all the requested permissions when authorizing the application.
463
 
464
  ---
465
- *Please log in and try again.*"""
466
 
467
  # Get user information from OAuth profile
468
  username = oauth_profile.name
@@ -480,6 +513,51 @@ To deploy your application, you need to be logged in with your Hugging Face acco
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**
@@ -495,7 +573,7 @@ The OAuth token appears to be invalid or in the wrong format. Please try logging
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:
@@ -507,27 +585,73 @@ The OAuth token appears to be invalid or in the wrong format. Please try logging
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}")
@@ -546,7 +670,7 @@ The OAuth token could not be validated. This could be because:
546
  4. Try deploying again
547
 
548
  ---
549
- *Please log in again.*"""
550
 
551
  # Extract prompts from history
552
  prompts = []
@@ -554,6 +678,87 @@ The OAuth token could not be validated. This could be because:
554
  if isinstance(user_msg, str) and user_msg.strip():
555
  prompts.append(user_msg.strip())
556
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
557
  # Use user's OAuth token to create space under their account
558
  result = create_space_from_html(title.strip(), html_content, prompts, user_token, username)
559
 
@@ -571,7 +776,7 @@ Your application is now live on Hugging Face Spaces under your account. You can
571
  - Manage your space from your Hugging Face dashboard
572
 
573
  ---
574
- *Generated with ❀️ using AnyCoder*"""
575
  else:
576
  return f"""❌ **Deployment failed**
577
 
@@ -584,7 +789,7 @@ Your application is now live on Hugging Face Spaces under your account. You can
584
  - Make sure your Hugging Face account has the necessary permissions
585
 
586
  ---
587
- *Please try again or contact support if the issue persists.*"""
588
 
589
  def history_to_messages(history: History, system: str) -> Messages:
590
  messages = [{'role': 'system', 'content': system}]
@@ -658,6 +863,20 @@ def history_render(history: History):
658
  def clear_history():
659
  return [], [], None, "" # Empty lists for both tuple format and chatbot messages, None for file, empty string for website URL
660
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
661
  def update_image_input_visibility(model):
662
  """Update image input visibility based on selected model"""
663
  is_ernie_vl = model.get("id") == "baidu/ERNIE-4.5-VL-424B-A47B-Base-PT"
@@ -1325,6 +1544,8 @@ with gr.Blocks(
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?",
@@ -1415,6 +1636,12 @@ with gr.Blocks(
1415
  else:
1416
  gr.Markdown("βœ… Web search available")
1417
 
 
 
 
 
 
 
1418
  # Hidden elements for functionality
1419
  model_display = gr.Markdown(f"**Model:** {AVAILABLE_MODELS[0]['name']}", visible=False)
1420
 
@@ -1461,15 +1688,16 @@ with gr.Blocks(
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
@@ -1483,6 +1711,8 @@ If deployment fails:
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"
@@ -1503,7 +1733,7 @@ If deployment fails:
1503
  deploy_btn.click(
1504
  deploy_to_space,
1505
  inputs=[space_title_input, code_output, history],
1506
- outputs=[deploy_output],
1507
  api_name="deploy"
1508
  )
1509
 
 
185
  print(f"Failed to initialize Tavily client: {e}")
186
  tavily_client = None
187
 
188
+ def validate_oauth_scopes(oauth_token) -> Tuple[bool, List[str]]:
189
+ """
190
+ Validate that the OAuth token has the required scopes for creating spaces
191
+ Returns (is_valid, missing_scopes)
192
+ """
193
+ required_scopes = ['read-repos', 'write-repos', 'manage-repos']
194
+
195
+ if not oauth_token:
196
+ return False, required_scopes
197
+
198
+ # Try to get scopes from the token object
199
+ token_scopes = []
200
+
201
+ # Check different ways scopes might be stored
202
+ if hasattr(oauth_token, 'scopes'):
203
+ token_scopes = oauth_token.scopes
204
+ elif hasattr(oauth_token, 'scope'):
205
+ token_scopes = oauth_token.scope.split(' ') if oauth_token.scope else []
206
+ elif hasattr(oauth_token, 'permissions'):
207
+ token_scopes = oauth_token.permissions
208
+ else:
209
+ # If we can't determine scopes, assume they're missing
210
+ return False, required_scopes
211
+
212
+ # Convert to list if it's a string
213
+ if isinstance(token_scopes, str):
214
+ token_scopes = token_scopes.split(' ')
215
+
216
+ # Check for required scopes
217
+ missing_scopes = [scope for scope in required_scopes if scope not in token_scopes]
218
+
219
+ return len(missing_scopes) == 0, missing_scopes
220
+
221
  # Deployment functions
222
  def create_space_from_html(title: str, html_content: str, prompts: List[str] = None, user_token: str = None, username: str = None) -> Dict:
223
  """
 
463
  "message": f"Failed to create space: {error_msg}"
464
  }
465
 
466
+ def deploy_to_space(title: str, html_content: str, history: History, oauth_profile: gr.OAuthProfile = None, oauth_token: gr.OAuthToken = None) -> Tuple[str, str]:
467
  """
468
  Deploy the generated HTML to a Hugging Face Space
469
  """
470
  if not title or not title.strip():
471
+ return "❌ Please enter a title for your space.", update_oauth_status(oauth_profile, oauth_token)
472
 
473
  if not html_content or not html_content.strip():
474
+ return "❌ No HTML content to deploy. Please generate some code first.", update_oauth_status(oauth_profile, oauth_token)
475
 
476
  # Check if user is authenticated
477
  if not oauth_profile or not oauth_token:
 
495
  **Note:** Make sure to grant all the requested permissions when authorizing the application.
496
 
497
  ---
498
+ *Please log in and try again.*""", update_oauth_status(oauth_profile, oauth_token)
499
 
500
  # Get user information from OAuth profile
501
  username = oauth_profile.name
 
513
  print(f"Debug: OAuth profile attributes: {dir(oauth_profile) if oauth_profile else 'None'}")
514
  print(f"Debug: OAuth token attributes: {dir(oauth_token) if oauth_token else 'None'}")
515
 
516
+ # Check OAuth token scopes if available
517
+ if hasattr(oauth_token, 'scopes'):
518
+ print(f"Debug: OAuth token scopes: {oauth_token.scopes}")
519
+ else:
520
+ print("Debug: OAuth token scopes not available")
521
+
522
+ # Check OAuth profile permissions if available
523
+ if hasattr(oauth_profile, 'permissions'):
524
+ print(f"Debug: OAuth profile permissions: {oauth_profile.permissions}")
525
+ else:
526
+ print("Debug: OAuth profile permissions not available")
527
+
528
+ # Validate OAuth scopes
529
+ scopes_valid, missing_scopes = validate_oauth_scopes(oauth_token)
530
+ print(f"Debug: OAuth scopes valid: {scopes_valid}")
531
+ print(f"Debug: Missing scopes: {missing_scopes}")
532
+
533
+ if not scopes_valid:
534
+ return f"""❌ **Missing OAuth Scopes**
535
+
536
+ Your OAuth token is missing the required permissions to create spaces.
537
+
538
+ **Missing Scopes:**
539
+ {chr(10).join([f"- `{scope}`" for scope in missing_scopes])}
540
+
541
+ **Required Scopes:**
542
+ - `read-repos` - Read access to repositories
543
+ - `write-repos` - Write access to create repositories
544
+ - `manage-repos` - Manage repository settings
545
+
546
+ **Steps to fix:**
547
+ 1. **Logout**: Click the logout button in the sidebar
548
+ 2. **Login Again**: Click "Sign in with Hugging Face" again
549
+ 3. **Grant All Permissions**: When the authorization page appears, make sure to check ALL the requested permissions:
550
+ - βœ… read-repos
551
+ - βœ… write-repos
552
+ - βœ… manage-repos
553
+ 4. **Complete Authorization**: Click "Authorize" to complete the login
554
+ 5. **Try Deploying**: Try deploying again
555
+
556
+ **Important:** Make sure you see all three permissions checked on the authorization page before clicking "Authorize".
557
+
558
+ ---
559
+ *Please log in again with full permissions.*""", update_oauth_status(oauth_profile, oauth_token)
560
+
561
  # Validate token format
562
  if not user_token or not user_token.startswith('hf_'):
563
  return """❌ **Invalid Token Format**
 
573
  **Note:** Make sure you authorize all the required permissions when logging in.
574
 
575
  ---
576
+ *Please try logging in again.*""", update_oauth_status(oauth_profile, oauth_token)
577
 
578
  # Test the token by making a simple API call
579
  try:
 
585
  try:
586
  repos = test_api.list_repos(author=username, token=user_token)
587
  print(f"Debug: User has {len(list(repos))} repositories")
588
+
589
+ # Test if user can create repositories by checking their account type
590
+ try:
591
+ # Try to get user info to check account capabilities
592
+ user_info = test_api.whoami()
593
+ print(f"Debug: User info: {user_info}")
594
+
595
+ # Check if user has pro account or sufficient permissions
596
+ if user_info.get('type') == 'user':
597
+ print("Debug: User account type confirmed")
598
+ else:
599
+ print(f"Debug: User account type: {user_info.get('type', 'unknown')}")
600
+
601
+ except Exception as user_info_error:
602
+ print(f"Debug: Could not get detailed user info: {user_info_error}")
603
+
604
  except Exception as repo_error:
605
  print(f"Debug: Could not list repos: {repo_error}")
606
+
607
+ # Check if this is a scope/permission issue
608
+ error_msg = str(repo_error).lower()
609
+ if "403" in error_msg or "forbidden" in error_msg or "unauthorized" in error_msg:
610
+ return """❌ **Insufficient Permissions**
611
 
612
  Your Hugging Face account doesn't have the necessary permissions to create spaces. This could be because:
613
 
614
+ 1. **Missing OAuth Scopes**: You didn't grant all the required permissions during login
615
+ 2. **Account Restrictions**: Your account has restrictions on creating repositories
616
+ 3. **Token Scope Issues**: The OAuth token doesn't include the necessary scopes
617
+
618
+ **Required Permissions:**
619
+ - `read-repos` - Read access to repositories
620
+ - `write-repos` - Write access to create repositories
621
+ - `manage-repos` - Manage repository settings
622
 
623
  **Steps to fix:**
624
+ 1. **Logout**: Click the logout button in the sidebar
625
+ 2. **Login Again**: Click "Sign in with Hugging Face" again
626
+ 3. **Grant All Permissions**: When the authorization page appears, make sure to check ALL the requested permissions:
627
+ - βœ… read-repos
628
+ - βœ… write-repos
629
+ - βœ… manage-repos
630
+ 4. **Complete Authorization**: Click "Authorize" to complete the login
631
+ 5. **Try Deploying**: Try deploying again
632
+
633
+ **Important:** Make sure you see all three permissions checked on the authorization page before clicking "Authorize".
634
+
635
+ ---
636
+ *Please log in again with full permissions.*""", update_oauth_status(oauth_profile, oauth_token)
637
+ else:
638
+ return f"""❌ **Repository Access Error**
639
+
640
+ Error: {str(repo_error)}
641
+
642
+ This could be due to:
643
+ - Network connectivity issues
644
+ - Hugging Face API temporary problems
645
+ - Account-specific restrictions
646
+
647
+ **Steps to fix:**
648
+ 1. Check your internet connection
649
+ 2. Try logging out and logging back in
650
+ 3. Wait a few minutes and try again
651
+ 4. If the problem persists, check your Hugging Face account settings
652
 
653
  ---
654
+ *Please try again or contact support if the issue persists.*""", update_oauth_status(oauth_profile, oauth_token)
655
 
656
  except Exception as token_error:
657
  print(f"Debug: Token test failed: {token_error}")
 
670
  4. Try deploying again
671
 
672
  ---
673
+ *Please log in again.*""", update_oauth_status(oauth_profile, oauth_token)
674
 
675
  # Extract prompts from history
676
  prompts = []
 
678
  if isinstance(user_msg, str) and user_msg.strip():
679
  prompts.append(user_msg.strip())
680
 
681
+ # Test if user can create repositories by attempting a test creation
682
+ try:
683
+ test_api = HfApi(token=user_token)
684
+
685
+ # Try to create a test repository to verify permissions
686
+ test_repo_name = f"{username}/test-permissions-{int(time.time())}"
687
+ print(f"Debug: Testing repository creation with: {test_repo_name}")
688
+
689
+ try:
690
+ # Attempt to create a test repository
691
+ test_repo_url = test_api.create_repo(
692
+ repo_id=test_repo_name,
693
+ repo_type="model",
694
+ private=True,
695
+ exist_ok=False,
696
+ token=user_token
697
+ )
698
+ print(f"Debug: Successfully created test repository: {test_repo_url}")
699
+
700
+ # Clean up the test repository
701
+ try:
702
+ test_api.delete_repo(repo_id=test_repo_name, token=user_token)
703
+ print(f"Debug: Successfully cleaned up test repository")
704
+ except Exception as cleanup_error:
705
+ print(f"Debug: Could not clean up test repository: {cleanup_error}")
706
+
707
+ except Exception as test_create_error:
708
+ print(f"Debug: Could not create test repository: {test_create_error}")
709
+ error_msg = str(test_create_error).lower()
710
+
711
+ if "403" in error_msg or "forbidden" in error_msg:
712
+ return """❌ **Repository Creation Permission Denied**
713
+
714
+ Your Hugging Face account doesn't have permission to create repositories. This could be because:
715
+
716
+ 1. **Account Type**: Your account type may not allow repository creation
717
+ 2. **Organization Restrictions**: If you're part of an organization, there may be restrictions
718
+ 3. **Account Status**: Your account may be limited or suspended
719
+
720
+ **Steps to fix:**
721
+ 1. **Check Account Status**: Visit https://huggingface.co/settings/account to check your account status
722
+ 2. **Verify Account Type**: Make sure your account allows repository creation
723
+ 3. **Contact Support**: If you believe this is an error, contact Hugging Face support
724
+ 4. **Try Different Account**: Consider using a different Hugging Face account
725
+
726
+ **Note:** Free accounts should be able to create repositories. If you're having issues, it might be a temporary restriction.
727
+
728
+ ---
729
+ *Please check your account settings or try with a different account.*""", update_oauth_status(oauth_profile, oauth_token)
730
+ else:
731
+ return f"""❌ **Repository Creation Test Failed**
732
+
733
+ Error: {str(test_create_error)}
734
+
735
+ This could be due to:
736
+ - Network connectivity issues
737
+ - Hugging Face API temporary problems
738
+ - Account-specific restrictions
739
+
740
+ **Steps to fix:**
741
+ 1. Check your internet connection
742
+ 2. Wait a few minutes and try again
743
+ 3. If the problem persists, check your Hugging Face account settings
744
+
745
+ ---
746
+ *Please try again or contact support if the issue persists.*""", update_oauth_status(oauth_profile, oauth_token)
747
+
748
+ except Exception as test_error:
749
+ print(f"Debug: Repository creation test failed: {test_error}")
750
+ return f"""❌ **Permission Test Failed**
751
+
752
+ Could not test repository creation permissions: {str(test_error)}
753
+
754
+ **Steps to fix:**
755
+ 1. Check your internet connection
756
+ 2. Try logging out and logging back in
757
+ 3. Wait a few minutes and try again
758
+
759
+ ---
760
+ *Please try again or contact support if the issue persists.*""", update_oauth_status(oauth_profile, oauth_token)
761
+
762
  # Use user's OAuth token to create space under their account
763
  result = create_space_from_html(title.strip(), html_content, prompts, user_token, username)
764
 
 
776
  - Manage your space from your Hugging Face dashboard
777
 
778
  ---
779
+ *Generated with ❀️ using AnyCoder*""", update_oauth_status(oauth_profile, oauth_token)
780
  else:
781
  return f"""❌ **Deployment failed**
782
 
 
789
  - Make sure your Hugging Face account has the necessary permissions
790
 
791
  ---
792
+ *Please try again or contact support if the issue persists.*""", update_oauth_status(oauth_profile, oauth_token)
793
 
794
  def history_to_messages(history: History, system: str) -> Messages:
795
  messages = [{'role': 'system', 'content': system}]
 
863
  def clear_history():
864
  return [], [], None, "" # Empty lists for both tuple format and chatbot messages, None for file, empty string for website URL
865
 
866
+ def update_oauth_status(oauth_profile: gr.OAuthProfile = None, oauth_token: gr.OAuthToken = None):
867
+ """Update the OAuth status indicator based on login state"""
868
+ if not oauth_profile or not oauth_token:
869
+ return "πŸ” **Login Required**\nSign in to deploy applications"
870
+
871
+ # Check if we have the required scopes
872
+ scopes_valid, missing_scopes = validate_oauth_scopes(oauth_token)
873
+
874
+ if scopes_valid:
875
+ return f"βœ… **Logged in as {oauth_profile.name}**\nReady to deploy applications"
876
+ else:
877
+ missing_list = ", ".join(missing_scopes)
878
+ return f"⚠️ **Incomplete Permissions**\nMissing: {missing_list}\nPlease logout and login again"
879
+
880
  def update_image_input_visibility(model):
881
  """Update image input visibility based on selected model"""
882
  is_ernie_vl = model.get("id") == "baidu/ERNIE-4.5-VL-424B-A47B-Base-PT"
 
1544
  # OAuth components are automatically injected as function parameters
1545
  # when using gr.LoginButton() - no need to create them separately
1546
 
1547
+ # OAuth status will be updated automatically by Gradio's OAuth system
1548
+
1549
  # Main input section
1550
  input = gr.Textbox(
1551
  label="What would you like to build?",
 
1636
  else:
1637
  gr.Markdown("βœ… Web search available")
1638
 
1639
+ # OAuth status indicator
1640
+ oauth_status = gr.Markdown(
1641
+ value="πŸ” **Login Required**\nSign in to deploy applications",
1642
+ visible=True
1643
+ )
1644
+
1645
  # Hidden elements for functionality
1646
  model_display = gr.Markdown(f"**Model:** {AVAILABLE_MODELS[0]['name']}", visible=False)
1647
 
 
1688
  ### Prerequisites
1689
  1. **Login Required**: You must be logged in with your Hugging Face account
1690
  2. **Permissions**: Grant the following permissions when logging in:
1691
+ - βœ… **read-repos** - Read access to repositories
1692
+ - βœ… **write-repos** - Write access to create repositories
1693
+ - βœ… **manage-repos** - Manage repository settings
1694
 
1695
  ### Steps to Deploy
1696
  1. **Login**: Click "Sign in with Hugging Face" in the sidebar
1697
+ 2. **Authorize Permissions**: When the authorization page appears, make sure to grant ALL the requested permissions
1698
+ 3. **Generate Code**: Generate some HTML code using the AI
1699
+ 4. **Enter Title**: In the sidebar, enter a title for your space (e.g., "My Todo App")
1700
+ 5. **Deploy**: Click the "πŸš€ Deploy to Space" button
1701
 
1702
  ### What Happens
1703
  - Your application will be deployed to Hugging Face Spaces under your account
 
1711
  - Try logging out and logging back in
1712
  - Check that your Hugging Face account can create repositories
1713
 
1714
+ **Important**: You must grant ALL three permissions during the OAuth authorization process.
1715
+
1716
  ---
1717
  *Your application will be deployed to Hugging Face Spaces and you'll get a shareable URL!*""",
1718
  label="Deployment Status"
 
1733
  deploy_btn.click(
1734
  deploy_to_space,
1735
  inputs=[space_title_input, code_output, history],
1736
+ outputs=[deploy_output, oauth_status],
1737
  api_name="deploy"
1738
  )
1739