Spaces:
Sleeping
Sleeping
import gradio as gr | |
from huggingface_hub import HfApi | |
from datetime import datetime, timedelta | |
import pandas as pd | |
# Initialize the Hugging Face API | |
api = HfApi() | |
def get_recent_models(min_likes, days_ago, filter_string, search_string): | |
# Get the current date and date from `days_ago` days ago | |
today = datetime.utcnow().replace(tzinfo=None) | |
start_date = (today - timedelta(days=days_ago)).replace(tzinfo=None) | |
# Initialize an empty list to store the filtered models | |
recent_models = [] | |
filter_substrings = [sub.strip().lower() for sub in filter_string.split(';')] | |
search_substrings = [term.strip().lower() for term in search_string.split(';')] | |
# Use a generator to fetch models in batches, sorted by likes in descending order | |
for model in api.list_models(sort="likes", direction=-1): | |
if model.likes >= min_likes: | |
if hasattr(model, "created_at") and model.created_at: | |
# Ensure created_at is offset-naive | |
created_at_date = model.created_at.replace(tzinfo=None) | |
if search_substrings != []: | |
if any(term in model.modelId.lower() for term in search_substrings): | |
if filter_substrings != []: | |
if not any(sub in model.modelId.lower() for sub in filter_substrings): | |
if created_at_date >= start_date: | |
task = model.pipeline_tag if hasattr(model, "pipeline_tag") else "N/A" | |
recent_models.append({ | |
"Model ID": f'<a href="https://huggingface.co/{model.modelId}" target="_blank">{model.modelId}</a>', | |
"Likes": model.likes, | |
"Creation Date": model.created_at.strftime("%Y-%m-%d %H:%M"), | |
"Task": task | |
}) | |
else: | |
if created_at_date >= start_date: | |
task = model.pipeline_tag if hasattr(model, "pipeline_tag") else "N/A" | |
recent_models.append({ | |
"Model ID": f'<a href="https://huggingface.co/{model.modelId}" target="_blank">{model.modelId}</a>', | |
"Likes": model.likes, | |
"Creation Date": model.created_at.strftime("%Y-%m-%d %H:%M"), | |
"Task": task | |
}) | |
else: | |
if filter_substrings != []: | |
if not any(sub in model.modelId.lower() for sub in filter_substrings): | |
if created_at_date >= start_date: | |
task = model.pipeline_tag if hasattr(model, "pipeline_tag") else "N/A" | |
recent_models.append({ | |
"Model ID": f'<a href="https://huggingface.co/{model.modelId}" target="_blank">{model.modelId}</a>', | |
"Likes": model.likes, | |
"Creation Date": model.created_at.strftime("%Y-%m-%d %H:%M"), | |
"Task": task | |
}) | |
else: | |
if created_at_date >= start_date: | |
task = model.pipeline_tag if hasattr(model, "pipeline_tag") else "N/A" | |
recent_models.append({ | |
"Model ID": f'<a href="https://huggingface.co/{model.modelId}" target="_blank">{model.modelId}</a>', | |
"Likes": model.likes, | |
"Creation Date": model.created_at.strftime("%Y-%m-%d %H:%M"), | |
"Task": task | |
}) | |
else: | |
# Since the models are sorted by likes in descending order, | |
# we can stop once we hit a model with 10 or fewer likes | |
break | |
# Convert the list of dictionaries to a pandas DataFrame | |
df = pd.DataFrame(recent_models) | |
return df | |
# Define the Gradio interface | |
def launch_interface(): | |
iface = gr.Interface( | |
fn=get_recent_models, | |
inputs=[ | |
gr.Slider(minimum=1, maximum=100, step=1, value=5, label="Minimum Likes"), | |
gr.Slider(minimum=1, maximum=30, step=1, value=3, label="Days Ago"), | |
gr.Text(label="Filter", max_lines=1), | |
gr.Text(label="Search", max_lines=1) | |
], | |
outputs=gr.DataFrame( | |
headers=["Model ID", "Likes", "Creation Date", "Task"], | |
wrap=True, | |
datatype=["html", "number", "str"], | |
), | |
title="Model Drops Tracker π", | |
description="Overwhelmed by the rapid pace of model releases? π You're not alone! That's exactly why I built this tool. Easily filter recent models from the Hub by setting a minimum number of likes and the number of days since their release. Click on a model to see its card. Use `;` to split filter and search" | |
) | |
iface.launch() | |
if __name__ == "__main__": | |
launch_interface() |