Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from huggingface_hub import list_spaces, whoami, HfFolder | |
| from huggingface_hub.hf_api import HfHubHTTPError | |
| def list_my_hf_spaces(hf_username_or_org: str): | |
| """ | |
| Lists all Hugging Face Spaces for a given username or organization. | |
| Args: | |
| hf_username_or_org (str): The Hugging Face username or organization name. | |
| Returns: | |
| list: A list of dictionaries, where each dictionary contains details of a space. | |
| Suitable for use with gradio.DataFrame. Returns a list with an error | |
| message if an issue occurs. | |
| """ | |
| try: | |
| print(f"Fetching Hugging Face Spaces for user/org: {hf_username_or_org}") # Server-side log | |
| if not hf_username_or_org or not hf_username_or_org.strip(): | |
| # Return list of lists format for error | |
| return [["Error", "Username/Organization cannot be empty.", "-", "-", "-", "-"]] | |
| spaces_objects = list_spaces(author=hf_username_or_org.strip()) | |
| if not spaces_objects: | |
| # Return list of lists format for no spaces found | |
| return [[f"No spaces found for '{hf_username_or_org}'", "Check username/org or authentication.", "-", "-", "-", "-"]] | |
| spaces_data_list_of_lists = [] | |
| for space in spaces_objects: | |
| row = [ | |
| f"[{space.id}](https://huggingface.co/spaces/{space.id})", | |
| getattr(space, 'author', 'N/A'), | |
| str(getattr(space, 'lastModified', 'N/A')), | |
| str(getattr(space, 'private', 'N/A')), | |
| str(getattr(space, 'gated', 'N/A')), | |
| getattr(space, 'sdk', 'N/A') | |
| ] | |
| spaces_data_list_of_lists.append(row) | |
| return spaces_data_list_of_lists | |
| except Exception as e: | |
| error_message = f"An error occurred: {str(e)}. Ensure correct username/org and HF authentication (huggingface-cli login or HF_TOKEN)." | |
| print(error_message) # Server-side log | |
| # Return list of lists format for exception | |
| return [["Error", error_message, "-", "-", "-", "-"]] | |
| def list_my_hf_organizations(token: str = None): | |
| """ | |
| Lists organizations the Hugging Face user (identified by the token) is a member of. | |
| Args: | |
| token (str, optional): Hugging Face API token. | |
| If None or empty, attempts to load token via HfFolder.get_token(). | |
| Returns: | |
| list: A list of lists, where each inner list contains an organization name (as a Markdown link). | |
| Suitable for use with gradio.DataFrame. | |
| """ | |
| try: | |
| if not token: # If token param is None or empty | |
| token = HfFolder.get_token() | |
| if not token: | |
| return [["Error: Not logged in", "Please log in using 'huggingface-cli login'."]] | |
| print("Fetching organizations for the authenticated user...") # Server-side log | |
| user_info = whoami(token=token) | |
| if not user_info or 'orgs' not in user_info: | |
| return [["Info", "No organization information found or user data incomplete."]] | |
| org_list_from_api = user_info.get('orgs', []) | |
| if not org_list_from_api: | |
| return [["Info", "Authenticated user is not a member of any organizations."]] | |
| orgs_data = [] | |
| for org_dict in org_list_from_api: | |
| org_name = org_dict.get('name') | |
| if org_name: | |
| org_link = f"[{org_name}](https://huggingface.co/{org_name})" | |
| orgs_data.append([org_link]) # Store as a list containing the Markdown link | |
| if not orgs_data: | |
| return [["Info", "Found organization entries but no names extracted."]] | |
| return orgs_data | |
| except HfHubHTTPError as e: | |
| if e.response.status_code == 401: | |
| error_msg = "Authentication error. Please ensure you are logged in ('huggingface-cli login')." | |
| else: | |
| error_msg = f"API Error: {str(e)}" | |
| print(error_msg) # Server-side log | |
| return [["Error", error_msg]] | |
| except Exception as e: | |
| error_message = f"An unexpected error occurred: {str(e)}" | |
| print(error_message) # Server-side log | |
| return [["Error", error_message]] | |
| def list_organization_spaces(org_name: str): | |
| """ | |
| Lists all public Hugging Face Spaces for a given organization. | |
| Args: | |
| org_name (str): The name of the Hugging Face organization. | |
| Returns: | |
| list: A list of lists, where each inner list contains Space details. | |
| Suitable for use with gradio.DataFrame. | |
| The Space ID is formatted as a Markdown link. | |
| """ | |
| try: | |
| if not org_name or not org_name.strip(): | |
| return [["Error", "Organization name cannot be empty.", "-", "-", "-", "-"]] | |
| print(f"Fetching Hugging Face Spaces for organization: {org_name.strip()}") # Server-side log | |
| spaces_objects = list_spaces(author=org_name.strip()) # Use author field for organization | |
| if not spaces_objects: | |
| return [[f"No Spaces found for organization '{org_name.strip()}'", "Organization may not exist or have no public spaces.", "-", "-", "-", "-"]] | |
| spaces_data_list_of_lists = [] | |
| for space in spaces_objects: | |
| row = [ | |
| f"[{space.id}](https://huggingface.co/spaces/{space.id})", | |
| getattr(space, 'author', 'N/A'), | |
| str(getattr(space, 'lastModified', 'N/A')), | |
| str(getattr(space, 'private', 'N/A')), | |
| str(getattr(space, 'gated', 'N/A')), | |
| getattr(space, 'sdk', 'N/A') | |
| ] | |
| spaces_data_list_of_lists.append(row) | |
| return spaces_data_list_of_lists | |
| except HfHubHTTPError as e: | |
| error_msg = f"API Error for organization '{org_name.strip()}': {str(e)}" | |
| print(error_msg) # Server-side log | |
| return [["Error", error_msg, "-", "-", "-", "-"]] | |
| except Exception as e: | |
| error_message = f"An unexpected error occurred for organization '{org_name.strip()}': {str(e)}" | |
| print(error_message) # Server-side log | |
| return [["Error", error_message, "-", "-", "-", "-"]] | |
| # Gradio interface for listing Hugging Face Spaces | |
| hf_spaces_interface = gr.Interface( | |
| fn=list_my_hf_spaces, | |
| inputs=[gr.Textbox(label="Hugging Face Username or Organization", placeholder="e.g., huggingface, stabilityai, or your_username")], | |
| outputs=[gr.DataFrame( | |
| headers=["ID", "Author", "Last Modified", "Private", "Gated", "SDK"], | |
| label="Hugging Face Spaces", | |
| wrap=True, # Allow text wrapping in cells | |
| datatype=["markdown", "str", "str", "str", "str", "str"] # Render first column as Markdown | |
| )], | |
| title="Hugging Face api as mcp", | |
| description="Enter a Hugging Face username or organization to list their public Spaces.", | |
| examples=[["huggingface"], ["stabilityai"], ["gradio"]], | |
| allow_flagging='never' | |
| ) | |
| hf_orgs_interface = gr.Interface( | |
| fn=list_my_hf_organizations, | |
| inputs=[gr.Textbox(label="Hugging Face Token (Optional)", placeholder="hf_xxx... or leave blank to use logged-in user", type="password")], | |
| outputs=[gr.DataFrame( | |
| headers=["My Organization Name"], | |
| label="My Hugging Face Organizations", | |
| wrap=True, | |
| datatype=["markdown"] # Render column as Markdown | |
| )], | |
| title="My Hugging Face Organizations Lister", | |
| description="Lists the Hugging Face organizations you are a member of. Requires you to be logged in via 'huggingface-cli login'. Get your token from [here](https://huggingface.co/settings/tokens). Click 'Submit' to refresh.", | |
| allow_flagging='never' | |
| ) | |
| hf_org_spaces_interface = gr.Interface( | |
| fn=list_organization_spaces, | |
| inputs=[gr.Textbox(label="Organization Name", placeholder="e.g., huggingface, stabilityai")], | |
| outputs=[gr.DataFrame( | |
| headers=["ID", "Author", "Last Modified", "Private", "Gated", "SDK"], | |
| label="Organization's Hugging Face Spaces", | |
| wrap=True, | |
| datatype=["markdown", "str", "str", "str", "str", "str"] | |
| )], | |
| title="List Organization's Spaces", | |
| description="Enter a public Hugging Face organization name to list their Spaces.", | |
| examples=[["huggingface"], ["stabilityai"], ["google"]], | |
| allow_flagging='never' | |
| ) | |
| if __name__ == "__main__": | |
| tabbed_demo = gr.TabbedInterface( | |
| [hf_spaces_interface, hf_orgs_interface, hf_org_spaces_interface], | |
| ["List Spaces by User/Org", "List My Organizations", "List Org Spaces"] | |
| ) | |
| tabbed_demo.launch(mcp_server=True, share=True) | |