import requests import gradio as gr from urllib.parse import urlencode from dotenv import load_dotenv import os # Load environment variables load_dotenv() def create_image(stats, username): url = "https://argilla.imglab-cdn.net/dibt/dibt_v2.png" total_stats = stats["Total Statistics"] top_items = stats["Most Popular Items"] text = f"""Hugging Face ❤️ {username} in 2024 {total_stats['Model Downloads']:,} model downloads {total_stats['Model Likes']:,} model likes {total_stats['Dataset Downloads']:,} dataset downloads {total_stats['Dataset Likes']:,} dataset likes Most Popular Contributions: Model: {top_items['Top Model']['name']} ({top_items['Top Model']['downloads']:,} downloads, {top_items['Top Model']['likes']} likes) Dataset: {top_items['Top Dataset']['name']} ({top_items['Top Dataset']['downloads']:,} downloads, {top_items['Top Dataset']['likes']} likes) Space: {top_items['Top Space']['name']} ({top_items['Top Space']['likes']} likes)""" params = { "width": "1200", "text": text, "text-width": "800", "text-height": "600", "text-padding": "60", "text-color": "39,71,111", "text-x": "460", "text-y": "40", "format": "png", "dpr": "2", } return f"{url}?{urlencode(params)}" def get_user_stats(username): headers = {"Authorization": f"Bearer {os.getenv('HF_TOKEN')}"} # Get models stats models_response = requests.get( "https://huggingface.co/api/models", params={"author": username, "full": "True"}, headers=headers, ) models = models_response.json() # Get datasets stats datasets_response = requests.get( "https://huggingface.co/api/datasets", params={"author": username, "full": "True"}, headers=headers, ) datasets = datasets_response.json() # Get spaces stats spaces_response = requests.get( "https://huggingface.co/api/spaces", params={"author": username, "full": "True"}, headers=headers, ) spaces = spaces_response.json() # Calculate totals total_model_downloads = sum(model.get("downloads", 0) for model in models) total_model_likes = sum(model.get("likes", 0) for model in models) total_dataset_downloads = sum(dataset.get("downloads", 0) for dataset in datasets) total_dataset_likes = sum(dataset.get("likes", 0) for dataset in datasets) total_space_likes = sum(space.get("likes", 0) for space in spaces) # Find most liked items most_liked_model = max(models, key=lambda x: x.get("likes", 0), default=None) most_liked_dataset = max(datasets, key=lambda x: x.get("likes", 0), default=None) most_liked_space = max(spaces, key=lambda x: x.get("likes", 0), default=None) stats = { "Total Statistics": { "Model Downloads": total_model_downloads, "Model Likes": total_model_likes, "Dataset Downloads": total_dataset_downloads, "Dataset Likes": total_dataset_likes, "Space Likes": total_space_likes, }, "Most Popular Items": { "Top Model": { "name": most_liked_model.get("modelId", "None") if most_liked_model else "None", "likes": most_liked_model.get("likes", 0) if most_liked_model else 0, "downloads": most_liked_model.get("downloads", 0) if most_liked_model else 0, }, "Top Dataset": { "name": most_liked_dataset.get("id", "None") if most_liked_dataset else "None", "likes": most_liked_dataset.get("likes", 0) if most_liked_dataset else 0, "downloads": most_liked_dataset.get("downloads", 0) if most_liked_dataset else 0, }, "Top Space": { "name": most_liked_space.get("id", "None") if most_liked_space else "None", "likes": most_liked_space.get("likes", 0) if most_liked_space else 0, }, }, } # Generate image URL image_url = create_image(stats, username) return image_url with gr.Blocks(title="Hugging Face Community Stats") as demo: gr.Markdown("# Hugging Face Community Recap") gr.Markdown( "Enter a username to see their impact and top contributions across the Hugging Face Hub" ) with gr.Row(): username_input = gr.Textbox( label="Username", placeholder="Enter Hugging Face username...", scale=4 ) submit_btn = gr.Button("Get Stats", scale=1) with gr.Row(): with gr.Column(): stats_image = gr.Markdown() # Add example usernames gr.Examples( examples=[["merve"], ["mlabonne"], ["bartowski"]], inputs=username_input, label="Try these examples", ) def format_markdown(image_url): return f"![Hugging Face Stats]({image_url})" # Handle submission submit_btn.click( fn=lambda x: format_markdown(get_user_stats(x)), inputs=username_input, outputs=stats_image, api_name="get_stats", ) # Also trigger on enter key username_input.submit( fn=lambda x: format_markdown(get_user_stats(x)), inputs=username_input, outputs=stats_image, ) if __name__ == "__main__": demo.launch()