awacke1's picture
Create app.py
c57e896 verified
raw
history blame
10.4 kB
import gradio as gr
from utils import MEGABenchEvalDataLoader
import os
from constants import *
from urllib.parse import quote
# ------------------------------------------------------------------------------
# Load CSS files
# ------------------------------------------------------------------------------
current_dir = os.path.dirname(os.path.abspath(__file__))
base_css_file = os.path.join(current_dir, "static", "css", "style.css")
table_css_file = os.path.join(current_dir, "static", "css", "table.css")
with open(base_css_file, "r") as f:
base_css = f.read()
with open(table_css_file, "r") as f:
table_css = f.read()
# ------------------------------------------------------------------------------
# Initialize data loaders
# ------------------------------------------------------------------------------
default_loader = MEGABenchEvalDataLoader("./static/eval_results/Default")
si_loader = MEGABenchEvalDataLoader("./static/eval_results/SI")
# ------------------------------------------------------------------------------
# Helper Functions
# ------------------------------------------------------------------------------
def generate_search_links(model_name):
"""For a given model name, generate a set of search links as HTML."""
search_urls = {
"📚📖ArXiv": lambda k: f"https://arxiv.org/search/?query={quote(k)}&searchtype=all",
"🔮Google": lambda k: f"https://www.google.com/search?q={quote(k)}",
"📺Youtube": lambda k: f"https://www.youtube.com/results?search_query={quote(k)}",
"🔭Bing": lambda k: f"https://www.bing.com/search?q={quote(k)}",
"💡Truth": lambda k: f"https://truthsocial.com/search?q={quote(k)}",
"📱X": lambda k: f"https://twitter.com/search?q={quote(k)}",
}
# Build a set of inline HTML links (each opens in a new tab)
links = " ".join(
[f'<a href="{url(model_name)}" target="_blank">{emoji}</a>' for emoji, url in search_urls.items()]
)
return links
def add_search_links_to_table(headers, data):
"""
Append a "Search Links" column to the table.
(Assumes that each row’s column index 1 holds the model name.)
"""
new_headers = headers.copy()
new_headers.append("Search Links")
new_data = []
for row in data:
new_row = row.copy()
# Assume the model name is in the second column (index 1)
model_name = new_row[1] if len(new_row) > 1 else ""
new_row.append(generate_search_links(model_name))
new_data.append(new_row)
return new_headers, new_data
def clean_choice(choice):
"""
Remove a leading emoji and space (if present) from a choice string.
For example, "📊 Default" becomes "Default".
"""
parts = choice.split(" ", 1)
return parts[1] if len(parts) > 1 else choice
def update_table_and_caption(table_type, super_group, model_group):
"""
Called when any selector changes. Cleans the emoji‐prefixed values, loads new data,
appends a Search Links column, and returns a new Dataframe component (with a smaller max height),
an updated caption, and the CSS style.
"""
table_type_clean = clean_choice(table_type)
super_group_clean = clean_choice(super_group)
model_group_clean = clean_choice(model_group)
if table_type_clean == "Default":
headers, data = default_loader.get_leaderboard_data(super_group_clean, model_group_clean)
caption = default_caption
else: # "Single Image"
headers, data = si_loader.get_leaderboard_data(super_group_clean, model_group_clean)
caption = single_image_caption
# Append search links column to the table data
headers, data = add_search_links_to_table(headers, data)
n = len(headers)
# Assume first column is a number, second (model name) is HTML, the intermediate ones are numbers, and the last (links) is HTML
datatype = ["number", "html"] + ["number"] * (n - 3) + ["html"]
# Adjust column widths as needed (example: first two fixed, last a bit wider)
column_widths = ["100px", "240px"] + ["160px"] * (n - 3) + ["210px"]
dataframe_component = gr.Dataframe(
value=data,
headers=headers,
datatype=datatype,
interactive=False,
column_widths=column_widths,
max_height=600, # smaller height to show the full table in a compact area
elem_classes="custom-dataframe"
)
return [dataframe_component, caption, f"<style>{base_css}\n{table_css}</style>"]
def update_selectors(table_type):
"""
When the table selector changes, update the other radio choices.
(Also adds an emoji prefix to each choice.)
"""
table_type_clean = clean_choice(table_type)
loader = default_loader if table_type_clean == "Default" else si_loader
super_group_choices = [f"🔍 {group}" for group in list(loader.SUPER_GROUPS.keys())]
model_group_choices = [f"🤖 {group}" for group in list(loader.MODEL_GROUPS.keys())]
return [super_group_choices, model_group_choices]
# ------------------------------------------------------------------------------
# Build Gradio App Layout
# ------------------------------------------------------------------------------
with gr.Blocks() as block:
# Add CSS via an invisible HTML component
css_style = gr.HTML(f"<style>{base_css}\n{table_css}</style>", visible=False)
# NOTE: The original top-level introduction markdown has been removed here.
# It is now placed at the bottom of the MEGA-Bench tab in a collapsed Accordion.
with gr.Tabs(elem_classes="tab-buttons") as tabs:
# -------------------- Tab 1: MEGA-Bench --------------------
with gr.TabItem("📊 MEGA-Bench", elem_id="qa-tab-table1", id=1):
# A Citation accordion (collapsed by default)
with gr.Row():
with gr.Accordion("Citation", open=False):
citation_button = gr.Textbox(
value=CITATION_BUTTON_TEXT,
label=CITATION_BUTTON_LABEL,
elem_id="citation-button",
lines=10,
)
gr.Markdown(TABLE_INTRODUCTION)
# ---- Top-left “button‐bar” of radio selectors with emoji labels ----
with gr.Row():
table_selector = gr.Radio(
choices=["📊 Default", "🖼️ Single Image"],
label="Select table to display",
value="📊 Default"
)
with gr.Row():
super_group_selector = gr.Radio(
choices=[f"🔍 {group}" for group in list(default_loader.SUPER_GROUPS.keys())],
label="Select a dimension",
value=f"🔍 {list(default_loader.SUPER_GROUPS.keys())[0]}"
)
model_group_selector = gr.Radio(
choices=[f"🤖 {group}" for group in list(BASE_MODEL_GROUPS.keys())],
label="Select a model group",
value="🤖 All"
)
# A caption component for the table
caption_component = gr.Markdown(
value=default_caption,
elem_classes="table-caption",
latex_delimiters=[{"left": "$", "right": "$", "display": False}],
)
# ---- Initial Dataframe (with search links appended) ----
initial_headers, initial_data = default_loader.get_leaderboard_data(
list(default_loader.SUPER_GROUPS.keys())[0], "All"
)
initial_headers, initial_data = add_search_links_to_table(initial_headers, initial_data)
n = len(initial_headers)
initial_datatype = ["number", "html"] + ["number"] * (n - 3) + ["html"]
initial_column_widths = ["100px", "240px"] + ["160px"] * (n - 3) + ["210px"]
data_component = gr.Dataframe(
value=initial_data,
headers=initial_headers,
datatype=initial_datatype,
interactive=False,
elem_classes="custom-dataframe",
max_height=600,
column_widths=initial_column_widths
)
# ---- Controls to update the table ----
refresh_button = gr.Button("Refresh")
refresh_button.click(
fn=update_table_and_caption,
inputs=[table_selector, super_group_selector, model_group_selector],
outputs=[data_component, caption_component, css_style]
)
super_group_selector.change(
fn=update_table_and_caption,
inputs=[table_selector, super_group_selector, model_group_selector],
outputs=[data_component, caption_component, css_style]
)
model_group_selector.change(
fn=update_table_and_caption,
inputs=[table_selector, super_group_selector, model_group_selector],
outputs=[data_component, caption_component, css_style]
)
table_selector.change(
fn=update_selectors,
inputs=[table_selector],
outputs=[super_group_selector, model_group_selector]
).then(
fn=update_table_and_caption,
inputs=[table_selector, super_group_selector, model_group_selector],
outputs=[data_component, caption_component, css_style]
)
# ---- Move the introductory text to a collapsed accordion at the bottom ----
with gr.Accordion("Introduction", open=False):
gr.Markdown(LEADERBOARD_INTRODUCTION)
# -------------------- Tab 2: Data Information --------------------
with gr.TabItem("📝 Data Information", elem_id="qa-tab-table2", id=2):
gr.Markdown(DATA_INFO, elem_classes="markdown-text")
# -------------------- Tab 3: Submit --------------------
with gr.TabItem("🚀 Submit", elem_id="submit-tab", id=3):
with gr.Row():
gr.Markdown(SUBMIT_INTRODUCTION, elem_classes="markdown-text")
if __name__ == "__main__":
block.launch(share=True)