niceeval 0.5.4 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INDEX.md +55 -0
- package/dist/agents/types.d.ts +321 -0
- package/dist/context/types.d.ts +335 -0
- package/dist/i18n/core.d.ts +11 -0
- package/dist/i18n/en.d.ts +181 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/zh-CN.d.ts +183 -0
- package/dist/o11y/otlp/parse.d.ts +3 -0
- package/dist/o11y/otlp/receiver.d.ts +21 -0
- package/dist/o11y/otlp/turn-otel.d.ts +43 -0
- package/dist/o11y/types.d.ts +190 -0
- package/dist/report/aggregate.d.ts +57 -0
- package/dist/report/aggregate.js +212 -0
- package/dist/report/built-ins/experiment-comparison.d.ts +1 -0
- package/dist/report/built-ins/experiment-comparison.js +13 -0
- package/dist/report/built-ins/index.d.ts +1 -0
- package/dist/report/built-ins/index.js +2 -0
- package/dist/report/components.d.ts +180 -0
- package/dist/report/components.js +132 -0
- package/dist/report/compute.d.ts +106 -0
- package/dist/report/compute.js +600 -0
- package/dist/report/flag.d.ts +6 -0
- package/dist/report/flag.js +8 -0
- package/dist/report/format.d.ts +26 -0
- package/dist/report/format.js +109 -0
- package/dist/report/index.d.ts +19 -0
- package/dist/report/index.js +30 -0
- package/dist/report/load.d.ts +12 -0
- package/dist/report/load.js +56 -0
- package/dist/report/locale.d.ts +94 -0
- package/dist/report/locale.js +183 -0
- package/dist/report/metrics.d.ts +21 -0
- package/dist/report/metrics.js +115 -0
- package/dist/report/primitives.d.ts +64 -0
- package/dist/report/primitives.js +113 -0
- package/dist/report/react/AttemptList.d.ts +23 -0
- package/dist/report/react/AttemptList.js +19 -0
- package/dist/report/react/DeltaTable.d.ts +8 -0
- package/dist/report/react/DeltaTable.js +24 -0
- package/dist/report/react/EvalList.d.ts +10 -0
- package/dist/report/react/EvalList.js +0 -0
- package/dist/report/react/ExperimentList.d.ts +11 -0
- package/dist/report/react/ExperimentList.js +67 -0
- package/dist/report/react/GroupSummary.d.ts +8 -0
- package/dist/report/react/GroupSummary.js +8 -0
- package/dist/report/react/MetricBars.d.ts +10 -0
- package/dist/report/react/MetricBars.js +48 -0
- package/dist/report/react/MetricLine.d.ts +9 -0
- package/dist/report/react/MetricLine.js +68 -0
- package/dist/report/react/MetricMatrix.d.ts +10 -0
- package/dist/report/react/MetricMatrix.js +23 -0
- package/dist/report/react/MetricScatter.d.ts +9 -0
- package/dist/report/react/MetricScatter.js +96 -0
- package/dist/report/react/MetricTable.d.ts +11 -0
- package/dist/report/react/MetricTable.js +26 -0
- package/dist/report/react/RunOverview.d.ts +8 -0
- package/dist/report/react/RunOverview.js +12 -0
- package/dist/report/react/Scoreboard.d.ts +8 -0
- package/dist/report/react/Scoreboard.js +26 -0
- package/dist/report/react/cell.d.ts +9 -0
- package/dist/report/react/cell.js +9 -0
- package/dist/report/react/chart-math.d.ts +14 -0
- package/dist/report/react/chart-math.js +68 -0
- package/dist/report/react/colors.d.ts +14 -0
- package/dist/report/react/colors.js +45 -0
- package/dist/report/react/fixtures.d.ts +19 -0
- package/dist/report/react/fixtures.js +398 -0
- package/dist/report/react/format.d.ts +3 -0
- package/dist/report/react/format.js +7 -0
- package/dist/report/react/index.d.ts +6 -0
- package/dist/report/react/index.js +14 -0
- package/dist/report/report.d.ts +24 -0
- package/dist/report/report.js +49 -0
- package/dist/report/text/faces.d.ts +29 -0
- package/dist/report/text/faces.js +541 -0
- package/dist/report/text/layout.d.ts +75 -0
- package/dist/report/text/layout.js +173 -0
- package/dist/report/text/plot.d.ts +37 -0
- package/dist/report/text/plot.js +81 -0
- package/dist/report/text/table.d.ts +8 -0
- package/dist/report/text/table.js +86 -0
- package/dist/report/tree.d.ts +99 -0
- package/dist/report/tree.js +228 -0
- package/dist/report/types.d.ts +408 -0
- package/dist/report/types.js +4 -0
- package/dist/report/web.d.ts +15 -0
- package/dist/report/web.js +37 -0
- package/dist/results/locator.d.ts +75 -0
- package/dist/results/locator.js +0 -0
- package/dist/results/select.d.ts +45 -0
- package/dist/results/select.js +230 -0
- package/dist/results/source-hash.d.ts +9 -0
- package/dist/results/types.d.ts +204 -0
- package/dist/runner/eval-source.d.ts +22 -0
- package/dist/runner/fingerprint.d.ts +23 -0
- package/dist/runner/types.d.ts +332 -0
- package/dist/sandbox/docker-stream.d.ts +24 -0
- package/dist/sandbox/docker.d.ts +84 -0
- package/dist/sandbox/e2b.d.ts +31 -0
- package/dist/sandbox/errors.d.ts +4 -0
- package/dist/sandbox/local-files.d.ts +6 -0
- package/dist/sandbox/paths.d.ts +4 -0
- package/dist/sandbox/registry.d.ts +13 -0
- package/dist/sandbox/resolve.d.ts +40 -0
- package/dist/sandbox/retry.d.ts +10 -0
- package/dist/sandbox/shell.d.ts +11 -0
- package/dist/sandbox/source-files.d.ts +13 -0
- package/dist/sandbox/types.d.ts +203 -0
- package/dist/sandbox/vercel.d.ts +37 -0
- package/dist/scoring/types.d.ts +70 -0
- package/dist/shared/aggregate.d.ts +29 -0
- package/dist/shared/aggregate.js +55 -0
- package/dist/shared/types.d.ts +27 -0
- package/dist/shared/verdict.d.ts +27 -0
- package/dist/shared/verdict.js +34 -0
- package/dist/tty-line.d.ts +6 -0
- package/dist/types.d.ts +7 -0
- package/dist/util.d.ts +22 -0
- package/docs-site/zh/concepts/adapter.mdx +7 -7
- package/docs-site/zh/concepts/assert.mdx +19 -18
- package/docs-site/zh/concepts/evals.mdx +12 -11
- package/docs-site/zh/concepts/experiment.mdx +2 -2
- package/docs-site/zh/concepts/judge.mdx +9 -9
- package/docs-site/zh/concepts/overview.mdx +3 -3
- package/docs-site/zh/concepts/tier.mdx +6 -6
- package/docs-site/zh/example/claude-code-codex-plugin.mdx +9 -5
- package/docs-site/zh/example/claude-code-codex-skill.mdx +12 -7
- package/docs-site/zh/guides/agent-feedback-loop.mdx +237 -78
- package/docs-site/zh/guides/connect-otel.mdx +3 -3
- package/docs-site/zh/guides/connect-your-agent.mdx +2 -2
- package/docs-site/zh/guides/custom-reports.mdx +196 -36
- package/docs-site/zh/guides/experiments.mdx +7 -1
- package/docs-site/zh/guides/fixtures.mdx +4 -2
- package/docs-site/zh/guides/official-adapters.mdx +31 -9
- package/docs-site/zh/guides/publish-report.mdx +4 -4
- package/docs-site/zh/guides/report-components.mdx +194 -55
- package/docs-site/zh/guides/reporters.mdx +2 -2
- package/docs-site/zh/guides/results-data.mdx +61 -34
- package/docs-site/zh/guides/runner.mdx +2 -2
- package/docs-site/zh/guides/sandbox-agent.mdx +3 -2
- package/docs-site/zh/guides/{sandbox-backends.mdx → sandbox-providers.mdx} +12 -12
- package/docs-site/zh/guides/viewing-results.mdx +200 -79
- package/docs-site/zh/guides/write-experiment.mdx +9 -1
- package/docs-site/zh/guides/write-send.mdx +4 -3
- package/docs-site/zh/index.mdx +4 -3
- package/docs-site/zh/introduction.mdx +2 -1
- package/docs-site/zh/quickstart.mdx +5 -3
- package/docs-site/zh/reference/builtin-agents.mdx +38 -13
- package/docs-site/zh/reference/capabilities.mdx +1 -1
- package/docs-site/zh/reference/cli.mdx +36 -13
- package/docs-site/zh/reference/define-agent.mdx +15 -13
- package/docs-site/zh/reference/define-config.mdx +1 -1
- package/docs-site/zh/reference/define-eval.mdx +3 -3
- package/docs-site/zh/reference/events.mdx +9 -3
- package/docs-site/zh/reference/expect.mdx +13 -8
- package/package.json +10 -6
- package/src/agents/bub.ts +129 -42
- package/src/agents/claude-code.test.ts +152 -0
- package/src/agents/claude-code.ts +127 -13
- package/src/agents/codex.test.ts +192 -0
- package/src/agents/codex.ts +151 -12
- package/src/agents/index.ts +9 -3
- package/src/agents/manifest.ts +41 -0
- package/src/agents/plugin-config.test.ts +94 -0
- package/src/agents/shared.ts +33 -2
- package/src/agents/skills.test.ts +214 -0
- package/src/agents/skills.ts +304 -0
- package/src/agents/streaming.ts +5 -5
- package/src/agents/types.ts +59 -3
- package/src/cli.ts +74 -47
- package/src/context/context.test.ts +20 -2
- package/src/context/control-flow.ts +1 -1
- package/src/context/session.test.ts +92 -1
- package/src/context/session.ts +23 -1
- package/src/context/types.ts +4 -4
- package/src/define.test.ts +8 -8
- package/src/define.ts +11 -11
- package/src/expect/index.ts +5 -5
- package/src/i18n/en.ts +33 -15
- package/src/i18n/zh-CN.ts +37 -21
- package/src/index.ts +1 -1
- package/src/o11y/execution-tree.test.ts +452 -0
- package/src/o11y/execution-tree.ts +367 -0
- package/src/o11y/otlp/receiver.ts +1 -1
- package/src/o11y/otlp/select.ts +7 -3
- package/src/o11y/parsers/claude-code.test.ts +175 -0
- package/src/o11y/parsers/claude-code.ts +32 -0
- package/src/o11y/types.ts +6 -1
- package/src/report/aggregate.ts +26 -20
- package/src/report/built-in-user-parity.test.tsx +640 -0
- package/src/report/built-ins/experiment-comparison.tsx +19 -0
- package/src/report/built-ins/index.ts +2 -0
- package/src/report/components.tsx +225 -50
- package/src/report/compute.ts +335 -54
- package/src/report/dual-render.test.tsx +1129 -0
- package/src/report/flag.ts +1 -1
- package/src/report/format.ts +35 -2
- package/src/report/index.ts +47 -14
- package/src/report/load.ts +1 -1
- package/src/report/locale.ts +229 -0
- package/src/report/metrics.ts +39 -15
- package/src/report/primitives.tsx +100 -2
- package/src/report/react/AttemptList.tsx +113 -0
- package/src/report/react/DeltaTable.tsx +9 -6
- package/src/report/react/EvalList.tsx +0 -0
- package/src/report/react/ExperimentList.tsx +220 -0
- package/src/report/react/GroupSummary.tsx +66 -0
- package/src/report/react/MetricBars.tsx +24 -13
- package/src/report/react/MetricLine.tsx +21 -21
- package/src/report/react/MetricMatrix.tsx +8 -4
- package/src/report/react/MetricScatter.tsx +126 -96
- package/src/report/react/MetricTable.tsx +115 -15
- package/src/report/react/RunOverview.tsx +48 -26
- package/src/report/react/Scoreboard.tsx +15 -7
- package/src/report/react/cell.tsx +18 -9
- package/src/{view/app/lib/chart.ts → report/react/chart-math.ts} +2 -6
- package/src/report/react/colors.ts +24 -15
- package/src/report/react/enhance.js +168 -0
- package/src/report/react/fixtures.ts +169 -34
- package/src/report/react/format.ts +1 -1
- package/src/report/react/index.tsx +21 -6
- package/src/report/react/render.test.tsx +180 -31
- package/src/report/react/styles.css +432 -213
- package/src/report/report.test.ts +398 -94
- package/src/report/report.ts +29 -11
- package/src/report/text/faces.ts +344 -96
- package/src/report/text/layout.ts +76 -11
- package/src/report/text/table.ts +98 -0
- package/src/report/tree.ts +103 -20
- package/src/report/types.ts +184 -25
- package/src/report/web.ts +46 -19
- package/src/results/annotated-source.test.ts +146 -0
- package/src/results/annotated-source.ts +128 -0
- package/src/results/attempt-evidence.test.ts +158 -0
- package/src/results/attempt-evidence.ts +158 -0
- package/src/results/attempt-source.ts +48 -0
- package/src/results/copy.ts +154 -139
- package/src/results/format.ts +54 -47
- package/src/results/host-equivalence.test.ts +527 -0
- package/src/results/index.ts +56 -14
- package/src/results/locator.test.ts +198 -0
- package/src/results/locator.ts +0 -0
- package/src/results/open.ts +392 -175
- package/src/results/results.test.ts +943 -494
- package/src/results/select.ts +129 -23
- package/src/results/skipped-notice.ts +0 -0
- package/src/results/source-hash.ts +28 -0
- package/src/results/types.ts +98 -62
- package/src/results/writer.ts +304 -176
- package/src/runner/attempt.test.ts +170 -0
- package/src/runner/attempt.ts +48 -13
- package/src/runner/discover.test.ts +65 -0
- package/src/runner/discover.ts +6 -2
- package/src/runner/eval-source.test.ts +121 -0
- package/src/runner/eval-source.ts +45 -0
- package/src/runner/fingerprint.ts +54 -1
- package/src/runner/remote-sandbox.ts +1 -1
- package/src/runner/report.test.ts +6 -8
- package/src/runner/report.ts +5 -4
- package/src/runner/reporters/artifacts.ts +27 -41
- package/src/runner/reporters/braintrust.test.ts +3 -3
- package/src/runner/reporters/braintrust.ts +1 -1
- package/src/runner/reporters/console.ts +6 -6
- package/src/runner/reporters/json.ts +4 -4
- package/src/runner/reporters/live.test.ts +56 -0
- package/src/runner/reporters/live.ts +36 -10
- package/src/runner/reporters/quiet.test.ts +66 -0
- package/src/runner/reporters/quiet.ts +49 -0
- package/src/runner/reporters/shared.ts +5 -5
- package/src/runner/reporters/table.ts +17 -17
- package/src/runner/run.ts +61 -102
- package/src/runner/types.ts +43 -32
- package/src/sandbox/checkpoint.ts +1 -1
- package/src/sandbox/docker.ts +15 -2
- package/src/sandbox/e2b.ts +11 -5
- package/src/sandbox/errors.ts +13 -0
- package/src/sandbox/index.ts +3 -3
- package/src/sandbox/local-files.ts +1 -1
- package/src/sandbox/registry.ts +6 -5
- package/src/sandbox/resolve.ts +38 -23
- package/src/sandbox/retry.test.ts +68 -0
- package/src/sandbox/retry.ts +44 -0
- package/src/sandbox/types.ts +24 -24
- package/src/sandbox/vercel.ts +17 -3
- package/src/scoring/collector.ts +3 -3
- package/src/scoring/judge.ts +2 -2
- package/src/scoring/scoped.ts +13 -1
- package/src/scoring/types.ts +7 -7
- package/src/scoring/verdict.ts +4 -4
- package/src/shared/aggregate.ts +23 -3
- package/src/shared/types.ts +2 -2
- package/src/shared/{outcome.ts → verdict.ts} +15 -15
- package/src/show/compose.ts +12 -132
- package/src/show/index.ts +119 -95
- package/src/show/render.ts +462 -159
- package/src/show/show.test.ts +471 -253
- package/src/source-loc.ts +1 -1
- package/src/tty-line.ts +32 -0
- package/src/types.ts +2 -2
- package/src/util.test.ts +21 -1
- package/src/util.ts +5 -1
- package/src/view/app/App.tsx +33 -198
- package/src/view/app/components/AttemptModal.tsx +6 -6
- package/src/view/app/components/CodeView.tsx +2 -2
- package/src/view/app/components/CopyControls.tsx +32 -36
- package/src/view/app/components/SkippedRunsBanner.tsx +140 -0
- package/src/view/app/components/ui/badge.tsx +1 -1
- package/src/view/app/components/ui/dialog.tsx +2 -2
- package/src/view/app/i18n.ts +40 -31
- package/src/view/app/lib/artifact-url.ts +1 -1
- package/src/view/app/lib/attempt-route.test.ts +37 -47
- package/src/view/app/lib/attempt-route.ts +26 -26
- package/src/view/app/lib/rows.ts +9 -112
- package/src/view/app/lib/verdict.ts +25 -0
- package/src/view/app/main.tsx +9 -12
- package/src/view/app/pages/RunsPage.tsx +4 -4
- package/src/view/app/pages/TracesPage.tsx +3 -3
- package/src/view/app/shared.ts +0 -1
- package/src/view/app/types.ts +6 -51
- package/src/view/artifact-serving.test.ts +136 -0
- package/src/view/client-dist/app.css +1 -1
- package/src/view/client-dist/app.js +21 -21
- package/src/view/data.test.ts +214 -143
- package/src/view/data.ts +166 -120
- package/src/view/index.ts +23 -11
- package/src/view/server.ts +52 -17
- package/src/view/shared/types.ts +22 -31
- package/src/view/styles.css +117 -327
- package/src/view/view-report.test.ts +146 -98
- package/src/report/default-report.tsx +0 -222
- package/src/report/dual-face.test.tsx +0 -527
- package/src/report/react/CaseList.tsx +0 -70
- package/src/view/app/components/CostScoreChart.tsx +0 -147
- package/src/view/app/components/ExperimentTable.tsx +0 -284
- package/src/view/app/components/GroupSelector.tsx +0 -61
- package/src/view/app/components/primitives.tsx +0 -43
- package/src/view/app/lib/outcome.ts +0 -82
package/src/view/server.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
// HTTP server 与静态资源:起本地 web
|
|
1
|
+
// HTTP server 与静态资源:起本地 web、按需吐 artifact、把 viewData 烘焙进单个 HTML。
|
|
2
2
|
// 数据读取与统计在 data.ts(openResults + 官方计算函数);这里只管「怎么送到浏览器」。
|
|
3
3
|
|
|
4
4
|
import { createServer, type Server } from "node:http";
|
|
5
5
|
import { readFile } from "node:fs/promises";
|
|
6
6
|
import { resolve } from "node:path";
|
|
7
|
-
import { loadViewScan, viewRoot, type ViewScan, type ViewScanOptions } from "./data.ts";
|
|
7
|
+
import { loadAttemptIndex, loadViewScan, viewRoot, type ViewScan, type ViewScanOptions } from "./data.ts";
|
|
8
|
+
import type { AttemptHandle } from "../results/index.ts";
|
|
8
9
|
import { formatThrown } from "../util.ts";
|
|
9
10
|
|
|
10
11
|
export interface ViewOptions {
|
|
@@ -41,16 +42,16 @@ export async function startViewServer(opts: ViewOptions = {}): Promise<ViewServe
|
|
|
41
42
|
res.end("ok");
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
|
-
//
|
|
45
|
+
// 按需提供拆分 artifact(trace.json / events.json / …),前端展开时 fetch。
|
|
45
46
|
// 路径式 /artifact/<rel> 与目录式静态导出的文件布局一致(见 view/index.ts 的 buildView),
|
|
46
47
|
// 同一份前端产物在本地 server 和静态托管上用同一个相对 URL。
|
|
47
48
|
if (url.pathname.startsWith("/artifact/")) {
|
|
48
|
-
await serveArtifact(root, decodeURIComponent(url.pathname.slice("/artifact/".length)), res);
|
|
49
|
+
await serveArtifact(root, decodeURIComponent(url.pathname.slice("/artifact/".length)), res, () => loadAttemptIndex(input));
|
|
49
50
|
return;
|
|
50
51
|
}
|
|
51
52
|
// 兼容旧的 query 形式(0.2.x 前端烘焙的 HTML 可能还开着)。
|
|
52
53
|
if (url.pathname === "/artifact") {
|
|
53
|
-
await serveArtifact(root, url.searchParams.get("p") ?? "", res);
|
|
54
|
+
await serveArtifact(root, url.searchParams.get("p") ?? "", res, () => loadAttemptIndex(input));
|
|
54
55
|
return;
|
|
55
56
|
}
|
|
56
57
|
if (url.pathname !== "/") {
|
|
@@ -83,37 +84,56 @@ export async function startViewServer(opts: ViewOptions = {}): Promise<ViewServe
|
|
|
83
84
|
|
|
84
85
|
/**
|
|
85
86
|
* 把 viewData(只含原始值与相对路径,不含宿主机绝对路径)和前端产物烘焙进单个 HTML。
|
|
86
|
-
*
|
|
87
|
-
* __NICEEVAL_VIEW_DATA__ 旁(
|
|
88
|
-
*
|
|
89
|
-
*
|
|
87
|
+
* 报告槽恒在:报告 HTML 作为 <template id="niceeval-report-en"> / <template
|
|
88
|
+
* id="niceeval-report-zh-CN"> 两个静态块烘在 __NICEEVAL_VIEW_DATA__ 旁(不 hydrate,
|
|
89
|
+
* 自定义组件的 <Style> 产物已内联其中),并恒内联官方组件样式(report/react/styles.css)
|
|
90
|
+
* 与渐进增强 runtime(report/react/enhance.js,内联 <script>:排序 / 过滤 / tooltip,
|
|
91
|
+
* document 级事件委托,报告块被前端搬进槽位也无需重绑;无 JS 时报告内容依旧完整);
|
|
92
|
+
* 前端只把当前界面语言对应的那块摆进报告槽位置,不解析。
|
|
90
93
|
*/
|
|
91
94
|
export async function renderHtml(scan: ViewScan): Promise<string> {
|
|
92
95
|
const template = await readViewAsset("template.html");
|
|
93
96
|
const styles = await readViewAsset("client-dist/app.css");
|
|
94
97
|
const app = await readViewAsset("client-dist/app.js");
|
|
95
|
-
const reportStyles =
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
const [reportStyles, reportEnhance] = await Promise.all([
|
|
99
|
+
readFile(new URL("../report/react/styles.css", import.meta.url), "utf-8"),
|
|
100
|
+
readFile(new URL("../report/react/enhance.js", import.meta.url), "utf-8"),
|
|
101
|
+
]);
|
|
99
102
|
|
|
100
103
|
return template
|
|
101
104
|
.replace(
|
|
102
105
|
TEMPLATE_PLACEHOLDERS.styles,
|
|
103
|
-
() => `<style>\n${styles}\n</style
|
|
106
|
+
() => `<style>\n${styles}\n</style>\n<style>\n${reportStyles}\n</style>\n<script>\n${reportEnhance}\n</script>`,
|
|
104
107
|
)
|
|
105
|
-
.replace(
|
|
106
|
-
|
|
108
|
+
.replace(
|
|
109
|
+
TEMPLATE_PLACEHOLDERS.reportSlot,
|
|
110
|
+
() =>
|
|
111
|
+
`<template id="niceeval-report-en">${scan.reportHtml.en}</template>\n` +
|
|
112
|
+
`<template id="niceeval-report-zh-CN">${scan.reportHtml["zh-CN"]}</template>`,
|
|
107
113
|
)
|
|
108
114
|
.replace(TEMPLATE_PLACEHOLDERS.viewData, () => JSON.stringify(scan.viewData).replace(/</g, "\\u003c"))
|
|
109
115
|
.replace(TEMPLATE_PLACEHOLDERS.appCode, () => JSON.stringify(app).replace(/</g, "\\u003c"));
|
|
110
116
|
}
|
|
111
117
|
|
|
112
|
-
/**
|
|
118
|
+
/** rel 的末段文件名;base = 去掉末段后剩下的部分(与 artifactUrl 的按段编码/拼接对称)。 */
|
|
119
|
+
function splitArtifactRel(rel: string): { base: string; file: string } {
|
|
120
|
+
const segments = rel.split("/");
|
|
121
|
+
const file = segments.pop() ?? "";
|
|
122
|
+
return { base: segments.join("/"), file };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 安全地把 root 下的 artifact 文件吐回去(限定 .json,且解析后必须仍在 root 内)。
|
|
127
|
+
* sources.json 是唯一例外:落盘是去重后的引用(`{path, sha256}[]`),不能直接 piping 原字节——
|
|
128
|
+
* 按 base 反查 AttemptHandle,经它的 `.sources()` 解引用出完整内容(`{path, content}[]`)再回给
|
|
129
|
+
* 浏览器。attemptIndex 懒建(只在真的碰到 sources.json 请求时才付 openResults() 扫描的代价),
|
|
130
|
+
* events.json / trace.json 等其它 artifact 完全不受影响,原样走原文件读取。
|
|
131
|
+
*/
|
|
113
132
|
async function serveArtifact(
|
|
114
133
|
root: string,
|
|
115
134
|
rel: string,
|
|
116
135
|
res: import("node:http").ServerResponse,
|
|
136
|
+
attemptIndex: () => Promise<Map<string, AttemptHandle>>,
|
|
117
137
|
): Promise<void> {
|
|
118
138
|
const abs = resolve(root, rel);
|
|
119
139
|
const within = abs === root || abs.startsWith(root + "/");
|
|
@@ -122,6 +142,21 @@ async function serveArtifact(
|
|
|
122
142
|
res.end("bad artifact path");
|
|
123
143
|
return;
|
|
124
144
|
}
|
|
145
|
+
|
|
146
|
+
const { base, file } = splitArtifactRel(rel);
|
|
147
|
+
if (file === "sources.json") {
|
|
148
|
+
const attempt = (await attemptIndex()).get(base);
|
|
149
|
+
if (!attempt) {
|
|
150
|
+
res.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
|
|
151
|
+
res.end("artifact not found");
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const sources = await attempt.sources();
|
|
155
|
+
res.writeHead(200, { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" });
|
|
156
|
+
res.end(JSON.stringify(sources ?? []));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
125
160
|
try {
|
|
126
161
|
const body = await readFile(abs, "utf-8");
|
|
127
162
|
res.writeHead(200, { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" });
|
package/src/view/shared/types.ts
CHANGED
|
@@ -1,46 +1,43 @@
|
|
|
1
1
|
// server(data.ts)与前端(app/)共用的 view 数据形状。
|
|
2
2
|
// viewData 会被序列化进静态 HTML,两边必须对同一份声明编程;只允许 type import。
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
4
|
+
// viewData 只携带证据室与壳需要的东西:快照明细(locator / artifactBase 已注入)、
|
|
5
|
+
// skipped、项目名与 run 元信息。统计口径(KPI / 榜单 / 挑选警告)整体住在报告槽的
|
|
6
|
+
// 静态 HTML 里(ExperimentComparison 或 --report 的报告自己算),壳与报告之间没有第二条数据通道。
|
|
7
7
|
|
|
8
8
|
import type { EvalResult, LocalizedText } from "../../types.ts";
|
|
9
|
-
import type {
|
|
9
|
+
import type { ReportLocale } from "../../report/locale.ts";
|
|
10
|
+
import type { AttemptLocator } from "../../results/locator.ts";
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
export type { MetricCell, MetricColumn, OverviewData, SelectionWarning, TableData } from "../../report/types.ts";
|
|
12
|
+
export type { AttemptLocator };
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* MetricCell.refs 同一身份契约,报告页(前门)与 view(证据室)靠它指向同一个 attempt。
|
|
15
|
+
* 报告槽的双语静态 HTML:同一棵报告树按 locale 渲染两遍(en / zh-CN),server 烘成
|
|
16
|
+
* 两个 <template> 静态块,前端按当前界面语言摆放对应块,切语言不重算数据。
|
|
18
17
|
*/
|
|
19
|
-
export
|
|
20
|
-
run: string;
|
|
21
|
-
result: number;
|
|
22
|
-
}
|
|
18
|
+
export type ReportSlotHtml = Record<ReportLocale, string>;
|
|
23
19
|
|
|
24
|
-
/** view 侧的 attempt 结果 = 瘦身后的 EvalResult + loader
|
|
25
|
-
|
|
20
|
+
/** view 侧的 attempt 结果 = 瘦身后的 EvalResult + loader 注入的深链身份(不透明 AttemptLocator,
|
|
21
|
+
* `#/attempt/@<locator>` 路由的参数,与 Reports 的 MetricCell.refs / `ctx.attemptHref` 同一身份契约)
|
|
22
|
+
* 与 artifact 基址。 */
|
|
23
|
+
export type ViewEvalResult = EvalResult & { locator?: AttemptLocator };
|
|
26
24
|
|
|
27
25
|
/**
|
|
28
|
-
* 快照 = 单次跑的实验(experiment ×
|
|
26
|
+
* 快照 = 单次跑的实验(experiment × 一次运行),与 niceeval/results 的 Snapshot 同口径。
|
|
29
27
|
* 携带 attempt 明细供证据室(钻取 / AttemptModal / Runs / Traces)渲染;
|
|
30
28
|
* 榜单统计不从这里算,吃 ViewData.table / overview 的官方产物。
|
|
31
29
|
*/
|
|
32
30
|
export interface ViewSnapshot {
|
|
33
|
-
/** 落盘缺 experimentId 时是 "<agent>/<model>" 合成键(synthetic: true 同源)。 */
|
|
34
31
|
experimentId: string;
|
|
35
|
-
synthetic?: boolean;
|
|
36
32
|
agent: string;
|
|
37
33
|
model?: string;
|
|
38
34
|
startedAt: string;
|
|
39
|
-
/**
|
|
35
|
+
/** 快照的根相对路径(= niceeval/results 的 AttemptRef.snapshot,两段:`<experiment-dir>/<snapshot-dir>`)。 */
|
|
40
36
|
run: string;
|
|
41
|
-
/**
|
|
37
|
+
/** 是否为该实验在 results.latest() 口径下的最新一次快照 —— 证据室的 latest 标记,与报告槽 Selection
|
|
38
|
+
(现刻水位,可能合成自更早快照)是两个独立概念,不要混用。 */
|
|
42
39
|
latest: boolean;
|
|
43
|
-
/** 该快照的 attempt 明细(跨快照去重后的幸存条目;
|
|
40
|
+
/** 该快照的 attempt 明细(跨快照去重后的幸存条目;locator / artifactBase 已注入)。 */
|
|
44
41
|
results: ViewEvalResult[];
|
|
45
42
|
}
|
|
46
43
|
|
|
@@ -60,23 +57,17 @@ export interface SkippedRunNotice {
|
|
|
60
57
|
}
|
|
61
58
|
|
|
62
59
|
/**
|
|
63
|
-
* 烘焙进 HTML
|
|
64
|
-
* 格式化统一由前端按当前界面 locale
|
|
60
|
+
* 烘焙进 HTML 的页面数据(证据室与壳)。时间/成本一律传原始值(ISO 字符串、number),
|
|
61
|
+
* 格式化统一由前端按当前界面 locale 做。
|
|
65
62
|
*/
|
|
66
63
|
export interface ViewData {
|
|
67
64
|
/** 项目名(来自 config.name);hero 标题,可按 locale 多语言。 */
|
|
68
65
|
name?: LocalizedText;
|
|
69
66
|
/** 最近一次 run 的 startedAt(ISO);没有历史 run 时缺省。 */
|
|
70
67
|
lastRunAt?: string;
|
|
71
|
-
/**
|
|
68
|
+
/** 报告槽 Selection 合成自几个物理 run;hero「合成来源」标注。 */
|
|
72
69
|
composedRuns: number;
|
|
73
|
-
/**
|
|
74
|
-
overview: OverviewData;
|
|
75
|
-
/** 默认报告(MetricTable.data,rows: "experiment"):每个实验最新一次快照的口径。 */
|
|
76
|
-
table: TableData;
|
|
77
|
-
/** 整体单行(MetricTable.data,常量维度):hero 的官方通过率,同一台聚合引擎。 */
|
|
78
|
-
overall: TableData;
|
|
79
|
-
/** 全部历史快照(跨快照按身份键去重后);Experiments 钻取吃 latest,Runs / Traces 吃全部。 */
|
|
70
|
+
/** 全部历史快照(跨快照按身份键去重后);修复 prompt 吃 latest,Runs / Traces 吃全部。 */
|
|
80
71
|
snapshots: ViewSnapshot[];
|
|
81
72
|
/** 读不了的落盘(三种原因);前端顶部横幅展示,不静默。 */
|
|
82
73
|
skippedRuns?: SkippedRunNotice[];
|