niceeval 0.4.3 → 0.4.5

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 (179) hide show
  1. package/README.md +21 -12
  2. package/README.zh.md +8 -9
  3. package/docs-site/.mintignore +13 -0
  4. package/docs-site/AGENTS.md +46 -0
  5. package/docs-site/concepts/adapter.mdx +287 -0
  6. package/docs-site/concepts/assert.mdx +243 -0
  7. package/docs-site/concepts/drive.mdx +118 -0
  8. package/docs-site/concepts/evals.mdx +108 -0
  9. package/docs-site/concepts/experiment.mdx +37 -0
  10. package/docs-site/concepts/hitl.mdx +83 -0
  11. package/docs-site/concepts/judge.mdx +129 -0
  12. package/docs-site/concepts/overview.mdx +98 -0
  13. package/docs-site/concepts/tier.mdx +42 -0
  14. package/docs-site/docs-ref/00-index.md +23 -0
  15. package/docs-site/docs-ref/01-page-types.md +43 -0
  16. package/docs-site/docs-ref/03-style-rules.md +45 -0
  17. package/docs-site/docs-ref/04-code-examples.md +37 -0
  18. package/docs-site/docs-ref/05-dx-failure-paths.md +45 -0
  19. package/docs-site/docs-ref/06-checklists.md +53 -0
  20. package/docs-site/docs.json +256 -0
  21. package/docs-site/example/ai-agent-application.mdx +148 -0
  22. package/docs-site/example/claude-code-codex-plugin.mdx +162 -0
  23. package/docs-site/example/claude-code-codex-skill.mdx +147 -0
  24. package/docs-site/example/showcase.mdx +39 -0
  25. package/docs-site/example/tier1-ai-sdk-v7.mdx +136 -0
  26. package/docs-site/example/tier1-claude-sdk.mdx +119 -0
  27. package/docs-site/example/tier1-codex-sdk.mdx +111 -0
  28. package/docs-site/example/tier1-langgraph.mdx +119 -0
  29. package/docs-site/example/tier1-pi-sdk.mdx +119 -0
  30. package/docs-site/favicon.svg +5 -0
  31. package/docs-site/github-diff.css +135 -0
  32. package/docs-site/github-diff.js +11 -0
  33. package/docs-site/guides/authoring.mdx +129 -0
  34. package/docs-site/guides/ci-integration.mdx +97 -0
  35. package/docs-site/guides/connect-otel.mdx +209 -0
  36. package/docs-site/guides/connect-your-agent.mdx +221 -0
  37. package/docs-site/guides/dataset-fanout.mdx +98 -0
  38. package/docs-site/guides/experiments.mdx +71 -0
  39. package/docs-site/guides/fixtures.mdx +147 -0
  40. package/docs-site/guides/reporters.mdx +113 -0
  41. package/docs-site/guides/runner.mdx +79 -0
  42. package/docs-site/guides/sandbox-agent.mdx +138 -0
  43. package/docs-site/guides/sandbox-backends.mdx +64 -0
  44. package/docs-site/guides/scoring-guide.mdx +92 -0
  45. package/docs-site/guides/viewing-results.mdx +195 -0
  46. package/docs-site/guides/write-experiment.mdx +81 -0
  47. package/docs-site/guides/write-send.mdx +347 -0
  48. package/docs-site/images/adapter-tiers-zh.svg +60 -0
  49. package/docs-site/images/agent-turn-roundtrip-en.svg +62 -0
  50. package/docs-site/images/agent-turn-roundtrip-zh.svg +77 -0
  51. package/docs-site/images/hitl-handshake-zh.svg +89 -0
  52. package/docs-site/images/logo.svg +6 -0
  53. package/docs-site/index.mdx +181 -0
  54. package/docs-site/introduction.mdx +141 -0
  55. package/docs-site/quickstart.mdx +136 -0
  56. package/docs-site/reference/builtin-agents.mdx +161 -0
  57. package/docs-site/reference/capabilities.mdx +76 -0
  58. package/docs-site/reference/cli.mdx +120 -0
  59. package/docs-site/reference/define-agent.mdx +168 -0
  60. package/docs-site/reference/define-config.mdx +41 -0
  61. package/docs-site/reference/define-eval.mdx +160 -0
  62. package/docs-site/reference/events.mdx +131 -0
  63. package/docs-site/reference/expect.mdx +112 -0
  64. package/docs-site/tracker.js +8 -0
  65. package/docs-site/zh/concepts/adapter.mdx +286 -0
  66. package/docs-site/zh/concepts/assert.mdx +243 -0
  67. package/docs-site/zh/concepts/drive.mdx +118 -0
  68. package/docs-site/zh/concepts/evals.mdx +124 -0
  69. package/docs-site/zh/concepts/experiment.mdx +37 -0
  70. package/docs-site/zh/concepts/hitl.mdx +83 -0
  71. package/docs-site/zh/concepts/judge.mdx +130 -0
  72. package/docs-site/zh/concepts/overview.mdx +109 -0
  73. package/docs-site/zh/concepts/tier.mdx +44 -0
  74. package/docs-site/zh/example/ai-agent-application.mdx +152 -0
  75. package/docs-site/zh/example/claude-code-codex-plugin.mdx +163 -0
  76. package/docs-site/zh/example/claude-code-codex-skill.mdx +147 -0
  77. package/docs-site/zh/example/showcase.mdx +39 -0
  78. package/docs-site/zh/example/tier1-ai-sdk-v7.mdx +140 -0
  79. package/docs-site/zh/example/tier1-claude-sdk.mdx +122 -0
  80. package/docs-site/zh/example/tier1-codex-sdk.mdx +117 -0
  81. package/docs-site/zh/example/tier1-langgraph.mdx +123 -0
  82. package/docs-site/zh/example/tier1-pi-sdk.mdx +122 -0
  83. package/docs-site/zh/guides/agent-feedback-loop.mdx +79 -0
  84. package/docs-site/zh/guides/authoring.mdx +129 -0
  85. package/docs-site/zh/guides/ci-integration.mdx +97 -0
  86. package/docs-site/zh/guides/connect-otel.mdx +208 -0
  87. package/docs-site/zh/guides/connect-your-agent.mdx +226 -0
  88. package/docs-site/zh/guides/dataset-fanout.mdx +83 -0
  89. package/docs-site/zh/guides/experiments.mdx +72 -0
  90. package/docs-site/zh/guides/fixtures.mdx +147 -0
  91. package/docs-site/zh/guides/official-adapters.mdx +132 -0
  92. package/docs-site/zh/guides/reporters.mdx +113 -0
  93. package/docs-site/zh/guides/runner.mdx +82 -0
  94. package/docs-site/zh/guides/sandbox-agent.mdx +139 -0
  95. package/docs-site/zh/guides/sandbox-backends.mdx +75 -0
  96. package/docs-site/zh/guides/scoring-guide.mdx +92 -0
  97. package/docs-site/zh/guides/viewing-results.mdx +195 -0
  98. package/docs-site/zh/guides/write-experiment.mdx +101 -0
  99. package/docs-site/zh/guides/write-send.mdx +353 -0
  100. package/docs-site/zh/index.mdx +180 -0
  101. package/docs-site/zh/introduction.mdx +140 -0
  102. package/docs-site/zh/quickstart.mdx +137 -0
  103. package/docs-site/zh/reference/builtin-agents.mdx +364 -0
  104. package/docs-site/zh/reference/capabilities.mdx +76 -0
  105. package/docs-site/zh/reference/cli.mdx +140 -0
  106. package/docs-site/zh/reference/define-agent.mdx +461 -0
  107. package/docs-site/zh/reference/define-config.mdx +107 -0
  108. package/docs-site/zh/reference/define-eval.mdx +674 -0
  109. package/docs-site/zh/reference/events.mdx +252 -0
  110. package/docs-site/zh/reference/expect.mdx +208 -0
  111. package/package.json +3 -2
  112. package/src/agents/bub.ts +1 -1
  113. package/src/agents/claude-code.ts +8 -5
  114. package/src/agents/codex.ts +9 -5
  115. package/src/agents/sdk-streams.test.ts +4 -4
  116. package/src/agents/sdk-streams.ts +14 -9
  117. package/src/agents/types.ts +40 -1
  118. package/src/agents/ui-message-stream.ts +1 -0
  119. package/src/cli.ts +40 -10
  120. package/src/context/types.ts +140 -0
  121. package/src/expect/index.ts +15 -8
  122. package/src/i18n/en.ts +20 -6
  123. package/src/i18n/zh-CN.ts +20 -6
  124. package/src/o11y/parsers/bub.test.ts +71 -0
  125. package/src/o11y/parsers/bub.ts +5 -0
  126. package/src/o11y/types.ts +27 -2
  127. package/src/runner/attempt.ts +2 -1
  128. package/src/runner/reporters/artifacts.ts +11 -3
  129. package/src/runner/reporters/live.ts +45 -8
  130. package/src/runner/run.test.ts +50 -0
  131. package/src/runner/run.ts +135 -41
  132. package/src/runner/types.ts +55 -2
  133. package/src/sandbox/types.ts +18 -0
  134. package/src/scoring/types.ts +5 -0
  135. package/src/shared/types.ts +3 -0
  136. package/src/util.test.ts +26 -1
  137. package/src/util.ts +16 -0
  138. package/src/view/app/App.tsx +2 -2
  139. package/src/view/app/components/AttemptModal.tsx +2 -0
  140. package/src/view/app/components/CopyControls.tsx +87 -28
  141. package/src/view/app/i18n.ts +3 -3
  142. package/src/view/client-dist/app.css +1 -1
  143. package/src/view/client-dist/app.js +18 -18
  144. package/docs/README.md +0 -120
  145. package/docs/adapters/README.md +0 -60
  146. package/docs/adapters/authoring.md +0 -179
  147. package/docs/adapters/coding-agent-skills-plugins.md +0 -324
  148. package/docs/adapters/collection.md +0 -128
  149. package/docs/adapters/contract.md +0 -264
  150. package/docs/adapters/reference/agent-eval.md +0 -215
  151. package/docs/adapters/reference/agent-loop-apis.md +0 -69
  152. package/docs/adapters/reference/claude-code-otel-telemetry.md +0 -100
  153. package/docs/adapters/reference/eve-protocol.md +0 -127
  154. package/docs/adapters/reference/otel-genai.md +0 -107
  155. package/docs/adapters/reference/otel-instrumentation.md +0 -65
  156. package/docs/adapters/targets.md +0 -99
  157. package/docs/architecture.md +0 -140
  158. package/docs/assertions.md +0 -387
  159. package/docs/capabilities-by-construction.md +0 -48
  160. package/docs/cli.md +0 -173
  161. package/docs/concepts.md +0 -106
  162. package/docs/e2e-ci.md +0 -332
  163. package/docs/eval-authoring.md +0 -319
  164. package/docs/experiments.md +0 -157
  165. package/docs/getting-started.md +0 -224
  166. package/docs/multi-agent.md +0 -145
  167. package/docs/observability.md +0 -337
  168. package/docs/origin-integration.md +0 -195
  169. package/docs/references.md +0 -35
  170. package/docs/reports.md +0 -551
  171. package/docs/results-format.md +0 -228
  172. package/docs/results-lib.md +0 -191
  173. package/docs/runner.md +0 -104
  174. package/docs/sandbox.md +0 -276
  175. package/docs/scoring.md +0 -119
  176. package/docs/source-map.md +0 -126
  177. package/docs/tier-sync.md +0 -193
  178. package/docs/view.md +0 -194
  179. package/docs/vision.md +0 -88
@@ -0,0 +1,461 @@
1
+ ---
2
+ title: "defineAgent 和 defineSandboxAgent:adapter 参考"
3
+ sidebarTitle: "defineAgent"
4
+ description: "defineAgent 和 defineSandboxAgent 参考:AgentContext、AgentSession、Sandbox 接口和共享 sandbox helpers。"
5
+ ---
6
+
7
+ 每个 [NiceEval](https://niceeval.com/) agent 都是一个 adapter:一段知道如何驱动特定 backend,并把输出转成标准事件流的代码。runner 只调用 `agent.send(input, ctx)`。
8
+
9
+ ![一次 t.send 的完整往返:eval 调用 t.send,运行器组装 TurnInput 与 ctx,adapter 返回标准事件流 Turn。](/images/agent-turn-roundtrip-zh.svg)
10
+
11
+ ## `defineAgent`
12
+
13
+ 用于 direct agent 接入:
14
+
15
+ ```ts
16
+ import { defineAgent } from "niceeval/adapter";
17
+ ```
18
+
19
+ `defineAgent` 产出的 `Agent.kind` 恒为 `"remote"`(内部判别字段,不用你声明)。`t` 上没有需要声明才解锁的能力位——`t.sandbox` 这类文件系统断言只在 `defineSandboxAgent` 构造的 agent(`kind: "sandbox"`)上才有,其余全靠 `send` 实际返回了什么事件/`ctx.session` 用没用来判断,详见[能力位参考](/zh/reference/capabilities)。字段全集见下方「Agent 与 Adapter Context 字段」。
20
+
21
+ ### direct agent 示例
22
+
23
+ ```ts
24
+ export default defineAgent({
25
+ name: "echo",
26
+ async send(input) {
27
+ return {
28
+ status: "completed",
29
+ events: [{ type: "message", role: "assistant", text: input.text }],
30
+ };
31
+ },
32
+ });
33
+ ```
34
+
35
+ ## `input`(`TurnInput`)
36
+
37
+ <ResponseField name="text" type="string">
38
+ 当前 `t.send(...)` 传入的文本。
39
+ </ResponseField>
40
+
41
+ <ResponseField name="files" type="readonly InputFile[] | undefined">
42
+ 本轮附带的文件(图片等)。不支持多模态的 adapter 可以忽略它。
43
+ </ResponseField>
44
+
45
+ <ResponseField name="responses" type="readonly InputResponse[] | undefined">
46
+ 仅回答轮(`t.respond` / `t.respondAll`)出现:逐请求的结构化回答,按 `requestId` 对位。
47
+ </ResponseField>
48
+
49
+ ## `defineSandboxAgent`
50
+
51
+ 用于 coding agent CLI。产出的 `Agent.kind` 恒为 `"sandbox"`——`t.sandbox`、`t.sandbox.fileChanged()` 等文件系统断言只在这类 agent 上解锁。字段全集同样见下方「Agent 与 Adapter Context 字段」的 `SandboxAgentDef`;`ctx.sandbox`(`Sandbox` 接口)的完整方法见再下方「Sandbox 接口」。
52
+
53
+ ```ts
54
+ import { defineSandboxAgent } from "niceeval/adapter";
55
+
56
+ export default defineSandboxAgent({
57
+ name: "my-cli-agent",
58
+ async send(input, ctx) {
59
+ await ctx.sandbox.runCommand("my-agent", ["run", input.text]);
60
+ return { status: "completed", events: [] };
61
+ },
62
+ });
63
+ ```
64
+
65
+ ## 注册
66
+
67
+ ```ts
68
+ import { defineExperiment } from "niceeval";
69
+ import echo from "./agents/echo";
70
+
71
+ export default defineExperiment({
72
+ agent: echo,
73
+ runs: 1,
74
+ });
75
+ ```
76
+
77
+ ## Agent 与 Adapter Context 字段
78
+
79
+ `defineAgent`(`RemoteAgentDef`)、`defineSandboxAgent`(`SandboxAgentDef`)的构造参数,以及两者的 `send(input, ctx)` 都会拿到的 `ctx`(`AgentContext`):
80
+
81
+ {/* GENERATED:BEGIN agent-def */}
82
+
83
+ ### `RemoteAgentDef`
84
+
85
+ #### `name`
86
+
87
+ ```ts
88
+ name: string;
89
+ ```
90
+
91
+ agent 的显示名/标识,原样进入 `Agent.name`——不是注册表查找 key,只用于展示、结果归属与去重指纹。
92
+
93
+ #### `setup`
94
+
95
+ ```ts
96
+ setup?: AgentSetup;
97
+ ```
98
+
99
+ 每个 attempt 一次(remote agent 没有真实沙箱,运行器会传入一个仅含 `workdir`/`sandboxId`/
100
+ `otlpHost`/`stop` 等元信息的 stub `Sandbox`,其余方法调用即抛错——不要在这里调用
101
+ 文件/命令类沙箱方法)。常用于建立连接、鉴权等一次性准备。可返回一个 cleanup 闭包,
102
+ 与 `teardown` 都在 finally 里跑。
103
+
104
+ #### `tracing`
105
+
106
+ ```ts
107
+ tracing?: AgentTracing;
108
+ ```
109
+
110
+ OTLP 导出配置:远程被测对象怎么把 trace 发到 endpoint(env-based 注入 / file-based 配置)。
111
+
112
+ #### `spanMapper`
113
+
114
+ ```ts
115
+ spanMapper?: SpanMapper;
116
+ ```
117
+
118
+ 原生 span → canonical 的薄 mapper;省略走通用 heuristic。只影响瀑布图。
119
+
120
+ #### `send`
121
+
122
+ ```ts
123
+ send(input: TurnInput, ctx: AgentContext): Promise<Turn>;
124
+ ```
125
+
126
+ 每轮一次:把一轮 prompt 发给远程被测对象(HTTP/SDK 等),解析响应成 events。
127
+
128
+ #### `teardown`
129
+
130
+ ```ts
131
+ teardown?: AgentTeardown;
132
+ ```
133
+
134
+ 运行结束前的清理(与 setup 返回的 cleanup 一起、都在 finally 里跑一次)。
135
+
136
+ ### `SandboxAgentDef`
137
+
138
+ #### `name`
139
+
140
+ ```ts
141
+ name: string;
142
+ ```
143
+
144
+ agent 的显示名/标识,原样进入 `Agent.name`——不是注册表查找 key,只用于展示、结果归属与去重指纹。
145
+
146
+ #### `setup`
147
+
148
+ ```ts
149
+ setup?: AgentSetup;
150
+ ```
151
+
152
+ 每个沙箱一次(不是每轮一次):装 CLI、写 config.toml / 鉴权配置(model/base/auth 等
153
+ 本轮内不变的东西)。运行器在沙箱备好(上传/基线/eval.setup 之后)、第一次 send 前
154
+ 调用一次。可返回一个 cleanup 闭包,与 `teardown` 一起在 finally 里跑。
155
+
156
+ #### `tracing`
157
+
158
+ ```ts
159
+ tracing?: AgentTracing;
160
+ ```
161
+
162
+ OTLP 导出配置:沙箱里怎么让 CLI 把 trace 发到 endpoint(env / 配置文件),从 setup 拆出。
163
+
164
+ #### `spanMapper`
165
+
166
+ ```ts
167
+ spanMapper?: SpanMapper;
168
+ ```
169
+
170
+ 原生 span → canonical 的薄 mapper;省略走通用 heuristic。只影响瀑布图。
171
+
172
+ #### `send`
173
+
174
+ ```ts
175
+ send(input: TurnInput, ctx: AgentContext): Promise<Turn>;
176
+ ```
177
+
178
+ 每轮一次:跑 prompt(fresh / resume)+ 解析成 events。
179
+
180
+ #### `teardown`
181
+
182
+ ```ts
183
+ teardown?: AgentTeardown;
184
+ ```
185
+
186
+ 沙箱销毁前的清理(与 setup 返回的 cleanup 一起、都在 finally 里跑一次)。
187
+
188
+ ### `AgentContext`
189
+
190
+ #### `signal`
191
+
192
+ ```ts
193
+ readonly signal: AbortSignal;
194
+ ```
195
+
196
+ 软取消信号:合并了 attempt 超时、run 级中断(用户 Ctrl+C)与 eval 自身的中断请求
197
+ (见 src/runner/attempt.ts)。adapter 可以选择性检查它(或直接传给 `fetch`)以提前
198
+ 优雅退出,但这不是唯一的硬边界——即便 adapter 完全忽略它,运行器也会用
199
+ `Effect.timeoutTo` 兜底强制收尾(停沙箱容器)。
200
+
201
+ #### `model`
202
+
203
+ ```ts
204
+ readonly model?: string;
205
+ ```
206
+
207
+ 本次 attempt 用的模型名,透传自 experiment 的 `model` 字段。sandbox 型 agent 通常在 setup 里用它写配置,remote 型通常在 send 里用它选模型。
208
+
209
+ #### `reasoningEffort`
210
+
211
+ ```ts
212
+ readonly reasoningEffort?: string;
213
+ ```
214
+
215
+ 模型推理努力程度;归属同 model——实验决定,省略时不覆盖 agent 原生默认。
216
+
217
+ #### `flags`
218
+
219
+ ```ts
220
+ readonly flags: Readonly<Record<string, unknown>>;
221
+ ```
222
+
223
+ experiment 的 `flags` 字段原样透传,内容和结构完全由 experiment 作者自定义
224
+ (如 `{ webResearch: true }`、`{ systemPrompt: "..." }`)。adapter 按自己的约定
225
+ 读取其中的字段;框架本身不解释、不校验它的内容。与 CLI 解析出的同名 `flags`
226
+ (跑法层面的 --timeout/--budget 等)是两个不相关的概念。
227
+
228
+ #### `sandbox`
229
+
230
+ ```ts
231
+ readonly sandbox: Sandbox;
232
+ ```
233
+
234
+ 仅沙箱型 agent 有(运行器按 --sandbox 备好)。
235
+
236
+ #### `session`
237
+
238
+ ```ts
239
+ readonly session: AgentSession;
240
+ ```
241
+
242
+ #### `telemetry`
243
+
244
+ ```ts
245
+ readonly telemetry?: Telemetry;
246
+ ```
247
+
248
+ 仅当配置了 OTel 接入时有(agent 的 `tracing` 块 / config 的 telemetry 存在):
249
+ 本次运行的 OTLP traces 接收信息(endpoint + env-based 导出 env)。
250
+ 怎么把它交给 CLI 由 agent 的 `tracing` 块声明:env-based 的把 ctx.telemetry.env
251
+ spread 进 send;file-based 的在 tracing.configure 里写配置。远程 HTTP 接入的 send
252
+ 只需要把 headers spread 进请求头(每轮一个新 traceparent);端点是启动期配置
253
+ (defineConfig(&#123; telemetry: &#123; port &#125; &#125;))固定的,不从这里传。
254
+
255
+ #### `log`
256
+
257
+ ```ts
258
+ log(msg: string): void;
259
+ ```
260
+
261
+ 写一行进运行器自身的进度日志(落 stderr,或调用方传入的 `onProgress` 回调)。
262
+ 超时失败时,最近若干行会并入结果的 error 信息,方便定位卡在哪一步。
263
+ 与 `Sandbox.appendLog` 是两回事:那个是把一行写进容器自己的原生日志
264
+ (`docker logs` 能看到),这里只是运行器的观测通道。
265
+
266
+ {/* GENERATED:END agent-def */}
267
+
268
+ `ctx.session`(`AgentSession`)是一条会话线的状态槽:同一条会话线的每次 `send` 拿到同一个 `ctx.session`,新会话线(eval 第一轮 / `t.newSession()` 之后)拿到一个全新的。存取器:
269
+
270
+ - `id?: string` / `capture(id): void` —— 会话续接·服务端记历史时用:`id` 是本线记过的会话 id(新线是 `undefined`),`capture` 记回传的 id(只在还没记过时落地)。
271
+ - `history<TMsg>(): { get(): TMsg[]; commit(messages: TMsg[]): void }` —— 会话续接·客户端带全量历史时用。
272
+ - `hold<T>(state: T): void` / `take<T>(): T | undefined` —— HITL 停轮现场的存取,`take` 取到即清除(一次消费)。
273
+ - `state: Record<string, unknown>` —— 逃生舱,起始 `{}`,框架从不写入。
274
+
275
+ 完整契约见[Adapter 概念](/zh/concepts/adapter#上下文:agentcontext)。
276
+
277
+ ## Sandbox 接口
278
+
279
+ 沙箱型 agent 的 `ctx.sandbox`(`Sandbox`)是当前隔离环境的句柄;`CommandOptions` 是 `runCommand` / `runShell` 的可选项:
280
+
281
+ {/* GENERATED:BEGIN sandbox-methods */}
282
+
283
+ ### `Sandbox`
284
+
285
+ #### `workdir`
286
+
287
+ ```ts
288
+ readonly workdir: string;
289
+ ```
290
+
291
+ 沙箱内项目/工作区根目录的绝对路径(agent 命令的默认 cwd,也是 git baseline 提交的位置)。各方法的相对路径都以此为基准解析,省略 `cwd`/`targetDir` 时也落到这里。
292
+
293
+ #### `runCommand`
294
+
295
+ ```ts
296
+ runCommand(cmd: string, args?: string[], opts?: CommandOptions): Promise<CommandResult>;
297
+ ```
298
+
299
+ 执行单个命令,`args` 作为独立 argv 传递、不经 shell 解释(无 `&&`、管道、通配符展开)。
300
+ 只想跑一个可执行文件、参数来自外部输入、担心注入时优先用它。
301
+
302
+ #### `runShell`
303
+
304
+ ```ts
305
+ runShell(script: string, opts?: CommandOptions): Promise<CommandResult>;
306
+ ```
307
+
308
+ 执行一整段脚本,经 shell(bash)解释,支持 `&&`、管道、`$()`、重定向等。
309
+ 需要拼多条命令或做条件判断时用它。
310
+
311
+ #### `readFile`
312
+
313
+ ```ts
314
+ readFile(path: string): Promise<string>;
315
+ ```
316
+
317
+ 读取沙箱内文件的文本内容(UTF-8)。文件不存在时抛错,不返回空字符串——需要容错请自行 `.catch()`。
318
+
319
+ #### `fileExists`
320
+
321
+ ```ts
322
+ fileExists(path: string): Promise<boolean>;
323
+ ```
324
+
325
+ 检查沙箱内路径是否存在。跨后端语义不完全一致:仅保证对普通文件可靠,对目录路径的行为不同后端不保证一致。
326
+
327
+ #### `readSourceFiles`
328
+
329
+ ```ts
330
+ readSourceFiles(opts?: ReadSourceFilesOptions): Promise<SourceFiles>;
331
+ ```
332
+
333
+ 一次 shell 往返读全部源码文件(按扩展名收、按目录/文件名忽略)。
334
+ 取代每个 eval 目录里手写的 find + 逐文件 readFile。
335
+
336
+ #### `writeFiles`
337
+
338
+ ```ts
339
+ writeFiles(files: Record<string, string>, targetDir?: string): Promise<void>;
340
+ ```
341
+
342
+ 写入若干文本文件(内容已在内存里的字符串);是 `uploadFiles` 的文本特化,省略 `targetDir` 落到 workdir。
343
+
344
+ #### `uploadFiles`
345
+
346
+ ```ts
347
+ uploadFiles(files: SandboxFile[], targetDir?: string): Promise<void>;
348
+ ```
349
+
350
+ 批量写入若干文件,内容可以是文本或二进制 Buffer;省略 `targetDir` 落到 workdir。
351
+
352
+ #### `uploadDirectory`
353
+
354
+ ```ts
355
+ uploadDirectory(localDir: string, targetDir?: string, opts?: { ignore?: string[] }): Promise<void>;
356
+ ```
357
+
358
+ 把本地磁盘上的一个目录整体上传进沙箱(递归读取本地文件后按 `uploadFiles` 写入);`opts.ignore` 是排除规则,省略 `targetDir` 落到 workdir。
359
+
360
+ #### `stop`
361
+
362
+ ```ts
363
+ stop(): Promise<void>;
364
+ ```
365
+
366
+ 销毁沙箱占用的计算资源(容器/microVM)。调用后沙箱不可再用;是否可安全重复调用因后端而异,不要依赖这一点。
367
+
368
+ #### `sandboxId`
369
+
370
+ ```ts
371
+ readonly sandboxId: string;
372
+ ```
373
+
374
+ 本沙箱的稳定标识(各后端原生 ID,如 Docker 容器 ID 前缀);用于跨调用关联同一沙箱的会话状态,也用于日志展示。
375
+
376
+ #### `otlpHost`
377
+
378
+ ```ts
379
+ readonly otlpHost: string | null;
380
+ ```
381
+
382
+ 本地 OTLP 接收器的目标 host。
383
+ - `string`:沙箱内可通过该 hostname 回连宿主 OTLP 端口(如 docker 的 `host.docker.internal`)。
384
+ - `null`:沙箱运行在远程云端(如 e2b/vercel),无法访问宿主本地端口 → 跳过 tracing。
385
+ 可通过环境变量 `NICEEVAL_OTLP_HOST` 强制覆盖(如配置 tunnel 时)。
386
+
387
+ #### `appendLog`
388
+
389
+ ```ts
390
+ appendLog?(line: string): Promise<void>;
391
+ ```
392
+
393
+ 可选:把一行写进容器的「主日志」(PID1 在 tail 它)——于是 `docker logs` /
394
+ Docker UI 的 Logs 标签页能实时看到 agent 逐轮活动。docker 后端实现,其它可省略。
395
+
396
+ #### `downloadFile`
397
+
398
+ ```ts
399
+ downloadFile(path: string): Promise<Buffer>;
400
+ ```
401
+
402
+ 从沙箱内任意路径读取文件,返回二进制 Buffer。
403
+ 对应各 backend:Docker getArchive / Vercel readFileToBuffer / e2b files.read(bytes) / …
404
+
405
+ #### `uploadFile`
406
+
407
+ ```ts
408
+ uploadFile(path: string, content: Buffer): Promise<void>;
409
+ ```
410
+
411
+ 向沙箱内任意路径写入文件(二进制)。
412
+ 对应各 backend:Docker putArchive / Vercel fs.writeFile(Buffer) / e2b files.write / …
413
+
414
+ ### `CommandOptions`
415
+
416
+ #### `env`
417
+
418
+ ```ts
419
+ env?: Record<string, string>;
420
+ ```
421
+
422
+ 追加/覆盖本命令的环境变量(与沙箱默认环境叠加,不清空默认值;各后端会保留自己固定的 `PATH` 等变量,不保证能被这里覆盖)。
423
+
424
+ #### `cwd`
425
+
426
+ ```ts
427
+ cwd?: string;
428
+ ```
429
+
430
+ 本命令的工作目录;省略时落到 `Sandbox.workdir`。相对路径按 workdir 解析,绝对路径原样使用。
431
+
432
+ #### `stream`
433
+
434
+ ```ts
435
+ stream?: boolean;
436
+ ```
437
+
438
+ 把本命令的输出也送进沙箱的「原生日志流」(于是 `docker logs` / Docker UI 的 Logs
439
+ 标签页能实时看到它)。给 agent 命令(codex exec / bub run / claude)开它,就能在容器
440
+ 日志里看到 agent 的【原始输出】。后端各自实现(docker:tee 到 PID1 tail 的文件;
441
+ 不支持的后端忽略)—— 日志怎么浮现是 backend 的事,adapter 只声明意图。
442
+
443
+ #### `root`
444
+
445
+ ```ts
446
+ root?: boolean;
447
+ ```
448
+
449
+ 以 root 跑本命令。默认 `false` —— 命令以沙箱的标准**非 root** 用户跑(agent 的自然环境)。
450
+ 给 setup 阶段装系统依赖用(`apt-get install …`、`pip install --break-system-packages …`)。
451
+
452
+ 语义跨后端一致:"本命令以 root 跑,否则以标准非 root 用户跑"。各后端映射到自己的原生机制
453
+ (docker:`exec --user root`;E2B:`{ user: "root" }`;Vercel:`{ sudo: true }`;Daytona:`{ user }`)。
454
+ 本就全程 root 的后端(如 Modal)视作 no-op;完全无法提权的后端可不支持(抛错)—— 但**默认值与
455
+ 语义保持一致**,不因后端而变。
456
+
457
+ {/* GENERATED:END sandbox-methods */}
458
+
459
+ ## ctx 与 t
460
+
461
+ `ctx` 是 adapter 侧看到的运行上下文;`t` 是 eval 作者看到的测试上下文。两者使用同一批运行数据,但职责不同。
@@ -0,0 +1,107 @@
1
+ ---
2
+ title: "defineConfig:项目默认配置"
3
+ sidebarTitle: "defineConfig"
4
+ description: "defineConfig 参考:judge、reporters、并发、超时和 sandbox 默认值。"
5
+ ---
6
+
7
+ `defineConfig` 从根目录的 `niceeval.config.ts` 默认导出,只放项目级默认值。agent、model、flags、runs 和实验预算写在 `experiments/` 下的 `defineExperiment` 文件里。
8
+
9
+ ```ts
10
+ import { defineConfig } from "niceeval";
11
+
12
+ export default defineConfig({
13
+ judge: { model: "gpt-5.4-mini" },
14
+ maxConcurrency: 4,
15
+ timeoutMs: 300_000,
16
+ });
17
+ ```
18
+
19
+ ## Config 字段
20
+
21
+ {/* GENERATED:BEGIN config-fields */}
22
+
23
+ #### `name`
24
+
25
+ ```ts
26
+ name?: LocalizedText;
27
+ ```
28
+
29
+ 项目名,显示在 `niceeval view` 顶部 hero(`<h1>`),省略则回退到通用标题。
30
+ 可传字符串,或按 locale 提供多语言(如 `{ en: "...", "zh-CN": "..." }`),随 view 语言切换。
31
+
32
+ #### `sandbox`
33
+
34
+ ```ts
35
+ sandbox?: SandboxOption;
36
+ ```
37
+
38
+ 项目级默认沙箱后端(docker / vercel / e2b / custom);experiment / CLI flag 可覆盖。
39
+
40
+ #### `workspace`
41
+
42
+ ```ts
43
+ workspace?: string;
44
+ ```
45
+
46
+ 上传进沙箱的工作区根目录,省略则用项目根;eval 的 sandbox 视图从这里起步。
47
+
48
+ #### `judge`
49
+
50
+ ```ts
51
+ judge?: JudgeConfig;
52
+ ```
53
+
54
+ 项目级默认 judge 配置(model / baseUrl / apiKeyEnv);EvalDef.judge 可按 eval 覆盖。
55
+
56
+ #### `reporters`
57
+
58
+ ```ts
59
+ reporters?: Reporter[];
60
+ ```
61
+
62
+ 项目级默认 reporter 列表(如落盘 / 上传结果);EvalDef.reporters 会与它合并。
63
+
64
+ #### `maxConcurrency`
65
+
66
+ ```ts
67
+ maxConcurrency?: number;
68
+ ```
69
+
70
+ 项目级默认并发上限;CLI flag / env / experiment 的同名设置优先级更高。
71
+
72
+ #### `timeoutMs`
73
+
74
+ ```ts
75
+ timeoutMs?: number;
76
+ ```
77
+
78
+ 项目级默认单次 attempt 超时(毫秒);CLI flag / experiment / EvalDef 的同名设置优先级更高。
79
+
80
+ #### `telemetry`
81
+
82
+ ```ts
83
+ telemetry?: { host?: string; port?: number };
84
+ ```
85
+
86
+ OTLP 接收配置,niceeval 项目内唯一入口(不读 NICEEVAL_OTLP_* 环境变量)。
87
+ `port` 钉住接收端口(固定端口模式:长驻服务把 OTEL_EXPORTER_OTLP_ENDPOINT 一次性指到
88
+ `http://localhost:<port>/v1/traces`,跑多少次 eval 都不用改)。省略 = 每次运行动态分配
89
+ 临时端口(经 ctx.telemetry 交给 adapter)。代价:固定端口下同机同时只能跑一个 niceeval 进程,
90
+ 且该端口被别的进程占用时会报错——换一个空闲端口写回这里即可。
91
+ `host` 是报给 adapter 的接收端 hostname(而非监听地址,监听地址恒为 0.0.0.0):默认
92
+ "127.0.0.1";docker 沙箱型 tracing 需要 "host.docker.internal" 之类的场景,或配了隧道
93
+ 的远程接入,在这里覆盖。
94
+
95
+ #### `pricing`
96
+
97
+ ```ts
98
+ pricing?: Record<string, PriceOverride>;
99
+ ```
100
+
101
+ 内置价格表(`o11y/prices.json`)之上的用户覆盖 / 补充,按 model 查(见 Observability
102
+ · 用量与成本)。key 支持精确 model 名或 `provider/*` 通配(自托管/网关折扣按 provider 批量覆盖);
103
+ 精确 key 优先于通配。只在没有网关实测成本(`usage.costUSD`)时才会用到——实测优先于估算恒成立。
104
+
105
+ {/* GENERATED:END config-fields */}
106
+
107
+ [NiceEval](https://niceeval.com/) 把环境准备放在普通代码里:eval 自己需要的文件写在 `test(t)`,agent 自己的准备写在 adapter 的 `setup`。sandbox 后端不再从环境变量自动探测,也没有对应的 CLI flag——用 `niceeval/sandbox` 里的 `dockerSandbox()` / `vercelSandbox()` / `e2bSandbox()` 构造后填进 `sandbox` 字段(可以直接写在 experiment 上,也可以只写在这里作为项目级兜底:`exp.sandbox ?? config.sandbox`)。