import gradio as gr import argilla as rg import pandas as pd import os import time from collections import defaultdict from fastapi import FastAPI from functools import lru_cache client = rg.Argilla( api_url=os.getenv("ARGILLA_API_URL", ""), api_key=os.getenv("ARGILLA_API_KEY", "") ) countries = { "Argentina": { "iso": "ARG", "emoji": "🇦🇷" }, "Bolivia": { "iso": "BOL", "emoji": "🇧🇴" }, "Chile": { "iso": "CHL", "emoji": "🇨🇱" }, "Colombia": { "iso": "COL", "emoji": "🇨🇴" }, "Costa Rica": { "iso": "CRI", "emoji": "🇨🇷" }, "Cuba": { "iso": "CUB", "emoji": "🇨🇺" }, "Ecuador": { "iso": "ECU", "emoji": "🇪🇨" }, "El Salvador": { "iso": "SLV", "emoji": "🇸🇻" }, "España": { "iso": "ESP", "emoji": "🇪🇸" }, "Guatemala": { "iso": "GTM", "emoji": "🇬🇹" }, "Honduras": { "iso": "HND", "emoji": "🇭🇳" }, "México": { "iso": "MEX", "emoji": "🇲🇽" }, "Nicaragua": { "iso": "NIC", "emoji": "🇳🇮" }, "Panamá": { "iso": "PAN", "emoji": "🇵🇦" }, "Paraguay": { "iso": "PRY", "emoji": "🇵🇾" }, "Perú": { "iso": "PER", "emoji": "🇵🇪" }, "Puerto Rico": { "iso": "PRI", "emoji": "🇵🇷" }, "República Dominicana": { "iso": "DOM", "emoji": "🇩🇴" }, "Uruguay": { "iso": "URY", "emoji": "🇺🇾" }, "Venezuela": { "iso": "VEN", "emoji": "🇻🇪" } } @lru_cache(maxsize=32) def get_user_contributions_cached(cache_buster: int): return get_user_contributions() def get_user_contributions(): user_contributions = defaultdict(lambda: {"username": "", "contributions": 0, "country_contributions": {}}) user_id_to_username = {} for country in countries.keys(): iso = countries[country]["iso"] emoji = countries[country]["emoji"] dataset_name = f"{emoji} {country} - {iso} - Responder" try: print(f"Processing dataset: {dataset_name}") dataset = client.datasets(dataset_name) records = list(dataset.records(with_responses=True)) dataset_contributions = defaultdict(int) for record in records: record_dict = record.to_dict() if "answer_1" in record_dict["responses"]: for answer in record_dict["responses"]["answer_1"]: if answer["user_id"]: user_id = answer["user_id"] dataset_contributions[user_id] += 1 if user_id not in user_id_to_username: try: user = client.users(id=user_id) user_id_to_username[user_id] = user.username except Exception as e: print(f"Error getting username for {user_id}: {e}") user_id_to_username[user_id] = f"User-{user_id[:8]}" for user_id, count in dataset_contributions.items(): username = user_id_to_username.get(user_id, f"User-{user_id[:8]}") user_contributions[user_id]["username"] = username user_contributions[user_id]["contributions"] += count user_contributions[user_id]["country_contributions"][country] = count except Exception as e: print(f"Error processing dataset {dataset_name}: {e}") rows = [] for user_id, data in user_contributions.items(): row = { "Username": data["username"], "Total": data["contributions"], "Blend-es": data["contributions"] } rows.append(row) df = pd.DataFrame(rows) if not df.empty: df = df.sort_values("Total", ascending=False) return df app = FastAPI() last_update_time = 0 cached_data = None def create_leaderboard_ui(): global cached_data, last_update_time current_time = time.time() if cached_data is not None and current_time - last_update_time < 300: df = cached_data else: cache_buster = int(current_time) df = get_user_contributions_cached(cache_buster) cached_data = df last_update_time = current_time if not df.empty: df = df.reset_index(drop=True) df.index = df.index + 1 df = df.rename_axis("Rank") df = df.reset_index() df_html = df.to_html(classes="leaderboard-table", border=0, index=False) styled_html = f"""
Última Actualización: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_update_time))}
{df_html}