niceeval 0.17.1 → 0.19.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 (692) hide show
  1. package/INDEX.md +5 -2
  2. package/dist/adapter-usage.cjs.map +1 -1
  3. package/dist/adapter-usage.d.cts +1 -1
  4. package/dist/adapter-usage.d.mts +1 -1
  5. package/dist/adapter-usage.d.ts +1 -1
  6. package/dist/adapter.cjs +8 -3
  7. package/dist/adapter.cjs.map +1 -1
  8. package/dist/adapter.d.cts +26 -15
  9. package/dist/adapter.d.mts +26 -15
  10. package/dist/adapter.d.ts +26 -15
  11. package/dist/agents/{effect-runtime.cjs → agent-effects.cjs} +12 -18
  12. package/dist/agents/agent-effects.cjs.map +1 -0
  13. package/dist/agents/agent-effects.d.cts +23 -0
  14. package/dist/agents/agent-effects.d.mts +23 -0
  15. package/dist/agents/agent-effects.d.ts +23 -0
  16. package/dist/agents/agent-effects.js +16 -0
  17. package/dist/agents/agent-effects.js.map +1 -0
  18. package/dist/agents/ai-sdk.cjs +1 -1
  19. package/dist/agents/ai-sdk.cjs.map +1 -1
  20. package/dist/agents/bub.cjs +31 -18
  21. package/dist/agents/bub.cjs.map +1 -1
  22. package/dist/agents/bub.d.cts +9 -12
  23. package/dist/agents/bub.d.mts +9 -12
  24. package/dist/agents/bub.d.ts +9 -12
  25. package/dist/agents/claude-code-native.cjs +2 -2
  26. package/dist/agents/claude-code-native.cjs.map +1 -1
  27. package/dist/agents/claude-code.cjs +17 -11
  28. package/dist/agents/claude-code.cjs.map +1 -1
  29. package/dist/agents/claude-code.d.cts +11 -11
  30. package/dist/agents/claude-code.d.mts +11 -11
  31. package/dist/agents/claude-code.d.ts +11 -11
  32. package/dist/agents/codex-app-server.cjs +2 -2
  33. package/dist/agents/codex-app-server.cjs.map +1 -1
  34. package/dist/agents/codex.cjs +18 -12
  35. package/dist/agents/codex.cjs.map +1 -1
  36. package/dist/agents/codex.d.cts +12 -12
  37. package/dist/agents/codex.d.mts +12 -12
  38. package/dist/agents/codex.d.ts +12 -12
  39. package/dist/agents/deepseek-harness.cjs +2 -2
  40. package/dist/agents/deepseek-harness.cjs.map +1 -1
  41. package/dist/agents/hermes.cjs +3 -3
  42. package/dist/agents/hermes.cjs.map +1 -1
  43. package/dist/agents/index.cjs +3 -3
  44. package/dist/agents/index.cjs.map +1 -1
  45. package/dist/agents/index.d.cts +3 -3
  46. package/dist/agents/index.d.mts +3 -3
  47. package/dist/agents/index.d.ts +3 -3
  48. package/dist/agents/index.js +2 -2
  49. package/dist/agents/index.mjs +2 -2
  50. package/dist/agents/mcp.cjs.map +1 -1
  51. package/dist/agents/mcp.d.cts +2 -2
  52. package/dist/agents/mcp.d.mts +2 -2
  53. package/dist/agents/mcp.d.ts +2 -2
  54. package/dist/agents/omp.cjs +2 -2
  55. package/dist/agents/omp.cjs.map +1 -1
  56. package/dist/agents/openai-compat.cjs +2 -2
  57. package/dist/agents/openai-compat.cjs.map +1 -1
  58. package/dist/agents/openclaw.cjs +3 -3
  59. package/dist/agents/openclaw.cjs.map +1 -1
  60. package/dist/agents/opencode.cjs +16 -4
  61. package/dist/agents/opencode.cjs.map +1 -1
  62. package/dist/agents/plugin-extensions.cjs +71 -0
  63. package/dist/agents/plugin-extensions.cjs.map +1 -0
  64. package/dist/agents/plugin-extensions.d.cts +26 -0
  65. package/dist/agents/plugin-extensions.d.mts +26 -0
  66. package/dist/agents/plugin-extensions.d.ts +26 -0
  67. package/dist/agents/plugin-extensions.js +8 -0
  68. package/dist/agents/plugin-extensions.js.map +1 -0
  69. package/dist/agents/post-setup.cjs +14 -3
  70. package/dist/agents/post-setup.cjs.map +1 -1
  71. package/dist/agents/post-setup.d.cts +4 -2
  72. package/dist/agents/post-setup.d.mts +4 -2
  73. package/dist/agents/post-setup.d.ts +4 -2
  74. package/dist/agents/post-setup.js +8 -6
  75. package/dist/agents/sdk-streams.cjs +3 -3
  76. package/dist/agents/sdk-streams.cjs.map +1 -1
  77. package/dist/agents/{session-slot.cjs → session-key.cjs} +4 -4
  78. package/dist/agents/session-key.cjs.map +1 -0
  79. package/dist/agents/session-key.d.cts +12 -0
  80. package/dist/agents/session-key.d.mts +12 -0
  81. package/dist/agents/session-key.d.ts +12 -0
  82. package/dist/agents/session-key.js +6 -0
  83. package/dist/agents/session-key.js.map +1 -0
  84. package/dist/agents/shared.cjs +2 -2
  85. package/dist/agents/shared.cjs.map +1 -1
  86. package/dist/agents/shared.d.cts +4 -4
  87. package/dist/agents/shared.d.mts +4 -4
  88. package/dist/agents/shared.d.ts +4 -4
  89. package/dist/agents/skills.cjs.map +1 -1
  90. package/dist/agents/skills.d.cts +3 -3
  91. package/dist/agents/skills.d.mts +3 -3
  92. package/dist/agents/skills.d.ts +3 -3
  93. package/dist/agents/types.cjs.map +1 -1
  94. package/dist/agents/types.d.cts +55 -54
  95. package/dist/agents/types.d.mts +55 -54
  96. package/dist/agents/types.d.ts +55 -54
  97. package/dist/agents/ui-message-stream.cjs +4 -4
  98. package/dist/agents/ui-message-stream.cjs.map +1 -1
  99. package/dist/agents/unrecognized-events.cjs +32 -0
  100. package/dist/agents/unrecognized-events.cjs.map +1 -0
  101. package/dist/agents/unrecognized-events.d.cts +8 -0
  102. package/dist/agents/unrecognized-events.d.mts +8 -0
  103. package/dist/agents/unrecognized-events.d.ts +8 -0
  104. package/dist/agents/unrecognized-events.js +6 -0
  105. package/dist/agents/unrecognized-events.js.map +1 -0
  106. package/dist/assertions/api.cjs.map +1 -1
  107. package/dist/assertions/api.d.cts +3 -0
  108. package/dist/assertions/api.d.mts +3 -0
  109. package/dist/assertions/api.d.ts +3 -0
  110. package/dist/assertions/collection.cjs +1 -1
  111. package/dist/assertions/collection.cjs.map +1 -1
  112. package/dist/assertions/judge.cjs +1 -1
  113. package/dist/assertions/judge.cjs.map +1 -1
  114. package/dist/assertions/match.cjs +52 -21
  115. package/dist/assertions/match.cjs.map +1 -1
  116. package/dist/assertions/match.d.cts +16 -5
  117. package/dist/assertions/match.d.mts +16 -5
  118. package/dist/assertions/match.d.ts +16 -5
  119. package/dist/assertions/match.js +96 -94
  120. package/dist/assertions/measurements.cjs +61 -0
  121. package/dist/assertions/measurements.cjs.map +1 -0
  122. package/dist/assertions/measurements.d.cts +24 -0
  123. package/dist/assertions/measurements.d.mts +24 -0
  124. package/dist/assertions/measurements.d.ts +24 -0
  125. package/dist/assertions/measurements.js +8 -0
  126. package/dist/assertions/measurements.js.map +1 -0
  127. package/dist/assertions/numeric.cjs +2 -0
  128. package/dist/assertions/numeric.cjs.map +1 -1
  129. package/dist/assertions/numeric.d.cts +1 -1
  130. package/dist/assertions/numeric.d.mts +1 -1
  131. package/dist/assertions/numeric.d.ts +1 -1
  132. package/dist/assertions/quantity.cjs +42 -0
  133. package/dist/assertions/quantity.cjs.map +1 -0
  134. package/dist/assertions/quantity.d.cts +18 -0
  135. package/dist/assertions/quantity.d.mts +18 -0
  136. package/dist/assertions/quantity.d.ts +18 -0
  137. package/dist/assertions/quantity.js +22 -0
  138. package/dist/assertions/quantity.js.map +1 -0
  139. package/dist/assertions/record/attachment.cjs +2 -0
  140. package/dist/assertions/record/attachment.cjs.map +1 -1
  141. package/dist/assertions/record/codec.cjs +5 -1
  142. package/dist/assertions/record/codec.cjs.map +1 -1
  143. package/dist/assertions/record/model.cjs.map +1 -1
  144. package/dist/assertions/record/model.d.cts +3 -1
  145. package/dist/assertions/record/model.d.mts +3 -1
  146. package/dist/assertions/record/model.d.ts +3 -1
  147. package/dist/assertions/runtime.cjs +11 -6
  148. package/dist/assertions/runtime.cjs.map +1 -1
  149. package/dist/cli/program.cjs +3 -0
  150. package/dist/cli/program.cjs.map +1 -1
  151. package/dist/context/assert-first.cjs +6 -4
  152. package/dist/context/assert-first.cjs.map +1 -1
  153. package/dist/context/assert-first.d.cts +9 -3
  154. package/dist/context/assert-first.d.mts +9 -3
  155. package/dist/context/assert-first.d.ts +9 -3
  156. package/dist/context/notes.cjs +47 -0
  157. package/dist/context/notes.cjs.map +1 -0
  158. package/dist/context/notes.d.cts +10 -0
  159. package/dist/context/notes.d.mts +10 -0
  160. package/dist/context/notes.d.ts +10 -0
  161. package/dist/context/notes.js +6 -0
  162. package/dist/context/notes.js.map +1 -0
  163. package/dist/context/send-failures.cjs +1 -7
  164. package/dist/context/send-failures.cjs.map +1 -1
  165. package/dist/context/send-failures.d.cts +2 -3
  166. package/dist/context/send-failures.d.mts +2 -3
  167. package/dist/context/send-failures.d.ts +2 -3
  168. package/dist/context/send-retry.cjs +0 -1
  169. package/dist/context/send-retry.cjs.map +1 -1
  170. package/dist/context/send-retry.d.cts +1 -2
  171. package/dist/context/send-retry.d.mts +1 -2
  172. package/dist/context/send-retry.d.ts +1 -2
  173. package/dist/context/session.cjs +10 -17
  174. package/dist/context/session.cjs.map +1 -1
  175. package/dist/context/session.d.cts +4 -10
  176. package/dist/context/session.d.mts +4 -10
  177. package/dist/context/session.d.ts +4 -10
  178. package/dist/define.cjs +89 -64
  179. package/dist/define.cjs.map +1 -1
  180. package/dist/define.d.cts +3 -3
  181. package/dist/define.d.mts +3 -3
  182. package/dist/define.d.ts +3 -3
  183. package/dist/eval/cli/contribution.cjs +1 -1
  184. package/dist/eval/cli/contribution.cjs.map +1 -1
  185. package/dist/eval/host/index.cjs +1 -1
  186. package/dist/eval/host/index.cjs.map +1 -1
  187. package/dist/eval/record/evaluation.cjs +1 -1
  188. package/dist/eval/record/evaluation.cjs.map +1 -1
  189. package/dist/eval/record/membership-provenance.d.cts +3 -3
  190. package/dist/eval/record/membership-provenance.d.mts +3 -3
  191. package/dist/eval/record/membership-provenance.d.ts +3 -3
  192. package/dist/eval/record/score.cjs +2 -2
  193. package/dist/eval/record/score.cjs.map +1 -1
  194. package/dist/eval/record/sealed-assertion.cjs +1 -1
  195. package/dist/eval/record/sealed-assertion.cjs.map +1 -1
  196. package/dist/eval/record/verdict.cjs +2 -2
  197. package/dist/eval/record/verdict.cjs.map +1 -1
  198. package/dist/expect/index.cjs +13 -1
  199. package/dist/expect/index.cjs.map +1 -1
  200. package/dist/expect/index.d.cts +5 -1
  201. package/dist/expect/index.d.mts +5 -1
  202. package/dist/expect/index.d.ts +5 -1
  203. package/dist/expect/index.js +92 -72
  204. package/dist/expect/index.mjs +92 -72
  205. package/dist/experiment/host/cli/contribution.cjs +52 -39
  206. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  207. package/dist/experiment/host/cli/contribution.d.cts +18 -4
  208. package/dist/experiment/host/cli/contribution.d.mts +18 -4
  209. package/dist/experiment/host/cli/contribution.d.ts +18 -4
  210. package/dist/experiment/host/cli/contribution.js +2 -2
  211. package/dist/experiment/host/cli/debug-protocol.cjs +2 -2
  212. package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -1
  213. package/dist/experiment/host/cli/debug-protocol.d.cts +2 -2
  214. package/dist/experiment/host/cli/debug-protocol.d.mts +2 -2
  215. package/dist/experiment/host/cli/debug-protocol.d.ts +2 -2
  216. package/dist/experiment/host/cli/output-protocol.cjs +1 -1
  217. package/dist/experiment/host/cli/output-protocol.cjs.map +1 -1
  218. package/dist/experiment/host/cli/output-protocol.d.cts +2 -2
  219. package/dist/experiment/host/cli/output-protocol.d.mts +2 -2
  220. package/dist/experiment/host/cli/output-protocol.d.ts +2 -2
  221. package/dist/experiment/host/current.cjs +2 -2
  222. package/dist/experiment/host/current.cjs.map +1 -1
  223. package/dist/experiment/host/index.cjs +1 -1
  224. package/dist/experiment/host/index.cjs.map +1 -1
  225. package/dist/experiment/host/operations.cjs +24 -23
  226. package/dist/experiment/host/operations.cjs.map +1 -1
  227. package/dist/experiment/host/runtime.cjs +11 -10
  228. package/dist/experiment/host/runtime.cjs.map +1 -1
  229. package/dist/experiment/host/runtime.d.cts +3 -3
  230. package/dist/experiment/host/runtime.d.mts +3 -3
  231. package/dist/experiment/host/runtime.d.ts +3 -3
  232. package/dist/experiment/host/teardown.cjs +4 -3
  233. package/dist/experiment/host/teardown.cjs.map +1 -1
  234. package/dist/experiment/host/teardown.d.cts +3 -3
  235. package/dist/experiment/host/teardown.d.mts +3 -3
  236. package/dist/experiment/host/teardown.d.ts +3 -3
  237. package/dist/experiment/host/types.cjs.map +1 -1
  238. package/dist/experiment/host/types.d.cts +19 -19
  239. package/dist/experiment/host/types.d.mts +19 -19
  240. package/dist/experiment/host/types.d.ts +19 -19
  241. package/dist/index.cjs +3 -19
  242. package/dist/index.cjs.map +1 -1
  243. package/dist/index.d.cts +4 -8
  244. package/dist/index.d.mts +4 -8
  245. package/dist/index.d.ts +4 -8
  246. package/dist/index.js +12 -34
  247. package/dist/index.mjs +12 -34
  248. package/dist/inspection/assertions.cjs +1 -1
  249. package/dist/inspection/assertions.cjs.map +1 -1
  250. package/dist/inspection/cli/contribution.cjs +8 -7
  251. package/dist/inspection/cli/contribution.cjs.map +1 -1
  252. package/dist/inspection/facts.cjs +4 -4
  253. package/dist/inspection/facts.cjs.map +1 -1
  254. package/dist/inspection/index.cjs +1 -5
  255. package/dist/inspection/index.cjs.map +1 -1
  256. package/dist/inspection/index.d.cts +1 -2
  257. package/dist/inspection/index.d.mts +1 -2
  258. package/dist/inspection/index.d.ts +1 -2
  259. package/dist/inspection/index.js +20 -26
  260. package/dist/inspection/lifecycle.cjs +7 -0
  261. package/dist/inspection/lifecycle.cjs.map +1 -0
  262. package/dist/inspection/lifecycle.d.cts +4 -0
  263. package/dist/inspection/lifecycle.d.mts +4 -0
  264. package/dist/inspection/lifecycle.d.ts +4 -0
  265. package/dist/inspection/lifecycle.js +6 -0
  266. package/dist/inspection/lifecycle.js.map +1 -0
  267. package/dist/inspection/notes.cjs +40 -0
  268. package/dist/inspection/notes.cjs.map +1 -0
  269. package/dist/inspection/notes.d.cts +12 -0
  270. package/dist/inspection/notes.d.mts +12 -0
  271. package/dist/inspection/notes.d.ts +12 -0
  272. package/dist/inspection/notes.js +8 -0
  273. package/dist/inspection/notes.js.map +1 -0
  274. package/dist/inspection/overview.cjs +12 -15
  275. package/dist/inspection/overview.cjs.map +1 -1
  276. package/dist/inspection/overview.d.cts +8 -6
  277. package/dist/inspection/overview.d.mts +8 -6
  278. package/dist/inspection/overview.d.ts +8 -6
  279. package/dist/inspection/planned-attempt.cjs +45 -0
  280. package/dist/inspection/planned-attempt.cjs.map +1 -0
  281. package/dist/inspection/planned-attempt.d.cts +109 -0
  282. package/dist/inspection/planned-attempt.d.mts +109 -0
  283. package/dist/inspection/planned-attempt.d.ts +109 -0
  284. package/dist/inspection/planned-attempt.js +24 -0
  285. package/dist/inspection/planned-attempt.js.map +1 -0
  286. package/dist/inspection/project-result.cjs +5 -5
  287. package/dist/inspection/project-result.cjs.map +1 -1
  288. package/dist/inspection/project-result.d.cts +58 -57
  289. package/dist/inspection/project-result.d.mts +58 -57
  290. package/dist/inspection/project-result.d.ts +58 -57
  291. package/dist/inspection/project-result.js +4 -4
  292. package/dist/inspection/project.cjs +3 -3
  293. package/dist/inspection/project.cjs.map +1 -1
  294. package/dist/inspection/protocol-values.cjs +1 -1
  295. package/dist/inspection/protocol-values.cjs.map +1 -1
  296. package/dist/inspection/protocol-values.d.cts +1 -1
  297. package/dist/inspection/protocol-values.d.mts +1 -1
  298. package/dist/inspection/protocol-values.d.ts +1 -1
  299. package/dist/inspection/protocol.cjs +8 -8
  300. package/dist/inspection/protocol.cjs.map +1 -1
  301. package/dist/inspection/protocol.d.cts +237 -219
  302. package/dist/inspection/protocol.d.mts +237 -219
  303. package/dist/inspection/protocol.d.ts +237 -219
  304. package/dist/inspection/public.cjs +1 -5
  305. package/dist/inspection/public.cjs.map +1 -1
  306. package/dist/inspection/public.d.cts +1 -2
  307. package/dist/inspection/public.d.mts +1 -2
  308. package/dist/inspection/public.d.ts +1 -2
  309. package/dist/inspection/public.js +14 -20
  310. package/dist/inspection/public.mjs +166 -129
  311. package/dist/inspection/query.cjs +1 -1
  312. package/dist/inspection/query.cjs.map +1 -1
  313. package/dist/inspection/results.cjs +61 -52
  314. package/dist/inspection/results.cjs.map +1 -1
  315. package/dist/inspection/results.d.cts +157 -140
  316. package/dist/inspection/results.d.mts +157 -140
  317. package/dist/inspection/results.d.ts +157 -140
  318. package/dist/inspection/select.cjs +33 -28
  319. package/dist/inspection/select.cjs.map +1 -1
  320. package/dist/inspection/source.cjs +1 -1
  321. package/dist/inspection/source.cjs.map +1 -1
  322. package/dist/inspection/sources.cjs +2 -2
  323. package/dist/inspection/sources.cjs.map +1 -1
  324. package/dist/inspection/trace.cjs +9 -8
  325. package/dist/inspection/trace.cjs.map +1 -1
  326. package/dist/inspection/trace.d.cts +4 -4
  327. package/dist/inspection/trace.d.mts +4 -4
  328. package/dist/inspection/trace.d.ts +4 -4
  329. package/dist/loaders/index.cjs +7 -279
  330. package/dist/loaders/index.cjs.map +1 -1
  331. package/dist/loaders/index.d.cts +2 -95
  332. package/dist/loaders/index.d.mts +2 -95
  333. package/dist/loaders/index.d.ts +2 -95
  334. package/dist/loaders/index.js +10 -12
  335. package/dist/loaders/index.mjs +10 -12
  336. package/dist/loaders/runtime.cjs +283 -0
  337. package/dist/loaders/runtime.cjs.map +1 -0
  338. package/dist/loaders/runtime.d.cts +95 -0
  339. package/dist/loaders/runtime.d.mts +95 -0
  340. package/dist/loaders/runtime.d.ts +95 -0
  341. package/dist/loaders/runtime.js +16 -0
  342. package/dist/loaders/runtime.js.map +1 -0
  343. package/dist/migrations/judge-provider.md +6 -6
  344. package/dist/{model-slots.cjs → model-roles.cjs} +26 -7
  345. package/dist/model-roles.cjs.map +1 -0
  346. package/dist/model-roles.d.cts +26 -0
  347. package/dist/model-roles.d.mts +26 -0
  348. package/dist/model-roles.d.ts +26 -0
  349. package/dist/model-roles.js +14 -0
  350. package/dist/model-roles.js.map +1 -0
  351. package/dist/o11y/adapter-usage-projection.cjs +9 -8
  352. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  353. package/dist/o11y/adapter-usage-projection.d.cts +23 -15
  354. package/dist/o11y/adapter-usage-projection.d.mts +23 -15
  355. package/dist/o11y/adapter-usage-projection.d.ts +23 -15
  356. package/dist/o11y/cache-read.cjs +14 -14
  357. package/dist/o11y/cache-read.cjs.map +1 -1
  358. package/dist/o11y/cache-read.d.cts +5 -5
  359. package/dist/o11y/cache-read.d.mts +5 -5
  360. package/dist/o11y/cache-read.d.ts +5 -5
  361. package/dist/o11y/derive.cjs.map +1 -1
  362. package/dist/o11y/derive.d.cts +2 -2
  363. package/dist/o11y/derive.d.mts +2 -2
  364. package/dist/o11y/derive.d.ts +2 -2
  365. package/dist/o11y/eval-usage.cjs +9 -9
  366. package/dist/o11y/eval-usage.cjs.map +1 -1
  367. package/dist/o11y/eval-usage.d.cts +7 -7
  368. package/dist/o11y/eval-usage.d.mts +7 -7
  369. package/dist/o11y/eval-usage.d.ts +7 -7
  370. package/dist/o11y/parsers/bub.cjs +57 -81
  371. package/dist/o11y/parsers/bub.cjs.map +1 -1
  372. package/dist/o11y/parsers/index.cjs.map +1 -1
  373. package/dist/o11y/parsers/index.d.cts +2 -0
  374. package/dist/o11y/parsers/index.d.mts +2 -0
  375. package/dist/o11y/parsers/index.d.ts +2 -0
  376. package/dist/o11y/parsers/opencode.cjs +129 -217
  377. package/dist/o11y/parsers/opencode.cjs.map +1 -1
  378. package/dist/o11y/parsers/opencode.d.cts +2 -5
  379. package/dist/o11y/parsers/opencode.d.mts +2 -5
  380. package/dist/o11y/parsers/opencode.d.ts +2 -5
  381. package/dist/o11y/types.cjs.map +1 -1
  382. package/dist/o11y/types.d.cts +1 -1
  383. package/dist/o11y/types.d.mts +1 -1
  384. package/dist/o11y/types.d.ts +1 -1
  385. package/dist/plugin/contracts.cjs +170 -120
  386. package/dist/plugin/contracts.cjs.map +1 -1
  387. package/dist/plugin/contracts.d.cts +102 -90
  388. package/dist/plugin/contracts.d.mts +102 -90
  389. package/dist/plugin/contracts.d.ts +102 -90
  390. package/dist/plugin/contracts.js +16 -12
  391. package/dist/plugin/index.cjs.map +1 -1
  392. package/dist/plugin/index.d.cts +1 -1
  393. package/dist/plugin/index.d.mts +1 -1
  394. package/dist/plugin/index.d.ts +1 -1
  395. package/dist/plugin/link.cjs +69 -64
  396. package/dist/plugin/link.cjs.map +1 -1
  397. package/dist/plugin/link.d.cts +5 -3
  398. package/dist/plugin/link.d.mts +5 -3
  399. package/dist/plugin/link.d.ts +5 -3
  400. package/dist/plugin/link.js +12 -8
  401. package/dist/record/codec/seal-manifest.d.cts +3 -3
  402. package/dist/record/codec/seal-manifest.d.mts +3 -3
  403. package/dist/record/codec/seal-manifest.d.ts +3 -3
  404. package/dist/record/family/attempt-note/definition.cjs +12 -0
  405. package/dist/record/family/attempt-note/definition.cjs.map +1 -0
  406. package/dist/record/family/attempt-note/definition.d.cts +6 -0
  407. package/dist/record/family/attempt-note/definition.d.mts +6 -0
  408. package/dist/record/family/attempt-note/definition.d.ts +6 -0
  409. package/dist/record/family/attempt-note/definition.js +6 -0
  410. package/dist/record/family/attempt-note/definition.js.map +1 -0
  411. package/dist/record/family/attempt-note/persistence.cjs +10 -0
  412. package/dist/record/family/attempt-note/persistence.cjs.map +1 -0
  413. package/dist/record/family/attempt-note/persistence.d.cts +6 -0
  414. package/dist/record/family/attempt-note/persistence.d.mts +6 -0
  415. package/dist/record/family/attempt-note/persistence.d.ts +6 -0
  416. package/dist/record/family/attempt-note/persistence.js +6 -0
  417. package/dist/record/family/attempt-note/persistence.js.map +1 -0
  418. package/dist/record/family/attempt-note/schema.cjs +20 -0
  419. package/dist/record/family/attempt-note/schema.cjs.map +1 -0
  420. package/dist/record/family/attempt-note/schema.d.cts +21 -0
  421. package/dist/record/family/attempt-note/schema.d.mts +21 -0
  422. package/dist/record/family/attempt-note/schema.d.ts +21 -0
  423. package/dist/record/family/attempt-note/schema.js +10 -0
  424. package/dist/record/family/attempt-note/schema.js.map +1 -0
  425. package/dist/record/family/catalog.cjs +32 -29
  426. package/dist/record/family/catalog.cjs.map +1 -1
  427. package/dist/record/family/catalog.d.cts +7 -2
  428. package/dist/record/family/catalog.d.mts +7 -2
  429. package/dist/record/family/catalog.d.ts +7 -2
  430. package/dist/record/family/current.cjs +48 -45
  431. package/dist/record/family/current.cjs.map +1 -1
  432. package/dist/record/family/current.d.cts +15 -0
  433. package/dist/record/family/current.d.mts +15 -0
  434. package/dist/record/family/current.d.ts +15 -0
  435. package/dist/record/model/index.js +66 -64
  436. package/dist/record/model/run-context.cjs +9 -3
  437. package/dist/record/model/run-context.cjs.map +1 -1
  438. package/dist/record/model/run-context.d.cts +9 -2
  439. package/dist/record/model/run-context.d.mts +9 -2
  440. package/dist/record/model/run-context.d.ts +9 -2
  441. package/dist/record/model/run-context.js +8 -6
  442. package/dist/record/model/seal-manifest.d.cts +1 -1
  443. package/dist/record/model/seal-manifest.d.mts +1 -1
  444. package/dist/record/model/seal-manifest.d.ts +1 -1
  445. package/dist/run/cli/contribution.cjs +6 -32
  446. package/dist/run/cli/contribution.cjs.map +1 -1
  447. package/dist/run/host/runtime.cjs +1 -1
  448. package/dist/run/host/runtime.cjs.map +1 -1
  449. package/dist/run/storage/sqlite.cjs +7 -7
  450. package/dist/run/storage/sqlite.cjs.map +1 -1
  451. package/dist/runner/adapter-usage.cjs +5 -3
  452. package/dist/runner/adapter-usage.cjs.map +1 -1
  453. package/dist/runner/adapter-usage.d.cts +2 -2
  454. package/dist/runner/adapter-usage.d.mts +2 -2
  455. package/dist/runner/adapter-usage.d.ts +2 -2
  456. package/dist/runner/adoption.cjs +10 -12
  457. package/dist/runner/adoption.cjs.map +1 -1
  458. package/dist/runner/attempt-notes.cjs +8 -0
  459. package/dist/runner/attempt-notes.cjs.map +1 -0
  460. package/dist/runner/attempt-notes.d.cts +4 -0
  461. package/dist/runner/attempt-notes.d.mts +4 -0
  462. package/dist/runner/attempt-notes.d.ts +4 -0
  463. package/dist/runner/attempt-notes.js +8 -0
  464. package/dist/runner/attempt-notes.js.map +1 -0
  465. package/dist/runner/attempt.cjs +61 -73
  466. package/dist/runner/attempt.cjs.map +1 -1
  467. package/dist/runner/attempt.d.cts +3 -3
  468. package/dist/runner/attempt.d.mts +3 -3
  469. package/dist/runner/attempt.d.ts +3 -3
  470. package/dist/runner/command-plan.cjs +21 -26
  471. package/dist/runner/command-plan.cjs.map +1 -1
  472. package/dist/runner/command-plan.d.cts +4 -4
  473. package/dist/runner/command-plan.d.mts +4 -4
  474. package/dist/runner/command-plan.d.ts +4 -4
  475. package/dist/runner/command-plan.js +4 -4
  476. package/dist/runner/config-identity.cjs.map +1 -1
  477. package/dist/runner/config-identity.d.cts +2 -2
  478. package/dist/runner/config-identity.d.mts +2 -2
  479. package/dist/runner/config-identity.d.ts +2 -2
  480. package/dist/runner/discover.cjs +6 -6
  481. package/dist/runner/discover.cjs.map +1 -1
  482. package/dist/runner/eval-selection.cjs +15 -1
  483. package/dist/runner/eval-selection.cjs.map +1 -1
  484. package/dist/runner/eval-selection.d.cts +4 -0
  485. package/dist/runner/eval-selection.d.mts +4 -0
  486. package/dist/runner/eval-selection.d.ts +4 -0
  487. package/dist/runner/feedback/human.cjs +1 -1
  488. package/dist/runner/feedback/human.cjs.map +1 -1
  489. package/dist/runner/feedback/json.cjs +4 -2
  490. package/dist/runner/feedback/json.cjs.map +1 -1
  491. package/dist/runner/feedback/json.d.cts +1 -1
  492. package/dist/runner/feedback/json.d.mts +1 -1
  493. package/dist/runner/feedback/json.d.ts +1 -1
  494. package/dist/runner/feedback/sink.cjs +1 -1
  495. package/dist/runner/feedback/sink.cjs.map +1 -1
  496. package/dist/runner/feedback/sink.d.cts +1 -1
  497. package/dist/runner/feedback/sink.d.mts +1 -1
  498. package/dist/runner/feedback/sink.d.ts +1 -1
  499. package/dist/runner/fingerprint.cjs +1 -1
  500. package/dist/runner/fingerprint.cjs.map +1 -1
  501. package/dist/runner/lock.cjs +1 -3
  502. package/dist/runner/lock.cjs.map +1 -1
  503. package/dist/runner/lock.d.cts +0 -2
  504. package/dist/runner/lock.d.mts +0 -2
  505. package/dist/runner/lock.d.ts +0 -2
  506. package/dist/runner/lock.js +14 -16
  507. package/dist/runner/project-target.cjs.map +1 -1
  508. package/dist/runner/project-target.d.cts +2 -2
  509. package/dist/runner/project-target.d.mts +2 -2
  510. package/dist/runner/project-target.d.ts +2 -2
  511. package/dist/runner/record/attachments.cjs +2 -2
  512. package/dist/runner/record/attachments.cjs.map +1 -1
  513. package/dist/runner/record/planning.cjs +8 -2
  514. package/dist/runner/record/planning.cjs.map +1 -1
  515. package/dist/runner/record.cjs +2 -0
  516. package/dist/runner/record.cjs.map +1 -1
  517. package/dist/runner/report.cjs +3 -3
  518. package/dist/runner/report.cjs.map +1 -1
  519. package/dist/runner/report.d.cts +1 -1
  520. package/dist/runner/report.d.mts +1 -1
  521. package/dist/runner/report.d.ts +1 -1
  522. package/dist/runner/reuse-plan.cjs +2 -2
  523. package/dist/runner/reuse-plan.cjs.map +1 -1
  524. package/dist/runner/run.cjs +10 -45
  525. package/dist/runner/run.cjs.map +1 -1
  526. package/dist/runner/sandbox-pool.cjs +1 -2
  527. package/dist/runner/sandbox-pool.cjs.map +1 -1
  528. package/dist/runner/setup-prefix-preparation.cjs +1 -1
  529. package/dist/runner/setup-prefix-preparation.cjs.map +1 -1
  530. package/dist/runner/teardown-registry.cjs +2 -2
  531. package/dist/runner/teardown-registry.cjs.map +1 -1
  532. package/dist/runner/teardown-registry.d.cts +1 -1
  533. package/dist/runner/teardown-registry.d.mts +1 -1
  534. package/dist/runner/teardown-registry.d.ts +1 -1
  535. package/dist/runner/types.cjs +4 -4
  536. package/dist/runner/types.cjs.map +1 -1
  537. package/dist/runner/types.d.cts +64 -92
  538. package/dist/runner/types.d.mts +64 -92
  539. package/dist/runner/types.d.ts +64 -92
  540. package/dist/runner/types.js +2 -2
  541. package/dist/sandbox/action.cjs +1 -1
  542. package/dist/sandbox/action.cjs.map +1 -1
  543. package/dist/sandbox/cli/contribution.cjs +17 -14
  544. package/dist/sandbox/cli/contribution.cjs.map +1 -1
  545. package/dist/sandbox/cli/contribution.d.cts +1 -1
  546. package/dist/sandbox/cli/contribution.d.mts +1 -1
  547. package/dist/sandbox/cli/contribution.d.ts +1 -1
  548. package/dist/sandbox/commands.cjs +1 -1
  549. package/dist/sandbox/commands.cjs.map +1 -1
  550. package/dist/sandbox/commands.d.cts +1 -1
  551. package/dist/sandbox/commands.d.mts +1 -1
  552. package/dist/sandbox/commands.d.ts +1 -1
  553. package/dist/sandbox/compose.cjs +2 -2
  554. package/dist/sandbox/compose.cjs.map +1 -1
  555. package/dist/sandbox/docker-profile/registry.cjs +5 -10
  556. package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
  557. package/dist/sandbox/docker-profile/registry.d.cts +0 -4
  558. package/dist/sandbox/docker-profile/registry.d.mts +0 -4
  559. package/dist/sandbox/docker-profile/registry.d.ts +0 -4
  560. package/dist/sandbox/docker-profile/registry.js +6 -14
  561. package/dist/sandbox/docker-profile/runtime.cjs +1 -1
  562. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  563. package/dist/sandbox/docker-profile/schema.cjs +12 -16
  564. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  565. package/dist/sandbox/docker-profile/schema.d.cts +2 -6
  566. package/dist/sandbox/docker-profile/schema.d.mts +2 -6
  567. package/dist/sandbox/docker-profile/schema.d.ts +2 -6
  568. package/dist/sandbox/docker-profile/schema.js +24 -32
  569. package/dist/sandbox/incus.cjs +2 -2
  570. package/dist/sandbox/incus.cjs.map +1 -1
  571. package/dist/sandbox/index.cjs +4 -36
  572. package/dist/sandbox/index.cjs.map +1 -1
  573. package/dist/sandbox/index.d.cts +4 -8
  574. package/dist/sandbox/index.d.mts +4 -8
  575. package/dist/sandbox/index.d.ts +4 -8
  576. package/dist/sandbox/index.js +116 -174
  577. package/dist/sandbox/index.mjs +116 -174
  578. package/dist/sandbox/layer.cjs +3 -3
  579. package/dist/sandbox/layer.cjs.map +1 -1
  580. package/dist/sandbox/link.cjs +5 -0
  581. package/dist/sandbox/link.cjs.map +1 -1
  582. package/dist/sandbox/link.d.cts +3 -0
  583. package/dist/sandbox/link.d.mts +3 -0
  584. package/dist/sandbox/link.d.ts +3 -0
  585. package/dist/sandbox/runtime.cjs +9 -4
  586. package/dist/sandbox/runtime.cjs.map +1 -1
  587. package/dist/shared/failure-class.cjs +5 -5
  588. package/dist/shared/failure-class.cjs.map +1 -1
  589. package/dist/shared/failure-class.d.cts +4 -10
  590. package/dist/shared/failure-class.d.mts +4 -10
  591. package/dist/shared/failure-class.d.ts +4 -10
  592. package/dist/shared/types.cjs.map +1 -1
  593. package/dist/shared/types.d.cts +1 -1
  594. package/dist/shared/types.d.mts +1 -1
  595. package/dist/shared/types.d.ts +1 -1
  596. package/dist/show/contribution.cjs +17 -2
  597. package/dist/show/contribution.cjs.map +1 -1
  598. package/dist/show/contribution.d.cts +14 -0
  599. package/dist/show/contribution.d.mts +14 -0
  600. package/dist/show/contribution.d.ts +14 -0
  601. package/dist/show/model.cjs +8 -5
  602. package/dist/show/model.cjs.map +1 -1
  603. package/dist/show/model.d.cts +11 -8
  604. package/dist/show/model.d.mts +11 -8
  605. package/dist/show/model.d.ts +11 -8
  606. package/dist/show/render.cjs +34 -22
  607. package/dist/show/render.cjs.map +1 -1
  608. package/dist/sources/projector.cjs +1 -1
  609. package/dist/sources/projector.cjs.map +1 -1
  610. package/dist/types.cjs +1 -1
  611. package/dist/types.cjs.map +1 -1
  612. package/dist/types.d.cts +1 -1
  613. package/dist/types.d.mts +1 -1
  614. package/dist/types.d.ts +1 -1
  615. package/dist/types.js +2 -2
  616. package/dist/view/app-dist/.vite/manifest.json +2 -2
  617. package/dist/view/app-dist/assets/{index-B3ijZRph.js → index-CxrOUvHC.js} +17 -17
  618. package/dist/view/app-dist/assets/{quality-cost-scatter-B--DfJ9s.js → quality-cost-scatter-B6Aiss7x.js} +1 -1
  619. package/dist/view/app-dist/index.html +1 -1
  620. package/dist/view/cli/contribution.cjs +1 -1
  621. package/dist/view/cli/contribution.cjs.map +1 -1
  622. package/dist/view/function-runtime.mjs +318 -121
  623. package/dist/view/http-protocol.d.cts +1 -1
  624. package/dist/view/http-protocol.d.mts +1 -1
  625. package/dist/view/http-protocol.d.ts +1 -1
  626. package/dist/view/inspection-host.cjs +2 -2
  627. package/dist/view/inspection-host.cjs.map +1 -1
  628. package/dist/view/inspection-host.d.cts +349 -331
  629. package/dist/view/inspection-host.d.mts +349 -331
  630. package/dist/view/inspection-host.d.ts +349 -331
  631. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +9 -9
  632. package/docs-site/zh/examples/integrations/claude-sdk.mdx +8 -8
  633. package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
  634. package/docs-site/zh/examples/integrations/langgraph.mdx +6 -6
  635. package/docs-site/zh/examples/integrations/pi-sdk.mdx +8 -8
  636. package/docs-site/zh/explanation/adapter.mdx +6 -6
  637. package/docs-site/zh/explanation/assert.mdx +7 -7
  638. package/docs-site/zh/explanation/drive.mdx +4 -4
  639. package/docs-site/zh/explanation/hitl.mdx +2 -2
  640. package/docs-site/zh/explanation/judge.mdx +3 -3
  641. package/docs-site/zh/index.mdx +18 -0
  642. package/docs-site/zh/introduction.mdx +4 -3
  643. package/docs-site/zh/reference/builtin-agents.mdx +46 -49
  644. package/docs-site/zh/reference/cli.mdx +16 -14
  645. package/docs-site/zh/reference/define-agent.mdx +19 -19
  646. package/docs-site/zh/reference/define-config.mdx +7 -15
  647. package/docs-site/zh/reference/define-eval.mdx +20 -14
  648. package/docs-site/zh/reference/define-experiment.mdx +18 -39
  649. package/docs-site/zh/reference/events.mdx +1 -1
  650. package/docs-site/zh/reference/expect.mdx +21 -0
  651. package/docs-site/zh/reference/official-adapters.mdx +12 -5
  652. package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
  653. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +1 -1
  654. package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
  655. package/docs-site/zh/tutorials/authoring.mdx +4 -3
  656. package/docs-site/zh/tutorials/compare-runs.mdx +1 -1
  657. package/docs-site/zh/tutorials/concurrency.mdx +8 -8
  658. package/docs-site/zh/tutorials/configuration.mdx +5 -5
  659. package/docs-site/zh/tutorials/control-run-cost.mdx +49 -9
  660. package/docs-site/zh/tutorials/eval-groups.mdx +1 -1
  661. package/docs-site/zh/tutorials/evaluation-kinds.mdx +5 -5
  662. package/docs-site/zh/tutorials/experiment-services.mdx +32 -32
  663. package/docs-site/zh/tutorials/handle-execution-failures.mdx +2 -28
  664. package/docs-site/zh/tutorials/plugins.mdx +49 -143
  665. package/docs-site/zh/tutorials/sandbox-agent.mdx +1 -1
  666. package/docs-site/zh/tutorials/sandbox-reuse.mdx +7 -7
  667. package/docs-site/zh/tutorials/upgrade-0-18.mdx +64 -0
  668. package/docs-site/zh/tutorials/upgrade-0-19.mdx +121 -0
  669. package/docs-site/zh/tutorials/upgrade-0-20.mdx +12 -0
  670. package/docs-site/zh/tutorials/verify-judge.mdx +4 -3
  671. package/docs-site/zh/tutorials/viewing-results.mdx +2 -2
  672. package/docs-site/zh/tutorials/write-experiment.mdx +1 -1
  673. package/docs-site/zh/tutorials/write-send.mdx +13 -13
  674. package/package.json +1 -1
  675. package/dist/agents/effect-runtime.cjs.map +0 -1
  676. package/dist/agents/effect-runtime.d.cts +0 -29
  677. package/dist/agents/effect-runtime.d.mts +0 -29
  678. package/dist/agents/effect-runtime.d.ts +0 -29
  679. package/dist/agents/effect-runtime.js +0 -16
  680. package/dist/agents/effect-runtime.js.map +0 -1
  681. package/dist/agents/session-slot.cjs.map +0 -1
  682. package/dist/agents/session-slot.d.cts +0 -12
  683. package/dist/agents/session-slot.d.mts +0 -12
  684. package/dist/agents/session-slot.d.ts +0 -12
  685. package/dist/agents/session-slot.js +0 -6
  686. package/dist/agents/session-slot.js.map +0 -1
  687. package/dist/model-slots.cjs.map +0 -1
  688. package/dist/model-slots.d.cts +0 -19
  689. package/dist/model-slots.d.mts +0 -19
  690. package/dist/model-slots.d.ts +0 -19
  691. package/dist/model-slots.js +0 -8
  692. package/dist/model-slots.js.map +0 -1
@@ -50,7 +50,7 @@ import { defineConfig } from "niceeval";
50
50
  import { OpenAIProvider } from "niceeval/judge";
51
51
 
52
52
  export default defineConfig({
53
- judgeRuntime: OpenAIProvider({ model: "gpt-5.4-mini" }),
53
+ judgeProvider: OpenAIProvider({ model: "gpt-5.4-mini" }),
54
54
  maxConcurrency: 4,
55
55
  timeoutMs: 300_000,
56
56
  });
@@ -61,7 +61,7 @@ export default defineConfig({
61
61
  | 字段 | 放什么 |
62
62
  | --- | --- |
63
63
  | `name` | 项目名,显示在 `niceeval view` 顶部。可按语言给多份 |
64
- | `judgeRuntime` | 默认裁判 Provider,由 `niceeval/judge` 的具名工厂构造 |
64
+ | `judgeProvider` | 默认裁判 Provider,由 `niceeval/judge` 的具名工厂构造 |
65
65
  | `workspace` | 上传进 Sandbox 的工作区根目录 |
66
66
  | `reporters` | 默认 reporter 列表(落盘、上报实验平台) |
67
67
  | `maxConcurrency` | 默认并发上限 |
@@ -80,7 +80,7 @@ export default defineConfig({
80
80
  | `ANTHROPIC_API_KEY` | `claudeCodeAgent()` | 工厂参数 `apiKey` 可覆盖 |
81
81
  | `ANTHROPIC_BASE_URL` | `claudeCodeAgent()` | 网关地址,工厂参数 `baseUrl` 可覆盖 |
82
82
  | `CODEX_API_KEY` / `CODEX_BASE_URL` | `codexAgent()` | key 必需,代理地址可选;工厂参数 `apiKey` / `baseUrl` 可覆盖 |
83
- | `BUB_API_KEY` / `BUB_API_BASE` | `bubAgent()` | 两者必需;工厂参数 `apiKey` / `apiBase` 可覆盖 |
83
+ | `BUB_API_KEY` / `BUB_API_BASE` | `bubAgent()` | 两者必需;工厂参数 `apiKey` / `baseUrl` 可覆盖 |
84
84
  | `OPENCLAW_API_KEY` / `OPENCLAW_BASE_URL` | `openClawAgent()` | key 省略时回落 `ANTHROPIC_API_KEY` |
85
85
  | `OPENCODE_API_KEY` / `OPENCODE_BASE_URL` | `openCodeAgent()` | key 省略时回落 `ANTHROPIC_API_KEY` |
86
86
  | `HERMES_API_KEY` / `HERMES_API_BASE` | `hermesAgent()` | key 省略时依次回落 `OPENROUTER_API_KEY`、`ANTHROPIC_API_KEY` |
@@ -100,7 +100,7 @@ export default defineConfig({
100
100
  import { OpenAIProvider } from "niceeval/judge";
101
101
 
102
102
  export default defineConfig({
103
- judgeRuntime: OpenAIProvider({
103
+ judgeProvider: OpenAIProvider({
104
104
  model: "gpt-5.4-mini",
105
105
  baseUrl: "https://gateway.example.com/v1", // 网关地址是配置,写在这里
106
106
  apiKeyEnv: "MY_GATEWAY_KEY", // key 是密钥,读这个环境变量
@@ -112,7 +112,7 @@ export default defineConfig({
112
112
 
113
113
  ```ts
114
114
  export default defineConfig({
115
- judgeRuntime: OpenAIProvider({
115
+ judgeProvider: OpenAIProvider({
116
116
  model: "gpt-5.4-mini",
117
117
  baseUrl: process.env.MY_GATEWAY_URL, // 变量名自己起,自己读
118
118
  apiKeyEnv: "MY_GATEWAY_KEY",
@@ -113,36 +113,36 @@ Attempt 页面先显示应用和 Judge 的合计费用:
113
113
  Headless Adapter 使用 `ctx.recordUsage` 登记真实调用,并在采集结束后调用 `ctx.sealUsage`。随后可以直接用 `t.usage.cacheRead` 设置缓存读取率门槛:
114
114
 
115
115
  ```ts
116
- import { atLeast } from "niceeval/expect";
116
+ import { atLeast, ratio } from "niceeval/expect";
117
117
 
118
- t.check(t.usage.cacheRead.rate("planner"), atLeast(0.6)).gate();
118
+ t.check(t.usage.cacheRead.rate("planner"), atLeast(ratio(0.6))).gate();
119
119
  // 不区分用途时,检查所有已登记调用的合计。
120
- t.check(t.usage.cacheRead.rate(), atLeast(0.6)).gate();
120
+ t.check(t.usage.cacheRead.rate(), atLeast(ratio(0.6))).gate();
121
121
  ```
122
122
 
123
123
  读取率是同组调用的 **缓存读取 token 总量 / 含缓存输入 token 总量**,包括失败调用与重试。它不是逐次百分比的平均值。每次调用优先使用 `inputTotalTokens`;没有独立总量时,必须同时提供 `inputTokens`、`cacheReadTokens`、`cacheWriteTokens` 三个互斥桶。
124
124
 
125
- `cacheRead.total` 给出整个 Attempt 的结果,`modelSlots` 按用途分组,`models` 进一步按真实 `provider` 和 `model` 分组。未知身份保持 `null`,不会用配置值补齐。`coveredCalls / recordedCalls` 表示已登记调用的输入覆盖率;`collectionComplete` 单独表示采集是否完整。
125
+ `cacheRead.total` 给出整个 Attempt 的结果,`roles` 按用途分组,`models` 进一步按真实 `provider` 和 `model` 分组。未知身份保持 `null`,不会用配置值补齐。`coveredCalls / recordedCalls` 表示已登记调用的输入覆盖率;`collectionComplete` 单独表示采集是否完整。
126
126
 
127
127
  缺失输入、未 seal、partial seal、unknown 调用状态、空组或零分母均返回 `unavailable`,`reasons` 列出原因。缺失不按零处理;完整且有正输入总量的零缓存读取率才是数值 0。旧账本没有明确的生产者完整性声明时,也返回不可判定。
128
128
 
129
129
  使用 `niceeval show <Attempt locator> --usage` 或 View 查看读取率、覆盖情况与原因;脚本通过 `attempt.usage` 的 `usage.cacheRead` 读取相同报告。已有 `recordUsage` 调用无需改名,但必须登记缓存 token,并在采集完成后诚实 seal。无需迁移历史结果文件。
130
130
 
131
131
 
132
- 槽位名来自 Experiment 的 `models` 键,不是框架内置名单。`model` 单模型简写对应 `default`。
133
- 传入未声明的槽位会在调用处报错,并列出可用名称。已声明但完整记录中没有调用的槽位返回 `slot-has-no-calls`;采集不完整时仍返回 `collection-incomplete`。
134
- Eval 可以被多个 Experiment 复用,因此此入口在运行回调里校验槽位,不在定义期检查动态字符串。
132
+ 角色名来自 Experiment 的 `models` 键,不是框架内置名单。`model` 单模型简写对应 `default`。
133
+ 传入未声明的角色会在调用处报错,并列出可用名称。已声明但完整记录中没有调用的角色返回 `role-has-no-calls`;采集不完整时仍返回 `collection-incomplete`。
134
+ Eval 可以被多个 Experiment 复用,因此此入口在运行回调里校验角色,不在定义期检查动态字符串。
135
135
 
136
136
  ### 登记命令行 Agent 的用量
137
137
 
138
- Adapter 应按外部回执记录真实调用,并将 `modelSlot` 设为 Experiment 声明的用途,例如 `mind`。
138
+ Adapter 应按外部回执记录真实调用,并将 `modelRole` 设为 Experiment 声明的用途,例如 `mind`。
139
139
  同一请求的流式增量和最终回执不能各登记一次;先按请求 ID 合并,收到最终回执后再登记。
140
140
 
141
141
  ```ts
142
142
  // 单次 Claude 请求的最终 usage;字段缺失时保留 null。
143
143
  ctx.recordUsage({
144
144
  callId: requestId,
145
- modelSlot: "mind",
145
+ modelRole: "mind",
146
146
  provider: observedProvider,
147
147
  model: observedModel,
148
148
  status: observedStatus,
@@ -168,3 +168,43 @@ ctx.sealUsage({ state: "partial", reason: "usage-not-exposed" });
168
168
  ```
169
169
 
170
170
  确实拿到全部物理调用的最终记录后,再调用 `ctx.sealUsage({ state: "complete" })`。
171
+
172
+ ## 让模型用途名称参与类型检查
173
+
174
+ 从 0.18 起,共享声明让同一评估可用于多个实验,同时在编译时检查用途名称:
175
+
176
+ ```ts title="models.ts"
177
+ import { defineModelRoles } from "niceeval";
178
+
179
+ export const roles = defineModelRoles({
180
+ mind: { model: "provider/planner" },
181
+ speech: { model: "provider/speaker" },
182
+ });
183
+ ```
184
+
185
+ 在已有 Adapter 的绑定工厂上声明要求。也可解构 `adapter.defineScoreEval`,但根入口的同名工厂不接受 `requires`:
186
+
187
+ ```ts title="evals/cache.eval.ts"
188
+ import { atLeast, ratio } from "niceeval/expect";
189
+ import { adapter } from "../adapter";
190
+ import { roles } from "../models";
191
+
192
+ export default adapter.defineScoreEval({
193
+ requires: { models: roles },
194
+ test(t) {
195
+ t.check(t.usage.cacheRead.rate("mind"), atLeast(ratio(0.6))).gate();
196
+ // rate("mimd") 会产生 TypeScript 错误;rate() 仍查询全部用途的合计。
197
+ },
198
+ });
199
+ ```
200
+
201
+ 实验使用 `defineExperiment({ adapter, models: roles, evals: ["cache"] })`。
202
+ 其它实验可为这些用途选择不同模型;`requires` 要求用途存在,不要求模型值相同。
203
+ 加载实验时会检查它选中的全部评估,CLI 的标签或前缀过滤不能隐藏缺失用途。
204
+
205
+ 给 `defineAdapter` 也传入 `requires: { models: roles }`,即可同时收窄 `ctx.models` 和 `ctx.recordUsage` 的 `modelRole`。
206
+ `null` 或省略的 `modelRole` 仍表示未归属到用途的调用。已声明但本次没有调用时,`rate` 返回原因 `role-has-no-calls` 的不可用材料。
207
+
208
+ 0.17.x 中省略 `requires` 的写法在 0.18 继续兼容,名称仍在调用时校验。
209
+ 迁移时先提取共享声明,再给 Adapter 和绑定评估分别添加 `requires`。
210
+ 不要先把声明标注成 `Record<string, ModelRoleSelection>`,否则 TypeScript 已丢失具体键,无法检测拼写错误。
@@ -98,7 +98,7 @@ export default defineExperiment({
98
98
  });
99
99
  ```
100
100
 
101
- 这里不要写 `sandboxReuse: true`。`maxConcurrency: 4` 是整个 Experiment 的上限,不会让同组同时跑四个;剩下的并发位留给其它组和没分组的评估用例。
101
+ 这里不要写 `sandboxReuse: true`。`maxConcurrency: 4` 是整个 Experiment 的上限,不会让同组同时跑四个;剩下的并发名额留给其它组和没分组的评估用例。
102
102
 
103
103
  评估组只能和在 Sandbox 里运行的 Agent、支持复用的 Provider 一起用。不带 Sandbox 的 Agent 不能运行评估组。
104
104
 
@@ -25,7 +25,7 @@ export default defineEval({
25
25
  async test(t) {
26
26
  const turn = await t.send("修复测试并说明原因。");
27
27
 
28
- t.check(turn.message, includes("原因")).label("说明失败原因");
28
+ t.check(turn.reply, includes("原因")).label("说明失败原因");
29
29
 
30
30
  const tests = await t.sandbox.runCommand("pnpm", ["test"]);
31
31
  await t.check(tests, commandSucceeded()).label("测试通过").orStop();
@@ -40,7 +40,7 @@ Boolean `matched` 进入 Verdict;`mismatched` 使最终 Verdict 为 `failed`
40
40
  `similarity(...)` 这类 Match 产生 `[0, 1]` 的 measurement。它计算字符级 Levenshtein 编辑相似度,不判断语义。通过制评估在 handle 上用 `.gate(minimum)` 建立质量门:
41
41
 
42
42
  ```ts
43
- t.check(turn.message, similarity(expected))
43
+ t.check(turn.reply, similarity(expected))
44
44
  .gate(0.8)
45
45
  .label("回答接近期望内容");
46
46
  ```
@@ -66,7 +66,7 @@ export default defineScoreEval({
66
66
  t.check(health, commandSucceeded()).score(1).label("健康检查可达");
67
67
  t.check(health.stdout, includes("ok")).score(1).label("健康检查内容正确");
68
68
 
69
- t.check(turn.message, includes("验证")).score(2).label("回复说明验证方法");
69
+ t.check(turn.reply, includes("验证")).score(2).label("回复说明验证方法");
70
70
 
71
71
  t.score(1).label("代码精简");
72
72
  },
@@ -89,7 +89,7 @@ export default defineScoreEval({
89
89
  ## Judge 也是 Measurement
90
90
 
91
91
  `defineJudge` 声明一个受管 Judge Match。作者把完成判断所需的值组成带语义字段的材料。
92
- 裁判可以直接传给 `t.judge`,无需在评估上登记。模型默认使用项目的 `judgeRuntime`;单题只换模型时设置 `judge: "judge-model"`。
92
+ 裁判可以直接传给 `t.judge`,无需在评估上登记。模型默认使用项目的 `judgeProvider`;单题只换模型时设置 `judge: "judge-model"`。
93
93
 
94
94
  ```ts
95
95
  const explainsMotive = defineJudge({
@@ -105,7 +105,7 @@ export default defineEval({
105
105
  async test(t) {
106
106
  const change = "把缓存键加入模型版本";
107
107
  const turn = await t.send(`说明这项变更的动机和风险:${change}`);
108
- const material = { change, explanation: turn.message };
108
+ const material = { change, explanation: turn.reply };
109
109
  t.judge(material, explainsMotive).gate(0.8).label("变更动机");
110
110
  t.judge(material, explainsRisk).gate(0.8).label("具体风险");
111
111
  },
@@ -1,31 +1,31 @@
1
1
  ---
2
2
  title: "启动实验共享服务"
3
3
  sidebarTitle: "实验共享服务"
4
- description: "用 Experiment 的 setup / teardown 启停整个实验共用的隧道、mock server 或租约,把运行时地址交给 Agent 和 Sandbox,又不让它作废已有结果。"
4
+ description: "用 Experiment 的 before / after 启停整个实验共用的隧道、mock server 或租约,把运行时地址交给 Agent 和 Sandbox,又不让它作废已有结果。"
5
5
  ---
6
6
 
7
7
  你在评估一个接入了记忆服务的 Coding Agent。记忆服务跑在内网,每次评估前要先开一条隧道,拿到一个临时地址,再把地址告诉 Agent。隧道开一次就够,几十个 Attempt 共用;全部跑完后要记得关掉。
8
8
 
9
- 这类“一个实验一份、所有 Attempt 共用”的资源,写进 Experiment 的 `setup` 和 `teardown`。
9
+ 这类“一个实验一份、所有 Attempt 共用”的资源,写进 Experiment 的 `before` 和 `after`。
10
10
 
11
- ## 写一对 setup / teardown
11
+ ## 写一对 before / after
12
12
 
13
13
  ```ts
14
14
  // experiments/memory/codex.ts
15
15
  import { defineExperiment } from "niceeval";
16
16
  import { nowledgeAgent, nowledgeTunnel } from "../../agents/nowledge.ts";
17
17
 
18
- // setup 拿到的坐标放在模块变量里,teardown 和 Agent 都能读到
18
+ // before 拿到的坐标放在模块变量里,after 和 Agent 都能读到
19
19
  let tunnel: { url: string; apiKey: string; stop(): Promise<void> } | undefined;
20
20
 
21
21
  export default defineExperiment({
22
22
  agent: nowledgeAgent(() => ({ url: tunnel!.url, apiKey: tunnel!.apiKey })),
23
23
  evals: ["memory/"],
24
- async setup(ctx) {
24
+ async before(ctx) {
25
25
  ctx.progress({ message: "starting nowledge tunnel" });
26
26
  tunnel = await nowledgeTunnel({ signal: ctx.signal });
27
27
  },
28
- async teardown(ctx) {
28
+ async after(ctx) {
29
29
  ctx.progress({ message: "stopping nowledge tunnel" });
30
30
  await tunnel?.stop();
31
31
  },
@@ -34,23 +34,23 @@ export default defineExperiment({
34
34
 
35
35
  两个回调在你自己的机器上执行,各自最多跑一次:
36
36
 
37
- - `setup` 在这个实验第一个要真正执行的 Attempt 之前运行。
38
- - `teardown` 在全部 Attempt 结束后运行,运行被中断时也会执行。
39
- - 只要 `setup` 开始过,`teardown` 就一定会执行,`setup` 抛错也一样。所以 `teardown` 里要防御变量还没赋值的情况,上面用的是 `tunnel?.stop()`。
37
+ - `before` 在这个实验第一个要真正执行的 Attempt 之前运行。
38
+ - `after` 在全部 Attempt 结束后运行,运行被中断时也会执行。
39
+ - 只要 `before` 开始过,`after` 就一定会执行,`before` 抛错也一样。所以 `after` 里要防御变量还没赋值的情况,上面用的是 `tunnel?.stop()`。
40
40
  - 上次的结果全部能沿用、这次一个 Attempt 都不用真正执行时,两者都不会运行。
41
41
 
42
- `setup` 运行期间,终端 `ACTIVE` 区会显示一行 `experiment setup · <实验 id>`,`ctx.progress(...)` 的消息更新在这一行末尾。这时该实验的 Attempt 计入排队数,不是卡住了。
42
+ `before` 运行期间,终端 `ACTIVE` 区会显示一行 `experiment before · <实验 id>`,`ctx.progress(...)` 的消息更新在这一行末尾。这时该实验的 Attempt 计入排队数,不是卡住了。
43
43
 
44
- ## setup 失败时会发生什么
44
+ ## before 失败时会发生什么
45
45
 
46
- `setup` 抛错时,这个实验的每个 Attempt 都记为 `errored`,错误码是 `experiment-setup-failed`。同一批里的其它实验照常运行。环境没起来不会被算成通过,也不会拖累别的实验。
46
+ `before` 抛错时,这个实验的每个 Attempt 都记为 `errored`,错误码是 `experiment-setup-failed`。同一批里的其它实验照常运行。环境没起来不会被算成通过,也不会拖累别的实验。
47
47
 
48
- ## teardown 里先保证释放
48
+ ## after 里先保证释放
49
49
 
50
50
  释放资源是必须做到的事,健康检查、上报指标这类观测只是尽力而为。用 `try/finally` 包住,观测出错也不能挡住释放;运行被中断时直接跳过观测:
51
51
 
52
52
  ```ts
53
- async teardown(ctx) {
53
+ async after(ctx) {
54
54
  try {
55
55
  if (!ctx.signal.aborted) {
56
56
  await tunnel?.probe({ timeoutMs: 10_000 }).catch(() => {});
@@ -76,7 +76,7 @@ export default defineExperiment({
76
76
  .before(async (sandbox) => {
77
77
  await sandbox.writeText(".nowledge/env", `NMEM_URL=${endpoint!}\n`);
78
78
  }),
79
- async setup(ctx) {
79
+ async before(ctx) {
80
80
  endpoint = (await nowledgeTunnel({ signal: ctx.signal })).url;
81
81
  },
82
82
  });
@@ -95,12 +95,12 @@ $ pnpm exec niceeval exp compare/codex--nowledge
95
95
  判断一个值该放哪里,问一句:它是不是你想比较的实验条件?
96
96
 
97
97
  - 是,例如记忆服务的版本号 `0.10.39`,换版本行为可能真的不同,写进 `flags`,变了就该重跑。
98
- - 不是,只是这一次的连接坐标,留在 `setup` 和模块变量里。
98
+ - 不是,只是这一次的连接坐标,留在 `before` 和模块变量里。
99
99
  - 只用来给报告分组的标注,写 `labels`。
100
100
 
101
101
  ## 在 Sandbox 里准备环境
102
102
 
103
- `setup` / `teardown` 管的是你机器上的服务。Agent 运行前要在 Sandbox 里做的准备,例如写入配置、装二进制、载入上次保存的状态,挂在 `sandbox` 的 `.before()` 上。它对每个真正执行的 Attempt 跑一次,一定晚于 `setup`,所以能读到 `setup` 赋好的变量:
103
+ `before` / `after` 管的是你机器上的服务。Agent 运行前要在 Sandbox 里做的准备,例如写入配置、装二进制、载入上次保存的状态,挂在 `sandbox` 的 `.before()` 上。它对每个真正执行的 Attempt 跑一次,一定晚于 `before`,所以能读到 `before` 赋好的变量:
104
104
 
105
105
  ```ts
106
106
  // experiments/compare/claude--nowledge.ts
@@ -128,16 +128,16 @@ export default defineExperiment({
128
128
  await saveMemoryState(sandbox, ctx.experimentId);
129
129
  });
130
130
  }),
131
- async setup(ctx) {
131
+ async before(ctx) {
132
132
  tunnel = await nowledgeTunnel({ signal: ctx.signal });
133
133
  },
134
- async teardown() {
134
+ async after() {
135
135
  await tunnel?.stop();
136
136
  },
137
137
  });
138
138
  ```
139
139
 
140
- 从上往下读,这个文件就是完整的运行说明:整个实验一份的服务在 `setup` / `teardown`,每个 Sandbox 的准备和收尾在 `.before()` 和 `ctx.onCleanup`。
140
+ 从上往下读,这个文件就是完整的运行说明:整个实验一份的服务在 `before` / `after`,每个 Sandbox 的准备和收尾在 `.before()` 和 `ctx.onCleanup`。
141
141
 
142
142
  Agent CLI、系统包这类固定不变的安装,最好先做进镜像或 template。NiceEval 会复用没变的准备步骤,不会因为评估用例改了就重装一遍。做法见 [预制 Sandbox 环境 · 从官方基线继续构建](/zh/tutorials/prebuilt-sandbox#从官方基线继续构建)。
143
143
 
@@ -164,18 +164,18 @@ export function nowledgeLifecycle() {
164
164
  let env: { url: string; apiKey: string } | undefined;
165
165
 
166
166
  return {
167
- /** Agent 工厂经它读连接信息,setup 之后才有值 */
167
+ /** Agent 工厂经它读连接信息,before 之后才有值 */
168
168
  endpoint: () => env!,
169
169
 
170
- async setup(ctx: ExperimentHookContext) {
170
+ async before(ctx: ExperimentHookContext) {
171
171
  instance = `exp-${ctx.experimentId.replace(/[^A-Za-z0-9]+/g, "-")}`;
172
172
  ctx.progress({ message: `[nowledge] activating ${instance}` });
173
173
  await memctl("up", instance);
174
174
  env = await readInstanceEnv(instance);
175
175
  },
176
176
 
177
- async teardown() {
178
- if (!instance) return; // setup 还没起实例就失败了,没有要清理的
177
+ async after() {
178
+ if (!instance) return; // before 还没起实例就失败了,没有要清理的
179
179
  await memctl("down", instance);
180
180
  },
181
181
 
@@ -198,15 +198,15 @@ const nowledge = nowledgeLifecycle();
198
198
  export default defineExperiment({
199
199
  agent: codexAgent(nowledgeCodexConfig(nowledge.endpoint)),
200
200
  sandbox: e2bSandbox({ template: CODEX_TEMPLATE }).before(nowledge.sandboxBefore()),
201
- setup: nowledge.setup,
202
- teardown: nowledge.teardown,
201
+ before: nowledge.before,
202
+ after: nowledge.after,
203
203
  maxConcurrency: 1,
204
204
  });
205
205
  ```
206
206
 
207
207
  这样写要守住两条,多个实验并发运行时才不会互相覆盖:
208
208
 
209
- - 工厂函数被调用时只创建闭包,不做 I/O,也不读配置。`niceeval exp` 在发现阶段就会 import 实验文件,这时抛错会连累同一批里无关的实验。所有可能失败的操作都放进 `setup`。
209
+ - 工厂函数被调用时只创建闭包,不做 I/O,也不读配置。`niceeval exp` 在发现阶段就会 import 实验文件,这时抛错会连累同一批里无关的实验。所有可能失败的操作都放进 `before`。
210
210
  - 运行时坐标放在工厂闭包里,不放在模块级单例里。并行的两个实验各持一份,互不覆写。
211
211
 
212
212
  服务起多份太贵、必须让同一批实验共用一个实例时,用引用计数:第一个进来的启动,最后一个离开的关闭。
@@ -218,12 +218,12 @@ let starting: Promise<void> | undefined;
218
218
  let service: { url: string; stop(): Promise<void> } | undefined;
219
219
 
220
220
  export const sharedNowledge = {
221
- async setup() {
221
+ async before() {
222
222
  refs += 1;
223
223
  starting ??= startNowledge().then((s) => { service = s; });
224
224
  await starting; // 并发的实验等同一次启动
225
225
  },
226
- async teardown() {
226
+ async after() {
227
227
  refs -= 1;
228
228
  if (refs === 0) {
229
229
  await service?.stop(); // 启动失败时 service 没有值
@@ -234,10 +234,10 @@ export const sharedNowledge = {
234
234
  };
235
235
  ```
236
236
 
237
- 因为 `setup` 开始过就一定会配对执行 `teardown`,计数总能回到 0,不会泄漏。
237
+ 因为 `before` 开始过就一定会配对执行 `after`,计数总能回到 0,不会泄漏。
238
238
 
239
239
  ## 跨多次运行存在的服务
240
240
 
241
- `setup` 启动的服务活不过这一次 `niceeval exp`。需要先起好、连续跑好几次的服务,用 `docker compose` 这类外部工具启停,再通过环境变量把地址传给 Adapter。
241
+ `before` 启动的服务活不过这一次 `niceeval exp`。需要先起好、连续跑好几次的服务,用 `docker compose` 这类外部工具启停,再通过环境变量把地址传给 Adapter。
242
242
 
243
- `setup` 和 `teardown` 的完整参数见 [Experiment](/zh/explanation/experiment)。Sandbox 准备步骤的顺序、缓存和收尾见 [Sandbox · 按顺序准备 Sandbox](/zh/tutorials/sandbox-providers#按顺序准备-sandbox)。
243
+ `before` 和 `after` 的完整参数见 [Experiment](/zh/explanation/experiment)。Sandbox 准备步骤的顺序、缓存和收尾见 [Sandbox · 按顺序准备 Sandbox](/zh/tutorials/sandbox-providers#按顺序准备-sandbox)。
@@ -95,35 +95,9 @@ export default defineEval({
95
95
 
96
96
  错误消息会出现在终端和运行记录中。请写明发生了什么,以及下一步怎么修复。
97
97
 
98
- ## 识别运行中断开的共享服务
98
+ ## 共享服务在执行中断开
99
99
 
100
- 有些共享服务在实验开始时正常,却在运行中断开。这种失败通常由 SDK、CLI 或网络库抛出。你可以用实验的 `classifyFailure` 识别自己的服务地址:
101
-
102
- ```ts
103
- // experiments/compare.ts
104
- import { defineExperiment } from "niceeval";
105
-
106
- const serviceHost = "memory.internal.example";
107
-
108
- export default defineExperiment({
109
- // agent 和 sandbox 配置省略
110
- classifyFailure({ text }) {
111
- const isOurService = text.includes(serviceHost);
112
- const isConnectionFailure = /ECONNREFUSED|ENOTFOUND|connection refused/i.test(text);
113
-
114
- if (isOurService && isConnectionFailure) {
115
- return {
116
- retryable: false,
117
- scope: "experiment",
118
- reason: "shared_service_unavailable",
119
- };
120
- }
121
- return undefined;
122
- },
123
- });
124
- ```
125
-
126
- 只识别你能确定影响范围的服务。不要把所有 `ECONNREFUSED` 都当成实验级故障,因为 Agent 访问其他站点时也可能出现同样的错误。
100
+ 在能够确认影响范围的调用边界捕获 SDK 错误,抛出 `ExperimentFatalError` 或 `EvalFatalError`,并通过 cause 保留原始错误。Experiment 不再接受 `classifyFailure`;内建重试规则与 Adapter 的 `classifySendFailure` 保留。
127
101
 
128
102
  ## 修好后补跑没完成的部分
129
103
 
@@ -1,176 +1,82 @@
1
1
  ---
2
- title: "用 Plugin 复用一整套运行条件"
2
+ title: "用 Plugin 复用运行条件"
3
3
  sidebarTitle: "Plugin"
4
- description: "同一套“先在宿主机起服务、再在 Sandbox 里准备环境”的条件要在多个 Experiment、评估组或评估用例里用时,用 definePlugin 写一次,到处挂载。"
4
+ description: "把 Agent 扩展、Sandbox 步骤与宿主生命周期装进一个可复用的实验条件。"
5
5
  ---
6
6
 
7
- 你的几个对比实验都要接同一个记忆服务:在宿主机上开一条隧道,再在 Sandbox 里写入连接配置、装好命令行工具。把这些代码复制到每个 Experiment 里,改一处就要改好几处。
7
+ 多个 Experiment 使用相同 Skill、MCP 服务或环境准备时,把条件写成一个 Plugin,再通过 `plugins` 数组挂载。
8
+ Plugin 声明条件;Sandbox template 仍由 Eval、Eval Group 或 Experiment 的 `sandbox` 字段提供。
8
9
 
9
- Plugin 把这样一整套条件写在一起:它叫什么、宿主机上要起停什么、Sandbox 里要执行哪些准备命令。写好后挂到 Experiment、评估组或评估用例上就能复用。
10
+ ## 定义实例或工厂
10
11
 
11
- Plugin 只负责条件本身,不负责选环境:用哪个 Docker 镜像、E2B template 或 Vercel snapshot,仍由 `sandbox` 字段决定。
12
-
13
- Agent 自己的 Skill、MCP server 和原生 Plugin 也不归这里管,它们仍传给 Agent factory,例如 `codexAgent({ plugins: [...] })`。
14
-
15
- ## 第 1 步:写一个 Plugin
16
-
17
- 把这套条件写成一个 Plugin,放在几个 Experiment 都能导入的位置。所有 Plugin API 从 `niceeval/plugin` 导入。
18
-
19
- 下面这个例子在宿主机上起停记忆服务,并在 Sandbox 里上传插件文件、写入连接配置:
12
+ 对象定义直接得到实例,函数定义得到单参数工厂。`name` 与 `identity` 必填;`key` 默认 `"default"`。
20
13
 
21
14
  ```ts
22
- // experiments/shared/memory.ts
23
15
  import { definePlugin } from "niceeval/plugin";
24
- import {
25
- changeFrequency,
26
- sandboxLayer,
27
- uploadDirectory,
28
- writeText,
29
- } from "niceeval/sandbox";
30
-
31
- type MemoryOptions = {
32
- readonly model: string;
33
- };
34
-
35
- export const memory = definePlugin<MemoryOptions>({
36
- name: "acme.memory",
37
- behaviorRevision: "2",
38
- instanceKey: ({ model }) => model,
39
-
40
- experiment: ({ model }) => ({
41
- identity: { model },
42
- setup: (context) => {
43
- context.progress({ message: `启动 ${model} memory service` });
44
- },
45
- teardown: (context) => {
46
- context.progress({ message: `停止 ${model} memory service` });
47
- },
48
- }),
49
-
50
- sandbox: ({ model }) => sandboxLayer()
51
- .before(uploadDirectory({
52
- id: "memory-plugin-files",
53
- source: new URL("fixtures/memory-plugin/", import.meta.url),
54
- to: ".agents/plugins/memory",
55
- changeFrequency: changeFrequency.rare,
56
- }))
57
- .before(writeText({
58
- id: "memory-plugin-config",
59
- path: ".memory/config.json",
60
- text: JSON.stringify({ model }),
61
- changeFrequency: changeFrequency.frequent,
62
- })),
63
- });
64
- ```
65
-
66
- 几个字段各管一件事:
67
-
68
- - `name` 和 `instanceKey` 一起区分同一个 Plugin 的不同实例,这里按 `model` 区分。
69
- - `experiment` 里的 `setup` / `teardown` 在宿主机上运行,适合起停服务、开隧道。
70
- - `sandbox` 返回一个 `sandboxLayer()`,里面用和普通代码相同的 `.before()` / `.after()` 准备 Sandbox。
71
-
72
- Sandbox 里的准备步骤用内置的 `uploadDirectory()`、`writeText()`、`gitCheckout()`、`shell()` 等函数写。它们和 Experiment、评估用例里的准备步骤一起排序,没变的步骤在 Docker 上可以直接沿用上次的准备结果。Plugin 不需要自己处理上传或 clone。
73
-
74
- 需要运行时才能决定的分支,可以在返回的 layer 里写 `.before(async (sandbox, context) => ...)`。这种回调每次都真实执行,它后面的准备步骤也不再沿用缓存。成功取得资源后,立即用 `context.onCleanup()` 登记释放。
75
-
76
- <Warning>
77
- `sandbox` 必须返回 `sandboxLayer()`。返回 `dockerSandbox()`、`e2bSandbox()` 这类选择了镜像或 template 的 layer,会在加载定义时报错。Plugin 不能替换调用方选择的 Provider。
78
- </Warning>
79
-
80
- ### 从 Git 仓库取 Plugin 源码
81
-
82
- Plugin 源码在一个能 clone 的仓库里时,用 `gitCheckout()`,`ref` 填完整的 commit ID。branch 或 tag 会移动,NiceEval 无法据此判断内容变没变,所以不接受:
83
-
84
- ```ts
85
- import {
86
- gitCheckout,
87
- sandboxLayer,
88
- } from "niceeval/sandbox";
89
-
90
- const pluginSource = sandboxLayer().before(gitCheckout({
91
- id: "memory-plugin-source",
92
- repository: "https://github.com/acme/memory-plugin.git",
93
- ref: "0123456789abcdef0123456789abcdef01234567",
94
- to: ".agents/plugins/memory",
16
+ import { writeText } from "niceeval/sandbox";
17
+
18
+ export const memory = definePlugin(({ version }: { version: string }) => ({
19
+ name: "example.memory",
20
+ identity: { version },
21
+ agent: { skills: [{ kind: "local", path: "./skills/memory" }] },
22
+ sandbox: {
23
+ before: writeText({ id: "memory-mode", path: "/tmp/memory-mode", text: version }),
24
+ },
25
+ experiment: {
26
+ before: (ctx) => ctx.progress({ message: "Prepare memory service" }),
27
+ after: (ctx) => ctx.progress({ message: "Release memory service" }),
28
+ },
95
29
  }));
96
30
  ```
97
31
 
98
- 源码在本地目录时用 `uploadDirectory()`,`source` 写成相对当前文件的 `new URL("...", import.meta.url)`。目录里的文件内容、权限和 symlink 变化都会被自动发现:改一个文件,只有上传这个目录的步骤和它后面的步骤会重新执行。
99
-
100
- ## 第 2 步:挂到 Experiment、评估组或评估用例
101
-
102
- 只用一两个 Plugin 时,直接传数组:
103
-
104
32
  ```ts
105
33
  export default defineExperiment({
106
- agent: codexAgent(),
107
- plugins: [memory({ model: "gpt-5.6-luna" })],
108
- sandbox: dockerSandbox({
109
- source: { type: "image", image: "niceeval/codex:0.144.1-r1" },
110
- }),
34
+ adapter: codexAgent(),
35
+ plugins: [memory({ version: "1" })],
111
36
  });
112
37
  ```
113
38
 
114
- 几个 Experiment 共用一组 Plugin、又各自再加几个时,用 `pluginStack()` 组合。`.use()` 追加一个 Plugin,`.concat()` 合并两组。每次调用都返回新值,原来那组不变,可以放心从同一个基础上分叉:
115
-
116
- ```ts
117
- import { pluginStack } from "niceeval/plugin";
118
-
119
- const observability = pluginStack().use(telemetry());
120
- const withMemory = observability.use(memory({ model: "gpt-5.6-luna" }));
39
+ `before` 与 `after` 接受一个元素或数组。共享一组条件时使用普通数组展开:`plugins: [...basePlugins, condition]`。
40
+ 同一 Attempt 的生效集合中,`name` 和 `key` 的组合必须唯一,包括跨 Experiment、Eval Group 与 Eval 的重复挂载。
121
41
 
122
- export default defineExperiment({
123
- agent: codexAgent(),
124
- plugins: withMemory,
125
- sandbox: dockerSandbox({
126
- source: { type: "image", image: "niceeval/codex:0.144.1-r1" },
127
- }),
128
- });
129
- ```
42
+ ## 选择执行范围
130
43
 
131
- 类型检查会拦住挂错位置的 Plugin:只支持评估用例的 Plugin 不能放进 Experiment 的组合里,没有共同可挂位置的两组也不能合并。空的 `pluginStack()` 和不写 `plugins` 效果相同。
44
+ | 字段 | 执行时机 | 允许挂载位置 |
45
+ | --- | --- | --- |
46
+ | `agent` | 合并进内建 Agent factory | Experiment |
47
+ | `experiment` | 每个有 fresh Attempt 的 Run 一次 | Experiment |
48
+ | `group` | 每条有 fresh Attempt 的 Group lane 一次 | Experiment、Eval Group |
49
+ | `sandbox` | 每条 fresh Attempt,reset 之后 | Experiment、Eval Group、Eval |
50
+ | `attempt` | 每条 fresh Attempt 一次 | Experiment、Eval Group、Eval |
132
51
 
133
- 组合不会自动去重。同一个位置出现两个 `name` 和 `instanceKey` 都相同的 Plugin 时,运行会在创建 Sandbox 前报错。删掉重复的那个,或者给它不同的 `instanceKey`。
52
+ 全部沿用历史结果时,这些 Hook 与 Sandbox 创建都不执行。before 按作者、Plugin 声明顺序运行;after 按已激活顺序逆序运行。
53
+ 宿主 after 失败记录 warning,并继续其余收尾;Agent after 失败会使 Attempt 失败,但仍继续剩余 after 与 finalizer。
134
54
 
135
- ## 宿主机上的准备每次跑几回
55
+ 回调需要 Group 时,声明 `requires: { evalGroup: true }`,即可直接读取 `ctx.evalGroup.id`。
56
+ 选中 Group 外的 Eval 会在创建资源前失败,包括全部沿用结果的情况。
136
57
 
137
- Plugin 可以在三个层级声明宿主机上的 `setup` / `teardown`:
58
+ ## 合并 Agent 扩展
138
59
 
139
- | 写在 | 运行次数 |
140
- | --- | --- |
141
- | `experiment(options)` | 每个这次确实要跑的 Experiment 一次 |
142
- | `group(options)` | 每个 Experiment 和评估组的组合一次 |
143
- | `eval(options)` | 每个确实要跑的 Attempt 一次 |
60
+ `agent.skills` 与 `agent.mcpServers` 提供通用扩展;`agent.codex`、`agent.claudeCode` 与 `agent.bub` 提供对应工厂的原生配置。
61
+ factory 配置在前,Plugin 按数组顺序追加。Skill 或 MCP 重名、原生插件冲突、多个 configFile 都会报错。
62
+ Bub 不接受 MCP;自定义 Adapter 不接受 agent 扩展。声明专用子项时,必须包含当前选择的 Agent。
144
63
 
145
- 每一层至少写 `setup` 或 `teardown` 之一,可以带 `identity`。多个 Plugin 的 `setup` 按挂载顺序运行,`teardown` 按相反顺序运行。整道题都沿用上次结果、不需要重跑时,这些回调不会运行。
64
+ ## 让条件变化触发重跑
146
65
 
147
- `sandbox(options)` 不是第四个层级。它只定义一次 Sandbox 准备步骤,NiceEval 把这些步骤放进 Plugin 所挂位置的 Sandbox 准备里。你不需要在 `.before()` 里再传一次 Plugin。
148
-
149
- ## 修改 Plugin 后让旧结果失效
150
-
151
- Plugin 的行为变了,沿用上次的结果就不再可信。NiceEval 能看到一部分变化,另一部分要你告诉它:
152
-
153
- - 改了宿主机 `setup` / `teardown` 的行为时,把 `behaviorRevision` 加一。NiceEval 看不到函数体的变化。
154
- - 改了 Sandbox 里的内置准备步骤(命令、文件、commit)时,不用做任何事,这些变化会被自动发现。
155
- - 自定义的准备步骤只在 NiceEval 观察不到的协议变化时,才补一个 `cache.fingerprint`。
156
-
157
- 改完后先用 `pnpm exec niceeval exp <experiment> --dry` 确认受影响的题会重跑。
158
-
159
- ## 运行前检查 Plugin 加进了哪些步骤
160
-
161
- 挂上 Plugin 后,先看它的准备步骤排在哪里,再花钱运行:
66
+ `identity` 是条件版本。受管 Action 内容、Skill 内容与配置文件内容也参与身份;MCP headers 与 env 不参与。
67
+ 只改 Experiment 模块里的回调函数体不会改变 Plugin 身份;需要重跑时修改 `identity` 或使用 `--rerun all`。
68
+ Eval 模块仍遵循源文件闭包规则。条件身份不会自动进入 `ctx.flags`,运行参数仍显式写在 flags 中。
162
69
 
163
70
  ```bash
164
71
  pnpm exec niceeval debug compare/codex memory/smoke
165
- pnpm exec niceeval debug compare/codex memory/smoke --json
72
+ pnpm exec niceeval show --exp compare/codex
73
+ pnpm exec niceeval show --exp compare/codex --json
166
74
  ```
167
75
 
168
- `debug` 把 Plugin 加入的步骤和 Experiment、评估组、评估用例、Agent 的步骤放进同一份计划。终端里每一步显示它来自哪里、执行序号、`changeFrequency`、依赖和能否沿用缓存;`--json` 给出相同的结构。
169
-
170
- Plugin 的步骤没出现在计划里时,先检查 `plugins` 是否挂在了你选中的 Experiment 或评估用例上。
76
+ `debug` 展示展开步骤、实际 Action 顺序与 Plugin 来源。`show` 和 `view` 的 Experiment 信息列出 Plugin 的 name、key 与 identity。
171
77
 
172
78
  ## 接着看
173
79
 
174
- - [Sandbox · 按顺序准备 Sandbox](/zh/tutorials/sandbox-providers#按顺序准备-sandbox)——准备步骤、频率、缓存与收尾。
175
- - [评估组](/zh/tutorials/eval-groups)——评估组的准备步骤怎样进入同一顺序。
176
- - [运行前检查 Sandbox 计划](/zh/tutorials/debug-lifecycle-plan)——查看 Plugin 加入后的完整计划。
80
+ - [Sandbox 准备](/zh/tutorials/sandbox-providers)
81
+ - [评估组](/zh/tutorials/eval-groups)
82
+ - [检查生命周期计划](/zh/tutorials/debug-lifecycle-plan)