import gradio as gr
import pandas as pd
from huggingface_hub import HfApi
# Initialize Hugging Face API
api = HfApi()
# Constants
GGUF_TAG = "gguf"
CHUNK_SIZE = 1000
# Clickable links function
def clickable(x, which_one):
if x in ["Not Found", "Unknown"]:
return "Not Found"
if which_one == "models":
return f'{x}'
else:
return f'{x}'
# Fetch models and return a DataFrame with clickable links
def fetch_models():
models = api.list_models(filter=GGUF_TAG, full=True)
data = []
for model in models:
model_id = model.id if model.id else "Not Found"
author = model.author if model.author else "Unknown"
data.append({
"Model ID": model_id,
"Author Name": author,
"Downloads (30d)": model.downloads or 0,
"Likes": model.likes or 0,
"Created At": model.created_at.isoformat() if model.created_at else "N/A",
"Last Modified": model.last_modified.isoformat() if model.last_modified else "N/A",
})
df = pd.DataFrame(data)
# Apply clickable links to models and authors
df["Model ID"] = df["Model ID"].apply(lambda x: clickable(x, "models"))
df["Author Name"] = df["Author Name"].apply(lambda x: clickable(x, "models"))
return df
# Prepare authors DataFrame
def prepare_authors_df(models_df):
authors_df = models_df.copy()
# Extract the author name from the href in the clickable link
authors_df["Clean Author Name"] = authors_df["Author Name"].str.extract(r'href="https://huggingface\.co/(.*?)"')
grouped = authors_df.groupby("Clean Author Name").agg(
Models_Count=("Model ID", "count"),
Total_Downloads=("Downloads (30d)", "sum"),
Total_Likes=("Likes", "sum")
).reset_index()
grouped.rename(columns={"Clean Author Name": "Author Name"}, inplace=True)
grouped["Author Name"] = grouped["Author Name"].apply(lambda x: clickable(x, "models"))
return grouped.sort_values(by="Models_Count", ascending=False)
all_models_df = fetch_models().sort_values(by="Downloads (30d)", ascending=False)
authors_df = prepare_authors_df(all_models_df)
# Calculate totals
total_models_count = len(all_models_df)
total_downloads = all_models_df["Downloads (30d)"].sum()
total_likes = all_models_df["Likes"].sum()
def apply_model_filters(search_query, min_downloads, min_likes):
df = all_models_df.copy()
# Extract visible text for filtering purposes:
visible_model_id = df["Model ID"].str.extract(r'>(.*?)<')[0]
visible_author_name = df["Author Name"].str.extract(r'>(.*?)<')[0]
# Search filter
if search_query.strip():
mask = (visible_model_id.str.contains(search_query, case=False, na=False)) | \
(visible_author_name.str.contains(search_query, case=False, na=False))
df = df[mask]
# Minimum downloads filter
if min_downloads is not None and min_downloads > 0:
df = df[df["Downloads (30d)"] >= min_downloads]
# Minimum likes filter
if min_likes is not None and min_likes > 0:
df = df[df["Likes"] >= min_likes]
return df
def filter_models(search_query, min_downloads, min_likes):
filtered = apply_model_filters(search_query, min_downloads, min_likes)
return filtered.iloc[:CHUNK_SIZE], CHUNK_SIZE, filtered
def update_model_table(start_idx, filtered_df):
new_end = start_idx + CHUNK_SIZE
combined_df = filtered_df.iloc[:new_end].copy()
return combined_df, new_end
def apply_author_filters(search_query, min_author_downloads, min_author_likes):
df = authors_df.copy()
# Extract visible text for author filtering:
visible_author_name = df["Author Name"].str.extract(r'>(.*?)<')[0]
# Search filter for authors
if search_query.strip():
mask = visible_author_name.str.contains(search_query, case=False, na=False)
df = df[mask]
# Minimum total downloads filter
if min_author_downloads is not None and min_author_downloads > 0:
df = df[df["Total_Downloads"] >= min_author_downloads]
# Minimum total likes filter
if min_author_likes is not None and min_author_likes > 0:
df = df[df["Total_Likes"] >= min_author_likes]
return df
with gr.Blocks() as demo:
gr.Markdown(f"""
# 🚀GGUF Tracker🚀
Welcome to 🚀**GGUF Tracker**🚀, a live-updating leaderboard for all things GGUF on 🚀Hugging Face.
Stats refresh every hour, giving you the latest numbers.
By the way, I’m 🚀Richard Erkhov, and you can check out more of what I’m working on at my [🌟**github**](https://github.com/RichardErkhov),
[🌟**huggingface**](https://huggingface.co/RichardErkhov) or [🌟**erkhov.com**](https://erkhov.com). Go take a look—I think you’ll like what you find.
""")
gr.Markdown(f"""
# GGUF Models and Authors Leaderboard
**Total Models:** {total_models_count} | **Total Downloads (30d):** {total_downloads} | **Total Likes:** {total_likes}
""")
with gr.Tabs():
with gr.TabItem("Models"):
with gr.Row():
search_query = gr.Textbox(label="Search (by Model ID or Author Name)")
min_downloads = gr.Number(label="Min Downloads (30d)", value=0)
min_likes = gr.Number(label="Min Likes", value=0)
filter_button = gr.Button("Apply Filters")
model_table = gr.DataFrame(
value=all_models_df.iloc[:CHUNK_SIZE],
interactive=False,
label="GGUF Models (Click column headers to sort)",
wrap=True,
datatype=["markdown", "markdown", "number", "number", "str", "str"]
)
load_more_button = gr.Button("Load More Models")
# States
start_idx = gr.State(value=CHUNK_SIZE)
filtered_df_state = gr.State(value=all_models_df) # holds the currently filtered df
filter_button.click(
fn=filter_models,
inputs=[search_query, min_downloads, min_likes],
outputs=[model_table, start_idx, filtered_df_state]
)
load_more_button.click(fn=update_model_table, inputs=[start_idx, filtered_df_state], outputs=[model_table, start_idx])
with gr.TabItem("Authors"):
with gr.Row():
author_search_query = gr.Textbox(label="Search by Author Name")
min_author_downloads = gr.Number(label="Min Total Downloads", value=0)
min_author_likes = gr.Number(label="Min Total Likes", value=0)
author_filter_button = gr.Button("Apply Filters")
author_table = gr.DataFrame(
value=authors_df,
interactive=False,
label="Authors (Click column headers to sort)",
wrap=True,
datatype=["markdown", "number", "number", "number"]
)
def filter_authors(author_search_query, min_author_downloads, min_author_likes):
filtered_authors = apply_author_filters(author_search_query, min_author_downloads, min_author_likes)
return filtered_authors
author_filter_button.click(
fn=filter_authors,
inputs=[author_search_query, min_author_downloads, min_author_likes],
outputs=author_table
)
demo.launch()