niceeval 0.5.4 → 0.6.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 +55 -0
- package/dist/agents/types.d.ts +317 -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/execution-tree.d.ts +103 -0
- package/dist/o11y/otlp/parse.d.ts +3 -0
- package/dist/o11y/otlp/receiver.d.ts +21 -0
- package/dist/o11y/otlp/select.d.ts +22 -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/cost-pass-rate-comparison.d.ts +1 -0
- package/dist/report/built-ins/cost-pass-rate-comparison.js +17 -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 +178 -0
- package/dist/report/components.js +132 -0
- package/dist/report/compute.d.ts +106 -0
- package/dist/report/compute.js +618 -0
- package/dist/report/flag.d.ts +6 -0
- package/dist/report/flag.js +8 -0
- package/dist/report/format.d.ts +32 -0
- package/dist/report/format.js +126 -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 +83 -0
- package/dist/report/locale.js +160 -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 +20 -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 +10 -0
- package/dist/report/react/ExperimentList.js +15 -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 +100 -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 +393 -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 +503 -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 +420 -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/annotated-source.d.ts +61 -0
- package/dist/results/attempt-evidence.d.ts +69 -0
- package/dist/results/attempt-source.d.ts +15 -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 +5 -5
- package/docs-site/zh/concepts/assert.mdx +8 -8
- package/docs-site/zh/concepts/evals.mdx +5 -5
- 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 +2 -2
- 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 +235 -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 +1 -1
- package/docs-site/zh/guides/official-adapters.mdx +31 -9
- package/docs-site/zh/guides/publish-report.mdx +3 -3
- 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 +35 -34
- package/docs-site/zh/guides/runner.mdx +2 -2
- package/docs-site/zh/guides/sandbox-agent.mdx +2 -2
- package/docs-site/zh/guides/{sandbox-backends.mdx → sandbox-providers.mdx} +11 -11
- package/docs-site/zh/guides/viewing-results.mdx +199 -79
- package/docs-site/zh/guides/write-experiment.mdx +9 -1
- package/docs-site/zh/guides/write-send.mdx +2 -2
- 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 +12 -12
- 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 +7 -1
- package/docs-site/zh/reference/expect.mdx +3 -3
- 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 +54 -2
- 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 +34 -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 +643 -0
- package/src/report/built-ins/cost-pass-rate-comparison.tsx +23 -0
- package/src/report/built-ins/index.ts +2 -0
- package/src/report/components.tsx +223 -50
- package/src/report/compute.ts +358 -53
- package/src/report/dual-render.test.tsx +1125 -0
- package/src/report/flag.ts +1 -1
- package/src/report/format.ts +50 -2
- package/src/report/index.ts +48 -14
- package/src/report/load.ts +1 -1
- package/src/report/locale.ts +206 -0
- package/src/report/metrics.ts +39 -15
- package/src/report/primitives.tsx +100 -2
- package/src/report/react/AttemptList.tsx +115 -0
- package/src/report/react/DeltaTable.tsx +9 -6
- package/src/report/react/EvalList.tsx +0 -0
- package/src/report/react/ExperimentList.tsx +108 -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 +136 -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 +129 -0
- package/src/report/react/fixtures.ts +163 -34
- package/src/report/react/format.ts +1 -1
- package/src/report/react/index.tsx +22 -6
- package/src/report/react/render.test.tsx +164 -31
- package/src/report/react/styles.css +405 -213
- package/src/report/report.test.ts +403 -94
- package/src/report/report.ts +29 -11
- package/src/report/text/faces.ts +303 -95
- 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 +196 -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 +125 -94
- package/src/show/render.ts +660 -160
- package/src/show/show.test.ts +472 -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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** JSON 可表达的任意值(递归定义),用于事件流 / 工具输入输出等跨进程/跨语言传递的数据。 */
|
|
2
|
+
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
3
|
+
[key: string]: JsonValue;
|
|
4
|
+
};
|
|
5
|
+
/** 断言的严重度:"gate" 失败必判整轮 failed;"soft" 默认只记录不拦截,仅在 `--strict` 模式或显式设阈值未达标时才计入失败。 */
|
|
6
|
+
export type Severity = "gate" | "soft";
|
|
7
|
+
/**
|
|
8
|
+
* eval 源码里一次调用的位置(`t.send` / 各断言),运行期从栈回溯抠出来(见 src/source-loc.ts)。
|
|
9
|
+
* view 据此把运行结果叠回真实源码行(github-diff 式代码视图)。`file` 为相对项目根的路径。
|
|
10
|
+
*/
|
|
11
|
+
export interface SourceLoc {
|
|
12
|
+
file: string;
|
|
13
|
+
line: number;
|
|
14
|
+
column?: number;
|
|
15
|
+
}
|
|
16
|
+
/** 随结果回传的一份 eval 源码(相对项目根的路径 + 文本),供 view 渲染代码视图。 */
|
|
17
|
+
export interface SourceArtifact {
|
|
18
|
+
path: string;
|
|
19
|
+
content: string;
|
|
20
|
+
}
|
|
21
|
+
/** 通用清理闭包(setup 返回值 / teardown 的形状),异步同步皆可,统一在 finally 里执行。 */
|
|
22
|
+
export type Cleanup = () => Promise<void> | void;
|
|
23
|
+
/**
|
|
24
|
+
* 可本地化文案:纯字符串,或按 locale 代码(如 "en"、"zh-CN")映射多语言。
|
|
25
|
+
* view 按当前界面语言挑一条,挑不到回退到 en / 第一条。
|
|
26
|
+
*/
|
|
27
|
+
export type LocalizedText = string | Record<string, string>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Verdict } from "../types.ts";
|
|
2
|
+
/** 折叠/计票只需要 verdict 字段;server 传 EvalResult,前端传 ViewResult 都满足。 */
|
|
3
|
+
export interface VerdictLike {
|
|
4
|
+
verdict: Verdict;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 把同一个 eval 的多轮 attempt 折叠成单一判定:任一轮通过 → 该 eval 通过(对齐 earlyExit
|
|
8
|
+
* 「先过一次即停」语义),否则按 failed > errored > skipped 取最严重的一个。
|
|
9
|
+
*/
|
|
10
|
+
export declare function foldEvalVerdict(attempts: VerdictLike[]): Verdict;
|
|
11
|
+
export interface EvalLevelStats {
|
|
12
|
+
/** 去重后的 eval 数(成功率分母的口径)。 */
|
|
13
|
+
evals: number;
|
|
14
|
+
passed: number;
|
|
15
|
+
failed: number;
|
|
16
|
+
errored: number;
|
|
17
|
+
skipped: number;
|
|
18
|
+
passRate: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 通过率与 passed/failed 一律按 eval 计票,不按 attempt:每个 eval 不管跑几轮都只占一票,先把它
|
|
22
|
+
* 的多轮折叠成单一判定再计数。否则 runs>1 时同一 eval 的 N 次 attempt 各算一票 —— 尤其 earlyExit
|
|
23
|
+
* 开时通过的 eval 只留 1 次、失败的 eval 跑满 N 次,失败 eval 被重复计入分母,把通过率拉低
|
|
24
|
+
* (见 docs/runner.md、docs/feature/scoring/README.md)。keyOf 决定「一个 eval」的粒度:单实验按 eval id,
|
|
25
|
+
* 跨实验组按 experimentId|eval id。
|
|
26
|
+
*/
|
|
27
|
+
export declare function evalLevelStats<T extends VerdictLike>(results: T[], keyOf: (r: T) => string): EvalLevelStats;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// server(aggregate.ts)与前端(app/lib/verdict.ts)共用的判定折叠口径。
|
|
2
|
+
// 必须保持环境无关且只依赖 type import,vite 前端会直接打包它。
|
|
3
|
+
// 单独成模块的原因:折叠/计票口径两边必须逐字一致,否则折叠行状态会和 KPI / 成功率对不上。
|
|
4
|
+
/**
|
|
5
|
+
* 把同一个 eval 的多轮 attempt 折叠成单一判定:任一轮通过 → 该 eval 通过(对齐 earlyExit
|
|
6
|
+
* 「先过一次即停」语义),否则按 failed > errored > skipped 取最严重的一个。
|
|
7
|
+
*/
|
|
8
|
+
export function foldEvalVerdict(attempts) {
|
|
9
|
+
const verdicts = attempts.map((a) => a.verdict);
|
|
10
|
+
if (verdicts.some((o) => o === "passed"))
|
|
11
|
+
return "passed";
|
|
12
|
+
if (verdicts.some((o) => o === "failed"))
|
|
13
|
+
return "failed";
|
|
14
|
+
if (verdicts.some((o) => o === "errored"))
|
|
15
|
+
return "errored";
|
|
16
|
+
return "skipped";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 通过率与 passed/failed 一律按 eval 计票,不按 attempt:每个 eval 不管跑几轮都只占一票,先把它
|
|
20
|
+
* 的多轮折叠成单一判定再计数。否则 runs>1 时同一 eval 的 N 次 attempt 各算一票 —— 尤其 earlyExit
|
|
21
|
+
* 开时通过的 eval 只留 1 次、失败的 eval 跑满 N 次,失败 eval 被重复计入分母,把通过率拉低
|
|
22
|
+
* (见 docs/runner.md、docs/feature/scoring/README.md)。keyOf 决定「一个 eval」的粒度:单实验按 eval id,
|
|
23
|
+
* 跨实验组按 experimentId|eval id。
|
|
24
|
+
*/
|
|
25
|
+
export function evalLevelStats(results, keyOf) {
|
|
26
|
+
const byEval = new Map();
|
|
27
|
+
for (const r of results)
|
|
28
|
+
byEval.set(keyOf(r), [...(byEval.get(keyOf(r)) ?? []), r]);
|
|
29
|
+
const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };
|
|
30
|
+
for (const group of byEval.values())
|
|
31
|
+
counts[foldEvalVerdict(group)] += 1;
|
|
32
|
+
const ran = counts.passed + counts.failed + counts.errored; // skipped 不进分母
|
|
33
|
+
return { evals: byEval.size, ...counts, passRate: ran ? counts.passed / ran : 0 };
|
|
34
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** live.ts 用来订阅"即将有一行独立诊断消息落地"。返回取消订阅函数。 */
|
|
2
|
+
export declare function onBeforeExternalTerminalWrite(fn: () => void): () => void;
|
|
3
|
+
/** 任何要绕开 Reporter 直接往终端打一行独立诊断消息的地方,写之前都先调用这个。 */
|
|
4
|
+
export declare function beforeExternalTerminalWrite(): void;
|
|
5
|
+
/** process.stderr.write 的替代:文本需自带换行(沿用现有 i18n 字符串的约定)。 */
|
|
6
|
+
export declare function writeStderrLine(text: string): void;
|
package/dist/types.d.ts
ADDED
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** 读必需的环境变量,缺了就清晰报错(agent 鉴权用)。 */
|
|
2
|
+
export declare function requireEnv(name: string): string;
|
|
3
|
+
/** 取环境变量,缺了返回 undefined。 */
|
|
4
|
+
export declare function getEnv(name: string): string | undefined;
|
|
5
|
+
/** 去掉 JS/TS 注释(块注释 + 行注释),好让断言只对真实代码生效,不被注释里的迁移说明误伤。 */
|
|
6
|
+
export declare function stripComments(code: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* 把 catch 到的 e 转成报告用字符串。优先带 stack(定位到 eval 脚本抛错的具体 file:line),
|
|
9
|
+
* 只在没有 stack 时才退化到 `name: message`。EvalResult.error 走这个,别再手写
|
|
10
|
+
* `e instanceof Error ? e.message : String(e)`——那样用户永远看不出错误发生在哪一行。
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatThrown(e: unknown): string;
|
|
13
|
+
/** 零填充到 4 位(数据集扇出的 id:sql/0000)。 */
|
|
14
|
+
export declare function pad4(n: number): string;
|
|
15
|
+
/**
|
|
16
|
+
* 在文本里维护一个带 BEGIN/END 标记的托管区块(AGENTS.md 的 niceeval 区块用)。
|
|
17
|
+
* 标记已存在 → 只替换两个标记之间的内容(升级时刷新指引,区块外的用户内容不动);
|
|
18
|
+
* 不存在 → 追加到末尾(与已有内容之间空一行)。
|
|
19
|
+
*/
|
|
20
|
+
export declare function upsertManagedBlock(source: string, begin: string, end: string, content: string): string;
|
|
21
|
+
/** 把任意值安全地转成简短字符串(报告 / 日志用)。 */
|
|
22
|
+
export declare function brief(value: unknown, max?: number): string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Adapter:把 Agent 接入 NiceEval"
|
|
3
3
|
sidebarTitle: "Adapter"
|
|
4
|
-
description: "Adapter 是你写的适配器。本文讲清楚 send
|
|
4
|
+
description: "Adapter 是你写的适配器。本文讲清楚 send 函数传入什么返回什么、被测系统配置怎么传、三个接入等级,以及 t 上的能力从哪来。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
在 [NiceEval](https://niceeval.com/) 里,`Adapter` 是连接运行器和被测系统的适配层。Adapter 需要实现 `send` 函数:把 `t.send()` 等 eval 侧动作发给你的应用,再把应用返回翻译成 [NiceEval](https://niceeval.com/) 的标准 `Turn`。
|
|
@@ -85,9 +85,9 @@ export default defineExperiment({
|
|
|
85
85
|
});
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
##
|
|
88
|
+
## 接入等级
|
|
89
89
|
|
|
90
|
-
按「Adapter
|
|
90
|
+
按「Adapter 接到哪里、额外拿到什么观测数据」,接入分三级:**Tier 1 只接 send**(应用代码一行不改,全套断言在这一级就齐了)、**Tier 2 send + OTel**(应用把 span 发给 [NiceEval](https://niceeval.com/),换 `niceeval view` 的调用瀑布图)、**Tier 3 侵入改造 + experiment flags**(feature A/B)。每档投入什么、买到什么、什么时候升级,见 [Tier](/zh/concepts/tier)。
|
|
91
91
|
|
|
92
92
|
eval 侧的驱动 API——`t.send()`、`t.sendFile()`、`t.newSession()`、HITL 的 `t.respond()` / `t.respondAll()`
|
|
93
93
|
统一都是调用 Adapter 的 `send`。
|
|
@@ -110,7 +110,7 @@ interface Agent {
|
|
|
110
110
|
`send` 是唯一要实现的函数。它的签名里只有三个类型,分开看。
|
|
111
111
|
|
|
112
112
|
<Note>
|
|
113
|
-
这里的 `setup` / `teardown` 是 Agent 自己"怎么连自己"的私事(装 CLI、写鉴权配置)。按实验变化的环境准备(装某个实验专属的二进制、预热、跨 attempt 保存状态)不写在 Agent 上,挂在 `sandbox` 字段那个 Sandbox spec 自己的 `.setup()` / `.teardown()` 链式方法上,见 [Sandbox 后端 · 环境钩子](/zh/guides/sandbox-
|
|
113
|
+
这里的 `setup` / `teardown` 是 Agent 自己"怎么连自己"的私事(装 CLI、写鉴权配置)。按实验变化的环境准备(装某个实验专属的二进制、预热、跨 attempt 保存状态)不写在 Agent 上,挂在 `sandbox` 字段那个 Sandbox spec 自己的 `.setup()` / `.teardown()` 链式方法上,见 [Sandbox 后端 · 环境钩子](/zh/guides/sandbox-providers#环境钩子)。
|
|
114
114
|
</Note>
|
|
115
115
|
|
|
116
116
|
### 传入:`TurnInput`
|
|
@@ -214,7 +214,7 @@ interface AgentSession {
|
|
|
214
214
|
}
|
|
215
215
|
```
|
|
216
216
|
|
|
217
|
-
`ctx` 里没有要你检查的标志位。三个档位字段都是"透传"语义:`model`、`flags` 由 experiment 声明、运行器原样递过来,Adapter 只负责随请求转发给应用,不解释它们的含义;`telemetry` 仅在配置了 OTel 接入时出现,`send` 里只需要把 `headers` spread 进请求头——接收端点在 `defineConfig` 里固定、由应用启动时指向,不从这里传,见[OTel 接入](/zh/guides/connect-otel)。`experimentId` 是路径推导出的稳定标识,典型用途是在 Sandbox 的环境钩子里按实验隔离跨 attempt
|
|
217
|
+
`ctx` 里没有要你检查的标志位。三个档位字段都是"透传"语义:`model`、`flags` 由 experiment 声明、运行器原样递过来,Adapter 只负责随请求转发给应用,不解释它们的含义;`telemetry` 仅在配置了 OTel 接入时出现,`send` 里只需要把 `headers` spread 进请求头——接收端点在 `defineConfig` 里固定、由应用启动时指向,不从这里传,见[OTel 接入](/zh/guides/connect-otel)。`experimentId` 是路径推导出的稳定标识,典型用途是在 Sandbox 的环境钩子里按实验隔离跨 attempt 的状态(缓存目录名、沙箱快照 tag 按它分区),见 [Sandbox 后端 · 环境钩子](/zh/guides/sandbox-providers#环境钩子)。
|
|
218
218
|
|
|
219
219
|
`session` 是本条会话线的自有状态,[NiceEval](https://niceeval.com/) 对它只承诺一件事:**同一条会话线的每次 `send` 拿到同一个 `ctx.session`,新会话线(eval 的第一轮,或 `t.newSession()` 之后)拿到一个全新的。** 会话续接(`id`/`capture`、`history`)和 HITL 停轮现场(`hold`/`take`)的存取器都在它上面,"第一轮"就是新会话线的自然形态——`id` 是 `undefined`、`history.get()` 是空数组,没有要判断的分支;`state` 是这些存取器之外的逃生舱,框架从不往里写数据。
|
|
220
220
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "NiceEval 断言:值、作用域事实、测试与成本"
|
|
3
3
|
sidebarTitle: "断言"
|
|
4
|
-
description: "NiceEval 的断言词汇——值断言、作用域断言、test-as-scoring 和效率断言——以及 gate / soft
|
|
4
|
+
description: "NiceEval 的断言词汇——值断言、作用域断言、test-as-scoring 和效率断言——以及 gate / soft 严重度和判定 verdict 的规则。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
断言把 agent 在一次 eval 里做的一切——每条消息、每次工具调用、每处文件改动、每一分 token——折叠成一个可解释的结果。[NiceEval](https://niceeval.com/) 提供四种互补的断言机制:有的立即检查一个值,有的在整轮跑完后评估整次运行,有的在沙箱里跑测试,有的衡量效率。四种都产出同一种 `Assertion`
|
|
7
|
+
断言把 agent 在一次 eval 里做的一切——每条消息、每次工具调用、每处文件改动、每一分 token——折叠成一个可解释的结果。[NiceEval](https://niceeval.com/) 提供四种互补的断言机制:有的立即检查一个值,有的在整轮跑完后评估整次运行,有的在沙箱里跑测试,有的衡量效率。四种都产出同一种 `Assertion` 类型,都进同一套判定规则。第五种机制——让语言模型评判开放式质量——见 [Judge](/zh/concepts/judge)。
|
|
8
8
|
|
|
9
9
|
## 四种断言机制
|
|
10
10
|
|
|
@@ -23,9 +23,9 @@ description: "NiceEval 的断言词汇——值断言、作用域断言、test-a
|
|
|
23
23
|
</Card>
|
|
24
24
|
</CardGroup>
|
|
25
25
|
|
|
26
|
-
## gate 与 soft
|
|
26
|
+
## gate 与 soft 严重度
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
每条断言都带一个**严重度**,决定它如何影响最终判定,只有两档:
|
|
29
29
|
|
|
30
30
|
<Tabs>
|
|
31
31
|
<Tab title="gate">
|
|
@@ -42,7 +42,7 @@ description: "NiceEval 的断言词汇——值断言、作用域断言、test-a
|
|
|
42
42
|
</Tab>
|
|
43
43
|
</Tabs>
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
在任意匹配器或断言上用链式方法覆盖默认严重度:
|
|
46
46
|
|
|
47
47
|
```ts
|
|
48
48
|
t.check(t.reply, includes("confirmed")); // 默认 gate
|
|
@@ -50,7 +50,7 @@ t.check(t.reply, similarity(expected).gate()); // 提升为 gate
|
|
|
50
50
|
t.maxTokens(80_000).atLeast(0.7); // 降为 soft 并带阈值
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
##
|
|
53
|
+
## 判定规则
|
|
54
54
|
|
|
55
55
|
所有断言收齐后,运行器按这个顺序折叠成一个结果:
|
|
56
56
|
|
|
@@ -77,7 +77,7 @@ t.maxTokens(80_000).atLeast(0.7); // 降为 soft 并带阈值
|
|
|
77
77
|
</Card>
|
|
78
78
|
</CardGroup>
|
|
79
79
|
|
|
80
|
-
多次运行(`runs > 1`)时,单个 eval 的汇总变成**通过率**(产出 `passed` 的运行占比)和平均耗时,而不是单一
|
|
80
|
+
多次运行(`runs > 1`)时,单个 eval 的汇总变成**通过率**(产出 `passed` 的运行占比)和平均耗时,而不是单一 verdict。
|
|
81
81
|
|
|
82
82
|
## 1. 值断言 —— `niceeval/expect` 匹配器
|
|
83
83
|
|
|
@@ -240,4 +240,4 @@ t.check(t.reply, jsonValid());
|
|
|
240
240
|
- [Drive](/zh/concepts/drive) — `t.send()`、`t.newSession()` 和 HITL:这些断言读的 Turn 数据是怎么产出的。
|
|
241
241
|
- [Judge](/zh/concepts/judge) — 第五种评分机制,评无法写成固定规则的开放式质量。
|
|
242
242
|
- [写 send](/zh/guides/write-send) — 标准事件流如何产出,作用域断言依赖它什么。
|
|
243
|
-
- [Evals](/zh/concepts/evals) — 断言如何折进 eval 生命周期和
|
|
243
|
+
- [Evals](/zh/concepts/evals) — 断言如何折进 eval 生命周期和 verdict 类型。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "NiceEval 中的 eval:生命周期、
|
|
2
|
+
title: "NiceEval 中的 eval:生命周期、verdict 与文件"
|
|
3
3
|
sidebarTitle: "评估"
|
|
4
4
|
description: "eval 是一个测试用例:描述、agent 引用和 test 函数。了解 eval 如何被发现、调度、评分和报告。"
|
|
5
5
|
---
|
|
@@ -61,15 +61,15 @@ npx niceeval exp local weather/brooklyn
|
|
|
61
61
|
<Step title="Scoring">
|
|
62
62
|
[NiceEval](https://niceeval.com/) 收集值断言、作用域断言、judge 分数和测试结果。
|
|
63
63
|
</Step>
|
|
64
|
-
<Step title="
|
|
65
|
-
所有断言结果折叠成一个最终
|
|
64
|
+
<Step title="Verdict">
|
|
65
|
+
所有断言结果折叠成一个最终 verdict。
|
|
66
66
|
</Step>
|
|
67
67
|
<Step title="Report">
|
|
68
68
|
控制台和 reporters 输出结果,同时写入 `.niceeval/` artifacts。
|
|
69
69
|
</Step>
|
|
70
70
|
</Steps>
|
|
71
71
|
|
|
72
|
-
##
|
|
72
|
+
## Verdict 类型
|
|
73
73
|
|
|
74
74
|
<CardGroup cols={2}>
|
|
75
75
|
<Card title="passed" icon="circle-check" color="#22c55e">
|
|
@@ -121,4 +121,4 @@ export default rows.map((row) =>
|
|
|
121
121
|
## 相关阅读
|
|
122
122
|
|
|
123
123
|
- [实验](/zh/concepts/experiment) — 另一半:评谁、怎么跑;为什么和 eval 分开(晚绑定)。
|
|
124
|
-
- [Assert](/zh/concepts/assert) — gate 与 soft
|
|
124
|
+
- [Assert](/zh/concepts/assert) — gate 与 soft 的完整判定规则。
|
|
@@ -25,7 +25,7 @@ export default defineExperiment({
|
|
|
25
25
|
- `model` / `flags`:透传语义。[NiceEval](https://niceeval.com/) 不解释它们的含义,原样经 `ctx` 递给 Adapter,由 Adapter 随请求转发、应用按需切换——这正是 [Tier](/zh/concepts/tier) 里模型对比(Tier 1)和 feature A/B(Tier 3)的通道。
|
|
26
26
|
- `runs`、`budget`、并发、`sandbox` 等运行参数:怎么跑、跑多少。完整字段见[写实验](/zh/guides/write-experiment)。
|
|
27
27
|
|
|
28
|
-
Experiment 是纯配置数据,没有 `setup` / `teardown` 这类生命周期字段。要按实验准备环境(装二进制、预热、跨 attempt 存取状态),挂在 `sandbox` 字段的 spec 上——`dockerSandbox()` 等工厂返回的对象可以链 `.setup()` / `.teardown()`,见 [Sandbox 后端 · 环境钩子](/zh/guides/sandbox-
|
|
28
|
+
Experiment 是纯配置数据,没有 `setup` / `teardown` 这类生命周期字段。要按实验准备环境(装二进制、预热、跨 attempt 存取状态),挂在 `sandbox` 字段的 spec 上——`dockerSandbox()` 等工厂返回的对象可以链 `.setup()` / `.teardown()`,见 [Sandbox 后端 · 环境钩子](/zh/guides/sandbox-providers#环境钩子)。
|
|
29
29
|
|
|
30
30
|
## 矩阵对比
|
|
31
31
|
|
|
@@ -35,5 +35,5 @@ Experiment 是纯配置数据,没有 `setup` / `teardown` 这类生命周期
|
|
|
35
35
|
|
|
36
36
|
- [写实验](/zh/guides/write-experiment) — `defineExperiment` 的完整字段:runs、预算、并发与 sandbox。
|
|
37
37
|
- [实验矩阵](/zh/guides/experiments) — 跨 agent / model / flags 的对比怎么组织、怎么读结果。
|
|
38
|
-
- [评估](/zh/concepts/evals) — 另一半:eval 是什么、生命周期与
|
|
38
|
+
- [评估](/zh/concepts/evals) — 另一半:eval 是什么、生命周期与 verdict。
|
|
39
39
|
- [Tier](/zh/concepts/tier) — `model` / `flags` 各在哪一档生效。
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "NiceEval 里的 LLM-as-judge: 给开放式输出打分"
|
|
3
3
|
sidebarTitle: "评判"
|
|
4
|
-
description: "t.judge / session.judge / turn.judge
|
|
4
|
+
description: "t.judge / session.judge / turn.judge 如何用独立裁判模型评估事实性、闭合式质量和摘要忠实度,以及模型解析优先级和严重度。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
judge 断言是第五种评分机制,和 [Assert](/zh/concepts/assert)
|
|
7
|
+
judge 断言是第五种评分机制,和 [Assert](/zh/concepts/assert) 里的四种并列。用在“对不对靠规则说不清”的地方——开放式行文、语气、事实一致性、摘要质量。裁判模型和被测 agent **完全分离**,避免自评:同一个模型给自己的输出打分,天然会打得偏高。
|
|
8
8
|
|
|
9
9
|
```ts
|
|
10
10
|
t.judge.autoevals.factuality(reference).atLeast(0.8); // 与参考文本的事实一致性
|
|
@@ -21,7 +21,7 @@ t.judge.autoevals.closedQA("自定义评分标准描述", { on: t.reply });
|
|
|
21
21
|
- **`factuality(reference, opts?)`** —— 输出和你给的参考文本之间的事实一致性。
|
|
22
22
|
- **`summarizes(source, opts?)`** —— 输出是否忠实摘要了某个源文档。
|
|
23
23
|
|
|
24
|
-
`{ on }` 指定被评的值,默认值按接收者决定(见下文);`{ model }`
|
|
24
|
+
`{ on }` 指定被评的值,默认值按接收者决定(见下文);`{ model }` 单次覆盖裁判模型。
|
|
25
25
|
|
|
26
26
|
## judge 挂在哪:`t`、`session`、`turn`
|
|
27
27
|
|
|
@@ -57,7 +57,7 @@ t.judge.autoevals.closedQA("生成的代码是否是地道的 TypeScript?", {
|
|
|
57
57
|
|
|
58
58
|
## judge 模型解析优先级
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
裁判模型按从具体到笼统解析:
|
|
61
61
|
|
|
62
62
|
```
|
|
63
63
|
单次调用的 { model } 选项
|
|
@@ -87,7 +87,7 @@ t.judge.autoevals.closedQA("rubric", { on: t.reply, model: "openai/gpt-4o" });
|
|
|
87
87
|
|
|
88
88
|
## 评判端点与 key:OpenAI 兼容协议
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
裁判模型走 **OpenAI 兼容的 `/chat/completions`** 协议。OpenAI 官方、DeepSeek,以及任何兼容这个协议的网关都能当评判端点,在 `judge` 配置里指定:
|
|
91
91
|
|
|
92
92
|
```ts
|
|
93
93
|
// niceeval.config.ts
|
|
@@ -111,9 +111,9 @@ defineConfig({
|
|
|
111
111
|
key 一个都解析不到时,judge 断言**静默跳过**——不报错、不记分,eval 照常跑。全绿不代表 judge 真的评过。配完 key 先跑一条带 `t.judge` 的 eval,在 `niceeval view` 里确认出现了 judge 分数。
|
|
112
112
|
</Warning>
|
|
113
113
|
|
|
114
|
-
##
|
|
114
|
+
## 严重度:judge 默认 soft
|
|
115
115
|
|
|
116
|
-
judge 调用和其它断言一样是评分函数,遵守 [Assert · gate 与 soft
|
|
116
|
+
judge 调用和其它断言一样是评分函数,遵守 [Assert · gate 与 soft 严重度](/zh/concepts/assert#gate-与-soft-严重度) 同一套机制——只是**默认值**和大多数值匹配器不同:
|
|
117
117
|
|
|
118
118
|
```ts
|
|
119
119
|
t.judge.autoevals.closedQA("语气是否礼貌?"); // 不带阈值 → soft,纯记分,永不让 eval 失败
|
|
@@ -125,6 +125,6 @@ t.judge.autoevals.closedQA("语气是否礼貌?").gate(); // 提升为 gat
|
|
|
125
125
|
|
|
126
126
|
## 相关阅读
|
|
127
127
|
|
|
128
|
-
- [Assert](/zh/concepts/assert) — gate / soft
|
|
128
|
+
- [Assert](/zh/concepts/assert) — gate / soft 严重度的完整规则,以及 judge 分数最终折进的判定规则。
|
|
129
129
|
- [Drive](/zh/concepts/drive) — `t.send()`、`t.newSession()`,以及 `t.judge` / `session.judge` / `turn.judge` 各自挂在哪个 handle 上。
|
|
130
|
-
- [Evals](/zh/concepts/evals) — judge 分数如何折进 eval 生命周期和
|
|
130
|
+
- [Evals](/zh/concepts/evals) — judge 分数如何折进 eval 生命周期和 verdict 类型。
|
|
@@ -96,7 +96,7 @@ Subject under test / Sandbox backend
|
|
|
96
96
|
<Step title="Scheduling">根据并发、缓存和 attempt 计划运行。</Step>
|
|
97
97
|
<Step title="Agent send">调用 adapter,让被测对象产出 `Turn`。</Step>
|
|
98
98
|
<Step title="Scoring">执行断言、judge 和测试。</Step>
|
|
99
|
-
<Step title="
|
|
99
|
+
<Step title="Verdict">把所有结果折叠为 `passed`、`failed`、`errored` 或 `skipped`。</Step>
|
|
100
100
|
<Step title="Reporting & artifacts">输出报告并保存结构化文件。</Step>
|
|
101
101
|
</Steps>
|
|
102
102
|
|
|
@@ -105,5 +105,5 @@ Subject under test / Sandbox backend
|
|
|
105
105
|
- [Evals](/zh/concepts/evals) — eval 是什么,以及生命周期细节。
|
|
106
106
|
- [Adapter](/zh/concepts/adapter) — 如何写 adapter,并在 experiment 中引用它。
|
|
107
107
|
- [Drive](/zh/concepts/drive) — `t.send()`、session 与 HITL:如何产出断言要读的 `Turn` 数据。
|
|
108
|
-
- [Assert](/zh/concepts/assert) —
|
|
108
|
+
- [Assert](/zh/concepts/assert) — 断言词汇和判定规则。
|
|
109
109
|
- [Judge](/zh/concepts/judge) — LLM-as-judge,评开放式质量。
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "
|
|
3
|
-
sidebarTitle: "
|
|
4
|
-
description: "按「Adapter
|
|
2
|
+
title: "接入等级(Tier):三级投入,三组能力"
|
|
3
|
+
sidebarTitle: "接入等级"
|
|
4
|
+
description: "按「Adapter 接到哪里、额外拿到什么观测数据」接入分三级:Tier 1 只接 send,Tier 2 加 OTel,Tier 3 侵入改造暴露 experiment flags。每档买到什么、什么时候升级。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
接入 [NiceEval](https://niceeval.com/) 不是全有或全无的一次性工程。按「Adapter
|
|
7
|
+
接入 [NiceEval](https://niceeval.com/) 不是全有或全无的一次性工程。按「Adapter 接到哪里、额外拿到什么观测数据」,接入分三级——每一级在上一级之上加一种投入、换一组新能力,已写的 eval 全程复用,不用改。
|
|
8
8
|
|
|
9
9
|

|
|
10
10
|
|
|
@@ -12,7 +12,7 @@ description: "按「Adapter 接到哪里、额外拿到什么观测数据」接
|
|
|
12
12
|
|
|
13
13
|
应用代码一行不改,接入只有一个 Adapter 文件——`send` 对着用户前端本来就在用的那个接口收发。
|
|
14
14
|
|
|
15
|
-
**全套断言都在这一档**:文本断言与 judge、结构化输出校验、多轮与会话隔离、HITL 审批流、事件映射给到的工具断言,以及 `send` 返回 usage
|
|
15
|
+
**全套断言都在这一档**:文本断言与 judge、结构化输出校验、多轮与会话隔离、HITL 审批流、事件映射给到的工具断言,以及 `send` 返回 usage 带来的用量断言——判定依据全部来自 `send` 返回的 `Turn`,后面两档不会再多出任何断言。应用接口本身暴露模型选择的话,**模型对比** experiment 也在这一档——experiment 的 `model` 经 `ctx.model` 传给 Adapter,随请求转发即可。
|
|
16
16
|
|
|
17
17
|
大多数团队从这里开始,很多也停在这里就够了。
|
|
18
18
|
|
|
@@ -34,7 +34,7 @@ description: "按「Adapter 接到哪里、额外拿到什么观测数据」接
|
|
|
34
34
|
|
|
35
35
|
## 怎么升级
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
三级递进不互斥:先用 Tier 1 跑通基线和模型对比;要调用瀑布图,升 Tier 2;要对照应用内部变体,再升 Tier 3。每次升级都只是给 Adapter 或应用加东西,experiment 侧怎么组织对比见[实验](/zh/concepts/experiment)。
|
|
38
38
|
|
|
39
39
|
## 相关阅读
|
|
40
40
|
|
|
@@ -6,12 +6,12 @@ description: "用 NiceEval 把 coding-agent 插件放进真实 workspace,比
|
|
|
6
6
|
|
|
7
7
|
如果你在给 Claude Code、Codex 或其它 coding agent 写插件,最有价值的 eval 不是问它“会不会用插件”,而是把插件放进真实 workspace,让 agent 完成一组真实开发任务,再比较有插件和无插件时的 pass rate、耗时、成本和 diff。
|
|
8
8
|
|
|
9
|
-
当前可运行示例在 [
|
|
9
|
+
当前可运行示例在 [coding-agent-skill](https://github.com/CorrectRoadH/coding-agent-skill),一个独立仓库。其中的 Ponytail 组就是一个插件 benchmark 迁移示例:把第三方 Ponytail skill/plugin 的 agentic benchmark 改写成 [NiceEval](https://niceeval.com/) eval,并与无插件 baseline 对比。
|
|
10
10
|
|
|
11
11
|
## 目录结构
|
|
12
12
|
|
|
13
13
|
```text
|
|
14
|
-
|
|
14
|
+
coding-agent-skill/
|
|
15
15
|
├─ niceeval.config.ts
|
|
16
16
|
├─ skills/
|
|
17
17
|
│ └─ ponytail.md
|
|
@@ -133,9 +133,13 @@ export default defineEval({
|
|
|
133
133
|
## 运行对比
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
|
-
|
|
136
|
+
git clone https://github.com/CorrectRoadH/coding-agent-skill.git
|
|
137
|
+
cd coding-agent-skill
|
|
137
138
|
pnpm install
|
|
138
|
-
pnpm exec niceeval exp ponytail
|
|
139
|
+
pnpm exec niceeval exp ponytail-baseline
|
|
140
|
+
pnpm exec niceeval exp caveman
|
|
141
|
+
pnpm exec niceeval exp ponytail
|
|
142
|
+
pnpm exec niceeval exp yagni-oneliner
|
|
139
143
|
pnpm exec niceeval view
|
|
140
144
|
```
|
|
141
145
|
|
|
@@ -153,7 +157,7 @@ pnpm exec niceeval view
|
|
|
153
157
|
|
|
154
158
|
```text
|
|
155
159
|
READ docs-site/zh/example/claude-code-codex-plugin.mdx and install niceeval for this repo.
|
|
156
|
-
Use
|
|
160
|
+
Use https://github.com/CorrectRoadH/coding-agent-skill as the reference shape: put the plugin in skills/, inject it from an experiment setup hook, write one .eval.ts task against a real workspace, then add a no-plugin baseline experiment.
|
|
157
161
|
```
|
|
158
162
|
|
|
159
163
|
## 下一步
|
|
@@ -6,7 +6,7 @@ description: "用 NiceEval 对比有 Skill 和无 Skill 的 coding-agent 任务
|
|
|
6
6
|
|
|
7
7
|
Skill 的价值不只是“agent 最后答案对不对”,还包括它是否在正确场景遵循你的流程、是否避免反模式、是否稳定提升通过率、成本和耗时。[NiceEval](https://niceeval.com/) 的推荐做法是把 Skill 注入到 sandbox 里的真实 coding-agent 工作区,再与无 Skill baseline 对比。
|
|
8
8
|
|
|
9
|
-
当前可运行示例在 [
|
|
9
|
+
当前可运行示例在 [coding-agent-skill](https://github.com/CorrectRoadH/coding-agent-skill),一个独立仓库。它包含两组实验:
|
|
10
10
|
|
|
11
11
|
- Zod skill:自编写 `skills/zod.md`,验证 agent 是否用 Zod 做请求体和环境变量校验。
|
|
12
12
|
- Ponytail plugin:迁移第三方 Ponytail benchmark,验证安全、复用和简洁性。
|
|
@@ -14,7 +14,7 @@ Skill 的价值不只是“agent 最后答案对不对”,还包括它是否
|
|
|
14
14
|
## 目录结构
|
|
15
15
|
|
|
16
16
|
```text
|
|
17
|
-
|
|
17
|
+
coding-agent-skill/
|
|
18
18
|
├─ skills/
|
|
19
19
|
│ ├─ zod.md
|
|
20
20
|
│ └─ ponytail.md
|
|
@@ -120,14 +120,19 @@ export default defineEval({
|
|
|
120
120
|
## 运行
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
|
-
|
|
123
|
+
git clone https://github.com/CorrectRoadH/coding-agent-skill.git
|
|
124
|
+
cd coding-agent-skill
|
|
124
125
|
pnpm install
|
|
125
126
|
|
|
126
|
-
# Zod skill A/B 对比
|
|
127
|
-
pnpm exec niceeval exp
|
|
127
|
+
# Zod skill A/B 对比(各是独立实验文件,不是同一个 group,分开跑)
|
|
128
|
+
pnpm exec niceeval exp with-skill
|
|
129
|
+
pnpm exec niceeval exp baseline
|
|
128
130
|
|
|
129
|
-
# Ponytail plugin
|
|
130
|
-
pnpm exec niceeval exp ponytail
|
|
131
|
+
# Ponytail plugin:baseline / caveman / ponytail / yagni-oneliner 四臂对比
|
|
132
|
+
pnpm exec niceeval exp ponytail-baseline
|
|
133
|
+
pnpm exec niceeval exp caveman
|
|
134
|
+
pnpm exec niceeval exp ponytail
|
|
135
|
+
pnpm exec niceeval exp yagni-oneliner
|
|
131
136
|
|
|
132
137
|
pnpm exec niceeval view
|
|
133
138
|
```
|