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): | |
# Calculate the start date for filtering models | |
start_date = datetime.utcnow() - timedelta(days=days_ago) | |
# Prepare filter and search substrings | |
filter_substrings = {sub.strip().lower() for sub in filter_string.split(';') if sub.strip()} | |
search_substrings = {term.strip().lower() for term in search_string.split(';') if term.strip()} | |
# Initialize an empty list to store the filtered models | |
recent_models = [] | |
# Fetch models sorted by likes in descending order | |
for model in api.list_models(sort="likes", direction=-1): | |
if model.likes < min_likes: | |
# Since models are sorted by likes in descending order, break early | |
break | |
created_at_date = model.created_at.replace(tzinfo=None) if model.created_at else None | |
# Ensure the model meets the date, like, search, and filter criteria | |
if created_at_date and created_at_date >= start_date: | |
model_id_lower = model.modelId.lower() | |
if (not search_substrings or any(term in model_id_lower for term in search_substrings)) and \ | |
(not filter_substrings or not any(sub in model_id_lower for sub in filter_substrings)): | |
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": created_at_date.strftime("%Y-%m-%d %H:%M"), | |
"Task": task | |
}) | |
# Convert the list of dictionaries to a pandas DataFrame | |
df = pd.DataFrame(recent_models) | |
return df | |
# Define the Gradio interface | |
with gr.Blocks() as demo: | |
gr.Markdown("# Model Drops Tracker π") | |
gr.Markdown( | |
"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 terms." | |
) | |
with gr.Row(): | |
likes_slider = gr.Slider(minimum=1, maximum=100, step=1, value=5, label="Minimum Likes") | |
days_slider = gr.Slider(minimum=1, maximum=30, step=1, value=3, label="Days Ago") | |
with gr.Row(): | |
filter_text = gr.Text(label="Filter", max_lines=1, placeholder="Exclude models containing these terms (separate by `;`)") | |
search_text = gr.Text(label="Search", max_lines=1, placeholder="Include only models containing these terms (separate by `;`)") | |
btn = gr.Button("Run") | |
with gr.Column(): | |
df = gr.DataFrame( | |
headers=["Model ID", "Likes", "Creation Date", "Task"], | |
wrap=True, | |
datatype=["html", "number", "str"], | |
) | |
btn.click(fn=get_recent_models, inputs=[likes_slider, days_slider, filter_text, search_text], outputs=df) | |
if __name__ == "__main__": | |
demo.launch() |