import gradio as gr import pandas as pd from fuzzywuzzy import fuzz from utils import submit_gradio_module def search_leaderboard(df, model_name, columns_to_show, threshold=95): """ Search the leaderboard for models matching the search term using fuzzy matching. Args: df: The dataframe containing all leaderboard data model_name: The search term to find models columns_to_show: List of columns to include in the result threshold: Minimum similarity threshold (default: 95) Returns: Filtered dataframe with only matching models and selected columns """ if not model_name.strip(): return df.loc[:, columns_to_show] search_name = model_name.lower() # compute once for efficiency def calculate_similarity(row): return fuzz.partial_ratio(search_name, row["Model"].lower()) filtered_df = df.copy() filtered_df["similarity"] = filtered_df.apply(calculate_similarity, axis=1) filtered_df = filtered_df[filtered_df["similarity"] >= threshold].sort_values('similarity', ascending=False) filtered_df = filtered_df.drop('similarity', axis=1).loc[:, columns_to_show] return filtered_df def update_columns_to_show(df, columns_to_show): """ Update the displayed columns in the dataframe. Args: df: The dataframe to update columns_to_show: List of columns to include Returns: gradio.update object with the updated dataframe """ dummy_df = df.loc[:, [col for col in df.columns if col in columns_to_show]] columns_widths = [] for col in dummy_df.columns: if col == "Rank": columns_widths.append(80) elif col == "Model": columns_widths.append(400) else: columns_widths.append(150) return gr.update(value=dummy_df, column_widths=columns_widths) def create_leaderboard_tab(df, initial_columns_to_show, search_function, update_function, about_section, task_type): """ Create a complete leaderboard tab with search, column selection, and data display. Args: df: The dataframe containing the leaderboard data initial_columns_to_show: Initial list of columns to display search_function: Function to handle searching update_function: Function to handle column updates about_section: Markdown text for the About tab task_type: Type of the task ("Retriever" or "Reranker") Returns: A gradio Tabs component with the complete leaderboard interface """ columns_widths = [80 if col == "Rank" else 400 if col == "Model" else 150 for col in initial_columns_to_show] with gr.Tabs() as tabs: with gr.Tab("👑 Leaderboard"): with gr.Column(): with gr.Row(equal_height=True): search_box = gr.Textbox( placeholder="Search for models...", label="Search (You can also press Enter to search)", scale=5 ) search_button = gr.Button( value="Search", variant="primary", scale=1 ) columns_to_show_input = gr.CheckboxGroup( label="Columns to Show", choices=df.columns.tolist(), value=initial_columns_to_show, scale=4 ) leaderboard = gr.Dataframe( value=df.loc[:, initial_columns_to_show], datatype="markdown", wrap=True, show_fullscreen_button=True, interactive=False, column_widths=columns_widths ) # Connect events search_box.submit( search_function, inputs=[search_box, columns_to_show_input], outputs=leaderboard ) columns_to_show_input.select( update_function, inputs=columns_to_show_input, outputs=leaderboard ) search_button.click( search_function, inputs=[search_box, columns_to_show_input], outputs=leaderboard ) with gr.Tab("đŸĩī¸ Submit"): submit_gradio_module(task_type) with gr.Tab("ℹī¸ About"): gr.Markdown(about_section) return tabs