Spaces:
Running
Running
File size: 10,851 Bytes
ee1b999 8939028 3317293 8939028 ee1b999 11de2f8 5ef407f 539a055 1971175 11de2f8 5ef407f 1971175 49b6cdd b0bd18e 49b6cdd 268d785 ee1b999 268d785 b392800 ee1b999 11de2f8 ee1b999 1971175 ee1b999 1971175 20c57a4 ee1b999 11de2f8 1971175 3317293 b392800 3317293 11de2f8 9181029 11de2f8 9181029 11de2f8 9181029 11de2f8 ad46ea8 11de2f8 dd5281a 11de2f8 ee1b999 11de2f8 ee1b999 5ef407f ee1b999 5ef407f ee1b999 5ef407f ee1b999 5ef407f ee1b999 198c409 5ef407f ee1b999 198c409 5ef407f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
# app.py
import logging
logging.basicConfig(level=logging.WARNING)
import gradio as gr
import urllib.parse
from apscheduler.schedulers.background import BackgroundScheduler
from huggingface_hub import HfApi
from config import LEADERBOARD_PATH, LOCAL_DEBUG
from content import css
from main_page import build_page as build_main_page
from literature_understanding import build_page as build_lit_page
from c_and_e import build_page as build_c_and_e_page
from data_analysis import build_page as build_data_analysis_page
from e2e import build_page as build_e2e_page
from submission import build_page as build_submission_page
from about import build_page as build_about_page
api = HfApi()
LOGO_PATH = "assets/logo.svg"
# JavaScripts
scroll_script = """
<script>
function scroll_to_element(id) {
console.log("Global scroll_to_element called for ID:", id);
const element = document.querySelector('#' + id);
if (element) {
console.log("Element found:", element);
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
} else {
console.error("Error: Element with ID '" + id + "' not found in the document.");
}
}
</script>
"""
redirect_script = """
<script>
if (window.location.pathname === '/') { window.location.replace('/home'); }
</script>
"""
tooltip_script = """
<script>
function initializeSmartTooltips() {
// Find all tooltip trigger icons
const tooltipIcons = document.querySelectorAll('.tooltip-icon-legend');
tooltipIcons.forEach(icon => {
// Find the tooltip card associated with this icon
const tooltipCard = icon.querySelector('.tooltip-card');
if (!tooltipCard) return;
// Move the card to the end of the <body>. This is the KEY to escaping
// any parent containers that might clip it.
document.body.appendChild(tooltipCard);
// --- MOUSE HOVER EVENT ---
icon.addEventListener('mouseenter', () => {
// Get the exact position of the icon on the screen
const iconRect = icon.getBoundingClientRect();
// Get the dimensions of the tooltip card
const cardRect = tooltipCard.getBoundingClientRect();
// Calculate the ideal top position (above the icon with a 10px gap)
const top = iconRect.top - cardRect.height - 10;
// --- Smart Centering Logic ---
// Start by calculating the perfect center
let left = iconRect.left + (iconRect.width / 2) - (cardRect.width / 2);
// Check if it's going off the left edge of the screen
if (left < 10) {
left = 10; // Pin it to the left with a 10px margin
}
// Check if it's going off the right edge of the screen
if (left + cardRect.width > window.innerWidth) {
left = window.innerWidth - cardRect.width - 10; // Pin it to the right
}
// Apply the calculated position and show the card
tooltipCard.style.top = `${top}px`;
tooltipCard.style.left = `${left}px`;
tooltipCard.classList.add('visible');
});
// --- MOUSE LEAVE EVENT ---
icon.addEventListener('mouseleave', () => {
// Hide the card
tooltipCard.classList.remove('visible');
});
});
}
// Poll the page until the tooltips exist, then run the initialization.
const tooltipInterval = setInterval(() => {
if (document.querySelector('.tooltip-icon-legend')) {
clearInterval(tooltipInterval);
initializeSmartTooltips();
}
}, 200);
</script>
"""
redirect_submission_on_close_script = """
<script>
function initializeRedirectObserver() {
const successModal = document.querySelector('#success-modal');
if (successModal) {
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
// We only care about changes to the 'class' attribute.
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
// Check if the 'hide' class has been ADDED to the class list.
// This is how Gradio hides the modal.
if (successModal.classList.contains('hide')) {
console.log("Success modal was closed. Redirecting to homepage...");
// This is the command to redirect the browser.
window.location.href = '/home';
}
}
}
});
// Tell the observer to watch the modal for attribute changes.
observer.observe(successModal, { attributes: true });
}
}
// Polling mechanism to wait for Gradio to build the UI.
const redirectInterval = setInterval(() => {
if (document.querySelector('#success-modal')) {
clearInterval(redirectInterval);
initializeRedirectObserver();
}
}, 200);
</script>
"""
# --- Theme Definition ---
theme = gr.themes.Base(
primary_hue=gr.themes.Color(c100="#CFF5E8", c200="#B7EFDD", c300="#9FEAD1", c400="#87E5C5", c50="#E7FAF3", c500="#6FE0BA", c600="#57DBAF", c700="#3FD5A3", c800="#27D09C", c900="#0FCB8C", c950="#0fcb8c"),
secondary_hue=gr.themes.Color(c100="#FCDCEB", c200="#FBCBE1", c300="#F9BAD7", c400="#F7A8CD", c50="#FDEEF5", c500="#F697C4", c600="#F586BA", c700="#F375B0", c800="#F263A6", c900="#F0529C", c950="#F0529C"),
neutral_hue=gr.themes.Color(c100="#FDF9F4", c200="#C9C9C3", c300="#B0B5AF", c400="#97A09C", c50="#FAF2E9", c500="#7F8C89", c600="#667876", c700="#344F4F", c800="#1C3A3C", c900="#032629", c950="032629"),
font=[gr.themes.GoogleFont('Manrope'), 'ui-sans-serif', 'sans-serif', 'sans-serif'],
font_mono=[gr.themes.GoogleFont('Roboto Mono'), 'ui-monospace', 'monospace', 'monospace'],
).set(
body_text_color='*neutral_950',
body_text_color_subdued='*neutral_950',
body_text_color_subdued_dark='*neutral_50',
body_text_color_dark='*neutral_50',
background_fill_primary='*neutral_50',
background_fill_primary_dark='*neutral_900',
background_fill_secondary='*neutral_100',
background_fill_secondary_dark='*neutral_800',
border_color_accent='*secondary_900',
border_color_accent_subdued='*neutral_400',
border_color_accent_subdued_dark='*neutral_400',
color_accent='*primary_900',
color_accent_soft='*neutral_200',
color_accent_soft_dark='*neutral_800',
link_text_color='*secondary_900',
link_text_color_dark='*primary_900',
link_text_color_active_dark='*primary_600',
link_text_color_hover_dark='*primary_700',
link_text_color_visited_dark='*primary_600',
table_even_background_fill='*neutral_100',
table_even_background_fill_dark='*neutral_800',
button_primary_background_fill='*secondary_900',
button_primary_background_fill_dark='*primary_900',
button_primary_background_fill_hover='*secondary_600',
button_primary_background_fill_hover_dark='*primary_600',
button_secondary_background_fill="#9FEAD1",
button_secondary_background_fill_dark="#9FEAD1",
button_secondary_text_color="*neutral_900",
button_secondary_text_color_dark="*neutral_900",
block_title_text_color="*neutral_900",
button_primary_text_color='*neutral_900',
block_title_text_color_dark="#ffffff",
button_primary_text_color_dark='*neutral_900',
block_border_color="#032629",
block_border_color_dark="#9fead1",
block_background_fill_dark="#032629",
block_background_fill="#FAF2E9",
checkbox_label_text_color="#032629",
checkbox_label_background_fill="#D8D6CF",
checkbox_label_background_fill_dark="#254243",
checkbox_background_color_selected="#F0529C",
checkbox_background_color_selected_dark="#0FCB8C",
)
try:
with open(LOGO_PATH, "r") as f:
svg_content = f.read()
encoded_svg = urllib.parse.quote(svg_content)
home_icon_data_uri = f"data:image/svg+xml,{encoded_svg}"
except FileNotFoundError:
print(f"Warning: Home icon file not found at {LOGO_PATH}.")
home_icon_data_uri = "none"
# --- This is the final CSS ---
final_css = css + f"""
/* --- Find the "Home" button and replace its text with an icon --- */
.nav-holder nav a[href$="/"] {{
display: none !important;
}}
.nav-holder nav a[href*="/home"] {{
grid-row: 1 !important;
grid-column: 1 !important;
justify-self: start !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
/* 2. Hide the original "Home" text */
font-size: 0 !important;
text-indent: -9999px;
/* 3. Apply the icon as the background */
background-image: url("{home_icon_data_uri}") !important;
background-size: contain !important;
background-repeat: no-repeat !important;
background-position: center !important;
width: 240px !important;
height: 50px !important;
padding: 0 !important;
border: none !important;
outline: none !important;
}}
"""
# --- Gradio App Definition ---
demo = gr.Blocks(
theme=theme,
css=final_css,
head=scroll_script + redirect_script + tooltip_script + redirect_submission_on_close_script,
title="AstaBench Leaderboards",
)
with demo.route("Home", "/home"):
build_main_page()
with demo.route("Literature Understanding", "/literature-understanding"):
build_lit_page()
with demo.route("Code & Execution", "/code-execution"):
build_c_and_e_page()
with demo.route("Data Analysis", "/data-analysis"):
build_data_analysis_page()
with demo.route("End-to-End Discovery", "/discovery"):
build_e2e_page()
with demo.route("About", "/about"):
build_about_page()
with demo.route("🚀 Submit an Agent", "/submit"):
build_submission_page()
# --- Scheduler and Launch
def restart_space_job():
print("Scheduler: Attempting to restart space.")
try:
api.restart_space(repo_id=LEADERBOARD_PATH)
print("Scheduler: Space restart request sent.")
except Exception as e:
print(f"Scheduler: Error restarting space: {e}")
scheduler = BackgroundScheduler(timezone="UTC")
scheduler.add_job(restart_space_job, "interval", hours=1)
scheduler.start()
# Launch the Gradio app
if __name__ == "__main__":
if LOCAL_DEBUG:
print("Launching in LOCAL_DEBUG mode.")
demo.launch(debug=True, allowed_paths=["assets"], favicon_path="assets/favicon/favicon.ico")
else:
print("Launching in Space mode.")
# For Spaces, share=False is typical unless specific tunneling is needed.
# debug=True can be set to False for a "production" Space.
demo.launch(server_name="0.0.0.0", server_port=7860, debug=True, share=False, allowed_paths=["assets"], favicon_path="assets/favicon/favicon.ico")
|