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() """