niceeval 0.4.6 → 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.
Files changed (174) hide show
  1. package/docs-site/zh/concepts/adapter.mdx +6 -6
  2. package/docs-site/zh/concepts/experiment.mdx +7 -7
  3. package/docs-site/zh/concepts/overview.mdx +1 -1
  4. package/docs-site/zh/concepts/tier.mdx +6 -6
  5. package/docs-site/zh/guides/agent-feedback-loop.mdx +63 -20
  6. package/docs-site/zh/guides/connect-your-agent.mdx +7 -7
  7. package/docs-site/zh/guides/custom-reports.mdx +243 -0
  8. package/docs-site/zh/guides/experiments.mdx +3 -3
  9. package/docs-site/zh/guides/report-components.mdx +252 -0
  10. package/docs-site/zh/guides/reporters.mdx +1 -1
  11. package/docs-site/zh/guides/results-data.mdx +224 -0
  12. package/docs-site/zh/guides/runner.mdx +1 -1
  13. package/docs-site/zh/guides/sandbox-agent.mdx +2 -2
  14. package/docs-site/zh/guides/viewing-results.mdx +147 -77
  15. package/docs-site/zh/guides/write-experiment.mdx +9 -9
  16. package/docs-site/zh/guides/write-send.mdx +6 -6
  17. package/docs-site/zh/index.mdx +1 -1
  18. package/docs-site/zh/introduction.mdx +1 -1
  19. package/docs-site/zh/reference/cli.mdx +10 -2
  20. package/docs-site/zh/reference/define-agent.mdx +5 -5
  21. package/docs-site/zh/reference/define-config.mdx +1 -1
  22. package/docs-site/zh/reference/define-eval.mdx +3 -3
  23. package/package.json +3 -2
  24. package/src/agents/ai-sdk.test.ts +1 -1
  25. package/src/agents/ai-sdk.ts +2 -2
  26. package/src/agents/claude-code.ts +1 -1
  27. package/src/agents/codex.ts +2 -2
  28. package/src/agents/streaming.test.ts +1 -1
  29. package/src/agents/types.ts +4 -4
  30. package/src/agents/ui-message-stream.test.ts +1 -1
  31. package/src/cli.ts +104 -14
  32. package/src/context/context.test.ts +1 -1
  33. package/src/context/context.ts +3 -3
  34. package/src/context/session.ts +2 -2
  35. package/src/context/types.ts +2 -2
  36. package/src/i18n/en.ts +29 -7
  37. package/src/i18n/zh-CN.ts +24 -2
  38. package/src/report/aggregate.ts +79 -50
  39. package/src/report/components.tsx +190 -0
  40. package/src/report/compute.ts +149 -84
  41. package/src/report/default-report.tsx +222 -0
  42. package/src/report/dual-face.test.tsx +527 -0
  43. package/src/report/format.ts +29 -0
  44. package/src/report/index.ts +79 -24
  45. package/src/report/load.ts +67 -0
  46. package/src/report/metrics.ts +2 -1
  47. package/src/report/param.ts +18 -0
  48. package/src/report/primitives.tsx +117 -0
  49. package/src/report/react/CaseList.tsx +2 -2
  50. package/src/report/react/DeltaTable.tsx +2 -2
  51. package/src/report/react/MetricBars.tsx +109 -0
  52. package/src/report/react/MetricLine.tsx +200 -0
  53. package/src/report/react/MetricMatrix.tsx +1 -1
  54. package/src/report/react/MetricScatter.tsx +1 -1
  55. package/src/report/react/MetricTable.tsx +1 -1
  56. package/src/report/react/RunOverview.tsx +4 -4
  57. package/src/report/react/Scoreboard.tsx +3 -3
  58. package/src/report/react/cell.tsx +1 -1
  59. package/src/report/react/fixtures.ts +98 -36
  60. package/src/report/react/format.ts +3 -28
  61. package/src/report/react/index.tsx +41 -24
  62. package/src/report/react/render.test.tsx +8 -8
  63. package/src/report/react/styles.css +77 -0
  64. package/src/report/report.test.ts +248 -128
  65. package/src/report/report.ts +69 -0
  66. package/src/report/text/faces.ts +356 -0
  67. package/src/report/text/layout.ts +125 -0
  68. package/src/report/text/plot.ts +127 -0
  69. package/src/report/tree.ts +220 -0
  70. package/src/report/types.ts +75 -27
  71. package/src/report/web.ts +40 -0
  72. package/src/results/copy.ts +95 -41
  73. package/src/results/format.ts +12 -11
  74. package/src/results/index.ts +34 -17
  75. package/src/results/open.ts +201 -81
  76. package/src/results/results.test.ts +595 -191
  77. package/src/results/select.ts +107 -55
  78. package/src/results/types.ts +137 -45
  79. package/src/results/writer.ts +258 -0
  80. package/src/runner/attempt.ts +3 -3
  81. package/src/runner/fingerprint.ts +1 -1
  82. package/src/runner/reporters/artifacts.ts +38 -78
  83. package/src/runner/reporters/braintrust.test.ts +2 -2
  84. package/src/runner/reporters/braintrust.ts +3 -3
  85. package/src/runner/run.ts +1 -1
  86. package/src/runner/types.ts +18 -12
  87. package/src/show/compose.ts +215 -0
  88. package/src/show/index.ts +263 -0
  89. package/src/show/render.ts +456 -0
  90. package/src/show/show.test.ts +505 -0
  91. package/src/view/app/App.tsx +85 -24
  92. package/src/view/app/components/CostScoreChart.tsx +29 -10
  93. package/src/view/app/components/ExperimentTable.tsx +27 -9
  94. package/src/view/app/components/GroupSelector.tsx +1 -1
  95. package/src/view/app/i18n.ts +18 -3
  96. package/src/view/app/lib/attempt-route.test.ts +9 -9
  97. package/src/view/app/lib/attempt-route.ts +5 -5
  98. package/src/view/app/lib/outcome.ts +1 -3
  99. package/src/view/app/lib/rows.ts +95 -15
  100. package/src/view/app/main.tsx +18 -6
  101. package/src/view/app/pages/RunsPage.tsx +4 -7
  102. package/src/view/app/pages/TracesPage.tsx +3 -8
  103. package/src/view/app/types.ts +50 -6
  104. package/src/view/client-dist/app.css +1 -1
  105. package/src/view/client-dist/app.js +20 -20
  106. package/src/view/data.test.ts +254 -0
  107. package/src/view/data.ts +336 -0
  108. package/src/view/index.ts +64 -10
  109. package/src/view/server.ts +31 -9
  110. package/src/view/shared/types.ts +47 -41
  111. package/src/view/styles.css +5 -0
  112. package/src/view/template.html +1 -0
  113. package/src/view/view-report.test.ts +308 -0
  114. package/docs-site/.mintignore +0 -13
  115. package/docs-site/AGENTS.md +0 -46
  116. package/docs-site/concepts/adapter.mdx +0 -287
  117. package/docs-site/concepts/assert.mdx +0 -243
  118. package/docs-site/concepts/drive.mdx +0 -118
  119. package/docs-site/concepts/evals.mdx +0 -108
  120. package/docs-site/concepts/experiment.mdx +0 -37
  121. package/docs-site/concepts/hitl.mdx +0 -83
  122. package/docs-site/concepts/judge.mdx +0 -129
  123. package/docs-site/concepts/overview.mdx +0 -98
  124. package/docs-site/concepts/tier.mdx +0 -42
  125. package/docs-site/docs-ref/00-index.md +0 -23
  126. package/docs-site/docs-ref/01-page-types.md +0 -43
  127. package/docs-site/docs-ref/03-style-rules.md +0 -45
  128. package/docs-site/docs-ref/04-code-examples.md +0 -37
  129. package/docs-site/docs-ref/05-dx-failure-paths.md +0 -45
  130. package/docs-site/docs-ref/06-checklists.md +0 -53
  131. package/docs-site/docs.json +0 -256
  132. package/docs-site/example/ai-agent-application.mdx +0 -148
  133. package/docs-site/example/claude-code-codex-plugin.mdx +0 -162
  134. package/docs-site/example/claude-code-codex-skill.mdx +0 -147
  135. package/docs-site/example/showcase.mdx +0 -39
  136. package/docs-site/example/tier1-ai-sdk-v7.mdx +0 -136
  137. package/docs-site/example/tier1-claude-sdk.mdx +0 -119
  138. package/docs-site/example/tier1-codex-sdk.mdx +0 -111
  139. package/docs-site/example/tier1-langgraph.mdx +0 -119
  140. package/docs-site/example/tier1-pi-sdk.mdx +0 -119
  141. package/docs-site/favicon.svg +0 -5
  142. package/docs-site/github-diff.css +0 -135
  143. package/docs-site/github-diff.js +0 -11
  144. package/docs-site/guides/authoring.mdx +0 -129
  145. package/docs-site/guides/ci-integration.mdx +0 -97
  146. package/docs-site/guides/connect-otel.mdx +0 -209
  147. package/docs-site/guides/connect-your-agent.mdx +0 -221
  148. package/docs-site/guides/dataset-fanout.mdx +0 -98
  149. package/docs-site/guides/experiments.mdx +0 -71
  150. package/docs-site/guides/fixtures.mdx +0 -147
  151. package/docs-site/guides/reporters.mdx +0 -113
  152. package/docs-site/guides/runner.mdx +0 -79
  153. package/docs-site/guides/sandbox-agent.mdx +0 -138
  154. package/docs-site/guides/sandbox-backends.mdx +0 -64
  155. package/docs-site/guides/scoring-guide.mdx +0 -92
  156. package/docs-site/guides/viewing-results.mdx +0 -195
  157. package/docs-site/guides/write-experiment.mdx +0 -81
  158. package/docs-site/guides/write-send.mdx +0 -347
  159. package/docs-site/index.mdx +0 -181
  160. package/docs-site/introduction.mdx +0 -141
  161. package/docs-site/quickstart.mdx +0 -136
  162. package/docs-site/reference/builtin-agents.mdx +0 -161
  163. package/docs-site/reference/capabilities.mdx +0 -76
  164. package/docs-site/reference/cli.mdx +0 -120
  165. package/docs-site/reference/define-agent.mdx +0 -168
  166. package/docs-site/reference/define-config.mdx +0 -41
  167. package/docs-site/reference/define-eval.mdx +0 -160
  168. package/docs-site/reference/events.mdx +0 -131
  169. package/docs-site/reference/expect.mdx +0 -112
  170. package/docs-site/tracker.js +0 -8
  171. package/src/report/react/data.ts +0 -17
  172. package/src/view/aggregate.ts +0 -103
  173. package/src/view/loader.test.ts +0 -61
  174. package/src/view/loader.ts +0 -257
@@ -1,43 +0,0 @@
1
- # 第一步:判定页面类型
2
-
3
- 蒸馏自 [01-diataxis-divio.md](../dev-docs-dx-sources/01-diataxis-divio.md)、[06-good-docs-project.md](../dev-docs-dx-sources/06-good-docs-project.md)。
4
-
5
- ## 核心规则
6
-
7
- 动笔前先回答:**这页服务读者的哪种需求——学习、干活、查事实,还是理解?**
8
-
9
- | 类型 | 读者需求 | 一句话定义 |
10
- | --- | --- | --- |
11
- | Tutorial | 学习 | 带用户安全地完成第一次成功,建立信心和心智模型 |
12
- | How-to | 干活 | 帮已有基础的用户完成一个现实任务 |
13
- | Reference | 查事实 | 准确、完整、低解释负担地描述字段、命令、类型 |
14
- | Explanation (Concept) | 理解 | 解释概念边界、背景、取舍和"为什么" |
15
- | Troubleshooting | 修复 | 按症状定位原因并给出解决步骤 |
16
-
17
- 如果一个页面同时承担两种以上主要目标,**优先拆页**,不要加小标题硬塞。
18
-
19
- ## NiceEval 目录映射
20
-
21
- - `quickstart`:Tutorial。只保留一条最短成功路径。
22
- - `guides/*`:How-to。一个页面解决一个任务。
23
- - `concepts/*`:Explanation。解释核心心智模型和概念边界。
24
- - `reference/*`:Reference。只列当前实现支持的事实。
25
- - `troubleshooting/*`(未来):按症状组织排错。
26
- - `example` / `examples/*`:真实可运行例子,不承担完整解释。
27
-
28
- ## 每种类型的典型越界(写之前自查)
29
-
30
- - Tutorial 不要变成 API 字段大全,不要展示全部选项和复杂边界。
31
- - How-to 不要教零基础概念,不要写成长篇设计说明。
32
- - Reference 不要混入 onboarding 叙事,不要写未实现字段或 roadmap。
33
- - Explanation 不要伪装成操作步骤,不要写成内部设计流水账。
34
- - Concept 页要写"它不是什么",防止用户把相邻层次混在一起(例如 Adapter 和 Sandbox)。
35
-
36
- ## 检查问题
37
-
38
- - 这页是在服务学习、工作、查事实,还是理解?
39
- - 页面是否同时承担了两种以上主要目标?
40
- - 如果是 Tutorial,用户能否安全地拿到第一次成功?
41
- - 如果是 How-to,读完能否完成一个具体任务?
42
- - 如果是 Reference,信息是否完整、准确、无叙事打断?
43
- - 如果是 Explanation,是否真的解释了边界和原因,而不是在重复操作步骤?
@@ -1,45 +0,0 @@
1
- # 第三步:行文规则
2
-
3
- ## 语气与句法
4
-
5
- - 第二人称,直接对读者说话;主动语态,动作主体明确。
6
- - 短句。一段一个想法,一句一个主要信息。
7
- - 对话式但不轻浮;直接帮用户完成任务,不要营销式铺垫。
8
- - 不解释开发者已知的基础常识(一般的 TypeScript、Node.js、CLI 用法),除非 NiceEval 依赖某个不明显细节。
9
- - 删掉"下面我们将会""值得注意的是"这类预告式和填充式表达,直接说要完成什么。
10
- - 命令、路径、flag、文件名、包名、代码标识一律用反引号(术语用法见 `docs-site/AGENTS.md` 术语表)。
11
-
12
- ## 步骤写作
13
-
14
- - 步骤为完成任务服务,用编号列表;单步任务不要硬写成编号流程。
15
- - 引导句提供上下文,不要只重复标题。
16
- - 一步一个主要动作。
17
- - 先说在哪里操作,再说做什么;条件放在动作前面("如果要 X,先运行 Y",不是"运行 Y,如果你要 X")。
18
- - 可选步骤用 `Optional:` / "可选:" 明确标注。
19
- - 多种做法并存时,先写最短、最简单的默认路径;变体放独立小节或独立页面,不要在主路径里分叉。
20
- - 最好的步骤是用户不需要读的步骤:如果 CLI 输出或错误信息能自解释,优先改进它们,再考虑补文档。
21
-
22
- ## 可扫描性
23
-
24
- 多数读者在扫描,不在通读:
25
-
26
- - 重要信息放页面前 1/3。
27
- - 小标题要有信息量,读者只看标题也能定位内容。
28
- - 列表、表格、代码块、提示块合理分隔正文。
29
- - 强调(加粗等)只用于真正重要的信息,滥用等于没有。
30
- - 链接文字要有描述性,不写"点击这里"。
31
-
32
- ## 标题与搜索意图
33
-
34
- - 搜索是用户进入文档的主要入口。标题、description、正文要用**用户会搜索的词**,不是内部功能名——"连接远程 Agent"比"Adapter primitives"更适合作任务页标题。
35
- - 每篇文章一个清晰、离散的主题。
36
- - 重命名或移动页面时维护 redirect,避免旧链接失效。
37
-
38
- ## 内容边界与重复
39
-
40
- - "刚好足够"优于穷举:优先高影响、高价值场景,不为完整性堆低频分支。
41
- - ARID,不是 DRY:文档允许适度重复关键上下文,不要为消灭重复迫使读者跨三页拼信息。但**同一事实的权威来源只有一处**,其他地方链接过去——docs-site、README、示例、CLI help 之间要有清晰边界,避免同一能力多处漂移。
42
- - 一旦选择覆盖某类信息就覆盖完整;只做部分覆盖时要明说。
43
- - FAQ 不是信息架构:真实高频问题应沉淀为 guide、reference 或 troubleshooting 页。
44
- - 内容要可精确链接(addressable):重要段落有稳定的标题锚点,方便从错误信息、报告和其它页面直链。
45
- - 先讲前置概念,再讲依赖它的内容(cumulative)。
@@ -1,37 +0,0 @@
1
- # 第四步:代码示例规则
2
-
3
- ## 写示例前
4
-
5
- - **先真实跑过。** 写 reference 或示例前,实际运行过这个 API / 命令,而不是从类型定义或设计稿抄字段。这是 MDN 和 I'd Rather Be Writing 共同的第一条规则。
6
- - 知道这个 API 最常见的使用路径,示例展示的应该是它,不是罕见变体。
7
-
8
- ## 示例的结构
9
-
10
- 按"目的 → 代码 → 解释 → 结果"组织:
11
-
12
- 1. 代码块前一句话说明整体目的(它完成什么任务,不是逐行复述)。
13
- 2. 代码使用真实导入路径、真实文件名;能被复制运行。
14
- 3. 占位符(`<your-agent-url>` 之类)逐个解释清楚。
15
- 4. 如果输出影响读者判断,展示或描述期望输出。
16
-
17
- ## 注释
18
-
19
- - 注释解释关键行的作用和**为什么这样写**,不假设读者知道示例为什么长这样。
20
- - 注释增加复杂度,只在确有必要时用;短示例配好前置说明通常不需要行内注释。
21
-
22
- ## 输入与输出成对
23
-
24
- 发送/调用类 API 的示例要同时有 request / input 示例和 response / output 示例。只给输入不给输出,读者无法验证自己跑对了。
25
-
26
- ## Reference 与示例互相补足
27
-
28
- - Reference 讲字段、类型、默认值;示例讲具体用法。只有其一都不完整。
29
- - 每个 reference 页配至少一个短示例;每个示例链接回字段细节所在的 reference。
30
-
31
- ## 维护义务
32
-
33
- - 示例随 API 更新维护:改 API 时必须同步检查所有相关示例、注释、描述和链接。
34
- - 过期示例比没有示例更危险,发现后优先修正或删除。
35
- - 一页里多个相似示例考虑合并,减少读者负担。
36
- - 新旧写法都有效时,明确记录差异,不要让读者猜哪个是现在的推荐。
37
- - 文档链接示例目录时必须指向真实存在的路径(当前完整示例在 `examples/zh/`)。
@@ -1,45 +0,0 @@
1
- # 第五步:失败路径与 DX 视角
2
-
3
- ## 文档是 DX 系统的一部分
4
-
5
- 文档不是孤立内容资产。错误信息、CLI 输出、报告页、示例、CHANGELOG、迁移指南都在承担文档职责。写一页文档前先问:**这页降低了哪类开发者摩擦?这个摩擦是不是该由 CLI 输出或错误信息解决?**
6
-
7
- - 报错即文档:错误信息应链接到可操作说明,并给出下一步。
8
- - 能用更好的 CLI 输出、默认值或自动化解决的问题,优先改产品,再补文档。
9
- - 测试用例和可运行示例也是用户理解用法的资料。
10
-
11
- ## 覆盖失败路径,不只是成功路径
12
-
13
- 用户第一次失败后能否自助修复,是文档质量的核心指标。NiceEval 文档要覆盖的失败类别:
14
-
15
- - setup 失败。
16
- - adapter 连接失败。
17
- - sandbox / runtime 失败。
18
- - eval assertion 失败。
19
- - judge 失败。
20
- - report / view 失败。
21
-
22
- 每类失败都要告诉用户五件事:
23
-
24
- 1. 现象(用户看到什么)。
25
- 2. 看哪个 artifact。
26
- 3. 运行哪个命令。
27
- 4. 常见原因。
28
- 5. 下一步。
29
-
30
- ## 可预测性:结构一致是一种功能
31
-
32
- Twilio 的 DX 光谱里,比"能跑通"更高的目标是"可预测":同类页面结构一致,用户熟悉一个 adapter 的文档后,能零成本迁移到另一个 adapter 的文档,知道信息在哪个位置。所以:
33
-
34
- - 同类型页面用同一骨架(见 [02-page-skeletons.md](./02-page-skeletons.md)),不要每页自创结构。
35
- - 概念(Agent / Adapter / Sandbox / Turn)的解释要让用户能**预测系统行为**,不只是背定义。
36
-
37
- ## 衡量文档好坏的信号
38
-
39
- 写作和评审时可以对照:
40
-
41
- - Time to first successful eval 是否被 quickstart 缩短。
42
- - 反复出现的用户问题是否有对应文档页。
43
- - 文档能否从错误信息、报告、CLI 输出、README 到达。
44
- - 文档与产品实际行为是否一致——不一致按 Twilio 的标准就是 Broken。
45
- - 同一问题在 Slack / issue 里反复出现、新人 onboarding 慢、PR 因缺上下文变慢,都是文档缺口的组织信号。
@@ -1,53 +0,0 @@
1
- # 第六步:检查清单
2
-
3
- ## 动笔前
4
-
5
- - [ ] 谁会读这页?他们要完成什么?读完应该能做什么或理解什么?
6
- - [ ] 页面类型判定了吗(Tutorial / How-to / Reference / Explanation / Troubleshooting)?
7
- - [ ] 是否已实际跑过要写的命令、API 或示例?
8
- - [ ] 声明的每个能力、字段、路径,是否对当前代码或 `docs/` 核实过?
9
- - [ ] 这个信息的权威来源是否已存在于别处?如果是,链接过去而不是复制。
10
-
11
- ## 按类型
12
-
13
- **Tutorial / Quickstart**
14
-
15
- - [ ] 只有一条最短成功路径,没有分叉。
16
- - [ ] 每步有明确反馈,用户知道自己成功了。
17
- - [ ] 没有混入字段大全和概念长文。
18
-
19
- **How-to**
20
-
21
- - [ ] 一页只解决一个任务;标题匹配用户会搜索的词。
22
- - [ ] 步骤按"动作 → 命令 → 占位符 → 期望输出 → 失败时下一步"组织。
23
- - [ ] 有"验证结果"和"常见失败"小节。
24
-
25
- **Reference**
26
-
27
- - [ ] 字段、类型、默认值、必填性完整。
28
- - [ ] 没有未实现字段、roadmap 或叙事化教学。
29
- - [ ] 有短示例并链接到对应 guide。
30
-
31
- **Concept**
32
-
33
- - [ ] 写了"它不是什么",和相邻概念划清边界。
34
- - [ ] 没有变成操作步骤或内部设计流水账。
35
-
36
- **Troubleshooting**
37
-
38
- - [ ] 症状、原因、检查步骤、解决办法齐全。
39
- - [ ] 按用户可见症状组织,不按内部模块。
40
-
41
- ## 发布前
42
-
43
- - [ ] 重要信息在页面前 1/3;第一屏能判断相关性。
44
- - [ ] 每个步骤一个动作;条件在动作前;可选步骤已标注。
45
- - [ ] 代码相关文本用反引号;链接文字有描述性。
46
- - [ ] 示例可复制运行,导入路径真实,输出已展示或说明。
47
- - [ ] 改动涉及的其它入口(README、示例、英文/中文对应页)已同步或明确留待同步。
48
- - [ ] 新增/重命名页面已更新 `docs.json`,旧链接加了 redirect。
49
- - [ ] 跑过 `docs:validate` 和 `docs:links`(命令见 `docs-site/AGENTS.md`)。
50
-
51
- ## 只改 `docs-ref/` 内部参考时
52
-
53
- 不进导航,不需要跑 Mintlify 校验,但至少检查:文件路径正确、相对链接可达、没有把内部草稿写成正式产品承诺。
@@ -1,256 +0,0 @@
1
- {
2
- "$schema": "https://mintlify.com/docs.json",
3
- "name": "niceeval",
4
- "theme": "luma",
5
- "favicon": "/favicon.svg",
6
- "logo": {
7
- "light": "/images/logo.svg",
8
- "dark": "/images/logo.svg"
9
- },
10
- "colors": {
11
- "primary": "#848c8e",
12
- "light": "#11161e",
13
- "dark": "#cfd0d2"
14
- },
15
- "navbar": {
16
- "primary": {
17
- "type": "github",
18
- "href": "https://github.com/CorrectRoadH/niceeval"
19
- }
20
- },
21
- "redirects": [
22
- {
23
- "source": "/concepts/scoring",
24
- "destination": "/concepts/assert"
25
- },
26
- {
27
- "source": "/concepts/agents-adapters",
28
- "destination": "/concepts/adapter"
29
- },
30
- {
31
- "source": "/guides/connect-agent",
32
- "destination": "/guides/connect-your-agent"
33
- },
34
- {
35
- "source": "/concepts/write-send",
36
- "destination": "/guides/write-send"
37
- },
38
- {
39
- "source": "/zh/concepts/scoring",
40
- "destination": "/zh/concepts/assert"
41
- },
42
- {
43
- "source": "/zh/concepts/agents-adapters",
44
- "destination": "/zh/concepts/adapter"
45
- },
46
- {
47
- "source": "/zh/concepts/write-send",
48
- "destination": "/zh/guides/write-send"
49
- },
50
- {
51
- "source": "/reference/configuration",
52
- "destination": "/reference/define-config"
53
- },
54
- {
55
- "source": "/zh/reference/configuration",
56
- "destination": "/zh/reference/define-config"
57
- },
58
- {
59
- "source": "/zh/example/eval-multil-turn-for-your-agent",
60
- "destination": "/zh/concepts/drive"
61
- }
62
- ],
63
- "navigation": {
64
- "languages": [
65
- {
66
- "language": "en",
67
- "default": true,
68
- "tabs": [
69
- {
70
- "tab": "Documentation",
71
- "groups": [
72
- {
73
- "group": "Get Started",
74
- "pages": [
75
- "introduction",
76
- "quickstart"
77
- ]
78
- },
79
- {
80
- "group": "Core Concepts",
81
- "pages": [
82
- "concepts/overview",
83
- "concepts/evals",
84
- "concepts/experiment",
85
- "concepts/adapter",
86
- "concepts/tier",
87
- "concepts/drive",
88
- "concepts/hitl",
89
- "concepts/assert",
90
- "concepts/judge"
91
- ]
92
- },
93
- {
94
- "group": "Connecting Agents",
95
- "pages": [
96
- "guides/connect-your-agent",
97
- "guides/write-send",
98
- "guides/connect-otel",
99
- "guides/sandbox-agent",
100
- "guides/sandbox-backends"
101
- ]
102
- },
103
- {
104
- "group": "Evals & Experiments",
105
- "pages": [
106
- "guides/authoring",
107
- "guides/write-experiment",
108
- "guides/experiments",
109
- "guides/fixtures",
110
- "guides/dataset-fanout",
111
- "guides/scoring-guide"
112
- ]
113
- },
114
- {
115
- "group": "Examples",
116
- "pages": [
117
- "example/claude-code-codex-plugin",
118
- "example/claude-code-codex-skill",
119
- "example/ai-agent-application",
120
- "example/showcase"
121
- ]
122
- },
123
- {
124
- "group": "Running & Observing",
125
- "pages": [
126
- "guides/runner",
127
- "guides/ci-integration",
128
- "guides/reporters",
129
- "guides/viewing-results"
130
- ]
131
- }
132
- ]
133
- },
134
- {
135
- "tab": "Reference",
136
- "groups": [
137
- {
138
- "group": "API",
139
- "pages": [
140
- "reference/define-eval",
141
- "reference/define-agent",
142
- "reference/events",
143
- "reference/capabilities",
144
- "reference/builtin-agents",
145
- "reference/define-config",
146
- "reference/expect"
147
- ]
148
- },
149
- {
150
- "group": "CLI",
151
- "pages": [
152
- "reference/cli"
153
- ]
154
- }
155
- ]
156
- }
157
- ]
158
- },
159
- {
160
- "language": "zh-Hans",
161
- "tabs": [
162
- {
163
- "tab": "文档",
164
- "groups": [
165
- {
166
- "group": "开始使用",
167
- "pages": [
168
- "zh/introduction",
169
- "zh/quickstart"
170
- ]
171
- },
172
- {
173
- "group": "核心概念",
174
- "pages": [
175
- "zh/concepts/overview",
176
- "zh/concepts/evals",
177
- "zh/concepts/experiment",
178
- "zh/concepts/adapter",
179
- "zh/concepts/tier",
180
- "zh/concepts/drive",
181
- "zh/concepts/hitl",
182
- "zh/concepts/assert",
183
- "zh/concepts/judge"
184
- ]
185
- },
186
- {
187
- "group": "连接 Agent",
188
- "pages": [
189
- "zh/guides/connect-your-agent",
190
- "zh/guides/official-adapters",
191
- "zh/guides/write-send",
192
- "zh/guides/connect-otel",
193
- "zh/guides/sandbox-agent",
194
- "zh/guides/sandbox-backends"
195
- ]
196
- },
197
- {
198
- "group": "评估与实验",
199
- "pages": [
200
- "zh/guides/authoring",
201
- "zh/guides/write-experiment",
202
- "zh/guides/experiments",
203
- "zh/guides/fixtures",
204
- "zh/guides/dataset-fanout",
205
- "zh/guides/scoring-guide"
206
- ]
207
- },
208
- {
209
- "group": "示例",
210
- "pages": [
211
- "zh/example/claude-code-codex-plugin",
212
- "zh/example/claude-code-codex-skill",
213
- "zh/example/ai-agent-application",
214
- "zh/example/showcase"
215
- ]
216
- },
217
- {
218
- "group": "运行与观察",
219
- "pages": [
220
- "zh/guides/runner",
221
- "zh/guides/ci-integration",
222
- "zh/guides/reporters",
223
- "zh/guides/viewing-results",
224
- "zh/guides/agent-feedback-loop"
225
- ]
226
- }
227
- ]
228
- },
229
- {
230
- "tab": "参考",
231
- "groups": [
232
- {
233
- "group": "API",
234
- "pages": [
235
- "zh/reference/define-eval",
236
- "zh/reference/define-agent",
237
- "zh/reference/events",
238
- "zh/reference/capabilities",
239
- "zh/reference/builtin-agents",
240
- "zh/reference/define-config",
241
- "zh/reference/expect"
242
- ]
243
- },
244
- {
245
- "group": "CLI",
246
- "pages": [
247
- "zh/reference/cli"
248
- ]
249
- }
250
- ]
251
- }
252
- ]
253
- }
254
- ]
255
- }
256
- }
@@ -1,148 +0,0 @@
1
- ---
2
- title: "Eval Your AI Agent Application"
3
- sidebarTitle: "Eval AI Agent Applications"
4
- description: ""
5
- ---
6
-
7
- This example shows how to use niceeval to evaluate your own AI agent application.
8
-
9
- See the full example code: https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/ai-sdk
10
-
11
- The system under test is a general-purpose AI assistant application built with an AI SDK tool loop. It handles messages, calls tools (weather / calculator / search), understands images, and uses Langfuse for its own observability. The application doesn't need a sandbox during testing — niceeval reaches it through a direct adapter.
12
-
13
- ## Directory structure
14
-
15
- ```text
16
- examples/zh/ai-sdk/
17
- src/ # web agent under test (POST /api/turn, tools + image understanding)
18
- adapter/adapter.ts # niceeval adapter: factory webAgent({ baseUrl })
19
- evals/ # conversational evals
20
- weather-tool.eval.ts # ask about weather → calls get_weather
21
- image-understanding.eval.ts # image understanding
22
- experiments/
23
- compare-models/ # experiment group: one file per model
24
- gpt-5.4.ts
25
- deepseek-v4-pro.ts
26
- niceeval.config.ts # register adapter, judge, concurrency
27
- ```
28
-
29
- ## Define the adapter
30
-
31
- The adapter tells niceeval how to send requests to the AI agent and how to read responses as a standard event stream. It's a factory function: `baseUrl` (where the service runs) is passed in from the outside so the adapter never hardcodes it or reads from env.
32
-
33
- ```ts
34
- // adapter/adapter.ts
35
- import { defineAgent } from "niceeval/adapter";
36
- import type { Agent } from "niceeval/adapter";
37
- import type { StreamEvent } from "niceeval";
38
- import type { AgentEvent, AgentResponse } from "../src/protocol.ts";
39
-
40
- export function webAgent(opts: { baseUrl: string }): Agent {
41
- const baseUrl = opts.baseUrl.replace(/\/$/, "");
42
- return defineAgent({
43
- name: "web-agent",
44
- async send(input, ctx) {
45
- const response = await fetch(`${baseUrl}/api/turn`, {
46
- method: "POST",
47
- headers: { "content-type": "application/json" },
48
- body: JSON.stringify({
49
- sessionId: ctx.session.id,
50
- message: input.text,
51
- model: ctx.model,
52
- files: input.files,
53
- otelEndpoint: ctx.telemetry?.endpoint, // dual observability: let the app send this turn's spans back to niceeval
54
- }),
55
- signal: ctx.signal,
56
- });
57
- // Shared contract within the same workspace — read as AgentResponse directly, no need to validate as unknown.
58
- const body = (await response.json()) as AgentResponse;
59
- ctx.session.capture(body.sessionId);
60
- return {
61
- events: body.events.map(toStreamEvent),
62
- data: body.data,
63
- status: "completed" as const,
64
- };
65
- },
66
- });
67
- }
68
-
69
- function toStreamEvent(event: AgentEvent): StreamEvent {
70
- if (event.type === "action.called") return { ...event, tool: "unknown" };
71
- return event;
72
- }
73
- ```
74
-
75
- ## Multi-turn messages
76
-
77
- Within the same conversation line, `ctx.session.id` automatically carries over to the next turn; the adapter just writes the agent's returned `sessionId` back with `ctx.session.capture()`. To split traffic by feature flag within an experiment, see [Experiments](/guides/experiments).
78
-
79
- ## Define evals
80
-
81
- Each eval sends a message and asserts on the reply, tool calls, and image understanding. Deterministic assertions (`calledTool`, `messageIncludes`) run without an API key; open-ended scoring with a judge requires a key to be set.
82
-
83
- ```ts
84
- // evals/weather-tool.eval.ts
85
- import { defineEval } from "niceeval";
86
-
87
- export default defineEval({
88
- description: "AI assistant: asking about weather calls get_weather",
89
- async test(t) {
90
- const turn = await t.send("What's the weather like in Brooklyn today?");
91
- turn.succeeded();
92
- await t.group("calls get_weather with correct city", () => {
93
- t.calledTool("get_weather", { input: { city: "Brooklyn" } });
94
- t.messageIncludes(/°[CF]|temperature|weather/i);
95
- });
96
- t.judge.autoevals.closedQA("Does the assistant answer based on the tool's returned weather data, not a hallucination?").atLeast(0.7);
97
- },
98
- });
99
- ```
100
-
101
- For image understanding, use `t.sendFile()` to attach an image. The adapter forwards `input.files` to the web agent:
102
-
103
- ```ts
104
- // evals/image-understanding.eval.ts
105
- await t.sendFile(new URL("./fixtures/sample.png", import.meta.url).pathname);
106
- const turn = await t.send("What's in this image?");
107
- t.messageIncludes(/cat/i); // the sample image is a cat
108
- ```
109
-
110
- ## Define experiments
111
-
112
- **One experiment file = one configuration** (single model). For cross-model comparison, write multiple files in the same experiment group folder:
113
-
114
- ```ts
115
- // experiments/compare-models/gpt-5.4.ts
116
- import { defineExperiment } from "niceeval";
117
- import { webAgent } from "../../adapter/adapter.ts";
118
-
119
- export default defineExperiment({
120
- description: "gpt-5.4: model comparison",
121
- agent: webAgent({ baseUrl: "http://127.0.0.1:5188" }),
122
- model: "gpt-5.4", // single string; copy this file and change one line for each model
123
- runs: 2,
124
- earlyExit: true,
125
- });
126
- ```
127
-
128
- ## Start evaluating
129
-
130
- First start the service under test (defaults to mock mode — no API key required). This example is a standalone npm project where `niceeval` is a local dependency:
131
-
132
- ```bash
133
- cd examples/zh/ai-sdk && pnpm install && pnpm dev
134
- ```
135
-
136
- Open a second terminal and run evals:
137
-
138
- ```bash
139
- cd examples/zh/ai-sdk
140
- pnpm exec niceeval exp compare-models # run the model comparison experiment
141
- pnpm exec niceeval exp compare-models weather-tool # run one eval inside that experiment
142
- ```
143
-
144
- ## Next steps
145
-
146
- - [Connect Your Agent](/guides/connect-your-agent) — the from-scratch tutorial for `defineAgent`.
147
- - [Authoring Evals](/guides/authoring) — single-turn, multi-turn, and dataset evals.
148
- - [CI Integration](/guides/ci-integration) — put agent regression tests in PRs.