niceeval 0.4.6 → 0.5.1

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 (174) hide show
  1. package/docs-site/zh/concepts/adapter.mdx +6 -6
  2. package/docs-site/zh/concepts/experiment.mdx +7 -7
  3. package/docs-site/zh/concepts/overview.mdx +1 -1
  4. package/docs-site/zh/concepts/tier.mdx +6 -6
  5. package/docs-site/zh/guides/agent-feedback-loop.mdx +64 -21
  6. package/docs-site/zh/guides/connect-your-agent.mdx +7 -7
  7. package/docs-site/zh/guides/custom-reports.mdx +243 -0
  8. package/docs-site/zh/guides/experiments.mdx +3 -3
  9. package/docs-site/zh/guides/report-components.mdx +252 -0
  10. package/docs-site/zh/guides/reporters.mdx +1 -1
  11. package/docs-site/zh/guides/results-data.mdx +224 -0
  12. package/docs-site/zh/guides/runner.mdx +1 -1
  13. package/docs-site/zh/guides/sandbox-agent.mdx +2 -2
  14. package/docs-site/zh/guides/viewing-results.mdx +147 -77
  15. package/docs-site/zh/guides/write-experiment.mdx +9 -9
  16. package/docs-site/zh/guides/write-send.mdx +6 -6
  17. package/docs-site/zh/index.mdx +1 -1
  18. package/docs-site/zh/introduction.mdx +1 -1
  19. package/docs-site/zh/reference/cli.mdx +11 -3
  20. package/docs-site/zh/reference/define-agent.mdx +5 -5
  21. package/docs-site/zh/reference/define-config.mdx +1 -1
  22. package/docs-site/zh/reference/define-eval.mdx +3 -3
  23. package/package.json +3 -2
  24. package/src/agents/ai-sdk.test.ts +1 -1
  25. package/src/agents/ai-sdk.ts +2 -2
  26. package/src/agents/claude-code.ts +1 -1
  27. package/src/agents/codex.ts +2 -2
  28. package/src/agents/streaming.test.ts +1 -1
  29. package/src/agents/types.ts +4 -4
  30. package/src/agents/ui-message-stream.test.ts +1 -1
  31. package/src/cli.ts +120 -18
  32. package/src/context/context.test.ts +1 -1
  33. package/src/context/context.ts +3 -3
  34. package/src/context/session.ts +2 -2
  35. package/src/context/types.ts +2 -2
  36. package/src/i18n/en.ts +29 -7
  37. package/src/i18n/zh-CN.ts +24 -2
  38. package/src/report/aggregate.ts +79 -50
  39. package/src/report/components.tsx +190 -0
  40. package/src/report/compute.ts +149 -84
  41. package/src/report/default-report.tsx +222 -0
  42. package/src/report/dual-face.test.tsx +527 -0
  43. package/src/report/format.ts +29 -0
  44. package/src/report/index.ts +79 -24
  45. package/src/report/load.ts +67 -0
  46. package/src/report/metrics.ts +2 -1
  47. package/src/report/param.ts +18 -0
  48. package/src/report/primitives.tsx +117 -0
  49. package/src/report/react/CaseList.tsx +2 -2
  50. package/src/report/react/DeltaTable.tsx +2 -2
  51. package/src/report/react/MetricBars.tsx +109 -0
  52. package/src/report/react/MetricLine.tsx +200 -0
  53. package/src/report/react/MetricMatrix.tsx +1 -1
  54. package/src/report/react/MetricScatter.tsx +1 -1
  55. package/src/report/react/MetricTable.tsx +1 -1
  56. package/src/report/react/RunOverview.tsx +4 -4
  57. package/src/report/react/Scoreboard.tsx +3 -3
  58. package/src/report/react/cell.tsx +1 -1
  59. package/src/report/react/fixtures.ts +98 -36
  60. package/src/report/react/format.ts +3 -28
  61. package/src/report/react/index.tsx +41 -24
  62. package/src/report/react/render.test.tsx +8 -8
  63. package/src/report/react/styles.css +77 -0
  64. package/src/report/report.test.ts +248 -128
  65. package/src/report/report.ts +69 -0
  66. package/src/report/text/faces.ts +356 -0
  67. package/src/report/text/layout.ts +125 -0
  68. package/src/report/text/plot.ts +127 -0
  69. package/src/report/tree.ts +220 -0
  70. package/src/report/types.ts +75 -27
  71. package/src/report/web.ts +40 -0
  72. package/src/results/copy.ts +95 -41
  73. package/src/results/format.ts +12 -11
  74. package/src/results/index.ts +34 -17
  75. package/src/results/open.ts +201 -81
  76. package/src/results/results.test.ts +595 -191
  77. package/src/results/select.ts +107 -55
  78. package/src/results/types.ts +137 -45
  79. package/src/results/writer.ts +258 -0
  80. package/src/runner/attempt.ts +3 -3
  81. package/src/runner/fingerprint.ts +1 -1
  82. package/src/runner/reporters/artifacts.ts +38 -78
  83. package/src/runner/reporters/braintrust.test.ts +2 -2
  84. package/src/runner/reporters/braintrust.ts +3 -3
  85. package/src/runner/run.ts +1 -1
  86. package/src/runner/types.ts +18 -12
  87. package/src/show/compose.ts +215 -0
  88. package/src/show/index.ts +263 -0
  89. package/src/show/render.ts +456 -0
  90. package/src/show/show.test.ts +505 -0
  91. package/src/view/app/App.tsx +85 -24
  92. package/src/view/app/components/CostScoreChart.tsx +29 -10
  93. package/src/view/app/components/ExperimentTable.tsx +27 -9
  94. package/src/view/app/components/GroupSelector.tsx +1 -1
  95. package/src/view/app/i18n.ts +18 -3
  96. package/src/view/app/lib/attempt-route.test.ts +9 -9
  97. package/src/view/app/lib/attempt-route.ts +5 -5
  98. package/src/view/app/lib/outcome.ts +1 -3
  99. package/src/view/app/lib/rows.ts +95 -15
  100. package/src/view/app/main.tsx +18 -6
  101. package/src/view/app/pages/RunsPage.tsx +4 -7
  102. package/src/view/app/pages/TracesPage.tsx +3 -8
  103. package/src/view/app/types.ts +50 -6
  104. package/src/view/client-dist/app.css +1 -1
  105. package/src/view/client-dist/app.js +20 -20
  106. package/src/view/data.test.ts +254 -0
  107. package/src/view/data.ts +336 -0
  108. package/src/view/index.ts +64 -10
  109. package/src/view/server.ts +31 -9
  110. package/src/view/shared/types.ts +47 -41
  111. package/src/view/styles.css +5 -0
  112. package/src/view/template.html +1 -0
  113. package/src/view/view-report.test.ts +308 -0
  114. package/docs-site/.mintignore +0 -13
  115. package/docs-site/AGENTS.md +0 -46
  116. package/docs-site/concepts/adapter.mdx +0 -287
  117. package/docs-site/concepts/assert.mdx +0 -243
  118. package/docs-site/concepts/drive.mdx +0 -118
  119. package/docs-site/concepts/evals.mdx +0 -108
  120. package/docs-site/concepts/experiment.mdx +0 -37
  121. package/docs-site/concepts/hitl.mdx +0 -83
  122. package/docs-site/concepts/judge.mdx +0 -129
  123. package/docs-site/concepts/overview.mdx +0 -98
  124. package/docs-site/concepts/tier.mdx +0 -42
  125. package/docs-site/docs-ref/00-index.md +0 -23
  126. package/docs-site/docs-ref/01-page-types.md +0 -43
  127. package/docs-site/docs-ref/03-style-rules.md +0 -45
  128. package/docs-site/docs-ref/04-code-examples.md +0 -37
  129. package/docs-site/docs-ref/05-dx-failure-paths.md +0 -45
  130. package/docs-site/docs-ref/06-checklists.md +0 -53
  131. package/docs-site/docs.json +0 -256
  132. package/docs-site/example/ai-agent-application.mdx +0 -148
  133. package/docs-site/example/claude-code-codex-plugin.mdx +0 -162
  134. package/docs-site/example/claude-code-codex-skill.mdx +0 -147
  135. package/docs-site/example/showcase.mdx +0 -39
  136. package/docs-site/example/tier1-ai-sdk-v7.mdx +0 -136
  137. package/docs-site/example/tier1-claude-sdk.mdx +0 -119
  138. package/docs-site/example/tier1-codex-sdk.mdx +0 -111
  139. package/docs-site/example/tier1-langgraph.mdx +0 -119
  140. package/docs-site/example/tier1-pi-sdk.mdx +0 -119
  141. package/docs-site/favicon.svg +0 -5
  142. package/docs-site/github-diff.css +0 -135
  143. package/docs-site/github-diff.js +0 -11
  144. package/docs-site/guides/authoring.mdx +0 -129
  145. package/docs-site/guides/ci-integration.mdx +0 -97
  146. package/docs-site/guides/connect-otel.mdx +0 -209
  147. package/docs-site/guides/connect-your-agent.mdx +0 -221
  148. package/docs-site/guides/dataset-fanout.mdx +0 -98
  149. package/docs-site/guides/experiments.mdx +0 -71
  150. package/docs-site/guides/fixtures.mdx +0 -147
  151. package/docs-site/guides/reporters.mdx +0 -113
  152. package/docs-site/guides/runner.mdx +0 -79
  153. package/docs-site/guides/sandbox-agent.mdx +0 -138
  154. package/docs-site/guides/sandbox-backends.mdx +0 -64
  155. package/docs-site/guides/scoring-guide.mdx +0 -92
  156. package/docs-site/guides/viewing-results.mdx +0 -195
  157. package/docs-site/guides/write-experiment.mdx +0 -81
  158. package/docs-site/guides/write-send.mdx +0 -347
  159. package/docs-site/index.mdx +0 -181
  160. package/docs-site/introduction.mdx +0 -141
  161. package/docs-site/quickstart.mdx +0 -136
  162. package/docs-site/reference/builtin-agents.mdx +0 -161
  163. package/docs-site/reference/capabilities.mdx +0 -76
  164. package/docs-site/reference/cli.mdx +0 -120
  165. package/docs-site/reference/define-agent.mdx +0 -168
  166. package/docs-site/reference/define-config.mdx +0 -41
  167. package/docs-site/reference/define-eval.mdx +0 -160
  168. package/docs-site/reference/events.mdx +0 -131
  169. package/docs-site/reference/expect.mdx +0 -112
  170. package/docs-site/tracker.js +0 -8
  171. package/src/report/react/data.ts +0 -17
  172. package/src/view/aggregate.ts +0 -103
  173. package/src/view/loader.test.ts +0 -61
  174. package/src/view/loader.ts +0 -257
@@ -1,111 +0,0 @@
1
- ---
2
- title: "Integrate Codex SDK with NiceEval non-invasively"
3
- sidebarTitle: "Codex SDK integration"
4
- description: "The complete before/after diff for connecting a Codex SDK coding-agent backend to NiceEval: zero app-side code changes."
5
- ---
6
-
7
- {/* Generated by scripts/gen-diff-code.ts (pnpm run gen:diff-code). Do not edit by hand. */}
8
-
9
- Comparison targets:
10
-
11
- - **before**:[https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/origin/codex-sdk](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/origin/codex-sdk) -- a standalone `@openai/codex-sdk` HTTP service, before any eval integration.
12
- - **after**:[https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/tier1/codex-sdk](https://github.com/CorrectRoadH/niceeval/tree/main/examples/zh/tier1/codex-sdk) -- the same app after integrating NiceEval.
13
-
14
- **Integration path**: official converter -- mapping Codex native `ThreadEvent` events into standard events is handled by `fromCodexThreadEvents` (exported from `"niceeval/adapter"`). Message text, tool items (`command_execution` / `mcp_tool_call` / `file_change` -> paired `action.*` events), and `turn.completed` usage all come from this stream, leaving only transport glue in the adapter. There is no HITL because Codex SDK does not support it. The evals run real coding tasks (writing files and running commands in a working directory), and assertions read the disk directly. You start the app yourself (`pnpm start`); evals do not manage the process. App-side `src/backend/*` files are byte-for-byte unchanged. Use `tier2/` for OTel waterfalls and `tier3/` for feature A/B.
15
-
16
- All integration code changes (measured from both directories when generated):
17
-
18
- <table className="gd-summary"><tbody><tr><th>{"Category"}</th><th>{"Files"}</th><th>{"Lines"}</th></tr><tr><td>{"App-side config (required: dependency declarations)"}</td><td>{"3"}</td><td>{"+7 −1"}</td></tr><tr><td>{"adapter (required: transport glue; protocol mapping is in the official package)"}</td><td>{"2"}</td><td>{"+68"}</td></tr><tr><td>{"evals and experiments (test content, grows as needed)"}</td><td>{"5"}</td><td>{"+109"}</td></tr><tr className="gd-total"><td>{"Total"}</td><td>{"10"}</td><td>{"+184 −1"}</td></tr></tbody></table>
19
-
20
- ## File list
21
-
22
- ```text
23
- codex-sdk/
24
- ├── package.json modified
25
- ├── tsconfig.json modified
26
- ├── pnpm-workspace.yaml modified
27
- ├── niceeval.config.ts added
28
- ├── agents/
29
- │ └── codex-sdk.ts added
30
- ├── evals/
31
- │ ├── basic-qa.eval.ts added
32
- │ ├── create-file.eval.ts added
33
- │ ├── run-command.eval.ts added
34
- │ └── session-isolation.eval.ts added
35
- └── experiments/
36
- └── codex-sdk.ts added
37
- ```
38
-
39
- ## App-side changes (dependency declarations only)
40
-
41
- <div className="gd-file">
42
- <div className="gd-head"><span className="gd-name">{"package.json"}</span><span className="gd-stats"><span className="gd-plus">{"+2"}</span></span></div>
43
- <div className="gd-body">
44
- <table className="gd-table"><tbody><tr className="gd-expand" data-fold="gdf7"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"Expand 8 unchanged lines"}</td></tr><tr className="gd-fold gdf7"><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 gdf7"><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">{"\"codex-sdk-example\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf7"><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 gdf7"><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 gdf7"><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 gdf7"><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 gdf7"><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:31001 | 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 gdf7"><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:31001 && 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="gdf8"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"Expand 8 unchanged lines"}</td></tr><tr className="gd-fold gdf8"><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">{"\"@assistant-ui/react\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^0.14.24\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf8"><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">{"\"@openai/codex-sdk\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^0.142.5\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf8"><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">{"\"react\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^19.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf8"><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">{"\"react-dom\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^19.0.0\""}</span></td></tr><tr className="gd-fold gdf8"><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></td></tr><tr className="gd-fold gdf8"><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">{"\"devDependencies\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-fold gdf8"><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">{"\"@types/node\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"^22.0.0\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-fold gdf8"><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">{"\"@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">{"23"}</td><td className="gd-ln">{"24"}</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">{"24"}</td><td className="gd-ln">{"25"}</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">{"25"}</td><td className="gd-ln">{"26"}</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">{"27"}</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">{"26"}</td><td className="gd-ln">{"28"}</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">{"27"}</td><td className="gd-ln">{"29"}</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">{"28"}</td><td className="gd-ln">{"30"}</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">{"29"}</td><td className="gd-ln">{"31"}</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">{"30"}</td><td className="gd-ln">{"32"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr><td className="gd-ln">{"31"}</td><td className="gd-ln">{"33"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr></tbody></table>
45
- </div>
46
- </div>
47
-
48
- <div className="gd-file">
49
- <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>
50
- <div className="gd-body">
51
- <table className="gd-table"><tbody><tr className="gd-expand" data-fold="gdf9"><td className="gd-ln" colSpan={2}>{"⇕"}</td><td className="gd-sign"></td><td className="gd-code">{"Expand 13 unchanged lines"}</td></tr><tr className="gd-fold gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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 gdf9"><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>
52
- </div>
53
- </div>
54
-
55
- <div className="gd-file">
56
- <div className="gd-head"><span className="gd-name">{"pnpm-workspace.yaml"}</span><span className="gd-stats"><span className="gd-plus">{"+4"}</span></span></div>
57
- <div className="gd-body">
58
- <table className="gd-table"><tbody><tr><td className="gd-ln">{"1"}</td><td className="gd-ln">{"1"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt6">{"# examples/ 不属于本仓库的 monorepo —— 每个 example 是独立 npm 项目(自带"}</span></td></tr><tr><td className="gd-ln">{"2"}</td><td className="gd-ln">{"2"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt6">{"# package.json),不作为本仓库根 workspace 的成员。这个空 workspace 文件让 pnpm"}</span></td></tr><tr><td className="gd-ln">{"3"}</td><td className="gd-ln">{"3"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt6">{"# 把这里当独立项目安装依赖,不往上找根 workspace。"}</span></td></tr><tr><td className="gd-ln">{"4"}</td><td className="gd-ln">{"4"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt3">{"packages"}</span><span className="gdt0">{": []"}</span></td></tr><tr><td className="gd-ln">{"5"}</td><td className="gd-ln">{"5"}</td><td className="gd-sign"></td><td className="gd-code"><span className="gdt3">{"allowBuilds"}</span><span className="gdt0">{":"}</span></td></tr><tr><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="gdt3">{"esbuild"}</span><span className="gdt0">{": "}</span><span className="gdt1">{"true"}</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="gdt3">{"overrides"}</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">{" "}</span><span className="gdt3">{"niceeval"}</span><span className="gdt0">{": "}</span><span className="gdt2">{"link:../../../.."}</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="gdt3">{"minimumReleaseAgeExclude"}</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">{" - "}</span><span className="gdt2">{"niceeval@0.1.1"}</span></td></tr></tbody></table>
59
- </div>
60
- </div>
61
-
62
- ## Added adapter, evals, and experiments
63
-
64
- <div className="gd-file">
65
- <div className="gd-head"><span className="gd-name">{"niceeval.config.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+10"}</span></span></div>
66
- <div className="gd-body">
67
- <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">{"\"Codex SDK 示例\""}</span><span className="gdt0">{", en: "}</span><span className="gdt2">{"\"Codex SDK 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">{"180_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><span className="gdt6">{"// 每个 attempt 都要经一个真实子进程(server.ts)+ Codex CLI 子进程(真的在工作目录里"}</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">{" "}</span><span className="gdt6">{"// 跑命令/改文件)+ 网络调用,比其它示例都重,别开太高并发。"}</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">{" maxConcurrency: "}</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">{"});"}</span></td></tr></tbody></table>
68
- </div>
69
- </div>
70
-
71
- <div className="gd-file">
72
- <div className="gd-head"><span className="gd-name">{"agents/codex-sdk.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+58"}</span></span></div>
73
- <div className="gd-body">
74
- <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">{"// codex-sdk 的 adapter:无侵入对接一个**已经在跑**的应用(../src/backend/server.ts,原生"}</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">{"// `ThreadEvent` 流原样透传成 SSE,外加一个和 `ThreadErrorEvent` 同形状的 `{type:\"error\"}`"}</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">{"// 传输帧)。没有 HITL(Codex SDK 不支持),永不返回 \"waiting\"。"}</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">{"//"}</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">{"// 断言依据全部来自这条 ThreadEvent 流:官方转换器 `fromCodexThreadEvents` 翻消息文本、"}</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">{"// 工具项(command_execution / mcp_tool_call / file_change → action.*)、`turn.completed` 的"}</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">{"// usage 和终局错误;逐帧驱动是官方件 `driveFrameStream`(没有 HITL,onFrame 只用来处理"}</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">{"// 传输帧 + 抓 threadId)。"}</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">{"//"}</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="gdt6">{"// 这是 Tier 1(只接 send):要 `niceeval view` 的调用瀑布图时升 Tier 2,见"}</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="gdt6">{"// ../../tier2/codex-sdk/——同一个文件加一行 spanMapper、config 加一行 telemetry,其它不变。"}</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="gdt4">{"import"}</span><span className="gdt0">{" { defineAgent, sseJsonFrames, fromCodexThreadEvents, driveFrameStream } "}</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">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { AgentContext } "}</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">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { Turn, TurnInput } "}</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">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { ThreadEvent } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"@openai/codex-sdk\""}</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="gdt6">{"// 被测应用由你自己按它的方式启动(pnpm start / 部署在哪都行),eval 不代管进程、不另开端口。"}</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="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">{"CODEX_SDK_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"??"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"http://127.0.0.1:31001\""}</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">{" "}</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="gdt4">{"type"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"TransportFrame"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"message"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</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="gdt4">{"type"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"CodexFrame"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"ThreadEvent"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"TransportFrame"}</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">{" "}</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="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"input"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"TurnInput"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AgentContext"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><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><span className="gdt4">{"let"}</span><span className="gdt0">{" res"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Response"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"25"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"try"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"26"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" res "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"fetch"}</span><span className="gdt0">{"("}</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">{"27"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" method: "}</span><span className="gdt2">{"\"POST\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"28"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" headers: { "}</span><span className="gdt2">{"\"content-type\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"application/json\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"29"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" body: "}</span><span className="gdt1">{"JSON"}</span><span className="gdt0">{"."}</span><span className="gdt5">{"stringify"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"30"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" message: input.text,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"31"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" threadId: ctx.session.id,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"32"}</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">{"33"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" signal: ctx.signal,"}</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></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"35"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" } "}</span><span className="gdt4">{"catch"}</span><span className="gdt0">{" (err) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"36"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (ctx.signal.aborted) "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" err;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"37"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"38"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"`连不上 ${"}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt2">{"}/api/chat。被测应用在跑吗?先起它:cd examples/zh/tier1/codex-sdk && pnpm start(或设 CODEX_SDK_URL 指向已部署实例)。`"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"39"}</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">{"40"}</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">{"41"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" ("}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"res.ok "}</span><span className="gdt4">{"||"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"res.body) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"42"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`POST /api/chat 失败: ${"}</span><span className="gdt0">{"res"}</span><span className="gdt2">{"."}</span><span className="gdt0">{"status"}</span><span className="gdt2">{"} ${"}</span><span className="gdt4">{"await"}</span><span className="gdt2">{" "}</span><span className="gdt0">{"res"}</span><span className="gdt2">{"."}</span><span className="gdt5">{"text"}</span><span className="gdt2">{"()."}</span><span className="gdt5">{"catch"}</span><span className="gdt2">{"(() "}</span><span className="gdt4">{"=>"}</span><span className="gdt2">{" "}</span><span className="gdt2">{"\"\""}</span><span className="gdt2">{")"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"43"}</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">{"44"}</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">{"45"}</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">{"stream"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"fromCodexThreadEvents"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"46"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"driveFrameStream"}</span><span className="gdt0">{"("}</span><span className="gdt5">{"sseJsonFrames"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"CodexFrame"}</span><span className="gdt0">{">(res.body), stream, ctx, ("}</span><span className="gdt7">{"frame"}</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">{"47"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 应用自定义传输帧(query() 之外的失败,比如 spawn 失败),不属于 ThreadEvent。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"48"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (frame.type "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{") "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" { fail: (frame "}</span><span className="gdt4">{"as"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"TransportFrame"}</span><span className="gdt0">{").message };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"49"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 会话续接走「服务端记历史」范式:thread.started 帧回传的 id 用 ctx.session.capture 写回,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"50"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 只在还没记过时落地(first-writer-wins)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"51"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"capture"}</span><span className="gdt0">{"(stream.threadId);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"52"}</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">{"53"}</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">{"54"}</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">{"55"}</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">{"defineAgent"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"56"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: "}</span><span className="gdt2">{"\"codex-sdk\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"57"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" send,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"58"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
75
- </div>
76
- </div>
77
-
78
- <div className="gd-file">
79
- <div className="gd-head"><span className="gd-name">{"evals/basic-qa.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+22"}</span></span></div>
80
- <div className="gd-body">
81
- <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 能正常问答,顺带冒烟 usage 有没有从 turn.completed 的"}</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">{"// usage(input_tokens/output_tokens/cached_input_tokens)正确映射进 Turn.usage。"}</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">{"// Codex 是自主编码 agent,即使是纯问答也可能顺手探索一下工作目录——这里不强断言"}</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">{"// usedNoTools(),只看回答本身和有没有失败的动作。"}</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">{"\"测试 agent 能正常问答\""}</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">{"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">{"\"1+1 等于几?用一句话回答就好,不用跑命令也不用建文件。\""}</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">{" 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">{"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="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">{"15"}</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">{"16"}</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">{"17"}</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">{"\"2\""}</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">{" "}</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">{"maxTokens"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"40_000"}</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">{" },"}</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></tbody></table>
82
- </div>
83
- </div>
84
-
85
- <div className="gd-file">
86
- <div className="gd-head"><span className="gd-name">{"evals/create-file.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+34"}</span></span></div>
87
- <div className="gd-body">
88
- <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 } "}</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"><span className="gdt4">{"import"}</span><span className="gdt0">{" { existsSync, readFileSync, rmSync } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"node:fs\""}</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="gdt4">{"import"}</span><span className="gdt0">{" { join } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"node:path\""}</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">{" "}</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">{"// Codex 是\"目录里的编码 agent\",这条 eval 测它最本分的事:在工作目录里写一个真实文件。"}</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">{"// 断言不只信模型的自我报告——先删掉目标文件(workspace/ 不会在 attempt 之间自动清空,见"}</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">{"// origin src/backend/agent.ts 头注释),跑完直接用 node:fs 读磁盘上的真实内容,双重核实"}</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">{"// (工具调用记录 + 文件确实存在且内容对)。"}</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">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"WORKSPACE_FILE"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"join"}</span><span className="gdt0">{"(process."}</span><span className="gdt5">{"cwd"}</span><span className="gdt0">{"(), "}</span><span className="gdt2">{"\"workspace\""}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"niceeval-create-file.txt\""}</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="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"MARKER"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval-marker-926\""}</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="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">{"14"}</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">{"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">{"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">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt5">{"rmSync"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"WORKSPACE_FILE"}</span><span className="gdt0">{", { force: "}</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">{"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">{"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></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><span className="gdt2">{"`在当前工作目录创建一个文件 niceeval-create-file.txt,内容只写一行:${"}</span><span className="gdt1">{"MARKER"}</span><span className="gdt2">{"}`"}</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">{" );"}</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">{" 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">{"23"}</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">{"24"}</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">{"25"}</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">{"26"}</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">{"27"}</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">{"28"}</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">{"29"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 文件不存在按空内容断言,而不是让 readFileSync 抛 ENOENT——\"agent 没写出文件\"是"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"30"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 这条 eval 真正要测的失败(failed),不是框架执行错误(errored)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"31"}</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">{"content"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"existsSync"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"WORKSPACE_FILE"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"?"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"readFileSync"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"WORKSPACE_FILE"}</span><span className="gdt0">{", "}</span><span className="gdt2">{"\"utf8\""}</span><span className="gdt0">{") "}</span><span className="gdt4">{":"}</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">{"32"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(content, "}</span><span className="gdt5">{"includes"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"MARKER"}</span><span className="gdt0">{"));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"33"}</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">{"34"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
89
- </div>
90
- </div>
91
-
92
- <div className="gd-file">
93
- <div className="gd-head"><span className="gd-name">{"evals/run-command.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+20"}</span></span></div>
94
- <div className="gd-body">
95
- <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 会真的跑 shell 命令(而不是凭空回答)。工具事件由官方转换器"}</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">{"// `fromCodexThreadEvents` 从 ThreadEvent 的 `command_execution` item 映射(started 发"}</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">{"// called,completed 按 exit_code 落 result)。"}</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">{"defineEval"}</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">{"\"测试 agent 能在工作目录里跑一个真实 shell 命令\""}</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">{" "}</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">{"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">{"10"}</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">{"\"在当前工作目录跑 `echo niceeval-run-command-926`,把命令的输出告诉我。\""}</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">{" 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">{"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">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"group"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"调用了 shell 且没有失败的动作\""}</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">{"14"}</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">{"\"command_execution\""}</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">{"15"}</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">{"16"}</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">{"17"}</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">{"18"}</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">{"\"niceeval-run-command-926\""}</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>
96
- </div>
97
- </div>
98
-
99
- <div className="gd-file">
100
- <div className="gd-head"><span className="gd-name">{"evals/session-isolation.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+24"}</span></span></div>
101
- <div className="gd-body">
102
- <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 专门验证会话续接的两半承诺:同一 thread 里第二轮记得住第一轮说的事"}</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">{"// (codex.resumeThread 续接成功);t.newSession() 造出的新 thread 不共享历史。"}</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">{"// 故意用一句\"记住我最喜欢的颜色\"而不是\"你创建的文件叫什么\"——workspace/ 目录是所有"}</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">{"// thread 共享的同一份磁盘状态,如果拿文件是否存在当隔离信号,新 thread 完全可能自己"}</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">{"// ls 一下发现文件还在,那测的是\"文件系统有没有清空\"而不是\"对话记忆有没有隔离\","}</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="gdt6">{"// 两回事。纯口头事实不受工作目录状态干扰,是更干净的隔离信号。"}</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="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">{"12"}</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">{"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="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">{"15"}</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">{"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">{"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">{"17"}</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="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">{"18"}</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">{"19"}</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">{"20"}</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">{"21"}</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">{"22"}</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">{"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>
103
- </div>
104
- </div>
105
-
106
- <div className="gd-file">
107
- <div className="gd-head"><span className="gd-name">{"experiments/codex-sdk.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+9"}</span></span></div>
108
- <div className="gd-body">
109
- <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/codex-sdk.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">{"// 单配置基线:这个示例只有一个 agent、不比较模型,用 .env 里的默认模型(gpt-5.4)。"}</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">{"\"codex-sdk:真实 Codex SDK 后端\""}</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>
110
- </div>
111
- </div>