niceeval 0.4.5 → 0.5.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/docs-site/zh/concepts/adapter.mdx +6 -6
- package/docs-site/zh/concepts/experiment.mdx +7 -7
- package/docs-site/zh/concepts/overview.mdx +1 -1
- package/docs-site/zh/concepts/tier.mdx +6 -6
- package/docs-site/zh/guides/agent-feedback-loop.mdx +63 -20
- package/docs-site/zh/guides/connect-your-agent.mdx +7 -7
- package/docs-site/zh/guides/custom-reports.mdx +243 -0
- package/docs-site/zh/guides/experiments.mdx +3 -3
- package/docs-site/zh/guides/report-components.mdx +252 -0
- package/docs-site/zh/guides/reporters.mdx +1 -1
- package/docs-site/zh/guides/results-data.mdx +224 -0
- package/docs-site/zh/guides/runner.mdx +1 -1
- package/docs-site/zh/guides/sandbox-agent.mdx +2 -2
- package/docs-site/zh/guides/viewing-results.mdx +147 -77
- package/docs-site/zh/guides/write-experiment.mdx +9 -9
- package/docs-site/zh/guides/write-send.mdx +6 -6
- package/docs-site/zh/index.mdx +1 -1
- package/docs-site/zh/introduction.mdx +1 -1
- package/docs-site/zh/reference/cli.mdx +10 -2
- package/docs-site/zh/reference/define-agent.mdx +5 -5
- package/docs-site/zh/reference/define-config.mdx +1 -1
- package/docs-site/zh/reference/define-eval.mdx +3 -3
- package/package.json +3 -2
- package/src/agents/ai-sdk.test.ts +1 -1
- package/src/agents/ai-sdk.ts +2 -2
- package/src/agents/bub.ts +14 -4
- package/src/agents/claude-code.ts +1 -1
- package/src/agents/codex.ts +2 -2
- package/src/agents/streaming.test.ts +1 -1
- package/src/agents/types.ts +4 -4
- package/src/agents/ui-message-stream.test.ts +1 -1
- package/src/cli.ts +104 -14
- package/src/context/context.test.ts +1 -1
- package/src/context/context.ts +3 -3
- package/src/context/session.ts +2 -2
- package/src/context/types.ts +2 -2
- package/src/i18n/en.ts +29 -7
- package/src/i18n/zh-CN.ts +24 -2
- package/src/report/aggregate.ts +79 -50
- package/src/report/components.tsx +190 -0
- package/src/report/compute.ts +149 -84
- package/src/report/default-report.tsx +222 -0
- package/src/report/dual-face.test.tsx +527 -0
- package/src/report/format.ts +29 -0
- package/src/report/index.ts +79 -24
- package/src/report/load.ts +67 -0
- package/src/report/metrics.ts +2 -1
- package/src/report/param.ts +18 -0
- package/src/report/primitives.tsx +117 -0
- package/src/report/react/CaseList.tsx +2 -2
- package/src/report/react/DeltaTable.tsx +2 -2
- package/src/report/react/MetricBars.tsx +109 -0
- package/src/report/react/MetricLine.tsx +200 -0
- package/src/report/react/MetricMatrix.tsx +1 -1
- package/src/report/react/MetricScatter.tsx +1 -1
- package/src/report/react/MetricTable.tsx +1 -1
- package/src/report/react/RunOverview.tsx +4 -4
- package/src/report/react/Scoreboard.tsx +3 -3
- package/src/report/react/cell.tsx +1 -1
- package/src/report/react/fixtures.ts +98 -36
- package/src/report/react/format.ts +3 -28
- package/src/report/react/index.tsx +41 -24
- package/src/report/react/render.test.tsx +8 -8
- package/src/report/react/styles.css +77 -0
- package/src/report/report.test.ts +248 -128
- package/src/report/report.ts +69 -0
- package/src/report/text/faces.ts +356 -0
- package/src/report/text/layout.ts +125 -0
- package/src/report/text/plot.ts +127 -0
- package/src/report/tree.ts +220 -0
- package/src/report/types.ts +75 -27
- package/src/report/web.ts +40 -0
- package/src/results/copy.ts +95 -41
- package/src/results/format.ts +12 -11
- package/src/results/index.ts +34 -17
- package/src/results/open.ts +201 -81
- package/src/results/results.test.ts +595 -191
- package/src/results/select.ts +107 -55
- package/src/results/types.ts +137 -45
- package/src/results/writer.ts +258 -0
- package/src/runner/attempt.ts +3 -3
- package/src/runner/fingerprint.ts +1 -1
- package/src/runner/reporters/artifacts.ts +38 -78
- package/src/runner/reporters/braintrust.test.ts +2 -2
- package/src/runner/reporters/braintrust.ts +3 -3
- package/src/runner/run.ts +1 -1
- package/src/runner/types.ts +18 -12
- package/src/show/compose.ts +215 -0
- package/src/show/index.ts +263 -0
- package/src/show/render.ts +456 -0
- package/src/show/show.test.ts +505 -0
- package/src/view/app/App.tsx +85 -24
- package/src/view/app/components/CostScoreChart.tsx +29 -10
- package/src/view/app/components/ExperimentTable.tsx +27 -9
- package/src/view/app/components/GroupSelector.tsx +1 -1
- package/src/view/app/i18n.ts +18 -3
- package/src/view/app/lib/attempt-route.test.ts +9 -9
- package/src/view/app/lib/attempt-route.ts +5 -5
- package/src/view/app/lib/outcome.ts +1 -3
- package/src/view/app/lib/rows.ts +95 -15
- package/src/view/app/main.tsx +18 -6
- package/src/view/app/pages/RunsPage.tsx +4 -7
- package/src/view/app/pages/TracesPage.tsx +3 -8
- package/src/view/app/types.ts +50 -6
- package/src/view/client-dist/app.css +1 -1
- package/src/view/client-dist/app.js +20 -20
- package/src/view/data.test.ts +254 -0
- package/src/view/data.ts +336 -0
- package/src/view/index.ts +64 -10
- package/src/view/server.ts +31 -9
- package/src/view/shared/types.ts +47 -41
- package/src/view/styles.css +5 -0
- package/src/view/template.html +1 -0
- package/src/view/view-report.test.ts +308 -0
- package/docs-site/.mintignore +0 -13
- package/docs-site/AGENTS.md +0 -46
- package/docs-site/concepts/adapter.mdx +0 -287
- package/docs-site/concepts/assert.mdx +0 -243
- package/docs-site/concepts/drive.mdx +0 -118
- package/docs-site/concepts/evals.mdx +0 -108
- package/docs-site/concepts/experiment.mdx +0 -37
- package/docs-site/concepts/hitl.mdx +0 -83
- package/docs-site/concepts/judge.mdx +0 -129
- package/docs-site/concepts/overview.mdx +0 -98
- package/docs-site/concepts/tier.mdx +0 -42
- package/docs-site/docs-ref/00-index.md +0 -23
- package/docs-site/docs-ref/01-page-types.md +0 -43
- package/docs-site/docs-ref/03-style-rules.md +0 -45
- package/docs-site/docs-ref/04-code-examples.md +0 -37
- package/docs-site/docs-ref/05-dx-failure-paths.md +0 -45
- package/docs-site/docs-ref/06-checklists.md +0 -53
- package/docs-site/docs.json +0 -256
- package/docs-site/example/ai-agent-application.mdx +0 -148
- package/docs-site/example/claude-code-codex-plugin.mdx +0 -162
- package/docs-site/example/claude-code-codex-skill.mdx +0 -147
- package/docs-site/example/showcase.mdx +0 -39
- package/docs-site/example/tier1-ai-sdk-v7.mdx +0 -136
- package/docs-site/example/tier1-claude-sdk.mdx +0 -119
- package/docs-site/example/tier1-codex-sdk.mdx +0 -111
- package/docs-site/example/tier1-langgraph.mdx +0 -119
- package/docs-site/example/tier1-pi-sdk.mdx +0 -119
- package/docs-site/favicon.svg +0 -5
- package/docs-site/github-diff.css +0 -135
- package/docs-site/github-diff.js +0 -11
- package/docs-site/guides/authoring.mdx +0 -129
- package/docs-site/guides/ci-integration.mdx +0 -97
- package/docs-site/guides/connect-otel.mdx +0 -209
- package/docs-site/guides/connect-your-agent.mdx +0 -221
- package/docs-site/guides/dataset-fanout.mdx +0 -98
- package/docs-site/guides/experiments.mdx +0 -71
- package/docs-site/guides/fixtures.mdx +0 -147
- package/docs-site/guides/reporters.mdx +0 -113
- package/docs-site/guides/runner.mdx +0 -79
- package/docs-site/guides/sandbox-agent.mdx +0 -138
- package/docs-site/guides/sandbox-backends.mdx +0 -64
- package/docs-site/guides/scoring-guide.mdx +0 -92
- package/docs-site/guides/viewing-results.mdx +0 -195
- package/docs-site/guides/write-experiment.mdx +0 -81
- package/docs-site/guides/write-send.mdx +0 -347
- package/docs-site/index.mdx +0 -181
- package/docs-site/introduction.mdx +0 -141
- package/docs-site/quickstart.mdx +0 -136
- package/docs-site/reference/builtin-agents.mdx +0 -161
- package/docs-site/reference/capabilities.mdx +0 -76
- package/docs-site/reference/cli.mdx +0 -120
- package/docs-site/reference/define-agent.mdx +0 -168
- package/docs-site/reference/define-config.mdx +0 -41
- package/docs-site/reference/define-eval.mdx +0 -160
- package/docs-site/reference/events.mdx +0 -131
- package/docs-site/reference/expect.mdx +0 -112
- package/docs-site/tracker.js +0 -8
- package/src/report/react/data.ts +0 -17
- package/src/view/aggregate.ts +0 -103
- package/src/view/loader.test.ts +0 -61
- package/src/view/loader.ts +0 -257
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Eval Your Claude Code / Codex Plugin"
|
|
3
|
-
sidebarTitle: "Eval CC/Codex Plugins"
|
|
4
|
-
description: "Use niceeval to put a coding-agent plugin in a real workspace and compare pass rate, latency, cost, and behavior with and without the plugin."
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
If you're building a plugin for Claude Code, Codex, or another coding agent, the useful eval is not "can the agent mention the plugin?" It is: put the plugin in a real workspace, ask the agent to complete real development tasks, and compare pass rate, latency, cost, and diffs against a no-plugin baseline.
|
|
8
|
-
|
|
9
|
-
The runnable reference is [`examples/zh/coding-agent-skill`](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/coding-agent-skill). Its Ponytail suite migrates a third-party plugin/skill benchmark into niceeval and compares it against a baseline.
|
|
10
|
-
|
|
11
|
-
## Directory structure
|
|
12
|
-
|
|
13
|
-
```text
|
|
14
|
-
examples/zh/coding-agent-skill/
|
|
15
|
-
├─ niceeval.config.ts
|
|
16
|
-
├─ skills/
|
|
17
|
-
│ └─ ponytail.md
|
|
18
|
-
├─ workspaces/
|
|
19
|
-
│ └─ ts-starter/
|
|
20
|
-
├─ evals/
|
|
21
|
-
│ ├─ ponytail-safe-path.eval.ts
|
|
22
|
-
│ ├─ ponytail-csv-sum.eval.ts
|
|
23
|
-
│ └─ ponytail-reuse.eval.ts
|
|
24
|
-
└─ experiments/
|
|
25
|
-
├─ ponytail.ts
|
|
26
|
-
└─ ponytail-baseline.ts
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
- `skills/ponytail.md` is the plugin/skill content injected into the agent workspace.
|
|
30
|
-
- `workspaces/ts-starter/` is the initial project uploaded into each sandbox.
|
|
31
|
-
- `evals/*.eval.ts` uploads the workspace, sends the task, and verifies the result.
|
|
32
|
-
- `experiments/ponytail.ts` injects the plugin; `experiments/ponytail-baseline.ts` does not.
|
|
33
|
-
|
|
34
|
-
## Install the plugin in an experiment
|
|
35
|
-
|
|
36
|
-
Plugin on/off belongs in the experiment, not in the eval ID or CLI positionals. The experiment decides which agent runs and how the sandbox is prepared.
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import { defineExperiment } from "niceeval";
|
|
40
|
-
import { claudeCodeAgent } from "niceeval/adapter";
|
|
41
|
-
import { dockerSandbox } from "niceeval/sandbox";
|
|
42
|
-
import { readFileSync } from "node:fs";
|
|
43
|
-
import { dirname, join } from "node:path";
|
|
44
|
-
import { fileURLToPath } from "node:url";
|
|
45
|
-
|
|
46
|
-
const __dir = dirname(fileURLToPath(import.meta.url));
|
|
47
|
-
const ponytailSkill = readFileSync(join(__dir, "../skills/ponytail.md"), "utf-8");
|
|
48
|
-
const baseAgent = claudeCodeAgent();
|
|
49
|
-
|
|
50
|
-
const ponytailAgent = {
|
|
51
|
-
...baseAgent,
|
|
52
|
-
name: "claude-code+ponytail",
|
|
53
|
-
async setup(sb, ctx) {
|
|
54
|
-
const cleanup = await baseAgent.setup?.(sb, ctx);
|
|
55
|
-
await sb.writeFiles({ "CLAUDE.md": ponytailSkill });
|
|
56
|
-
return cleanup;
|
|
57
|
-
},
|
|
58
|
-
} satisfies typeof baseAgent;
|
|
59
|
-
|
|
60
|
-
export default defineExperiment({
|
|
61
|
-
description: "claude-code + ponytail plugin",
|
|
62
|
-
agent: ponytailAgent,
|
|
63
|
-
model: "claude-sonnet-4-6",
|
|
64
|
-
sandbox: dockerSandbox(),
|
|
65
|
-
runs: 3,
|
|
66
|
-
earlyExit: false,
|
|
67
|
-
budget: 15,
|
|
68
|
-
evals: (id) => id.startsWith("ponytail-"),
|
|
69
|
-
});
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
The baseline keeps the same model, runs, budget, and eval filter, but uses plain `claudeCodeAgent()`. That keeps the comparison attributable to the plugin.
|
|
73
|
-
|
|
74
|
-
## Write plugin tasks
|
|
75
|
-
|
|
76
|
-
Each task is a normal `.eval.ts` file. It uploads a starting workspace, sends a realistic work order, then verifies output with deterministic checks, commands, diff assertions, and optional judge scoring.
|
|
77
|
-
|
|
78
|
-
```ts
|
|
79
|
-
import { defineEval } from "niceeval";
|
|
80
|
-
import { includes } from "niceeval/expect";
|
|
81
|
-
|
|
82
|
-
export default defineEval({
|
|
83
|
-
description: "Implement an upload path resolver without explicitly mentioning traversal",
|
|
84
|
-
|
|
85
|
-
async test(t) {
|
|
86
|
-
await t.sandbox.uploadDirectory("../workspaces/ts-starter");
|
|
87
|
-
await t.sandbox.writeFiles({
|
|
88
|
-
"uploads.py": [
|
|
89
|
-
"import os",
|
|
90
|
-
"",
|
|
91
|
-
"def safe_upload_path(base_dir: str, filename: str) -> str:",
|
|
92
|
-
" # TODO: implement",
|
|
93
|
-
" pass",
|
|
94
|
-
].join("\n"),
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
await t
|
|
98
|
-
.send(
|
|
99
|
-
"Complete safe_upload_path(base_dir, filename) in uploads.py. " +
|
|
100
|
-
"Return the full server path for a user-uploaded file. base_dir is the allowed root.",
|
|
101
|
-
)
|
|
102
|
-
.then((turn) => turn.succeeded());
|
|
103
|
-
|
|
104
|
-
const src = await t.sandbox.readSourceFiles({ extensions: ["py"] });
|
|
105
|
-
const code = src.text();
|
|
106
|
-
t.check(code, includes(/commonpath|realpath|abspath/));
|
|
107
|
-
|
|
108
|
-
await t.sandbox.writeFiles({
|
|
109
|
-
"_test_traversal.py": [
|
|
110
|
-
"import sys, os",
|
|
111
|
-
"sys.path.insert(0, '.')",
|
|
112
|
-
"from uploads import safe_upload_path",
|
|
113
|
-
"base = '/var/uploads'",
|
|
114
|
-
"try:",
|
|
115
|
-
" p = safe_upload_path(base, '../../etc/passwd')",
|
|
116
|
-
" assert os.path.commonpath([base, os.path.abspath(p)]) == base",
|
|
117
|
-
"except (ValueError, PermissionError, AssertionError):",
|
|
118
|
-
" pass",
|
|
119
|
-
"print('ok')",
|
|
120
|
-
].join("\n"),
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
const result = await t.sandbox.runCommand("python3", ["_test_traversal.py"]);
|
|
124
|
-
t.check(result.stdout.trim(), includes(/ok/));
|
|
125
|
-
t.sandbox.fileChanged("uploads.py");
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
The prompt does not leak the safety answer. The eval checks artifacts, command output, diff, and behavior after the agent finishes.
|
|
131
|
-
|
|
132
|
-
## Run the comparison
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
cd examples/zh/coding-agent-skill
|
|
136
|
-
pnpm install
|
|
137
|
-
pnpm exec niceeval exp ponytail ponytail-baseline
|
|
138
|
-
pnpm exec niceeval view
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
The first argument after `exp` selects the experiment group or file. Later positionals only filter eval IDs; they are not agent names, plugin names, URLs, or runtime config.
|
|
142
|
-
|
|
143
|
-
## What to inspect
|
|
144
|
-
|
|
145
|
-
- Whether `pass@N` improves.
|
|
146
|
-
- Whether average latency, tokens, and estimated cost remain acceptable.
|
|
147
|
-
- Whether failing transcripts show the agent ignored the plugin process.
|
|
148
|
-
- Whether the diff only touches task-relevant files.
|
|
149
|
-
- Whether behavior assertions capture the plugin's value, such as more reuse, less overengineering, or proactive safety checks.
|
|
150
|
-
|
|
151
|
-
## Copy to your agent
|
|
152
|
-
|
|
153
|
-
```text
|
|
154
|
-
READ docs-site/example/claude-code-codex-plugin.mdx and install niceeval for this repo.
|
|
155
|
-
Use examples/zh/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.
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## Next steps
|
|
159
|
-
|
|
160
|
-
- [Fixtures](/guides/fixtures) — manage sandbox workspaces, tasks, and verification in `.eval.ts`.
|
|
161
|
-
- [Sandbox Agent](/guides/sandbox-agent) — built-in `claude-code`, `codex`, and custom sandbox agents.
|
|
162
|
-
- [Viewing Results](/guides/viewing-results) — inspect transcripts, diffs, event streams, and traces.
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Eval Your Skill on Claude Code / Codex"
|
|
3
|
-
sidebarTitle: "Eval Skills in Agents"
|
|
4
|
-
description: "Compare coding-agent tasks with and without a Skill by using real workspaces, assertions, and judge scoring."
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
A Skill's quality is not only whether the final answer is correct. It is whether the agent follows the intended process in the right situation, avoids known anti-patterns, and reliably improves pass rate, cost, and latency. The recommended niceeval shape is to inject the Skill into a sandboxed coding-agent workspace, then compare against a no-Skill baseline.
|
|
8
|
-
|
|
9
|
-
The runnable reference is [`examples/zh/coding-agent-skill`](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/coding-agent-skill). It contains two suites:
|
|
10
|
-
|
|
11
|
-
- Zod skill: a local `skills/zod.md` that steers request-body and environment-variable validation.
|
|
12
|
-
- Ponytail plugin: a migrated third-party benchmark for safety, reuse, and simplicity.
|
|
13
|
-
|
|
14
|
-
## Directory structure
|
|
15
|
-
|
|
16
|
-
```text
|
|
17
|
-
examples/zh/coding-agent-skill/
|
|
18
|
-
├─ skills/
|
|
19
|
-
│ ├─ zod.md
|
|
20
|
-
│ └─ ponytail.md
|
|
21
|
-
├─ workspaces/
|
|
22
|
-
│ └─ ts-starter/
|
|
23
|
-
├─ evals/
|
|
24
|
-
│ ├─ api-validation.eval.ts
|
|
25
|
-
│ ├─ config-schema.eval.ts
|
|
26
|
-
│ ├─ ponytail-safe-path.eval.ts
|
|
27
|
-
│ ├─ ponytail-csv-sum.eval.ts
|
|
28
|
-
│ └─ ponytail-reuse.eval.ts
|
|
29
|
-
└─ experiments/
|
|
30
|
-
├─ with-skill.ts
|
|
31
|
-
├─ baseline.ts
|
|
32
|
-
├─ ponytail.ts
|
|
33
|
-
└─ ponytail-baseline.ts
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Define the Skill experiment
|
|
37
|
-
|
|
38
|
-
Skill injection belongs to the experiment. The example writes `skills/zod.md` into `CLAUDE.md` during sandbox setup, so Claude Code reads it when it starts.
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
import { defineExperiment } from "niceeval";
|
|
42
|
-
import { claudeCodeAgent } from "niceeval/adapter";
|
|
43
|
-
import { dockerSandbox } from "niceeval/sandbox";
|
|
44
|
-
import { readFileSync } from "node:fs";
|
|
45
|
-
import { dirname, join } from "node:path";
|
|
46
|
-
import { fileURLToPath } from "node:url";
|
|
47
|
-
|
|
48
|
-
const __dir = dirname(fileURLToPath(import.meta.url));
|
|
49
|
-
const zodSkill = readFileSync(join(__dir, "../skills/zod.md"), "utf-8");
|
|
50
|
-
const baseAgent = claudeCodeAgent();
|
|
51
|
-
|
|
52
|
-
const zodAgent = {
|
|
53
|
-
...baseAgent,
|
|
54
|
-
name: "claude-code+zod-skill",
|
|
55
|
-
async setup(sb, ctx) {
|
|
56
|
-
const cleanup = await baseAgent.setup?.(sb, ctx);
|
|
57
|
-
await sb.writeFiles({ "CLAUDE.md": zodSkill });
|
|
58
|
-
return cleanup;
|
|
59
|
-
},
|
|
60
|
-
} satisfies typeof baseAgent;
|
|
61
|
-
|
|
62
|
-
export default defineExperiment({
|
|
63
|
-
description: "claude-code + zod skill",
|
|
64
|
-
agent: zodAgent,
|
|
65
|
-
model: "claude-sonnet-4-6",
|
|
66
|
-
sandbox: dockerSandbox(),
|
|
67
|
-
runs: 3,
|
|
68
|
-
earlyExit: false,
|
|
69
|
-
budget: 10,
|
|
70
|
-
evals: (id) => !id.startsWith("ponytail-"),
|
|
71
|
-
});
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
The baseline keeps the same eval filter, model, runs, and budget, but uses plain `claudeCodeAgent()`.
|
|
75
|
-
|
|
76
|
-
## Write the eval
|
|
77
|
-
|
|
78
|
-
A `.eval.ts` file prepares the workspace, sends the task, and verifies the result. This is a shortened version of the Zod request-body validation task.
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
import { defineEval } from "niceeval";
|
|
82
|
-
import { excludes, includes } from "niceeval/expect";
|
|
83
|
-
|
|
84
|
-
export default defineEval({
|
|
85
|
-
description: "Validate POST /users request bodies with Zod and structured errors",
|
|
86
|
-
|
|
87
|
-
async test(t) {
|
|
88
|
-
await t.sandbox.uploadDirectory("../workspaces/ts-starter");
|
|
89
|
-
|
|
90
|
-
await t
|
|
91
|
-
.send(
|
|
92
|
-
`Implement POST /users in src/routes/users.ts.
|
|
93
|
-
Requirements:
|
|
94
|
-
- Define CreateUserSchema with Zod
|
|
95
|
-
- Validate req.body with .safeParse(), not .parse()
|
|
96
|
-
- On validation failure, return HTTP 422 with { errors: result.error.issues }
|
|
97
|
-
- On success, return HTTP 201`,
|
|
98
|
-
)
|
|
99
|
-
.then((turn) => turn.succeeded());
|
|
100
|
-
|
|
101
|
-
const src = await t.sandbox.readSourceFiles({ extensions: ["ts"] });
|
|
102
|
-
const route = src.fileMatching(/users/);
|
|
103
|
-
const code = route?.content ?? "";
|
|
104
|
-
|
|
105
|
-
t.check(code, includes(/z\.object\s*\(/));
|
|
106
|
-
t.check(code, includes(/\.safeParse\s*\(/));
|
|
107
|
-
t.check(code, includes(/422|UNPROCESSABLE/));
|
|
108
|
-
t.check(code, excludes(/JSON\.parse/));
|
|
109
|
-
t.sandbox.fileChanged("src/routes/users.ts");
|
|
110
|
-
|
|
111
|
-
t.judge.autoevals
|
|
112
|
-
.closedQA("Does the code use the idiomatic Zod validation pattern?", { on: code })
|
|
113
|
-
.atLeast(0.75);
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
Prefer verifying the final artifact and real tests. Only make Skill-load or tool-call events hard gates when those event names are stable for the agent.
|
|
119
|
-
|
|
120
|
-
## Run
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
cd examples/zh/coding-agent-skill
|
|
124
|
-
pnpm install
|
|
125
|
-
|
|
126
|
-
# Zod Skill A/B comparison
|
|
127
|
-
pnpm exec niceeval exp compare
|
|
128
|
-
|
|
129
|
-
# Ponytail plugin A/B comparison
|
|
130
|
-
pnpm exec niceeval exp ponytail ponytail-baseline
|
|
131
|
-
|
|
132
|
-
pnpm exec niceeval view
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## What to evaluate
|
|
136
|
-
|
|
137
|
-
- Whether the Skill improves pass rate.
|
|
138
|
-
- Whether it reduces anti-patterns such as raw `JSON.parse`, unsafe path joins, or needless rewrites.
|
|
139
|
-
- Whether the agent consistently changes the intended files.
|
|
140
|
-
- Whether cost and latency remain acceptable.
|
|
141
|
-
- Whether failures mean the Skill was not read, was read but ignored, or the eval target was unclear.
|
|
142
|
-
|
|
143
|
-
## Next steps
|
|
144
|
-
|
|
145
|
-
- [Fixtures](/guides/fixtures) — organize sandbox workspaces, tasks, and verification.
|
|
146
|
-
- [Experiments](/guides/experiments) — run with-Skill vs without-Skill controlled experiments.
|
|
147
|
-
- [Scoring Guide](/guides/scoring-guide) — score final results and behavioral constraints together.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Showcase"
|
|
3
|
-
sidebarTitle: "Showcase"
|
|
4
|
-
description: "Real projects and live sites that build evals with NiceEval, collected over time."
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
This page collects real projects and live sites that use [NiceEval](https://niceeval.com/) to build evals. Each case is a runnable, reproducible repository, not an excerpt. Open the source repository to inspect the full eval, experiment, and sandbox configuration.
|
|
8
|
-
|
|
9
|
-
## coding-agent-memory-evals
|
|
10
|
-
|
|
11
|
-
Tape, Nowledge Mem, mem9, db9.ai, OpenClaw... memory implementations for coding agents are diverging, but the ecosystem needs a reproducible eval surface to answer whether those mechanisms help in practice. [coding-agent-memory-evals](https://github.com/CorrectRoadH/coding-agent-memory-evals) builds that benchmark with NiceEval: the same coding tasks, the same model (`gpt-5.4`), and only the agent memory mechanism changes. It compares [bub](https://github.com/CorrectRoadH/coding-agent-memory-evals), which includes [Tape](https://tape.systems/), against codex without the corresponding persistent memory.
|
|
12
|
-
|
|
13
|
-
- Online report: [coding-agent-memory-evals.vercel.app](https://coding-agent-memory-evals.vercel.app/)
|
|
14
|
-
- Source repository: [github.com/CorrectRoadH/coding-agent-memory-evals](https://github.com/CorrectRoadH/coding-agent-memory-evals)
|
|
15
|
-
|
|
16
|
-
The primary score only checks whether the development task itself was completed, such as build, tests, or the upstream verifier. It does not add a separate question like "did the agent remember this fact?" The value of memory shows up in secondary metrics such as duration, tokens, cost, and `pass^k`.
|
|
17
|
-
|
|
18
|
-
### Cases
|
|
19
|
-
|
|
20
|
-
Each eval connects the original task and verification script from a public benchmark. These are not rewritten assertions.
|
|
21
|
-
|
|
22
|
-
| Eval | Source | What It Verifies |
|
|
23
|
-
|---|---|---|
|
|
24
|
-
| [`agent-029-use-cache-directive`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/evals/memory/agent-029-use-cache-directive.eval.ts) | next-evals | Whether a Server Action uses `use cache` + `revalidateTag` for eventually consistent directory-data refreshes. |
|
|
25
|
-
| [`agent-030-app-router-migration-hard`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/evals/memory/agent-030-app-router-migration-hard.eval.ts) | next-evals | Whether a complex Pages Router app is fully migrated to App Router, legacy files are deleted, and legacy APIs do not remain. |
|
|
26
|
-
| [`agent-037-updatetag-cache`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/evals/memory/agent-037-updatetag-cache.eval.ts) | next-evals | Whether read-your-own-writes scenarios use `updateTag` instead of only `revalidateTag`. |
|
|
27
|
-
| [`terminal-cancel-async-tasks`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/evals/memory/terminal-cancel-async-tasks.eval.ts) | [Terminal-Bench](https://www.tbench.ai/) | Implements a cancellable concurrency-limited async task runner and runs the original `pytest` verifier. |
|
|
28
|
-
| [`repomod-hello-world-api`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/evals/memory/repomod-hello-world-api.eval.ts) | RepoMod-Bench | Migrates a Flask API to Java Spring Boot, starts the service, and runs upstream hidden HTTP tests. |
|
|
29
|
-
| [`tool-call-observability`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/evals/memory/tool-call-observability.eval.ts) | Custom smoke | Whether the agent's shell tool calls are correctly recorded as standard events. |
|
|
30
|
-
|
|
31
|
-
### Comparison Experiments
|
|
32
|
-
|
|
33
|
-
[`experiments/compare/`](https://github.com/CorrectRoadH/coding-agent-memory-evals/tree/main/experiments/compare) is the only comparable experiment set. It pins the same model (`gpt-5.4`) and the same sandbox (`docker`), and changes only the agent: [`bub-gpt-5.4.ts`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/experiments/compare/bub-gpt-5.4.ts) vs. [`codex-gpt-5.4.ts`](https://github.com/CorrectRoadH/coding-agent-memory-evals/blob/main/experiments/compare/codex-gpt-5.4.ts). That makes the difference attributable to the memory mechanism rather than the model or runtime environment. `niceeval exp compare` runs the whole set, and the result snapshot is published to the online report.
|
|
34
|
-
|
|
35
|
-
## Next Steps
|
|
36
|
-
|
|
37
|
-
- [Connect Your Agent](/guides/connect-your-agent) — integrate a coding-agent adapter from scratch.
|
|
38
|
-
- [Experiments](/guides/experiments) — organize comparable experiment matrices.
|
|
39
|
-
- [Evaluate Skill Impact](/example/claude-code-codex-skill) — use the same "with / without X" comparison pattern for Skills.
|