niceeval 0.9.1 → 0.10.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 (428) hide show
  1. package/INDEX.md +31 -33
  2. package/dist/agents/types.d.ts +20 -17
  3. package/dist/context/types.d.ts +21 -21
  4. package/dist/i18n/en.d.ts +10 -2
  5. package/dist/i18n/zh-CN.d.ts +14 -6
  6. package/dist/o11y/execution-tree.d.ts +103 -0
  7. package/dist/o11y/otlp/select.d.ts +22 -0
  8. package/dist/report/{react → assets}/colors.d.ts +8 -0
  9. package/dist/report/{react → assets}/colors.js +23 -0
  10. package/dist/report/built-in/index.d.ts +2 -2
  11. package/dist/report/built-in/index.js +2 -2
  12. package/dist/report/built-in/standard.d.ts +8 -1
  13. package/dist/report/built-in/standard.js +17 -7
  14. package/dist/report/components/attempt-detail/AttemptAssertions.d.ts +6 -0
  15. package/dist/report/components/attempt-detail/AttemptAssertions.js +17 -0
  16. package/dist/report/components/attempt-detail/AttemptConversation.d.ts +6 -0
  17. package/dist/report/components/attempt-detail/AttemptConversation.js +34 -0
  18. package/dist/report/components/attempt-detail/AttemptDiagnostics.d.ts +6 -0
  19. package/dist/report/components/attempt-detail/AttemptDiagnostics.js +7 -0
  20. package/dist/report/components/attempt-detail/AttemptDiff.d.ts +6 -0
  21. package/dist/report/components/attempt-detail/AttemptDiff.js +11 -0
  22. package/dist/report/components/attempt-detail/AttemptError.d.ts +6 -0
  23. package/dist/report/components/attempt-detail/AttemptError.js +16 -0
  24. package/dist/report/components/attempt-detail/AttemptFixPrompt.d.ts +6 -0
  25. package/dist/report/components/attempt-detail/AttemptFixPrompt.js +7 -0
  26. package/dist/report/components/attempt-detail/AttemptSource.d.ts +6 -0
  27. package/dist/report/components/attempt-detail/AttemptSource.js +27 -0
  28. package/dist/report/components/attempt-detail/AttemptSummary.d.ts +8 -0
  29. package/dist/report/components/attempt-detail/AttemptSummary.js +20 -0
  30. package/dist/report/components/attempt-detail/AttemptTimeline.d.ts +6 -0
  31. package/dist/report/components/attempt-detail/AttemptTimeline.js +28 -0
  32. package/dist/report/components/attempt-detail/AttemptTrace.d.ts +6 -0
  33. package/dist/report/components/attempt-detail/AttemptTrace.js +29 -0
  34. package/dist/report/components/attempt-detail/AttemptUsage.d.ts +6 -0
  35. package/dist/report/components/attempt-detail/AttemptUsage.js +20 -0
  36. package/dist/report/components/attempt-detail/compute.d.ts +24 -0
  37. package/dist/report/components/attempt-detail/compute.js +254 -0
  38. package/dist/report/components/attempt-detail/faces.d.ts +14 -0
  39. package/dist/report/components/attempt-detail/faces.js +235 -0
  40. package/dist/report/components/attempt-detail/index.d.ts +38 -0
  41. package/dist/report/components/attempt-detail/index.js +527 -0
  42. package/dist/report/{react → components}/cell.d.ts +5 -3
  43. package/dist/report/{react → components}/cell.js +3 -3
  44. package/dist/report/{react → components/entity-lists}/AttemptList.d.ts +8 -4
  45. package/dist/report/{react → components/entity-lists}/AttemptList.js +16 -10
  46. package/dist/report/{react → components/entity-lists}/EvalList.d.ts +3 -3
  47. package/dist/report/{react → components/entity-lists}/EvalList.js +0 -0
  48. package/dist/report/{react → components/entity-lists}/ExperimentList.d.ts +3 -3
  49. package/dist/report/{react → components/entity-lists}/ExperimentList.js +10 -10
  50. package/dist/report/components/entity-lists/compute.d.ts +23 -0
  51. package/dist/report/components/entity-lists/compute.js +171 -0
  52. package/dist/report/components/entity-lists/faces.d.ts +5 -0
  53. package/dist/report/components/entity-lists/faces.js +174 -0
  54. package/dist/report/components/entity-lists/index.d.ts +51 -0
  55. package/dist/report/components/entity-lists/index.js +165 -0
  56. package/dist/report/{react → components}/fixtures.d.ts +2 -2
  57. package/dist/report/{react → components}/fixtures.js +1 -1
  58. package/dist/report/{react → components/metric-views}/DeltaTable.d.ts +2 -2
  59. package/dist/report/{react → components/metric-views}/DeltaTable.js +4 -4
  60. package/dist/report/{react → components/metric-views}/MetricBars.d.ts +3 -3
  61. package/dist/report/{react → components/metric-views}/MetricBars.js +3 -3
  62. package/dist/report/{react → components/metric-views}/MetricLine.d.ts +2 -2
  63. package/dist/report/{react → components/metric-views}/MetricLine.js +8 -5
  64. package/dist/report/{react → components/metric-views}/MetricMatrix.d.ts +3 -3
  65. package/dist/report/{react → components/metric-views}/MetricMatrix.js +4 -4
  66. package/dist/report/components/metric-views/MetricScatter.d.ts +11 -0
  67. package/dist/report/{react → components/metric-views}/MetricScatter.js +26 -23
  68. package/dist/report/{react → components/metric-views}/MetricTable.d.ts +3 -3
  69. package/dist/report/{react → components/metric-views}/MetricTable.js +4 -4
  70. package/dist/report/{react → components/metric-views}/Scoreboard.d.ts +2 -2
  71. package/dist/report/{react → components/metric-views}/Scoreboard.js +3 -3
  72. package/dist/report/components/metric-views/compute.d.ts +89 -0
  73. package/dist/report/{compute.js → components/metric-views/compute.js} +32 -415
  74. package/dist/report/components/metric-views/faces.d.ts +13 -0
  75. package/dist/report/components/metric-views/faces.js +381 -0
  76. package/dist/report/components/metric-views/index.d.ts +50 -0
  77. package/dist/report/components/metric-views/index.js +273 -0
  78. package/dist/report/{text → components/metric-views}/plot.js +1 -1
  79. package/dist/report/components/shared-compute.d.ts +22 -0
  80. package/dist/report/components/shared-compute.js +47 -0
  81. package/dist/report/components/shared-faces.d.ts +9 -0
  82. package/dist/report/components/shared-faces.js +26 -0
  83. package/dist/report/components/shared.d.ts +68 -0
  84. package/dist/report/components/shared.js +125 -0
  85. package/dist/report/{react → components/site-components}/CopyFixPrompt.d.ts +2 -2
  86. package/dist/report/{react → components/site-components}/CopyFixPrompt.js +2 -2
  87. package/dist/report/{react → components/site-components}/HeroCard.d.ts +2 -2
  88. package/dist/report/{react → components/site-components}/HeroCard.js +2 -2
  89. package/dist/report/{react → components/site-components}/ScopeWarnings.d.ts +2 -2
  90. package/dist/report/{react → components/site-components}/ScopeWarnings.js +3 -3
  91. package/dist/report/{react → components/site-components}/TraceWaterfall.d.ts +3 -3
  92. package/dist/report/{react → components/site-components}/TraceWaterfall.js +5 -5
  93. package/dist/report/components/site-components/compute.d.ts +28 -0
  94. package/dist/report/components/site-components/compute.js +132 -0
  95. package/dist/report/components/site-components/faces.d.ts +21 -0
  96. package/dist/report/components/site-components/faces.js +75 -0
  97. package/dist/report/components/site-components/index.d.ts +74 -0
  98. package/dist/report/components/site-components/index.js +220 -0
  99. package/dist/report/{scope-warnings.d.ts → components/site-components/scope-warnings.d.ts} +2 -2
  100. package/dist/report/{scope-warnings.js → components/site-components/scope-warnings.js} +2 -2
  101. package/dist/report/{react → components/summaries}/ScopeSummary.d.ts +2 -2
  102. package/dist/report/{react → components/summaries}/ScopeSummary.js +17 -8
  103. package/dist/report/components/summaries/compute.d.ts +7 -0
  104. package/dist/report/components/summaries/compute.js +51 -0
  105. package/dist/report/components/summaries/faces.d.ts +7 -0
  106. package/dist/report/components/summaries/faces.js +38 -0
  107. package/dist/report/components/summaries/index.d.ts +27 -0
  108. package/dist/report/components/summaries/index.js +78 -0
  109. package/dist/report/definition/grid-layout.d.ts +50 -0
  110. package/dist/report/definition/grid-layout.js +89 -0
  111. package/dist/report/{primitives.d.ts → definition/primitives.d.ts} +34 -4
  112. package/dist/report/{primitives.js → definition/primitives.js} +101 -10
  113. package/dist/report/{report.d.ts → definition/report.d.ts} +36 -65
  114. package/dist/report/{report.js → definition/report.js} +58 -90
  115. package/dist/report/{text/table.d.ts → definition/table-text.d.ts} +2 -2
  116. package/dist/report/{text/table.js → definition/table-text.js} +2 -2
  117. package/dist/report/{tree.d.ts → definition/tree.d.ts} +43 -11
  118. package/dist/report/{tree.js → definition/tree.js} +9 -11
  119. package/dist/report/index.d.ts +33 -18
  120. package/dist/report/index.js +23 -14
  121. package/dist/report/{aggregate.d.ts → model/aggregate.d.ts} +12 -4
  122. package/dist/report/{aggregate.js → model/aggregate.js} +28 -8
  123. package/dist/report/{flag.d.ts → model/flag.d.ts} +14 -1
  124. package/dist/report/{flag.js → model/flag.js} +35 -0
  125. package/dist/report/{format.d.ts → model/format.d.ts} +11 -5
  126. package/dist/report/{format.js → model/format.js} +48 -4
  127. package/dist/report/{locale.d.ts → model/locale.d.ts} +17 -17
  128. package/dist/report/{locale.js → model/locale.js} +31 -33
  129. package/dist/report/{metrics.d.ts → model/metrics.d.ts} +2 -2
  130. package/dist/report/{metrics.js → model/metrics.js} +2 -2
  131. package/dist/report/{types.d.ts → model/types.d.ts} +140 -20
  132. package/dist/report/react/index.d.ts +32 -21
  133. package/dist/report/react/index.js +33 -21
  134. package/dist/report/{load.d.ts → runtime/load.d.ts} +1 -1
  135. package/dist/report/{load.js → runtime/load.js} +1 -1
  136. package/dist/report/runtime/text.d.ts +67 -0
  137. package/dist/report/runtime/text.js +114 -0
  138. package/dist/report/runtime/web.d.ts +35 -0
  139. package/dist/report/runtime/web.js +70 -0
  140. package/dist/results/annotated-source.d.ts +87 -0
  141. package/dist/results/attempt-evidence.d.ts +74 -0
  142. package/dist/results/attempt-source.d.ts +15 -0
  143. package/dist/results/select.d.ts +11 -1
  144. package/dist/results/select.js +27 -5
  145. package/dist/runner/eval-selection.d.ts +26 -0
  146. package/dist/runner/feedback/sink.d.ts +26 -1
  147. package/dist/runner/types.d.ts +149 -23
  148. package/dist/sandbox/docker.d.ts +6 -0
  149. package/dist/sandbox/types.d.ts +23 -21
  150. package/dist/scoring/display.d.ts +7 -2
  151. package/dist/scoring/display.js +42 -4
  152. package/dist/scoring/types.d.ts +3 -3
  153. package/dist/shared/aggregate.d.ts +14 -0
  154. package/dist/shared/aggregate.js +31 -0
  155. package/dist/shared/types.d.ts +6 -1
  156. package/docs-site/images/logo-dark.svg +7 -0
  157. package/docs-site/images/logo.svg +6 -5
  158. package/docs-site/zh/README.md +8 -7
  159. package/docs-site/zh/examples/ai-agent-application.mdx +5 -5
  160. package/docs-site/zh/examples/coding-agent-extensions.mdx +4 -4
  161. package/docs-site/zh/examples/index.mdx +3 -3
  162. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +1 -1
  163. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  164. package/docs-site/zh/examples/integrations/codex-sdk.mdx +3 -3
  165. package/docs-site/zh/examples/integrations/langgraph.mdx +3 -3
  166. package/docs-site/zh/examples/integrations/pi-sdk.mdx +2 -2
  167. package/docs-site/zh/explanation/adapter.mdx +19 -19
  168. package/docs-site/zh/explanation/assert.mdx +9 -9
  169. package/docs-site/zh/explanation/drive.mdx +4 -4
  170. package/docs-site/zh/explanation/evals.mdx +8 -8
  171. package/docs-site/zh/explanation/experiment.mdx +8 -8
  172. package/docs-site/zh/explanation/hitl.mdx +13 -13
  173. package/docs-site/zh/explanation/judge.mdx +3 -3
  174. package/docs-site/zh/explanation/overview.mdx +7 -7
  175. package/docs-site/zh/explanation/runner.mdx +11 -11
  176. package/docs-site/zh/explanation/tier.mdx +6 -6
  177. package/docs-site/zh/index.mdx +14 -14
  178. package/docs-site/zh/introduction.mdx +13 -16
  179. package/docs-site/zh/reference/builtin-agents.mdx +61 -28
  180. package/docs-site/zh/reference/capabilities.mdx +7 -27
  181. package/docs-site/zh/reference/cli.mdx +35 -32
  182. package/docs-site/zh/reference/define-agent.mdx +32 -31
  183. package/docs-site/zh/reference/define-config.mdx +6 -6
  184. package/docs-site/zh/reference/define-eval.mdx +33 -20
  185. package/docs-site/zh/reference/events.mdx +4 -4
  186. package/docs-site/zh/reference/expect.mdx +3 -3
  187. package/docs-site/zh/reference/official-adapters.mdx +17 -17
  188. package/docs-site/zh/reference/report-components.mdx +193 -121
  189. package/docs-site/zh/reference/results-data.mdx +13 -13
  190. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +11 -11
  191. package/docs-site/zh/troubleshooting/debugging.mdx +40 -16
  192. package/docs-site/zh/{how-to → tutorials}/agent-feedback-loop.mdx +38 -38
  193. package/docs-site/zh/tutorials/agent-onboarding.mdx +100 -0
  194. package/docs-site/zh/tutorials/authoring.mdx +211 -0
  195. package/docs-site/zh/{how-to → tutorials}/ci-integration.mdx +8 -8
  196. package/docs-site/zh/{how-to → tutorials}/connect-otel.mdx +22 -22
  197. package/docs-site/zh/{how-to → tutorials}/connect-your-agent.mdx +58 -63
  198. package/docs-site/zh/tutorials/custom-reports.mdx +453 -0
  199. package/docs-site/zh/{how-to → tutorials}/dataset-fanout.mdx +4 -4
  200. package/docs-site/zh/tutorials/experiments.mdx +103 -0
  201. package/docs-site/zh/{how-to → tutorials}/fixtures.mdx +9 -9
  202. package/docs-site/zh/{how-to → tutorials}/publish-report.mdx +6 -6
  203. package/docs-site/zh/tutorials/quickstart.mdx +18 -18
  204. package/docs-site/zh/{how-to → tutorials}/reporters.mdx +6 -6
  205. package/docs-site/zh/{how-to → tutorials}/sandbox-agent.mdx +6 -6
  206. package/docs-site/zh/{how-to → tutorials}/sandbox-providers.mdx +41 -19
  207. package/docs-site/zh/{how-to → tutorials}/scoring-guide.mdx +4 -4
  208. package/docs-site/zh/{how-to → tutorials}/viewing-results.mdx +49 -49
  209. package/docs-site/zh/tutorials/write-experiment.mdx +355 -0
  210. package/docs-site/zh/{how-to → tutorials}/write-send.mdx +40 -40
  211. package/package.json +8 -4
  212. package/src/agents/bub.ts +21 -8
  213. package/src/agents/claude-code.ts +23 -10
  214. package/src/agents/codex.test.ts +22 -7
  215. package/src/agents/codex.ts +22 -9
  216. package/src/agents/index.ts +2 -2
  217. package/src/agents/openai-compat.ts +1 -1
  218. package/src/agents/post-setup.ts +45 -22
  219. package/src/agents/streaming.ts +1 -1
  220. package/src/agents/types.ts +20 -17
  221. package/src/agents/ui-message-stream.test.ts +10 -0
  222. package/src/agents/ui-message-stream.ts +12 -1
  223. package/src/cli.ts +71 -57
  224. package/src/context/types.ts +21 -21
  225. package/src/define.ts +13 -0
  226. package/src/i18n/en.ts +27 -12
  227. package/src/i18n/zh-CN.ts +27 -12
  228. package/src/index.ts +2 -0
  229. package/src/report/{react → assets}/colors.ts +22 -0
  230. package/src/report/{react → assets}/enhance.js +1 -33
  231. package/src/report/{react → assets}/styles.css +124 -106
  232. package/src/report/built-in/index.tsx +2 -2
  233. package/src/report/built-in/standard.tsx +18 -6
  234. package/src/report/components/attempt-detail/AttemptAssertions.tsx +67 -0
  235. package/src/report/components/attempt-detail/AttemptConversation.tsx +110 -0
  236. package/src/report/components/attempt-detail/AttemptDiagnostics.tsx +38 -0
  237. package/src/report/components/attempt-detail/AttemptDiff.tsx +35 -0
  238. package/src/report/components/attempt-detail/AttemptError.tsx +31 -0
  239. package/src/report/components/attempt-detail/AttemptFixPrompt.tsx +26 -0
  240. package/src/report/components/attempt-detail/AttemptSource.tsx +80 -0
  241. package/src/report/components/attempt-detail/AttemptSummary.tsx +74 -0
  242. package/src/report/components/attempt-detail/AttemptTimeline.tsx +108 -0
  243. package/src/report/components/attempt-detail/AttemptTrace.tsx +63 -0
  244. package/src/report/components/attempt-detail/AttemptUsage.tsx +29 -0
  245. package/src/report/components/attempt-detail/attempt-components.test.tsx +680 -0
  246. package/src/report/components/attempt-detail/compute.ts +287 -0
  247. package/src/report/components/attempt-detail/faces.ts +257 -0
  248. package/src/report/components/attempt-detail/index.tsx +583 -0
  249. package/src/report/components/attempt-detail/validate.test.ts +235 -0
  250. package/src/report/{react → components}/cell.tsx +6 -3
  251. package/src/report/{report.test.ts → components/compute.test.ts} +316 -46
  252. package/src/report/{react → components/entity-lists}/AttemptList.tsx +24 -16
  253. package/src/report/{react → components/entity-lists}/EvalList.tsx +0 -0
  254. package/src/report/{react → components/entity-lists}/ExperimentList.tsx +23 -20
  255. package/src/report/components/entity-lists/compute.ts +196 -0
  256. package/src/report/components/entity-lists/faces.ts +207 -0
  257. package/src/report/components/entity-lists/index.tsx +241 -0
  258. package/src/report/components/entity-lists/validate.test.ts +114 -0
  259. package/src/report/{react → components}/fixtures.ts +2 -2
  260. package/src/report/{react → components/metric-views}/DeltaTable.tsx +5 -5
  261. package/src/report/{react → components/metric-views}/MetricBars.tsx +5 -5
  262. package/src/report/{react → components/metric-views}/MetricLine.tsx +9 -6
  263. package/src/report/{react → components/metric-views}/MetricMatrix.tsx +6 -6
  264. package/src/report/{react → components/metric-views}/MetricScatter.tsx +41 -33
  265. package/src/report/{react → components/metric-views}/MetricTable.tsx +6 -6
  266. package/src/report/{react → components/metric-views}/Scoreboard.tsx +4 -4
  267. package/src/report/{compute.ts → components/metric-views/compute.ts} +51 -477
  268. package/src/report/components/metric-views/faces.ts +423 -0
  269. package/src/report/components/metric-views/index.tsx +352 -0
  270. package/src/report/{text → components/metric-views}/plot.ts +1 -1
  271. package/src/report/components/metric-views/validate.test.ts +211 -0
  272. package/src/report/{react → components}/render.test.tsx +47 -17
  273. package/src/report/components/shared-compute.ts +59 -0
  274. package/src/report/components/shared-faces.ts +30 -0
  275. package/src/report/components/shared.ts +192 -0
  276. package/src/report/{react → components/site-components}/CopyFixPrompt.tsx +3 -3
  277. package/src/report/{react → components/site-components}/HeroCard.tsx +3 -3
  278. package/src/report/{react → components/site-components}/ScopeWarnings.tsx +4 -4
  279. package/src/report/{react → components/site-components}/TraceWaterfall.tsx +13 -10
  280. package/src/report/components/site-components/compute.ts +144 -0
  281. package/src/report/components/site-components/faces.ts +80 -0
  282. package/src/report/components/site-components/index.tsx +265 -0
  283. package/src/report/{scope-warnings.ts → components/site-components/scope-warnings.ts} +3 -3
  284. package/src/report/{site-components.test.tsx → components/site-components/site-components.test.tsx} +23 -21
  285. package/src/report/components/site-components/validate.test.ts +89 -0
  286. package/src/report/{react → components/summaries}/ScopeSummary.tsx +26 -11
  287. package/src/report/components/summaries/compute.ts +56 -0
  288. package/src/report/components/summaries/faces.ts +48 -0
  289. package/src/report/components/summaries/index.tsx +127 -0
  290. package/src/report/components/summaries/validate.test.ts +49 -0
  291. package/src/report/definition/grid-layout.test.ts +124 -0
  292. package/src/report/definition/grid-layout.ts +146 -0
  293. package/src/report/{primitives.tsx → definition/primitives.tsx} +168 -18
  294. package/src/report/{report.ts → definition/report.ts} +98 -165
  295. package/src/report/{shell-head.test.ts → definition/shell-head.test.ts} +2 -2
  296. package/src/report/{text/table.ts → definition/table-text.ts} +4 -4
  297. package/src/report/{tree.ts → definition/tree.ts} +56 -20
  298. package/src/report/index.ts +126 -66
  299. package/src/report/{aggregate.ts → model/aggregate.ts} +31 -9
  300. package/src/report/{flag.ts → model/flag.ts} +39 -1
  301. package/src/report/{format.ts → model/format.ts} +59 -5
  302. package/src/report/{locale.ts → model/locale.ts} +34 -36
  303. package/src/report/{metrics.ts → model/metrics.ts} +3 -3
  304. package/src/report/{types.ts → model/types.ts} +143 -22
  305. package/src/report/react/index.tsx +52 -26
  306. package/src/report/{dual-render.test.tsx → runtime/dual-render.test.tsx} +564 -49
  307. package/src/report/runtime/host.test.ts +44 -0
  308. package/src/report/runtime/host.ts +138 -0
  309. package/src/report/{load.ts → runtime/load.ts} +1 -1
  310. package/src/report/runtime/text.ts +192 -0
  311. package/src/report/runtime/web.ts +106 -0
  312. package/src/results/attempt-evidence.ts +5 -1
  313. package/src/results/host-equivalence.test.ts +53 -2
  314. package/src/results/select.ts +29 -5
  315. package/src/runner/attempt.test.ts +48 -1
  316. package/src/runner/attempt.ts +62 -42
  317. package/src/runner/cleanup-timeout.test.ts +16 -0
  318. package/src/runner/cleanup-timeout.ts +23 -0
  319. package/src/runner/discover.ts +1 -2
  320. package/src/runner/eval-selection.test.ts +187 -0
  321. package/src/runner/eval-selection.ts +109 -0
  322. package/src/runner/experiment-cleanup-registry.test.ts +89 -0
  323. package/src/runner/experiment-cleanup-registry.ts +39 -0
  324. package/src/runner/experiment-labels.test.ts +71 -0
  325. package/src/runner/feedback/agent.test.ts +33 -1
  326. package/src/runner/feedback/agent.ts +12 -16
  327. package/src/runner/feedback/ci.test.ts +35 -1
  328. package/src/runner/feedback/ci.ts +16 -18
  329. package/src/runner/feedback/coordinator.ts +28 -0
  330. package/src/runner/feedback/human.test.ts +108 -1
  331. package/src/runner/feedback/human.ts +71 -21
  332. package/src/runner/feedback/reducer.test.ts +64 -0
  333. package/src/runner/feedback/reducer.ts +26 -0
  334. package/src/runner/feedback/sink.ts +40 -1
  335. package/src/runner/fingerprint.ts +2 -1
  336. package/src/runner/report.test.ts +14 -0
  337. package/src/runner/report.ts +3 -1
  338. package/src/runner/run.test.ts +390 -12
  339. package/src/runner/run.ts +259 -26
  340. package/src/runner/sandbox-selection.test.ts +13 -3
  341. package/src/runner/sandbox-selection.ts +4 -2
  342. package/src/runner/types.ts +158 -23
  343. package/src/sandbox/docker.ts +7 -0
  344. package/src/sandbox/e2b.ts +12 -13
  345. package/src/sandbox/types.ts +23 -21
  346. package/src/scoring/display.test.ts +28 -2
  347. package/src/scoring/display.ts +38 -5
  348. package/src/scoring/types.ts +3 -3
  349. package/src/shared/aggregate.test.ts +52 -0
  350. package/src/shared/aggregate.ts +29 -0
  351. package/src/shared/types.ts +6 -1
  352. package/src/show/command.test.ts +34 -0
  353. package/src/show/command.ts +16 -0
  354. package/src/show/compose.ts +1 -1
  355. package/src/show/index.ts +56 -20
  356. package/src/show/render.ts +15 -239
  357. package/src/show/show.test.ts +127 -34
  358. package/src/view/app/App.test.tsx +1 -1
  359. package/src/view/app/App.tsx +119 -47
  360. package/src/view/app/i18n.ts +7 -147
  361. package/src/view/app/lib/attempt-dialog.test.ts +65 -0
  362. package/src/view/app/lib/attempt-dialog.ts +69 -0
  363. package/src/view/app/main.tsx +0 -1
  364. package/src/view/app/types.ts +3 -86
  365. package/src/view/artifact-serving.test.ts +22 -38
  366. package/src/view/client-dist/app.css +1 -1
  367. package/src/view/client-dist/app.js +15 -22
  368. package/src/view/data.test.ts +48 -36
  369. package/src/view/data.ts +105 -83
  370. package/src/view/index.ts +1 -1
  371. package/src/view/server.ts +32 -2
  372. package/src/view/shared/types.ts +6 -31
  373. package/src/view/site-parity.test.ts +24 -1
  374. package/src/view/site.ts +144 -17
  375. package/src/view/styles.css +0 -805
  376. package/src/view/view-report.test.ts +141 -22
  377. package/dist/report/components.d.ts +0 -179
  378. package/dist/report/components.js +0 -544
  379. package/dist/report/compute.d.ts +0 -139
  380. package/dist/report/react/ExperimentComparison.d.ts +0 -10
  381. package/dist/report/react/ExperimentComparison.js +0 -12
  382. package/dist/report/react/MetricScatter.d.ts +0 -9
  383. package/dist/report/react/format.d.ts +0 -3
  384. package/dist/report/react/format.js +0 -7
  385. package/dist/report/text/faces.d.ts +0 -45
  386. package/dist/report/text/faces.js +0 -671
  387. package/dist/report/web.d.ts +0 -32
  388. package/dist/report/web.js +0 -48
  389. package/docs-site/zh/how-to/authoring.mdx +0 -162
  390. package/docs-site/zh/how-to/custom-reports.mdx +0 -414
  391. package/docs-site/zh/how-to/experiments.mdx +0 -86
  392. package/docs-site/zh/how-to/write-experiment.mdx +0 -164
  393. package/src/report/components.tsx +0 -925
  394. package/src/report/react/ExperimentComparison.tsx +0 -73
  395. package/src/report/react/format.ts +0 -9
  396. package/src/report/text/faces.ts +0 -767
  397. package/src/report/web.ts +0 -77
  398. package/src/show/report-host.test.ts +0 -205
  399. package/src/show/report-host.ts +0 -389
  400. package/src/view/app/components/AttemptModal.tsx +0 -496
  401. package/src/view/app/components/CodeView.test.tsx +0 -142
  402. package/src/view/app/components/CodeView.tsx +0 -310
  403. package/src/view/app/components/CopyControls.tsx +0 -106
  404. package/src/view/app/components/Trace.tsx +0 -100
  405. package/src/view/app/components/Transcript.tsx +0 -157
  406. package/src/view/app/components/ui/badge.tsx +0 -21
  407. package/src/view/app/lib/artifact-url.ts +0 -17
  408. package/src/view/app/lib/attempt-route.test.ts +0 -80
  409. package/src/view/app/lib/attempt-route.ts +0 -52
  410. package/src/view/app/lib/format.ts +0 -70
  411. package/src/view/app/lib/guards.test.ts +0 -108
  412. package/src/view/app/lib/guards.ts +0 -71
  413. package/src/view/app/lib/rows.ts +0 -22
  414. package/src/view/app/lib/transcript-data.tsx +0 -151
  415. package/src/view/app/lib/verdict.ts +0 -23
  416. package/src/view/app/shared.ts +0 -8
  417. /package/dist/report/{react → components/metric-views}/chart-math.d.ts +0 -0
  418. /package/dist/report/{react → components/metric-views}/chart-math.js +0 -0
  419. /package/dist/report/{text → components/metric-views}/plot.d.ts +0 -0
  420. /package/dist/report/{react → components/site-components}/PoweredBy.d.ts +0 -0
  421. /package/dist/report/{react → components/site-components}/PoweredBy.js +0 -0
  422. /package/dist/report/{text/layout.d.ts → model/text-layout.d.ts} +0 -0
  423. /package/dist/report/{text/layout.js → model/text-layout.js} +0 -0
  424. /package/dist/report/{types.js → model/types.js} +0 -0
  425. /package/src/report/{react → components/metric-views}/chart-math.test.ts +0 -0
  426. /package/src/report/{react → components/metric-views}/chart-math.ts +0 -0
  427. /package/src/report/{react → components/site-components}/PoweredBy.tsx +0 -0
  428. /package/src/report/{text/layout.ts → model/text-layout.ts} +0 -0
@@ -12,7 +12,7 @@ HITL(human-in-the-loop,人工介入)指 agent 在执行中间停下来,
12
12
  - **Codex**:审批模式(suggest / auto-edit 等)决定哪些动作要先经人确认,本质是同一扇门。
13
13
  - **AI SDK 应用**:工具不带 `execute` 时,工具调用会浮到前端,由界面上的人确认后把结果交回(`addToolResult`),模型再继续——这是自研应用里最常见的审批门写法。
14
14
 
15
- 对被测对象来说,这条"停下来等人"的分支和别的行为一样需要回归:批准后该发生的事发生了吗?拒绝后真的没做吗?问错了人、停错了地方呢?但 eval 是自动跑的,里面没有人。[NiceEval](https://niceeval.com/) 的做法是把"人"折叠成三个可编排的动作:看到 agent 停了(`t.parked()`)、检查它在等什么(`t.requireInputRequest()`)、替人回答(`t.respond()`)。批准、拒绝、补充信息,从此都是能写进 eval 的路径。
15
+ 对被测对象来说,这条"停下来等人"的分支和别的行为一样需要回归:批准后该发生的事发生了吗?拒绝后真的没做吗?问错了人、停错了地方呢?但评估用例是自动跑的,里面没有人。[NiceEval](https://niceeval.com/) 的做法是把"人"折叠成三个可编排的动作:看到 agent 停了(`t.parked()`)、检查它在等什么(`t.requireInputRequest()`)、替人回答(`t.respond()`)。批准、拒绝、补充信息,从此都是能写进评估用例的路径。
16
16
 
17
17
  ## 停轮如何表达:waiting + input.requested
18
18
 
@@ -29,9 +29,9 @@ HITL(human-in-the-loop,人工介入)指 agent 在执行中间停下来,
29
29
  两个容易想歪的地方:
30
30
 
31
31
  - **回答轮不是新对话。** 它发生在同一条会话线上,`ctx.session` 还是同一个——Adapter 靠它找回上一轮挂起的现场。
32
- - **回答不用从文本里猜。** `input.responses` 逐请求带着 `{ requestId, optionId }`(自由文本回答则是 `{ requestId, text }`),命中选项的 `optionId` eval 侧已校验过存在,打错的字直接抛错而不是静默传给应用。每种回答到 Adapter 长什么样,见[不同回答的入参](/zh/explanation/adapter#不同回答的入参)。
32
+ - **回答不用从文本里猜。** `input.responses` 逐请求带着 `{ requestId, optionId }`(自由文本回答则是 `{ requestId, text }`),命中选项的 `optionId` 在评估侧已校验过存在,打错的字直接抛错而不是静默传给应用。每种回答到 Adapter 长什么样,见[不同回答的入参](/zh/explanation/adapter#不同回答的入参)。
33
33
 
34
- ## eval 侧:三个动作
34
+ ## 评估侧:三个动作
35
35
 
36
36
  ```ts
37
37
  const draft = await t.send("给老板发一封周报邮件。");
@@ -47,37 +47,37 @@ t.calledTool("send_email", { status: "completed" });
47
47
  - `t.requireInputRequest(filter)` 从待处理请求里精确取一个(按 `id` / `prompt` / `action` / `optionIds` 等字段匹配),匹配到 0 个或超过 1 个都会抛,多个请求并停时靠它消歧。
48
48
  - `t.respond(...)` 回答并发出下一轮;同类请求要给同一个答案时(比如逐个批准一批改动),`t.respondAll(optionId)` 一次处理完。
49
49
 
50
- 批准和拒绝是同一扇门的两个分支,各写一条 eval 才算评完:批准后该发生的发生了,拒绝后该发生的没发生。逐个 API 的完整用法见 [Drive](/zh/explanation/drive#人工介入-hitl)。
50
+ 批准和拒绝是同一扇门的两个分支,各写一条评估用例才算评完:批准后该发生的发生了,拒绝后该发生的没发生。逐个 API 的完整用法见 [Drive](/zh/explanation/drive#人工介入-hitl)。
51
51
 
52
52
  ## Adapter 侧:两条义务,一次续跑
53
53
 
54
54
  HITL 对 Adapter 的全部要求就三件事——前两件发生在停下的那一轮,第三件发生在回答到达的下一轮:
55
55
 
56
56
  1. **停轮时如实返回 `status: "waiting"`**,不要把挂起报成 `"completed"`,否则 `parked()` 失效、`succeeded()` 假通过;
57
- 2. **每个待回答的问题吐一条 `input.requested`**,`id` 稳定、字段尽量填全——eval 侧的检查和对位全靠它们;
57
+ 2. **每个待回答的问题吐一条 `input.requested`**,`id` 稳定、字段尽量填全——评估侧的检查和对位全靠它们;
58
58
  3. **下一次 `send` 先交裁决、再续跑**:从 `input.responses` 按 `requestId` 把裁决交回应用(不要按顺序猜),然后接着上一轮挂起的地方继续,而不是重发请求。
59
59
 
60
- "挂起的现场"(比如读了一半的 SSE 流)存在本会话线的 `ctx.session` 上——停轮时 `ctx.session.hold(现场)`,回答轮 `ctx.session.take()` 取回,取到即清除。怎么和流式驱动拼起来,见[写 send](/zh/how-to/write-send#第五步:hitl) 第五步的完整骨架。
60
+ "挂起的现场"(比如读了一半的 SSE 流)存在本会话线的 `ctx.session` 上——停轮时 `ctx.session.hold(现场)`,回答轮 `ctx.session.take()` 取回,取到即清除。怎么和流式驱动拼起来,见[写 send](/zh/tutorials/write-send#第五步:hitl) 第五步的完整骨架。
61
61
 
62
62
  和 [NiceEval](https://niceeval.com/) 的其它能力一样,HITL 没有布尔声明:**做到了就是有**。send 返回过 `"waiting"` 并吐了 `input.requested`,`t.respond` 就能工作;没做到,eval 会在第一个 `parked()` 或 `requireInputRequest()` 上明确失败,而不是静默假通过。能力如何从构造中来,见 [Adapter](/zh/explanation/adapter#能力从哪来:构造证明,不是问卷)。
63
63
 
64
64
  ## 拒绝不是故障
65
65
 
66
- 人否决和工具报错是两回事,事件流里用不同的 `status` 区分:被人拒绝的调用,`action.result` 的 `status` 是 `"rejected"` 而不是 `"failed"`。这样 `t.noFailedActions()` 不会被一次正当的人工否决误伤,而 `t.calledTool("deploy", { status: "rejected" })` 可以精确断言"发起了调用、被人拦下了"——这正是拒绝分支的 eval 要写的断言。
66
+ 人否决和工具报错是两回事,事件流里用不同的 `status` 区分:被人拒绝的调用,`action.result` 的 `status` 是 `"rejected"` 而不是 `"failed"`。这样 `t.noFailedActions()` 不会被一次正当的人工否决误伤,而 `t.calledTool("deploy", { status: "rejected" })` 可以精确断言"发起了调用、被人拦下了"——这正是拒绝分支的评估用例要写的断言。
67
67
 
68
68
  ## 哪些 agent 用不到 HITL
69
69
 
70
70
  不是每个 agent 都有这条分支,没有就整个跳过——Adapter 不用管 `waiting`,eval 里也不会出现 `t.respond`:
71
71
 
72
72
  - **每轮一口气跑完的 agent**:问答、检索、翻译这类单发即回的服务,执行中没有等人的环节。
73
- - **审批门被关掉的运行形态**:Claude Code、Codex 产品本身是 HITL 的,但作为被测对象在沙箱里通常全自动跑(跳过权限确认)——内置的 `claude-code` / `codex` / `bub` sandbox agent 就是这样,所以它们都不做 HITL。
74
- - **审批发生在执行循环之外**:比如工单系统里人工复核 agent 的产出。那是另一个系统的流程,不经过 `send`,eval 评不到也不该评。
73
+ - **审批门被关掉的运行形态**:Claude Code、Codex 产品本身是 HITL 的,但作为被测对象在 Sandbox 里通常全自动跑(跳过权限确认)——内置的 `claude-code` / `codex` / `bub` sandbox agent 就是这样,所以它们都不做 HITL。
74
+ - **审批发生在执行循环之外**:比如工单系统里人工复核 agent 的产出。那是另一个系统的流程,不经过 `send`,评估用例评不到也不该评。
75
75
 
76
- 判断标准只有一条:**你的 agent 执行循环里存在"停下来等人、拿到回答再继续"的分支,而你想把批准和拒绝写进 eval。**
76
+ 判断标准只有一条:**你的 agent 执行循环里存在"停下来等人、拿到回答再继续"的分支,而你想把批准和拒绝写进评估用例。**
77
77
 
78
78
  ## 相关阅读
79
79
 
80
- - [Drive](/zh/explanation/drive#人工介入-hitl) — eval 侧的完整用法:`t.parked()`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()`。
80
+ - [Drive](/zh/explanation/drive#人工介入-hitl) — 评估侧的完整用法:`t.parked()`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()`。
81
81
  - [Adapter](/zh/explanation/adapter#不同回答的入参) — 回答到 Adapter 的结构化入参,四种典型形态。
82
- - [写 send](/zh/how-to/write-send) — Adapter 侧实操:`ctx.session.hold` / `take` 与流式 + HITL 的完整骨架。
83
- - [接入你的 Agent](/zh/how-to/connect-your-agent) — 接入全景:最小接入、参数通道与增量地图。
82
+ - [写 send](/zh/tutorials/write-send) — Adapter 侧实操:`ctx.session.hold` / `take` 与流式 + HITL 的完整骨架。
83
+ - [接入你的 Agent](/zh/tutorials/connect-your-agent) — 接入全景:最小接入、参数通道与增量地图。
@@ -33,7 +33,7 @@ session.judge.autoevals.closedQA("...") // (t.newSession() 的返回值)默认
33
33
  turn.judge.autoevals.closedQA("...") // (t.send() 的返回值)默认只评这一轮的 turn.message
34
34
  ```
35
35
 
36
- `t.judge` / `session.judge` 是 session 级,适合评整段对话的回答质量或跨轮一致性;`turn.judge` 是 turn 级,只看这一轮的消息——多轮 eval 里不同轮次需要不同评分标准时用它:
36
+ `t.judge` / `session.judge` 是 session 级,适合评整段对话的回答质量或跨轮一致性;`turn.judge` 是 turn 级,只看这一轮的消息——多轮评估用例里不同轮次需要不同评分标准时用它:
37
37
 
38
38
  ```ts
39
39
  const turn1 = await t.send("这张图里有什么?"); // 第一轮:看图
@@ -47,7 +47,7 @@ t.judge.autoevals
47
47
  turn3.judge.autoevals.closedQA("这一轮是否回答了形状颜色?").gate();
48
48
  ```
49
49
 
50
- 要评的不是对话本身——沙箱 diff、文件内容或其它材料——不管挂在哪个接收者上,都用 `{ on }` 显式传:
50
+ 要评的不是对话本身——Sandbox diff、文件内容或其它材料——不管挂在哪个接收者上,都用 `{ on }` 显式传:
51
51
 
52
52
  ```ts
53
53
  t.judge.autoevals.closedQA("生成的代码是否是地道的 TypeScript?", {
@@ -127,4 +127,4 @@ t.judge.autoevals.closedQA("语气是否礼貌?").gate(); // 提升为 gat
127
127
 
128
128
  - [Assert](/zh/explanation/assert) — gate / soft 严重度的完整规则,以及 judge 分数最终折进的判定规则。
129
129
  - [Drive](/zh/explanation/drive) — `t.send()`、`t.newSession()`,以及 `t.judge` / `session.judge` / `turn.judge` 各自挂在哪个 handle 上。
130
- - [Evals](/zh/explanation/evals) — judge 分数如何折进 eval 生命周期和 verdict 类型。
130
+ - [评估](/zh/explanation/evals) — judge 分数如何折进评估用例生命周期和 verdict 类型。
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: "NiceEval 架构:evals、agents 与 sandboxes"
2
+ title: "NiceEval 架构:评估用例、agents 与 sandboxes"
3
3
  sidebarTitle: "概览"
4
4
  description: "理解 NiceEval、Adapter 和 Sandbox Provider 如何配合,用统一 API 评估任意 AI Agent。"
5
5
  ---
@@ -21,7 +21,7 @@ Subject under test / Sandbox Provider
21
21
  ## NiceEval 负责什么
22
22
 
23
23
  <CardGroup cols={2}>
24
- <Card title="Eval 发现" icon="magnifying-glass">
24
+ <Card title="评估用例发现" icon="magnifying-glass">
25
25
  发现 `*.eval.ts` 文件和 fixture 目录,并从路径推导稳定 ID。
26
26
  </Card>
27
27
  <Card title="并发调度" icon="timeline">
@@ -53,20 +53,20 @@ Subject under test / Sandbox Provider
53
53
 
54
54
  <Tabs>
55
55
  <Tab title="Docker">
56
- 本地容器 Provider,适合开发和 CI 中的 coding-agent eval。
56
+ 本地容器 Provider,适合开发和 CI 中的 coding-agent 评估用例。
57
57
  </Tab>
58
58
  <Tab title="Vercel Sandbox">
59
59
  云端 Sandbox Provider,适合更强隔离或更大的运行资源。
60
60
  </Tab>
61
61
  <Tab title="第三方 Provider">
62
- 只要实现 `Sandbox` 接口,就可以接入其他沙箱服务。
62
+ 只要实现 `Sandbox` 接口,就可以接入其他 Sandbox 服务。
63
63
  </Tab>
64
64
  </Tabs>
65
65
 
66
66
  ## 关键术语
67
67
 
68
68
  <AccordionGroup>
69
- <Accordion title="Eval">
69
+ <Accordion title="评估用例">
70
70
  一个测试用例:描述和 `test(t)` 函数,agent-neutral——用哪个 Agent 由 experiment 决定。
71
71
  </Accordion>
72
72
  <Accordion title="Agent">
@@ -92,7 +92,7 @@ Subject under test / Sandbox Provider
92
92
  ## 端到端流程
93
93
 
94
94
  <Steps>
95
- <Step title="Discovery">发现 eval 文件和 fixture。</Step>
95
+ <Step title="Discovery">发现评估用例文件和 fixture。</Step>
96
96
  <Step title="Scheduling">根据并发、缓存和 attempt 计划运行。</Step>
97
97
  <Step title="Agent send">调用 adapter,让被测对象产出 `Turn`。</Step>
98
98
  <Step title="Scoring">执行断言、judge 和测试。</Step>
@@ -102,7 +102,7 @@ Subject under test / Sandbox Provider
102
102
 
103
103
  ## 相关阅读
104
104
 
105
- - [Evals](/zh/explanation/evals) — eval 是什么,以及生命周期细节。
105
+ - [评估](/zh/explanation/evals) — 评估用例是什么,以及生命周期细节。
106
106
  - [Adapter](/zh/explanation/adapter) — 如何写 adapter,并在 experiment 中引用它。
107
107
  - [Drive](/zh/explanation/drive) — `t.send()`、session 与 HITL:如何产出断言要读的 `Turn` 数据。
108
108
  - [Assert](/zh/explanation/assert) — 断言词汇和判定规则。
@@ -1,27 +1,27 @@
1
1
  ---
2
- title: "NiceEval runner 如何调度和执行 eval"
2
+ title: "NiceEval runner 如何调度和执行评估用例"
3
3
  sidebarTitle: "运行器"
4
- description: "NiceEval runner 发现 eval,用有界并发调度,缓存结果,重试脆弱基础设施,并执行预算保护。"
4
+ description: "NiceEval runner 发现评估用例,用有界并发调度,缓存结果,重试脆弱基础设施,并执行预算保护。"
5
5
  ---
6
6
 
7
- Runner 是把 eval 文件变成一次实际运行的执行引擎。它负责发现、过滤、调度、缓存、attempt、reporters 和 artifact 输出。
7
+ Runner 是把评估用例文件变成一次实际运行的执行引擎。它负责发现、过滤、调度、缓存、attempt、reporters 和 artifact 输出。
8
8
 
9
9
  ## 发现
10
10
 
11
11
  runner 会读取 `evals/` 下的:
12
12
 
13
13
  - `*.eval.ts` 文件
14
- - 导出 eval 数组的数据集文件
14
+ - 导出评估用例数组的数据集文件
15
15
 
16
16
  ```bash
17
17
  npx niceeval list
18
18
  ```
19
19
 
20
- `list` 只发现和打印 ID,不执行 eval。
20
+ `list` 只发现和打印 ID,不执行评估用例。
21
21
 
22
22
  ## 过滤
23
23
 
24
- `exp` 命令中,实验名之后的位置参数是 eval ID 前缀:
24
+ `exp` 命令中,实验名之后的位置参数是评估用例 ID 前缀:
25
25
 
26
26
  ```bash
27
27
  npx niceeval exp local
@@ -37,7 +37,7 @@ npx niceeval exp local fixtures/button
37
37
  npx niceeval exp local --max-concurrency 8
38
38
  ```
39
39
 
40
- 远程 HTTP agent 可以用更高并发;本地 Docker sandbox 通常需要更低并发,避免 CPU、内存和磁盘竞争。
40
+ 远程 HTTP agent 可以用更高并发;本地 Docker Sandbox 通常需要更低并发,避免 CPU、内存和磁盘竞争。
41
41
 
42
42
  ## runs 与 early-exit
43
43
 
@@ -50,7 +50,7 @@ npx niceeval exp local fixtures/button --runs 5 --no-early-exit
50
50
 
51
51
  ## 缓存
52
52
 
53
- [NiceEval](https://niceeval.com/) 可以根据输入、配置和相关文件 fingerprint 跳过已判定为 `passed` 或 `failed` 的结果——两者都是判定确定的终态。`errored`(超时、沙箱异常等框架/环境层面的不确定失败)永远重试。缓存适合加速迭代,但如果你在调试非确定性行为,应该明确关闭(`--force`)或清理相关缓存。
53
+ [NiceEval](https://niceeval.com/) 可以根据输入、配置和相关文件 fingerprint 跳过已判定为 `passed` 或 `failed` 的结果——两者都是判定确定的终态。`errored`(超时、Sandbox 异常等框架/环境层面的不确定失败)永远重试。缓存适合加速迭代,但如果你在调试非确定性行为,应该明确关闭(`--force`)或清理相关缓存。
54
54
 
55
55
  ## 超时和预算
56
56
 
@@ -58,7 +58,7 @@ npx niceeval exp local fixtures/button --runs 5 --no-early-exit
58
58
  npx niceeval exp local --timeout 300000 --budget 5
59
59
  ```
60
60
 
61
- 超时保护单个 eval,预算保护整次运行成本。NiceEval 只有在 Attempt 已经发起 Agent Turn、却连续拿不到成本数据时,才提示预算无法执行。如果 Attempt 在 `sandbox.create` 或 setup 阶段就失败,Agent 尚未运行,CLI 只显示对应的结构化执行错误,不再追加容易误导排查方向的预算警告。
61
+ 超时保护单个评估用例,预算保护整次运行成本。NiceEval 只有在 Attempt 已经发起 Agent Turn、却连续拿不到成本数据时,才提示预算无法执行。如果 Attempt 在 `sandbox.create` 或 setup 阶段就失败,Agent 尚未运行,CLI 只显示对应的结构化执行错误,不再追加容易误导排查方向的预算警告。
62
62
 
63
63
  ## Reporter
64
64
 
@@ -72,13 +72,13 @@ npx niceeval exp local --output ci # CI:单一有序 stdout 事件流
72
72
 
73
73
  省略时使用 `auto`:TTY 选择 Human,CI 环境选择 CI,其它非 TTY 选择 Agent。输出模型只改变反馈,不改变调度、判定或 artifact。
74
74
 
75
- Runner Eval 完成后把结果交给 Reporters:
75
+ Runner 在评估用例完成后把结果交给 Reporters:
76
76
 
77
77
  - JSON artifacts 用于后续分析。
78
78
  - JUnit reporter 适合 CI。
79
79
  - Braintrust reporter 把一次运行作为实验上报,跨提交比较。
80
80
 
81
- 挂载方式和 Braintrust 配置见 [Reporter 上报](/zh/how-to/reporters)。
81
+ 挂载方式和 Braintrust 配置见 [Reporter 上报](/zh/tutorials/reporters)。
82
82
 
83
83
  ## 输出目录
84
84
 
@@ -4,7 +4,7 @@ sidebarTitle: "接入等级"
4
4
  description: "按「Adapter 接到哪里、额外拿到什么观测数据」接入分三级:Tier 1 只接 send,Tier 2 加 OTel,Tier 3 侵入改造暴露 experiment flags。每档买到什么、什么时候升级。"
5
5
  ---
6
6
 
7
- 接入 [NiceEval](https://niceeval.com/) 不是全有或全无的一次性工程。按「Adapter 接到哪里、额外拿到什么观测数据」,接入分三级——每一级在上一级之上加一种投入、换一组新能力,已写的 eval 全程复用,不用改。
7
+ 接入 [NiceEval](https://niceeval.com/) 不是全有或全无的一次性工程。按「Adapter 接到哪里、额外拿到什么观测数据」,接入分三级——每一级在上一级之上加一种投入、换一组新能力,已写的评估用例全程复用,不用改。
8
8
 
9
9
  ![接入分三个 Tier:Tier 1 只接 send 应用零改动;Tier 2 加 OTel 换 niceeval view 的调用瀑布图;Tier 3 侵入改造把变体暴露成 flags 做 A/B。](/images/adapter-tiers-zh.svg)
10
10
 
@@ -18,9 +18,9 @@ description: "按「Adapter 接到哪里、额外拿到什么观测数据」接
18
18
 
19
19
  ## Tier 2:send + OTel
20
20
 
21
- 还是同一个 `send`、同一套事件映射,只是让应用把 OTel span 也发给 [NiceEval](https://niceeval.com/) 一份。应用已埋点(AI SDK telemetry、LangGraph、OpenLLMetry / OpenInference、自埋 gen_ai)就零改动;没埋点补的是一段通用 OTel 初始化——这属于可观测性建设,不是为 eval 定制的改造。
21
+ 还是同一个 `send`、同一套事件映射,只是让应用把 OTel span 也发给 [NiceEval](https://niceeval.com/) 一份。应用已埋点(AI SDK telemetry、LangGraph、OpenLLMetry / OpenInference、自埋 gen_ai)就零改动;没埋点补的是一段通用 OTel 初始化——这属于可观测性建设,不是为评估用例定制的改造。
22
22
 
23
- 这一档买到的是**观测**:`niceeval view` 的调用瀑布图——应用内部每次模型调用、每次工具执行、各自的耗时与 token,按轮铺成时间线。断言不受影响:span 只进瀑布图,不进事件流、不喂断言。走法见[OTel 接入](/zh/how-to/connect-otel)。
23
+ 这一档买到的是**观测**:`niceeval view` 的调用瀑布图——应用内部每次模型调用、每次工具执行、各自的耗时与 token,按轮铺成时间线。断言不受影响:span 只进瀑布图,不进事件流、不喂断言。走法见[OTel 接入](/zh/tutorials/connect-otel)。
24
24
 
25
25
  ## Tier 3:侵入改造 + experiment flags
26
26
 
@@ -30,7 +30,7 @@ description: "按「Adapter 接到哪里、额外拿到什么观测数据」接
30
30
 
31
31
  ## 无侵入是前两档的底线
32
32
 
33
- 前两档都是**无侵入**的:应用由你按它自己的方式启动(`pnpm start`、部署在哪都行),eval 侧不 spawn 应用进程、不另开端口——Adapter 只对着**用户前端本来就在用的那个接口**(HTTP 端点、SSE 流)收发,连不上时报"先起应用"的明确错误。两档的区别只在观测数据:Tier 1 只有 `send` 返回的事件,Tier 2 多一份发给 [NiceEval](https://niceeval.com/) 的 span、瀑布图随之出现。
33
+ 前两档都是**无侵入**的:应用由你按它自己的方式启动(`pnpm start`、部署在哪都行),评估侧不 spawn 应用进程、不另开端口——Adapter 只对着**用户前端本来就在用的那个接口**(HTTP 端点、SSE 流)收发,连不上时报"先起应用"的明确错误。两档的区别只在观测数据:Tier 1 只有 `send` 返回的事件,Tier 2 多一份发给 [NiceEval](https://niceeval.com/) 的 span、瀑布图随之出现。
34
34
 
35
35
  ## 怎么升级
36
36
 
@@ -38,7 +38,7 @@ description: "按「Adapter 接到哪里、额外拿到什么观测数据」接
38
38
 
39
39
  ## 相关阅读
40
40
 
41
- - [接入你的 Agent](/zh/how-to/connect-your-agent) — 接入全景:最小接入与参数通道。
41
+ - [接入你的 Agent](/zh/tutorials/connect-your-agent) — 接入全景:最小接入与参数通道。
42
42
  - [Adapter](/zh/explanation/adapter) — 契约本身:`send` 传入什么返回什么,`ctx.model` / `ctx.telemetry` / `ctx.flags` 按档位出现。
43
- - [OTel 接入](/zh/how-to/connect-otel) — Tier 2 的完整走法。
43
+ - [OTel 接入](/zh/tutorials/connect-otel) — Tier 2 的完整走法。
44
44
  - [实验](/zh/explanation/experiment) — model / flags 对比在 experiment 侧怎么声明。
@@ -1,22 +1,22 @@
1
1
  ---
2
2
  title: "NiceEval"
3
3
  sidebarTitle: "首页"
4
- description: "NiceEval 是一个渐进式、全功能、开发体验友好、Agent Native AI agent eval 工具。"
4
+ description: "NiceEval 是框架无关的 Agent-Native 评估框架与 Harness,为你的 AI 应用构建评估提供完整的闭环。"
5
5
  ---
6
6
 
7
7
  <div align="center">
8
8
 
9
9
  # NiceEval
10
10
 
11
- **渐进式、全功能、开发体验友好、Agent Native AI agent eval 工具**
11
+ **为你的 AI 应用打造的 Agent-Native 评估框架与 Harness**
12
12
 
13
13
  </div>
14
14
 
15
- [NiceEval](https://niceeval.com/) 是一个受 [eve](https://eve.dev) 启发的 agent-native eval 工具。它首先追求良好的开发体验:一个项目可以在 10 分钟左右接入,eval 文件足够直观,结果也足够容易读。
15
+ [NiceEval](https://niceeval.com/) 是一个受 [eve](https://eve.dev) 启发的 Agent-Native 评估框架与 Harness:`defineEval` 负责写清楚测什么,Harness 负责连被测对象、跑、打分、出报告——两者合在一起,就是从写 Eval 到看结果、优化 Agent 的完整闭环。它首先追求良好的开发体验:一个项目可以在 10 分钟左右接入,评估用例文件足够直观,结果也足够容易读。
16
16
 
17
- 它也足够通用:可以用来 eval 给 Claude Code / Codex 写的 coding-agent 插件、Hook 和 Skill,也可以 eval 你自己的 AI Agent 应用。无论你的应用基于 AI SDK、LangGraph、Pi,还是自研 agent loop,都可以通过 adapter 接入。
17
+ 它也框架无关、足够通用:可以用来评估给 Claude Code / Codex 写的 coding-agent 插件、Hook 和 Skill,也可以评估你自己的 AI Agent 应用。无论你的应用基于 AI SDK、LangGraph、Pi,还是自研 agent loop,都可以通过 Adapter 接入。
18
18
 
19
- eval 运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告和结构化 artifacts,让你能查看 agent 的行为细节,调试失败原因,并持续优化 pass rate、成本和延迟。
19
+ 评估运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告和结构化 artifacts,让你能查看 agent 的行为细节,调试失败原因,并持续优化 pass rate、成本和延迟。
20
20
 
21
21
  <CardGroup cols={3}>
22
22
  <Card title="Agent Framework 接入" icon="code-branch" href="/zh/examples">
@@ -36,7 +36,7 @@ eval 运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告
36
36
 
37
37
  ### 模式一:Sandbox
38
38
 
39
- 跑 Codex、Claude Code 等需要 sandbox 的 coding agent:
39
+ 跑 Codex、Claude Code 等需要 Sandbox 的 coding agent:
40
40
 
41
41
  ```text
42
42
  evals/*.eval.ts
@@ -78,25 +78,25 @@ eval 运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告
78
78
  └────────────────────────────┘
79
79
  ```
80
80
 
81
- - **[NiceEval](https://niceeval.com/) 核心** 负责发现 eval、调度运行、打分、生成报告与 artifacts。
81
+ - **[NiceEval](https://niceeval.com/) 核心** 负责发现评估用例、调度运行、打分、生成报告与 artifacts。
82
82
  - **Agent 适配器** 是开放边界:你决定如何调用被测系统,以及如何把输出映射成标准事件流。
83
- - **Sandbox** 负责文件系统隔离:需要真实 workspace 的 coding agent 使用 Docker 或云端 sandbox;自有 Web Agent 可以直连,无需 Docker。
83
+ - **Sandbox** 负责文件系统隔离:需要真实 workspace 的 coding agent 使用 Docker 或云端 Sandbox;自有 Web Agent 可以直连,无需 Docker。
84
84
 
85
85
  ## 核心概念一览
86
86
 
87
87
  | 概念 | 一句话 |
88
88
  |---|---|
89
- | [Eval](/zh/explanation/evals) | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
89
+ | [评估用例](/zh/explanation/evals) | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
90
90
  | [Experiment](/zh/explanation/experiment) | 可签入的运行配置:决定连哪个 Adapter、什么 model、什么 flags。 |
91
91
  | [Adapter](/zh/explanation/adapter) | 连接被测系统的适配层:实现一个 `send`,把返回翻译成标准事件流。 |
92
- | [Sandbox](/zh/how-to/sandbox-providers) | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
92
+ | [Sandbox](/zh/tutorials/sandbox-providers) | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
93
93
  | [Tier](/zh/explanation/tier) | 接入 Adapter 的三档投入:Tier 1 只接 send,Tier 2 加 OTel 换调用瀑布图,Tier 3 侵入改造做 feature A/B。 |
94
94
 
95
95
  完整术语表见[架构概览](/zh/explanation/overview)。
96
96
 
97
97
  ## 示例
98
98
 
99
- 跑一条 eval 需要两个文件:eval 本身(测什么)和 experiment(跑哪个 agent)。CLI 不接受裸 eval id——`niceeval exp <experiment> <eval 前缀>` 里的 experiment 才决定「连哪个被测对象」。下面是一个直连 Web Agent 的真实场景(完整项目见仓库 `examples/zh/ai-sdk/`),验证 agent 遇到实时天气问题时会调用工具、并基于工具结果作答,而不是凭空编造:
99
+ 跑一条评估用例需要两个文件:评估用例本身(测什么)和 experiment(跑哪个 agent)。CLI 不接受裸评估用例 id——`niceeval exp <experiment> <eval 前缀>` 里的 experiment 才决定「连哪个被测对象」。下面是一个直连 Web Agent 的真实场景(完整项目见仓库 `examples/zh/ai-sdk/`),验证 agent 遇到实时天气问题时会调用工具、并基于工具结果作答,而不是凭空编造:
100
100
 
101
101
  ```ts
102
102
  // evals/weather-tool.eval.ts
@@ -138,7 +138,7 @@ npx niceeval show # 终端读取结果,失败项可继续下钻
138
138
  npx niceeval view # 网页交互浏览
139
139
  ```
140
140
 
141
- 如果被测对象是需要隔离工作区的 coding agent(Codex、Claude Code 插件/Skill),evals 里改用 `t.sandbox.uploadDirectory()` 铺工作区、`t.sandbox.fileChanged()` / `t.sandbox.file()` 检查改了什么文件、`t.sandbox.runCommand()` 跑测试——参考独立仓库 [coding-agent-skill](https://github.com/CorrectRoadH/coding-agent-skill)。
141
+ 如果被测对象是需要隔离工作区的 coding agent(Codex、Claude Code 插件/Skill),评估用例里改用 `t.sandbox.uploadDirectory()` 铺工作区、`t.sandbox.fileChanged()` / `t.sandbox.file()` 检查改了什么文件、`t.sandbox.runCommand()` 跑测试——参考独立仓库 [coding-agent-skill](https://github.com/CorrectRoadH/coding-agent-skill)。
142
142
 
143
143
  ## 快速开始
144
144
 
@@ -164,13 +164,13 @@ READ https://niceeval.com/INIT.md and install niceeval for this repo.
164
164
 
165
165
  <AccordionGroup>
166
166
  <Accordion title="需要注册账号吗?">
167
- 不需要。跑 eval 和 `niceeval view` 看报告全在本地完成;只有被测对象本身是需要隔离工作区的 coding agent 时,才会用到 Docker 或 E2B 这类 sandbox provider。
167
+ 不需要。跑评估用例和 `niceeval view` 看报告全在本地完成;只有被测对象本身是需要隔离工作区的 coding agent 时,才会用到 Docker 或 E2B 这类 Sandbox provider。
168
168
  </Accordion>
169
169
  <Accordion title="我的 Agent 不是用 TypeScript / JavaScript 写的,能接吗?">
170
170
  能。Adapter 只是对着应用本来暴露的接口(HTTP、gRPC、WebSocket 都行)收发;应用本身用什么语言写、部署在哪里,[NiceEval](https://niceeval.com/) 不关心,见 [Adapter](/zh/explanation/adapter)。
171
171
  </Accordion>
172
172
  <Accordion title="能接到 CI 里吗?">
173
- 能,见 [CI 集成](/zh/how-to/ci-integration)。
173
+ 能,见 [CI 集成](/zh/tutorials/ci-integration)。
174
174
  </Accordion>
175
175
  </AccordionGroup>
176
176
 
@@ -4,16 +4,13 @@ sidebarTitle: "介绍"
4
4
  description: "NiceEval 帮助团队衡量、评估并改进生产环境中的 AI:比较模型、迭代 Agent、发现回归、用真实数据持续改进。"
5
5
  ---
6
6
 
7
- [NiceEval](https://niceeval.com/) 是一个 Agent 评估工具,帮助团队衡量、评估并改进生产环境中的 AI。借助 NiceEval,团队可以比较模型、迭代 Agent、发现回归问题,并利用真实用户数据持续改进 AI 应用。它追求低心智负担的 DX:大多数项目都可以在 10 分钟左右接入,写出第一条 eval,并开始稳定地检查 agent 行为。
7
+ [NiceEval](https://niceeval.com/) 是一个 Agent 评估工具,帮助团队衡量、评估并改进生产环境中的 AI。借助 NiceEval,团队可以比较模型、迭代 Agent、发现回归问题,并利用真实用户数据持续改进 AI 应用。
8
8
 
9
- NiceEval 以本地优先为核心:你的评估在你自己的环境中运行,不需要先开账号、连平台才能跑第一条 eval。当团队需要分享评估结果、做回归跟踪时,可以通过 Report 上报到 BrainTrust 等平台,或者自定义报告导出。
9
+ NiceEval 以本地优先为核心:你的评估在你自己的环境中运行。当团队需要分享评估结果、做回归跟踪时,可以通过 Report 上报到 BrainTrust 等平台,或者自定义报告导出。
10
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 发消息,断言它做对了什么。
11
+ 它既能评估用于 Claude Code / Codex 的 Plugins、Hook 和 Skill,也能直接评你自己的 AI Agent 应用。无论你的 Agent 基于 AI SDK、LangGraph、Pi 还是自研 Agent SDK,都可以通过 Adapter 接入同一套评估体系。
16
12
 
13
+ ## 构建评估用例
17
14
  ```ts
18
15
  // evals/eval-tool-call.eval.ts
19
16
  import { defineEval } from "niceeval";
@@ -43,14 +40,14 @@ export default defineEval({
43
40
  ```sh
44
41
  pnpm exec niceeval exp local eval-tool-call # 用 local experiment 只跑 eval-tool-call
45
42
  pnpm exec niceeval show # 终端读取结果,适合人和 AI
46
- pnpm exec niceeval view # 在网页中浏览同一批 artifacts
43
+ pnpm exec niceeval view # 在网页中浏览
47
44
  ```
48
45
 
49
46
  ## 为什么有了 DeepEval、LangFuse、BrainTrust 还需要 NiceEval
50
47
 
51
48
  NiceEval 是一个 Agent-Native 的评估工具。Dataset / golden 那一套「构建 Input 与 Expected Output」的模式,并不适合真实的 Agent 评估——现在的 Agent 要在多轮对话、多 agent 协作、工具调用、Skill 加载等细粒度场景下被检查,NiceEval 就是为这类场景设计的:断言直接落在工具调用、消息内容、结构化输出和用量上,而不是要求你先手工准备一份 golden 数据集。
52
49
 
53
- 像 LangFuse、BrainTrust 这类工具更偏 tracing 和监控,对「写 eval、跑 eval、看结果」这条路径来说太重;NiceEval 从一开始就针对这条路径做了友好的开发体验。两者也不冲突:NiceEval 能与 LangFuse、BrainTrust 共存——可以用它们做 tracing,或者把评估结果上传到两者。
50
+ 像 LangFuse、BrainTrust 这类工具更偏 tracing 和监控,对「写评估用例、跑评估用例、看结果」这条路径来说太重;NiceEval 从一开始就针对这条路径做了友好的开发体验。两者也不冲突:NiceEval 能与 LangFuse、BrainTrust 共存——可以用它们做 tracing,或者把评估结果上传到两者。
54
51
 
55
52
  ## 你可以评什么
56
53
 
@@ -59,7 +56,7 @@ NiceEval 是一个 Agent-Native 的评估工具。Dataset / golden 那一套「
59
56
  把 Claude Code、Codex、bub 放进 Sandbox,给它任务,再用真实测试和文件断言验证结果。
60
57
  </Card>
61
58
  <Card title="你自己的 AI Agent 应用" icon="globe">
62
- 直连你的应用接口,断言回复、工具调用和结构化输出。
59
+ 直连你的应用接口,断言回复、工具调用和结构化输出。通过 Flag 切换测试不同版本的 Prompt
63
60
  </Card>
64
61
  </CardGroup>
65
62
 
@@ -114,7 +111,7 @@ NiceEval 是一个 Agent-Native 的评估工具。Dataset / golden 那一套「
114
111
 
115
112
  | 概念 | 一句话 |
116
113
  |---|---|
117
- | Eval | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
114
+ | 评估用例 | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
118
115
  | Experiment | 可签入的运行配置:决定连哪个 Adapter、什么 model、什么 flags。 |
119
116
  | Adapter | 连接被测系统的适配层:实现一个 `send`,把返回翻译成标准事件流。 |
120
117
  | Sandbox | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
@@ -125,17 +122,17 @@ NiceEval 是一个 Agent-Native 的评估工具。Dataset / golden 那一套「
125
122
  ## 从你的场景开始
126
123
 
127
124
  <CardGroup cols={3}>
128
- <Card title="接入 Agent Framework" icon="code-branch" href="/zh/examples">
129
- 选择 AI SDK、Claude SDK、Codex SDK、pi-agent-core 或 LangGraph 的可运行接入示例。
125
+ <Card title="接入 Agent" icon="code-branch" href="/zh/tutorials/connect-your-agent">
126
+ 连接你的 Agent,写一个 Adapter,把消息、工具调用和结构化输出翻译成标准事件流。
130
127
  </Card>
131
128
  <Card title="评估 Coding Agent 扩展" icon="wand-magic-sparkles" href="/zh/examples/coding-agent-extensions">
132
129
  用真实 Workspace 和对照实验衡量 Skill、提示词与 Plugin Benchmark 的效果。
133
130
  </Card>
134
- <Card title="自写 Adapter" icon="robot" href="/zh/examples/ai-agent-application">
135
- 查看自定义 HTTP Agent 的工具调用、图片理解、多轮会话和模型对比。
131
+ <Card title="学习如何写评估用例与实验" icon="robot" href="/zh/tutorials/authoring">
132
+ 了解如何写评估用例、断言、实验配置和报告。
136
133
  </Card>
137
134
  </CardGroup>
138
135
 
139
136
  ## 接下来读什么
140
137
 
141
- [快速开始](/zh/tutorials/quickstart) 会带你安装 [NiceEval](https://niceeval.com/)、构建 eval、得到评估报告。
138
+ [快速开始](/zh/tutorials/quickstart) 会带你安装 [NiceEval](https://niceeval.com/)、构建评估用例、得到评估报告。