niceeval 0.13.2-canary.35 → 0.13.2

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 (485) hide show
  1. package/INDEX.md +24 -2
  2. package/dist/agents/bub-install-spec.cjs +19 -5
  3. package/dist/agents/bub-install-spec.cjs.map +1 -1
  4. package/dist/agents/bub-install-spec.d.cts +9 -2
  5. package/dist/agents/bub-install-spec.d.mts +9 -2
  6. package/dist/agents/bub-install-spec.d.ts +9 -2
  7. package/dist/agents/bub-install-spec.js +14 -12
  8. package/dist/agents/bub.cjs +10 -6
  9. package/dist/agents/bub.cjs.map +1 -1
  10. package/dist/agents/bub.d.cts +2 -2
  11. package/dist/agents/bub.d.mts +2 -2
  12. package/dist/agents/bub.d.ts +2 -2
  13. package/dist/agents/claude-code.cjs.map +1 -1
  14. package/dist/agents/claude-code.d.cts +2 -2
  15. package/dist/agents/claude-code.d.mts +2 -2
  16. package/dist/agents/claude-code.d.ts +2 -2
  17. package/dist/agents/codex.cjs +4 -4
  18. package/dist/agents/codex.cjs.map +1 -1
  19. package/dist/agents/codex.d.cts +3 -3
  20. package/dist/agents/codex.d.mts +3 -3
  21. package/dist/agents/codex.d.ts +3 -3
  22. package/dist/agents/deepseek-harness.cjs +50 -2
  23. package/dist/agents/deepseek-harness.cjs.map +1 -1
  24. package/dist/agents/deepseek-harness.d.cts +2 -0
  25. package/dist/agents/deepseek-harness.d.mts +2 -0
  26. package/dist/agents/deepseek-harness.d.ts +2 -0
  27. package/dist/agents/exact-npm-plugins.cjs +28 -0
  28. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  29. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  30. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  31. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  32. package/dist/agents/exact-npm-plugins.js +8 -0
  33. package/dist/agents/exact-npm-plugins.js.map +1 -0
  34. package/dist/agents/openclaw.cjs +51 -2
  35. package/dist/agents/openclaw.cjs.map +1 -1
  36. package/dist/agents/openclaw.d.cts +2 -0
  37. package/dist/agents/openclaw.d.mts +2 -0
  38. package/dist/agents/openclaw.d.ts +2 -0
  39. package/dist/agents/types.cjs.map +1 -1
  40. package/dist/agents/types.d.cts +2 -2
  41. package/dist/agents/types.d.mts +2 -2
  42. package/dist/agents/types.d.ts +2 -2
  43. package/dist/agents/ui-message-stream.cjs +24 -7
  44. package/dist/agents/ui-message-stream.cjs.map +1 -1
  45. package/dist/analysis/api.cjs +19 -1
  46. package/dist/analysis/api.cjs.map +1 -1
  47. package/dist/analysis/api.d.cts +2 -2
  48. package/dist/analysis/api.d.mts +2 -2
  49. package/dist/analysis/api.d.ts +2 -2
  50. package/dist/analysis/bindings.cjs +11 -18
  51. package/dist/analysis/bindings.cjs.map +1 -1
  52. package/dist/analysis/bindings.d.cts +177 -49
  53. package/dist/analysis/bindings.d.mts +177 -49
  54. package/dist/analysis/bindings.d.ts +177 -49
  55. package/dist/analysis/contracts.cjs +1 -0
  56. package/dist/analysis/contracts.cjs.map +1 -1
  57. package/dist/analysis/contracts.d.cts +43 -3
  58. package/dist/analysis/contracts.d.mts +43 -3
  59. package/dist/analysis/contracts.d.ts +43 -3
  60. package/dist/analysis/cost-projection.cjs +2 -1
  61. package/dist/analysis/cost-projection.cjs.map +1 -1
  62. package/dist/analysis/cost-projection.d.cts +1 -1
  63. package/dist/analysis/cost-projection.d.mts +1 -1
  64. package/dist/analysis/cost-projection.d.ts +1 -1
  65. package/dist/analysis/cost.cjs +13 -3
  66. package/dist/analysis/cost.cjs.map +1 -1
  67. package/dist/analysis/cost.d.cts +10 -3
  68. package/dist/analysis/cost.d.mts +10 -3
  69. package/dist/analysis/cost.d.ts +10 -3
  70. package/dist/analysis/experiment-groups.cjs +96 -0
  71. package/dist/analysis/experiment-groups.cjs.map +1 -0
  72. package/dist/analysis/experiment-groups.d.cts +9 -0
  73. package/dist/analysis/experiment-groups.d.mts +9 -0
  74. package/dist/analysis/experiment-groups.d.ts +9 -0
  75. package/dist/analysis/experiment-groups.js +10 -0
  76. package/dist/analysis/experiment-groups.js.map +1 -0
  77. package/dist/analysis/index.cjs +4 -1
  78. package/dist/analysis/index.cjs.map +1 -1
  79. package/dist/analysis/index.d.cts +4 -2
  80. package/dist/analysis/index.d.mts +4 -2
  81. package/dist/analysis/index.d.ts +4 -2
  82. package/dist/analysis/index.js +40 -36
  83. package/dist/analysis/index.mjs +40 -36
  84. package/dist/assertions/limits.cjs +4 -0
  85. package/dist/assertions/limits.cjs.map +1 -1
  86. package/dist/assertions/limits.d.cts +4 -0
  87. package/dist/assertions/limits.d.mts +4 -0
  88. package/dist/assertions/limits.d.ts +4 -0
  89. package/dist/assertions/match.cjs +63 -25
  90. package/dist/assertions/match.cjs.map +1 -1
  91. package/dist/assertions/match.d.cts +7 -0
  92. package/dist/assertions/match.d.mts +7 -0
  93. package/dist/assertions/match.d.ts +7 -0
  94. package/dist/assertions/record/attachment.cjs +32 -4
  95. package/dist/assertions/record/attachment.cjs.map +1 -1
  96. package/dist/assertions/record/diff.cjs +10 -4
  97. package/dist/assertions/record/diff.cjs.map +1 -1
  98. package/dist/assertions/record/producer.cjs +101 -4
  99. package/dist/assertions/record/producer.cjs.map +1 -1
  100. package/dist/assertions/record/producer.d.cts +4 -1
  101. package/dist/assertions/record/producer.d.mts +4 -1
  102. package/dist/assertions/record/producer.d.ts +4 -1
  103. package/dist/assertions/runtime.cjs +45 -5
  104. package/dist/assertions/runtime.cjs.map +1 -1
  105. package/dist/cli/record.cjs +113 -8
  106. package/dist/cli/record.cjs.map +1 -1
  107. package/dist/cli/record.d.cts +20 -1
  108. package/dist/cli/record.d.mts +20 -1
  109. package/dist/cli/record.d.ts +20 -1
  110. package/dist/cli/record.js +4 -2
  111. package/dist/cli.cjs +386 -31
  112. package/dist/cli.cjs.map +1 -1
  113. package/dist/cli.d.cts +10 -2
  114. package/dist/cli.d.mts +10 -2
  115. package/dist/cli.d.ts +10 -2
  116. package/dist/context/send-retry.cjs +4 -4
  117. package/dist/context/send-retry.cjs.map +1 -1
  118. package/dist/coordination/host/runtime.cjs +8 -30
  119. package/dist/coordination/host/runtime.cjs.map +1 -1
  120. package/dist/coordination/host/runtime.d.cts +3 -3
  121. package/dist/coordination/host/runtime.d.mts +3 -3
  122. package/dist/coordination/host/runtime.d.ts +3 -3
  123. package/dist/coordination/host/types.cjs.map +1 -1
  124. package/dist/coordination/host/types.d.cts +0 -5
  125. package/dist/coordination/host/types.d.mts +0 -5
  126. package/dist/coordination/host/types.d.ts +0 -5
  127. package/dist/coordination/platform/node.cjs +90 -9
  128. package/dist/coordination/platform/node.cjs.map +1 -1
  129. package/dist/define.cjs +25 -1
  130. package/dist/define.cjs.map +1 -1
  131. package/dist/experiment/host/index.cjs +1 -0
  132. package/dist/experiment/host/index.cjs.map +1 -1
  133. package/dist/i18n/en.cjs +19 -6
  134. package/dist/i18n/en.cjs.map +1 -1
  135. package/dist/i18n/en.d.cts +12 -4
  136. package/dist/i18n/en.d.mts +12 -4
  137. package/dist/i18n/en.d.ts +12 -4
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.cts +1 -1
  140. package/dist/index.d.mts +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/dist/o11y/prices.json +1 -1
  143. package/dist/o11y/record/families.cjs +12 -3
  144. package/dist/o11y/record/families.cjs.map +1 -1
  145. package/dist/o11y/record/families.d.cts +8 -8
  146. package/dist/o11y/record/families.d.mts +8 -8
  147. package/dist/o11y/record/families.d.ts +8 -8
  148. package/dist/o11y/record/family-projectors.d.cts +66 -18
  149. package/dist/o11y/record/family-projectors.d.mts +66 -18
  150. package/dist/o11y/record/family-projectors.d.ts +66 -18
  151. package/dist/o11y/record/family-writers.d.cts +11 -3
  152. package/dist/o11y/record/family-writers.d.mts +11 -3
  153. package/dist/o11y/record/family-writers.d.ts +11 -3
  154. package/dist/o11y/record/runner-producer.cjs +14 -4
  155. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  156. package/dist/record/codec/core.d.cts +2 -2
  157. package/dist/record/codec/core.d.mts +2 -2
  158. package/dist/record/codec/core.d.ts +2 -2
  159. package/dist/record/family/catalog.d.cts +44 -12
  160. package/dist/record/family/catalog.d.mts +44 -12
  161. package/dist/record/family/catalog.d.ts +44 -12
  162. package/dist/record/family/index.js +128 -124
  163. package/dist/record/family/observability-v1.cjs +35 -0
  164. package/dist/record/family/observability-v1.cjs.map +1 -0
  165. package/dist/record/family/observability-v1.d.cts +3 -0
  166. package/dist/record/family/observability-v1.d.mts +3 -0
  167. package/dist/record/family/observability-v1.d.ts +3 -0
  168. package/dist/record/family/observability-v1.js +6 -0
  169. package/dist/record/family/observability-v1.js.map +1 -0
  170. package/dist/record/family/observability.cjs +58 -9
  171. package/dist/record/family/observability.cjs.map +1 -1
  172. package/dist/record/family/observability.d.cts +1014 -15
  173. package/dist/record/family/observability.d.mts +1014 -15
  174. package/dist/record/family/observability.d.ts +1014 -15
  175. package/dist/record/family/observability.js +22 -18
  176. package/dist/record/host/runtime.cjs +600 -31
  177. package/dist/record/host/runtime.cjs.map +1 -1
  178. package/dist/record/host/types.cjs.map +1 -1
  179. package/dist/record/host/types.d.cts +33 -9
  180. package/dist/record/host/types.d.mts +33 -9
  181. package/dist/record/host/types.d.ts +33 -9
  182. package/dist/record/maintenance/runtime.cjs +1 -2
  183. package/dist/record/maintenance/runtime.cjs.map +1 -1
  184. package/dist/record/model/core.cjs.map +1 -1
  185. package/dist/record/model/core.d.cts +1 -1
  186. package/dist/record/model/core.d.mts +1 -1
  187. package/dist/record/model/core.d.ts +1 -1
  188. package/dist/record/model/definition.d.cts +6 -6
  189. package/dist/record/model/definition.d.mts +6 -6
  190. package/dist/record/model/definition.d.ts +6 -6
  191. package/dist/record/model/identifiers.cjs +1 -1
  192. package/dist/record/model/identifiers.cjs.map +1 -1
  193. package/dist/record/model/identifiers.d.cts +1 -1
  194. package/dist/record/model/identifiers.d.mts +1 -1
  195. package/dist/record/model/identifiers.d.ts +1 -1
  196. package/dist/record/platform/node.cjs +159 -23
  197. package/dist/record/platform/node.cjs.map +1 -1
  198. package/dist/record/platform/services.cjs.map +1 -1
  199. package/dist/record/platform/services.d.cts +15 -2
  200. package/dist/record/platform/services.d.mts +15 -2
  201. package/dist/record/platform/services.d.ts +15 -2
  202. package/dist/record/reader/errors.cjs +37 -1
  203. package/dist/record/reader/errors.cjs.map +1 -1
  204. package/dist/record/reader/errors.d.cts +49 -1
  205. package/dist/record/reader/errors.d.mts +49 -1
  206. package/dist/record/reader/errors.d.ts +49 -1
  207. package/dist/record/reader/errors.js +22 -12
  208. package/dist/record/reader/format.cjs +76 -17
  209. package/dist/record/reader/format.cjs.map +1 -1
  210. package/dist/record/reader/format.d.cts +11 -4
  211. package/dist/record/reader/format.d.mts +11 -4
  212. package/dist/record/reader/format.d.ts +11 -4
  213. package/dist/record/reader/format.js +2 -0
  214. package/dist/record/reader/index.js +32 -18
  215. package/dist/record/reader/runtime.cjs +64 -0
  216. package/dist/record/reader/runtime.cjs.map +1 -1
  217. package/dist/record/reader/runtime.d.cts +15 -0
  218. package/dist/record/reader/runtime.d.mts +15 -0
  219. package/dist/record/reader/runtime.d.ts +15 -0
  220. package/dist/record/reader/runtime.js +2 -0
  221. package/dist/report/assets/styles.css +53 -29
  222. package/dist/report/built-in/analysis-values.cjs +0 -8
  223. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  224. package/dist/report/built-in/analysis-values.d.cts +0 -13
  225. package/dist/report/built-in/analysis-values.d.mts +0 -13
  226. package/dist/report/built-in/analysis-values.d.ts +0 -13
  227. package/dist/report/built-in/analysis-values.js +4 -6
  228. package/dist/report/built-in/index.cjs +1 -3
  229. package/dist/report/built-in/index.cjs.map +1 -1
  230. package/dist/report/built-in/index.d.cts +1 -1
  231. package/dist/report/built-in/index.d.mts +1 -1
  232. package/dist/report/built-in/index.d.ts +1 -1
  233. package/dist/report/built-in/index.js +4 -8
  234. package/dist/report/built-in/index.mjs +4 -8
  235. package/dist/report/built-in/machine.cjs +0 -2
  236. package/dist/report/built-in/machine.cjs.map +1 -1
  237. package/dist/report/built-in/machine.d.cts +0 -2
  238. package/dist/report/built-in/machine.d.mts +0 -2
  239. package/dist/report/built-in/machine.d.ts +0 -2
  240. package/dist/report/built-in/result-components.cjs +25 -73
  241. package/dist/report/built-in/result-components.cjs.map +1 -1
  242. package/dist/report/built-in/result-components.d.cts +3 -19
  243. package/dist/report/built-in/result-components.d.mts +3 -19
  244. package/dist/report/built-in/result-components.d.ts +3 -19
  245. package/dist/report/built-in/result-components.js +0 -4
  246. package/dist/report/built-in/run-membership-overview.cjs +30 -17
  247. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  248. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  249. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  250. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  251. package/dist/report/built-in/run-membership-overview.js +4 -2
  252. package/dist/report/built-in/standard.cjs +80 -46
  253. package/dist/report/built-in/standard.cjs.map +1 -1
  254. package/dist/report/built-in/standard.d.cts +19 -42
  255. package/dist/report/built-in/standard.d.mts +19 -42
  256. package/dist/report/built-in/standard.d.ts +19 -42
  257. package/dist/report/built-in/standard.js +6 -6
  258. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  259. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  260. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  261. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  262. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  263. package/dist/report/components/attempt-detail/content.cjs +1 -1
  264. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  265. package/dist/report/components/entity-lists/compute.cjs +2 -2
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -2
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -2
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -2
  270. package/dist/report/components/entity-lists/index.cjs +6 -2
  271. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.d.cts +3 -6
  273. package/dist/report/components/entity-lists/index.d.mts +3 -6
  274. package/dist/report/components/entity-lists/index.d.ts +3 -6
  275. package/dist/report/components/summaries/compute.cjs +8 -1
  276. package/dist/report/components/summaries/compute.cjs.map +1 -1
  277. package/dist/report/components/summaries/compute.d.cts +9 -1
  278. package/dist/report/components/summaries/compute.d.mts +9 -1
  279. package/dist/report/components/summaries/compute.d.ts +9 -1
  280. package/dist/report/components/summaries/index.cjs +48 -4
  281. package/dist/report/components/summaries/index.cjs.map +1 -1
  282. package/dist/report/components/summaries/index.d.cts +7 -4
  283. package/dist/report/components/summaries/index.d.mts +7 -4
  284. package/dist/report/components/summaries/index.d.ts +7 -4
  285. package/dist/report/definition/primitives/chart.cjs +8 -5
  286. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  287. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  288. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  289. package/dist/report/definition/primitives.cjs +6 -0
  290. package/dist/report/definition/primitives.cjs.map +1 -1
  291. package/dist/report/definition/report.cjs +27 -3
  292. package/dist/report/definition/report.cjs.map +1 -1
  293. package/dist/report/definition/report.d.cts +8 -0
  294. package/dist/report/definition/report.d.mts +8 -0
  295. package/dist/report/definition/report.d.ts +8 -0
  296. package/dist/report/execution/machine.cjs +30 -14
  297. package/dist/report/execution/machine.cjs.map +1 -1
  298. package/dist/report/execution/machine.d.cts +20 -10
  299. package/dist/report/execution/machine.d.mts +20 -10
  300. package/dist/report/execution/machine.d.ts +20 -10
  301. package/dist/report/execution/machine.js +6 -6
  302. package/dist/report/host/execute.cjs +25 -16
  303. package/dist/report/host/execute.cjs.map +1 -1
  304. package/dist/report/host/execute.d.cts +4 -0
  305. package/dist/report/host/execute.d.mts +4 -0
  306. package/dist/report/host/execute.d.ts +4 -0
  307. package/dist/report/host/from-record.cjs +22 -5
  308. package/dist/report/host/from-record.cjs.map +1 -1
  309. package/dist/report/host/machine.cjs +53 -11
  310. package/dist/report/host/machine.cjs.map +1 -1
  311. package/dist/report/host/site-runtime.cjs +9 -8
  312. package/dist/report/host/site-runtime.cjs.map +1 -1
  313. package/dist/report/host/site-runtime.d.cts +1 -1
  314. package/dist/report/host/site-runtime.d.mts +1 -1
  315. package/dist/report/host/site-runtime.d.ts +1 -1
  316. package/dist/report/host/static.cjs +56 -9
  317. package/dist/report/host/static.cjs.map +1 -1
  318. package/dist/report/index.cjs.map +1 -1
  319. package/dist/report/index.d.cts +1 -1
  320. package/dist/report/index.d.mts +1 -1
  321. package/dist/report/index.d.ts +1 -1
  322. package/dist/report/model/dataset.cjs +7 -2
  323. package/dist/report/model/dataset.cjs.map +1 -1
  324. package/dist/report/model/locale.cjs +2 -0
  325. package/dist/report/model/locale.cjs.map +1 -1
  326. package/dist/report/model/locale.d.cts +1 -0
  327. package/dist/report/model/locale.d.mts +1 -0
  328. package/dist/report/model/locale.d.ts +1 -0
  329. package/dist/report/model/metrics.cjs +3 -1
  330. package/dist/report/model/metrics.cjs.map +1 -1
  331. package/dist/report/model/pricing.cjs +16 -11
  332. package/dist/report/model/pricing.cjs.map +1 -1
  333. package/dist/report/react/styles.css +53 -29
  334. package/dist/runner/adoption.cjs +1 -0
  335. package/dist/runner/adoption.cjs.map +1 -1
  336. package/dist/runner/attempt.cjs +44 -5
  337. package/dist/runner/attempt.cjs.map +1 -1
  338. package/dist/runner/attempt.d.cts +13 -1
  339. package/dist/runner/attempt.d.mts +13 -1
  340. package/dist/runner/attempt.d.ts +13 -1
  341. package/dist/runner/config-identity.cjs +10 -2
  342. package/dist/runner/config-identity.cjs.map +1 -1
  343. package/dist/runner/config-identity.d.cts +4 -2
  344. package/dist/runner/config-identity.d.mts +4 -2
  345. package/dist/runner/config-identity.d.ts +4 -2
  346. package/dist/runner/feedback/human.cjs +139 -64
  347. package/dist/runner/feedback/human.cjs.map +1 -1
  348. package/dist/runner/feedback/json.cjs +14 -6
  349. package/dist/runner/feedback/json.cjs.map +1 -1
  350. package/dist/runner/feedback/json.d.cts +3 -2
  351. package/dist/runner/feedback/json.d.mts +3 -2
  352. package/dist/runner/feedback/json.d.ts +3 -2
  353. package/dist/runner/feedback/reducer.cjs +2 -0
  354. package/dist/runner/feedback/reducer.cjs.map +1 -1
  355. package/dist/runner/judge-config.cjs +1 -1
  356. package/dist/runner/judge-config.cjs.map +1 -1
  357. package/dist/runner/ledger.cjs +124 -12
  358. package/dist/runner/ledger.cjs.map +1 -1
  359. package/dist/runner/project-current.cjs +13 -5
  360. package/dist/runner/project-current.cjs.map +1 -1
  361. package/dist/runner/run.cjs +521 -256
  362. package/dist/runner/run.cjs.map +1 -1
  363. package/dist/runner/sandbox-pool.cjs +161 -30
  364. package/dist/runner/sandbox-pool.cjs.map +1 -1
  365. package/dist/runner/sandbox-pool.d.cts +34 -2
  366. package/dist/runner/sandbox-pool.d.mts +34 -2
  367. package/dist/runner/sandbox-pool.d.ts +34 -2
  368. package/dist/runner/shared-state-lease.cjs +803 -0
  369. package/dist/runner/shared-state-lease.cjs.map +1 -0
  370. package/dist/runner/shared-state-lease.d.cts +121 -0
  371. package/dist/runner/shared-state-lease.d.mts +121 -0
  372. package/dist/runner/shared-state-lease.d.ts +121 -0
  373. package/dist/runner/shared-state-lease.js +24 -0
  374. package/dist/runner/shared-state-lease.js.map +1 -0
  375. package/dist/runner/teardown-registry.cjs +97 -34
  376. package/dist/runner/teardown-registry.cjs.map +1 -1
  377. package/dist/runner/teardown-registry.d.cts +27 -1
  378. package/dist/runner/teardown-registry.d.mts +27 -1
  379. package/dist/runner/teardown-registry.d.ts +27 -1
  380. package/dist/runner/teardown-registry.js +20 -16
  381. package/dist/runner/types.cjs.map +1 -1
  382. package/dist/runner/types.d.cts +31 -5
  383. package/dist/runner/types.d.mts +31 -5
  384. package/dist/runner/types.d.ts +31 -5
  385. package/dist/sample/analysis.cjs +249 -459
  386. package/dist/sample/analysis.cjs.map +1 -1
  387. package/dist/sample/capability.cjs +46 -8
  388. package/dist/sample/capability.cjs.map +1 -1
  389. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  390. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  391. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  392. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  393. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  394. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  395. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  396. package/dist/sandbox/keep-registry.cjs +28 -66
  397. package/dist/sandbox/keep-registry.cjs.map +1 -1
  398. package/dist/sandbox/types.cjs.map +1 -1
  399. package/dist/sandbox/types.d.cts +1 -1
  400. package/dist/sandbox/types.d.mts +1 -1
  401. package/dist/sandbox/types.d.ts +1 -1
  402. package/dist/shared/aggregate.cjs +16 -6
  403. package/dist/shared/aggregate.cjs.map +1 -1
  404. package/dist/shared/aggregate.d.cts +12 -4
  405. package/dist/shared/aggregate.d.mts +12 -4
  406. package/dist/shared/aggregate.d.ts +12 -4
  407. package/dist/shared/turn-label.cjs +20 -2
  408. package/dist/shared/turn-label.cjs.map +1 -1
  409. package/dist/shared/turn-label.d.cts +2 -0
  410. package/dist/shared/turn-label.d.mts +2 -0
  411. package/dist/shared/turn-label.d.ts +2 -0
  412. package/dist/shared/turn-label.js +4 -2
  413. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  414. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  415. package/dist/vendor/remark/remark-parse.cjs +12 -12
  416. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  417. package/dist/vendor/remark/remark.cjs +13 -13
  418. package/dist/vendor/remark/remark.cjs.map +1 -1
  419. package/dist/view/server.cjs +6 -0
  420. package/dist/view/server.cjs.map +1 -1
  421. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  422. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  423. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +1 -0
  424. package/docs-site/zh/examples/integrations/langgraph.mdx +1 -1
  425. package/docs-site/zh/explanation/assert.mdx +6 -6
  426. package/docs-site/zh/explanation/drive.mdx +1 -1
  427. package/docs-site/zh/explanation/evals.mdx +9 -9
  428. package/docs-site/zh/explanation/experiment.mdx +2 -2
  429. package/docs-site/zh/explanation/hitl.mdx +3 -3
  430. package/docs-site/zh/explanation/judge.mdx +5 -5
  431. package/docs-site/zh/explanation/overview.mdx +3 -3
  432. package/docs-site/zh/explanation/runner.mdx +1 -1
  433. package/docs-site/zh/index.mdx +3 -3
  434. package/docs-site/zh/reference/builtin-agents.mdx +9 -9
  435. package/docs-site/zh/reference/cli.mdx +18 -12
  436. package/docs-site/zh/reference/define-agent.mdx +130 -5
  437. package/docs-site/zh/reference/define-config.mdx +2 -2
  438. package/docs-site/zh/reference/define-eval.mdx +4 -4
  439. package/docs-site/zh/reference/events.mdx +1 -1
  440. package/docs-site/zh/reference/official-adapters.mdx +5 -5
  441. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  442. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  443. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  444. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  445. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  446. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  447. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  448. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  449. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  450. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  451. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  452. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  453. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  454. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  455. package/docs-site/zh/tutorials/docker-in-docker.mdx +50 -44
  456. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  457. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  458. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  459. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  460. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  461. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  462. package/docs-site/zh/tutorials/rerun-and-cache.mdx +3 -17
  463. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  464. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  465. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  466. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  467. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  468. package/docs-site/zh/tutorials/viewing-results.mdx +27 -8
  469. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  470. package/docs-site/zh/tutorials/write-send.mdx +2 -2
  471. package/package.json +9 -5
  472. package/dist/report/built-in/overview.cjs +0 -45
  473. package/dist/report/built-in/overview.cjs.map +0 -1
  474. package/dist/report/built-in/overview.d.cts +0 -6
  475. package/dist/report/built-in/overview.d.mts +0 -6
  476. package/dist/report/built-in/overview.d.ts +0 -6
  477. package/dist/report/built-in/overview.js +0 -9
  478. package/dist/report/built-in/overview.js.map +0 -1
  479. package/dist/runner/gate-lease.cjs +0 -283
  480. package/dist/runner/gate-lease.cjs.map +0 -1
  481. package/dist/runner/gate-lease.d.cts +0 -62
  482. package/dist/runner/gate-lease.d.mts +0 -62
  483. package/dist/runner/gate-lease.d.ts +0 -62
  484. package/dist/runner/gate-lease.js +0 -22
  485. package/dist/runner/gate-lease.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Coding Agent 从零接入项目"
3
3
  sidebarTitle: "Coding Agent 从零接入"
4
- description: "给 Coding Agent 的完整接入流程:探索项目、与用户确认路径、配置 Judge、写出 Adapter / Experiment / 评估用例并跑通第一个实验。"
4
+ description: "给 Coding Agent 的完整接入流程:探索项目、与用户确认路径、配置 Judge、写出 AdapterExperiment 与评估用例,并跑通第一个实验。"
5
5
  ---
6
6
 
7
7
  这一页是 Coding Agent 把 NiceEval 接入一个项目的执行步骤。前提:`niceeval` 依赖已经装进项目、`niceeval init` 已经运行,你是从随包 `INDEX.md` 进入本页的。用用户的语言与用户交流。所有 API、字段和 CLI 行为以随包文档为准,不要凭训练记忆现编。
@@ -14,10 +14,10 @@ description: "给 Coding Agent 的完整接入流程:探索项目、与用户
14
14
  2. **前端和 Agent 怎么通信**:HTTP 还是 gRPC / WebSocket?协议是标准的还是自己实现的——AI SDK UI Message Stream、OpenAI Responses / Chat Completions 这类标准协议,还是 SDK 原生事件流透传,还是用户自定义的 JSON/SSE 帧?这直接决定 Adapter 是用内置的(零映射)还是手写 `send`(要自己写事件映射)。
15
15
  3. **后端有没有接 OTel**:搜有没有 OTel SDK 初始化、AI SDK telemetry、LangSmith / OpenLLMetry / OpenInference 这类埋点。已经有的话 Tier 2 几乎零成本。
16
16
  4. **用户自己有没有做 A/B Test / feature flag**:应用里已有变体开关的话,Experiment 的 `flags` 可以直接透传给它(Tier 3 的现成入口)。
17
- 5. **Judge 用什么**:语义评估(`t.judge.autoevals.*`)要一个**与被测 Agent 分离的 Judge 模型**,走 OpenAI 兼容的 `/chat/completions` 协议。问用户手上有哪个服务的 key、想用什么 Judge 模型。缺 key 不会静默通过:Judge Assertion 会记为 `unavailable`;它参与 Pass grading,或在 Score Eval 中配置了 `.score()` / `.orStop()` 时,Attempt 的 grading 不可用。没有 Judge 配置时,先只写精确 Match。
17
+ 5. **Judge 用什么**:语义评估(`t.judge.autoevals.*`)要一个**与被测 Agent 分离的 Judge 模型**,走 OpenAI 兼容的 `/chat/completions` 协议。问用户手上有哪个服务的 key、想用什么 Judge 模型。缺 key 不会静默通过:Judge Assertion 会记为 `unavailable`;它参与 Pass grading,或在计分制评估中配置了 `.score()` / `.orStop()` 时,Attempt 的 grading 不可用。没有 Judge 配置时,先只写精确 Match。
18
18
  6. **是不是 Agent 本体要进 Sandbox**:被测对象是 coding agent CLI、或给 coding agent 写的 Skill/Plugin/Hook/MCP server(要在隔离 workspace 里改文件/跑命令)的话,必须走 Sandbox,不能像 HTTP 服务那样直接 `send`。
19
19
 
20
- 默认建议 `dockerSandbox({ source: { type: "image", image: "node:24-slim" } })`,但**要先跟用户确认**——本机/CI 有没有 Docker、要不要 Vercel Sandbox 或其它远程 Provider。用户没有异议就默认走 Docker。Provider 声明在 Eval 或 Experiment 上,没有 CLI flag、项目级默认值或自动探测——见[选择 Sandbox Provider](/zh/tutorials/sandbox-providers)。
20
+ 默认建议 `dockerSandbox({ source: { type: "image", image: "node:24-slim" } })`,但**要先跟用户确认**——本机/CI 有没有 Docker、要不要 Vercel Sandbox 或其它远程 Provider。用户没有异议就默认走 Docker。Provider 声明在评估用例或 Experiment 上,没有 CLI flag、项目级默认值或自动探测——见[选择 Sandbox Provider](/zh/tutorials/sandbox-providers)。
21
21
 
22
22
  探完之后,向用户**介绍接入等级**并给出推荐(详见[接入等级](/zh/explanation/tier)):
23
23
 
@@ -59,9 +59,9 @@ export default defineConfig({
59
59
  三个要提醒用户的点:
60
60
 
61
61
  - **配错不会假装通过。** 模型或 key 解析不到、网关拒绝鉴权、评估请求超时时,Judge Assertion 记为 `unavailable` 并带上原因;读取面不会把缺失 measurement 伪装成 mismatch 或零分。
62
- - **配完先验一次。** 写一条带 `judge: true` 的轻量 Pass Eval,调用 `turn.judge.autoevals.closedQA(...).gate(0.8)`。跑完 `niceeval show <评估用例 id>`,确认能看到 measurement、threshold、condition 与 Assertion 证据。
62
+ - **配完先验一次。** 写一条带 `judge: true` 的轻量通过制评估,调用 `turn.judge.autoevals.closedQA(...).gate(0.8)`。跑完后用 `niceeval show --run <run-id>` 查看结果,确认能看到 measurement、threshold、condition 与 Assertion 证据。
63
63
  - **没有用户在场(自治接入)时不要直接跳过 Judge**:先看环境里是否已有可用 key,例如 `OPENAI_API_KEY` 或 `DEEPSEEK_API_KEY`。有就用 `apiKeyEnv` 指向它并验证;没有时先写精确 Match,并在收尾说明 Judge 没有配置。
64
- - Judge 模型要**与被测 Agent 分离**,避免同一个模型给自己的输出打分。配置按 Eval、Experiment、项目配置逐字段解析;三种 recipe 见 [Judge](/zh/explanation/judge)。
64
+ - Judge 模型要**与被测 Agent 分离**,避免同一个模型给自己的输出打分。配置按评估用例、Experiment、项目配置逐字段解析;三种 recipe 见 [Judge](/zh/explanation/judge)。
65
65
 
66
66
  ## 第 3 步:写三件套
67
67
 
@@ -100,7 +100,7 @@ export default defineConfig({
100
100
  - [ ] 有 key 时 Judge 已配置,且在 `niceeval view` 里看到过 Judge 分数。没 key 时总结里说明了
101
101
  - [ ] Experiment 里声明的 `model` / `flags` 确实被 Adapter 消费(没有写了没人读的死配置,也没有编造被测系统不存在的 model 值)
102
102
 
103
- 跑通之后先总结,再谈下一步。总结要说清:接了什么被测对象、生成了哪几个文件(Adapter / Experiment / 评估用例各在哪)、`niceeval exp <实验路径>` 和 `niceeval view` 怎么跑、第一次运行的结果是什么样。不要在没被要求的情况下顺手重构用户已有代码,也不要在这几个文件之外新增抽象。
103
+ 跑通之后先总结,再谈下一步。总结要说清:接了什么被测对象、AdapterExperiment 与评估用例各在哪、`niceeval exp <实验路径>` 和 `niceeval view` 怎么跑、第一次运行的结果是什么样。不要在没被要求的情况下顺手重构用户已有代码,也不要在这几个文件之外新增抽象。
104
104
 
105
105
  ## 第 6 步:问用户要不要往深了接
106
106
 
@@ -10,6 +10,7 @@ import { Lifecycle } from '/snippets/widgets.jsx';
10
10
 
11
11
  ```ts
12
12
  import { defineEval, type JsonValue } from "niceeval";
13
+ import type { SandboxLayer } from "niceeval/sandbox";
13
14
 
14
15
  export default defineEval({
15
16
  description?: string;
@@ -17,34 +18,29 @@ export default defineEval({
17
18
  judge?: JudgeConfig;
18
19
  reporters?: Reporter[];
19
20
  timeoutMs?: number;
20
- environment?: string;
21
+ sandbox?: SandboxLayer;
21
22
  metadata?: Record<string, JsonValue>;
22
23
  async setup(sandbox, ctx) { /* task fixture + progress/diagnostic */ },
23
24
  async test(t) { /* interactions + assertions */ },
24
25
  });
25
26
  ```
26
27
 
27
- ## `tags` 与 `environment`
28
+ ## `tags` 与 `sandbox`
28
29
 
29
30
  ```ts
31
+ import { defineEval } from "niceeval";
32
+ import { dockerSandbox } from "niceeval/sandbox";
33
+
30
34
  // evals/coding/fix-button.eval.ts → id: coding/fix-button
31
35
  export default defineEval({
32
36
  description: "修复 Button 组件",
33
37
  tags: ["coding", "frontend"],
34
- environment: "node-22",
38
+ sandbox: dockerSandbox({ source: { type: "image", image: "node:22-slim" } }),
35
39
  async test(t) { /* coding task */ },
36
40
  });
37
-
38
- // evals/research/gpu-literature.eval.ts → id: research/gpu-literature
39
- export default defineEval({
40
- description: "在 GPU 环境检索论文",
41
- tags: ["research"],
42
- environment: "gpu",
43
- async test(t) { /* research task */ },
44
- });
45
41
  ```
46
42
 
47
- `tags` 可供 `--tag` 和 experiment 的 `evals` 谓词读取。`environment` 只声明环境 profile。具体 image / template experiment 使用的 Sandbox 配置映射。
43
+ `tags` 可供 `--tag` 和 Experiment 的 `evals` 谓词读取。任务本身拥有起始环境时,在评估用例上声明 `sandbox`;如果 template-bearing Sandbox layer Experiment 提供,这里就省略。每个实际评估用例 × Experiment 配对必须恰好有一方提供 template-bearing layer。
48
44
 
49
45
  ## 单轮评估
50
46
 
@@ -117,7 +113,7 @@ export default rows.map((row) =>
117
113
 
118
114
  ## Sandbox workspace
119
115
 
120
- Coding-agent 评估用例仍然是普通 `.eval.ts` 文件,只是 test 里会准备 Sandbox workspace、发送任务并检查文件结果:
116
+ Coding Agent 评估用例仍然是普通 `.eval.ts` 文件,只是 test 里会准备 Sandbox workspace、发送任务并检查文件结果:
121
117
 
122
118
  ```ts
123
119
  import { defineEval } from "niceeval";
@@ -8,7 +8,7 @@ CI 运行 Experiment 时,进程退出状态决定门禁是否通过。`--json`
8
8
 
9
9
  ## 基本命令
10
10
 
11
- 只要存在 mismatched 的 Boolean condition、低于阈值的 measurement 或执行错误,[NiceEval](https://niceeval.com/) 就以非零状态码退出。需要阻止合并的要求直接写在评估用例源码中,CI 与本地运行读取同一套判定。
11
+ 只要存在 mismatched 的 Boolean condition、低于明确 `.gate(n)` 阈值的 measurement 或执行错误,[NiceEval](https://niceeval.com/) 就以非零状态码退出。`.atLeast(n)` 只记录局部 condition,本身不改变判定或退出状态。需要阻止合并的要求直接写在评估用例源码中,CI 与本地运行读取同一套判定。
12
12
 
13
13
  ```sh
14
14
  npx niceeval exp ci --json --junit ./artifacts/niceeval-junit.xml
@@ -36,11 +36,11 @@ JUnit 和外部平台文件不拥有 Record。Verdict、Usage、断言和诊断
36
36
  exit "${PIPESTATUS[0]}"
37
37
 
38
38
  - name: 上传 JUnit
39
- if: always()
40
- uses: actions/upload-artifact@v4
41
- with:
42
- name: niceeval-junit
43
- path: ./artifacts/niceeval-junit.xml
39
+ if: always()
40
+ uses: actions/upload-artifact@v4
41
+ with:
42
+ name: niceeval-junit
43
+ path: ./artifacts/niceeval-junit.xml
44
44
  ```
45
45
 
46
46
  将模型凭据作为 CI secret 注入命令运行所需的变量。不要把凭据写入 Experiment、receipt、JUnit 或日志。
@@ -0,0 +1,61 @@
1
+ ---
2
+ title: "比较多个固定 Run"
3
+ sidebarTitle: "比较多个 Run"
4
+ description: "用明确 Run ID 固定比较分母,核对结果覆盖,再比较通过率、得分、成本与时长,而不让新结果改变已打开的比较。"
5
+ ---
6
+
7
+ 比较模型、提示词或 Agent 版本时,先固定要看的 Run。不要用“最新结果”代替实验边界;新 Run 发布后不应悄悄改变已经开始的比较。
8
+
9
+ ## 取得每次运行的 Run ID
10
+
11
+ TTY 完成反馈会显示 Run ID。机器流程从 `exp --json` 最后一条 receipt 读取 `runIds`:
12
+
13
+ ```sh
14
+ pnpm exec niceeval exp baseline --json > baseline.ndjson
15
+ pnpm exec niceeval exp candidate --json > candidate.ndjson
16
+ ```
17
+
18
+ 保留这两个固定 ID。它们定义比较使用的计划与 expected-slot 分母。
19
+
20
+ ## 先分别核对结果覆盖
21
+
22
+ ```sh
23
+ pnpm exec niceeval show --run <baseline-run-id>
24
+ pnpm exec niceeval show --run <candidate-run-id>
25
+ ```
26
+
27
+ 先看每个 Run 有多少位置是已执行、自动沿用、人工采用、未派发或中断。结果覆盖不足时,不要把缺失位置当成失败、零分或成功。
28
+
29
+ 如果一个 Run 因预算、首过即停或部分采用留下 `not-dispatched`,应先决定补跑、接受不完整分母,还是只比较两边共同且明确的范围。
30
+
31
+ ## 在同一个固定选择中比较
32
+
33
+ ```sh
34
+ pnpm exec niceeval show \
35
+ --run <baseline-run-id> \
36
+ --run <candidate-run-id>
37
+ ```
38
+
39
+ 浏览器需要完整页面时使用同一组参数:
40
+
41
+ ```sh
42
+ pnpm exec niceeval view \
43
+ --run <baseline-run-id> \
44
+ --run <candidate-run-id>
45
+ ```
46
+
47
+ 通过制评估比较通过率,计分制评估比较 earned score。混合 Experiment 分别保留两种主读数,不把它们合成一个百分比。
48
+
49
+ 成本和时长只在有完整 Observability 时比较。缺失、部分采集或不支持的数据必须保持可见,不能填成零。
50
+
51
+ ## 下钻差异来源
52
+
53
+ 从 Run 页面复制 Attempt locator:
54
+
55
+ ```sh
56
+ pnpm exec niceeval show @1K1P0VJAPVJ12
57
+ ```
58
+
59
+ 详情页用于核对 Assertion、Judge 理由、工具调用、用量、时间和 File Changes。Run 页面解释本次位置为何使用该 Attempt;Attempt 页面解释这次执行实际发生了什么。
60
+
61
+ 需要自定义分组、成本 Profile 或专用页面时,继续阅读[编写自定义报告](/zh/tutorials/custom-reports)。
@@ -65,7 +65,7 @@ import { Picker, Schedule } from '/snippets/widgets.jsx';
65
65
  | --- | --- | --- | --- |
66
66
  | 全局并发位 | `--max-concurrency`,或 `niceeval.config.ts` 的 `maxConcurrency` | 本次运行的总吞吐 | 各算各的,两个终端的值相加 |
67
67
  | 实验并发上限 | 实验文件的 `maxConcurrency` | 这一个实验同时跑几条 | 各算各的,两个终端的值相加 |
68
- | 共享状态租约 | 实验文件的 `sharedState.key` | 同一 checkpoint 的完整恢复、执行与回存 | 同 key 的窗口串行 |
68
+ | 共享状态租约 | 实验文件的 `sharedState.key` | 同一 checkpoint 的完整恢复、执行与回存区间 | 同 key 的区间串行 |
69
69
 
70
70
  全局值的解析顺序是 `--max-concurrency` → 配置里的 `maxConcurrency` → 当前 Sandbox Provider 的推荐默认值(`docker` 10、`e2b` 20、`vercel` 1、`local` 1)。推荐值反映的是 Provider 侧的约束。你自己 Agent 接口的限速用 `--max-concurrency` 压。
71
71
 
@@ -147,10 +147,11 @@ export default defineExperiment({
147
147
  });
148
148
  ```
149
149
 
150
- `maxConcurrency: 1` 只串行本 Invocation 的 Attempt。`sharedState.key` 才跨终端保护同一 checkpoint
151
- 租约在 Experiment 和 Sandbox 的 `setup` 之前取得,到 Sandbox `teardown`、Provider finalizer 与 Experiment `teardown` 完成后才释放。等待方不创建 Sandbox。租约释放后,等待方继续自己的既定计划;它不读取或沿用另一 Record 的结果。
150
+ `maxConcurrency: 1` 只串行本 Invocation 的 Attempt。`sharedState.key` 会在同一项目 Coordination 域内保护跨 Invocation 的同一 checkpoint。租约在 Experiment 与 Sandbox `setup` 前取得,直到 Sandbox `teardown`、Provider finalizer 和 Experiment `teardown` 全部完成才释放。等待方不会提前创建 Sandbox;拿到租约后继续自己的计划,不读取或沿用另一个 Run 的结果。
152
151
 
153
- `sharedState` 只做互斥,不替你存 checkpoint,也不能回滚强杀前的半次写入。做不到原子回存时,换新 key 和干净 cohort 从头重建。
152
+ `sharedState` 只提供互斥,不负责 checkpoint 存储、原子提交、回滚或强杀后的半次写入恢复。能原子回存时应原子回存,否则换新 key,从干净 cohort 重建。跨机器协调仍归外部编排。
153
+
154
+ NiceEval 不会根据超时、PID 或 heartbeat 自动接管租约。原 owner 暂停时仍然拥有租约;强杀或 cleanup 失败后,等待方继续阻塞,避免两条 Invocation 同时改同一份状态。确认原 owner 已终止、外部状态已静止后,按[运行被强杀后恢复](/zh/troubleshooting/recover-after-kill#恢复共享状态租约)里的公开命令检查 owner token,并显式恢复。
154
155
 
155
156
  只有一个 Agent 服务频繁限流时,同样在这个实验上设 `maxConcurrency: N`,不要去降全局上限——降全局会连累同批其它实验。实验级并发上限退避时不放行第 N+1 条,所以服务不会在已经限流时继续被加压。
156
157
 
@@ -170,7 +171,7 @@ const fixtures = new WeakMap<Sandbox, { repoUrl: string; destroy(): Promise<void
170
171
  Attempt,并复用至多一台 Sandbox;不同组和未分组评估用例继续竞争剩余并发位。你不需要把
171
172
  整个 Experiment 设成 `maxConcurrency: 1`。
172
173
 
173
- `evals` 数组只声明成员,不声明业务顺序。Runner 按规范化 Eval ID 稳定串行;
174
+ `evals` 数组只声明成员,不声明业务顺序。Runner 按规范化评估用例 ID 稳定串行;
174
175
  `attempts > 1` 时,同一成员需要真实派发的各次 Attempt 连续进入组内泳道。完整目录、
175
176
  Experiment 写法和 `--dry` 输出见[用评估组复用 Sandbox](/zh/tutorials/eval-groups)。
176
177
 
@@ -195,23 +196,23 @@ export default defineExperiment({
195
196
  });
196
197
  ```
197
198
 
198
- ## 多开终端时隔离 Record
199
+ ## 多开终端时共用 Record
199
200
 
200
- 同一 Record root 不支持两条 Invocation 自动分工。确认本机、Provider 和 Agent 服务还有余量时,为第二个终端指定不同 root:
201
+ 同一 Record root 允许多个 append writer 并发,但不会让两条 Invocation 自动分工。确认本机、Provider 和 Agent 服务还有余量时,两个终端可以使用同一个 root:
201
202
 
202
203
  ```bash
203
- niceeval exp compare --record .niceeval/record-a --max-concurrency 2
204
- niceeval exp compare --record .niceeval/record-b --max-concurrency 2
204
+ niceeval exp compare --record .niceeval/record --max-concurrency 2
205
+ niceeval exp compare --record .niceeval/record --max-concurrency 2
205
206
  ```
206
207
 
207
- 两边各自规划完整选择,可能重复执行相同评估用例,也不会读取或携入对方运行中的 Attempt。每个 root 独立产生 Run、Sample Report;NiceEval 不自动合并它们。
208
+ 两边各自规划完整选择,可能重复执行相同评估用例,因为双方都不会读取对方尚未发布的 Attempt。完整 Run 会原子发布到共享 Record。只有确实需要隔离 Run、Sample Report 时才使用不同 root;NiceEval 不自动合并分开的 root。
208
209
 
209
210
  三个边界:
210
211
 
211
212
  - 两边的 CLI 上限会相加,Provider 容量不会。配额紧张时把两边都调低。
212
213
  - 实验自己的 `maxConcurrency` 也是每个终端各算各的:两条命令都声明 3 时,合计最多跑六条。
213
- - 两个终端的 Sandbox 池也各自独立。只有确实共享外部 checkpoint 时才声明 `sharedState.key`;这不会合并 Record。
214
- - 指向同一 root 的第二条命令立即失败,不等待、不接管,也不读取第一条命令的中间数据。
214
+ - 两个终端的 Sandbox 池也各自独立。只有确实共享外部 checkpoint 时才声明 `sharedState.key`;它不会合并 Record。
215
+ - 并发 append writer 可以共用 root。Record maintenance 仍然独占;遇到 `record-maintenance-busy` 时,先停掉 reader 和 writer 再重试。
215
216
 
216
217
  ## 边界
217
218
 
@@ -15,7 +15,7 @@ import { ConfigLayers } from '/snippets/diagram-config-layers.jsx';
15
15
 
16
16
  ## 配置:想让这个值活多久,就写在哪一层
17
17
 
18
- 同一个值出现在多层时,按 **CLI flag → experiment → eval → config → 内置默认** 取,前面有值就不看后面。config 是默认来源,不是覆盖层——评估用例自己声明的 `timeoutMs` 不会被项目默认压掉。
18
+ 同一个值出现在多层时,按 **CLI flag → experiment → 评估用例 → config → 内置默认** 取,前面有值就不看后面。config 是默认来源,不是覆盖层——评估用例自己声明的 `timeoutMs` 不会被项目默认压掉。
19
19
 
20
20
  <ConfigLayers />
21
21
 
@@ -79,10 +79,8 @@ export default defineConfig({
79
79
  | --- | --- | --- |
80
80
  | `ANTHROPIC_API_KEY` | `claudeCodeAgent()` | 工厂参数 `apiKey` 可覆盖 |
81
81
  | `ANTHROPIC_BASE_URL` | `claudeCodeAgent()` | 网关地址,工厂参数 `baseUrl` 可覆盖 |
82
- | `CODEX_API_KEY` | `codexAgent()` | 不是 `OPENAI_API_KEY`。工厂参数 `apiKey` 可覆盖 |
83
- | `CODEX_BASE_URL` | `codexAgent()` | OpenAI 兼容代理地址,工厂参数 `baseUrl` 可覆盖 |
84
- | `BUB_API_KEY` | `bubAgent()` | 工厂参数 `apiKey` 可覆盖 |
85
- | `BUB_API_BASE` | `bubAgent()` | 工厂参数 `apiBase` 可覆盖 |
82
+ | `OPENAI_API_KEY` | `codexAgent()`、`bubAgent()` | 工厂参数 `apiKey` 可覆盖 |
83
+ | `OPENAI_BASE_URL` | `codexAgent()`、`bubAgent()` | OpenAI 兼容代理地址,工厂参数 `baseUrl` / `apiBase` 可覆盖 |
86
84
  | `OPENCLAW_API_KEY` / `OPENCLAW_BASE_URL` | `openClawAgent()` | key 省略时回落 `ANTHROPIC_API_KEY` |
87
85
  | `OPENCODE_API_KEY` / `OPENCODE_BASE_URL` | `openCodeAgent()` | key 省略时回落 `ANTHROPIC_API_KEY` |
88
86
  | `HERMES_API_KEY` / `HERMES_API_BASE` | `hermesAgent()` | key 省略时依次回落 `OPENROUTER_API_KEY`、`ANTHROPIC_API_KEY` |
@@ -148,7 +146,7 @@ NICEEVAL_JUDGE_KEY=sk-...
148
146
  | Judge 模型与端点 | config 或评估用例的 `judge.model` / `judge.baseUrl` |
149
147
  | OTel 接收地址 | config 的 `telemetry: { host, port }` |
150
148
 
151
- Judge key 只从 `NICEEVAL_JUDGE_KEY`(或 `judge.apiKeyEnv` 指定的变量)读,端点只从 `judge.baseUrl` 读。被测应用把标准的 `OPENAI_*` 挪作它用时,Judge 不会跟着串味。
149
+ Judge 默认从 `NICEEVAL_JUDGE_KEY` 读取 key,也可以改读 `judge.apiKeyEnv` 指定的变量;端点只从 `judge.baseUrl` 读。它不会借用被测应用的 `OPENAI_API_KEY`。
152
150
 
153
151
  ## 接着看
154
152
 
@@ -18,7 +18,7 @@ description: "写一个 Adapter、配置一个 Experiment,并运行第一条
18
18
  评估 Claude Code / Codex / bub 这种独立的 Agent:用内置 Sandbox Agent。
19
19
  </Card>
20
20
  <Card title="其它 AI Agent" icon="plug">
21
- 自己的 Agent 需要 [编写 Send](/zh/tutorials/write-send)。如应用已有 OTel 埋点,可 [接入OTel ](/zh/tutorials/connect-otel)
21
+ 自己的 Agent 需要 [编写 Send](/zh/tutorials/write-send)。如应用已有 OTel 埋点,可[接入 OTel](/zh/tutorials/connect-otel)
22
22
  </Card>
23
23
  </CardGroup>
24
24
 
@@ -0,0 +1,58 @@
1
+ ---
2
+ title: "控制一次运行的成本"
3
+ sidebarTitle: "控制运行成本"
4
+ description: "用 attempts、首过即停、budget、并发和结果沿用分别控制统计样本、停止派发、花费保护与资源占用。"
5
+ ---
6
+
7
+ 控制成本前先判断你要减少什么。不同开关回答不同问题,不能互相替代。
8
+
9
+ | 目标 | 使用方式 |
10
+ | --- | --- |
11
+ | 测完整稳定性分布 | 设置 `attempts: N`,默认跑满。 |
12
+ | 只确认至少能成功一次 | 使用 `--early-exit`。 |
13
+ | 给每个 Experiment 的花费加保护 | 使用 `--budget <美元>`。 |
14
+ | 限制同时占用的资源 | 使用 `--max-concurrency <数量>`。 |
15
+ | 跳过没有受影响的结果 | 使用默认沿用或 `--rerun`。 |
16
+ | 分摊 Sandbox 创建和准备成本 | 使用 `sandboxReuse`。 |
17
+
18
+ ## 先预览运行矩阵
19
+
20
+ ```sh
21
+ pnpm exec niceeval exp regression --dry
22
+ ```
23
+
24
+ 先确认评估用例数量、Experiment 数量和 Attempt 数量。`--dry` 不预测最终模型费用,但能在派发前发现范围选错或重复次数过大。
25
+
26
+ ## 只关心能否成功时首过即停
27
+
28
+ ```sh
29
+ pnpm exec niceeval exp regression --early-exit
30
+ ```
31
+
32
+ 某条评估用例的一个 Attempt 得到 `passed` 后,尚未派发的剩余 Attempt 会写成 `not-dispatched`。同一评估用例已经在运行的 Attempt 会通过 `ctx.signal` 收到取消信号;Adapter 是否及时观察它,决定这个 Attempt 能否尽快结束。
33
+
34
+ 一次通过触发首过即停后才返回的同一评估用例 Attempt 不会进入结果。
35
+
36
+ `failed`、`errored` 或 `skipped` 不触发首过即停。需要完整通过率分布时不要打开这个选项。
37
+
38
+ ## 给花费设置保护上限
39
+
40
+ ```sh
41
+ pnpm exec niceeval exp regression --budget 25
42
+ ```
43
+
44
+ 预算按每个 Experiment ID 分别计算。每条已完成的 Attempt,NiceEval 从 Experiment 的 `model`、上报的 token 用量和 Config/runtime price table 推得 `estimatedCostUSD`,再把这个估算累加进预算。`usage.costUSD` 是 Provider 或 Adapter 上报的 observed 值,绝不驱动预算。累计 estimate 到达上限后,NiceEval 停止派发新 Attempt;已经在运行的任务不会被中途终止。
45
+
46
+ 因此 `--budget` 是保护上限,不是精确账单。并发任务尚未结算时,最终花费可能短暂超过设置值。缺少 model、token 用量或匹配的价格时,NiceEval 无法产生 `estimatedCostUSD`,`usage.costUSD` 也不能补上。Runner 会给出警告,而不是假装预算仍可执行。
47
+
48
+ 预算耗尽会留下 `budget_exhausted` diagnostic,未派发位置写成 `not-dispatched`,命令以非零状态退出。提高预算后重跑同一范围,合格的已完成 Attempt 会沿用,只补剩余位置。
49
+
50
+ ## 并发只控制资源占用
51
+
52
+ ```sh
53
+ pnpm exec niceeval exp regression --max-concurrency 4
54
+ ```
55
+
56
+ 并发上限限制同时运行的评估用例,不是费用上限。费用保护仍使用 `--budget`。Sandbox 构建并发由独立的 `--max-build-concurrency` 控制。
57
+
58
+ 需要进一步分摊环境准备成本时,阅读[复用 Sandbox](/zh/tutorials/sandbox-reuse)。需要选择只重跑失败项或全部重验时,阅读[重跑与沿用结果](/zh/tutorials/rerun-and-cache)。
@@ -4,7 +4,7 @@ sidebarTitle: "隐藏测试判分"
4
4
  description: "用 loadText 在模块顶层读入隐藏测试、跑测脚本等判据文件,文件内容进入 fingerprint:改一字节自动重跑,不靠人工 --rerun。"
5
5
  ---
6
6
 
7
- 沙箱 coding 题常用一份隐藏测试判分:Agent 改完代码后,评估用例把测试文件写进 Sandbox 执行,
7
+ Sandbox Coding 任务常用一份隐藏测试判分:Agent 改完代码后,评估用例把测试文件写进 Sandbox 执行,
8
8
  测试通过就算过。这份测试文件就是判分标准本体——改了它,等于换了一道题,旧结果不能再采信。
9
9
 
10
10
  用 `loadText` 读它,NiceEval 会把文件内容算进这条评估用例的 fingerprint:
@@ -63,6 +63,6 @@ description: "用 loadText 在模块顶层读入隐藏测试、跑测脚本等
63
63
  - **`loadText` 必须写在模块顶层。** 缓存判断发生在运行之前,写进 `test(t)` 里运行期才读就来不及了,
64
64
  NiceEval 会直接报错并提示挪到顶层。
65
65
  - **读 Agent 的产物用 `t.sandbox`,不用 `loadText`。** Sandbox 里 Agent 跑出来的文件是本次运行的证据,
66
- 每次都不同,不属于 fingerprint。用 `t.sandbox.file(...)` 一类断言去读。
66
+ 每次都不同,不属于 fingerprint。用 `await t.sandbox.readText(path)` 读取,再把返回的字符串交给 `t.check`。
67
67
  - 判据是结构化数据(case 对照表)时用 `loadYaml` / `loadJson`,
68
68
  见[数据驱动测试](/zh/tutorials/dataset-fanout)。
@@ -134,8 +134,8 @@ const pricing = definePricingProfile({
134
134
  ```
135
135
 
136
136
  在组件中只调用 `costUSD(pricing)` 或 `totalCostUSD(pricing)`;二者没有零参数形式。Analysis 计算 slot-provider ledger、exact total 和
137
- `numerator / denominator` mean,Report Host 只验证 Profile、捕获闭包和呈现结果。Runner `estimatedCostUSD` 即使 observed 成本存在也独立计算,
138
- 只供 `maxCost` 使用,Report 不读取它。
137
+ `numerator / denominator` mean,Report Host 只验证 Profile、捕获闭包和呈现结果。Runner `estimatedCostUSD` 即使 observed 成本存在也独立计算;
138
+ Experiment budget 与 `maxCost` 使用它,Report 不读取它。
139
139
 
140
140
  `aggregate(ctx.scope, { values: { cost: costUSD(pricing) } })` 的 `cost` cell 是可观察的 `CostMetricValue`,其 `cell.projection` 是
141
141
  `CostProjectionValue`。这两个类型以及 projection 的 state、basis、ledger 和 reason data types 都从 `niceeval/report` 以 type-only
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: "运行前检查生命周期计划"
3
+ sidebarTitle: "检查生命周期计划"
4
+ description: "用 niceeval debug 查看一个 Experiment 与评估用例配对的 Plugin、Sandbox、Agent、Fixture 和 teardown 顺序,而不创建任何运行资源。"
5
+ ---
6
+
7
+ `exp --dry` 适合确认运行矩阵。需要检查一条评估在 Sandbox 里会按什么顺序准备、安装、执行和收尾时,使用 `niceeval debug`。
8
+
9
+ ## 选择一个精确配对
10
+
11
+ ```sh
12
+ pnpm exec niceeval debug compare/codex memory/commit0
13
+ ```
14
+
15
+ Experiment 和评估用例 selector 都必须唯一。精确 ID 优先;前缀命中多个候选时,CLI 会列出候选并停止。
16
+
17
+ 评估用例只能从该 Experiment 已选择的范围中匹配。选择一个评估组成员不会把其它成员加入计划,但输出仍会显示评估组生命周期包裹。
18
+
19
+ ## 按顺序阅读计划
20
+
21
+ 计划会依次显示:
22
+
23
+ 1. Plugin lifecycle;
24
+ 2. 作者声明的 prepare;
25
+ 3. Agent ensure、setup 与 teardown;
26
+ 4. Sandbox materialize 与 Provider finalizer;
27
+ 5. 评估组和物理 Sandbox lifecycle;
28
+ 6. Fixture、test 与 cleanup。
29
+
30
+ 静态 `shell()` 和 `command()` 会展开实际命令。普通 callback 标为 `Opaque`,因为它只能在运行时执行。路径、凭据、环境变量值和不安全的远端 locator 不会泄露到 Human 输出。
31
+
32
+ ## 给工具读取结构化计划
33
+
34
+ ```sh
35
+ pnpm exec niceeval debug compare/codex memory/commit0 --json > debug-plan.json
36
+ ```
37
+
38
+ JSON 保留结构化步骤和精确度标记,不包含终端框线。`debug` 只接受 `--json`;预算、重跑、并发等运行 flag 不适用于这个命令。
39
+
40
+ ## 确认它不会执行资源操作
41
+
42
+ `debug` 不运行 setup、test、teardown、ensure、materialize 或 finalizer,也不创建 Invocation、Run、Record、锁、Sandbox 或构建任务。
43
+
44
+ 它会加载受信任定义并执行 Experiment 的选择 predicate。Provider planner 也可能读取本地文件、调用只读 CLI 或查询远端控制面,因此仍应只在可信项目中运行。
45
+
46
+ 矩阵和 Attempt 数量先用[选择并预览运行范围](/zh/tutorials/select-and-preview)确认。真实执行失败后需要进入保留现场时,使用[保留 Sandbox 现场排查问题](/zh/troubleshooting/debug-sandbox)。