niceeval 0.6.1 → 0.7.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 (378) hide show
  1. package/INDEX.md +23 -23
  2. package/README.zh.md +6 -6
  3. package/dist/agents/types.d.ts +69 -7
  4. package/dist/context/types.d.ts +32 -12
  5. package/dist/i18n/en.d.ts +54 -0
  6. package/dist/i18n/zh-CN.d.ts +57 -3
  7. package/dist/o11y/types.d.ts +16 -2
  8. package/dist/report/aggregate.d.ts +32 -24
  9. package/dist/report/aggregate.js +158 -50
  10. package/dist/report/built-in/index.d.ts +2 -0
  11. package/dist/report/built-in/index.js +8 -0
  12. package/dist/report/components.d.ts +93 -160
  13. package/dist/report/components.js +377 -114
  14. package/dist/report/compute.d.ts +87 -81
  15. package/dist/report/compute.js +597 -417
  16. package/dist/report/flag.d.ts +32 -6
  17. package/dist/report/flag.js +92 -4
  18. package/dist/report/format.d.ts +19 -11
  19. package/dist/report/format.js +30 -13
  20. package/dist/report/index.d.ts +16 -16
  21. package/dist/report/index.js +20 -21
  22. package/dist/report/load.js +3 -2
  23. package/dist/report/locale.d.ts +57 -33
  24. package/dist/report/locale.js +122 -56
  25. package/dist/report/metrics.d.ts +23 -4
  26. package/dist/report/metrics.js +110 -25
  27. package/dist/report/primitives.d.ts +48 -15
  28. package/dist/report/primitives.js +135 -26
  29. package/dist/report/react/AttemptList.d.ts +9 -7
  30. package/dist/report/react/AttemptList.js +17 -10
  31. package/dist/report/react/DeltaTable.js +19 -18
  32. package/dist/report/react/EvalList.d.ts +4 -4
  33. package/dist/report/react/EvalList.js +0 -0
  34. package/dist/report/react/ExperimentComparison.d.ts +10 -0
  35. package/dist/report/react/ExperimentComparison.js +12 -0
  36. package/dist/report/react/ExperimentList.d.ts +4 -3
  37. package/dist/report/react/ExperimentList.js +17 -18
  38. package/dist/report/react/MetricBars.js +5 -4
  39. package/dist/report/react/MetricLine.js +12 -5
  40. package/dist/report/react/MetricMatrix.js +1 -1
  41. package/dist/report/react/MetricScatter.js +59 -28
  42. package/dist/report/react/MetricTable.js +2 -12
  43. package/dist/report/react/ScopeSummary.d.ts +10 -0
  44. package/dist/report/react/ScopeSummary.js +17 -0
  45. package/dist/report/react/Scoreboard.js +6 -6
  46. package/dist/report/react/cell.js +2 -2
  47. package/dist/report/react/chart-math.d.ts +23 -6
  48. package/dist/report/react/chart-math.js +71 -19
  49. package/dist/report/react/fixtures.d.ts +5 -9
  50. package/dist/report/react/fixtures.js +110 -147
  51. package/dist/report/react/index.d.ts +15 -5
  52. package/dist/report/react/index.js +18 -7
  53. package/dist/report/report.d.ts +137 -16
  54. package/dist/report/report.js +259 -28
  55. package/dist/report/text/faces.d.ts +17 -19
  56. package/dist/report/text/faces.js +253 -184
  57. package/dist/report/text/plot.js +1 -1
  58. package/dist/report/text/table.js +38 -7
  59. package/dist/report/tree.d.ts +90 -40
  60. package/dist/report/tree.js +252 -94
  61. package/dist/report/types.d.ts +247 -284
  62. package/dist/report/types.js +4 -3
  63. package/dist/report/web.d.ts +21 -5
  64. package/dist/report/web.js +42 -16
  65. package/dist/results/select.d.ts +38 -16
  66. package/dist/results/select.js +73 -25
  67. package/dist/results/types.d.ts +49 -14
  68. package/dist/runner/feedback/sink.d.ts +110 -0
  69. package/dist/runner/types.d.ts +513 -22
  70. package/dist/sandbox/docker.d.ts +23 -2
  71. package/dist/sandbox/e2b.d.ts +15 -1
  72. package/dist/sandbox/errors.d.ts +30 -3
  73. package/dist/sandbox/io-retry.d.ts +17 -0
  74. package/dist/sandbox/registry.d.ts +2 -0
  75. package/dist/sandbox/resolve.d.ts +18 -5
  76. package/dist/sandbox/retry.d.ts +11 -1
  77. package/dist/sandbox/types.d.ts +39 -5
  78. package/dist/sandbox/vercel.d.ts +7 -1
  79. package/dist/scoring/coverage.d.ts +30 -0
  80. package/dist/scoring/display.d.ts +21 -0
  81. package/dist/scoring/display.js +120 -0
  82. package/dist/scoring/types.d.ts +103 -20
  83. package/dist/shared/aggregate.d.ts +4 -2
  84. package/dist/shared/aggregate.js +8 -7
  85. package/dist/shared/types.d.ts +28 -0
  86. package/dist/tty-line.d.ts +0 -4
  87. package/dist/util.d.ts +23 -0
  88. package/docs-site/zh/README.md +44 -0
  89. package/docs-site/zh/examples/ai-agent-application.mdx +63 -0
  90. package/docs-site/zh/examples/coding-agent-extensions.mdx +57 -0
  91. package/docs-site/zh/examples/index.mdx +50 -0
  92. package/docs-site/zh/{concepts → explanation}/adapter.mdx +31 -13
  93. package/docs-site/zh/{concepts → explanation}/assert.mdx +7 -7
  94. package/docs-site/zh/{concepts → explanation}/drive.mdx +8 -8
  95. package/docs-site/zh/{concepts → explanation}/evals.mdx +4 -4
  96. package/docs-site/zh/{concepts → explanation}/experiment.mdx +8 -8
  97. package/docs-site/zh/{concepts → explanation}/hitl.mdx +8 -8
  98. package/docs-site/zh/{concepts → explanation}/judge.mdx +5 -5
  99. package/docs-site/zh/{concepts → explanation}/overview.mdx +11 -11
  100. package/docs-site/zh/{guides → explanation}/runner.mdx +18 -8
  101. package/docs-site/zh/{concepts → explanation}/tier.mdx +6 -6
  102. package/docs-site/zh/{guides → how-to}/agent-feedback-loop.mdx +35 -33
  103. package/docs-site/zh/{guides → how-to}/authoring.mdx +35 -2
  104. package/docs-site/zh/{guides → how-to}/ci-integration.mdx +23 -12
  105. package/docs-site/zh/{guides → how-to}/connect-otel.mdx +6 -6
  106. package/docs-site/zh/{guides → how-to}/connect-your-agent.mdx +47 -21
  107. package/docs-site/zh/{guides → how-to}/custom-reports.mdx +34 -39
  108. package/docs-site/zh/{guides → how-to}/dataset-fanout.mdx +25 -3
  109. package/docs-site/zh/{guides → how-to}/experiments.mdx +12 -5
  110. package/docs-site/zh/how-to/publish-report.mdx +105 -0
  111. package/docs-site/zh/{guides → how-to}/reporters.mdx +2 -2
  112. package/docs-site/zh/{guides → how-to}/sandbox-agent.mdx +56 -7
  113. package/docs-site/zh/how-to/sandbox-providers.mdx +350 -0
  114. package/docs-site/zh/{guides → how-to}/scoring-guide.mdx +4 -4
  115. package/docs-site/zh/{guides → how-to}/viewing-results.mdx +82 -39
  116. package/docs-site/zh/{guides → how-to}/write-experiment.mdx +6 -4
  117. package/docs-site/zh/{guides → how-to}/write-send.mdx +30 -14
  118. package/docs-site/zh/index.mdx +24 -26
  119. package/docs-site/zh/introduction.mdx +8 -8
  120. package/docs-site/zh/reference/builtin-agents.mdx +32 -5
  121. package/docs-site/zh/reference/capabilities.mdx +8 -8
  122. package/docs-site/zh/reference/cli.mdx +40 -12
  123. package/docs-site/zh/reference/define-agent.mdx +58 -5
  124. package/docs-site/zh/reference/define-config.mdx +1 -1
  125. package/docs-site/zh/reference/define-eval.mdx +42 -9
  126. package/docs-site/zh/reference/events.mdx +3 -3
  127. package/docs-site/zh/reference/expect.mdx +26 -1
  128. package/docs-site/zh/{guides → reference}/official-adapters.mdx +32 -8
  129. package/docs-site/zh/{guides → reference}/report-components.mdx +45 -33
  130. package/docs-site/zh/{guides → reference}/results-data.mdx +21 -13
  131. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +57 -0
  132. package/docs-site/zh/troubleshooting/debugging.mdx +212 -0
  133. package/docs-site/zh/{quickstart.mdx → tutorials/quickstart.mdx} +5 -17
  134. package/package.json +10 -2
  135. package/src/agents/ai-sdk-otel.test.ts +1 -0
  136. package/src/agents/ai-sdk.test.ts +3 -0
  137. package/src/agents/ai-sdk.ts +3 -0
  138. package/src/agents/bub-install-spec.test.ts +34 -0
  139. package/src/agents/bub-install-spec.ts +32 -0
  140. package/src/agents/bub.ts +31 -32
  141. package/src/agents/claude-code.test.ts +130 -9
  142. package/src/agents/claude-code.ts +76 -4
  143. package/src/agents/codex.test.ts +189 -40
  144. package/src/agents/codex.ts +155 -14
  145. package/src/agents/coding-cli-versions.test.ts +15 -0
  146. package/src/agents/coding-cli-versions.ts +3 -0
  147. package/src/agents/index.ts +13 -2
  148. package/src/agents/langgraph.test.ts +204 -0
  149. package/src/agents/langgraph.ts +495 -0
  150. package/src/agents/marketplace.ts +85 -0
  151. package/src/agents/native-config.test.ts +179 -0
  152. package/src/agents/native-config.ts +267 -0
  153. package/src/agents/openai-compat.test.ts +1 -0
  154. package/src/agents/openai-compat.ts +1 -1
  155. package/src/agents/openclaw.test.ts +31 -0
  156. package/src/agents/openclaw.ts +171 -0
  157. package/src/agents/plugin-config.test.ts +1 -0
  158. package/src/agents/sdk-streams.test.ts +79 -0
  159. package/src/agents/sdk-streams.ts +55 -10
  160. package/src/agents/skills.test.ts +1 -0
  161. package/src/agents/streaming.test.ts +3 -9
  162. package/src/agents/streaming.ts +2 -2
  163. package/src/agents/types.ts +71 -8
  164. package/src/agents/ui-message-stream.test.ts +3 -0
  165. package/src/cli.ts +446 -124
  166. package/src/context/context.test.ts +51 -12
  167. package/src/context/context.ts +162 -30
  168. package/src/context/session.test.ts +2 -1
  169. package/src/context/session.ts +115 -7
  170. package/src/context/types.ts +30 -12
  171. package/src/define.test.ts +13 -8
  172. package/src/define.ts +25 -4
  173. package/src/expect/index.ts +53 -23
  174. package/src/i18n/en.ts +81 -17
  175. package/src/i18n/zh-CN.ts +80 -17
  176. package/src/o11y/cost.test.ts +1 -0
  177. package/src/o11y/execution-tree.test.ts +1 -20
  178. package/src/o11y/otlp/mappers/claude-code.test.ts +1 -0
  179. package/src/o11y/otlp/parse.test.ts +1 -0
  180. package/src/o11y/otlp/turn-otel.test.ts +1 -0
  181. package/src/o11y/parsers/bub.test.ts +1 -0
  182. package/src/o11y/parsers/claude-code.test.ts +1 -34
  183. package/src/o11y/parsers/openclaw.test.ts +154 -0
  184. package/src/o11y/parsers/openclaw.ts +310 -0
  185. package/src/o11y/prices.json +746 -311
  186. package/src/o11y/tool-names.test.ts +1 -0
  187. package/src/o11y/types.ts +16 -2
  188. package/src/report/aggregate.ts +178 -61
  189. package/src/report/built-in/index.tsx +9 -0
  190. package/src/report/components.tsx +625 -279
  191. package/src/report/compute.ts +723 -491
  192. package/src/report/dual-render.test.tsx +741 -1024
  193. package/src/report/flag.ts +104 -12
  194. package/src/report/format.ts +32 -12
  195. package/src/report/index.ts +119 -46
  196. package/src/report/load.ts +3 -2
  197. package/src/report/locale.ts +136 -65
  198. package/src/report/metrics.ts +108 -25
  199. package/src/report/primitives.tsx +196 -45
  200. package/src/report/react/AttemptList.tsx +30 -43
  201. package/src/report/react/DeltaTable.tsx +63 -45
  202. package/src/report/react/EvalList.tsx +0 -0
  203. package/src/report/react/ExperimentComparison.tsx +73 -0
  204. package/src/report/react/ExperimentList.tsx +50 -32
  205. package/src/report/react/MetricBars.tsx +5 -4
  206. package/src/report/react/MetricLine.tsx +13 -8
  207. package/src/report/react/MetricMatrix.tsx +2 -2
  208. package/src/report/react/MetricScatter.tsx +86 -34
  209. package/src/report/react/MetricTable.tsx +4 -76
  210. package/src/report/react/ScopeSummary.tsx +86 -0
  211. package/src/report/react/Scoreboard.tsx +28 -10
  212. package/src/report/react/cell.tsx +2 -2
  213. package/src/report/react/chart-math.test.ts +85 -0
  214. package/src/report/react/chart-math.ts +101 -22
  215. package/src/report/react/enhance.js +89 -5
  216. package/src/report/react/fixtures.ts +114 -154
  217. package/src/report/react/index.tsx +24 -39
  218. package/src/report/react/render.test.tsx +138 -158
  219. package/src/report/react/styles.css +243 -82
  220. package/src/report/report.test.ts +779 -841
  221. package/src/report/report.ts +423 -41
  222. package/src/report/text/faces.ts +290 -193
  223. package/src/report/text/plot.ts +1 -1
  224. package/src/report/text/table.ts +44 -7
  225. package/src/report/tree.ts +362 -104
  226. package/src/report/types.ts +261 -271
  227. package/src/report/web.ts +63 -20
  228. package/src/results/annotated-source.test.ts +62 -9
  229. package/src/results/annotated-source.ts +64 -6
  230. package/src/results/attempt-evidence.test.ts +13 -11
  231. package/src/results/attempt-evidence.ts +20 -13
  232. package/src/results/attempt-source.ts +6 -3
  233. package/src/results/copy.ts +150 -60
  234. package/src/results/host-equivalence.test.ts +34 -20
  235. package/src/results/index.ts +12 -4
  236. package/src/results/locator.test.ts +1 -22
  237. package/src/results/open.ts +15 -5
  238. package/src/results/publish.ts +149 -0
  239. package/src/results/results.test.ts +89 -54
  240. package/src/results/select.ts +104 -34
  241. package/src/results/truncate.ts +90 -0
  242. package/src/results/types.ts +43 -14
  243. package/src/results/writer.ts +31 -13
  244. package/src/runner/attempt.test.ts +138 -7
  245. package/src/runner/attempt.ts +603 -104
  246. package/src/runner/discover.test.ts +47 -0
  247. package/src/runner/discover.ts +36 -2
  248. package/src/runner/eval-source.test.ts +1 -27
  249. package/src/runner/feedback/agent.test.ts +504 -0
  250. package/src/runner/feedback/agent.ts +409 -0
  251. package/src/runner/feedback/ci.test.ts +562 -0
  252. package/src/runner/feedback/ci.ts +401 -0
  253. package/src/runner/feedback/coordinator.test.ts +317 -0
  254. package/src/runner/feedback/coordinator.ts +397 -0
  255. package/src/runner/feedback/failure.ts +40 -0
  256. package/src/runner/feedback/human.test.ts +616 -0
  257. package/src/runner/feedback/human.ts +535 -0
  258. package/src/runner/feedback/index.ts +66 -0
  259. package/src/runner/feedback/io.ts +78 -0
  260. package/src/runner/feedback/profile.test.ts +50 -0
  261. package/src/runner/feedback/profile.ts +58 -0
  262. package/src/runner/feedback/reducer.test.ts +395 -0
  263. package/src/runner/feedback/reducer.ts +260 -0
  264. package/src/runner/feedback/renderer.ts +82 -0
  265. package/src/runner/feedback/sink.ts +203 -0
  266. package/src/runner/feedback/testing.ts +106 -0
  267. package/src/runner/ledger.test.ts +230 -0
  268. package/src/runner/ledger.ts +329 -0
  269. package/src/runner/report.test.ts +128 -3
  270. package/src/runner/report.ts +33 -9
  271. package/src/runner/reporters/artifacts.ts +8 -2
  272. package/src/runner/reporters/braintrust.test.ts +8 -7
  273. package/src/runner/reporters/braintrust.ts +9 -2
  274. package/src/runner/reporters/index.ts +2 -2
  275. package/src/runner/reporters/json.test.ts +162 -0
  276. package/src/runner/reporters/json.ts +35 -8
  277. package/src/runner/reporters/shared.ts +1 -5
  278. package/src/runner/run.test.ts +760 -3
  279. package/src/runner/run.ts +243 -37
  280. package/src/runner/sandbox-prep.ts +3 -42
  281. package/src/runner/timing.ts +158 -0
  282. package/src/runner/types.ts +518 -22
  283. package/src/sandbox/checkpoint.test.ts +55 -0
  284. package/src/sandbox/checkpoint.ts +29 -8
  285. package/src/sandbox/cli-commands.ts +407 -0
  286. package/src/sandbox/docker.ts +115 -16
  287. package/src/sandbox/e2b-agent-template.test.ts +56 -0
  288. package/src/sandbox/e2b-agent-template.ts +94 -0
  289. package/src/sandbox/e2b.ts +74 -9
  290. package/src/sandbox/errors.ts +111 -4
  291. package/src/sandbox/index.ts +2 -0
  292. package/src/sandbox/io-retry.test.ts +58 -0
  293. package/src/sandbox/io-retry.ts +45 -0
  294. package/src/sandbox/keep-registry.test.ts +86 -0
  295. package/src/sandbox/keep-registry.ts +142 -0
  296. package/src/sandbox/keep.ts +178 -0
  297. package/src/sandbox/paths.test.ts +1 -0
  298. package/src/sandbox/paths.ts +19 -8
  299. package/src/sandbox/registry.ts +20 -3
  300. package/src/sandbox/resolve.ts +76 -11
  301. package/src/sandbox/retry.test.ts +70 -0
  302. package/src/sandbox/retry.ts +46 -4
  303. package/src/sandbox/types.ts +44 -6
  304. package/src/sandbox/vercel.ts +43 -20
  305. package/src/scoring/collector.ts +60 -17
  306. package/src/scoring/coverage.ts +95 -0
  307. package/src/scoring/diff.ts +81 -0
  308. package/src/scoring/display.test.ts +121 -0
  309. package/src/scoring/display.ts +133 -0
  310. package/src/scoring/evidence.test.ts +189 -0
  311. package/src/scoring/judge.test.ts +142 -0
  312. package/src/scoring/judge.ts +15 -18
  313. package/src/scoring/scoped.ts +217 -50
  314. package/src/scoring/types.ts +117 -20
  315. package/src/scoring/verdict.ts +16 -4
  316. package/src/shared/aggregate.ts +8 -6
  317. package/src/shared/types.ts +31 -0
  318. package/src/show/compose.ts +50 -67
  319. package/src/show/index.ts +127 -56
  320. package/src/show/render.ts +662 -131
  321. package/src/show/report-host.test.ts +188 -0
  322. package/src/show/report-host.ts +375 -0
  323. package/src/show/show.test.ts +320 -54
  324. package/src/tty-line.ts +8 -26
  325. package/src/util.test.ts +1 -0
  326. package/src/util.ts +41 -0
  327. package/src/view/app/App.test.tsx +69 -0
  328. package/src/view/app/App.tsx +144 -48
  329. package/src/view/app/components/AttemptModal.tsx +423 -11
  330. package/src/view/app/components/CodeView.tsx +41 -14
  331. package/src/view/app/components/CopyControls.tsx +2 -2
  332. package/src/view/app/i18n.ts +37 -17
  333. package/src/view/app/lib/attempt-route.test.ts +1 -0
  334. package/src/view/app/lib/verdict.ts +7 -9
  335. package/src/view/app/main.tsx +13 -8
  336. package/src/view/app/pages/{RunsPage.tsx → AttemptsPage.tsx} +6 -6
  337. package/src/view/app/types.ts +4 -1
  338. package/src/view/artifact-serving.test.ts +2 -1
  339. package/src/view/client-dist/app.css +1 -1
  340. package/src/view/client-dist/app.js +17 -17
  341. package/src/view/data.test.ts +10 -3
  342. package/src/view/data.ts +155 -49
  343. package/src/view/index.ts +56 -41
  344. package/src/view/server.ts +37 -15
  345. package/src/view/shared/types.ts +34 -5
  346. package/src/view/styles.css +227 -0
  347. package/src/view/view-report.test.ts +167 -62
  348. package/dist/report/built-ins/experiment-comparison.d.ts +0 -1
  349. package/dist/report/built-ins/experiment-comparison.js +0 -13
  350. package/dist/report/built-ins/index.d.ts +0 -1
  351. package/dist/report/built-ins/index.js +0 -2
  352. package/dist/report/react/GroupSummary.d.ts +0 -8
  353. package/dist/report/react/GroupSummary.js +0 -8
  354. package/dist/report/react/RunOverview.d.ts +0 -8
  355. package/dist/report/react/RunOverview.js +0 -12
  356. package/docs-site/zh/example/ai-agent-application.mdx +0 -152
  357. package/docs-site/zh/example/claude-code-codex-plugin.mdx +0 -167
  358. package/docs-site/zh/example/claude-code-codex-skill.mdx +0 -152
  359. package/docs-site/zh/example/showcase.mdx +0 -39
  360. package/docs-site/zh/guides/publish-report.mdx +0 -91
  361. package/docs-site/zh/guides/sandbox-providers.mdx +0 -102
  362. package/src/report/built-in-user-parity.test.tsx +0 -640
  363. package/src/report/built-ins/experiment-comparison.tsx +0 -19
  364. package/src/report/built-ins/index.ts +0 -2
  365. package/src/report/react/GroupSummary.tsx +0 -66
  366. package/src/report/react/RunOverview.tsx +0 -109
  367. package/src/runner/reporters/console.ts +0 -70
  368. package/src/runner/reporters/live.test.ts +0 -56
  369. package/src/runner/reporters/live.ts +0 -247
  370. package/src/runner/reporters/quiet.test.ts +0 -66
  371. package/src/runner/reporters/quiet.ts +0 -49
  372. package/src/runner/reporters/table.ts +0 -277
  373. /package/docs-site/zh/{example/tier1-ai-sdk-v7.mdx → examples/integrations/ai-sdk-v7.mdx} +0 -0
  374. /package/docs-site/zh/{example/tier1-claude-sdk.mdx → examples/integrations/claude-sdk.mdx} +0 -0
  375. /package/docs-site/zh/{example/tier1-codex-sdk.mdx → examples/integrations/codex-sdk.mdx} +0 -0
  376. /package/docs-site/zh/{example/tier1-langgraph.mdx → examples/integrations/langgraph.mdx} +0 -0
  377. /package/docs-site/zh/{example/tier1-pi-sdk.mdx → examples/integrations/pi-sdk.mdx} +0 -0
  378. /package/docs-site/zh/{guides → how-to}/fixtures.mdx +0 -0
@@ -4,29 +4,26 @@ sidebarTitle: "查看结果"
4
4
  description: "每次运行写入 .niceeval/ 的结构化 artifact 有两扇门:niceeval show 在终端用 @<locator> 精确定位一次 Attempt,逐级下钻 Eval 源码、执行记录与 diff;niceeval view 在网页看同一份证据。"
5
5
  ---
6
6
 
7
- 每次运行后,[NiceEval](https://niceeval.com/) 都会把结构化结果写入该实验的**结果快照**目录 `.niceeval/<experiment>/<快照>/`。看结果有两扇门,读的是同一批 artifact:`niceeval show` 是终端读法,人和 coding agent 都能用;`niceeval view` 是网页读法,适合人浏览证据。两扇门共用判定公式与选结果规则:对每个 experiment 的每道 eval,取时间上最新的那份判定,同一个 experiment 跨多次运行拼出来。默认首页针对媒介不同:`show` 先给可下钻的 Attempt 表,`view` 先给图表分析;传入同一个 `--report` 文件时则共用报告组件与数据口径。
7
+ 每次运行后,[NiceEval](https://niceeval.com/) 都会把结构化结果写入该实验的**结果快照**目录 `.niceeval/<experiment>/<快照>/`。看结果有两扇门,读的是同一批 artifact:`niceeval show` 是终端读法,人和 coding agent 都能用;`niceeval view` 是网页读法,适合人浏览证据。两扇门共用判定公式、选结果规则和默认报告:对每个 experiment 的每道 eval,取时间上最新的那份判定,同一个 experiment 跨多次运行拼出来;再按 experiment id 的父目录分组,只在同组内比较。`show` 输出文本面,`view` 输出网页面。
8
8
 
9
9
  ## 控制台输出
10
10
 
11
11
  ```text
12
- Discovered 3 evals
13
-
14
- classify (12ms)
15
- weather/brooklyn (456ms)
16
- ✗ api-validation (38s)
17
- - gate: expected src/routes/users.ts to include .safeParse() [FAILED]
18
-
19
- Failing:
20
- ✗ api-validation
21
- gate fileIncludes("src/routes/users.ts", ".safeParse()")
22
- niceeval show api-validation
23
-
24
- Results: 2 passed, 1 failed, 0 errored, 0 skipped
25
- Structured results: .niceeval/compare_web-agent/2026-07-09T10-00-00-000Z-x1f2/
26
- (snapshot.json + 每 attempt 的 result.json / events.json / trace.json / diff.json)
12
+ Plan: 45 attempts · 9 evals × 5 configs · concurrency 19
13
+ ✗ @12h8m4k1 fixtures/button [compare/claude-e2b] errored · sandbox.create
14
+ sandbox-rate-limit: E2B sandbox allocation failed after 5 attempts
15
+ Inspect: niceeval show @12h8m4k1
16
+
17
+ niceeval exp compare 2m 14s
18
+ 45 total · 6 reused · 19 running · 12 queued · 8 completed $0.84
19
+
20
+ ACTIVE
21
+ memory/agent-029-use-cache compare/bub-e2b 1m 42s running tests
22
+ memory/agent-030-app-route compare/codex 1m 18s editing src/app.ts
23
+ … 17 more active
27
24
  ```
28
25
 
29
- 运行中每个 eval 一条流式行,失败断言内联展开;运行结束的收尾块把失败集中重放一遍,每条自带下钻命令,末尾是本次实验的快照目录。这段输出怎么进「跑→读→修→再跑」的循环,见 [Agent 反馈闭环](/zh/guides/agent-feedback-loop)。
26
+ Human profile 只原位更新当前总数和 active slots,不把历史帧推入 scrollback。失败、错误和去重后的 diagnostic 永久追加,并带 locator。结束块只保留摘要、失败 locator、下钻命令和结果路径。这段输出怎么进「跑→读→修→再跑」的循环,见 [Agent 反馈闭环](/zh/how-to/agent-feedback-loop)。
30
27
 
31
28
  ## `.niceeval/<experiment>/<快照>/`
32
29
 
@@ -38,7 +35,7 @@ Structured results: .niceeval/compare_web-agent/2026-07-09T10-00-00-000Z-x1f2/
38
35
  └─ 2026-07-09T10-00-00-000Z-x1f2/ # 快照目录:时间戳 + 随机后缀
39
36
  ├─ snapshot.json # 快照元数据(开始时写,收尾补 completedAt)
40
37
  └─ weather-tool/a0/ # 单个 eval attempt 的目录
41
- ├─ result.json # 判决、断言、用量 —— attempt 完成时一次写成
38
+ ├─ result.json # 判定、断言、结构化错误/diagnostics、用量
42
39
  ├─ events.json
43
40
  ├─ sources.json
44
41
  ├─ trace.json
@@ -51,39 +48,44 @@ Structured results: .niceeval/compare_web-agent/2026-07-09T10-00-00-000Z-x1f2/
51
48
  `niceeval show` 的位置参数有两种形态:eval id 前缀选「看哪些 eval」,`@<locator>` 精确指名「看哪一次 Attempt」。flag 选「看哪个切面」:
52
49
 
53
50
  ```bash
54
- niceeval show # 榜单:每个 Attempt 的判定、eval、locator、短原因、耗时与成本
51
+ niceeval show # 默认报告:按实验组分区,组内比较配置并下钻到 Attempt
55
52
  niceeval show weather # 前缀过滤:weather/* 下每个 eval 的判定
56
53
  niceeval show weather/brooklyn # 单个 eval:各 experiment 的 attempt 行(含 @<locator>)、默认 attempt 的断言明细
57
54
  niceeval show @1k2m9qrs # 精确到一次 Attempt:紧凑全景(断言/执行/diff 摘要 + 可用证据一览)
58
55
  niceeval show @1k2m9qrs --eval # 该 Attempt 运行时保存的 Eval 源码,断言标回源码行
59
56
  niceeval show @1k2m9qrs --execution # 该 Attempt 的消息、thinking、Skill 加载、工具调用,有 OTel 时补时间
57
+ niceeval show @1c3h6twx --timing # 有界诊断时间树:phase、hook、operation、shell、turn、OTel 与收尾
58
+ niceeval show @1c3h6twx --timing=full # 同一棵时间树逐节点完整展开
60
59
  niceeval show @1c3h6twx --diff # sandbox 里的文件改动
61
60
  niceeval show weather/brooklyn --history # 跨 run 时间轴:抖动与回归拐点
62
61
  ```
63
62
 
64
- `@<locator>` 是一次 Attempt 的持久、不透明身份,形如 `@1k2m9qrs`:由 `{experimentId, 快照时刻, evalId, attempt 序号}` 这个身份元组确定性派生,同一份落盘结果反复解析恒得到同一个值。它出现在 `niceeval show` 的紧凑索引里,直接复制粘贴就能定位到那一次运行。裸 `show` 的 locator 列只打印 `@<id>`,不追加判定或证据能力缩写;打开 Attempt 首页后,`available` 会列出实际可用的证据命令。
63
+ `@<locator>` 是一次 Attempt 的持久、不透明身份,形如 `@1k2m9qrs`:由 `{experimentId, 快照时刻, evalId, attempt 序号}` 这个身份元组确定性派生,同一份落盘结果反复解析恒得到同一个值。它出现在 `niceeval show` 的分组明细里,直接复制粘贴就能定位到那一次运行。列表里的 locator 只打印 `@<id>`,不追加判定或证据能力缩写;打开 Attempt 首页后,`available` 会列出实际可用的证据命令。
64
+
65
+ Sandbox 创建、setup 或 teardown 错误不依赖 trace。`result.json` 保存错误的 `code`、`message`、生命周期阶段(`phase`)、有限 cause/stack 和 diagnostics;trace 只在存在时补调用关系与耗时。Attempt 在 cleanup、teardown 和 sandbox stop 结束后才封口写入,因此收尾 diagnostic 也能回顾。
65
66
 
66
67
  同一个实验多次跑会留下多份结果,不带 `@<locator>` 的默认视图只回答一个问题——「现在整体怎样」:每个 experiment × eval 取时间上最新的那份判定,同一个 experiment 跨多次运行拼出来。按前缀只重跑了部分 eval 时,其余 eval 的判定从更早的运行补齐,报告永远是全局最新,不会因为一次局部重跑变残缺。合成是有标注的:每份判定都带上它产生的时间,能看出报告是从哪几次运行拼出来的。合成结果可能混着不同版本的被测代码——所以收工判定以 `--force` 全量重跑为准,迭代途中的 `show` 负责快、收尾的全量跑负责真。
67
68
 
68
- 单个 eval 视图里,多 experiment、多 Attempt 时的断言明细块默认挑最新一次失败的 Attempt 展开;没有失败就挑最新一次。这只是一个默认展开的启发式,不是精确选择——需要精确看某一次 Attempt,复制那一行的 `@<locator>` 直接 `show` 它即可。`--experiment` Selection 收窄到一个实验,`--run <目录>` 钉死看某一次历史 run,`--history` 看跨 run 趋势。不带 `--report` `show` 渲染专用 Attempt 索引;`--report <文件>` 换成你自己的报告,同一个文件也能喂给 `view`。位置前缀、`--run`、`--experiment` 对 `--report` 同样生效;`--history` 与 `--report` 互斥。
69
+ 单个 eval 视图里,多 experiment、多 Attempt 时的断言明细块默认挑最新一次失败的 Attempt 展开;没有失败就挑最新一次。这只是一个默认展开的启发式,不是精确选择——需要精确看某一次 Attempt,复制那一行的 `@<locator>` 直接 `show` 它即可。`--experiment compare` 按路径段前缀把 Selection 收窄到整个 `compare` 组,`--experiment compare/bub` 只留一个 experiment;`--run <目录>` 钉死看某一次历史 run,`--history` 看跨 run 趋势。`--report <文件>` 同时替换 `show` / `view` 的默认报告。位置前缀、`--run`、`--experiment` 对自定义报告同样生效;`--history` 与 `--report` 互斥。
69
70
 
70
71
  `niceeval view` 的每个视图都有 CLI 对应物:
71
72
 
72
73
  | `niceeval view` 里的视图 | 终端对应 |
73
74
  | --- | --- |
74
- | 当前结果的同构 Attempt 表 | `niceeval show` |
75
+ | 当前结果的分组比较报告 | `niceeval show` |
75
76
  | 该 eval 各 experiment 的判定行 + 默认 attempt 的断言明细 | `niceeval show <eval id>` |
76
77
  | 单次 Attempt 的紧凑全景(断言、执行、diff 摘要与证据可用性) | `niceeval show @<locator>` |
77
78
  | Eval 源码标注(断言标回源码行) | `niceeval show @<locator> --eval` |
78
79
  | AI 对话、thinking、Skill 加载与工具调用(有 OTel 时补时间) | `niceeval show @<locator> --execution` |
80
+ | 单次 Attempt 的阶段耗时分解 | `niceeval show @<locator> --timing`;逐节点审计用 `--timing=full` |
79
81
  | 文件改动 | `niceeval show @<locator> --diff` |
80
82
  | 历史 run 列表 | `niceeval show <eval id> --history`;钉死某一次用 `--run <目录>` |
81
83
 
82
- ### 默认 Attempt 索引
84
+ ### 默认分组比较报告
83
85
 
84
- 不带 flag 的 `niceeval show` 先按 experiment 打印摘要,再用同构表列出每个 Attempt。列固定为 `STATUS / EVAL / ATTEMPT / RESULT / DURATION / COST`:四态判定同时给图标与完整单词,locator 只保留 `@<id>`,失败原因优先显示期望值/实际值或命令退出码。完整断言和 evidence 留在 `niceeval show @<locator>`。
86
+ 不带 flag 的 `niceeval show` 如果命中多个可比组,只列组索引和可直接执行的 `niceeval show --experiment <group>` 命令;Selection 只剩一个组时才输出该组的成本 × 端到端成功率图和实验列表。组的边界来自 experiment id 的完整父目录:`compare/*` `dev-e2b/*` 不共享坐标系、连线、排序或汇总数字;顶层 experiment 各自形成单例组。
85
87
 
86
- 只有一个 experiment 时直接显示它的表,不出现“至少两个实验才能比较”的无关空态。有两个及以上 experiment 时,前面增加紧凑比较表;成本 × 通过率散点留给 `niceeval view`。快照未完成、过旧或覆盖不全的 warning 位于索引前;自定义报告摆了 `RunOverview` 时,同一条 warning 也只显示一次。
88
+ 组内实验列表先给固定列汇总,再按 experiment Eval Attempt 展开。locator 只保留 `@<id>`,失败原因优先显示期望值/实际值或命令退出码;完整断言和 evidence 留在 `niceeval show @<locator>`。某组只有一个 experiment 时散点仍显示单点,不出现“至少两个实验才能比较”的空态。快照未完成、过旧或覆盖不全的 warning 位于组索引前,同一条 warning 只显示一次。
87
89
 
88
90
  ### 单个 eval
89
91
 
@@ -126,7 +128,7 @@ failures:
126
128
  source: evals/memory/swelancer-manager-proposals.eval.ts:40:11
127
129
 
128
130
  execution: 2 events · 0 skill loads · 0 tool calls · 1 AI messages
129
- timing: OTel spans recorded for this attempt — see --execution for per-step timing.
131
+ timing: eval.run 40.8s · scoring.evaluate 0.3s
130
132
 
131
133
  changes: diff unavailable · no workspace diff was recorded for this attempt
132
134
 
@@ -134,13 +136,14 @@ artifacts: .niceeval/compare_codex-gpt-5.4/2026-07-09T10-00-00-000Z-x1f2/weather
134
136
  available:
135
137
  niceeval show @1k2m9qrs --eval
136
138
  niceeval show @1k2m9qrs --execution
139
+ niceeval show @1k2m9qrs --timing
137
140
  ```
138
141
 
139
142
  这份全景只给摘要,不复现某个切面的完整内容——完整源码、完整事件流或完整文件列表分别要对应的证据 flag 才给。`changes` 一行永远说明 diff 不可用的具体原因:这里是「这次 Attempt 从未收集过 diff」(`weather/brooklyn` 不是 sandbox eval,压根不会有工作区改动可收集);如果是 sandbox eval 但 agent 确实没碰任何文件,会是另一句「没有产生工作区文件改动」;两种「不可用」原因不同,不共用一句含糊的提示。
140
143
 
141
- ### `--eval`、`--execution`、`--diff`:三个证据切面
144
+ ### `--eval`、`--execution`、`--timing`、`--diff`:四个证据切面
142
145
 
143
- 三个证据 flag 既可以加在 `@<locator>` 后面(精确到一次 Attempt),也可以加在能唯一收窄到一个 eval 的前缀后面(挑同一套默认启发式选中的 attempt——最新一次失败,没有失败就挑最新一次,与单 eval 详情块展开的是同一次);前缀撞到不止一个 eval 时会报错,报错正文直接给出每个候选 eval 的 `@<locator>`,照抄一个继续即可。可以同时传多个证据 flag,一次输出全部要看的切面。
146
+ 四个证据 flag 既可以加在 `@<locator>` 后面(精确到一次 Attempt),也可以加在能唯一收窄到一个 eval 的前缀后面(挑同一套默认启发式选中的 attempt——最新一次失败,没有失败就挑最新一次,与单 eval 详情块展开的是同一次);前缀撞到不止一个 eval 时会报错,报错正文直接给出每个候选 eval 的 `@<locator>`,照抄一个继续即可。可以同时传多个证据 flag,一次输出全部要看的切面。
144
147
 
145
148
  `--eval` 是运行时保存的 Eval 源码,按行标注每条断言、gate 失败与 soft 分数直接排在对应源码行下面,源码里没能对应到具体行的断言(没有位置信息,或位置指向另一个文件)单独成一段,永不丢弃:
146
149
 
@@ -231,6 +234,45 @@ timing unavailable · OTel trace was not collected
231
234
  full events: .niceeval/compare_codex-gpt-5.4/2026-07-09T10-00-00-000Z-x1f2/weather/brooklyn/a2/events.json
232
235
  ```
233
236
 
237
+ `--timing` 回答「整个 Attempt 的时间花在哪里」。runner 把 lifecycle、setup/teardown hook、批量工作的 operation、所有经 Sandbox API 发出的 shell 命令,以及每个 session/turn 的 send 墙钟包络记进 `result.json`;某轮有 OTel 时,再按 `traceId` 把 agent/model/tool span 挂到该轮下面。没有 OTel 时,phase、hook、operation、shell 与 turn 时间仍完整,只缺轮内细分。出错或超时的 Attempt 在已知的最深节点用 `✗` 标出死在哪里:
238
+
239
+ ```text
240
+ $ niceeval show @1c3h6twx --timing
241
+ @1c3h6twx · fixtures/button · compare/bub-gpt-5.4 · errored
242
+ total 2m 4s
243
+
244
+ sandbox.queue 0.3s
245
+ sandbox.create 8.2s
246
+ sandbox.setup 21.6s
247
+ ├─ restoreCache 18.9s
248
+ │ └─ shell · tar xzf … 18.8s
249
+ └─ setup#2 2.7s
250
+ └─ shell · pnpm config set … 2.7s
251
+ workspace.baseline 0.2s
252
+ └─ shell · git init && git commit … 0.2s
253
+ agent.setup 41.5s
254
+ ├─ shell · npm install -g @openai/codex… 39.8s
255
+ └─ shell · write ~/.codex/config.toml 1.7s
256
+ eval.run 50.9s
257
+ └─ turn s1/t1 50.9s ✗ agent-runtime-error
258
+ └─ shell · codex exec … 50.7s
259
+ ├─ agent · codex.exec 50.5s OTel
260
+ └─ model · chat 44.2s OTel
261
+
262
+ teardown (not counted in total):
263
+ agent.teardown 0.4s
264
+ sandbox.teardown 3.1s
265
+ └─ persistCache 3.1s
266
+ └─ shell · tar czf … 3.0s
267
+ sandbox.stop 1.2s
268
+ ```
269
+
270
+ 收尾阶段不计入 Attempt 总耗时,单独分组列出——「判定早就出了、进程还在等收尾」这类问题看这一组。缩进表示包含关系,不表示子项可以相加:命令、turn 和 OTel span 都可能嵌套或并发。
271
+
272
+ 裸 `--timing` 会完整列出 phase,并把 phase 下的细节控制在 80 个节点内。超过上限时,它优先保留失败路径、最慢节点与首尾时序,在省略位置显示节点数、未展示的失败数,并给出 `--timing=full`。小树中两种模式输出相同;`--timing=full` 不设节点上限,适合审计旧结果或把完整树重定向到文件。NiceEval 不自动启动 pager,因此管道、CI 和 coding agent 不会等待键盘输入。命令可能并发,省略行不会把子节点耗时相加。
273
+
274
+ operation 的名称由执行这段工作的组件在采集时写入。例如一次 workspace diff 导出可以显示成 `export workspace diff · 1 window · 3,302 files`,下面只有一条真实的批量 shell。展示层不会解析 `git show` 等命令文本、猜出一个 `git show ×N` 分组;如果旧 artifact 确实记录了几千次调用,默认模式有界摘要,`--timing=full` 仍能逐条核对。一次超时到底是 Sandbox 创建慢、某条安装命令慢,还是一轮里的模型/工具慢,`--timing` 一眼可判。旧结果或第三方写入的结果没有阶段数据时,两种模式都如实提示 `phase timing unavailable`。
275
+
234
276
  `--diff` 默认给文件级摘要(落盘的 diff 只有改动后的全文,没有基线可比对增删行数,所以每个改动过的文件都标 `M`、后面跟它现在的行数,不区分新建与修改);看单个文件的完整内容用 `--diff=<文件路径>`——路径必须用 `=` 连写,位置参数永远留给 eval id 前缀 / `@<locator>`:
235
277
 
236
278
  ```text
@@ -255,12 +297,12 @@ $ niceeval show @1c3h6twx --diff=src/components/Button.tsx
255
297
  2. 运行 niceeval show <eval-id>,读取该题各 experiment 的判定、默认 attempt 的断言明细,
256
298
  以及每行末尾的 @<locator>。
257
299
  3. 运行 niceeval show @<locator>,看紧凑全景确认这次 Attempt 实际捕获到了哪些证据。
258
- 4. 按问题选择 --eval、--execution 或 --diff;可以同时传多个证据 flag。
300
+ 4. 按问题选择 --eval、--execution、--timing 或 --diff;可以同时传多个证据 flag。
259
301
  5. 输出被截断时,读取末尾标出的 sources.json、events.json、trace.json 或 diff.json 原始路径。
260
302
  6. 修复后重跑该 eval,再用 niceeval show <eval-id> 验证新的 @<locator>;收工前用 --force 全量重跑确认整体结果。
261
303
  ```
262
304
 
263
- `--eval` 回答“这道题实际检查了什么、哪条断言为什么过或没过”,`--execution` 回答“agent 做了什么、调用了什么、时间花在哪里”,`--diff` 回答“沙箱里的文件实际改成了什么”。先按问题选证据,不需要每次把三份都读完。
305
+ `--eval` 回答“这道题实际检查了什么、哪条断言为什么过或没过”,`--execution` 回答“agent 做了什么、调用了什么”(可关联时附 OTel 时间),`--timing` 回答“整个 Attempt 的时间花在哪里”,`--diff` 回答“沙箱里的文件实际改成了什么”。先按问题选证据,不需要每次把四份都读完。
264
306
 
265
307
  ### 历史与抖动:`--history`
266
308
 
@@ -279,7 +321,7 @@ compare/codex-gpt-5.4 · 5 runs · passed 2/5
279
321
 
280
322
  ✓✗ 交替说明这个 eval 在抖,该修的是稳定性(被测程序或断言),反复重跑碰运气只会烧钱;连续绿转红的拐点就是回归引入的位置,用 `--run <目录>` 钉住拐点前后两次细看。时间轴只列真实执行——缓存携带的旧结果是判定的复印件,不占行,否则趋势会被复印件灌满假数据。不带 eval id 的 `niceeval show --history` 给每个 experiment 的 per-run 通过率序列,同一份趋势的榜单视角。
281
323
 
282
- 两次 run 的精确对比(这次修复具体翻转了哪些 eval)不做成 flag:用 `DeltaTable` 积木写一份报告递给 `--report`,几行就是一份自定义对比报告,终端和网页两扇门都认——内置命令只管固定摆法,自定义口径见[自定义报告](/zh/guides/custom-reports)。
324
+ 两次 run 的精确对比(这次修复具体翻转了哪些 eval)不做成 flag:用 `DeltaTable` 积木写一份报告递给 `--report`,几行就是一份自定义对比报告,终端和网页两扇门都认——内置命令只管固定摆法,自定义口径见[自定义报告](/zh/how-to/custom-reports)。
283
325
 
284
326
  ## `niceeval view`:网页证据室
285
327
 
@@ -293,13 +335,13 @@ npx niceeval view
293
335
  失败后立刻运行 `npx niceeval view`,可以直接打开刚刚那次运行的 artifacts。
294
336
  </Tip>
295
337
 
296
- `view` 的首页是一份报告:不传 `--report` 时是成本 × 通过率散点图与逐实验表,适合人在网页比较;传了 `--report` 就换成你自己的报告(与 `show --report` 吃同一个文件),见[自定义报告](/zh/guides/custom-reports)。裸 `show` 则使用更适合终端 agent 循环的 Attempt 索引。证据部分(Attempt 弹窗、transcript、trace 瀑布、run 列表)始终保留。
338
+ `view` 的首页是一份报告:不传 `--report` 时完整加载当前结果并显示全部可比组索引,选中一组后只显示该组的成本 × 端到端成功率散点图与实验表。切组只改变页面状态,不重新读取或计算;不同组不会混进同一张图或榜单。浏览器禁用 JS 时,每组作为独立的 `<details>` 完整可读;启用 JS 后一次聚焦一组。传了 `--report` 就换成你自己的报告(与 `show --report` 吃同一个文件),见[自定义报告](/zh/how-to/custom-reports)。证据部分(Attempt 弹窗、transcript、trace 瀑布、run 列表)始终保留。
297
339
 
298
- 网页版多几样浏览操作:点表头就地排序、在榜单的过滤框里筛行、点开一个 experiment 行看它每道题的判定与原因、悬停散点看数值——这些只影响眼前的视图,不改判定口径,刷新即恢复。报告上方有 **Copy fix prompt** 按钮,把全部失败打包成可直接粘给 coding agent 的修复 prompt(attempt 弹窗里有单条版)。报告文案有中英两份,随界面语言切换。
340
+ 网页版多几样浏览操作:切换可比组、点表头就地排序、在当前组的过滤框里筛行、点开一个 experiment 行看它每道题的判定与原因、悬停散点看数值——这些只影响眼前的视图,不改判定口径,刷新即恢复。Attempt 弹窗里有与 `show --timing` 同源的统一时间树:Sandbox 启动、setup hook 及其 shell、agent 安装命令、每轮 send 与可关联的 OTel model/tool、评分与收尾都能逐层展开。报告上方有 **Copy fix prompt** 按钮,把全部失败打包成可直接粘给 coding agent 的修复 prompt(attempt 弹窗里有单条版)。报告文案有中英两份,随界面语言切换。
299
341
 
300
342
  ## 导出与静态托管
301
343
 
302
- 发布结果只有一种导出:`--out <目录>` 整站导出,完整带上能查看的一切。想要自己的页面形态,用报告积木自建(见[自定义报告](/zh/guides/custom-reports))。
344
+ 发布结果只有一种导出:`--out <目录>` 整站导出,完整带上能查看的一切。想要自己的页面形态,用报告积木自建(见[自定义报告](/zh/how-to/custom-reports))。
303
345
 
304
346
  ### 内置查看器整站:静态托管
305
347
 
@@ -318,7 +360,7 @@ NiceEval 写入 `<dir>/index.html`,并把查看器要读取的 artifact(`sou
318
360
  - `diff.json` 和 `o11y.json` 不会被复制。查看器不读取它们,且 diff 可能达到上百 MB。
319
361
  - 用 `file://` 直接打开 `index.html` 时浏览器不允许 fetch artifact,代码视图会提示源码不可用。本地预览用 http 服务打开。
320
362
 
321
- 最简单的流程是在跑过 eval 的机器上导出,把产物目录直接部署,不需要额外步骤。要让站点随 push 自动更新,把 `.niceeval/` 提交进仓库、CI 上一行 `view --out` 导出——workflow 与平台接线见[通过 CI 发布报告](/zh/guides/publish-report)。
363
+ 最简单的流程是在跑过 eval 的机器上导出,把产物目录直接部署,不需要额外步骤。要让站点随 push 自动更新,先用 `copySnapshots` 生成经过单文件预算检查的发布结果根,把它提交进仓库,再让 CI 对这个目录运行 `view --run <目录> --out`——workflow 与平台接线见[通过 CI 发布报告](/zh/how-to/publish-report)。
322
364
 
323
365
  ## Artifact 说明
324
366
 
@@ -328,7 +370,7 @@ NiceEval 写入 `<dir>/index.html`,并把查看器要读取的 artifact(`sou
328
370
 
329
371
  ### `result.json`
330
372
 
331
- 单个 attempt 的权威记录:判定、断言、耗时、用量、成本。attempt 完成时一次写成,之后不再改写。
373
+ 单个 Attempt 的权威记录:判定、断言、正式阶段耗时、结构化 error、去重后的 diagnostics、用量和成本。cleanup、teardown 与 Sandbox stop 完成后一次写成,之后不再改写。`progress` 的短期 message/current/total 不落盘。
332
374
 
333
375
  ### `events.json`
334
376
 
@@ -344,7 +386,7 @@ eval 源码位置和断言位置,用于查看器把失败断言对应回代码
344
386
 
345
387
  ### `trace.json`
346
388
 
347
- OTLP trace 或标准化后的 span 数据。
389
+ OTLP trace 或标准化后的 span 数据。它是可选的执行关系和耗时证据,不是错误存储:沙箱创建(`sandbox.create`)可能早于 telemetry,teardown 可能晚于 trace collect。
348
390
 
349
391
  ### `o11y.json`
350
392
 
@@ -365,6 +407,7 @@ Soft 断言的分数记录在 `assertions[].score` 里;非 `--strict` 模式
365
407
 
366
408
  - 榜单里失败/错误的题每条自带下钻命令:`niceeval show <eval id>` 先看断言明细,行尾的 `@<locator>` 可以直接精确下钻到某一次 Attempt。
367
409
  - 想知道 eval 实际检查了什么、断言为什么过或没过,看 `--eval`(标回源码行的断言标注)。
368
- - 想知道 agent 做了什么、调用了什么、时间花在哪里,看 `--execution`(或 view 的证据面板)。
410
+ - 想知道 agent 做了什么、调用了什么,看 `--execution`;关联成功的 OTel 时间会贴在同一事件旁。
369
411
  - coding-agent 失败时看 `--diff` 和 `--execution` 里的工具调用;两者结合能看出「改错了文件」还是「压根没调用该调用的工具」。
370
- - 判断缺陷在被测程序还是 eval 本身、修完怎么重跑,流程见 [Agent 反馈闭环](/zh/guides/agent-feedback-loop)。
412
+ - Sandbox eval 跑得慢或超时,先看 `--timing`:排队、Sandbox 启动、setup hook 里的每条 shell、agent 安装命令、每轮 send 与可关联的 OTel model/tool 各花多久,一眼可判;收尾卡住也在这里单独列出。
413
+ - 判断缺陷在被测程序还是 eval 本身、修完怎么重跑,流程见 [Agent 反馈闭环](/zh/how-to/agent-feedback-loop)。
@@ -104,7 +104,7 @@ npx niceeval exp prompt-variants/concise
104
104
  | `timeoutMs` | 单个 attempt 的超时 |
105
105
  | `budget` | 这一格配置的预算上限 |
106
106
  | `maxConcurrency` | 这一格配置的并发上限 |
107
- | `sandbox` | sandbox agent 使用的后端,如 `dockerSandbox()` / `e2bSandbox()`;spec 上可以链 `.setup()` / `.teardown()` 挂按实验变化的环境钩子 |
107
+ | `sandbox` | sandbox agent 使用的 provider,如 `dockerSandbox()` / `e2bSandbox()`;spec 上可以链 `.setup()` / `.teardown()` 挂按实验变化的环境钩子 |
108
108
 
109
109
  Experiment 本身是纯配置数据,没有 `setup` / `teardown` 这类字段。要在跑 agent 前按实验准备环境(装二进制、预热、跨 attempt 载入和回存状态),挂在 `sandbox` 字段的 spec 上:
110
110
 
@@ -112,12 +112,14 @@ Experiment 本身是纯配置数据,没有 `setup` / `teardown` 这类字段
112
112
  export default defineExperiment({
113
113
  agent: codexAgent({ mcpServers: [mempalMcp] }),
114
114
  sandbox: e2bSandbox({ template: "fasteval-agents" })
115
- .setup(mempalSetup("codex")) // 装二进制、预热、写 hook、载入状态
115
+ .setup(mempalSetup("codex")) // 预检、写动态配置、预热、载入状态
116
116
  .teardown(mempalTeardown("codex")), // 回存状态
117
117
  maxConcurrency: 1, // 载入和回存之间不能并发,声明串行
118
118
  });
119
119
  ```
120
120
 
121
- 钩子的执行时机、多钩子顺序和失败语义见 [Sandbox 后端 · 环境钩子](/zh/guides/sandbox-providers#环境钩子)。
121
+ 固定的 Agent CLI、系统包和大模型缓存应先做进 image/template/snapshot;`.setup()` 不应在每个 Attempt 重建同一套环境。如何从官方 Docker 镜像、E2B 模板或 Vercel runtime 继续派生来提速,见 [沙箱 provider · 从官方基线继续构建以提速](/zh/how-to/sandbox-providers#从官方基线继续构建以提速)。
122
122
 
123
- 跨配置比较的设计建议见[实验矩阵](/zh/guides/experiments)。adapter 如何消费 `ctx.model` 和 `ctx.flags` 见[Adapter](/zh/concepts/adapter)。
123
+ 钩子的执行时机、多钩子顺序和失败语义见 [沙箱 provider · 环境钩子](/zh/how-to/sandbox-providers#环境钩子)。
124
+
125
+ 跨配置比较的设计建议见[实验矩阵](/zh/how-to/experiments)。adapter 如何消费 `ctx.model` 和 `ctx.flags` 见[Adapter](/zh/explanation/adapter)。
@@ -4,12 +4,13 @@ sidebarTitle: "如何写好 Send"
4
4
  description: "手写 Adapter 的 send 函数,一条主线七步走:发消息拿回复、接上之前的消息、记录消费、把工具解析成事件、人工介入(HITL)、接上 OTel trace、透传 experiment 的 flags。每一步只在上一步的代码上多几行,每一步解锁一组断言。"
5
5
  ---
6
6
 
7
- [Adapter](/zh/concepts/adapter) 讲了契约:`send` 传入 `TurnInput` 和 `AgentContext`,返回 `Turn`。这一页讲怎么写它——从"发一条消息拿到回复"的最小形态起步,一步一步加到完整接入。每一步只在上一步的代码上多几行,前面已有的部分在代码里用 `// ……省略` 标出;每一步末尾说明这几行解锁了哪些断言。改完任何一步都能立刻验证:把新解锁的断言写进一条 eval 重跑 `npx niceeval exp`,`niceeval view` 里能看到这一步新增的数据——多轮轨迹、用量、工具事件、待回答请求。
7
+ [Adapter](/zh/explanation/adapter) 讲了契约:`send` 传入 `TurnInput` 和 `AgentContext`,返回 `Turn`。这一页讲怎么写它——从"发一条消息拿到回复"的最小形态起步,一步一步加到完整接入。每一步只在上一步的代码上多几行,前面已有的部分在代码里用 `// ……省略` 标出;每一步末尾说明这几行解锁了哪些断言。改完任何一步都能立刻验证:把新解锁的断言写进一条 eval 重跑 `npx niceeval exp`,`niceeval view` 里能看到这一步新增的数据——多轮轨迹、用量、工具事件、待回答请求。
8
8
 
9
- 两个贯穿全文的原则:
9
+ 三个贯穿全文的原则:
10
10
 
11
- - **接的位置永远是用户前端本来就在用的那个接口。** 页面调哪个端点、收什么格式,Adapter 就调哪个端点、收什么格式——不为 eval 开新接口,也不 import 应用内部代码直调函数(为什么,见[接入你的 Agent](/zh/guides/connect-your-agent))。
11
+ - **接的位置永远是用户前端本来就在用的那个接口。** 页面调哪个端点、收什么格式,Adapter 就调哪个端点、收什么格式——不为 eval 开新接口,也不 import 应用内部代码直调函数(为什么,见[接入你的 Agent](/zh/how-to/connect-your-agent))。
12
12
  - **你唯一真正手写的是 transport**——URL、鉴权、请求体每家本来就不一样。解析(原始返回 → 标准事件流)有官方转换器,从 `niceeval/adapter` 导出;编排(会话续接、HITL 暂停恢复)的状态槽就挂在 `ctx.session` 上,取用即可,不需要额外声明什么。
13
+ - **运行反馈走 `ctx`,不直接写终端。** 长步骤用 `ctx.progress(...)`;需要在运行后回顾的退化或异常上下文用 `ctx.diagnostic(...)`;无法继续时抛错。不要从 Adapter 调用 `console.log/error` 或写 `process.stdout/stderr`。
13
14
 
14
15
  ![一次 t.send 的完整往返:eval 调用 t.send,运行器组装 TurnInput 与 ctx,adapter 调用你的应用并返回标准事件流 Turn。](/images/agent-turn-roundtrip-zh.svg)
15
16
 
@@ -38,6 +39,7 @@ const BASE_URL = "http://localhost:8080"; // 要按 experiment 切换地址,
38
39
  export default defineAgent({
39
40
  name: "chat-app",
40
41
  async send(input, ctx) {
42
+ ctx.progress({ message: "等待 Chat API" });
41
43
  const res = await fetch(`${BASE_URL}/v1/chat/completions`, { // ← 前端本来就在用的接口
42
44
  method: "POST",
43
45
  headers: { "content-type": "application/json" },
@@ -56,7 +58,21 @@ export default defineAgent({
56
58
  });
57
59
  ```
58
60
 
59
- **这一步解锁**:`t.reply`、`t.messageIncludes()`、judge 的全部对话材料,以及 experiment 侧的**模型对比**(`ctx.model` 就是 experiment 声明的 `model`,运行器原样递给你、Adapter 不解释含义,只转发——不需要等到后面的步骤,也不需要应用配合做任何改造,分档见 [Tier](/zh/concepts/tier))。
61
+ 如果接口返回了可继续处理、但证据不完整的响应,报告 diagnostic 而不是把原始响应全部打印出来:
62
+
63
+ ```ts
64
+ if (!res.requestId) {
65
+ ctx.diagnostic({
66
+ code: "missing-request-id",
67
+ level: "warning",
68
+ message: "响应没有 request id,无法与服务端日志关联",
69
+ });
70
+ }
71
+ ```
72
+
73
+ `progress` 不落盘;diagnostic 会随 Attempt 保存并可通过 locator 回顾。HTTP 连接失败或响应无法解析时直接抛错,runner 会记录错误发生在 `agent.run`,并把 Attempt 标为 `errored`。
74
+
75
+ **这一步解锁**:`t.reply`、`t.messageIncludes()`、judge 的全部对话材料,以及 experiment 侧的**模型对比**(`ctx.model` 就是 experiment 声明的 `model`,运行器原样递给你、Adapter 不解释含义,只转发——不需要等到后面的步骤,也不需要应用配合做任何改造,分档见 [Tier](/zh/explanation/tier))。
60
76
 
61
77
  它有两个明显的局限:每轮都是一场全新对话(第二次 `t.send` 接不上第一次),工具调用完全看不见。后面两步各解决一个。
62
78
 
@@ -137,7 +153,7 @@ export default defineAgent({
137
153
 
138
154
  ## 第四步:把工具解析成事件
139
155
 
140
- 应用的返回里不只有回复文本——Chat Completions 形返回的 `tool_calls` 记录了这轮调过什么工具。Adapter 最重要的工作就是**把接口的返回归一成标准事件流**:本轮发生的每件事一个对象,按真实发生顺序排进 `Turn.events`,对象是下面十种类型之一(各字段的实际值,[契约页有一轮的完整示例](/zh/concepts/adapter)):
156
+ 应用的返回里不只有回复文本——Chat Completions 形返回的 `tool_calls` 记录了这轮调过什么工具。Adapter 最重要的工作就是**把接口的返回归一成标准事件流**:本轮发生的每件事一个对象,按真实发生顺序排进 `Turn.events`,对象是下面十种类型之一(各字段的实际值,[契约页有一轮的完整示例](/zh/explanation/adapter)):
141
157
 
142
158
  ```ts
143
159
  type StreamEvent =
@@ -210,7 +226,7 @@ type StreamEvent =
210
226
  应用中途停下来等人(工具审批、等补充信息)时,`send` 两侧各有义务:
211
227
 
212
228
  - **停轮**:返回 `status: "waiting"`,并且每个待回答的问题吐一条带稳定 `id` 的 `input.requested` 事件——`t.parked()`、`t.requireInputRequest()` 读它,回答靠这个 `id` 对位。
213
- - **回答轮**:eval 里的 `t.respond(...)` 到 Adapter 是**又一次普通的 `send`**(还是同一条会话线、同一份状态),人的裁决以结构化形式随 `input.responses` 到达,每条带 `requestId`、`optionId` 或 `text`(形态见[不同回答的入参](/zh/concepts/adapter#不同回答的入参))。Adapter 先把裁决交回应用,再接着取结果。被人拒绝的调用,`action.result` 的 `status` 置 `"rejected"` 而不是 `"failed"`——拒绝是人的决定、不是工具故障,`noFailedActions()` 不误伤。
229
+ - **回答轮**:eval 里的 `t.respond(...)` 到 Adapter 是**又一次普通的 `send`**(还是同一条会话线、同一份状态),人的裁决以结构化形式随 `input.responses` 到达,每条带 `requestId`、`optionId` 或 `text`(形态见[不同回答的入参](/zh/explanation/adapter#不同回答的入参))。Adapter 先把裁决交回应用,再接着取结果。被人拒绝的调用,`action.result` 的 `status` 置 `"rejected"` 而不是 `"failed"`——拒绝是人的决定、不是工具故障,`noFailedActions()` 不误伤。
214
230
 
215
231
  "停轮时读了一半的现场"(比如一条读到一半的 SSE 流)也存在 `ctx.session` 上:停轮时 `ctx.session.hold(现场)`,回答轮开头 `ctx.session.take()` 取回——取到即清除,一次消费。
216
232
 
@@ -268,7 +284,7 @@ export default defineAgent({
268
284
  });
269
285
  ```
270
286
 
271
- 不需要 HITL 的接口,删掉停轮现场相关的三处(`Pending`、`hold`、开头的 `take` 分支)即可,其余不变。停轮 / 回答 / 续跑的完整心智模型见 [HITL](/zh/concepts/hitl)。
287
+ 不需要 HITL 的接口,删掉停轮现场相关的三处(`Pending`、`hold`、开头的 `take` 分支)即可,其余不变。停轮 / 回答 / 续跑的完整心智模型见 [HITL](/zh/explanation/hitl)。
272
288
 
273
289
  **这一步解锁**:`t.parked()`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()`,以及 `calledTool(..., { status: "rejected" })` 的精确断言。
274
290
 
@@ -302,7 +318,7 @@ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318/v1/traces node server.js
302
318
 
303
319
  `ctx.telemetry` 只在配置了 OTel 接入时出现,没配时 spread 一个 `undefined` 也安全,这行可以常驻。不带这个头 span 也能收到,但归属退化成时间窗口、该 agent 的轮次会降为串行——带上它是并发下归属准确的来源。
304
320
 
305
- **这一步解锁**:`niceeval view` 里的调用瀑布图——应用内部每次模型调用、每次工具执行的耗时与 token,按轮铺成时间线。断言不变:判定依据在前几步的事件映射里已经齐了,span 只进瀑布图、不喂断言。接收器怎么起、span 怎么归属到轮,见 [OTel 接入](/zh/guides/connect-otel)。
321
+ **这一步解锁**:`niceeval view` 里的调用瀑布图——应用内部每次模型调用、每次工具执行的耗时与 token,按轮铺成时间线。断言不变:判定依据在前几步的事件映射里已经齐了,span 只进瀑布图、不喂断言。接收器怎么起、span 怎么归属到轮,见 [OTel 接入](/zh/how-to/connect-otel)。
306
322
 
307
323
  ## 第七步:透传 experiment 的 flags(A/B 对比)
308
324
 
@@ -329,7 +345,7 @@ export default defineExperiment({
329
345
  });
330
346
  ```
331
347
 
332
- 两个 experiment 文件各声明一份 `flags`,`npx niceeval exp` 分别跑同一批 eval,就是一组 A/B 对比。这是三档接入里的 Tier 3(要求应用配合暴露开关),投入与回报见 [Tier](/zh/concepts/tier);`flags` 与 `model`、`runs` 等其余 experiment 字段见[写实验](/zh/guides/write-experiment)。
348
+ 两个 experiment 文件各声明一份 `flags`,`npx niceeval exp` 分别跑同一批 eval,就是一组 A/B 对比。这是三档接入里的 Tier 3(要求应用配合暴露开关),投入与回报见 [Tier](/zh/explanation/tier);`flags` 与 `model`、`runs` 等其余 experiment 字段见[写实验](/zh/how-to/write-experiment)。
333
349
 
334
350
  **这一步解锁**:同一批 eval 跨变体的成绩对比。
335
351
 
@@ -347,8 +363,8 @@ export default defineExperiment({
347
363
 
348
364
  ## 相关阅读
349
365
 
350
- - [Adapter](/zh/concepts/adapter) — 契约本身:`send` 传入什么返回什么、三个接入等级、能力从哪来。
351
- - [接入你的 Agent](/zh/guides/connect-your-agent) — 接入全景:最小接入、参数通道与增量地图。
352
- - [HITL](/zh/concepts/hitl) — 停轮等人的完整概念:握手时序与两侧义务。
353
- - [Drive](/zh/concepts/drive) — eval 侧视角:`t.send()`、`t.newSession()` 与 HITL 怎么用。
354
- - [Assert](/zh/concepts/assert) — 标准事件流驱动的完整断言词汇。
366
+ - [Adapter](/zh/explanation/adapter) — 契约本身:`send` 传入什么返回什么、三个接入等级、能力从哪来。
367
+ - [接入你的 Agent](/zh/how-to/connect-your-agent) — 接入全景:最小接入、参数通道与增量地图。
368
+ - [HITL](/zh/explanation/hitl) — 停轮等人的完整概念:握手时序与两侧义务。
369
+ - [Drive](/zh/explanation/drive) — eval 侧视角:`t.send()`、`t.newSession()` 与 HITL 怎么用。
370
+ - [Assert](/zh/explanation/assert) — 标准事件流驱动的完整断言词汇。
@@ -19,14 +19,14 @@ description: "NiceEval 是一个渐进式、全功能、开发体验友好、Age
19
19
  eval 运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告和结构化 artifacts,让你能查看 agent 的行为细节,调试失败原因,并持续优化 pass rate、成本和延迟。
20
20
 
21
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 和工具调用记录验证插件行为。
22
+ <Card title="Agent Framework 接入" icon="code-branch" href="/zh/examples">
23
+ 对照 AI SDK、Claude SDK、Codex SDK、pi-agent-core LangGraph 的可运行接入项目。
24
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 批量比较通过率、成本和行为差异。
25
+ <Card title="Coding Agent 扩展" icon="wand-magic-sparkles" href="/zh/examples/coding-agent-extensions">
26
+ 用真实 Workspace 和对照实验衡量 Skill、提示词与 Plugin Benchmark 的实际收益。
27
27
  </Card>
28
- <Card title="AI Agent 应用" icon="globe" href="/zh/example/ai-agent-application">
29
- `defineAgent` 包装你的 AI Agent,把回复、工具调用和结构化输出纳入同一套 eval。
28
+ <Card title="自写 Adapter" icon="globe" href="/zh/examples/ai-agent-application">
29
+ 查看一个覆盖工具、图片、多轮、模型对比和 OTel 的完整 AI Agent 项目。
30
30
  </Card>
31
31
  </CardGroup>
32
32
 
@@ -86,13 +86,13 @@ eval 运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告
86
86
 
87
87
  | 概念 | 一句话 |
88
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-providers) | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
93
- | [Tier](/zh/concepts/tier) | 接入 Adapter 的三档投入:Tier 1 只接 send,Tier 2 加 OTel 换调用瀑布图,Tier 3 侵入改造做 feature A/B。 |
89
+ | [Eval](/zh/explanation/evals) | 一个测试用例:写在 `evals/*.eval.ts` 里,描述测什么。 |
90
+ | [Experiment](/zh/explanation/experiment) | 可签入的运行配置:决定连哪个 Adapter、什么 model、什么 flags。 |
91
+ | [Adapter](/zh/explanation/adapter) | 连接被测系统的适配层:实现一个 `send`,把返回翻译成标准事件流。 |
92
+ | [Sandbox](/zh/how-to/sandbox-providers) | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
93
+ | [Tier](/zh/explanation/tier) | 接入 Adapter 的三档投入:Tier 1 只接 send,Tier 2 加 OTel 换调用瀑布图,Tier 3 侵入改造做 feature A/B。 |
94
94
 
95
- 完整术语表见[架构概览](/zh/concepts/overview)。
95
+ 完整术语表见[架构概览](/zh/explanation/overview)。
96
96
 
97
97
  ## 示例
98
98
 
@@ -142,23 +142,21 @@ npx niceeval view # 网页交互浏览
142
142
 
143
143
  ## 快速开始
144
144
 
145
- 如果你想让 coding agent 直接帮项目接入 [NiceEval](https://niceeval.com/),可以把对应场景页交给它读:
145
+ 如果你想让 Coding Agent 直接帮项目接入 [NiceEval](https://niceeval.com/),让它先读安装入口:
146
146
 
147
147
  ```text
148
- 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.
149
- 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.
150
- READ https://raw.githubusercontent.com/CorrectRoadH/niceeval/refs/heads/main/docs-site/zh/example/ai-agent-application.mdx and install niceeval for this repo.
148
+ READ https://niceeval.com/INIT.md and install niceeval for this repo.
151
149
  ```
152
150
 
153
151
  <CardGroup cols={3}>
154
- <Card title="如果你需要 eval 你的 Claude Code / Codex 插件" icon="plug" href="/zh/example/claude-code-codex-plugin">
155
- 从真实插件任务出发,上传 workspace、注入插件,并用 pass rate 看插件是否稳定工作。
152
+ <Card title="浏览所有可运行示例" icon="grid-2" href="/zh/examples">
153
+ 按被测对象选择接入前后源码和完整项目。
156
154
  </Card>
157
- <Card title="如果你需要 eval 你的 Claude Code / Codex Skill" icon="wand-magic-sparkles" href="/zh/example/claude-code-codex-skill">
158
- 验证 Skill 是否被加载、是否按约定使用工具、是否产出可测试结果。
155
+ <Card title="评估 Coding Agent 扩展" icon="wand-magic-sparkles" href="/zh/examples/coding-agent-extensions">
156
+ 复用真实 Workspace、Baseline 和多 Arm 实验设计。
159
157
  </Card>
160
- <Card title="如果你需要 eval 你的 AI Agent 应用" icon="globe" href="/zh/example/ai-agent-application">
161
- 包装你的 agent 接口,写对话、工具调用、结构化输出和成本断言。
158
+ <Card title="自写 Adapter" icon="globe" href="/zh/examples/ai-agent-application">
159
+ 查看自定义 HTTP 协议和事件映射的完整项目。
162
160
  </Card>
163
161
  </CardGroup>
164
162
 
@@ -166,16 +164,16 @@ READ https://raw.githubusercontent.com/CorrectRoadH/niceeval/refs/heads/main/doc
166
164
 
167
165
  <AccordionGroup>
168
166
  <Accordion title="需要注册账号吗?">
169
- 不需要。跑 eval 和 `niceeval view` 看报告全在本地完成;只有被测对象本身是需要隔离工作区的 coding agent 时,才会用到 Docker 或 E2B 这类 sandbox 后端。
167
+ 不需要。跑 eval 和 `niceeval view` 看报告全在本地完成;只有被测对象本身是需要隔离工作区的 coding agent 时,才会用到 Docker 或 E2B 这类 sandbox provider。
170
168
  </Accordion>
171
169
  <Accordion title="我的 Agent 不是用 TypeScript / JavaScript 写的,能接吗?">
172
- 能。Adapter 只是对着应用本来暴露的接口(HTTP、gRPC、WebSocket 都行)收发;应用本身用什么语言写、部署在哪里,[NiceEval](https://niceeval.com/) 不关心,见 [Adapter](/zh/concepts/adapter)。
170
+ 能。Adapter 只是对着应用本来暴露的接口(HTTP、gRPC、WebSocket 都行)收发;应用本身用什么语言写、部署在哪里,[NiceEval](https://niceeval.com/) 不关心,见 [Adapter](/zh/explanation/adapter)。
173
171
  </Accordion>
174
172
  <Accordion title="能接到 CI 里吗?">
175
- 能,见 [CI 集成](/zh/guides/ci-integration)。
173
+ 能,见 [CI 集成](/zh/how-to/ci-integration)。
176
174
  </Accordion>
177
175
  </AccordionGroup>
178
176
 
179
177
  <Tip>
180
- 想先走最小路径,读 [快速开始](/zh/quickstart)。想理解边界,读 [架构概览](/zh/concepts/overview)。
178
+ 想先走最小路径,读 [快速开始](/zh/tutorials/quickstart)。想理解边界,读 [架构概览](/zh/explanation/overview)。
181
179
  </Tip>
@@ -120,22 +120,22 @@ NiceEval 是一个 Agent-Native 的评估工具。Dataset / golden 那一套「
120
120
  | Sandbox | 需要隔离工作区的 coding agent 才用得到;直连 Web Agent 不需要。 |
121
121
  | Tier | 接入 Adapter 的三档投入:Tier 1 只接 send,Tier 2 加 OTel 换调用瀑布图,Tier 3 侵入改造做 feature A/B。 |
122
122
 
123
- 完整术语表见[架构概览](/zh/concepts/overview)。
123
+ 完整术语表见[架构概览](/zh/explanation/overview)。
124
124
 
125
125
  ## 从你的场景开始
126
126
 
127
127
  <CardGroup cols={3}>
128
- <Card title="评估 Claude Code / Codex 插件" icon="puzzle-piece" href="/zh/example/claude-code-codex-plugin">
129
- 把插件放进真实 workspace,比较有插件和无插件时的通过率、成本、耗时和行为差异。
128
+ <Card title="接入 Agent Framework" icon="code-branch" href="/zh/examples">
129
+ 选择 AI SDK、Claude SDK、Codex SDK、pi-agent-core 或 LangGraph 的可运行接入示例。
130
130
  </Card>
131
- <Card title="评估 Claude Code / Codex Skill" icon="wand-magic-sparkles" href="/zh/example/claude-code-codex-skill">
132
- 对比有 Skill 和无 Skill coding-agent 任务,衡量 Skill 是否真的提升结果。
131
+ <Card title="评估 Coding Agent 扩展" icon="wand-magic-sparkles" href="/zh/examples/coding-agent-extensions">
132
+ 用真实 Workspace 和对照实验衡量 Skill、提示词与 Plugin Benchmark 的效果。
133
133
  </Card>
134
- <Card title="评估你的 AI Agent 应用" icon="robot" href="/zh/example/ai-agent-application">
135
- 直连你自己的应用接口,断言工具调用、图片理解和多轮会话。
134
+ <Card title="自写 Adapter" icon="robot" href="/zh/examples/ai-agent-application">
135
+ 查看自定义 HTTP Agent 的工具调用、图片理解、多轮会话和模型对比。
136
136
  </Card>
137
137
  </CardGroup>
138
138
 
139
139
  ## 接下来读什么
140
140
 
141
- [快速开始](/zh/quickstart) 会带你安装 [NiceEval](https://niceeval.com/)、构建 eval、得到评估报告。
141
+ [快速开始](/zh/tutorials/quickstart) 会带你安装 [NiceEval](https://niceeval.com/)、构建 eval、得到评估报告。