niceeval 0.4.3 → 0.4.5

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.
Files changed (179) hide show
  1. package/README.md +21 -12
  2. package/README.zh.md +8 -9
  3. package/docs-site/.mintignore +13 -0
  4. package/docs-site/AGENTS.md +46 -0
  5. package/docs-site/concepts/adapter.mdx +287 -0
  6. package/docs-site/concepts/assert.mdx +243 -0
  7. package/docs-site/concepts/drive.mdx +118 -0
  8. package/docs-site/concepts/evals.mdx +108 -0
  9. package/docs-site/concepts/experiment.mdx +37 -0
  10. package/docs-site/concepts/hitl.mdx +83 -0
  11. package/docs-site/concepts/judge.mdx +129 -0
  12. package/docs-site/concepts/overview.mdx +98 -0
  13. package/docs-site/concepts/tier.mdx +42 -0
  14. package/docs-site/docs-ref/00-index.md +23 -0
  15. package/docs-site/docs-ref/01-page-types.md +43 -0
  16. package/docs-site/docs-ref/03-style-rules.md +45 -0
  17. package/docs-site/docs-ref/04-code-examples.md +37 -0
  18. package/docs-site/docs-ref/05-dx-failure-paths.md +45 -0
  19. package/docs-site/docs-ref/06-checklists.md +53 -0
  20. package/docs-site/docs.json +256 -0
  21. package/docs-site/example/ai-agent-application.mdx +148 -0
  22. package/docs-site/example/claude-code-codex-plugin.mdx +162 -0
  23. package/docs-site/example/claude-code-codex-skill.mdx +147 -0
  24. package/docs-site/example/showcase.mdx +39 -0
  25. package/docs-site/example/tier1-ai-sdk-v7.mdx +136 -0
  26. package/docs-site/example/tier1-claude-sdk.mdx +119 -0
  27. package/docs-site/example/tier1-codex-sdk.mdx +111 -0
  28. package/docs-site/example/tier1-langgraph.mdx +119 -0
  29. package/docs-site/example/tier1-pi-sdk.mdx +119 -0
  30. package/docs-site/favicon.svg +5 -0
  31. package/docs-site/github-diff.css +135 -0
  32. package/docs-site/github-diff.js +11 -0
  33. package/docs-site/guides/authoring.mdx +129 -0
  34. package/docs-site/guides/ci-integration.mdx +97 -0
  35. package/docs-site/guides/connect-otel.mdx +209 -0
  36. package/docs-site/guides/connect-your-agent.mdx +221 -0
  37. package/docs-site/guides/dataset-fanout.mdx +98 -0
  38. package/docs-site/guides/experiments.mdx +71 -0
  39. package/docs-site/guides/fixtures.mdx +147 -0
  40. package/docs-site/guides/reporters.mdx +113 -0
  41. package/docs-site/guides/runner.mdx +79 -0
  42. package/docs-site/guides/sandbox-agent.mdx +138 -0
  43. package/docs-site/guides/sandbox-backends.mdx +64 -0
  44. package/docs-site/guides/scoring-guide.mdx +92 -0
  45. package/docs-site/guides/viewing-results.mdx +195 -0
  46. package/docs-site/guides/write-experiment.mdx +81 -0
  47. package/docs-site/guides/write-send.mdx +347 -0
  48. package/docs-site/images/adapter-tiers-zh.svg +60 -0
  49. package/docs-site/images/agent-turn-roundtrip-en.svg +62 -0
  50. package/docs-site/images/agent-turn-roundtrip-zh.svg +77 -0
  51. package/docs-site/images/hitl-handshake-zh.svg +89 -0
  52. package/docs-site/images/logo.svg +6 -0
  53. package/docs-site/index.mdx +181 -0
  54. package/docs-site/introduction.mdx +141 -0
  55. package/docs-site/quickstart.mdx +136 -0
  56. package/docs-site/reference/builtin-agents.mdx +161 -0
  57. package/docs-site/reference/capabilities.mdx +76 -0
  58. package/docs-site/reference/cli.mdx +120 -0
  59. package/docs-site/reference/define-agent.mdx +168 -0
  60. package/docs-site/reference/define-config.mdx +41 -0
  61. package/docs-site/reference/define-eval.mdx +160 -0
  62. package/docs-site/reference/events.mdx +131 -0
  63. package/docs-site/reference/expect.mdx +112 -0
  64. package/docs-site/tracker.js +8 -0
  65. package/docs-site/zh/concepts/adapter.mdx +286 -0
  66. package/docs-site/zh/concepts/assert.mdx +243 -0
  67. package/docs-site/zh/concepts/drive.mdx +118 -0
  68. package/docs-site/zh/concepts/evals.mdx +124 -0
  69. package/docs-site/zh/concepts/experiment.mdx +37 -0
  70. package/docs-site/zh/concepts/hitl.mdx +83 -0
  71. package/docs-site/zh/concepts/judge.mdx +130 -0
  72. package/docs-site/zh/concepts/overview.mdx +109 -0
  73. package/docs-site/zh/concepts/tier.mdx +44 -0
  74. package/docs-site/zh/example/ai-agent-application.mdx +152 -0
  75. package/docs-site/zh/example/claude-code-codex-plugin.mdx +163 -0
  76. package/docs-site/zh/example/claude-code-codex-skill.mdx +147 -0
  77. package/docs-site/zh/example/showcase.mdx +39 -0
  78. package/docs-site/zh/example/tier1-ai-sdk-v7.mdx +140 -0
  79. package/docs-site/zh/example/tier1-claude-sdk.mdx +122 -0
  80. package/docs-site/zh/example/tier1-codex-sdk.mdx +117 -0
  81. package/docs-site/zh/example/tier1-langgraph.mdx +123 -0
  82. package/docs-site/zh/example/tier1-pi-sdk.mdx +122 -0
  83. package/docs-site/zh/guides/agent-feedback-loop.mdx +79 -0
  84. package/docs-site/zh/guides/authoring.mdx +129 -0
  85. package/docs-site/zh/guides/ci-integration.mdx +97 -0
  86. package/docs-site/zh/guides/connect-otel.mdx +208 -0
  87. package/docs-site/zh/guides/connect-your-agent.mdx +226 -0
  88. package/docs-site/zh/guides/dataset-fanout.mdx +83 -0
  89. package/docs-site/zh/guides/experiments.mdx +72 -0
  90. package/docs-site/zh/guides/fixtures.mdx +147 -0
  91. package/docs-site/zh/guides/official-adapters.mdx +132 -0
  92. package/docs-site/zh/guides/reporters.mdx +113 -0
  93. package/docs-site/zh/guides/runner.mdx +82 -0
  94. package/docs-site/zh/guides/sandbox-agent.mdx +139 -0
  95. package/docs-site/zh/guides/sandbox-backends.mdx +75 -0
  96. package/docs-site/zh/guides/scoring-guide.mdx +92 -0
  97. package/docs-site/zh/guides/viewing-results.mdx +195 -0
  98. package/docs-site/zh/guides/write-experiment.mdx +101 -0
  99. package/docs-site/zh/guides/write-send.mdx +353 -0
  100. package/docs-site/zh/index.mdx +180 -0
  101. package/docs-site/zh/introduction.mdx +140 -0
  102. package/docs-site/zh/quickstart.mdx +137 -0
  103. package/docs-site/zh/reference/builtin-agents.mdx +364 -0
  104. package/docs-site/zh/reference/capabilities.mdx +76 -0
  105. package/docs-site/zh/reference/cli.mdx +140 -0
  106. package/docs-site/zh/reference/define-agent.mdx +461 -0
  107. package/docs-site/zh/reference/define-config.mdx +107 -0
  108. package/docs-site/zh/reference/define-eval.mdx +674 -0
  109. package/docs-site/zh/reference/events.mdx +252 -0
  110. package/docs-site/zh/reference/expect.mdx +208 -0
  111. package/package.json +3 -2
  112. package/src/agents/bub.ts +1 -1
  113. package/src/agents/claude-code.ts +8 -5
  114. package/src/agents/codex.ts +9 -5
  115. package/src/agents/sdk-streams.test.ts +4 -4
  116. package/src/agents/sdk-streams.ts +14 -9
  117. package/src/agents/types.ts +40 -1
  118. package/src/agents/ui-message-stream.ts +1 -0
  119. package/src/cli.ts +40 -10
  120. package/src/context/types.ts +140 -0
  121. package/src/expect/index.ts +15 -8
  122. package/src/i18n/en.ts +20 -6
  123. package/src/i18n/zh-CN.ts +20 -6
  124. package/src/o11y/parsers/bub.test.ts +71 -0
  125. package/src/o11y/parsers/bub.ts +5 -0
  126. package/src/o11y/types.ts +27 -2
  127. package/src/runner/attempt.ts +2 -1
  128. package/src/runner/reporters/artifacts.ts +11 -3
  129. package/src/runner/reporters/live.ts +45 -8
  130. package/src/runner/run.test.ts +50 -0
  131. package/src/runner/run.ts +135 -41
  132. package/src/runner/types.ts +55 -2
  133. package/src/sandbox/types.ts +18 -0
  134. package/src/scoring/types.ts +5 -0
  135. package/src/shared/types.ts +3 -0
  136. package/src/util.test.ts +26 -1
  137. package/src/util.ts +16 -0
  138. package/src/view/app/App.tsx +2 -2
  139. package/src/view/app/components/AttemptModal.tsx +2 -0
  140. package/src/view/app/components/CopyControls.tsx +87 -28
  141. package/src/view/app/i18n.ts +3 -3
  142. package/src/view/client-dist/app.css +1 -1
  143. package/src/view/client-dist/app.js +18 -18
  144. package/docs/README.md +0 -120
  145. package/docs/adapters/README.md +0 -60
  146. package/docs/adapters/authoring.md +0 -179
  147. package/docs/adapters/coding-agent-skills-plugins.md +0 -324
  148. package/docs/adapters/collection.md +0 -128
  149. package/docs/adapters/contract.md +0 -264
  150. package/docs/adapters/reference/agent-eval.md +0 -215
  151. package/docs/adapters/reference/agent-loop-apis.md +0 -69
  152. package/docs/adapters/reference/claude-code-otel-telemetry.md +0 -100
  153. package/docs/adapters/reference/eve-protocol.md +0 -127
  154. package/docs/adapters/reference/otel-genai.md +0 -107
  155. package/docs/adapters/reference/otel-instrumentation.md +0 -65
  156. package/docs/adapters/targets.md +0 -99
  157. package/docs/architecture.md +0 -140
  158. package/docs/assertions.md +0 -387
  159. package/docs/capabilities-by-construction.md +0 -48
  160. package/docs/cli.md +0 -173
  161. package/docs/concepts.md +0 -106
  162. package/docs/e2e-ci.md +0 -332
  163. package/docs/eval-authoring.md +0 -319
  164. package/docs/experiments.md +0 -157
  165. package/docs/getting-started.md +0 -224
  166. package/docs/multi-agent.md +0 -145
  167. package/docs/observability.md +0 -337
  168. package/docs/origin-integration.md +0 -195
  169. package/docs/references.md +0 -35
  170. package/docs/reports.md +0 -551
  171. package/docs/results-format.md +0 -228
  172. package/docs/results-lib.md +0 -191
  173. package/docs/runner.md +0 -104
  174. package/docs/sandbox.md +0 -276
  175. package/docs/scoring.md +0 -119
  176. package/docs/source-map.md +0 -126
  177. package/docs/tier-sync.md +0 -193
  178. package/docs/view.md +0 -194
  179. package/docs/vision.md +0 -88
@@ -0,0 +1,180 @@
1
+ ---
2
+ title: "NiceEval"
3
+ sidebarTitle: "首页"
4
+ description: "NiceEval 是一个渐进式、全功能、开发体验友好、Agent Native 的 AI agent eval 工具。"
5
+ ---
6
+
7
+ <div align="center">
8
+
9
+ # NiceEval
10
+
11
+ **渐进式、全功能、开发体验友好、Agent Native 的 AI agent eval 工具**
12
+
13
+ </div>
14
+
15
+ [NiceEval](https://niceeval.com/) 是一个受 [eve](https://eve.dev) 启发的 agent-native eval 工具。它首先追求良好的开发体验:一个项目可以在 10 分钟左右接入,eval 文件足够直观,结果也足够容易读。
16
+
17
+ 它也足够通用:可以用来 eval 给 Claude Code / Codex 写的 coding-agent 插件、Hook 和 Skill,也可以 eval 你自己的 AI Agent 应用。无论你的应用基于 AI SDK、LangGraph、Pi,还是自研 agent loop,都可以通过 adapter 接入。
18
+
19
+ eval 运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告和结构化 artifacts,让你能查看 agent 的行为细节,调试失败原因,并持续优化 pass rate、成本和延迟。
20
+
21
+ <CardGroup cols={3}>
22
+ <Card title="Claude Code / Codex 插件" icon="plug" href="/zh/example/claude-code-codex-plugin">
23
+ 用 sandbox workspace 让 coding agent 跑真实任务,再用测试、diff 和工具调用记录验证插件行为。
24
+ </Card>
25
+ <Card title="Claude Code / Codex Skill" icon="wand-magic-sparkles" href="/zh/example/claude-code-codex-skill">
26
+ 用 experiment setup 注入 Skill,再与无 Skill baseline 批量比较通过率、成本和行为差异。
27
+ </Card>
28
+ <Card title="AI Agent 应用" icon="globe" href="/zh/example/ai-agent-application">
29
+ 用 `defineAgent` 包装你的 AI Agent,把回复、工具调用和结构化输出纳入同一套 eval。
30
+ </Card>
31
+ </CardGroup>
32
+
33
+ ## 架构
34
+
35
+ [NiceEval](https://niceeval.com/) 支持两种接入方式,取决于被测系统是否需要隔离工作区。
36
+
37
+ ### 模式一:Sandbox
38
+
39
+ 跑 Codex、Claude Code 等需要 sandbox 的 coding agent:
40
+
41
+ ```text
42
+ evals/*.eval.ts
43
+
44
+
45
+ ┌────────────┐
46
+ │ niceeval │
47
+ └────────────┘
48
+
49
+ │ Agent 适配器(官方)
50
+
51
+ ┌───────────────────────────────┐
52
+ │ Docker Sandbox │
53
+ │ ┌───────────────────────┐ │
54
+ │ │ Codex / Claude Code / │ │
55
+ │ │ 需要隔离工作区的应用 │ │
56
+ │ └───────────────────────┘ │
57
+ └───────────────────────────────┘
58
+ ```
59
+
60
+ ### 模式二:直连
61
+
62
+ 直接连接你自己的 AI Agent:
63
+
64
+ ```text
65
+ evals/*.eval.ts
66
+
67
+
68
+ ┌────────────┐
69
+ │ niceeval │
70
+ └────────────┘
71
+
72
+ │ Agent 适配器(官方 / 自定义)
73
+
74
+ ┌────────────────────────────┐
75
+ │ 你自己的 AI Agent │
76
+ │ (AI SDK · LangGraph · Pi · │
77
+ │ 自研 agent loop 等) │
78
+ └────────────────────────────┘
79
+ ```
80
+
81
+ - **[NiceEval](https://niceeval.com/) 核心** 负责发现 eval、调度运行、打分、生成报告与 artifacts。
82
+ - **Agent 适配器** 是开放边界:你决定如何调用被测系统,以及如何把输出映射成标准事件流。
83
+ - **Sandbox** 负责文件系统隔离:需要真实 workspace 的 coding agent 使用 Docker 或云端 sandbox;自有 Web Agent 可以直连,无需 Docker。
84
+
85
+ ## 核心概念一览
86
+
87
+ | 概念 | 一句话 |
88
+ |---|---|
89
+ | [Eval](/zh/concepts/evals) | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
90
+ | [Experiment](/zh/concepts/experiment) | 可签入的运行配置:决定连哪个 Adapter、什么 model、什么 flags。 |
91
+ | [Adapter](/zh/concepts/adapter) | 连接被测系统的适配层:实现一个 `send`,把返回翻译成标准事件流。 |
92
+ | [Sandbox](/zh/guides/sandbox-backends) | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
93
+ | [Tier](/zh/concepts/tier) | 接入 Adapter 的三档投入:Tier 1 只接 send,Tier 2 加 OTel 换调用瀑布图,Tier 3 侵入改造做 feature A/B。 |
94
+
95
+ 完整术语表见[架构概览](/zh/concepts/overview)。
96
+
97
+ ## 示例
98
+
99
+ 跑一条 eval 需要两个文件:eval 本身(测什么)和 experiment(跑哪个 agent)。CLI 不接受裸 eval id——`niceeval exp <experiment> <eval 前缀>` 里的 experiment 才决定「连哪个被测对象」。下面是一个直连 Web Agent 的真实场景(完整项目见仓库 `examples/zh/ai-sdk/`),验证 agent 遇到实时天气问题时会调用工具、并基于工具结果作答,而不是凭空编造:
100
+
101
+ ```ts
102
+ // evals/weather-tool.eval.ts
103
+ import { defineEval } from "niceeval";
104
+
105
+ export default defineEval({
106
+ description: "测试 agent 在实时天气问题中正确调用工具并基于结果作答的能力",
107
+
108
+ async test(t) {
109
+ const turn = await t.send("北京今天天气怎么样?");
110
+ turn.succeeded();
111
+
112
+ await t.group("调用 get_weather 且城市正确", () => {
113
+ t.calledTool("get_weather", { input: { city: "北京" } });
114
+ t.messageIncludes(/°C|气温|天气|晴|多云|雨/);
115
+ });
116
+
117
+ t.judge.autoevals
118
+ .closedQA("助手是否基于工具返回的天气数据作答,而不是凭空编造温度?")
119
+ .atLeast(0.7);
120
+ },
121
+ });
122
+ ```
123
+
124
+ ```ts
125
+ // experiments/local.ts
126
+ import { defineExperiment } from "niceeval";
127
+ import { webAgent } from "./adapter"; // 你自己写的 Adapter,接被测 Web Agent
128
+
129
+ export default defineExperiment({
130
+ agent: webAgent({ baseUrl: "http://127.0.0.1:5188" }),
131
+ model: "gpt-5.4",
132
+ });
133
+ ```
134
+
135
+ ```sh
136
+ npx niceeval exp local weather-tool
137
+ npx niceeval view
138
+ ```
139
+
140
+ 如果被测对象是需要隔离工作区的 coding agent(Codex、Claude Code 插件/Skill),evals 里改用 `t.sandbox.uploadDirectory()` 铺工作区、`t.sandbox.fileChanged()` / `t.sandbox.file()` 检查改了什么文件、`t.sandbox.runCommand()` 跑测试——参考仓库 `examples/zh/coding-agent-skill/`。
141
+
142
+ ## 快速开始
143
+
144
+ 如果你想让 coding agent 直接帮项目接入 [NiceEval](https://niceeval.com/),可以把对应场景页交给它读:
145
+
146
+ ```text
147
+ READ https://raw.githubusercontent.com/CorrectRoadH/niceeval/refs/heads/main/docs-site/zh/example/claude-code-codex-plugin.mdx and install niceeval for this repo.
148
+ READ https://raw.githubusercontent.com/CorrectRoadH/niceeval/refs/heads/main/docs-site/zh/example/claude-code-codex-skill.mdx and install niceeval for this repo.
149
+ READ https://raw.githubusercontent.com/CorrectRoadH/niceeval/refs/heads/main/docs-site/zh/example/ai-agent-application.mdx and install niceeval for this repo.
150
+ ```
151
+
152
+ <CardGroup cols={3}>
153
+ <Card title="如果你需要 eval 你的 Claude Code / Codex 插件" icon="plug" href="/zh/example/claude-code-codex-plugin">
154
+ 从真实插件任务出发,上传 workspace、注入插件,并用 pass rate 看插件是否稳定工作。
155
+ </Card>
156
+ <Card title="如果你需要 eval 你的 Claude Code / Codex Skill" icon="wand-magic-sparkles" href="/zh/example/claude-code-codex-skill">
157
+ 验证 Skill 是否被加载、是否按约定使用工具、是否产出可测试结果。
158
+ </Card>
159
+ <Card title="如果你需要 eval 你的 AI Agent 应用" icon="globe" href="/zh/example/ai-agent-application">
160
+ 包装你的 agent 接口,写对话、工具调用、结构化输出和成本断言。
161
+ </Card>
162
+ </CardGroup>
163
+
164
+ ## 常见问题
165
+
166
+ <AccordionGroup>
167
+ <Accordion title="需要注册账号吗?">
168
+ 不需要。跑 eval 和 `niceeval view` 看报告全在本地完成;只有被测对象本身是需要隔离工作区的 coding agent 时,才会用到 Docker 或 E2B 这类 sandbox 后端。
169
+ </Accordion>
170
+ <Accordion title="我的 Agent 不是用 TypeScript / JavaScript 写的,能接吗?">
171
+ 能。Adapter 只是对着应用本来暴露的接口(HTTP、gRPC、WebSocket 都行)收发;应用本身用什么语言写、部署在哪里,[NiceEval](https://niceeval.com/) 不关心,见 [Adapter](/zh/concepts/adapter)。
172
+ </Accordion>
173
+ <Accordion title="能接到 CI 里吗?">
174
+ 能,见 [CI 集成](/zh/guides/ci-integration)。
175
+ </Accordion>
176
+ </AccordionGroup>
177
+
178
+ <Tip>
179
+ 想先走最小路径,读 [快速开始](/zh/quickstart)。想理解边界,读 [架构概览](/zh/concepts/overview)。
180
+ </Tip>
@@ -0,0 +1,140 @@
1
+ ---
2
+ title: "NiceEval:面向 Agent 的评估工具"
3
+ sidebarTitle: "介绍"
4
+ description: "NiceEval 帮助团队衡量、评估并改进生产环境中的 AI:比较模型、迭代 Agent、发现回归、用真实数据持续改进。"
5
+ ---
6
+
7
+ [NiceEval](https://niceeval.com/) 是一个 Agent 评估工具,帮助团队衡量、评估并改进生产环境中的 AI。借助 NiceEval,团队可以比较模型、迭代 Agent、发现回归问题,并利用真实用户数据持续改进 AI 应用。它追求低心智负担的 DX:大多数项目都可以在 10 分钟左右接入,写出第一条 eval,并开始稳定地检查 agent 行为。
8
+
9
+ NiceEval 以本地优先为核心:你的评估在你自己的环境中运行,不需要先开账号、连平台才能跑第一条 eval。当团队需要分享评估结果、做回归跟踪时,可以通过 Report 上报到 BrainTrust 等平台,或者自定义报告导出。
10
+
11
+ 它既能评估用于 Claude Code / Codex 的 Plugins、Hook 和 Skill,也能直接评你自己的 AI Agent 应用。无论你的 Agent 基于 AI SDK、LangGraph、Pi 还是自研 loop,都可以通过 Adapter 接入同一套评估体系。
12
+
13
+ ## 30 秒看懂 DX
14
+
15
+ 一个 eval 就是一个 TypeScript 文件:给 agent 发消息,断言它做对了什么。
16
+
17
+ ```ts
18
+ // evals/eval-tool-call.eval.ts
19
+ import { defineEval } from "niceeval";
20
+
21
+ export default defineEval({
22
+ description: "测试 agent 在实时天气问题中正确调用工具并基于结果作答的能力",
23
+
24
+ async test(t) {
25
+ const turn = await t.send("北京今天天气怎么样?");
26
+ t.succeeded();
27
+
28
+ await t.group("调用 get_weather 且城市正确", () => {
29
+ t.calledTool("get_weather", { input: { city: "北京" } });
30
+ t.messageIncludes(/°C|气温|天气|晴|多云|雨/);
31
+ });
32
+
33
+ const second = await t.send("上海明天天气怎么样?");
34
+ second.messageIncludes("上海");
35
+
36
+ t.judge.autoevals
37
+ .closedQA("助手是否基于工具返回的天气数据作答,而不是凭空编造温度?")
38
+ .atLeast(0.7);
39
+ },
40
+ });
41
+ ```
42
+
43
+ ```sh
44
+ pnpm exec niceeval exp local eval-tool-call # 用 local experiment 只跑 eval-tool-call
45
+ pnpm exec niceeval view # 查看评估结果
46
+ ```
47
+
48
+ ## 为什么有了 DeepEval、LangFuse、BrainTrust 还需要 NiceEval
49
+
50
+ NiceEval 是一个 Agent-Native 的评估工具。Dataset / golden 那一套「构建 Input 与 Expected Output」的模式,并不适合真实的 Agent 评估——现在的 Agent 要在多轮对话、多 agent 协作、工具调用、Skill 加载等细粒度场景下被检查,NiceEval 就是为这类场景设计的:断言直接落在工具调用、消息内容、结构化输出和用量上,而不是要求你先手工准备一份 golden 数据集。
51
+
52
+ 像 LangFuse、BrainTrust 这类工具更偏 tracing 和监控,对「写 eval、跑 eval、看结果」这条路径来说太重;NiceEval 从一开始就针对这条路径做了友好的开发体验。两者也不冲突:NiceEval 能与 LangFuse、BrainTrust 共存——可以用它们做 tracing,或者把评估结果上传到两者。
53
+
54
+ ## 你可以评什么
55
+
56
+ <CardGroup cols={2}>
57
+ <Card title="Coding Agent" icon="code">
58
+ 把 Claude Code、Codex、bub 放进 Sandbox,给它任务,再用真实测试和文件断言验证结果。
59
+ </Card>
60
+ <Card title="你自己的 AI Agent 应用" icon="globe">
61
+ 直连你的应用接口,断言回复、工具调用和结构化输出。
62
+ </Card>
63
+ </CardGroup>
64
+
65
+ ## 两种接入模式
66
+
67
+ <Tabs>
68
+ <Tab title="Sandbox mode">
69
+ 适合 Codex、Claude Code 这类必须在真实文件系统中改代码、跑命令的 coding agent。
70
+
71
+ ```text
72
+ evals/*.eval.ts
73
+
74
+
75
+ ┌────────────┐
76
+ │ niceeval │
77
+ └────────────┘
78
+
79
+ │ Agent 适配器(官方)
80
+
81
+ ┌───────────────────────────────┐
82
+ │ Docker Sandbox │
83
+ │ ┌───────────────────────┐ │
84
+ │ │ Codex / Claude Code / │ │
85
+ │ │ 需要隔离工作区的应用 │ │
86
+ │ └───────────────────────┘ │
87
+ └───────────────────────────────┘
88
+ ```
89
+ </Tab>
90
+ <Tab title="Direct mode">
91
+ 适合你自己的 AI Agent,不需要 Docker。
92
+
93
+ ```text
94
+ evals/*.eval.ts
95
+
96
+
97
+ ┌────────────┐
98
+ │ niceeval │
99
+ └────────────┘
100
+
101
+ │ Agent 适配器(官方,或者自己实现)
102
+
103
+ ┌────────────────────────────┐
104
+ │ 你自己的 AI Agent │
105
+ │ (AI SDK · LangGraph · Pi · │
106
+ │ 自研 agent loop 等) │
107
+ └────────────────────────────┘
108
+ ```
109
+ </Tab>
110
+ </Tabs>
111
+
112
+ ## 核心概念一览
113
+
114
+ | 概念 | 一句话 |
115
+ |---|---|
116
+ | Eval | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
117
+ | Experiment | 可签入的运行配置:决定连哪个 Adapter、什么 model、什么 flags。 |
118
+ | Adapter | 连接被测系统的适配层:实现一个 `send`,把返回翻译成标准事件流。 |
119
+ | Sandbox | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
120
+ | Tier | 接入 Adapter 的三档投入:Tier 1 只接 send,Tier 2 加 OTel 换调用瀑布图,Tier 3 侵入改造做 feature A/B。 |
121
+
122
+ 完整术语表见[架构概览](/zh/concepts/overview)。
123
+
124
+ ## 从你的场景开始
125
+
126
+ <CardGroup cols={3}>
127
+ <Card title="评估 Claude Code / Codex 插件" icon="puzzle-piece" href="/zh/example/claude-code-codex-plugin">
128
+ 把插件放进真实 workspace,比较有插件和无插件时的通过率、成本、耗时和行为差异。
129
+ </Card>
130
+ <Card title="评估 Claude Code / Codex Skill" icon="wand-magic-sparkles" href="/zh/example/claude-code-codex-skill">
131
+ 对比有 Skill 和无 Skill 的 coding-agent 任务,衡量 Skill 是否真的提升结果。
132
+ </Card>
133
+ <Card title="评估你的 AI Agent 应用" icon="robot" href="/zh/example/ai-agent-application">
134
+ 直连你自己的应用接口,断言工具调用、图片理解和多轮会话。
135
+ </Card>
136
+ </CardGroup>
137
+
138
+ ## 接下来读什么
139
+
140
+ [快速开始](/zh/quickstart) 会带你安装 [NiceEval](https://niceeval.com/)、构建 eval、得到评估报告。
@@ -0,0 +1,137 @@
1
+ ---
2
+ title: "为你的 Agent 项目设置评估"
3
+ sidebarTitle: "快速开始"
4
+ description: "安装 NiceEval,写三个文件,10 分钟内对你自己的应用跑通第一条 eval。"
5
+ ---
6
+
7
+ 接入你自己的应用只需要三个文件:一个 **adapter**(怎么调你的应用)、一个 **experiment**(评谁、跑几次)、一条 **eval**(断言什么)。下面是完整的最短路径;写给 coding agent 的一键接入和场景示例在后面。
8
+
9
+ ## 让 AI 帮你接入 (推荐)
10
+ <Steps>
11
+ <Step title="安装">
12
+ ```text
13
+ READ https://niceeval.com/INIT.md and install niceeval for this repo.
14
+
15
+ ```
16
+ </Step>
17
+ <Step title="运行测试">
18
+ ```bash
19
+ pnpm exec niceeval exp 实验名
20
+ ```
21
+ </Step>
22
+ <Step title="查看结果">
23
+ ```text
24
+ pnpm exec niceeval view
25
+ ```
26
+ </Step>
27
+ </Steps>
28
+
29
+
30
+ ## 人工接入
31
+
32
+ ```bash
33
+ pnpm add -D niceeval
34
+ pnpm exec niceeval init
35
+ ```
36
+
37
+ ### Adapter
38
+ Adapter 是连接 Agent 与 [NiceEval](https://niceeval.com/) 的中间层。有三种不同程序的接入方式,从无侵入式到部分修改你的 Agent 代码,来解锁更有用的评估功能。 见[Tier](/zh/concepts/tier)。
39
+
40
+ ```ts
41
+ // agents/my-bot.ts
42
+ import { defineAgent } from "niceeval/adapter";
43
+
44
+ export default defineAgent({
45
+ name: "my-bot",
46
+ async send(input, ctx) {
47
+ // 示例地址:换成你自己 agent 的真实端点(HTTP、CLI、SDK 都行,只要 send 里能拿到回复文本)
48
+ const r = await fetch("http://localhost:3000/chat", {
49
+ method: "POST",
50
+ headers: { "content-type": "application/json" },
51
+ body: JSON.stringify({ message: input.text, model: ctx.model }), // ← experiment.model 经 ctx.model 到这里
52
+ signal: ctx.signal,
53
+ });
54
+ const body = await r.json();
55
+ return {
56
+ status: r.ok ? "completed" : "failed",
57
+ events: [{ type: "message", role: "assistant", text: body.reply }],
58
+ };
59
+ },
60
+ });
61
+ ```
62
+
63
+ ### Experiment
64
+
65
+ ```ts
66
+ // experiments/my-bot.ts
67
+ import { defineExperiment } from "niceeval";
68
+ import myBot from "../agents/my-bot.ts";
69
+
70
+ export default defineExperiment({
71
+ description: "my-bot 基线",
72
+ model: "gpt-4o",
73
+ agent: myBot,
74
+ runs: 1,
75
+ });
76
+ ```
77
+
78
+ ### Eval
79
+
80
+ ```ts
81
+ // evals/refund-policy.eval.ts
82
+ import { defineEval } from "niceeval";
83
+ import { includes } from "niceeval/expect";
84
+
85
+ export default defineEval({
86
+ description: "退款政策问答",
87
+ async test(t) {
88
+ await t.send("你们的退款政策是什么?");
89
+ t.succeeded();
90
+ t.check(t.reply, includes("30 天"));
91
+ },
92
+ });
93
+ ```
94
+
95
+ ```bash
96
+ pnpm exec niceeval exp my-bot # 跑起来
97
+ pnpm exec niceeval view # 本地查看器里看结果
98
+ ```
99
+
100
+ 到这里第一条 eval 已经跑通。
101
+
102
+ 这个最小 adapter 是**单轮**的——第二轮不会记得第一轮说了什么,因为还没告诉应用怎么接上历史。多轮会话和工具调用事件(解锁 `t.calledTool()`)、HITL、tracing 一样,都是之后给 adapter 加的可选增量:顺着[接入你的 Agent](/zh/guides/connect-your-agent)逐层往下走即可,已写的 eval 不用改。
103
+
104
+ ## 按场景走
105
+
106
+ 已经知道自己要评什么的话,直接从对应场景开始:
107
+
108
+ <CardGroup cols={3}>
109
+ <Card title="如果你需要 eval 你的 Claude Code / Codex 插件" icon="plug" href="/zh/example/claude-code-codex-plugin">
110
+ 适合插件、Hook、MCP server 和项目级 coding-agent 扩展。
111
+ </Card>
112
+ <Card title="如果你需要 eval 你的 Claude Code / Codex Skill" icon="wand-magic-sparkles" href="/zh/example/claude-code-codex-skill">
113
+ 适合验证 Skill 是否被触发、是否按流程执行、是否真的提升任务成功率。
114
+ </Card>
115
+ <Card title="如果你需要 eval 你的 AI Agent 应用" icon="globe" href="/zh/example/ai-agent-application">
116
+ 适合 AI SDK、LangGraph、Pi 或自研 agent 应用的完整示例。
117
+ </Card>
118
+ </CardGroup>
119
+
120
+ ## 放进 CI
121
+
122
+ ```yaml
123
+ name: evals
124
+ on: [pull_request]
125
+ jobs:
126
+ evals:
127
+ runs-on: ubuntu-latest
128
+ steps:
129
+ - uses: actions/checkout@v4
130
+ - uses: actions/setup-node@v4
131
+ - run: npm ci
132
+ - run: npm exec niceeval exp my-bot
133
+ ```
134
+
135
+ <Tip>
136
+ 接下来读 [编写 eval](/zh/guides/authoring) 和 [评分指南](/zh/guides/scoring-guide),把示例替换成你的真实场景。
137
+ </Tip>