niceeval 0.4.4 → 0.4.6

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 (177) 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 +15 -5
  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 +36 -7
  120. package/src/context/types.ts +140 -0
  121. package/src/expect/index.ts +15 -8
  122. package/src/i18n/en.ts +19 -6
  123. package/src/i18n/zh-CN.ts +19 -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/reporters/artifacts.ts +11 -3
  128. package/src/runner/reporters/live.ts +45 -8
  129. package/src/runner/run.ts +71 -21
  130. package/src/runner/types.ts +45 -2
  131. package/src/sandbox/types.ts +18 -0
  132. package/src/scoring/types.ts +5 -0
  133. package/src/shared/types.ts +3 -0
  134. package/src/util.test.ts +26 -1
  135. package/src/util.ts +16 -0
  136. package/src/view/app/App.tsx +2 -2
  137. package/src/view/app/components/AttemptModal.tsx +2 -0
  138. package/src/view/app/components/CopyControls.tsx +87 -28
  139. package/src/view/app/i18n.ts +3 -3
  140. package/src/view/client-dist/app.css +1 -1
  141. package/src/view/client-dist/app.js +18 -18
  142. package/docs/README.md +0 -120
  143. package/docs/adapters/README.md +0 -60
  144. package/docs/adapters/authoring.md +0 -179
  145. package/docs/adapters/coding-agent-skills-plugins.md +0 -324
  146. package/docs/adapters/collection.md +0 -128
  147. package/docs/adapters/contract.md +0 -264
  148. package/docs/adapters/reference/agent-eval.md +0 -215
  149. package/docs/adapters/reference/agent-loop-apis.md +0 -69
  150. package/docs/adapters/reference/claude-code-otel-telemetry.md +0 -100
  151. package/docs/adapters/reference/eve-protocol.md +0 -127
  152. package/docs/adapters/reference/otel-genai.md +0 -107
  153. package/docs/adapters/reference/otel-instrumentation.md +0 -65
  154. package/docs/adapters/targets.md +0 -99
  155. package/docs/architecture.md +0 -140
  156. package/docs/assertions.md +0 -387
  157. package/docs/capabilities-by-construction.md +0 -48
  158. package/docs/cli.md +0 -173
  159. package/docs/concepts.md +0 -106
  160. package/docs/e2e-ci.md +0 -332
  161. package/docs/eval-authoring.md +0 -319
  162. package/docs/experiments.md +0 -157
  163. package/docs/getting-started.md +0 -224
  164. package/docs/multi-agent.md +0 -145
  165. package/docs/observability.md +0 -337
  166. package/docs/origin-integration.md +0 -195
  167. package/docs/references.md +0 -35
  168. package/docs/reports.md +0 -551
  169. package/docs/results-format.md +0 -228
  170. package/docs/results-lib.md +0 -191
  171. package/docs/runner.md +0 -104
  172. package/docs/sandbox.md +0 -276
  173. package/docs/scoring.md +0 -119
  174. package/docs/source-map.md +0 -126
  175. package/docs/tier-sync.md +0 -193
  176. package/docs/view.md +0 -194
  177. package/docs/vision.md +0 -88
@@ -0,0 +1,140 @@
1
+ ---
2
+ title: "AI SDK v7 如何非侵入式接入 NiceEval"
3
+ sidebarTitle: "AI SDK v7 如何接入"
4
+ description: "一个 AI SDK v7 聊天应用,对着它的 HTTP 接口无侵入接入 NiceEval 前后的完整代码 diff:应用侧一行没改。"
5
+ ---
6
+
7
+ {/* 本文件由 scripts/gen-diff-code.ts 生成(pnpm run gen:diff-code),不要手工编辑 */}
8
+
9
+ 对比对象:
10
+
11
+ - **before**:[https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/origin/ai-sdk-v7](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/origin/ai-sdk-v7) —— 普通的 AI SDK v7 聊天应用(HTTP 服务器 + React 聊天 UI),还没接任何 eval。
12
+ - **after**:[https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/tier1/ai-sdk-v7](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/tier1/ai-sdk-v7) —— 同一个应用接入 NiceEval 之后的样子。
13
+
14
+ **接入方式**:内置 **`uiMessageStreamAgent`**——AI SDK UI Message Stream 协议(`useChat`
15
+ 后端的标准 SSE)的官方无侵入 adapter,adapter 文件只剩配置:端点在哪、请求体怎么带
16
+ `model`。会话重放、HITL 审批(`needsApproval` 工具的 part 改写重发)、工具/消息事件
17
+ 从协议帧直构,全是工厂内置行为;协议帧里没有 usage,这个示例没有用量断言。应用侧
18
+ `src/backend/*` 逐字节未变。要 OTel 瀑布图见 `tier2/`,feature A/B 见 `tier3/`。
19
+
20
+ 接入的全部代码变更(生成时从两个目录实测统计):
21
+
22
+ <table className="gd-summary"><tbody><tr><th>{"类别"}</th><th>{"文件数"}</th><th>{"行数"}</th></tr><tr><td>{"应用侧配置(必要:依赖声明)"}</td><td>{"3"}</td><td>{"+5 −1"}</td></tr><tr><td>{"adapter(必要:传输粘合,协议映射在官方包里)"}</td><td>{"2"}</td><td>{"+27"}</td></tr><tr><td>{"evals 与 experiments(评测内容,按需增长)"}</td><td>{"8"}</td><td>{"+141"}</td></tr><tr className="gd-total"><td>{"合计"}</td><td>{"13"}</td><td>{"+173 −1"}</td></tr></tbody></table>
23
+
24
+ ## 文件清单
25
+
26
+ ```text
27
+ ai-sdk-v7/
28
+ ├── package.json 修改
29
+ ├── tsconfig.json 修改
30
+ ├── pnpm-workspace.yaml 修改
31
+ ├── niceeval.config.ts 新增
32
+ ├── agents/
33
+ │ └── ai-sdk-v7.ts 新增
34
+ ├── evals/
35
+ │ ├── basic-qa.eval.ts 新增
36
+ │ ├── hitl-approve.eval.ts 新增
37
+ │ ├── hitl-deny.eval.ts 新增
38
+ │ ├── session-isolation.eval.ts 新增
39
+ │ └── weather-tool.eval.ts 新增
40
+ └── experiments/
41
+ ├── assistant.ts 新增
42
+ └── compare-models/
43
+ ├── deepseek-v4-flash.ts 新增
44
+ └── deepseek-v4-pro.ts 新增
45
+ ```
46
+
47
+ ## 应用侧的变更(只有依赖声明)
48
+
49
+ <div className="gd-file">
50
+ <div className="gd-head"><span className="gd-name">{"package.json"}</span><span className="gd-stats"><span className="gd-plus">{"+2"}</span></span></div>
51
+ <div className="gd-body">
52
+ <table className="gd-table"><tbody><tr className="gd-expand" data-fold="gdf10"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"展开 8 行未变更代码"}</td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"1"}</td><td className="gd-ln">{"1"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{"{"}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"2"}</td><td className="gd-ln">{"2"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"name\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"ai-sdk-v7-example\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"3"}</td><td className="gd-ln">{"3"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"version\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"0.1.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"4"}</td><td className="gd-ln">{"4"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"private\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"5"}</td><td className="gd-ln">{"5"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"type\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"module\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"6"}</td><td className="gd-ln">{"6"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"scripts\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"7"}</td><td className="gd-ln">{"7"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"dev\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"lsof -ti tcp:34001 | xargs kill -9 2>/dev/null; concurrently -k -n server,web -c blue,green "}</span><span className="gdt1">{"\\\""}</span><span className="gdt2">{"pnpm dev:server"}</span><span className="gdt1">{"\\\""}</span><span className="gdt2">{" "}</span><span className="gdt1">{"\\\""}</span><span className="gdt2">{"pnpm dev:web"}</span><span className="gdt1">{"\\\""}</span><span className="gdt2">{"\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf10"><td className="gd-ln">{"8"}</td><td className="gd-ln">{"8"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"dev:server\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"node --env-file .env --import tsx/esm --watch src/backend/server.ts\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"9"}</td><td className="gd-ln">{"9"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"dev:web\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"wait-on -t 30000 tcp:127.0.0.1:34001 && vite\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"10"}</td><td className="gd-ln">{"10"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"build\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"vite build\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"11"}</td><td className="gd-ln">{"11"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"start\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"node --env-file .env --import tsx/esm src/backend/server.ts\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"eval\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"12"}</td><td className="gd-ln">{"13"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"typecheck\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"tsc --noEmit\""}</span></td></tr><tr><td className="gd-ln">{"13"}</td><td className="gd-ln">{"14"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr><td className="gd-ln">{"14"}</td><td className="gd-ln">{"15"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"dependencies\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-expand" data-fold="gdf11"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"展开 15 行未变更代码"}</td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"15"}</td><td className="gd-ln">{"16"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@ai-sdk/openai\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^4.0.5\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"16"}</td><td className="gd-ln">{"17"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@ai-sdk/otel\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^1.0.11\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"17"}</td><td className="gd-ln">{"18"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@ai-sdk/react\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^4.0.5\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"18"}</td><td className="gd-ln">{"19"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@opentelemetry/api\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^1.9.1\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"19"}</td><td className="gd-ln">{"20"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@opentelemetry/exporter-trace-otlp-http\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^0.219.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"20"}</td><td className="gd-ln">{"21"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@opentelemetry/resources\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^2.8.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"21"}</td><td className="gd-ln">{"22"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@opentelemetry/sdk-trace-node\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^2.8.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"22"}</td><td className="gd-ln">{"23"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"ai\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^7.0.11\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"23"}</td><td className="gd-ln">{"24"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"react\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^19.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"24"}</td><td className="gd-ln">{"25"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"react-dom\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^19.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"25"}</td><td className="gd-ln">{"26"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"zod\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^4.1.8\""}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"26"}</td><td className="gd-ln">{"27"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"27"}</td><td className="gd-ln">{"28"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"devDependencies\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"28"}</td><td className="gd-ln">{"29"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@types/node\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^22.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf11"><td className="gd-ln">{"29"}</td><td className="gd-ln">{"30"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@types/react\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^19.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"30"}</td><td className="gd-ln">{"31"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@types/react-dom\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^19.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"31"}</td><td className="gd-ln">{"32"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"@vitejs/plugin-react\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^5.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"32"}</td><td className="gd-ln">{"33"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"concurrently\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^9.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"34"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"niceeval\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"file:../../../..\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"33"}</td><td className="gd-ln">{"35"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"tsx\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^4.19.2\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"34"}</td><td className="gd-ln">{"36"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"typescript\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^5.7.2\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"35"}</td><td className="gd-ln">{"37"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"vite\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^7.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"36"}</td><td className="gd-ln">{"38"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"wait-on\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^9.0.0\""}</span></td></tr><tr><td className="gd-ln">{"37"}</td><td className="gd-ln">{"39"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr><td className="gd-ln">{"38"}</td><td className="gd-ln">{"40"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr></tbody></table>
53
+ </div>
54
+ </div>
55
+
56
+ <div className="gd-file">
57
+ <div className="gd-head"><span className="gd-name">{"tsconfig.json"}</span><span className="gd-stats"><span className="gd-plus">{"+1"}</span><span className="gd-minus">{"−1"}</span></span></div>
58
+ <div className="gd-body">
59
+ <table className="gd-table"><tbody><tr className="gd-expand" data-fold="gdf12"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"展开 13 行未变更代码"}</td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"1"}</td><td className="gd-ln">{"1"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{"{"}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"2"}</td><td className="gd-ln">{"2"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"compilerOptions\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"3"}</td><td className="gd-ln">{"3"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"target\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"ES2022\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"4"}</td><td className="gd-ln">{"4"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"module\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"NodeNext\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"5"}</td><td className="gd-ln">{"5"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"moduleResolution\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"NodeNext\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"6"}</td><td className="gd-ln">{"6"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"lib\""}</span><span className="gdt0">{": ["}</span><span className="gdt2">{"\"ES2023\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"DOM\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"DOM.Iterable\""}</span><span className="gdt0">{"],"}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"7"}</td><td className="gd-ln">{"7"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"types\""}</span><span className="gdt0">{": ["}</span><span className="gdt2">{"\"node\""}</span><span className="gdt0">{"],"}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"8"}</td><td className="gd-ln">{"8"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"jsx\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"react-jsx\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"9"}</td><td className="gd-ln">{"9"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"strict\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"10"}</td><td className="gd-ln">{"10"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"noUncheckedIndexedAccess\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"false"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"11"}</td><td className="gd-ln">{"11"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"esModuleInterop\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"12"}</td><td className="gd-ln">{"12"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"skipLibCheck\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf12"><td className="gd-ln">{"13"}</td><td className="gd-ln">{"13"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"allowImportingTsExtensions\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"14"}</td><td className="gd-ln">{"14"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"noEmit\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr><td className="gd-ln">{"15"}</td><td className="gd-ln">{"15"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"forceConsistentCasingInFileNames\""}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span></td></tr><tr><td className="gd-ln">{"16"}</td><td className="gd-ln">{"16"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-del"><td className="gd-ln">{"17"}</td><td className="gd-ln"></td><td className="gd-sign">{"−"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"include\""}</span><span className="gdt0">{": ["}</span><span className="gdt2">{"\"src\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"vite.config.ts\""}</span><span className="gdt0">{"]"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt1">{"\"include\""}</span><span className="gdt0">{": ["}</span><span className="gdt2">{"\"src\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"vite.config.ts\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"niceeval.config.ts\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"agents\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"evals\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"experiments\""}</span><span className="gdt0">{"]"}</span></td></tr><tr><td className="gd-ln">{"18"}</td><td className="gd-ln">{"18"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr></tbody></table>
60
+ </div>
61
+ </div>
62
+
63
+ <div className="gd-file">
64
+ <div className="gd-head"><span className="gd-name">{"pnpm-workspace.yaml"}</span><span className="gd-stats"><span className="gd-plus">{"+2"}</span></span></div>
65
+ <div className="gd-body">
66
+ <table className="gd-table"><tbody><tr className="gd-expand" data-fold="gdf13"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"展开 6 行未变更代码"}</td></tr><tr className="gd-fold gdf13"><td className="gd-ln">{"1"}</td><td className="gd-ln">{"1"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt3">{"packages"}</span><span className="gdt0">{": []"}</span></td></tr><tr className="gd-fold gdf13"><td className="gd-ln">{"2"}</td><td className="gd-ln">{"2"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt3">{"allowBuilds"}</span><span className="gdt0">{":"}</span></td></tr><tr className="gd-fold gdf13"><td className="gd-ln">{"3"}</td><td className="gd-ln">{"3"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt3">{"esbuild"}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</span></td></tr><tr className="gd-fold gdf13"><td className="gd-ln">{"4"}</td><td className="gd-ln">{"4"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt3">{"minimumReleaseAgeExclude"}</span><span className="gdt0">{":"}</span></td></tr><tr className="gd-fold gdf13"><td className="gd-ln">{"5"}</td><td className="gd-ln">{"5"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" - "}</span><span className="gdt2">{"'@ai-sdk/gateway@4.0.8'"}</span></td></tr><tr className="gd-fold gdf13"><td className="gd-ln">{"6"}</td><td className="gd-ln">{"6"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" - "}</span><span className="gdt2">{"'@ai-sdk/openai@4.0.5'"}</span></td></tr><tr><td className="gd-ln">{"7"}</td><td className="gd-ln">{"7"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" - "}</span><span className="gdt2">{"'@ai-sdk/react@4.0.5'"}</span></td></tr><tr><td className="gd-ln">{"8"}</td><td className="gd-ln">{"8"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" - "}</span><span className="gdt2">{"'@ai-sdk/provider-utils@5.0.3'"}</span></td></tr><tr><td className="gd-ln">{"9"}</td><td className="gd-ln">{"9"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" - "}</span><span className="gdt2">{"ai@7.0.11"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" - "}</span><span className="gdt2">{"niceeval@0.1.1"}</span></td></tr><tr><td className="gd-ln">{"10"}</td><td className="gd-ln">{"11"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt3">{"overrides"}</span><span className="gdt0">{":"}</span></td></tr><tr><td className="gd-ln">{"11"}</td><td className="gd-ln">{"12"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt3">{"ai"}</span><span className="gdt0">{": "}</span><span className="gdt1">{"7.0.11"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt3">{"niceeval"}</span><span className="gdt0">{": "}</span><span className="gdt2">{"link:../../../.."}</span></td></tr></tbody></table>
67
+ </div>
68
+ </div>
69
+
70
+ ## 新增的 adapter、evals 与 experiments
71
+
72
+ <div className="gd-file">
73
+ <div className="gd-head"><span className="gd-name">{"niceeval.config.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+7"}</span></span></div>
74
+ <div className="gd-body">
75
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineConfig } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineConfig"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: { "}</span><span className="gdt2">{"\"zh-CN\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"AI SDK v7 HTTP 无侵入示例\""}</span><span className="gdt0">{", en: "}</span><span className="gdt2">{"\"AI SDK v7 HTTP non-invasive example\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" judge: { model: "}</span><span className="gdt2">{"\"gpt-5.4\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" timeoutMs: "}</span><span className="gdt1">{"60_000"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
76
+ </div>
77
+ </div>
78
+
79
+ <div className="gd-file">
80
+ <div className="gd-head"><span className="gd-name">{"agents/ai-sdk-v7.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+20"}</span></span></div>
81
+ <div className="gd-body">
82
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// ai-sdk-v7 的 adapter:内置 uiMessageStreamAgent 无侵入对接一个**已经在跑**的 AI SDK 应用"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (UI Message Stream 协议,https://ai-sdk.dev/docs/ai-sdk-ui/stream-protocol)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 应用怎么跑是应用自己的事(pnpm dev / 部署在哪都行),eval 侧不代管进程、不另开端口:"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// AI_SDK_V7_URL 指到哪就测哪,默认应用自己的本地默认端口 34001。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 断言依据(工具/消息/HITL)全部从协议帧直构,工厂替你做好。这是 Tier 1(只接 send);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 要 `niceeval view` 的调用瀑布图时升 Tier 2(../../tier2/ai-sdk-v7/):同一个文件加一行"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// settleMs、config 加一行 telemetry,evals/experiments 原样复用。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { uiMessageStreamAgent } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/adapter\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" process.env."}</span><span className="gdt1">{"AI_SDK_V7_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"??"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"http://127.0.0.1:34001\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"uiMessageStreamAgent"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: "}</span><span className="gdt2">{"\"ai-sdk-v7\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" url: "}</span><span className="gdt2">{"`${"}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt2">{"}/api/chat`"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 应用的 /api/chat 支持请求级选模型(GET /api/models 可查),ctx.model 直接透传,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// compare-models 的多模型对比不用动服务。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt5">{"body"}</span><span className="gdt0">{": ("}</span><span className="gdt7">{"ctx"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" ({ model: ctx.model }),"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
83
+ </div>
84
+ </div>
85
+
86
+ <div className="gd-file">
87
+ <div className="gd-head"><span className="gd-name">{"evals/basic-qa.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+19"}</span></span></div>
88
+ <div className="gd-body">
89
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这条 eval 验证 agent 能正常问答且不瞎调工具。断言依据全部来自 UI Message Stream 协议帧"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (uiMessageStreamAgent 直构);协议帧里没有 usage,所以这里不做用量断言(OTel span 只进瀑布图)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"测试 agent 能正常问答且不瞎调工具\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"turn"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"用一句话介绍一下你自己,这轮不用查天气也不用算数。\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" turn."}</span><span className="gdt5">{"expectOk"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"group"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"正常收发、没有多余工具调用\""}</span><span className="gdt0">{", () "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"succeeded"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"usedNoTools"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t.judge.autoevals."}</span><span className="gdt5">{"closedQA"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"助手是否用一两句话正常介绍了自己,而不是报错或答非所问?\""}</span><span className="gdt0">{")."}</span><span className="gdt5">{"gate"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"0.6"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
90
+ </div>
91
+ </div>
92
+
93
+ <div className="gd-file">
94
+ <div className="gd-head"><span className="gd-name">{"evals/hitl-approve.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+24"}</span></span></div>
95
+ <div className="gd-body">
96
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { equals } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// calculate 工具声明了 needsApproval:true(AI SDK 自己的 tool loop 停轮机制)。这条验证批准"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 分支:approve 之后工具正常执行,calledTool 的 status 是 \"completed\"。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 提示词不提\"审批\"——不同模型看到提示词里的\"审批\"字样,有的会倾向于用文字反问用户"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// \"可以吗\"而不是真的发起工具调用(在 pi-sdk / claude-sdk / langgraph 的接入里都复现过);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 审批门是 SDK 自动挂的,跟用户怎么问无关。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"HITL:calculate 经批准后正常执行\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"draft"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"用计算器算一下 (23+19)*3 等于多少\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(draft.status, "}</span><span className="gdt5">{"equals"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"waiting\""}</span><span className="gdt0">{"));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"requireInputRequest"}</span><span className="gdt0">{"({ action: "}</span><span className="gdt2">{"\"calculate\""}</span><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"approved"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"respond"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"approve\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" approved."}</span><span className="gdt5">{"succeeded"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"calledTool"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"calculate\""}</span><span className="gdt0">{", { status: "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"22"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"messageIncludes"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"/"}</span><span className="gdt8">{"126"}</span><span className="gdt2">{"/"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"23"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"24"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
97
+ </div>
98
+ </div>
99
+
100
+ <div className="gd-file">
101
+ <div className="gd-head"><span className="gd-name">{"evals/hitl-deny.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+23"}</span></span></div>
102
+ <div className="gd-body">
103
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { equals } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// deny 分支:人否决和工具故障是两回事——calledTool 的 status 应该是 \"rejected\","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// noFailedActions() 依然通过。有的模型被拒绝一次后会不死心、原样再试一次同一个工具调用"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (在 claude-sdk / langgraph 的接入里都复现过),不是 adapter 的映射 bug,是模型行为。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// deny 到它放弃为止,给个上限避免死循环。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"HITL:calculate 被拒绝后标记 rejected 而不是 failed\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"用计算器算一下 (23+19)*3 等于多少\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"requireInputRequest"}</span><span className="gdt0">{"({ action: "}</span><span className="gdt2">{"\"calculate\""}</span><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"let"}</span><span className="gdt0">{" denied "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"respond"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"deny\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"for"}</span><span className="gdt0">{" ("}</span><span className="gdt4">{"let"}</span><span className="gdt0">{" attempt "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt1">{"0"}</span><span className="gdt0">{"; attempt "}</span><span className="gdt4">{"<"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"3"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"&&"}</span><span className="gdt0">{" denied.status "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"waiting\""}</span><span className="gdt0">{"; attempt"}</span><span className="gdt4">{"++"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" denied "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"respond"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"deny\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(denied.status, "}</span><span className="gdt5">{"equals"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{"));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"calledTool"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"calculate\""}</span><span className="gdt0">{", { status: "}</span><span className="gdt2">{"\"rejected\""}</span><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"noFailedActions"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"22"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"23"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
104
+ </div>
105
+ </div>
106
+
107
+ <div className="gd-file">
108
+ <div className="gd-head"><span className="gd-name">{"evals/session-isolation.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+20"}</span></span></div>
109
+ <div className="gd-body">
110
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { includes, excludes } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这条 eval 专门验证跨轮记忆的两半承诺:同一 session 里第二轮记得住第一轮说的名字"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (客户端重放完整历史续接成功——这个应用服务端零状态,续接完全靠 adapter 按 sessionId 存取"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 完整 UIMessage[] 并原样重发);t.newSession() 造出的新 session 不共享历史。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"测试跨轮记忆与 newSession() 隔离\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"我叫小明,帮我记住这个名字。\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"recall"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"我刚才说我叫什么名字?\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" recall."}</span><span className="gdt5">{"messageIncludes"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"小明\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(t.reply, "}</span><span className="gdt5">{"includes"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"小明\""}</span><span className="gdt0">{"));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"fresh"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"newSession"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" fresh."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"我叫什么名字?\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(fresh.reply, "}</span><span className="gdt5">{"excludes"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"小明\""}</span><span className="gdt0">{"));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
111
+ </div>
112
+ </div>
113
+
114
+ <div className="gd-file">
115
+ <div className="gd-head"><span className="gd-name">{"evals/weather-tool.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+21"}</span></span></div>
116
+ <div className="gd-body">
117
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这条 eval 验证 agent 遇到实时天气问题时会调 get_weather,而不是直接编一个答案。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 工具断言完全来自 UI Message Stream 协议帧直构(uiMessageStreamAgent 内置),adapter 没有为它写一行帧映射。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"测试 agent 在天气问题中正确调用 get_weather 并基于结果作答\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"turn"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"北京今天天气怎么样?\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" turn."}</span><span className="gdt5">{"expectOk"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"group"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"调用 get_weather 且城市正确\""}</span><span className="gdt0">{", () "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"calledTool"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"get_weather\""}</span><span className="gdt0">{", { input: { city: "}</span><span className="gdt2">{"\"北京\""}</span><span className="gdt0">{" } });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"messageIncludes"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"/"}</span><span className="gdt8">{"°C"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"气温"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"天气"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"晴"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"多云"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"雨"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"阴"}</span><span className="gdt2">{"/"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t.judge.autoevals"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ."}</span><span className="gdt5">{"closedQA"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"助手是否给出了具体的天气数据(温度或天气状况),而不是拒绝回答或含糊其辞?\""}</span><span className="gdt0">{")"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ."}</span><span className="gdt5">{"atLeast"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"0.7"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
118
+ </div>
119
+ </div>
120
+
121
+ <div className="gd-file">
122
+ <div className="gd-head"><span className="gd-name">{"experiments/assistant.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+9"}</span></span></div>
123
+ <div className="gd-body">
124
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineExperiment } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" agent "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"../agents/ai-sdk-v7.ts\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 单配置基线:不比较模型,用请求体不传 model 时应用自己的默认值。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineExperiment"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"ai-sdk-v7:真实 AI SDK v7 后端(默认模型)\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" agent,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" runs: "}</span><span className="gdt1">{"1"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
125
+ </div>
126
+ </div>
127
+
128
+ <div className="gd-file">
129
+ <div className="gd-head"><span className="gd-name">{"experiments/compare-models/deepseek-v4-flash.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+13"}</span></span></div>
130
+ <div className="gd-body">
131
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineExperiment } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" agent "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"../../agents/ai-sdk-v7.ts\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// compare-models 组的一格:deepseek-v4-flash。一文件一配置(单 model),model 经 ctx.model"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 走请求体传给应用,同一个 server 实例服务所有 model,不用重启进程。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineExperiment"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"deepseek-v4-flash: 对比模型\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" agent,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" model: "}</span><span className="gdt2">{"\"deepseek-v4-flash\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" runs: "}</span><span className="gdt1">{"2"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" earlyExit: "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" budget: "}</span><span className="gdt1">{"2"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
132
+ </div>
133
+ </div>
134
+
135
+ <div className="gd-file">
136
+ <div className="gd-head"><span className="gd-name">{"experiments/compare-models/deepseek-v4-pro.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+12"}</span></span></div>
137
+ <div className="gd-body">
138
+ <table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineExperiment } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" agent "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"../../agents/ai-sdk-v7.ts\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// compare-models 组的一格:deepseek-v4-pro。与 deepseek-v4-flash.ts 钉住一切、只差 model。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineExperiment"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"deepseek-v4-pro: 对比模型\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" agent,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" model: "}</span><span className="gdt2">{"\"deepseek-v4-pro\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" runs: "}</span><span className="gdt1">{"2"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" earlyExit: "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" budget: "}</span><span className="gdt1">{"2"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
139
+ </div>
140
+ </div>