import requests from bs4 import BeautifulSoup import pandas as pd import gradio as gr import plotly.express as px BASE_URL = "https://scale.com/leaderboard" LEADERBOARDS = { "Coding": "/coding", "Adversarial Robustness": "/adversarial_robustness", "Instruction Following": "/instruction_following", "Math": "/math" } def scrape_leaderboard(leaderboard): url = BASE_URL + LEADERBOARDS[leaderboard] response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') leaderboard_div = soup.find('div', class_='flex flex-col gap-4 sticky top-20') if not leaderboard_div: raise ValueError("Leaderboard div not found. The page structure might have changed.") table = leaderboard_div.find('table', class_='w-full caption-bottom text-sm') if not table: raise ValueError("Leaderboard table not found within the div.") data = [] for row in table.find('tbody').find_all('tr'): cols = row.find_all('td') rank = cols[0].find('div', class_='flex').text.strip().split()[0] model = cols[0].find('a').text.strip() score = cols[1].text.strip() confidence = cols[2].text.strip() data.append([rank, model, score, confidence]) df = pd.DataFrame(data, columns=['Rank', 'Model', 'Score', '95% Confidence']) df['Score'] = pd.to_numeric(df['Score']) # Convert Score to numeric return df def create_chart(df): fig = px.bar(df, x='Model', y='Score', title='Model Scores Comparison', labels={'Score': 'Overall Score', 'Model': 'Model Name'}, color='Score', color_continuous_scale='viridis') fig.update_layout(xaxis_tickangle=-45, xaxis_title=None) return fig def update_leaderboard(leaderboard): try: df = scrape_leaderboard(leaderboard) chart = create_chart(df) return chart, df.to_html(index=False) except Exception as e: return None, f"An error occurred: {str(e)}" # Create Gradio interface with gr.Blocks() as iface: gr.Markdown("# AI Leaderboard Viewer") dropdown = gr.Dropdown(choices=list(LEADERBOARDS.keys()), label="Select Leaderboard", value="Coding") chart_output = gr.Plot() table_output = gr.HTML() def on_load(): chart, html = update_leaderboard("Coding") return chart, html dropdown.change(update_leaderboard, inputs=[dropdown], outputs=[chart_output, table_output]) iface.load(on_load, outputs=[chart_output, table_output]) # Launch the app iface.launch()