evalstone/webui/static/index.html
sora 7c449d3126 Add local EvalStone web UI for launch and results comparison.
Add a FastAPI panel under webui/ to select suites or benchmarks, configure model endpoint and thinking mode, stream evaluation logs, and visualize multi-model scores from output/.
2026-07-29 06:49:39 +00:00

201 lines
7.4 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>
<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">
<div id="suiteList" class="suite-list"></div>
<label class="mt">
<span>Exclude逗号分隔可选</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>
<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>Dataset Dir</span>
<input id="dataset_dir" name="dataset_dir" />
</label>
<label>
<span>Output Dir</span>
<input id="output_dir" name="output_dir" />
</label>
<label>
<span>Config YAML</span>
<input id="config" name="config" />
</label>
<label>
<span>Tokenizer Path</span>
<input id="tokenizer_path" name="tokenizer_path" />
</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>