niceeval 0.6.1 → 0.7.0
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 +23 -23
- package/README.zh.md +6 -6
- package/dist/agents/types.d.ts +69 -7
- package/dist/context/types.d.ts +32 -12
- package/dist/i18n/en.d.ts +54 -0
- package/dist/i18n/zh-CN.d.ts +57 -3
- package/dist/o11y/types.d.ts +16 -2
- package/dist/report/aggregate.d.ts +32 -24
- package/dist/report/aggregate.js +158 -50
- package/dist/report/built-in/index.d.ts +2 -0
- package/dist/report/built-in/index.js +8 -0
- package/dist/report/components.d.ts +93 -160
- package/dist/report/components.js +377 -114
- package/dist/report/compute.d.ts +87 -81
- package/dist/report/compute.js +597 -417
- package/dist/report/flag.d.ts +32 -6
- package/dist/report/flag.js +92 -4
- package/dist/report/format.d.ts +19 -11
- package/dist/report/format.js +30 -13
- package/dist/report/index.d.ts +16 -16
- package/dist/report/index.js +20 -21
- package/dist/report/load.js +3 -2
- package/dist/report/locale.d.ts +57 -33
- package/dist/report/locale.js +122 -56
- package/dist/report/metrics.d.ts +23 -4
- package/dist/report/metrics.js +110 -25
- package/dist/report/primitives.d.ts +48 -15
- package/dist/report/primitives.js +135 -26
- package/dist/report/react/AttemptList.d.ts +9 -7
- package/dist/report/react/AttemptList.js +17 -10
- package/dist/report/react/DeltaTable.js +19 -18
- package/dist/report/react/EvalList.d.ts +4 -4
- package/dist/report/react/EvalList.js +0 -0
- package/dist/report/react/ExperimentComparison.d.ts +10 -0
- package/dist/report/react/ExperimentComparison.js +12 -0
- package/dist/report/react/ExperimentList.d.ts +4 -3
- package/dist/report/react/ExperimentList.js +17 -18
- package/dist/report/react/MetricBars.js +5 -4
- package/dist/report/react/MetricLine.js +12 -5
- package/dist/report/react/MetricMatrix.js +1 -1
- package/dist/report/react/MetricScatter.js +59 -28
- package/dist/report/react/MetricTable.js +2 -12
- package/dist/report/react/ScopeSummary.d.ts +10 -0
- package/dist/report/react/ScopeSummary.js +17 -0
- package/dist/report/react/Scoreboard.js +6 -6
- package/dist/report/react/cell.js +2 -2
- 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 +5 -9
- package/dist/report/react/fixtures.js +110 -147
- package/dist/report/react/index.d.ts +15 -5
- package/dist/report/react/index.js +18 -7
- package/dist/report/report.d.ts +137 -16
- package/dist/report/report.js +259 -28
- package/dist/report/text/faces.d.ts +17 -19
- package/dist/report/text/faces.js +253 -184
- package/dist/report/text/plot.js +1 -1
- package/dist/report/text/table.js +38 -7
- package/dist/report/tree.d.ts +90 -40
- package/dist/report/tree.js +252 -94
- package/dist/report/types.d.ts +247 -284
- package/dist/report/types.js +4 -3
- package/dist/report/web.d.ts +21 -5
- package/dist/report/web.js +42 -16
- package/dist/results/select.d.ts +38 -16
- package/dist/results/select.js +73 -25
- package/dist/results/types.d.ts +49 -14
- 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 +4 -2
- package/dist/shared/aggregate.js +8 -7
- 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/README.md +44 -0
- package/docs-site/zh/examples/ai-agent-application.mdx +63 -0
- package/docs-site/zh/examples/coding-agent-extensions.mdx +57 -0
- package/docs-site/zh/examples/index.mdx +50 -0
- package/docs-site/zh/{concepts → explanation}/adapter.mdx +31 -13
- package/docs-site/zh/{concepts → explanation}/assert.mdx +7 -7
- package/docs-site/zh/{concepts → explanation}/drive.mdx +8 -8
- package/docs-site/zh/{concepts → explanation}/evals.mdx +4 -4
- package/docs-site/zh/{concepts → explanation}/experiment.mdx +8 -8
- package/docs-site/zh/{concepts → explanation}/hitl.mdx +8 -8
- package/docs-site/zh/{concepts → explanation}/judge.mdx +5 -5
- package/docs-site/zh/{concepts → explanation}/overview.mdx +11 -11
- package/docs-site/zh/{guides → explanation}/runner.mdx +18 -8
- package/docs-site/zh/{concepts → explanation}/tier.mdx +6 -6
- package/docs-site/zh/{guides → how-to}/agent-feedback-loop.mdx +35 -33
- package/docs-site/zh/{guides → how-to}/authoring.mdx +35 -2
- package/docs-site/zh/{guides → how-to}/ci-integration.mdx +23 -12
- package/docs-site/zh/{guides → how-to}/connect-otel.mdx +6 -6
- package/docs-site/zh/{guides → how-to}/connect-your-agent.mdx +47 -21
- package/docs-site/zh/{guides → how-to}/custom-reports.mdx +34 -39
- package/docs-site/zh/{guides → how-to}/dataset-fanout.mdx +25 -3
- package/docs-site/zh/{guides → how-to}/experiments.mdx +12 -5
- package/docs-site/zh/how-to/publish-report.mdx +105 -0
- package/docs-site/zh/{guides → how-to}/reporters.mdx +2 -2
- package/docs-site/zh/{guides → how-to}/sandbox-agent.mdx +56 -7
- package/docs-site/zh/how-to/sandbox-providers.mdx +350 -0
- package/docs-site/zh/{guides → how-to}/scoring-guide.mdx +4 -4
- package/docs-site/zh/{guides → how-to}/viewing-results.mdx +82 -39
- package/docs-site/zh/{guides → how-to}/write-experiment.mdx +6 -4
- package/docs-site/zh/{guides → how-to}/write-send.mdx +30 -14
- package/docs-site/zh/index.mdx +24 -26
- package/docs-site/zh/introduction.mdx +8 -8
- package/docs-site/zh/reference/builtin-agents.mdx +32 -5
- package/docs-site/zh/reference/capabilities.mdx +8 -8
- package/docs-site/zh/reference/cli.mdx +40 -12
- package/docs-site/zh/reference/define-agent.mdx +58 -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 +3 -3
- package/docs-site/zh/reference/expect.mdx +26 -1
- package/docs-site/zh/{guides → reference}/official-adapters.mdx +32 -8
- package/docs-site/zh/{guides → reference}/report-components.mdx +45 -33
- package/docs-site/zh/{guides → reference}/results-data.mdx +21 -13
- package/docs-site/zh/troubleshooting/debug-sandbox.mdx +57 -0
- package/docs-site/zh/troubleshooting/debugging.mdx +212 -0
- package/docs-site/zh/{quickstart.mdx → tutorials/quickstart.mdx} +5 -17
- package/package.json +10 -2
- 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 +13 -2
- 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/openai-compat.ts +1 -1
- 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/streaming.ts +2 -2
- package/src/agents/types.ts +71 -8
- package/src/agents/ui-message-stream.test.ts +3 -0
- package/src/cli.ts +446 -124
- package/src/context/context.test.ts +51 -12
- package/src/context/context.ts +162 -30
- package/src/context/session.test.ts +2 -1
- package/src/context/session.ts +115 -7
- 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 +81 -17
- package/src/i18n/zh-CN.ts +80 -17
- 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 +178 -61
- package/src/report/built-in/index.tsx +9 -0
- package/src/report/components.tsx +625 -279
- package/src/report/compute.ts +723 -491
- package/src/report/dual-render.test.tsx +741 -1024
- package/src/report/flag.ts +104 -12
- package/src/report/format.ts +32 -12
- package/src/report/index.ts +119 -46
- package/src/report/load.ts +3 -2
- package/src/report/locale.ts +136 -65
- package/src/report/metrics.ts +108 -25
- package/src/report/primitives.tsx +196 -45
- package/src/report/react/AttemptList.tsx +30 -43
- package/src/report/react/DeltaTable.tsx +63 -45
- package/src/report/react/EvalList.tsx +0 -0
- package/src/report/react/ExperimentComparison.tsx +73 -0
- package/src/report/react/ExperimentList.tsx +50 -32
- package/src/report/react/MetricBars.tsx +5 -4
- package/src/report/react/MetricLine.tsx +13 -8
- package/src/report/react/MetricMatrix.tsx +2 -2
- package/src/report/react/MetricScatter.tsx +86 -34
- package/src/report/react/MetricTable.tsx +4 -76
- package/src/report/react/ScopeSummary.tsx +86 -0
- package/src/report/react/Scoreboard.tsx +28 -10
- package/src/report/react/cell.tsx +2 -2
- 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 +89 -5
- package/src/report/react/fixtures.ts +114 -154
- package/src/report/react/index.tsx +24 -39
- package/src/report/react/render.test.tsx +138 -158
- package/src/report/react/styles.css +243 -82
- package/src/report/report.test.ts +779 -841
- package/src/report/report.ts +423 -41
- package/src/report/text/faces.ts +290 -193
- package/src/report/text/plot.ts +1 -1
- package/src/report/text/table.ts +44 -7
- package/src/report/tree.ts +362 -104
- package/src/report/types.ts +261 -271
- package/src/report/web.ts +63 -20
- package/src/results/annotated-source.test.ts +62 -9
- package/src/results/annotated-source.ts +64 -6
- package/src/results/attempt-evidence.test.ts +13 -11
- package/src/results/attempt-evidence.ts +20 -13
- package/src/results/attempt-source.ts +6 -3
- package/src/results/copy.ts +150 -60
- package/src/results/host-equivalence.test.ts +34 -20
- package/src/results/index.ts +12 -4
- package/src/results/locator.test.ts +1 -22
- package/src/results/open.ts +15 -5
- package/src/results/publish.ts +149 -0
- package/src/results/results.test.ts +89 -54
- package/src/results/select.ts +104 -34
- package/src/results/truncate.ts +90 -0
- package/src/results/types.ts +43 -14
- 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 +243 -37
- 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 +8 -6
- package/src/shared/types.ts +31 -0
- package/src/show/compose.ts +50 -67
- package/src/show/index.ts +127 -56
- package/src/show/render.ts +662 -131
- package/src/show/report-host.test.ts +188 -0
- package/src/show/report-host.ts +375 -0
- package/src/show/show.test.ts +320 -54
- package/src/tty-line.ts +8 -26
- package/src/util.test.ts +1 -0
- package/src/util.ts +41 -0
- package/src/view/app/App.test.tsx +69 -0
- package/src/view/app/App.tsx +144 -48
- package/src/view/app/components/AttemptModal.tsx +423 -11
- package/src/view/app/components/CodeView.tsx +41 -14
- package/src/view/app/components/CopyControls.tsx +2 -2
- package/src/view/app/i18n.ts +37 -17
- package/src/view/app/lib/attempt-route.test.ts +1 -0
- package/src/view/app/lib/verdict.ts +7 -9
- package/src/view/app/main.tsx +13 -8
- package/src/view/app/pages/{RunsPage.tsx → AttemptsPage.tsx} +6 -6
- package/src/view/app/types.ts +4 -1
- 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 +10 -3
- package/src/view/data.ts +155 -49
- package/src/view/index.ts +56 -41
- package/src/view/server.ts +37 -15
- package/src/view/shared/types.ts +34 -5
- package/src/view/styles.css +227 -0
- package/src/view/view-report.test.ts +167 -62
- package/dist/report/built-ins/experiment-comparison.d.ts +0 -1
- package/dist/report/built-ins/experiment-comparison.js +0 -13
- package/dist/report/built-ins/index.d.ts +0 -1
- package/dist/report/built-ins/index.js +0 -2
- package/dist/report/react/GroupSummary.d.ts +0 -8
- package/dist/report/react/GroupSummary.js +0 -8
- package/dist/report/react/RunOverview.d.ts +0 -8
- package/dist/report/react/RunOverview.js +0 -12
- package/docs-site/zh/example/ai-agent-application.mdx +0 -152
- package/docs-site/zh/example/claude-code-codex-plugin.mdx +0 -167
- package/docs-site/zh/example/claude-code-codex-skill.mdx +0 -152
- package/docs-site/zh/example/showcase.mdx +0 -39
- package/docs-site/zh/guides/publish-report.mdx +0 -91
- package/docs-site/zh/guides/sandbox-providers.mdx +0 -102
- package/src/report/built-in-user-parity.test.tsx +0 -640
- package/src/report/built-ins/experiment-comparison.tsx +0 -19
- package/src/report/built-ins/index.ts +0 -2
- package/src/report/react/GroupSummary.tsx +0 -66
- package/src/report/react/RunOverview.tsx +0 -109
- 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
- /package/docs-site/zh/{example/tier1-ai-sdk-v7.mdx → examples/integrations/ai-sdk-v7.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-claude-sdk.mdx → examples/integrations/claude-sdk.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-codex-sdk.mdx → examples/integrations/codex-sdk.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-langgraph.mdx → examples/integrations/langgraph.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-pi-sdk.mdx → examples/integrations/pi-sdk.mdx} +0 -0
- /package/docs-site/zh/{guides → how-to}/fixtures.mdx +0 -0
|
@@ -112,6 +112,19 @@ plugins?: ClaudeCodePluginSpec[];
|
|
|
112
112
|
|
|
113
113
|
Claude Code 原生 Plugin(先连 Marketplace,再从中装指定 Plugin)。
|
|
114
114
|
|
|
115
|
+
#### `settingsFile`
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
settingsFile?: string;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
一份完整的 Claude Code `settings.json`(官方格式)在本地项目里的路径 —— 相对运行
|
|
122
|
+
niceeval 的项目根(含 `niceeval.config.ts` 的目录)解析,不是 Sandbox 内路径;只接受
|
|
123
|
+
项目根内的相对路径,包含 `..` 的路径、绝对路径、`~` 路径和解析后逃出项目根的符号链接
|
|
124
|
+
都在 setup 阶段报错。原始字节原样上传为沙箱里原本为空的用户级 `~/.claude/settings.json`
|
|
125
|
+
(不继承宿主机配置、不拼接、不重新序列化);保留键 `model` 与 `env` 出现在文件里
|
|
126
|
+
setup 报错。manifest 只记项目相对路径与字节 SHA-256,不落正文。
|
|
127
|
+
|
|
115
128
|
### `CodexConfig`
|
|
116
129
|
|
|
117
130
|
#### `apiKey`
|
|
@@ -157,6 +170,20 @@ plugins?: CodexPluginSpec[];
|
|
|
157
170
|
|
|
158
171
|
Codex 原生 Plugin(先连 Marketplace,再从中装指定 Plugin)。
|
|
159
172
|
|
|
173
|
+
#### `configFile`
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
configFile?: string;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
一份完整的 Codex `config.toml`(官方 TOML 格式)在本地项目里的路径 —— 相对运行
|
|
180
|
+
niceeval 的项目根(含 `niceeval.config.ts` 的目录)解析,不是 Sandbox 内路径;只接受
|
|
181
|
+
项目根内的相对路径,包含 `..` 的路径、绝对路径、`~` 路径和解析后逃出项目根的符号链接
|
|
182
|
+
都在 setup 阶段报错。原始字节原样并入沙箱里原本为空的用户级 `~/.codex/config.toml`
|
|
183
|
+
(不继承宿主机配置、不解析后重写);保留键 `model`、`model_provider`、`model_providers`、
|
|
184
|
+
`model_reasoning_effort`、`mcp_servers`、`otel` 出现在文件里 setup 报错。manifest 只记
|
|
185
|
+
项目相对路径与字节 SHA-256,不落正文。
|
|
186
|
+
|
|
160
187
|
### `BubConfig`
|
|
161
188
|
|
|
162
189
|
#### `apiKey`
|
|
@@ -215,7 +242,7 @@ export default uiMessageStreamAgent({
|
|
|
215
242
|
- **收发 + 事件流**:SSE 帧经 `ai` 包官方的框架无关 reducer `readUIMessageStream`(`useChat` 内部同款)归约,工具调用/结果/消息文本从消息 parts 直构——**不要求应用接 OTel**。
|
|
216
243
|
- **会话续接**:协议是服务端零状态、「客户端带全量历史」——工厂用 `ctx.session.history()` 存整份 `UIMessage[]`,每轮原样重放;新会话线(`t.newSession()` 之后)拿到的是空历史。
|
|
217
244
|
- **HITL**:AI SDK v7 tool approval(工具带 `needsApproval: true`)原生映射——part 停在 `approval-requested` 时该 Turn 的 `status: "waiting"` + `input.requested`;`t.respond("approve" / "deny")` 翻译成 `approval-responded` 原地改写该 part、原样重发 `messages` 触发服务端续跑(和真实前端 `addToolApprovalResponse()` + `sendMessage()` 的协议行为一致,没有单独的 approve 端点)。拒绝的调用以 `rejected` 落进事件流,且默认带「不要重试」的 reason(`denyReason` 可覆盖)——不带的话模型经常原样重发同一个调用。
|
|
218
|
-
- **usage / 瀑布图**:UI Message Stream 协议帧里没有 usage,所以 `t.maxTokens` 这类用量断言在这个内置件上默认没有数据(应用把 usage 放进 message metadata 属于应用自己的协议扩展)。瀑布图是另一回事:应用有 OTel 埋点(如官方 `@ai-sdk/otel`)时,按 [OTel 接入](/zh/
|
|
245
|
+
- **usage / 瀑布图**:UI Message Stream 协议帧里没有 usage,所以 `t.maxTokens` 这类用量断言在这个内置件上默认没有数据(应用把 usage 放进 message metadata 属于应用自己的协议扩展)。瀑布图是另一回事:应用有 OTel 埋点(如官方 `@ai-sdk/otel`)时,按 [OTel 接入](/zh/how-to/connect-otel)把 span 发给 [NiceEval](https://niceeval.com/),`niceeval view` 就有完整瀑布图——span 只进瀑布图,不喂断言。
|
|
219
246
|
|
|
220
247
|
需要在 eval 项目里安装 `ai`(可选 peer 依赖,协议 reducer 来自它)。完整可跑示例:[`examples/zh/tier1/ai-sdk-v7`](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/tier1/ai-sdk-v7)。
|
|
221
248
|
|
|
@@ -330,7 +357,7 @@ return driveFrameStream(frames, stream, ctx); // 逐帧喂 stream.add()
|
|
|
330
357
|
|
|
331
358
|
## 通用「拼装方式」件:`driveFrameStream` / `deltaStream` + `ctx.session`
|
|
332
359
|
|
|
333
|
-
一个手写 send 里真正互不相干的只有三段:transport(怎么发)、reduce(原始数据 → 事件,上一节的转换器管这个)、编排(会话续接 + HITL 暂停恢复)。第三段和任何具体协议无关,纯粹是控制流模式——会话续接(`id`/`capture`、`history`)和 HITL 停轮现场(`hold`/`take`)的存取器直接挂在 `ctx.session` 上(`AgentSession`,见 [Adapter 概念](/zh/
|
|
360
|
+
一个手写 send 里真正互不相干的只有三段:transport(怎么发)、reduce(原始数据 → 事件,上一节的转换器管这个)、编排(会话续接 + HITL 暂停恢复)。第三段和任何具体协议无关,纯粹是控制流模式——会话续接(`id`/`capture`、`history`)和 HITL 停轮现场(`hold`/`take`)的存取器直接挂在 `ctx.session` 上(`AgentSession`,见 [Adapter 概念](/zh/explanation/adapter#上下文:agentcontext)),不需要单独导入什么件、也不需要声明;剩下真正跨协议复用的只有两个官方件:
|
|
334
361
|
|
|
335
362
|
| 件 | 解决什么 |
|
|
336
363
|
|---|---|
|
|
@@ -387,7 +414,7 @@ export default defineAgent({
|
|
|
387
414
|
|
|
388
415
|
## 相关阅读
|
|
389
416
|
|
|
390
|
-
- [接入你的 agent](/zh/
|
|
391
|
-
- [Sandbox Agent](/zh/
|
|
417
|
+
- [接入你的 agent](/zh/how-to/connect-your-agent) — 自己写 adapter 时每个能力怎么做、对应什么断言。
|
|
418
|
+
- [Sandbox Agent](/zh/how-to/sandbox-agent) — 怎么运行内置 sandbox agent,以及怎么写自己的。
|
|
392
419
|
- [defineAgent 参考](/zh/reference/define-agent) — `defineAgent` / `defineSandboxAgent` 完整参数。
|
|
393
|
-
- [OTel 接入](/zh/
|
|
420
|
+
- [OTel 接入](/zh/how-to/connect-otel) — 把应用的 span 发给 [NiceEval](https://niceeval.com/),换 `niceeval view` 的调用瀑布图。
|
|
@@ -22,13 +22,13 @@ description: "NiceEval 怎么知道你的 adapter 做到了什么:没有声明
|
|
|
22
22
|
|
|
23
23
|
## 为什么没有声明这一层
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
NiceEval 不设 `capabilities: { conversation, toolObservability }` 这类布尔声明层来补"代码证明不了的部分",因为这类声明承诺的事情本身就不该由声明来担保:
|
|
26
26
|
|
|
27
27
|
- **构造即证明**:用了 `defineSandboxAgent`,说明被测对象在沙箱里改文件——不需要再声明一遍 `workspace: true`。
|
|
28
28
|
- **字段即证明**:写了 `tracing`(怎么把 OTLP 端点交给 CLI),tracing 就成立。字段本身就是使用凭证,不需要旁边再放一个布尔值重复一遍。
|
|
29
29
|
- **来源即证明**:`fromAiSdk(result)` 消费的 `result.steps` 是 AI SDK 契约保证的**全量**工具循环记录,返回值自带"事件流完整"的证明;内置 CLI 的 parser 同理。手工映射时,事件完不完整取决于你的映射代码写没写全——这不是一个可以靠声明担保的东西,声明了也不会让代码更完整。
|
|
30
30
|
- **行为即证明**:HITL 没有能力位——`send` 返回 `status: "waiting"` + `input.requested` 事件,行为本身可见。
|
|
31
|
-
-
|
|
31
|
+
- **接了就续得上**:会话续接没有"声明了才有"的开关。`ctx.session` 一直都在;用了 `id`/`capture` 或 `history` 存取器就会续接上下文,不用就每轮都是全新会话——两种都是正常状态,都不会报错,区别只在你的 adapter 实际怎么写。
|
|
32
32
|
|
|
33
33
|
```ts
|
|
34
34
|
export default defineAgent({
|
|
@@ -49,15 +49,15 @@ export default defineAgent({
|
|
|
49
49
|
|
|
50
50
|
### 工具/动作事件完整性
|
|
51
51
|
|
|
52
|
-
含义:这一轮的每次工具调用是否都以 `action.called` + `action.result` 出现在 events 里([事件流参考](/zh/reference/events))。来源只有两个:官方转换器按被测协议的契约保证;手工映射由你的代码决定。OTel span 不是来源——span 只进瀑布图,不进事件流(见 [OTel 接入](/zh/
|
|
52
|
+
含义:这一轮的每次工具调用是否都以 `action.called` + `action.result` 出现在 events 里([事件流参考](/zh/reference/events))。来源只有两个:官方转换器按被测协议的契约保证;手工映射由你的代码决定。OTel span 不是来源——span 只进瀑布图,不进事件流(见 [OTel 接入](/zh/how-to/connect-otel))。
|
|
53
53
|
|
|
54
54
|
### 会话续接
|
|
55
55
|
|
|
56
|
-
含义:用 `ctx.session.id` / `capture` 或 `ctx.session.history` 把请求连到同一个后端会话/累计历史上。有它,跨轮记忆断言、`t.newSession()` 隔离断言才有意义。两种实现写法见[写 send](/zh/
|
|
56
|
+
含义:用 `ctx.session.id` / `capture` 或 `ctx.session.history` 把请求连到同一个后端会话/累计历史上。有它,跨轮记忆断言、`t.newSession()` 隔离断言才有意义。两种实现写法见[写 send](/zh/how-to/write-send)。
|
|
57
57
|
|
|
58
58
|
### `tracing` —— 发 OTLP trace
|
|
59
59
|
|
|
60
|
-
runner 消费:运行时起一个本机 OTLP 接收器,把本轮 trace context 经 `ctx.telemetry.headers` 交给你;span 归一后在 `niceeval view` 画瀑布图——只画图,不喂断言。来源:CLI 型写 `tracing` 字段(env / configure 把端点交给被测进程);长驻应用在 `niceeval.config.ts` 配 `telemetry: { port }` 固定端口(见 [OTel 接入](/zh/
|
|
60
|
+
runner 消费:运行时起一个本机 OTLP 接收器,把本轮 trace context 经 `ctx.telemetry.headers` 交给你;span 归一后在 `niceeval view` 画瀑布图——只画图,不喂断言。来源:CLI 型写 `tracing` 字段(env / configure 把端点交给被测进程);长驻应用在 `niceeval.config.ts` 配 `telemetry: { port }` 固定端口(见 [OTel 接入](/zh/how-to/connect-otel))。
|
|
61
61
|
|
|
62
62
|
### `kind: "sandbox"` —— 沙箱与改文件
|
|
63
63
|
|
|
@@ -70,7 +70,7 @@ runner 消费:为每次 attempt 准备沙箱(Docker / Vercel / E2B),经
|
|
|
70
70
|
## 相关阅读
|
|
71
71
|
|
|
72
72
|
- [事件流参考](/zh/reference/events) —— 事件流承诺的具体内容。
|
|
73
|
-
- [Adapter 概念](/zh/
|
|
74
|
-
- [接入你的 agent](/zh/
|
|
75
|
-
- [OTel 接入](/zh/
|
|
73
|
+
- [Adapter 概念](/zh/explanation/adapter) —— `ctx`/`Turn` 的完整契约、能力从哪来。
|
|
74
|
+
- [接入你的 agent](/zh/how-to/connect-your-agent) —— 每种接入路径怎么做。
|
|
75
|
+
- [OTel 接入](/zh/how-to/connect-otel) —— span 只进瀑布图、不喂断言的完整走法。
|
|
76
76
|
- [内置 Agent 能力](/zh/reference/builtin-agents) —— 内置 adapter 各自做到什么。
|
|
@@ -13,7 +13,7 @@ description: "NiceEval CLI 参考:exp、show、view、init、list 和 clean
|
|
|
13
13
|
运行命名实验组或配置。可选尾随位置参数按 eval ID 前缀过滤。
|
|
14
14
|
</Card>
|
|
15
15
|
<Card title="npx niceeval init" icon="wand-magic-sparkles">
|
|
16
|
-
创建空的 `evals/` 目录和最小的 `niceeval.config.ts`;不生成示例 eval 文件。同时写入/刷新 niceeval 指引区块——项目已有 `AGENTS.md` 就写那份,只有 `CLAUDE.md` 就写进 `CLAUDE.md`,都没有则新建 `AGENTS.md`(见[Agent 反馈闭环](/zh/
|
|
16
|
+
创建空的 `evals/` 目录和最小的 `niceeval.config.ts`;不生成示例 eval 文件。同时写入/刷新 niceeval 指引区块——项目已有 `AGENTS.md` 就写那份,只有 `CLAUDE.md` 就写进 `CLAUDE.md`,都没有则新建 `AGENTS.md`(见[Agent 反馈闭环](/zh/how-to/agent-feedback-loop))。
|
|
17
17
|
</Card>
|
|
18
18
|
<Card title="npx niceeval list" icon="list">
|
|
19
19
|
发现并打印所有 eval,不运行。
|
|
@@ -64,7 +64,7 @@ npx niceeval exp compare-models weather
|
|
|
64
64
|
|
|
65
65
|
## 常用 flags
|
|
66
66
|
|
|
67
|
-
下表由 CLI 的 flag 解析表生成,表外的 flag 一律按未知 flag 报错并以非零状态退出。**没有**用于选择 sandbox
|
|
67
|
+
下表由 CLI 的 flag 解析表生成,表外的 flag 一律按未知 flag 报错并以非零状态退出。**没有**用于选择 sandbox provider 的 CLI flag:sandbox provider 只能写在代码里——在 experiment(`defineExperiment`)里设置 `sandbox`,或者在 `niceeval.config.ts`(`defineConfig`)里设置作为项目级兜底,值来自 `niceeval/sandbox` 的 `dockerSandbox()` / `vercelSandbox()` / `e2bSandbox()`。
|
|
68
68
|
|
|
69
69
|
{/* GENERATED:BEGIN cli-flags */}
|
|
70
70
|
|
|
@@ -78,20 +78,29 @@ npx niceeval exp compare-models weather
|
|
|
78
78
|
| `--max-concurrency` | number | 设置同时运行的 eval 数量。 |
|
|
79
79
|
| `--timeout` | number | 单个 attempt 的超时时间,单位毫秒。 |
|
|
80
80
|
| `--budget` | number | 整次运行的预算上限(美元)。 |
|
|
81
|
+
| `--keep-sandbox` | boolean | `exp` 命令专用:跑完留下 failed/errored attempt 的沙箱现场(= `--keep-sandbox=failed`);`--keep-sandbox=all` 连 passed 也留。事后用 `niceeval sandbox list/enter/stop` 查看与销毁。 |
|
|
82
|
+
| `--all` | boolean | `sandbox stop` 专用:销毁全部留存沙箱。 |
|
|
83
|
+
| `--window` | string | `sandbox diff` 专用:只看某个 send 窗口(如 `--window s1/t2`);省略输出全部窗口的串联视图。 |
|
|
84
|
+
| `--path` | string | `sandbox diff` 专用:只看某个文件的 patch;省略输出该窗口的全部文件。 |
|
|
85
|
+
| `--leave-running` | boolean | `sandbox enter` 专用:shell 退出后让现场保持运行,不送回休眠。 |
|
|
81
86
|
| `--tag` | string | 只运行带有该 tag 的 eval(见 `defineEval` 的 `tags`)。 |
|
|
82
87
|
| `--junit` | string | 额外写一份 JUnit XML 报告到指定路径,供 CI 消费。 |
|
|
83
88
|
| `--json` | string | 额外写一份 JSON 结果(`RunSummary` 原样序列化)到指定路径,供 CI 或下游脚本消费。 |
|
|
84
89
|
| `--out` | string | `view` 命令专用:把结果查看器静态导出到指定目录。 |
|
|
85
90
|
| `--port` | number | `view` 命令专用:指定本地服务器监听端口。 |
|
|
86
|
-
| `--
|
|
91
|
+
| `--allow-sensitive-artifacts` | boolean | `view --out` 专用:对非发布根(快照没有 publish:{redaction:"applied"} 标记)导出时的显式确认——静态站会原样携带未消毒的证据文件。 |
|
|
92
|
+
| `--source` | boolean | `show` 命令专用:该 attempt 运行时保存的 Eval 源码,gate/soft 断言标回源码行(证据切面)。 |
|
|
87
93
|
| `--execution` | boolean | `show` 命令专用:该 attempt 的标准执行事件流(消息、thinking、Skill load、工具调用/结果);有 OTel 时同一节点补时间(证据切面)。 |
|
|
94
|
+
| `--timing` | boolean | `show` 命令专用:整个 Attempt 的统一时间树;裸 `--timing` 给有界诊断投影,`--timing=full` 逐节点展开全部 runner/已关联 OTel 节点。 |
|
|
88
95
|
| `--diff` | boolean | `show` 命令专用:sandbox 里的文件改动摘要;`--diff=<文件路径>` 看单个文件的完整改动(路径必须 `=` 连写)。 |
|
|
89
|
-
| `--history` | boolean | `show`
|
|
90
|
-
| `--experiment` | string | `show` / `view`
|
|
91
|
-
| `--
|
|
92
|
-
| `--
|
|
93
|
-
| `--
|
|
94
|
-
| `--
|
|
96
|
+
| `--history` | boolean | `show` 命令专用:执行时间轴——对匹配的每个 experiment × eval 分节,逐 attempt 列时间 / verdict / 摘要 / 耗时 / 成本 / locator;与 `--report` 互斥。 |
|
|
97
|
+
| `--experiment` | string | `show` / `view` 命令专用:按路径段前缀收窄 experiment;组名会选中组内全部配置。 |
|
|
98
|
+
| `--results` | string | `show` / `view` / `sandbox enter\|list\|stop` 共用:结果根目录(`.niceeval` 之外的另一个根,如 `copySnapshots` 产出的发布根)。 |
|
|
99
|
+
| `--snapshot` | string | `view` 命令专用:只打开这一份快照文件(`snapshot.json`);文件不可读时命令失败(扫描模式只跳过)。 |
|
|
100
|
+
| `--report` | string | `show` / `view` 命令专用:用文件默认导出的 `defineReport(...)` 替换两者共用的默认报告。 |
|
|
101
|
+
| `--page` | string | `show` / `view` 命令专用:选择多页报告的页(页 id 见 `show --report` 的页索引);`view` 里定初始页。 |
|
|
102
|
+
| `--dry` | boolean | 只打印本次会匹配到的 eval × 运行配置,不实际执行(按下面 `--output` 选中的 profile 给出预览)。 |
|
|
103
|
+
| `--output` | string | 反馈 profile:`auto`(默认)按环境自动选择,`human` / `agent` / `ci` 强制指定;只改变终端展示,不改变选择、调度、判定、artifact 或退出码。`auto` 依次判定:stderr 是 TTY → human;否则 `CI`(或其它常见 CI 平台环境变量)存在 → ci;否则 → agent。 |
|
|
95
104
|
| `--force` | boolean | 忽略上次运行结果,不跳过已通过的 (experiment, eval) 组合,强制全部重跑。 |
|
|
96
105
|
| `--strict` | boolean | CI 中推荐使用:让软阈值(`soft`)失败也计入整条 eval 的 verdict。 |
|
|
97
106
|
| `--early-exit` / `--no-early-exit` | boolean | 某个 eval 的一次 attempt 通过后,停止该 eval 剩余的 attempts。 |
|
|
@@ -118,13 +127,32 @@ npx niceeval exp compare-models weather-tool
|
|
|
118
127
|
|
|
119
128
|
运行命名 experiment,用矩阵比较 agents、models 或 flags。第二个参数开始是 eval ID 前缀过滤。
|
|
120
129
|
|
|
130
|
+
`show` 与 `view` 是顶层命令,应写成 `npx niceeval show`、`npx niceeval view`。误写成 `npx niceeval exp show` / `exp view` 且没有同名 experiment 时,CLI 会在“不存在的实验”错误后提示正确命令;仓库确实存在同名 experiment 时仍按合法 id 执行。
|
|
131
|
+
|
|
132
|
+
## `--output`:human / agent / ci
|
|
133
|
+
|
|
134
|
+
`--output` 选一种终端反馈模型,只改变展示,不改变选择、调度、判定、artifact 或退出码;省略时的默认值 `auto` 按环境自动选择。三种消费者各有推荐命令:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# 人在 TTY 前:动态 dashboard + 永久失败/诊断行
|
|
138
|
+
npx niceeval exp compare --output human
|
|
139
|
+
|
|
140
|
+
# coding agent / 自动修复循环:低频 checkpoint + 有界 handoff block
|
|
141
|
+
npx niceeval exp compare --output agent
|
|
142
|
+
|
|
143
|
+
# CI job:单一有序 stdout 事件流 + 退出码 + JSON/JUnit
|
|
144
|
+
npx niceeval exp compare --output ci --strict --json .niceeval/ci-summary.json --junit .niceeval/junit.xml
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
三种 profile 的完整对比见[运行器 · Reporter](/zh/explanation/runner#reporter);人在终端里怎么读 dashboard 与结束摘要见上面的[常用 flags](#常用-flags)与本页各命令示例;AI 反馈闭环的完整用法(读输出、按 locator 下钻、局部重跑)见 [AI 反馈闭环](/zh/how-to/agent-feedback-loop);CI 集成(GitHub Actions、退出码、JSON/JUnit)见 [CI 集成](/zh/how-to/ci-integration)。
|
|
148
|
+
|
|
121
149
|
## `view`
|
|
122
150
|
|
|
123
151
|
```bash
|
|
124
152
|
npx niceeval view
|
|
125
153
|
```
|
|
126
154
|
|
|
127
|
-
打开本地结果查看器。它和 `show` 共用同一份默认报告和同一套默认选择——对每个 experiment、每个 eval,取历次运行里最新的那份判定;只补跑部分 eval 时,其余 eval
|
|
155
|
+
打开本地结果查看器。它和 `show` 共用同一份默认报告和同一套默认选择——对每个 experiment、每个 eval,取历次运行里最新的那份判定;只补跑部分 eval 时,其余 eval 从更早的运行补齐。默认报告按 experiment id 的父目录分组,只在同组内比较。`show` 输出终端文本,`view` 输出网页并提供可交互的证据浏览;eval ID 前缀、`--experiment`、`--run` 对两者的收窄一致。完整说明见[查看结果](/zh/how-to/viewing-results)。
|
|
128
156
|
|
|
129
157
|
## `show [id-prefix...]`
|
|
130
158
|
|
|
@@ -138,9 +166,9 @@ npx niceeval show fixtures/button --diff
|
|
|
138
166
|
npx niceeval show weather/brooklyn --history
|
|
139
167
|
```
|
|
140
168
|
|
|
141
|
-
`show` 是终端结果入口,适合人直接阅读,也适合 coding agent 在上下文窗口里逐级下钻。位置参数选「看哪些 eval」(ID 前缀)或直接用 `@<locator>` 精确选一个 attempt
|
|
169
|
+
`show` 是终端结果入口,适合人直接阅读,也适合 coding agent 在上下文窗口里逐级下钻。位置参数选「看哪些 eval」(ID 前缀)或直接用 `@<locator>` 精确选一个 attempt;不带位置参数时显示按实验组分区的默认比较报告,指定 eval ID 前缀只收窄报告覆盖的 Eval,不改变组边界。
|
|
142
170
|
|
|
143
|
-
`@<locator>` 不带证据 flag 时给出该 attempt 的紧凑全景(断言摘要、执行摘要、可选 OTel 时间、diff 摘要);`--eval`、`--execution`、`--diff` 是同一 attempt 的证据切面,分别展开运行时保存的 Eval 源码、标准执行事件流、工作区文件改动,因此必须搭配 `@<locator>` 精确指名一个 attempt。`--run` 钉住某次结果目录,`--history` 查看跨 run 趋势。完整的阅读顺序、输出示例和 artifact 说明见[查看结果](/zh/
|
|
171
|
+
`@<locator>` 不带证据 flag 时给出该 attempt 的紧凑全景(断言摘要、执行摘要、可选 OTel 时间、diff 摘要);`--eval`、`--execution`、`--diff` 是同一 attempt 的证据切面,分别展开运行时保存的 Eval 源码、标准执行事件流、工作区文件改动,因此必须搭配 `@<locator>` 精确指名一个 attempt。`--run` 钉住某次结果目录,`--history` 查看跨 run 趋势。完整的阅读顺序、输出示例和 artifact 说明见[查看结果](/zh/how-to/viewing-results)。
|
|
144
172
|
|
|
145
173
|
## `--early-exit` 与 `--strict`
|
|
146
174
|
|
|
@@ -92,6 +92,14 @@ name: string;
|
|
|
92
92
|
|
|
93
93
|
agent 的显示名/标识,原样进入 `Agent.name`——不是注册表查找 key,只用于展示、结果归属与去重指纹。
|
|
94
94
|
|
|
95
|
+
#### `coverage`
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
coverage?: EvidenceCoverage;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
该 Adapter 的常态证据覆盖声明(完整采集的用 `completeCoverage` 常量);省略 = 全通道 unknown。
|
|
102
|
+
|
|
95
103
|
#### `setup`
|
|
96
104
|
|
|
97
105
|
```ts
|
|
@@ -145,6 +153,14 @@ name: string;
|
|
|
145
153
|
|
|
146
154
|
agent 的显示名/标识,原样进入 `Agent.name`——不是注册表查找 key,只用于展示、结果归属与去重指纹。
|
|
147
155
|
|
|
156
|
+
#### `coverage`
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
coverage?: EvidenceCoverage;
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
该 Adapter 的常态证据覆盖声明(完整采集的用 `completeCoverage` 常量);省略 = 全通道 unknown。
|
|
163
|
+
|
|
148
164
|
#### `setup`
|
|
149
165
|
|
|
150
166
|
```ts
|
|
@@ -268,16 +284,35 @@ spread 进 send;file-based 的在 tracing.configure 里写配置。远程 HTTP
|
|
|
268
284
|
只需要把 headers spread 进请求头(每轮一个新 traceparent);端点是启动期配置
|
|
269
285
|
(defineConfig({ telemetry: { port } }))固定的,不从这里传。
|
|
270
286
|
|
|
287
|
+
#### `progress`
|
|
288
|
+
|
|
289
|
+
```ts
|
|
290
|
+
progress(update: ProgressUpdate): void;
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
作用域反馈:报告此刻正在做什么(turn / tool / 安装进度)。短命状态——Human profile
|
|
294
|
+
更新 active 行,`agent`/`ci` 不逐条打印,也不进最终结果;不要每个 token/delta 都调用。
|
|
295
|
+
runner 按当前回调所处的生命周期阶段(agent.setup / agent.run / agent.teardown)归因,
|
|
296
|
+
调用方不能冒充其它阶段(见 docs/feature/experiments/library.md)。
|
|
297
|
+
|
|
298
|
+
#### `diagnostic`
|
|
299
|
+
|
|
300
|
+
```ts
|
|
301
|
+
diagnostic(input: DiagnosticInput): void;
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
作用域反馈:报告运行结束后仍应保留的问题(协议降级、数据不完整、cleanup 问题)。
|
|
305
|
+
永久事件,落进 attempt 的 diagnostics 并进各 profile 的永久输出;`dedupeKey` 去重。
|
|
306
|
+
即使 level 为 "error" 也不改变 Turn.status / verdict——无法继续时抛异常。
|
|
307
|
+
|
|
271
308
|
#### `log`
|
|
272
309
|
|
|
273
310
|
```ts
|
|
274
311
|
log(msg: string): void;
|
|
275
312
|
```
|
|
276
313
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
与 `Sandbox.appendLog` 是两回事:那个是把一行写进容器自己的原生日志
|
|
280
|
-
(`docker logs` 能看到),这里只是运行器的观测通道。
|
|
314
|
+
`progress({ message: msg })` 的别名,不是第二条通道(见 docs/feature/experiments/cli.md
|
|
315
|
+
「Attempt 阶段」)。超时失败时最近若干行会并入结果的 error 信息,方便定位卡在哪一步。
|
|
281
316
|
|
|
282
317
|
{/* GENERATED:END agent-def */}
|
|
283
318
|
|
|
@@ -288,7 +323,7 @@ log(msg: string): void;
|
|
|
288
323
|
- `hold<T>(state: T): void` / `take<T>(): T | undefined` —— HITL 停轮现场的存取,`take` 取到即清除(一次消费)。
|
|
289
324
|
- `state: Record<string, unknown>` —— 逃生舱,起始 `{}`,框架从不写入。
|
|
290
325
|
|
|
291
|
-
完整契约见[Adapter 概念](/zh/
|
|
326
|
+
完整契约见[Adapter 概念](/zh/explanation/adapter#上下文:agentcontext)。
|
|
292
327
|
|
|
293
328
|
## Sandbox 接口
|
|
294
329
|
|
|
@@ -458,6 +493,24 @@ stream?: boolean;
|
|
|
458
493
|
日志里看到 agent 的【原始输出】。provider 各自实现(docker:tee 到 PID1 tail 的文件;
|
|
459
494
|
不支持的 provider 忽略)—— 日志怎么浮现是 provider 的事,adapter 只声明意图。
|
|
460
495
|
|
|
496
|
+
#### `onStdout`
|
|
497
|
+
|
|
498
|
+
```ts
|
|
499
|
+
onStdout?: (chunk: string) => void | Promise<void>;
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
命令 stdout 每到一块就调用一次。回调只用于运行中的短命反馈;完整 stdout 仍会原样
|
|
503
|
+
出现在返回的 `CommandResult` 里。provider 不支持真流时,至少会在命令结束后按完整
|
|
504
|
+
stdout 调用一次,不能静默丢掉。
|
|
505
|
+
|
|
506
|
+
#### `onStderr`
|
|
507
|
+
|
|
508
|
+
```ts
|
|
509
|
+
onStderr?: (chunk: string) => void | Promise<void>;
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
`onStdout` 的 stderr 对应物;完整 stderr 仍保留在 `CommandResult`。
|
|
513
|
+
|
|
461
514
|
#### `root`
|
|
462
515
|
|
|
463
516
|
```ts
|
|
@@ -106,4 +106,4 @@ pricing?: Record<string, PriceOverride>;
|
|
|
106
106
|
|
|
107
107
|
{/* GENERATED:END config-fields */}
|
|
108
108
|
|
|
109
|
-
[NiceEval](https://niceeval.com/) 把环境准备放在普通代码里:eval 自己需要的文件写在 `test(t)`,agent 自己的准备写在 adapter 的 `setup`。sandbox
|
|
109
|
+
[NiceEval](https://niceeval.com/) 把环境准备放在普通代码里:eval 自己需要的文件写在 `test(t)`,agent 自己的准备写在 adapter 的 `setup`。sandbox provider 只来自代码里的 `sandbox` 字段,不做环境变量自动探测,也没有对应的 CLI flag——用 `niceeval/sandbox` 里的 `dockerSandbox()` / `vercelSandbox()` / `e2bSandbox()` 构造后填进 `sandbox` 字段(可以直接写在 experiment 上,也可以只写在这里作为项目级兜底:`exp.sandbox ?? config.sandbox`)。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "defineEval:声明、配置并运行 NiceEval eval"
|
|
3
3
|
sidebarTitle: "defineEval"
|
|
4
|
-
description: "defineEval 参考:选项、test context t、Turn 返回值、sandbox helper
|
|
4
|
+
description: "defineEval 参考:选项、test context t、Turn 返回值、sandbox helper,以及数组和 keyed record 数据集导出。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
`defineEval` 是编写 eval 的主要入口。每个 eval 文件调用一次,传入描述和 `test(t)`,并默认导出结果。
|
|
@@ -84,15 +84,28 @@ metadata?: Record<string, unknown>;
|
|
|
84
84
|
|
|
85
85
|
任意附加元数据,原样透传进 EvalResult,不参与调度或打分;供自定义 reporter 消费。
|
|
86
86
|
|
|
87
|
+
#### `diff`
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
diff?: { include?: string[]; ignore?: string[] };
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
调整 agent diff 的归因排除清单(仅沙箱型;见 docs/feature/eval/README.md):两个数组都是
|
|
94
|
+
gitignore 风格 glob(workdir 相对)。默认排除 .git/node_modules/构建产物/包管理器缓存;
|
|
95
|
+
`ignore` 在默认清单上追加排除;`include` 优先级最高,把匹配路径显式加回。
|
|
96
|
+
合成规则固定为「默认 ∪ ignore,再被 include 打洞」,清单在分类账锚点时冻结。
|
|
97
|
+
|
|
87
98
|
#### `setup`
|
|
88
99
|
|
|
89
100
|
```ts
|
|
90
|
-
setup?: (sandbox: Sandbox) => Promise<void | Cleanup> | void | Cleanup;
|
|
101
|
+
setup?: (sandbox: Sandbox, ctx: SandboxHookContext) => Promise<void | Cleanup> | void | Cleanup;
|
|
91
102
|
```
|
|
92
103
|
|
|
93
104
|
eval 级预置:拿到沙箱(已上传 workspace + git 基线 + 装好依赖前)。
|
|
94
105
|
默认命令以非 root 跑(agent 的自然环境);装系统依赖时给 `runCommand` 传 `{ root: true }`
|
|
95
106
|
(如 `runCommand("apt-get", ["install", …], { root: true })`),跨 provider 语义一致。
|
|
107
|
+
第二个参数是绑定到 `eval.setup` 的窄上下文(`ctx.progress` / `ctx.diagnostic`,
|
|
108
|
+
见 docs/feature/eval/README.md);可返回 cleanup 闭包,归因到 `eval.teardown`。
|
|
96
109
|
|
|
97
110
|
#### `test`
|
|
98
111
|
|
|
@@ -115,10 +128,10 @@ eval 主体:拿到 TestContext,驱动对话 / 沙箱操作并就地断言。
|
|
|
115
128
|
#### `send`
|
|
116
129
|
|
|
117
130
|
```ts
|
|
118
|
-
send(
|
|
131
|
+
send(input: SendInput): Promise<TurnHandle>;
|
|
119
132
|
```
|
|
120
133
|
|
|
121
|
-
|
|
134
|
+
向默认会话发一条消息(字符串或结构化消息),返回该轮的 TurnHandle。事件同时累加进默认会话的累计事件流,供下面的作用域断言使用。
|
|
122
135
|
|
|
123
136
|
#### `sendFile`
|
|
124
137
|
|
|
@@ -219,13 +232,31 @@ readonly flags: Readonly<Record<string, unknown>>;
|
|
|
219
232
|
|
|
220
233
|
本次 attempt 生效的实验 flags(experiment.flags 的只读视图;实验条件,非命令行开关)。
|
|
221
234
|
|
|
235
|
+
#### `progress`
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
progress(update: ProgressUpdate): void;
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
作用域反馈:报告 eval 自己执行的长步骤(上传 fixture、跑构建……)。短命状态,scope 固定
|
|
242
|
+
为 `eval.run`;只报告不断言(见 docs/feature/eval/library/context.md「向运行反馈长步骤」)。
|
|
243
|
+
|
|
244
|
+
#### `diagnostic`
|
|
245
|
+
|
|
246
|
+
```ts
|
|
247
|
+
diagnostic(input: DiagnosticInput): void;
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
作用域反馈:报告运行结束后仍需保留的问题(永久事件,落 attempt diagnostics)。
|
|
251
|
+
即使 level 为 "error" 也不自动改变 verdict——测试结论仍由断言决定。
|
|
252
|
+
|
|
222
253
|
#### `log`
|
|
223
254
|
|
|
224
255
|
```ts
|
|
225
256
|
log(msg: string): void;
|
|
226
257
|
```
|
|
227
258
|
|
|
228
|
-
|
|
259
|
+
`progress({ message: msg })` 的别名(调试日志),不出现在最终结果里。
|
|
229
260
|
|
|
230
261
|
#### `skip`
|
|
231
262
|
|
|
@@ -380,10 +411,10 @@ eventOrder(types: StreamEvent["type"][]): AssertionHandle;
|
|
|
380
411
|
#### `eventsSatisfy`
|
|
381
412
|
|
|
382
413
|
```ts
|
|
383
|
-
eventsSatisfy(predicate: (events: readonly StreamEvent[]) => boolean
|
|
414
|
+
eventsSatisfy(label: string, predicate: (events: readonly StreamEvent[]) => boolean): AssertionHandle;
|
|
384
415
|
```
|
|
385
416
|
|
|
386
|
-
|
|
417
|
+
用自定义谓词对默认会话累计的整段事件流断言;label 必填、进断言标题。
|
|
387
418
|
|
|
388
419
|
#### `sandbox`
|
|
389
420
|
|
|
@@ -633,10 +664,10 @@ eventOrder(types: StreamEvent["type"][]): AssertionHandle;
|
|
|
633
664
|
#### `eventsSatisfy`
|
|
634
665
|
|
|
635
666
|
```ts
|
|
636
|
-
eventsSatisfy(predicate: (events: readonly StreamEvent[]) => boolean
|
|
667
|
+
eventsSatisfy(label: string, predicate: (events: readonly StreamEvent[]) => boolean): AssertionHandle;
|
|
637
668
|
```
|
|
638
669
|
|
|
639
|
-
|
|
670
|
+
用自定义谓词对本轮整段事件流断言;label 必填、进断言标题(谓词不透明,解释责任在 label)。
|
|
640
671
|
|
|
641
672
|
#### `maxTokens`
|
|
642
673
|
|
|
@@ -678,3 +709,5 @@ export default rows.map((row) =>
|
|
|
678
709
|
```
|
|
679
710
|
|
|
680
711
|
数组导出会生成稳定 ID:`file/0000`、`file/0001` 等。
|
|
712
|
+
|
|
713
|
+
已有稳定业务 key 时也可以默认导出 `Record<string, EvalDef>`。例如 key `15193` 在 `swelancer.eval.ts` 中生成 `swelancer/15193`。key 必须是非空单一路径片段,不能是 `.` / `..`,不能含 `/`、`\\` 或控制字符;发现顺序按 key 字典序固定。
|
|
@@ -212,7 +212,7 @@ token 用量或 OTel span 反推得到)。存在时优先于按价格表(`define
|
|
|
212
212
|
} }
|
|
213
213
|
```
|
|
214
214
|
|
|
215
|
-
agent 停轮等人时,每个待回答的问题吐一条,同时该 Turn 的 `status` 返回 `"waiting"`。`t.requireInputRequest(filter)` 的 filter 逐字段匹配这个 `request`——**能填的字段尽量填**,否则 eval 侧筛选不到。接法见[接入教程的 HITL 部分](/zh/
|
|
215
|
+
agent 停轮等人时,每个待回答的问题吐一条,同时该 Turn 的 `status` 返回 `"waiting"`。`t.requireInputRequest(filter)` 的 filter 逐字段匹配这个 `request`——**能填的字段尽量填**,否则 eval 侧筛选不到。接法见[接入教程的 HITL 部分](/zh/how-to/connect-your-agent)。
|
|
216
216
|
|
|
217
217
|
### `thinking` / `compaction` / `error`
|
|
218
218
|
|
|
@@ -257,6 +257,6 @@ function toStreamEvents(body: MyBotResponse): StreamEvent[] {
|
|
|
257
257
|
|
|
258
258
|
## 相关阅读
|
|
259
259
|
|
|
260
|
-
- [接入你的 agent](/zh/
|
|
260
|
+
- [接入你的 agent](/zh/how-to/connect-your-agent) —— 从零跑通的教程。
|
|
261
261
|
- [能力位](/zh/reference/capabilities) —— 声明"事件流是完整的"意味着什么。
|
|
262
|
-
- [编写 eval](/zh/
|
|
262
|
+
- [编写 eval](/zh/how-to/authoring) —— 消费这条流的断言全集。
|
|
@@ -136,7 +136,7 @@ export function makeAssertion(spec: {
|
|
|
136
136
|
t.check(t.reply, includes("Paris"));
|
|
137
137
|
t.check(t.reply, includes(/order #\d+/i));
|
|
138
138
|
t.check(turn.data, equals({ intent: "refund" }));
|
|
139
|
-
t.check(
|
|
139
|
+
t.check(turn.data, matches(OrderSchema)); // Standard Schema / Zod 结构校验;正则匹配用 includes
|
|
140
140
|
t.check(t.reply, similarity("The answer explains the refund window").atLeast(0.8));
|
|
141
141
|
t.check(turn.data, satisfies((value) => Array.isArray(value)));
|
|
142
142
|
```
|
|
@@ -172,6 +172,22 @@ readonly severity: Severity;
|
|
|
172
172
|
readonly threshold?: number;
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
+
#### `isOptional`
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
readonly isOptional?: boolean;
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
`.optional()` 链过的标记:评不了只记 unavailable,不把 attempt 拖成 errored。
|
|
182
|
+
|
|
183
|
+
#### `expected`
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
readonly expected?: string;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
期望条件的有界文本描述(如 `contains "Brooklyn"`),失败时进 AssertionResult.expected。
|
|
190
|
+
|
|
175
191
|
#### `score`
|
|
176
192
|
|
|
177
193
|
```ts
|
|
@@ -195,6 +211,15 @@ atLeast(threshold: number): ValueAssertion;
|
|
|
195
211
|
转成软阈值断言:未达 threshold 时该条记为 failed,但默认不拖累整条 eval 的 verdict;
|
|
196
212
|
`--strict` 运行下,软阈值失败也会把整条 eval 的 verdict 计为 failed。返回新实例,不改原对象。
|
|
197
213
|
|
|
214
|
+
#### `optional`
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
optional(): ValueAssertion;
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
允许这条断言证据缺席:评不了时只记录 `outcome: "unavailable"`,不影响判定。
|
|
221
|
+
与 severity 正交(severity 说影不影响质量判定,optional 说证据允不允许缺席)。返回新实例,不改原对象。
|
|
222
|
+
|
|
198
223
|
{/* GENERATED:END value-assertion */}
|
|
199
224
|
|
|
200
225
|
## 自定义 matcher
|
|
@@ -1,14 +1,16 @@
|
|
|
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
|
-
[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/
|
|
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/how-to/connect-your-agent)。
|
|
8
8
|
|
|
9
9
|
## Sandbox 适配器
|
|
10
10
|
|
|
11
|
-
三个内置 Sandbox agent 都用 `defineSandboxAgent` 构造,鉴权走环境变量(可用工厂参数覆盖),并且都支持在沙箱 `setup` 阶段装扩展。怎么运行内置 Sandbox agent、目录结构和自定义 Sandbox adapter,见 [Sandbox Agent](/zh/
|
|
11
|
+
三个内置 Sandbox agent 都用 `defineSandboxAgent` 构造,鉴权走环境变量(可用工厂参数覆盖),并且都支持在沙箱 `setup` 阶段装扩展。怎么运行内置 Sandbox agent、目录结构和自定义 Sandbox adapter,见 [Sandbox Agent](/zh/how-to/sandbox-agent);这里只讲每个 Adapter 能装什么、配置项怎么写。
|
|
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"`。
|
|
12
14
|
|
|
13
15
|
### claude-code
|
|
14
16
|
|
|
@@ -16,7 +18,17 @@ description: "NiceEval 内置的 Sandbox 和非 Sandbox 适配器分别是什么
|
|
|
16
18
|
- **装 MCP server**:`mcpServers` 配置项,`setup` 阶段写进沙箱里用户级的 `~/.claude.json`(顶层 `mcpServers` 字段)。
|
|
17
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。
|
|
19
|
-
-
|
|
21
|
+
- **官方配置文件**:`settingsFile` 是运行 NiceEval 的机器上的本地项目路径,不是 Sandbox 内路径;它指向一份完整的 Claude Code `settings.json`。路径相对项目根,只允许普通相对路径或 `./` 前缀;`..`、绝对路径、`~` 和解析后逃出项目根的符号链接都会报错。Adapter 从本地读取后上传文件,原样替换 Sandbox 中原本为空的用户级 `~/.claude/settings.json`;不继承宿主机配置,也不 deep merge 或重新序列化。`model` 和 `env` 归 Experiment 和 Adapter 管,出现在文件里会在 `setup` 阶段报错并点名冲突键。Secret 走环境变量,别写进配置文件。
|
|
22
|
+
- **tracing**:claude CLI 的 beta 原生遥测(`CLAUDE_CODE_ENHANCED_TELEMETRY_BETA`),span 只有结构和计时,细节见 [OTel 接入](/zh/how-to/connect-otel)。
|
|
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
|
+
```
|
|
20
32
|
|
|
21
33
|
```ts
|
|
22
34
|
import { defineExperiment } from "niceeval";
|
|
@@ -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/how-to/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
|
|
|
@@ -147,8 +171,8 @@ export default defineExperiment({
|
|
|
147
171
|
|
|
148
172
|
## 相关阅读
|
|
149
173
|
|
|
150
|
-
- [接入你的 Agent](/zh/
|
|
151
|
-
- [Sandbox Agent](/zh/
|
|
174
|
+
- [接入你的 Agent](/zh/how-to/connect-your-agent) — 全景:experiment 怎么配、eval 怎么写。
|
|
175
|
+
- [Sandbox Agent](/zh/how-to/sandbox-agent) — 怎么运行内置 Sandbox agent,以及怎么写自己的。
|
|
152
176
|
- [内置 Agent 能力参考](/zh/reference/builtin-agents) — 每个适配器逐能力盘点、非 Sandbox 适配器的完整代码示例。
|
|
153
|
-
- [OTel 接入](/zh/
|
|
177
|
+
- [OTel 接入](/zh/how-to/connect-otel) — 把 span 发给 [NiceEval](https://niceeval.com/),换 `niceeval view` 的调用瀑布图。
|
|
154
178
|
- [defineAgent 参考](/zh/reference/define-agent) — `defineAgent` / `defineSandboxAgent` 完整参数。
|