File size: 4,631 Bytes
bae4131
3119795
7ccf9d4
3119795
7ccf9d4
d1ed69b
7ccf9d4
d1ed69b
7ccf9d4
bae4131
 
 
 
 
 
6454c0e
d1ed69b
6454c0e
3119795
 
 
 
 
 
7ccf9d4
 
 
 
 
 
 
 
 
 
 
 
 
 
bae4131
 
7ccf9d4
bae4131
 
 
 
 
 
3d76e98
7ccf9d4
23510fc
7ccf9d4
3d76e98
4a9b060
3d76e98
 
 
 
 
 
7ccf9d4
3d76e98
 
7ccf9d4
23510fc
7ccf9d4
 
 
bae4131
 
23510fc
7ccf9d4
 
23510fc
 
 
7ccf9d4
 
 
 
 
816857c
7ccf9d4
 
 
 
 
 
23510fc
7ccf9d4
 
 
 
 
 
 
 
 
 
bae4131
d1ed69b
 
7ccf9d4
b975b7b
 
 
 
 
 
 
 
 
 
7ccf9d4
bae4131
b975b7b
 
 
 
 
d1ed69b
7ccf9d4
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
import os
import sys
import time  # Needed for file existence check
import gradio as gr
import yaml
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,
)

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)

def generate_and_return(hf_org, hf_prefix):
    """Handles config generation and validates file existence before enabling download"""
    generate_and_save_config(hf_org, hf_prefix)  # No need to store the return value

    # Wait until the config file is actually created
    for _ in range(5):
        if CONFIG_PATH.exists():
            break
        time.sleep(0.5)

    if CONFIG_PATH.exists():
        return "✅ Config saved!", gr.update(value=str(CONFIG_PATH), visible=True, interactive=True)
    else:
        return "❌ Config generation failed.", gr.update(visible=False, interactive=False)

def prepare_task(oauth_token: gr.OAuthToken | None, model_token: str):
    """Prepares and starts the subprocess with environment variables."""
    new_env = os.environ.copy()
    if oauth_token:
        new_env["HF_TOKEN"] = oauth_token.token
    new_env["MODEL_API_KEY"] = model_token
    manager.start_process(custom_env=new_env)

def update_hf_org_dropdown(oauth_token: gr.OAuthToken | None):
    """Updates the dropdown with the user's Hugging Face organizations"""
    if oauth_token is None:
        print("Please deploy this on Spaces and log in to view the list of available organizations")
        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:
        print(f"Error retrieving user info: {e}")
        return gr.Dropdown([], label="Organization")

def enable_button(files):
    """Enables the button if files are uploaded"""
    return gr.update(interactive=bool(files))


with gr.Blocks() as app:
    gr.Markdown("## YourBench Setup")
    
    with gr.Row():
        login_btn = gr.LoginButton()

    with gr.Tab("Setup"):
        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],
        )

    with gr.Tab("Run Generation"):
        log_output = gr.Code(label="Log Output", language=None, lines=20, interactive=False)
        log_timer = gr.Timer(0.05, active=True)
        log_timer.tick(manager.read_and_get_output, outputs=log_output)

        with gr.Row():
            process_status = gr.Checkbox(label="Process Status", interactive=False)
            status_timer = gr.Timer(0.05, 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=[hf_org_dropdown])

            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"])