|
import gradio as gr |
|
from gradio.oauth import OAuthToken |
|
from huggingface_hub import HfApi, whoami |
|
from huggingface_hub.hf_api import DatasetInfo, ModelInfo, SpaceInfo |
|
|
|
|
|
def get_token(oauth_token: OAuthToken): |
|
return oauth_token.token |
|
|
|
|
|
def list_orgs(oauth_token: OAuthToken = None): |
|
if oauth_token is None: |
|
return [] |
|
data = whoami(oauth_token.token) |
|
if data["auth"]["type"] == "oauth": |
|
organisations = [data["name"]] + [org["name"] for org in data["orgs"]] |
|
else: |
|
organisations = [ |
|
entry["entity"]["name"] |
|
for entry in data["auth"]["accessToken"]["fineGrained"]["scoped"] |
|
if "repo.write" in entry["permissions"] |
|
] |
|
organisations = [org for org in organisations if org != data["name"]] |
|
organisations = [data["name"]] + organisations |
|
return organisations |
|
|
|
|
|
def get_org_dropdown(oauth_token: OAuthToken = None): |
|
orgs = list_orgs(oauth_token) |
|
return gr.Dropdown( |
|
label="Organization", |
|
choices=orgs, |
|
value=orgs[0] if orgs else None, |
|
allow_custom_value=True, |
|
) |
|
|
|
|
|
def get_resource_type_dropdown( |
|
org_name: str, resource_type: str, oauth_token: OAuthToken = None |
|
): |
|
if oauth_token is None: |
|
return "" |
|
if not all([org_name, resource_type]): |
|
return "" |
|
|
|
hf_client = HfApi(token=oauth_token.token) |
|
if resource_type == "model": |
|
resources = hf_client.list_models(author=org_name) |
|
elif resource_type == "dataset": |
|
resources = hf_client.list_datasets(author=org_name) |
|
elif resource_type == "space": |
|
resources = hf_client.list_spaces(author=org_name) |
|
else: |
|
resources = [] |
|
|
|
resources = [resource.id for resource in resources] |
|
return gr.Dropdown( |
|
label="Resource", |
|
choices=resources, |
|
value=resources[0] if resources else None, |
|
) |
|
|
|
|
|
def get_resource(resource_id: str, resource_type: str, oauth_token: OAuthToken = None): |
|
if oauth_token is None: |
|
return "" |
|
if not all([resource_id, resource_type]): |
|
return "" |
|
hf_client = HfApi(token=oauth_token.token) |
|
|
|
resource: ModelInfo | DatasetInfo | SpaceInfo = hf_client.repo_info( |
|
resource_id, repo_type=resource_type |
|
) |
|
return str(resource) |
|
|
|
|
|
def delete_resource( |
|
resource_id: str, resource_type: str, oauth_token: OAuthToken = None |
|
): |
|
if oauth_token is None: |
|
return [] |
|
if not all([resource_id, resource_type]): |
|
return [] |
|
hf_client = HfApi(token=oauth_token.token) |
|
|
|
hf_client.delete_repo(resource_id, repo_type=resource_type, missing_ok=True) |
|
|
|
return gr.Markdown(f"Deleted {resource_id}", visible=True) |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# 🧹 🧼 🗑️ Hub Repo Cleaner 🗑️ 🧼 🧹") |
|
gr.LoginButton() |
|
org_name = gr.Dropdown(label="Organization", choices=list_orgs()) |
|
resource_type = gr.Dropdown( |
|
label="Resource Type", |
|
choices=["dataset", "model", "space"], |
|
value="dataset", |
|
) |
|
resources = gr.Dropdown(label="Resources") |
|
resource_info = gr.Code(language="json", label="Resource Info") |
|
|
|
org_name.change( |
|
get_resource_type_dropdown, |
|
inputs=[org_name, resource_type], |
|
outputs=[resources], |
|
) |
|
resource_type.change( |
|
get_resource_type_dropdown, |
|
inputs=[org_name, resource_type], |
|
outputs=[resources], |
|
) |
|
resources.change( |
|
get_resource, |
|
inputs=[resources, resource_type], |
|
outputs=[resource_info], |
|
) |
|
|
|
markdown = gr.Markdown("message", label="Message", visible=False) |
|
button = gr.Button("Delete") |
|
button.click( |
|
delete_resource, inputs=[resources, resource_type], outputs=[markdown] |
|
).then( |
|
fn=get_resource_type_dropdown, |
|
inputs=[org_name, resource_type], |
|
outputs=[resources], |
|
) |
|
demo.load(get_org_dropdown, outputs=[org_name]) |
|
|
|
demo.launch() |
|
|