import os import sys import time import gradio as gr from pathlib import Path from loguru import logger from huggingface_hub import whoami from yourbench_space.config import generate_and_save_config from yourbench_space.utils import ( CONFIG_PATH, UPLOAD_DIRECTORY, SubprocessManager, save_files, STAGES, ) project_description = """ # YourBench ๐Ÿš€ **Dynamic Benchmark Generation for Language Models** Quickly create zero-shot benchmarks from your documents โ€“ย keeping models accurate and adaptable - ๐Ÿ“– [FAQ](#) - ๐Ÿ’ป [GitHub](https://github.com/huggingface/yourbench/tree/v0.2-alpha-space) """ UPLOAD_DIRECTORY.mkdir(parents=True, exist_ok=True) logger.remove() logger.add(sys.stderr, level="INFO") command = ["uv", "run", "yourbench", f"--config={CONFIG_PATH}"] manager = SubprocessManager(command) docs_path = Path(__file__).parent / "docs.md" citation_content = ( docs_path.read_text().split("# Citation")[-1].strip() if docs_path.exists() else "# Citation\n\nDocumentation file not found." ) def generate_and_return(hf_org, hf_prefix): generate_and_save_config(hf_org, hf_prefix) for _ in range(5): if CONFIG_PATH.exists(): break time.sleep(0.5) return ( ( "โœ… Config saved!", gr.update(value=str(CONFIG_PATH), visible=True, interactive=True), ) if CONFIG_PATH.exists() else ( "โŒ Config generation failed.", gr.update(visible=False, interactive=False), ) ) def prepare_task(oauth_token: gr.OAuthToken | None, hf_dataset_prefix: str, _=None): new_env = os.environ.copy() if oauth_token: new_env["HF_TOKEN"] = oauth_token.token new_env["DATASET_PREFIX"] = hf_dataset_prefix manager.start_process(custom_env=new_env) def update_hf_org_dropdown(oauth_token: gr.OAuthToken | None): if oauth_token is None: return gr.Dropdown([], label="Organization") try: user_info = whoami(oauth_token.token) org_names = [org["name"] for org in user_info.get("orgs", [])] user_name = user_info.get("name", "Unknown User") org_names.insert(0, user_name) return gr.Dropdown(org_names, value=user_name, label="Organization") except Exception as e: return gr.Dropdown([], label="Organization") def switch_to_run_generation_tab(): return gr.Tabs(selected=1) def enable_button(files): return gr.update(interactive=bool(files)) with gr.Blocks(theme=gr.themes.Default()) as app: gr.Markdown(project_description) with gr.Row(): gr.Markdown("## โš™๏ธ YourBench Setup", elem_id="setup-title") with gr.Column(scale=0, min_width=150): login_btn = gr.LoginButton() with gr.Tabs() as tabs: with gr.Tab("Setup", id=0): with gr.Row(): with gr.Accordion("Hugging Face Settings"): hf_org_dropdown = gr.Dropdown( choices=[], label="Organization", allow_custom_value=True ) app.load( update_hf_org_dropdown, inputs=None, outputs=hf_org_dropdown ) hf_dataset_prefix = gr.Textbox( label="Dataset Prefix", value="yourbench", info="Prefix applied to all datasets", ) with gr.Accordion("Upload documents"): file_input = gr.File( label="Upload text files", file_count="multiple", file_types=[".txt", ".md", ".html"], ) output = gr.Textbox(label="Log") file_input.upload( lambda files: save_files([file.name for file in files]), file_input, output, ) preview_button = gr.Button("Generate New Config", interactive=False) log_message = gr.Textbox(label="Log Message", visible=True) download_button = gr.File( label="Download Config", visible=False, interactive=False ) file_input.change(enable_button, inputs=file_input, outputs=preview_button) preview_button.click( generate_and_return, inputs=[hf_org_dropdown, hf_dataset_prefix], outputs=[log_message, download_button], ) preview_button.click( switch_to_run_generation_tab, inputs=None, outputs=tabs, ) with gr.Tab("Run Generation", id=1): with gr.Row(): with gr.Accordion("Log Output", open=True): log_output = gr.Code(language=None, lines=20, interactive=False) with gr.Accordion("Stages", open=True): stages_table = gr.CheckboxGroup( choices=STAGES, value=[], label="Pipeline Stages Completed", interactive=False, ) log_timer = gr.Timer(1.0, active=True) log_timer.tick( manager.read_and_get_output, outputs=[log_output, stages_table] ) with gr.Row(): process_status = gr.Checkbox(label="Process Status", interactive=False) status_timer = gr.Timer(1.0, active=True) status_timer.tick(manager.is_running, outputs=process_status) with gr.Row(): start_button = gr.Button("Start Task") start_button.click(prepare_task, inputs=[login_btn, hf_dataset_prefix]) stop_button = gr.Button("Stop Task") stop_button.click(manager.stop_process) kill_button = gr.Button("Kill Task") kill_button.click(manager.kill_process) app.launch(allowed_paths=["/app"])