evalstone/webui/static/index.html
sora 541b0b477d Improve EvalStone web UI paths, custom suites, and results charts.
Move required path fields up front, persist custom benchmark suites, enlarge readable typography, show full suite benchmark names, add capability-domain trend charts with local Chart.js, and polish ranking name display.
2026-07-29 07:38:05 +00:00

230 lines
8.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>EvalStone Launch</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/static/styles.css" />
</head>
<body>
<div class="page">
<header class="top">
<div class="brand">
<span class="brand-mark"></span>
<div>
<h1>EvalStone Launch</h1>
<p>本地评测启动台 · 基于 <code>bash/run.py</code></p>
</div>
</div>
<div class="top-right">
<nav class="nav-tabs">
<a href="/" class="active">启动台</a>
<a href="/results">结果分析</a>
</nav>
<div class="top-meta">
<span id="healthDot" class="dot"></span>
<span id="healthText">connecting…</span>
</div>
</div>
</header>
<main class="layout">
<section class="panel form-panel">
<form id="launchForm">
<div class="block">
<h2>路径配置(必填)</h2>
<div class="grid-2">
<label class="full">
<span>Dataset Dir</span>
<input id="dataset_dir" name="dataset_dir" required />
</label>
<label class="full">
<span>Output Dir</span>
<input id="output_dir" name="output_dir" required />
</label>
<label class="full">
<span>Config YAML</span>
<input id="config" name="config" required />
</label>
<label class="full">
<span>Tokenizer Path</span>
<input id="tokenizer_path" name="tokenizer_path" required />
</label>
</div>
</div>
<div class="block">
<h2>模型接入</h2>
<div class="grid-2">
<label>
<span>Model Name</span>
<input id="model" name="model" required placeholder="DeepSeek-V4-Flash-Int8" />
</label>
<label>
<span>API URL</span>
<input id="api_url" name="api_url" required placeholder="http://localhost:30000/v1" />
</label>
<label>
<span>API Key</span>
<input id="api_key" name="api_key" placeholder="EMPTY" />
</label>
<label>
<span>Folder Name可选</span>
<input id="folder_name" name="folder_name" placeholder="默认取 model / model_THINKING" />
</label>
</div>
</div>
<div class="block">
<h2>Thinking</h2>
<div class="thinking-row">
<label class="switch">
<input type="checkbox" id="thinking" name="thinking" />
<span class="slider"></span>
<span class="switch-text">启用 thinking 模式</span>
</label>
<label class="inline">
<span>max_tokens_add</span>
<input type="number" id="max_tokens_add" name="max_tokens_add" value="0" min="0" step="1024" />
</label>
<label class="inline">
<span>thinking scale</span>
<input type="number" id="thinking_max_tokens_scale" name="thinking_max_tokens_scale" value="1.0" min="0.1" step="0.1" />
</label>
</div>
</div>
<div class="block">
<h2>评测范围</h2>
<div class="mode-tabs" role="tablist">
<button type="button" class="tab active" data-mode="suite">按 Suite / 自定义组合</button>
<button type="button" class="tab" data-mode="datasets">自选 Benchmark</button>
</div>
<div id="suitePane" class="pane">
<h3 class="subhead">内置 Suite</h3>
<div id="suiteList" class="suite-list"></div>
<h3 class="subhead mt">已保存的自定义组合</h3>
<div id="customSuiteList" class="suite-list"></div>
<p id="customSuiteEmpty" class="muted">暂无自定义组合,可在下方勾选并保存</p>
<div class="custom-editor mt">
<h3 class="subhead">新建 / 更新自定义组合</h3>
<div class="custom-editor-row">
<label>
<span>组合名称</span>
<input id="customSuiteName" placeholder="例如: my_math_code" />
</label>
<div class="custom-editor-actions">
<button type="button" id="saveCustomSuiteBtn" class="primary">永久保存组合</button>
<button type="button" id="loadCheckedToCustomBtn" class="ghost">从下方勾选填入</button>
</div>
</div>
<div id="customPickList" class="benchmark-list compact"></div>
<span id="customPickCount" class="muted">已勾选 0</span>
</div>
<label class="mt">
<span>Exclude逗号分隔可选仅对内置 Suite 生效)</span>
<input id="exclude" name="exclude" placeholder="例如: tau2_bench,hle" />
</label>
</div>
<div id="datasetsPane" class="pane hidden">
<div class="bench-actions">
<button type="button" id="selectAllBtn" class="ghost">全选</button>
<button type="button" id="clearAllBtn" class="ghost">清空</button>
<button type="button" id="saveFromDatasetsBtn" class="ghost">保存为自定义组合</button>
<span id="selectedCount" class="muted">已选 0</span>
</div>
<div id="benchmarkList" class="benchmark-list"></div>
</div>
</div>
<details class="block advanced">
<summary>其他参数</summary>
<div class="grid-2 mt">
<label>
<span>Limitnone = 全量)</span>
<input id="limit" name="limit" placeholder="none" />
</label>
<label>
<span>Seed</span>
<input type="number" id="seed" name="seed" value="42" />
</label>
<label>
<span>Batch Size</span>
<input type="number" id="batch_size" name="batch_size" value="4" min="1" />
</label>
<label>
<span>Write Summary</span>
<select id="write_summary" name="write_summary">
<option value="true" selected></option>
<option value="false"></option>
</select>
</label>
<label>
<span>Judge Model</span>
<input id="judge_model" name="judge_model" />
</label>
<label>
<span>Judge API URL</span>
<input id="judge_api_url" name="judge_api_url" />
</label>
<label>
<span>Judge API Key</span>
<input id="judge_api_key" name="judge_api_key" type="password" />
</label>
<label>
<span>Judge Max Tokens</span>
<input type="number" id="judge_max_tokens" name="judge_max_tokens" />
</label>
</div>
</details>
<div class="actions">
<button type="submit" id="launchBtn" class="primary">启动评测</button>
<button type="button" id="stopBtn" class="danger" disabled>停止任务</button>
<span id="formMsg" class="msg"></span>
</div>
</form>
</section>
<section class="panel side-panel">
<div class="side-head">
<h2>运行状态</h2>
<button type="button" id="refreshJobsBtn" class="ghost">刷新</button>
</div>
<div id="activeCard" class="active-card idle">
<div class="active-title">
<span id="activeStatus" class="badge">idle</span>
<code id="activeJobId"></code>
</div>
<pre id="activeCmd" class="cmd">尚未启动任务</pre>
</div>
<div class="log-head">
<h3>实时日志</h3>
<label class="check-inline">
<input type="checkbox" id="autoScroll" checked />
自动滚动
</label>
</div>
<pre id="logView" class="log-view"></pre>
<div class="jobs-head">
<h3>历史任务</h3>
</div>
<div id="jobList" class="job-list"></div>
</section>
</main>
</div>
<script src="/static/app.js"></script>
</body>
</html>