niceeval 0.6.0 → 0.6.2
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/dist/agents/types.d.ts +72 -6
- package/dist/context/types.d.ts +32 -12
- package/dist/i18n/en.d.ts +54 -0
- package/dist/i18n/zh-CN.d.ts +55 -1
- package/dist/o11y/types.d.ts +16 -2
- package/dist/report/aggregate.d.ts +5 -3
- package/dist/report/aggregate.js +32 -5
- package/dist/report/built-ins/experiment-comparison.d.ts +39 -0
- package/dist/report/built-ins/experiment-comparison.js +119 -0
- package/dist/report/built-ins/index.d.ts +2 -1
- package/dist/report/built-ins/index.js +2 -2
- package/dist/report/components.d.ts +10 -2
- package/dist/report/components.js +3 -3
- package/dist/report/compute.d.ts +11 -18
- package/dist/report/compute.js +68 -66
- package/dist/report/flag.d.ts +16 -1
- package/dist/report/flag.js +19 -1
- package/dist/report/format.d.ts +16 -14
- package/dist/report/format.js +28 -30
- package/dist/report/index.d.ts +5 -4
- package/dist/report/index.js +6 -5
- package/dist/report/locale.d.ts +23 -3
- package/dist/report/locale.js +47 -6
- package/dist/report/metrics.d.ts +13 -1
- package/dist/report/metrics.js +66 -15
- package/dist/report/primitives.d.ts +6 -0
- package/dist/report/react/AttemptList.d.ts +4 -4
- package/dist/report/react/AttemptList.js +8 -10
- package/dist/report/react/EvalList.d.ts +1 -1
- package/dist/report/react/EvalList.js +0 -0
- package/dist/report/react/ExperimentComparison.d.ts +8 -0
- package/dist/report/react/ExperimentComparison.js +11 -0
- package/dist/report/react/ExperimentList.d.ts +4 -2
- package/dist/report/react/ExperimentList.js +57 -7
- package/dist/report/react/MetricScatter.js +6 -16
- package/dist/report/react/chart-math.d.ts +23 -6
- package/dist/report/react/chart-math.js +71 -19
- package/dist/report/react/fixtures.d.ts +3 -3
- package/dist/report/react/fixtures.js +30 -18
- package/dist/report/react/format.d.ts +1 -1
- package/dist/report/react/format.js +1 -1
- package/dist/report/react/index.d.ts +1 -1
- package/dist/report/report.d.ts +5 -1
- package/dist/report/report.js +6 -2
- package/dist/report/text/faces.d.ts +1 -1
- package/dist/report/text/faces.js +100 -61
- package/dist/report/text/table.js +36 -5
- package/dist/report/types.d.ts +40 -34
- package/dist/results/types.d.ts +11 -0
- package/dist/runner/feedback/sink.d.ts +110 -0
- package/dist/runner/types.d.ts +513 -22
- package/dist/sandbox/docker.d.ts +23 -2
- package/dist/sandbox/e2b.d.ts +15 -1
- package/dist/sandbox/errors.d.ts +30 -3
- package/dist/sandbox/io-retry.d.ts +17 -0
- package/dist/sandbox/registry.d.ts +2 -0
- package/dist/sandbox/resolve.d.ts +18 -5
- package/dist/sandbox/retry.d.ts +11 -1
- package/dist/sandbox/types.d.ts +39 -5
- package/dist/sandbox/vercel.d.ts +7 -1
- package/dist/scoring/coverage.d.ts +30 -0
- package/dist/scoring/display.d.ts +21 -0
- package/dist/scoring/display.js +120 -0
- package/dist/scoring/types.d.ts +103 -20
- package/dist/shared/aggregate.d.ts +1 -0
- package/dist/shared/aggregate.js +3 -3
- package/dist/shared/types.d.ts +28 -0
- package/dist/tty-line.d.ts +0 -4
- package/dist/util.d.ts +23 -0
- package/docs-site/zh/concepts/adapter.mdx +24 -6
- package/docs-site/zh/concepts/assert.mdx +11 -10
- package/docs-site/zh/concepts/evals.mdx +7 -6
- package/docs-site/zh/concepts/experiment.mdx +1 -1
- package/docs-site/zh/concepts/overview.mdx +7 -7
- package/docs-site/zh/guides/agent-feedback-loop.mdx +35 -31
- package/docs-site/zh/guides/authoring.mdx +33 -0
- package/docs-site/zh/guides/ci-integration.mdx +23 -12
- package/docs-site/zh/guides/connect-your-agent.mdx +29 -3
- package/docs-site/zh/guides/custom-reports.mdx +29 -34
- package/docs-site/zh/guides/dataset-fanout.mdx +25 -3
- package/docs-site/zh/guides/debug-sandbox.mdx +57 -0
- package/docs-site/zh/guides/debugging.mdx +210 -0
- package/docs-site/zh/guides/experiments.mdx +10 -3
- package/docs-site/zh/guides/fixtures.mdx +3 -1
- package/docs-site/zh/guides/official-adapters.mdx +27 -3
- package/docs-site/zh/guides/publish-report.mdx +30 -16
- package/docs-site/zh/guides/report-components.mdx +49 -37
- package/docs-site/zh/guides/reporters.mdx +2 -2
- package/docs-site/zh/guides/results-data.mdx +42 -8
- package/docs-site/zh/guides/runner.mdx +17 -7
- package/docs-site/zh/guides/sandbox-agent.mdx +57 -7
- package/docs-site/zh/guides/sandbox-providers.mdx +258 -10
- package/docs-site/zh/guides/scoring-guide.mdx +4 -4
- package/docs-site/zh/guides/viewing-results.mdx +85 -41
- package/docs-site/zh/guides/write-experiment.mdx +5 -3
- package/docs-site/zh/guides/write-send.mdx +19 -2
- package/docs-site/zh/index.mdx +1 -1
- package/docs-site/zh/reference/builtin-agents.mdx +27 -0
- package/docs-site/zh/reference/capabilities.mdx +2 -2
- package/docs-site/zh/reference/cli.mdx +35 -9
- package/docs-site/zh/reference/define-agent.mdx +60 -5
- package/docs-site/zh/reference/define-config.mdx +1 -1
- package/docs-site/zh/reference/define-eval.mdx +42 -9
- package/docs-site/zh/reference/events.mdx +2 -2
- package/docs-site/zh/reference/expect.mdx +36 -6
- package/package.json +5 -1
- package/src/agents/ai-sdk-otel.test.ts +1 -0
- package/src/agents/ai-sdk.test.ts +3 -0
- package/src/agents/ai-sdk.ts +3 -0
- package/src/agents/bub-install-spec.test.ts +34 -0
- package/src/agents/bub-install-spec.ts +32 -0
- package/src/agents/bub.ts +31 -32
- package/src/agents/claude-code.test.ts +130 -9
- package/src/agents/claude-code.ts +76 -4
- package/src/agents/codex.test.ts +189 -40
- package/src/agents/codex.ts +155 -14
- package/src/agents/coding-cli-versions.test.ts +15 -0
- package/src/agents/coding-cli-versions.ts +3 -0
- package/src/agents/index.ts +11 -0
- package/src/agents/langgraph.test.ts +204 -0
- package/src/agents/langgraph.ts +495 -0
- package/src/agents/marketplace.ts +85 -0
- package/src/agents/native-config.test.ts +179 -0
- package/src/agents/native-config.ts +267 -0
- package/src/agents/openai-compat.test.ts +1 -0
- package/src/agents/openclaw.test.ts +31 -0
- package/src/agents/openclaw.ts +171 -0
- package/src/agents/plugin-config.test.ts +1 -0
- package/src/agents/sdk-streams.test.ts +79 -0
- package/src/agents/sdk-streams.ts +55 -10
- package/src/agents/skills.test.ts +1 -0
- package/src/agents/streaming.test.ts +3 -9
- package/src/agents/types.ts +73 -6
- package/src/agents/ui-message-stream.test.ts +3 -0
- package/src/cli.ts +411 -108
- package/src/context/context.test.ts +51 -12
- package/src/context/context.ts +161 -29
- package/src/context/session.test.ts +1 -0
- package/src/context/session.ts +114 -6
- package/src/context/types.ts +30 -12
- package/src/define.test.ts +13 -8
- package/src/define.ts +25 -4
- package/src/expect/index.ts +53 -23
- package/src/i18n/en.ts +65 -4
- package/src/i18n/zh-CN.ts +66 -4
- package/src/o11y/cost.test.ts +1 -0
- package/src/o11y/execution-tree.test.ts +1 -20
- package/src/o11y/otlp/mappers/claude-code.test.ts +1 -0
- package/src/o11y/otlp/parse.test.ts +1 -0
- package/src/o11y/otlp/turn-otel.test.ts +1 -0
- package/src/o11y/parsers/bub.test.ts +1 -0
- package/src/o11y/parsers/claude-code.test.ts +1 -34
- package/src/o11y/parsers/openclaw.test.ts +154 -0
- package/src/o11y/parsers/openclaw.ts +310 -0
- package/src/o11y/prices.json +746 -311
- package/src/o11y/tool-names.test.ts +1 -0
- package/src/o11y/types.ts +16 -2
- package/src/report/aggregate.ts +34 -5
- package/src/report/built-in-user-parity.test.tsx +127 -173
- package/src/report/built-ins/experiment-comparison.tsx +179 -0
- package/src/report/built-ins/index.ts +7 -2
- package/src/report/components.tsx +11 -3
- package/src/report/compute.ts +80 -74
- package/src/report/dual-render.test.tsx +222 -91
- package/src/report/flag.ts +30 -2
- package/src/report/format.ts +36 -27
- package/src/report/index.ts +23 -6
- package/src/report/locale.ts +49 -6
- package/src/report/metrics.ts +68 -15
- package/src/report/primitives.tsx +6 -0
- package/src/report/react/AttemptList.tsx +9 -36
- package/src/report/react/EvalList.tsx +0 -0
- package/src/report/react/ExperimentComparison.tsx +68 -0
- package/src/report/react/ExperimentList.tsx +173 -55
- package/src/report/react/MetricScatter.tsx +13 -25
- package/src/report/react/chart-math.test.ts +85 -0
- package/src/report/react/chart-math.ts +101 -22
- package/src/report/react/enhance.js +72 -1
- package/src/report/react/fixtures.ts +34 -21
- package/src/report/react/format.ts +1 -1
- package/src/report/react/index.tsx +0 -1
- package/src/report/react/render.test.tsx +30 -69
- package/src/report/react/styles.css +112 -14
- package/src/report/report.test.ts +308 -105
- package/src/report/report.ts +6 -2
- package/src/report/text/faces.ts +111 -67
- package/src/report/text/table.ts +42 -5
- package/src/report/types.ts +42 -34
- package/src/results/annotated-source.test.ts +62 -9
- package/src/results/annotated-source.ts +64 -6
- package/src/results/attempt-evidence.test.ts +9 -7
- package/src/results/attempt-evidence.ts +15 -8
- package/src/results/attempt-source.ts +6 -3
- package/src/results/copy.ts +145 -55
- package/src/results/host-equivalence.test.ts +11 -9
- package/src/results/index.ts +2 -0
- package/src/results/locator.test.ts +1 -22
- package/src/results/open.ts +7 -1
- package/src/results/publish.ts +149 -0
- package/src/results/results.test.ts +85 -51
- package/src/results/truncate.ts +90 -0
- package/src/results/types.ts +7 -0
- package/src/results/writer.ts +31 -13
- package/src/runner/attempt.test.ts +138 -7
- package/src/runner/attempt.ts +603 -104
- package/src/runner/discover.test.ts +47 -0
- package/src/runner/discover.ts +36 -2
- package/src/runner/eval-source.test.ts +1 -27
- package/src/runner/feedback/agent.test.ts +504 -0
- package/src/runner/feedback/agent.ts +409 -0
- package/src/runner/feedback/ci.test.ts +562 -0
- package/src/runner/feedback/ci.ts +401 -0
- package/src/runner/feedback/coordinator.test.ts +317 -0
- package/src/runner/feedback/coordinator.ts +397 -0
- package/src/runner/feedback/failure.ts +40 -0
- package/src/runner/feedback/human.test.ts +616 -0
- package/src/runner/feedback/human.ts +535 -0
- package/src/runner/feedback/index.ts +66 -0
- package/src/runner/feedback/io.ts +78 -0
- package/src/runner/feedback/profile.test.ts +50 -0
- package/src/runner/feedback/profile.ts +58 -0
- package/src/runner/feedback/reducer.test.ts +395 -0
- package/src/runner/feedback/reducer.ts +260 -0
- package/src/runner/feedback/renderer.ts +82 -0
- package/src/runner/feedback/sink.ts +203 -0
- package/src/runner/feedback/testing.ts +106 -0
- package/src/runner/ledger.test.ts +230 -0
- package/src/runner/ledger.ts +329 -0
- package/src/runner/report.test.ts +128 -3
- package/src/runner/report.ts +33 -9
- package/src/runner/reporters/artifacts.ts +8 -2
- package/src/runner/reporters/braintrust.test.ts +8 -7
- package/src/runner/reporters/braintrust.ts +9 -2
- package/src/runner/reporters/index.ts +2 -2
- package/src/runner/reporters/json.test.ts +162 -0
- package/src/runner/reporters/json.ts +35 -8
- package/src/runner/reporters/shared.ts +1 -5
- package/src/runner/run.test.ts +760 -3
- package/src/runner/run.ts +242 -36
- package/src/runner/sandbox-prep.ts +3 -42
- package/src/runner/timing.ts +158 -0
- package/src/runner/types.ts +518 -22
- package/src/sandbox/checkpoint.test.ts +55 -0
- package/src/sandbox/checkpoint.ts +29 -8
- package/src/sandbox/cli-commands.ts +407 -0
- package/src/sandbox/docker.ts +115 -16
- package/src/sandbox/e2b-agent-template.test.ts +56 -0
- package/src/sandbox/e2b-agent-template.ts +94 -0
- package/src/sandbox/e2b.ts +74 -9
- package/src/sandbox/errors.ts +111 -4
- package/src/sandbox/index.ts +2 -0
- package/src/sandbox/io-retry.test.ts +58 -0
- package/src/sandbox/io-retry.ts +45 -0
- package/src/sandbox/keep-registry.test.ts +86 -0
- package/src/sandbox/keep-registry.ts +142 -0
- package/src/sandbox/keep.ts +178 -0
- package/src/sandbox/paths.test.ts +1 -0
- package/src/sandbox/paths.ts +19 -8
- package/src/sandbox/registry.ts +20 -3
- package/src/sandbox/resolve.ts +76 -11
- package/src/sandbox/retry.test.ts +70 -0
- package/src/sandbox/retry.ts +46 -4
- package/src/sandbox/types.ts +44 -6
- package/src/sandbox/vercel.ts +43 -20
- package/src/scoring/collector.ts +60 -17
- package/src/scoring/coverage.ts +95 -0
- package/src/scoring/diff.ts +81 -0
- package/src/scoring/display.test.ts +121 -0
- package/src/scoring/display.ts +133 -0
- package/src/scoring/evidence.test.ts +189 -0
- package/src/scoring/judge.test.ts +142 -0
- package/src/scoring/judge.ts +15 -18
- package/src/scoring/scoped.ts +217 -50
- package/src/scoring/types.ts +117 -20
- package/src/scoring/verdict.ts +16 -4
- package/src/shared/aggregate.ts +3 -2
- package/src/shared/types.ts +31 -0
- package/src/show/compose.ts +2 -2
- package/src/show/index.ts +29 -16
- package/src/show/render.ts +626 -308
- package/src/show/show.test.ts +251 -36
- package/src/tty-line.ts +8 -26
- package/src/util.test.ts +1 -0
- package/src/util.ts +41 -0
- package/src/view/app/components/AttemptModal.tsx +153 -2
- package/src/view/app/components/CodeView.tsx +32 -11
- package/src/view/app/components/CopyControls.tsx +2 -2
- package/src/view/app/i18n.ts +6 -0
- package/src/view/app/lib/attempt-route.test.ts +1 -0
- package/src/view/app/lib/verdict.ts +7 -9
- package/src/view/artifact-serving.test.ts +2 -1
- package/src/view/client-dist/app.css +1 -1
- package/src/view/client-dist/app.js +17 -17
- package/src/view/data.test.ts +2 -1
- package/src/view/data.ts +17 -7
- package/src/view/index.ts +12 -1
- package/src/view/server.ts +2 -0
- package/src/view/shared/types.ts +1 -1
- package/src/view/styles.css +3 -0
- package/src/view/view-report.test.ts +11 -10
- package/dist/o11y/execution-tree.d.ts +0 -103
- package/dist/o11y/otlp/select.d.ts +0 -22
- package/dist/report/built-ins/cost-pass-rate-comparison.d.ts +0 -1
- package/dist/report/built-ins/cost-pass-rate-comparison.js +0 -17
- package/dist/results/annotated-source.d.ts +0 -61
- package/dist/results/attempt-evidence.d.ts +0 -69
- package/dist/results/attempt-source.d.ts +0 -15
- package/src/report/built-ins/cost-pass-rate-comparison.tsx +0 -23
- package/src/runner/reporters/console.ts +0 -70
- package/src/runner/reporters/live.test.ts +0 -56
- package/src/runner/reporters/live.ts +0 -247
- package/src/runner/reporters/quiet.test.ts +0 -66
- package/src/runner/reporters/quiet.ts +0 -49
- package/src/runner/reporters/table.ts +0 -277
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "排查失败与复盘历史运行"
|
|
3
|
+
sidebarTitle: "Debug 手册"
|
|
4
|
+
description: "一份按场景组织的排查手册:断言失败怎么定位、环境错误怎么进沙箱、agent 改了什么怎么看、旧的运行怎么翻出来复盘——每一步都有命令顺序和输出示例。"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
跑完一次 `niceeval exp`,失败的 Attempt 都带一个 `@` 开头的定位符(如 `@1qrdcfq8`)。它出现在运行摘要、CI 日志和报告里,定位符本身不会过期——只要 `.niceeval/` 里对应的结果快照还在,今天的定位符下周还能用同一条命令打开同一次 Attempt。所有排查都从它开始。
|
|
8
|
+
|
|
9
|
+
## 第一步永远是 `niceeval show @<定位符>`
|
|
10
|
+
|
|
11
|
+
不带任何参数打开 Attempt,第一页就是为排查设计的:判定、失败的断言、耗时分布、改动概览,以及下一步可用的命令。
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
$ niceeval show @1qrdcfq8
|
|
15
|
+
@1qrdcfq8 · memory/swelancer-manager-proposals · dev-e2b/codex-e2b · failed
|
|
16
|
+
snapshot 2026-07-12T10:08:29.361Z · attempt 1 · 50.0s · 58.5k tokens · $0.05
|
|
17
|
+
|
|
18
|
+
assertions: 3 passed · 1 gate failed
|
|
19
|
+
eval source: evals/memory/swelancer-manager-proposals.eval.ts · sha256:ee33b9c4…
|
|
20
|
+
|
|
21
|
+
failures:
|
|
22
|
+
gate · Issue 15193: selected proposal matches the one maintainers accepted
|
|
23
|
+
assertion: equals(4)
|
|
24
|
+
expected: 4
|
|
25
|
+
received: 1
|
|
26
|
+
source: evals/memory/swelancer-manager-proposals.eval.ts:40:11
|
|
27
|
+
|
|
28
|
+
execution: 12 events · 0 skill loads · 7 tool calls · 4 AI messages
|
|
29
|
+
timing: sandbox.queue 0.2s · sandbox.create 5.6s · sandbox.setup 3.5s · agent.setup 12.1s ·
|
|
30
|
+
eval.run 26.3s · workspace.diff 0.3s · scoring.evaluate 1.4s · teardown +0.8s
|
|
31
|
+
|
|
32
|
+
changes: 2 files changed by agent · M manager_decisions.json · A notes/decision-log.md
|
|
33
|
+
|
|
34
|
+
available:
|
|
35
|
+
niceeval show @1qrdcfq8 --eval
|
|
36
|
+
niceeval show @1qrdcfq8 --execution
|
|
37
|
+
niceeval show @1qrdcfq8 --timing
|
|
38
|
+
niceeval show @1qrdcfq8 --diff
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
看这一页先回答一个问题:**是 agent 答错了(`failed`),还是环境根本没跑起来(`errored`)?** 两种情况的排查路线完全不同。
|
|
42
|
+
|
|
43
|
+
## 场景一:断言失败(failed)——agent 跑完了,但结果不对
|
|
44
|
+
|
|
45
|
+
排查顺序是「哪条断言挂了 → agent 当时做了什么 → 它到底改了什么」。
|
|
46
|
+
|
|
47
|
+
**1. 把断言放回源码。** `--eval` 显示运行时保存的那份 eval 源码(不是你工作区里可能已经改过的版本),失败的断言直接标在对应行上;`t.send(...)` 的调用行标出它产生的那一轮——轮标签(`s1/t1`,与 `--execution` / `--timing` 用同一套)、这轮成没成、花了多久:
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
$ niceeval show @1qrdcfq8 --eval
|
|
51
|
+
21✓ await t.send("Review the proposals and record your decision…");
|
|
52
|
+
s1/t1 · completed · 22.4s
|
|
53
|
+
38 for (const [issue, label] of Object.entries(expected)) {
|
|
54
|
+
39 await t.group(`Issue ${issue}: selected proposal matches…`, async () => {
|
|
55
|
+
40✗ t.check(Number(decisions[issue]?.selected_proposal_id), equals(label.selected_proposal_id));
|
|
56
|
+
gate · Issue 15193 · equals(4) · expected 4 · received 1
|
|
57
|
+
41 });
|
|
58
|
+
42 }
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**2. 看 agent 当时做了什么。** `--execution` 把这次 Attempt 的对话按时间线展开——用户消息、assistant 回复、每次工具调用的入参和结果:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
$ niceeval show @1qrdcfq8 --execution
|
|
65
|
+
TURN s1/t1 · completed · 22.4s · 12.4k tok · $0.02
|
|
66
|
+
USER
|
|
67
|
+
Review the proposals and record your decision for each issue…
|
|
68
|
+
|
|
69
|
+
ASSISTANT
|
|
70
|
+
I'll inspect the task layout and the decision format first…
|
|
71
|
+
|
|
72
|
+
TOOL · command_execution +12.8s · 1.3s
|
|
73
|
+
input
|
|
74
|
+
/bin/bash -lc 'cat tasks/15193/proposals.md'
|
|
75
|
+
result · completed · exit 0
|
|
76
|
+
Proposal 1: …
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
对话按轮分段,每轮头行给出编号(`s1/t1`)、状态、耗时和用量——这个编号和 `--diff`、`--timing` 里的轮次标签是同一套,能互相对照。
|
|
80
|
+
|
|
81
|
+
**3. 看它到底改了什么。** `--diff` 只显示 **agent 自己改动的文件**——你上传的起始文件、跑完后写入的验证材料不会混在里面,所以列表里的每一行都真的是 agent 干的:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
$ niceeval show @1qrdcfq8 --diff
|
|
85
|
+
2 files changed by agent
|
|
86
|
+
M manager_decisions.json +6 -2 s1/t1, s1/t2
|
|
87
|
+
A notes/decision-log.md +18 s1/t2
|
|
88
|
+
|
|
89
|
+
single file: niceeval show @1qrdcfq8 --diff=manager_decisions.json
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
行尾的 `s1/t1` 表示这个文件是在第几轮对话里被改的,能和 `--execution` 的轮次对上。要看单个文件的逐行改动,用 `=` 连写文件路径:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
$ niceeval show @1qrdcfq8 --diff=manager_decisions.json
|
|
96
|
+
M manager_decisions.json · changed in s1/t1, s1/t2
|
|
97
|
+
@@ -1,5 +1,7 @@
|
|
98
|
+
{
|
|
99
|
+
- "15193": { "selected_proposal_id": 1 },
|
|
100
|
+
+ "15193": { "selected_proposal_id": 4 },
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
到这里通常能下结论:是任务描述有歧义、agent 理解错了,还是断言本身写得太死。
|
|
104
|
+
|
|
105
|
+
**要看文件本身,而不只是改动?** 落盘的证据刻意不保存整个工作区——`--diff` 只有 agent 改过的文件,agent 该写没写的文件、你上传的起始材料、setup 装出来的东西都不在里面。想看它们的实际内容,进活现场:重跑这一条 eval 加 `--keep-sandbox`(`failed` 的 Attempt 同样会保留,不只是环境错误),用下面场景二的方式进沙箱,workdir 里就是这次跑完时的完整文件树。
|
|
106
|
+
|
|
107
|
+
## 场景二:环境错误(errored)——agent 根本没跑起来
|
|
108
|
+
|
|
109
|
+
`errored` 的第一页不列断言,而是列出错误发生在哪个阶段、什么原因:
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
$ niceeval show @12h8m4k1
|
|
113
|
+
@12h8m4k1 · memory/agent-029-use-cache · compare/claude-e2b · errored
|
|
114
|
+
|
|
115
|
+
error:
|
|
116
|
+
phase: sandbox.create
|
|
117
|
+
code: sandbox-rate-limit
|
|
118
|
+
message: E2B sandbox allocation failed after 5 attempts
|
|
119
|
+
cause: RateLimitError · too many concurrent sandboxes
|
|
120
|
+
|
|
121
|
+
execution: unavailable (attempt failed before telemetry was configured)
|
|
122
|
+
timing: sandbox.queue 1.2s · sandbox.create 2m 6s ✗ failed here
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`phase` 直接告诉你死在哪一步,而且决定了下一步走哪条路:
|
|
126
|
+
|
|
127
|
+
**`sandbox.create` 失败——沙箱根本没创建出来,没有现场可留。** 这类错误(配额、限流、凭据、镜像 / 模板不存在)在你自己的机器和账号侧排查:核对 API key 和配额、降低 `--max-concurrency`、确认镜像 / 模板名。示例里的 rate-limit 就属于这类,重跑加 `--keep-sandbox` 只会原地再死一次。
|
|
128
|
+
|
|
129
|
+
**`sandbox.setup` / `agent.setup` / `eval.run` 失败——沙箱活过,值得留现场。** 装依赖失败、agent CLI 起不来、跑到一半超时,这类问题事件流往往是空的,落盘证据帮不上忙,最快的办法是留住现场进去手动重跑一遍出错的命令:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# 只重跑这一条 eval,失败时保留沙箱
|
|
133
|
+
npx niceeval exp compare memory/agent-029 --keep-sandbox
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
Kept sandboxes (1)
|
|
138
|
+
@18c1m2qx memory/agent-029-use-cache #1 errored docker · a3f9c2d1
|
|
139
|
+
enter: niceeval sandbox enter a3f9c2d1
|
|
140
|
+
Stop them with: niceeval sandbox stop --all
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`niceeval sandbox enter a3f9c2d1` 会唤醒现场并在 workdir 打开 shell——手动执行安装命令看真实报错、翻 `$HOME` 下的配置、检查 `PATH`,这些都在 artifact 之外,只有活现场能回答;退出 shell 后现场自动回到休眠,不白烧资源。保留策略、各 provider 的差别见[保留沙箱现场](/zh/guides/debug-sandbox)。
|
|
144
|
+
|
|
145
|
+
## 查看和清理留下的沙箱
|
|
146
|
+
|
|
147
|
+
保留下来的沙箱不会一直烧资源:Docker 容器停驻在磁盘上,E2B 微 VM 暂停计费,进入时自动唤醒。用 `niceeval sandbox` 管理:
|
|
148
|
+
|
|
149
|
+
```text
|
|
150
|
+
$ niceeval sandbox list
|
|
151
|
+
ID PROVIDER STATE FROM
|
|
152
|
+
a3f9c2d1 docker dormant memory/agent-029-use-cache #1 · errored · @18c1m2qx · 2026-07-14 15:02
|
|
153
|
+
enter: niceeval sandbox enter a3f9c2d1
|
|
154
|
+
9f21c07b vercel expired onboarding/tool-first #2 · failed · @1x7f3q8a · 2026-07-14 14:31
|
|
155
|
+
expired 2026-07-14 14:36 — remove with: niceeval sandbox stop 9f21c07b
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`dormant` 是「睡着但随时能进」,`expired` 是「现场已经没了,只剩记录」。排查完记得清理:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
niceeval sandbox stop a3f9c2d1 # id 可以只写唯一前缀
|
|
162
|
+
niceeval sandbox stop --all
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## 场景三:复盘旧的运行
|
|
166
|
+
|
|
167
|
+
每次运行都会在 `.niceeval/<实验>/<时间戳>/` 下留一份完整的结果快照,判定、断言、事件流、diff 都在里面,**不会被下一次运行覆盖**。复盘有三个入口:
|
|
168
|
+
|
|
169
|
+
**用旧定位符直接打开。** 从上周的终端记录、CI 日志或报告里复制 `@` 定位符,`niceeval show @<定位符>` 照常工作,上面的 `--eval` / `--execution` / `--diff` 全部可用——包括那份运行时的 eval 源码,哪怕你后来把 eval 改了。
|
|
170
|
+
|
|
171
|
+
**按实验回看当前水位。** 不记得定位符时,从实验入手:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
niceeval show --experiment compare/bub # 这个实验每道题现在的判定
|
|
175
|
+
niceeval show memory/swelancer --experiment compare/bub # 收窄到某道题
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
列表里每道题、每次 Attempt 都带定位符,接着往深处钻就回到上面的场景一 / 场景二。
|
|
179
|
+
|
|
180
|
+
**在浏览器里翻。** 复盘一批失败、对比多次 Attempt 时,网页比终端顺手:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
niceeval view
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
首页是成本 × 通过率总览和实验对比表;每个 Attempt 的详情页有判定、断言、完整时间树、对话、trace 和 diff,还有「Copy fix prompt」按钮——把失败整理成一段可以直接交给 coding agent 的修复提示词。报告里的 Attempt 深链和 `show` 用同一套定位符。
|
|
187
|
+
|
|
188
|
+
**打开归档或别人发来的结果。** 结果目录是自包含的——从 CI 下载的、同事拷给你的、发布到静态站前生成的目录,都能直接指过去:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
niceeval show --run tmp/ci-artifacts/results
|
|
192
|
+
niceeval view --run site-data/run
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
一个注意点:如果本地清理过旧快照目录,之后的运行里「沿用上次结果」的条目会找不到原始证据(显示为缺失)。要长期归档某次运行,先用 [`copySnapshots`](/zh/guides/results-data) 复制出一份再删。
|
|
196
|
+
|
|
197
|
+
## 速查:症状 → 命令
|
|
198
|
+
|
|
199
|
+
| 症状 | 命令顺序 |
|
|
200
|
+
|---|---|
|
|
201
|
+
| 断言挂了,不知道为什么 | `show @loc` → `show @loc --eval` |
|
|
202
|
+
| 想知道 agent 当时做了什么 | `show @loc --execution` |
|
|
203
|
+
| 想确认 agent 改了哪些文件 | `show @loc --diff` → `--diff=<path>` |
|
|
204
|
+
| 哪一步慢 / 超时死在哪 | `show @loc`(看 `timing:` 行)→ `show @loc --timing` |
|
|
205
|
+
| 沙箱创建就失败(配额 / 凭据 / 镜像) | `show @loc` 看 error 的 code 与 cause → 查账号配额、核对凭据、降 `--max-concurrency`(没有现场可留) |
|
|
206
|
+
| 装依赖失败、CLI 起不来、跑一半超时 | 重跑该 eval 加 `--keep-sandbox` → `niceeval sandbox enter <id>` |
|
|
207
|
+
| 想看文件实际内容(agent 没改的、起始材料、`$HOME`) | 重跑加 `--keep-sandbox`(failed 也留)→ `sandbox enter` 进 workdir 看 |
|
|
208
|
+
| 留了哪些沙箱、清理 | `sandbox list` → `sandbox stop <id>` / `--all` |
|
|
209
|
+
| 复盘上周那次失败 | 翻出旧定位符 → `show @loc`;不记得就 `show --experiment <实验>` |
|
|
210
|
+
| 一批失败一起看 | `niceeval view` → Attempt 详情 → Copy fix prompt |
|
|
@@ -35,7 +35,7 @@ export default defineExperiment({
|
|
|
35
35
|
npx niceeval exp compare-models # 把同组各 model 并排出报告
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
这样每个配置独立成文件:可命名、可 diff、可单独 review,"这一组就是对照"
|
|
38
|
+
这样每个配置独立成文件:可命名、可 diff、可单独 review,"这一组就是对照"在文件结构上就讲清楚了。默认 `niceeval show` / `view` 也沿用这条边界:只把同一文件夹下的 experiment 放进同一张成本 × 端到端成功率图和实验表,不同文件夹分别显示。
|
|
39
39
|
|
|
40
40
|
某一格结果反常、需要单独复现时,用该配置的完整 id(`组/文件名`)精确只跑这一格,不用先跑完整组:
|
|
41
41
|
|
|
@@ -50,8 +50,8 @@ npx niceeval exp compare-models/gpt-5.4
|
|
|
50
50
|
- 不同 Adapters。
|
|
51
51
|
- 不同模型(Tier 1 接入即可:应用接口暴露模型选择,`model` 经 `ctx.model` 透传)。
|
|
52
52
|
- 不同 prompts 或 feature flags(要求 Tier 3 接入:变体在应用内部,需要应用把它暴露成 experiment 可选的 flag,经 `flags` → `ctx.flags` 透传)。
|
|
53
|
-
- 不同 sandbox
|
|
54
|
-
- 不同运行环境条件(比如装不装某个记忆工具的二进制、有没有预置状态):环境差异写在 `sandbox` spec 的 `.setup()` / `.teardown()` 钩子里,一个变体一个 experiment 文件,见 [
|
|
53
|
+
- 不同 sandbox provider。
|
|
54
|
+
- 不同运行环境条件(比如装不装某个记忆工具的二进制、有没有预置状态):环境差异写在 `sandbox` spec 的 `.setup()` / `.teardown()` 钩子里,一个变体一个 experiment 文件,见 [沙箱 provider · 环境钩子](/zh/guides/sandbox-providers#环境钩子)。
|
|
55
55
|
- 同一任务的 pass@N。
|
|
56
56
|
|
|
57
57
|
Tier 1 / Tier 2 / Tier 3 的定义见 [Tier](/zh/concepts/tier)。
|
|
@@ -67,6 +67,13 @@ api-validation claude-code pass@3 = 1/3 (33%) mean 41s
|
|
|
67
67
|
|
|
68
68
|
除了 pass rate,还应该看平均耗时、token、成本和失败类型。
|
|
69
69
|
|
|
70
|
+
```bash
|
|
71
|
+
npx niceeval show --experiment compare-models
|
|
72
|
+
npx niceeval view
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`show --experiment` 按路径段匹配 id 前缀,所以组名会选中组内所有配置,但不会误中名字只是在字符串上相似的另一个组。`view` 默认加载完整结果,直接在页面里选组;`--experiment` 对它只是可选的启动时收窄。
|
|
76
|
+
|
|
70
77
|
## 设计 experiment 的建议
|
|
71
78
|
|
|
72
79
|
- 保持 eval 集合稳定,避免比较时混入新变量。
|
|
@@ -117,8 +117,10 @@ t.check(result.stdout.trim(), includes(/ok/));
|
|
|
117
117
|
也可以运行项目自己的 test/lint/build 脚本:
|
|
118
118
|
|
|
119
119
|
```ts
|
|
120
|
+
import { commandSucceeded } from "niceeval/expect";
|
|
121
|
+
|
|
120
122
|
const result = await t.sandbox.runCommand("npm", ["test"]);
|
|
121
|
-
t.check(result
|
|
123
|
+
t.check(result, commandSucceeded());
|
|
122
124
|
```
|
|
123
125
|
|
|
124
126
|
## 用 experiment 做对照组
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "官方适配器一览"
|
|
3
3
|
sidebarTitle: "官方适配器"
|
|
4
|
-
description: "NiceEval 内置的 Sandbox 和非 Sandbox 适配器分别是什么、怎么鉴权,Sandbox 型里怎么装 MCP server、Skill
|
|
4
|
+
description: "NiceEval 内置的 Sandbox 和非 Sandbox 适配器分别是什么、怎么鉴权,Sandbox 型里怎么装 MCP server、Skill、插件,怎么使用 Agent 官方配置文件。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
[NiceEval](https://niceeval.com/) 随包带几个官方 Adapter(`niceeval/adapter` 导出的工厂函数),按被测对象要不要隔离工作区分两类:**Sandbox 型**(`claude-code` / `codex` / `bub`)在 Docker 或云端沙箱里跑 coding-agent CLI,能装 MCP server、Skill、Python 插件;**非 Sandbox 型**无侵入连一个已经在跑的 HTTP 服务,或者帮你手写 adapter 时省掉事件流映射。这篇按类型和具体 Adapter 分节,重点是每个 Adapter 的配置项——怎么选、怎么跑通第一条 eval,见[接入你的 Agent](/zh/guides/connect-your-agent)。
|
|
@@ -10,14 +10,26 @@ description: "NiceEval 内置的 Sandbox 和非 Sandbox 适配器分别是什么
|
|
|
10
10
|
|
|
11
11
|
三个内置 Sandbox agent 都用 `defineSandboxAgent` 构造,鉴权走环境变量(可用工厂参数覆盖),并且都支持在沙箱 `setup` 阶段装扩展。怎么运行内置 Sandbox agent、目录结构和自定义 Sandbox adapter,见 [Sandbox Agent](/zh/guides/sandbox-agent);这里只讲每个 Adapter 能装什么、配置项怎么写。
|
|
12
12
|
|
|
13
|
+
本页的 `settingsFile` / `configFile` 都相对 NiceEval 项目根解析。项目根是执行 `niceeval` 时的当前工作目录,也就是包含 `niceeval.config.ts` 的目录,不是 Eval 或 Experiment 文件所在目录。例如 Experiment 在 `experiments/web/no-search.ts`、配置在 `configs/codex/no-web.toml` 时,仍写 `configFile: "configs/codex/no-web.toml"`。
|
|
14
|
+
|
|
13
15
|
### claude-code
|
|
14
16
|
|
|
15
17
|
- **鉴权**:`ANTHROPIC_API_KEY`(工厂参数 `apiKey` 可覆盖),可选 `ANTHROPIC_BASE_URL`(工厂参数 `baseUrl`)。
|
|
16
18
|
- **装 MCP server**:`mcpServers` 配置项,`setup` 阶段写进沙箱里用户级的 `~/.claude.json`(顶层 `mcpServers` 字段)。
|
|
17
|
-
- **装 Skill**:`skills: SkillSpec[]`——本地 Skill(`{ kind: "local", path }`,从项目根读文件或目录)或 Repo Skill(`{ kind: "repo", source, ref, skills }`,可钉 commit/tag、可只启用多 Skill 仓库里的一部分)。装进沙箱的 project 级 `.claude/skills/<name>/`,claude CLI 原生发现(原生 `Skill`
|
|
19
|
+
- **装 Skill**:`skills: SkillSpec[]`——本地 Skill(`{ kind: "local", path }`,从项目根读文件或目录)或 Repo Skill(`{ kind: "repo", source, ref, skills }`,可钉 commit/tag、可只启用多 Skill 仓库里的一部分)。装进沙箱的 project 级 `.claude/skills/<name>/`,claude CLI 原生发现(原生 `Skill` 工具调用被 adapter 归一为 `skill.loaded` 事件,不重复记成工具调用;用 `t.loadedSkill()` 断言,不是 `t.calledTool("Skill", ...)`)。
|
|
18
20
|
- **装原生 Plugin**:`plugins: ClaudeCodePluginSpec[]`,每一项声明 Marketplace 连接(`name` / `source` / 可选 `ref`)和其中的 Plugin 名。这个类型只属于 claude-code,传不进 codex。
|
|
21
|
+
- **官方配置文件**:`settingsFile` 是运行 NiceEval 的机器上的本地项目路径,不是 Sandbox 内路径;它指向一份完整的 Claude Code `settings.json`。路径相对项目根,只允许普通相对路径或 `./` 前缀;`..`、绝对路径、`~` 和解析后逃出项目根的符号链接都会报错。Adapter 从本地读取后上传文件,原样替换 Sandbox 中原本为空的用户级 `~/.claude/settings.json`;不继承宿主机配置,也不 deep merge 或重新序列化。`model` 和 `env` 归 Experiment 和 Adapter 管,出现在文件里会在 `setup` 阶段报错并点名冲突键。Secret 走环境变量,别写进配置文件。
|
|
19
22
|
- **tracing**:claude CLI 的 beta 原生遥测(`CLAUDE_CODE_ENHANCED_TELEMETRY_BETA`),span 只有结构和计时,细节见 [OTel 接入](/zh/guides/connect-otel)。
|
|
20
23
|
|
|
24
|
+
例如,用 `configs/claude-code/no-web.json` 关闭内置联网检索:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
29
|
+
"permissions": { "deny": ["WebSearch", "WebFetch"] }
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
21
33
|
```ts
|
|
22
34
|
import { defineExperiment } from "niceeval";
|
|
23
35
|
import { claudeCodeAgent } from "niceeval/adapter";
|
|
@@ -38,6 +50,7 @@ export default defineExperiment({
|
|
|
38
50
|
name: "safe-shell",
|
|
39
51
|
},
|
|
40
52
|
],
|
|
53
|
+
settingsFile: "configs/claude-code/no-web.json",
|
|
41
54
|
}),
|
|
42
55
|
model: "claude-sonnet-4-6",
|
|
43
56
|
sandbox: dockerSandbox(),
|
|
@@ -55,8 +68,16 @@ export default defineExperiment({
|
|
|
55
68
|
|
|
56
69
|
- **装 Skill**:`skills: SkillSpec[]`,与 claude-code 同一个类型。装进 `.agents/skills/<name>/`,并把发现指引写进 AGENTS.md——codex 没有 claude-code 那种原生 Skill 工具,只把文件装进去它不会主动去读;断言"用没用到"看它是否真的执行过读那个文件的 shell 命令,没有工具调用可以直接认。
|
|
57
70
|
- **装原生 Plugin**:`plugins: CodexPluginSpec[]`,声明 Marketplace 连接(`name` / `source` / 可选 `ref`)和其中的 Plugin 名。这个类型只属于 codex,传不进 claude-code。
|
|
71
|
+
- **官方配置文件**:`configFile` 是运行 NiceEval 的机器上的本地项目路径,不是 Sandbox 内路径;它指向一份完整的 Codex `config.toml`。路径相对项目根,只允许普通相对路径或 `./` 前缀;`..`、绝对路径、`~` 和解析后逃出项目根的符号链接都会报错。Adapter 从本地读取后上传文件,原样替换 Sandbox 中原本为空的用户级 `~/.codex/config.toml`;不继承宿主机配置,也不拼接、deep merge 或解析后重写。`model`、`model_provider`、`model_providers`、`model_reasoning_effort`、`mcp_servers`、`otel` 归 Experiment 和 Adapter 管,出现在文件里会在 `setup` 阶段报错并点名冲突键。Secret 走环境变量,别写进配置文件。
|
|
58
72
|
- **tracing**:内置,通过 `config.toml` 的 `[otel.trace_exporter.otlp-http]` 段配置,协议 `http/json`。
|
|
59
73
|
|
|
74
|
+
例如,用 `configs/codex/no-web.toml` 关闭内置联网检索:
|
|
75
|
+
|
|
76
|
+
```toml
|
|
77
|
+
#:schema https://developers.openai.com/codex/config-schema.json
|
|
78
|
+
web_search = "disabled"
|
|
79
|
+
```
|
|
80
|
+
|
|
60
81
|
```ts
|
|
61
82
|
import { defineExperiment } from "niceeval";
|
|
62
83
|
import { codexAgent } from "niceeval/adapter";
|
|
@@ -74,6 +95,7 @@ export default defineExperiment({
|
|
|
74
95
|
name: "repo-map",
|
|
75
96
|
},
|
|
76
97
|
],
|
|
98
|
+
configFile: "configs/codex/no-web.toml",
|
|
77
99
|
}),
|
|
78
100
|
model: "gpt-5.4",
|
|
79
101
|
sandbox: dockerSandbox(),
|
|
@@ -85,6 +107,7 @@ export default defineExperiment({
|
|
|
85
107
|
- **鉴权**:`BUB_API_KEY` + `BUB_API_BASE`(OpenAI 兼容代理),工厂参数 `apiKey` / `apiBase` 可覆盖。
|
|
86
108
|
- **装 Skill**:`skills: SkillSpec[]`,与另外两个 Adapter 同一个类型。装进 `.agents/skills/<name>/`,发现指引写进 AGENTS.md。
|
|
87
109
|
- **装插件**:`pythonPlugins: PythonPluginSpec[]`(`{ package }`:PyPI 包、版本约束或 git URL),`setup` 阶段进 `uv tool install … --with <package>`。这个类型只属于 bub;package 集合进安装 checkpoint key,插件不同的两个变体不会复用同一份安装缓存。
|
|
110
|
+
- **预制 Bub**:NiceEval 的 E2B 配方会把 Bub、OTel 插件和 Python 插件集合算成安装指纹。Adapter 只复用指纹完全一致的环境;仅在 PATH 里放一个 `bub` 不足以证明兼容。构建入口见 [沙箱 provider · 从官方基线继续构建以提速](/zh/guides/sandbox-providers#从官方基线继续构建以提速)。
|
|
88
111
|
- bub 没有 `mcpServers`——MCP 只属于支持它的 Adapter,Config 上压根没有这个字段。
|
|
89
112
|
- **安装方式**:走 `uv tool install`(PyPI 包,不是 npm 包),首次安装会建 checkpoint 缓存加速后续沙箱。
|
|
90
113
|
- **tracing**:内置,通过环境变量注入,协议 `http/protobuf`。
|
|
@@ -112,11 +135,12 @@ export default defineExperiment({
|
|
|
112
135
|
| MCP server | ✅ `mcpServers` | ✅ `mcpServers` | ❌ |
|
|
113
136
|
| Skill | ✅ `skills: SkillSpec[]`(原生发现) | ✅ `skills: SkillSpec[]`(+ 发现指引) | ✅ `skills: SkillSpec[]`(+ 发现指引) |
|
|
114
137
|
| 原生 Plugin | ✅ `plugins: ClaudeCodePluginSpec[]` | ✅ `plugins: CodexPluginSpec[]` | ❌ |
|
|
138
|
+
| 官方配置文件 | ✅ `settingsFile`(完整 settings.json) | ✅ `configFile`(完整 config.toml) | ❌ |
|
|
115
139
|
| Python Plugin | ❌ | ❌ | ✅ `pythonPlugins: PythonPluginSpec[]` |
|
|
116
140
|
| tracing | ✅(beta,仅结构与计时) | ✅ | ✅ |
|
|
117
141
|
| 安装方式 | npm 全局包 | npm 全局包 | `uv tool install`(PyPI) |
|
|
118
142
|
|
|
119
|
-
装了什么有据可查:Adapter 在 `setup` 收尾把安装清单写进沙箱的 `__niceeval__/agent-setup.json`,运行器把它存成 Attempt Artifact `agent-setup.json`(库里读 `attempt.agentSetup()`)。清单只记来源、ref、Skill/Plugin
|
|
143
|
+
装了什么有据可查:Adapter 在 `setup` 收尾把安装清单写进沙箱的 `__niceeval__/agent-setup.json`,运行器把它存成 Attempt Artifact `agent-setup.json`(库里读 `attempt.agentSetup()`)。清单只记来源、ref、Skill/Plugin 名、解析出的版本,以及官方配置文件的项目相对路径和 SHA-256;不保存配置正文、API Key 或环境变量值。
|
|
120
144
|
|
|
121
145
|
## 非 Sandbox 适配器
|
|
122
146
|
|
|
@@ -1,36 +1,50 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "通过 CI 发布报告"
|
|
3
3
|
sidebarTitle: "CI 发布报告"
|
|
4
|
-
description: "
|
|
4
|
+
description: "把经过 copySnapshots 大小预检的结果目录提交进仓库,CI 用一行 view --run 导出报告站;超大文件在 commit 前就会得到可执行错误。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
`niceeval view --out <目录>` 把查看器导出成一个纯静态目录:报告、结果快照列表、transcript、trace 瀑布,和本地 `niceeval view` 看到的完全一样(导出行为见[查看结果 · 导出与静态托管](/zh/guides/viewing-results#导出与静态托管))。CI
|
|
7
|
+
`niceeval view --out <目录>` 把查看器导出成一个纯静态目录:报告、结果快照列表、transcript、trace 瀑布,和本地 `niceeval view` 看到的完全一样(导出行为见[查看结果 · 导出与静态托管](/zh/guides/viewing-results#导出与静态托管))。CI 发布只需要让结果数据到构建机手里,但不要直接提交本地事实根 `.niceeval/`:逐字符串截断能防一条失控输出膨胀,不能保证整个文件小于 Git host 的限制。先用 `copySnapshots` 生成经过 50 MiB 单文件预检的发布结果根,再提交这个目录。
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 生成可提交的结果目录
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
新建 `scripts/publish-results.ts`(项目里 eval 和配置本来就是 TypeScript,脚本也用 `.ts`,由 `tsx` 直接运行):
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
import { rm } from "node:fs/promises";
|
|
15
|
+
import { copySnapshots, openResults } from "niceeval/results";
|
|
16
|
+
|
|
17
|
+
const output = "report-data";
|
|
18
|
+
const results = await openResults(".niceeval");
|
|
19
|
+
|
|
20
|
+
await rm(output, { recursive: true, force: true });
|
|
21
|
+
await copySnapshots(results.latest(), output, {
|
|
22
|
+
artifacts: ["sources", "events", "trace", "o11y", "agentSetup"],
|
|
23
|
+
redact: (text) => text.replaceAll(/sk-[A-Za-z0-9]+/g, "[redacted]"),
|
|
24
|
+
});
|
|
15
25
|
```
|
|
16
26
|
|
|
27
|
+
`redact` 是必填项:给一个函数改写待发布文件里的自由文本,或者确认这批数据可以原文公开、显式传 `redact: false`。要发布的站点谁都能翻到 prompt 和工具输出,这个选择必须写在脚本里。
|
|
28
|
+
|
|
29
|
+
运行 `npx tsx scripts/publish-results.ts`,然后提交 `report-data/`。`copySnapshots` 在创建目录前检查所有待发布文件;任何文件超过 50 MiB 时整体失败并列出路径、大小和处理建议,不会留下半份目录。`diff` 缺省不发布;需要 diff 时显式加进 `artifacts`,它也受同一个预算约束。历史版本留下的超大 events / trace 不会被悄悄改写,预检会要求你排除这类证据或用当前版本重跑。
|
|
30
|
+
|
|
17
31
|
## 构建命令就是导出命令
|
|
18
32
|
|
|
19
33
|
```bash
|
|
20
|
-
npx niceeval view --out site
|
|
34
|
+
npx niceeval view --run report-data --out site
|
|
21
35
|
```
|
|
22
36
|
|
|
23
|
-
`view`
|
|
37
|
+
`view` 对零可读结果直接报错、非零退出,不会导出一张空报告——`report-data/` checkout 坏掉,或所有落盘与当前 niceeval 的 schemaVersion 不兼容被整批跳过时,构建失败,Vercel / GitHub Pages 保留上一次部署。错误逐条列出被跳过的快照目录与原因,schemaVersion 场景还给出能直接查看旧落盘的 `npx niceeval@<版本> view` 命令。
|
|
24
38
|
|
|
25
39
|
## 发布自定义报告
|
|
26
40
|
|
|
27
41
|
不传 `--report` 时,发布出来的首页是默认报告。想让首页换成自己的报告,把 [`defineReport` 报告文件](/zh/guides/custom-reports)传给 `--report` 就行——attempt 证据页(transcript、trace、代码视图)仍在同一个站里,报告里的每个数字点进去就是对应证据,和本地 `view --report` 看到的一模一样:
|
|
28
42
|
|
|
29
43
|
```bash
|
|
30
|
-
npx niceeval view --report reports/exam.tsx --out site
|
|
44
|
+
npx niceeval view --run report-data --report reports/exam.tsx --out site
|
|
31
45
|
```
|
|
32
46
|
|
|
33
|
-
报告文件和
|
|
47
|
+
报告文件和 `report-data/` 一样提交在仓库里,改完版面 push,线上就跟着更新。用下面的 `vercel.json` / workflow 时,把构建命令换成这一行即可,其余配置不用动。
|
|
34
48
|
|
|
35
49
|
## 接托管平台
|
|
36
50
|
|
|
@@ -39,7 +53,7 @@ npx niceeval view --report reports/exam.tsx --out site
|
|
|
39
53
|
```json
|
|
40
54
|
{
|
|
41
55
|
"installCommand": "pnpm install --frozen-lockfile",
|
|
42
|
-
"buildCommand": "npx niceeval view --out site",
|
|
56
|
+
"buildCommand": "npx niceeval view --run report-data --out site",
|
|
43
57
|
"outputDirectory": "site"
|
|
44
58
|
}
|
|
45
59
|
```
|
|
@@ -69,7 +83,7 @@ jobs:
|
|
|
69
83
|
node-version: 22
|
|
70
84
|
cache: pnpm
|
|
71
85
|
- run: pnpm install --frozen-lockfile
|
|
72
|
-
- run: npx niceeval view --out site
|
|
86
|
+
- run: npx niceeval view --run report-data --out site
|
|
73
87
|
- uses: actions/upload-pages-artifact@v3
|
|
74
88
|
with:
|
|
75
89
|
path: site
|
|
@@ -84,8 +98,8 @@ jobs:
|
|
|
84
98
|
uses: actions/deploy-pages@v4
|
|
85
99
|
```
|
|
86
100
|
|
|
87
|
-
|
|
101
|
+
日常循环是:本地跑 eval,运行 `npx tsx scripts/publish-results.ts`,提交更新后的 `report-data/` 并 push。发布目录只保留每个实验的最新结果快照;要发布其它选择策略,在脚本里替换 `results.latest()`。本地 `.niceeval/` 可以保留完整历史和 diff,不需要为了 Git 限制削掉调试证据。
|
|
88
102
|
|
|
89
|
-
##
|
|
103
|
+
## 发布的是选中的证据
|
|
90
104
|
|
|
91
|
-
|
|
105
|
+
整站导出会带上发布结果根里选中的 transcript、源码快照和 trace。新写入的超大 events / trace 字符串可能带结构化截断标记。`copySnapshots` 只在你给了消毒函数时改写自由文本(`redact` 是必填项,见上),其余只做选择和整文件大小预检;传 `redact: false` 的目录再导出时还要加 `--allow-sensitive-artifacts` 确认一次。发布到公网前确认结果里没有密钥或敏感数据。
|