File size: 6,246 Bytes
c1521ac ca14219 c1521ac |
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 |
"""Main Gradio app for moderation model testing."""
import os
import sys
import gradio as gr
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from utils.helpers import get_hf_token
from utils.model_interface import extract_model_id, run_test
from ui.sidebar import build_sidebar
from ui.tab_config import build_config_tab
from ui.tab_policy import build_policy_tab
from ui.tab_testing import (
build_testing_tab,
format_model_info,
format_reasoning_info,
format_test_result,
)
# ============================================================================
# Handlers
# ============================================================================
def handle_run_test(test_input, current_policy, model_choice, reasoning_effort, max_tokens, temperature, top_p, system_prompt_val, response_format_val, oauth_token: gr.OAuthToken | None = None):
"""Handle test execution."""
if not test_input or not test_input.strip():
model_info = format_model_info(model_choice, reasoning_effort)
return model_info, "*Please enter test content*", "*No content*", "*No response yet*", gr.update(value="", visible=False), gr.update(value="", visible=False)
if not current_policy or current_policy == "*No policy loaded*":
model_info = format_model_info(model_choice, reasoning_effort)
return model_info, "*Please load a policy first*", "*No policy*", "*No response yet*", gr.update(value="", visible=False), gr.update(value="", visible=False)
# OAuth token is automatically injected by Gradio - we don't pass login_button as input
hf_token, _ = get_hf_token(oauth_token)
if hf_token is None:
model_info = format_model_info(model_choice, reasoning_effort)
return model_info, "*Please log in to use Inference Providers*", "*Authentication required*", "*No response yet*", gr.update(value="", visible=False), gr.update(value="", visible=False)
model_id = extract_model_id(model_choice)
result = run_test(
model_id=model_id,
test_input=test_input,
policy=current_policy,
hf_token=hf_token,
reasoning_effort=reasoning_effort,
max_tokens=int(max_tokens),
temperature=float(temperature),
top_p=float(top_p),
system_prompt=system_prompt_val,
response_format=response_format_val,
)
label_text, parsed, cat_text, reasoning, raw_response = format_test_result(result)
reasoning_visible = bool(reasoning and reasoning.strip())
model_info = format_model_info(model_choice, reasoning_effort)
reasoning_info_text, reasoning_info_visible = format_reasoning_info(model_choice, reasoning)
return (
model_info,
label_text,
cat_text,
raw_response,
gr.update(value=reasoning_info_text, visible=reasoning_info_visible),
gr.update(value=reasoning or "", visible=reasoning_visible),
)
# ============================================================================
# UI Components
# ============================================================================
with gr.Blocks(title="Moderation Model Testing") as demo:
gr.Markdown("# Moderation Model Testing Interface")
gr.Markdown(
"Test moderation models with custom content policies. Define your policy, select a model, "
"and evaluate how different models classify content according to your rules. "
"Supports reasoning models that provide detailed explanations for their decisions."
)
# Sidebar (collapsible)
sidebar_components = build_sidebar()
login_button = sidebar_components["login_button"]
# Main content area with tabs
with gr.Tabs():
# Build tabs
testing_components = build_testing_tab()
test_input = testing_components["test_input"]
run_test_btn = testing_components["run_test_btn"]
model_info_display = testing_components["model_info_display"]
label_display = testing_components["label_display"]
categories_display = testing_components["categories_display"]
model_response_display = testing_components["model_response_display"]
reasoning_info = testing_components["reasoning_info"]
reasoning_display = testing_components["reasoning_display"]
policy_components = build_policy_tab(os.path.dirname(__file__))
current_policy_state = policy_components["current_policy_state"]
config_components = build_config_tab()
model_dropdown = config_components["model_dropdown"]
reasoning_effort = config_components["reasoning_effort"]
max_tokens = config_components["max_tokens"]
temperature = config_components["temperature"]
top_p = config_components["top_p"]
system_prompt_textbox = config_components["system_prompt_textbox"]
response_format_textbox = config_components["response_format_textbox"]
# ============================================================================
# Event Handlers
# ============================================================================
# Cross-tab handler: Run test (needs components from all tabs)
run_test_btn.click(
handle_run_test,
inputs=[
test_input,
current_policy_state,
model_dropdown,
reasoning_effort,
max_tokens,
temperature,
top_p,
system_prompt_textbox,
response_format_textbox,
],
outputs=[
model_info_display,
label_display,
categories_display,
model_response_display,
reasoning_info,
reasoning_display,
],
)
model_dropdown.change(
format_model_info,
inputs=[model_dropdown, reasoning_effort],
outputs=model_info_display,
)
reasoning_effort.change(
format_model_info,
inputs=[model_dropdown, reasoning_effort],
outputs=model_info_display,
)
if __name__ == "__main__":
demo.launch(ssr_mode=False)
|