Spaces:
Running
Running
import gradio as gr | |
import pandas as pd | |
import os | |
import shutil | |
import json | |
# Function to load leaderboard data from a CSV file | |
def load_leaderboard_data(csv_file_path): | |
try: | |
df = pd.read_csv(csv_file_path) | |
return df | |
except Exception as e: | |
print(f"Error loading CSV file: {e}") | |
return pd.DataFrame() # Return an empty DataFrame in case of error | |
# Function to process uploaded JSON file | |
def process_json_file(file): | |
if file is None: | |
return None, "Please upload a JSON file." | |
try: | |
with open(file.name, 'r') as f: | |
data = json.load(f) | |
return data, None | |
except Exception as e: | |
return None, f"Error reading JSON file: {str(e)}" | |
# Function to save the uploaded JSON file | |
def save_json_file(file): | |
if file is None: | |
return "No file uploaded." | |
# Define the directory to save uploaded files | |
save_dir = "uploaded_jsons" | |
os.makedirs(save_dir, exist_ok=True) | |
# Get the original filename | |
original_filename = os.path.basename(file.name) | |
# Define the path to save the file | |
save_path = os.path.join(save_dir, original_filename) | |
# Copy the uploaded file to the save directory | |
shutil.copy2(file.name, save_path) | |
return f"File saved to {save_path}" | |
# Load the leaderboard data | |
leaderboard1 = load_leaderboard_data("leaderboard_swe.csv") | |
leaderboard2 = load_leaderboard_data("leaderboard_gaia.csv") | |
# Create the Gradio interface | |
with gr.Blocks() as demo: | |
gr.Markdown("# 🥇 TRAIL: Trace Reasoning and Agentic Issue Localization Leaderboard") | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown("## TRAIL-SWE Leaderboard") | |
gr.Dataframe(leaderboard1) | |
with gr.Column(): | |
gr.Markdown("## TRAIL-GAIA Leaderboard") | |
gr.Dataframe(leaderboard2) | |
with gr.Blocks() as submit_page: | |
gr.Markdown("## Submit Your JSON File Here") | |
file_input = gr.File(label="Upload JSON File", file_types=['.json']) | |
json_preview = gr.JSON(label="JSON Preview") | |
submit_button = gr.Button("Submit", interactive=True) | |
output = gr.Textbox(label="Status") | |
def handle_submission(file): | |
if file is None: | |
return None, "Please upload a JSON file." | |
try: | |
# Process and preview the JSON | |
with open(file.name, 'r') as f: | |
data = json.load(f) | |
# Save the file | |
save_result = save_json_file(file) | |
return data, save_result | |
except Exception as e: | |
return None, f"Error: {str(e)}" | |
submit_button.click( | |
fn=handle_submission, | |
inputs=[file_input], | |
outputs=[json_preview, output] | |
) | |
if __name__ == "__main__": | |
demo.launch() | |
""" | |
import gradio as gr | |
import pandas as pd | |
import os | |
import json | |
import uuid | |
import hashlib | |
from datetime import datetime | |
from huggingface_hub import HfApi, login, HfFolder | |
# Configuration | |
LEADERBOARD_CSV = "leaderboard.csv" | |
SUBMISSIONS_FOLDER = "submissions" | |
CONFIG_FILE = "config.json" | |
DEFAULT_COLUMNS = ["rank", "submission_name", "score", "user", "timestamp"] | |
VERIFY_USERS = False # Set to True to enable HF authentication | |
# Default configuration | |
DEFAULT_CONFIG = { | |
"title": "Hugging Face Competition Leaderboard", | |
"description": "Submit your results for the competition", | |
"metric_name": "Score", | |
"higher_is_better": True, | |
"max_submissions_per_user": 5, | |
"allow_submission_edits": True | |
} | |
# Ensure submissions folder exists | |
os.makedirs(SUBMISSIONS_FOLDER, exist_ok=True) | |
# Load or create config | |
if os.path.exists(CONFIG_FILE): | |
with open(CONFIG_FILE, "r") as f: | |
config = json.load(f) | |
else: | |
config = DEFAULT_CONFIG | |
with open(CONFIG_FILE, "w") as f: | |
json.dump(config, f, indent=2) | |
# Initialize leaderboard if it doesn't exist | |
if not os.path.exists(LEADERBOARD_CSV): | |
pd.DataFrame(columns=DEFAULT_COLUMNS).to_csv(LEADERBOARD_CSV, index=False) | |
def read_leaderboard(): | |
#Read the current leaderboard | |
if os.path.exists(LEADERBOARD_CSV): | |
df = pd.read_csv(LEADERBOARD_CSV) | |
return df | |
return pd.DataFrame(columns=DEFAULT_COLUMNS) | |
def verify_user(username, token): | |
#Verify a user with their Hugging Face token | |
if not VERIFY_USERS: | |
return True | |
try: | |
api = HfApi(token=token) | |
user_info = api.whoami() | |
return user_info["name"] == username | |
except: | |
return False | |
def count_user_submissions(username): | |
#Count how many submissions a user already has | |
df = read_leaderboard() | |
return len(df[df["user"] == username]) | |
def update_leaderboard(): | |
#Update the leaderboard based on submissions | |
# Read all submissions | |
submissions = [] | |
for filename in os.listdir(SUBMISSIONS_FOLDER): | |
if filename.endswith(".json"): | |
with open(os.path.join(SUBMISSIONS_FOLDER, filename), "r") as f: | |
try: | |
data = json.load(f) | |
submissions.append(data) | |
except json.JSONDecodeError: | |
print(f"Error decoding {filename}") | |
if not submissions: | |
return pd.DataFrame(columns=DEFAULT_COLUMNS) | |
# Create dataframe and sort by score | |
df = pd.DataFrame(submissions) | |
# Sort based on configuration (higher or lower is better) | |
ascending = not config.get("higher_is_better", True) | |
df = df.sort_values("score", ascending=ascending) | |
# Add rank | |
df["rank"] = range(1, len(df) + 1) | |
# Save updated leaderboard | |
df.to_csv(LEADERBOARD_CSV, index=False) | |
return df | |
def submit(submission_name, score, username, hf_token="", submission_details=None): | |
#Add a new submission to the leaderboard | |
if not submission_name or not username: | |
return "Submission name and username are required", None | |
try: | |
score = float(score) | |
except ValueError: | |
return "Score must be a valid number", None | |
# Verify user if enabled | |
if VERIFY_USERS and not verify_user(username, hf_token): | |
return "Invalid Hugging Face credentials", None | |
# Check submission limit | |
max_submissions = config.get("max_submissions_per_user", 5) | |
if count_user_submissions(username) >= max_submissions: | |
return f"You've reached the maximum of {max_submissions} submissions", None | |
# Create submission entry | |
submission_id = str(uuid.uuid4())[:8] | |
submission = { | |
"submission_id": submission_id, | |
"submission_name": submission_name, | |
"score": score, | |
"user": username, | |
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") | |
} | |
# Add optional details | |
if submission_details: | |
submission["details"] = submission_details | |
# Save submission to file | |
filename = f"{username}_{submission_name.replace(' ', '_')}_{submission_id}.json" | |
with open(os.path.join(SUBMISSIONS_FOLDER, filename), "w") as f: | |
json.dump(submission, f) | |
# Update leaderboard | |
leaderboard = update_leaderboard() | |
return f"Submission '{submission_name}' added successfully!", leaderboard | |
def render_leaderboard(): | |
#Display the current leaderboard | |
df = update_leaderboard() | |
if len(df) == 0: | |
return "No submissions yet." | |
# Format the dataframe for display | |
display_df = df[DEFAULT_COLUMNS].copy() | |
return display_df | |
# Create the Gradio interface | |
with gr.Blocks(title=config["title"]) as demo: | |
gr.Markdown(f"# {config['title']}") | |
gr.Markdown(f"{config['description']}") | |
with gr.Tab("Leaderboard"): | |
gr.Markdown("## Current Rankings") | |
metric_name = config.get("metric_name", "Score") | |
higher_better = "higher is better" if config.get("higher_is_better", True) else "lower is better" | |
gr.Markdown(f"*Ranked by {metric_name} ({higher_better})*") | |
leaderboard_output = gr.Dataframe( | |
headers=["Rank", "Submission", metric_name, "User", "Timestamp"], | |
datatype=["number", "str", "number", "str", "str"], | |
interactive=False | |
) | |
refresh_btn = gr.Button("Refresh Leaderboard") | |
refresh_btn.click(render_leaderboard, inputs=[], outputs=[leaderboard_output]) | |
with gr.Tab("Submit"): | |
gr.Markdown("## Submit Your Results") | |
with gr.Row(): | |
with gr.Column(): | |
submission_name = gr.Textbox(label="Submission Name", placeholder="MyAwesomeModel v1.0") | |
score = gr.Number(label=metric_name, precision=4) | |
username = gr.Textbox(label="Username", placeholder="Your Hugging Face username") | |
# Only show token field if verification is enabled | |
if VERIFY_USERS: | |
hf_token = gr.Textbox( | |
label="Hugging Face Token", | |
placeholder="hf_...", | |
type="password" | |
) | |
else: | |
hf_token = gr.Textbox(visible=False) | |
submission_details = gr.Textbox( | |
label="Additional Details (optional)", | |
placeholder="Model details, training info, etc.", | |
lines=5 | |
) | |
submit_btn = gr.Button("Submit to Leaderboard") | |
submit_output = gr.Markdown() | |
submission_leaderboard = gr.Dataframe( | |
headers=["Rank", "Submission", metric_name, "User", "Timestamp"], | |
datatype=["number", "str", "number", "str", "str"], | |
interactive=False | |
) | |
submit_btn.click( | |
submit, | |
inputs=[submission_name, score, username, hf_token, submission_details], | |
outputs=[submit_output, submission_leaderboard] | |
) | |
# Add admin tab if desired | |
with gr.Tab("About"): | |
gr.Markdown("## About This Leaderboard") | |
# Initialize the leaderboard on load | |
demo.load(render_leaderboard, inputs=[], outputs=[leaderboard_output]) | |
if __name__ == "__main__": | |
demo.launch() | |
""" |