niceeval 0.13.1 → 0.13.2-canary.35

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 (134) hide show
  1. package/INDEX.md +1 -0
  2. package/README.md +9 -10
  3. package/README.zh.md +9 -10
  4. package/dist/agents/ai-sdk.cjs.map +1 -1
  5. package/dist/agents/ai-sdk.d.cts +1 -1
  6. package/dist/agents/ai-sdk.d.mts +1 -1
  7. package/dist/agents/ai-sdk.d.ts +1 -1
  8. package/dist/agents/coding-cli-versions.cjs +10 -1
  9. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  10. package/dist/agents/coding-cli-versions.d.cts +8 -3
  11. package/dist/agents/coding-cli-versions.d.mts +8 -3
  12. package/dist/agents/coding-cli-versions.d.ts +8 -3
  13. package/dist/agents/coding-cli-versions.js +18 -12
  14. package/dist/agents/deepseek-harness.cjs +103 -0
  15. package/dist/agents/deepseek-harness.cjs.map +1 -0
  16. package/dist/agents/deepseek-harness.d.cts +12 -0
  17. package/dist/agents/deepseek-harness.d.mts +12 -0
  18. package/dist/agents/deepseek-harness.d.ts +12 -0
  19. package/dist/agents/deepseek-harness.js +7 -0
  20. package/dist/agents/deepseek-harness.js.map +1 -0
  21. package/dist/agents/index.cjs +5 -1
  22. package/dist/agents/index.cjs.map +1 -1
  23. package/dist/agents/index.d.cts +4 -0
  24. package/dist/agents/index.d.mts +4 -0
  25. package/dist/agents/index.d.ts +4 -0
  26. package/dist/agents/index.js +54 -50
  27. package/dist/agents/index.mjs +54 -50
  28. package/dist/agents/omp.cjs +170 -0
  29. package/dist/agents/omp.cjs.map +1 -0
  30. package/dist/agents/omp.d.cts +14 -0
  31. package/dist/agents/omp.d.mts +14 -0
  32. package/dist/agents/omp.d.ts +14 -0
  33. package/dist/agents/omp.js +7 -0
  34. package/dist/agents/omp.js.map +1 -0
  35. package/dist/agents/types.cjs.map +1 -1
  36. package/dist/agents/types.d.cts +2 -2
  37. package/dist/agents/types.d.mts +2 -2
  38. package/dist/agents/types.d.ts +2 -2
  39. package/dist/analysis/api.cjs +9 -1
  40. package/dist/analysis/api.cjs.map +1 -1
  41. package/dist/analysis/api.d.cts +21 -0
  42. package/dist/analysis/api.d.mts +21 -0
  43. package/dist/analysis/api.d.ts +21 -0
  44. package/dist/analysis/api.js +8 -6
  45. package/dist/i18n/en.cjs +7 -2
  46. package/dist/i18n/en.cjs.map +1 -1
  47. package/dist/i18n/en.d.cts +7 -2
  48. package/dist/i18n/en.d.mts +7 -2
  49. package/dist/i18n/en.d.ts +7 -2
  50. package/dist/o11y/parsers/hermes.cjs +1 -1
  51. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  52. package/dist/report/built-in/analysis-values.cjs +21 -5
  53. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  54. package/dist/report/built-in/analysis-values.d.cts +11 -9
  55. package/dist/report/built-in/analysis-values.d.mts +11 -9
  56. package/dist/report/built-in/analysis-values.d.ts +11 -9
  57. package/dist/report/built-in/overview.cjs +1 -0
  58. package/dist/report/built-in/overview.cjs.map +1 -1
  59. package/dist/report/built-in/result-components.cjs +58 -12
  60. package/dist/report/built-in/result-components.cjs.map +1 -1
  61. package/dist/report/built-in/result-components.d.cts +15 -0
  62. package/dist/report/built-in/result-components.d.mts +15 -0
  63. package/dist/report/built-in/result-components.d.ts +15 -0
  64. package/dist/report/built-in/run-membership-overview.cjs +100 -4
  65. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  66. package/dist/report/built-in/standard.cjs +1 -0
  67. package/dist/report/built-in/standard.cjs.map +1 -1
  68. package/dist/report/built-in/standard.d.cts +1 -0
  69. package/dist/report/built-in/standard.d.mts +1 -0
  70. package/dist/report/built-in/standard.d.ts +1 -0
  71. package/dist/report/components/entity-lists/compute.cjs +40 -3
  72. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  73. package/dist/report/components/entity-lists/compute.d.cts +8 -6
  74. package/dist/report/components/entity-lists/compute.d.mts +8 -6
  75. package/dist/report/components/entity-lists/compute.d.ts +8 -6
  76. package/dist/report/components/entity-lists/content.cjs +31 -6
  77. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  78. package/dist/report/components/entity-lists/index.cjs +3 -2
  79. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  80. package/dist/report/components/entity-lists/index.d.cts +1 -1
  81. package/dist/report/components/entity-lists/index.d.mts +1 -1
  82. package/dist/report/components/entity-lists/index.d.ts +1 -1
  83. package/dist/report/definition/cell.cjs +3 -0
  84. package/dist/report/definition/cell.cjs.map +1 -1
  85. package/dist/report/definition/cell.d.cts +2 -0
  86. package/dist/report/definition/cell.d.mts +2 -0
  87. package/dist/report/definition/cell.d.ts +2 -0
  88. package/dist/report/definition/primitives.cjs +9 -2
  89. package/dist/report/definition/primitives.cjs.map +1 -1
  90. package/dist/runner/feedback/human.cjs +180 -16
  91. package/dist/runner/feedback/human.cjs.map +1 -1
  92. package/dist/runner/run.cjs +43 -0
  93. package/dist/runner/run.cjs.map +1 -1
  94. package/dist/sample/capability.cjs +93 -0
  95. package/dist/sample/capability.cjs.map +1 -1
  96. package/dist/sample/capability.d.cts +3 -1
  97. package/dist/sample/capability.d.mts +3 -1
  98. package/dist/sample/capability.d.ts +3 -1
  99. package/dist/sample/capability.js +8 -6
  100. package/dist/sandbox/docker-agent-image.cjs +5 -1
  101. package/dist/sandbox/docker-agent-image.cjs.map +1 -1
  102. package/dist/sandbox/docker-agent-image.d.cts +2 -0
  103. package/dist/sandbox/docker-agent-image.d.mts +2 -0
  104. package/dist/sandbox/docker-agent-image.d.ts +2 -0
  105. package/dist/sandbox/docker-agent-image.js +14 -10
  106. package/dist/sandbox/index.cjs +4 -2
  107. package/dist/sandbox/index.cjs.map +1 -1
  108. package/dist/sandbox/index.d.cts +1 -1
  109. package/dist/sandbox/index.d.mts +1 -1
  110. package/dist/sandbox/index.d.ts +1 -1
  111. package/dist/sandbox/index.js +120 -116
  112. package/dist/sandbox/index.mjs +120 -116
  113. package/docs-site/images/hitl-handshake-zh.svg +3 -3
  114. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +3 -3
  115. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  116. package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
  117. package/docs-site/zh/examples/integrations/langgraph.mdx +3 -3
  118. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  119. package/docs-site/zh/explanation/adapter.mdx +5 -5
  120. package/docs-site/zh/explanation/assert.mdx +1 -1
  121. package/docs-site/zh/explanation/drive.mdx +3 -1
  122. package/docs-site/zh/explanation/evals.mdx +3 -1
  123. package/docs-site/zh/explanation/hitl.mdx +7 -7
  124. package/docs-site/zh/reference/builtin-agents.mdx +4 -4
  125. package/docs-site/zh/reference/capabilities.mdx +1 -1
  126. package/docs-site/zh/reference/events.mdx +10 -10
  127. package/docs-site/zh/reference/official-adapters.mdx +1 -1
  128. package/docs-site/zh/reference/results-data.mdx +6 -0
  129. package/docs-site/zh/tutorials/docker-in-docker.mdx +3 -0
  130. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
  131. package/docs-site/zh/tutorials/rerun-and-cache.mdx +16 -0
  132. package/docs-site/zh/tutorials/viewing-results.mdx +19 -1
  133. package/docs-site/zh/tutorials/write-send.mdx +7 -6
  134. package/package.json +1 -1
package/INDEX.md CHANGED
@@ -35,6 +35,7 @@
35
35
  - `docs-site/zh/tutorials/fixtures.mdx` — Sandbox Fixture:用任务评估 coding agents:用 .eval.ts 给 coding agent 准备隔离 workspace、发送真实任务,并用 Sandbox 文件、命令、diff 和 judge 验证结果。
36
36
  - `docs-site/zh/tutorials/handle-execution-failures.mdx` — 在基础设施失败时停止无效运行:读懂自动重试,为确定性故障声明影响范围,修复后继续未完成的评估。
37
37
  - `docs-site/zh/tutorials/install-custom-sandbox-agent.mdx` — 为自定义 Sandbox Agent 安装 CLI:用 ensure 和 installer 检查、安装并复检自定义 coding-agent CLI 的精确版本。
38
+ - `docs-site/zh/tutorials/nixos-managed-dind.mdx` — 在 NixOS 上配置 Managed DinD:使用 NiceEval 的 NixOS module 部署 managed rootless Docker profile,并通过 doctor 验证宿主环境。
38
39
  - `docs-site/zh/tutorials/plugins.mdx` — 用 Plugin 组合生命周期:用 definePlugin 为实验、评估组、Sandbox 和评估组合多个生命周期。
39
40
  - `docs-site/zh/tutorials/publish-report.mdx` — 发布静态报告:用 view --out 导出可离线打开、与源 Record 脱离且包含全部页面的自包含报告站。
40
41
  - `docs-site/zh/tutorials/quickstart.mdx` — 为你的 Agent 项目设置评估:安装 NiceEval,写三个文件,10 分钟内对你自己的应用跑通第一条评估用例。
package/README.md CHANGED
@@ -88,25 +88,27 @@ See the full glossary in the [architecture overview](https://niceeval.com/docs/c
88
88
  ```ts
89
89
  // evals/eval-tool-call.eval.ts
90
90
  import { defineEval } from "niceeval";
91
+ import { includes, jsonMatch, pattern, toolMatch } from "niceeval/expect";
91
92
 
92
93
  export default defineEval({
94
+ judge: true,
93
95
  description: "Verify the agent calls the weather tool and answers from its result",
94
96
 
95
97
  async test(t) {
96
98
  const turn = await t.send("What's the weather in Beijing today?");
97
- t.succeeded();
99
+ turn.succeeded();
98
100
 
99
101
  await t.group("calls get_weather with the right city", () => {
100
- t.calledTool("get_weather", { input: { city: "Beijing" } });
101
- t.messageIncludes(/°C|sunny|cloudy|rain/);
102
+ turn.calledTool(toolMatch("get_weather", { input: jsonMatch({ city: "Beijing" }) }));
103
+ t.check(turn.message, pattern(/°C|sunny|cloudy|rain/));
102
104
  });
103
105
 
104
106
  const second = await t.send("What about Shanghai tomorrow?");
105
- second.messageIncludes("Shanghai");
107
+ t.check(second.message, includes("Shanghai"));
106
108
 
107
- t.judge.autoevals
109
+ turn.judge.autoevals
108
110
  .closedQA("Does the reply use the tool's weather data instead of making up a temperature?")
109
- .atLeast(0.7);
111
+ .gate(0.7);
110
112
  },
111
113
  });
112
114
  ```
@@ -171,7 +173,4 @@ This project was inspired by — or had its code learned by AI from — the proj
171
173
  - [agent eval](https://github.com/vercel-labs/agent-eval)
172
174
  - [ponytail](https://github.com/DietrichGebert/ponytail)
173
175
 
174
- Thanks to the following communities
175
- - WIP
176
-
177
- We also thank Linux Do for their support and feedback during the project's early development.
176
+ Thanks to [Linux.do](https://linux.do/) for their support and feedback during the project's early development.
package/README.zh.md CHANGED
@@ -88,25 +88,27 @@ NiceEval 支持两种接入方式,取决于被测 agent 是否需要隔离的
88
88
  ```ts
89
89
  // evals/eval-tool-call.eval.ts
90
90
  import { defineEval } from "niceeval";
91
+ import { includes, jsonMatch, pattern, toolMatch } from "niceeval/expect";
91
92
 
92
93
  export default defineEval({
94
+ judge: true,
93
95
  description: "测试 agent 在实时天气问题中正确调用工具并基于结果作答的能力",
94
96
 
95
97
  async test(t) {
96
98
  const turn = await t.send("北京今天天气怎么样?");
97
- t.succeeded();
99
+ turn.succeeded();
98
100
 
99
101
  await t.group("调用 get_weather 且城市正确", () => {
100
- t.calledTool("get_weather", { input: { city: "北京" } });
101
- t.messageIncludes(/°C|气温|天气|晴|多云|雨/);
102
+ turn.calledTool(toolMatch("get_weather", { input: jsonMatch({ city: "北京" }) }));
103
+ t.check(turn.message, pattern(/°C|气温|天气|晴|多云|雨/));
102
104
  });
103
105
 
104
106
  const second = await t.send("上海明天天气怎么样?");
105
- second.messageIncludes("上海");
107
+ t.check(second.message, includes("上海"));
106
108
 
107
- t.judge.autoevals
109
+ turn.judge.autoevals
108
110
  .closedQA("助手是否基于工具返回的天气数据作答,而不是凭空编造温度?")
109
- .atLeast(0.7);
111
+ .gate(0.7);
110
112
  },
111
113
  });
112
114
  ```
@@ -171,7 +173,4 @@ READ https://niceeval.com/INIT.md and set up niceeval for this repo: install it,
171
173
  - [agent eval](https://github.com/vercel-labs/agent-eval)
172
174
  - [ponytail](https://github.com/DietrichGebert/ponytail)
173
175
 
174
- 感谢下列社区
175
- - WIP
176
-
177
- 我们也感谢 Linux Do 在项目早期开发期间给予的支持与反馈。
176
+ 感谢 [Linux.do](https://linux.do/) 在项目早期开发期间给予的支持与反馈。
@@ -1 +1 @@
1
- {"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["ai-sdk.ts"],"names":[],"mappings":"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","sourcesContent":["// AI SDK(Vercel `ai` 包)结果 → 标准事件流的共享转换器(采集通道 0:进程内直构)。\n//\n// 结构化 typing,不依赖 `ai` 包:niceeval 只认识 generateText / streamText 完整结果的\n// 【形状子集】。字段名跨 AI SDK 大版本漂移(v4 args/result/promptTokens、v5+ input/output/\n// inputTokens、v7 inputTokenDetails)在这里统一兜住,adapter 作者不必各自写防御代码,也不必\n// 像手工 recorder 那样包住每个工具的 execute —— AI SDK 的 steps 里本来就有带 toolCallId 的\n// 完整调用记录。\n//\n// v7 的 tool approval(工具带 `needsApproval`)也在这里兜:\n// · `tool-approval-request` part → `input.requested` 事件 + 整轮 `status: \"waiting\"`,\n// 直接满足 HITL 契约的「waiting + input.requested」两条义务(resume 仍归 adapter 管);\n// · 批准 / 拒绝后的 resume 结果里,执行结果只出现在 `responseMessages` 的 tool 消息中\n// (不在 steps 里),这里挖出来补成 `operation.finished` —— 拒绝(execution-denied)映射成\n// `status: \"rejected\"`,喂 `calledTool(..., { status: \"rejected\" })` 与 `noFailedActions()`。\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { defineAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { normalizeJsonValue } from \"../shared/json-value.ts\";\nimport { normalizeToolName as normalizeShared } from \"../o11y/tool-names.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport type { Agent, InputRequest, InputResponse, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\n// ───────────────────────── AI SDK 结果的形状子集 ─────────────────────────\n/** 一次工具调用(v5+ 用 `input`,v4 用 `args`;两者都认)。 */\nexport interface AiSdkToolCallLike {\n toolCallId: string;\n toolName: string;\n input?: unknown;\n args?: unknown;\n}\n/** 一次工具结果(v5+ 用 `output`,v4 用 `result`)。 */\nexport interface AiSdkToolResultLike {\n toolCallId: string;\n toolName?: string;\n output?: unknown;\n result?: unknown;\n}\n/**\n * step.content 的一个 part(v5+)。带类型序:同一 step 里 reasoning / text / tool-call /\n * tool-result / tool-error / tool-approval-request 按真实发生顺序排 —— 有它就优先用它,时序保真。\n */\nexport interface AiSdkContentPartLike {\n type: string;\n text?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n output?: unknown;\n result?: unknown;\n error?: unknown;\n /** v7 tool approval:`tool-approval-request` part 的请求 id 与被拦下的调用。 */\n approvalId?: unknown;\n isAutomatic?: unknown;\n toolCall?: {\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n };\n}\n/** 一个 step = 一次模型调用(工具循环里的一圈)。 */\nexport interface AiSdkStepLike {\n content?: readonly AiSdkContentPartLike[];\n text?: string;\n reasoningText?: string;\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n}\nexport interface AiSdkUsageLike {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n cachedInputTokens?: number;\n /** LanguageModelUsage(v5+)对推理模型(o-series 等)带回的思考 token,已计入 outputTokens。 */\n reasoningTokens?: number;\n /** v7:cache 细分挪进了 inputTokenDetails。 */\n inputTokenDetails?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n}\n/** result.responseMessages 的一条(只认 tool 消息里的 tool-result part,其余略过)。 */\nexport interface AiSdkResponseMessageLike {\n role?: unknown;\n content?: unknown;\n}\n/** generateText / streamText 完整结果的形状子集。没有 steps 的老结果退回顶层字段。 */\nexport interface AiSdkResultLike {\n text?: string;\n steps?: readonly AiSdkStepLike[];\n /** v7:跨全部 step 聚合的 content parts(approval 请求也在里面)。 */\n content?: readonly AiSdkContentPartLike[];\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n /** v5/v6 聚合全部 step 的用量;优先于 usage(v6 的 usage 只是最后一个 step,v7 起也是聚合)。 */\n totalUsage?: AiSdkUsageLike;\n usage?: AiSdkUsageLike;\n /**\n * 本次调用新产生的消息(v7)。tool approval 批准 / 拒绝后,被拦工具的执行结果只出现在\n * 这里的 tool 消息里(不进 steps),turnFromAiSdk 从中补齐 `operation.finished`。\n */\n responseMessages?: readonly AiSdkResponseMessageLike[];\n}\n/** turnFromAiSdk 的返回:铺进 `Turn` 即可(data 仍归调用方 —— 结构化输出是应用自己的语义)。 */\nexport interface AiSdkTurn {\n events: StreamEvent[];\n usage?: Usage;\n /** 有待人批准的工具调用(非 automatic 的 tool-approval-request)→ \"waiting\",否则 \"completed\"。 */\n status: \"completed\" | \"waiting\";\n /** 通用 AI SDK tool call 没有原生 command 分类时,随有工具调用的 Turn 降级 actions。 */\n evidenceCoverage?: {\n readonly actions: {\n readonly status: \"partial\";\n readonly reason: string;\n };\n };\n}\n// ───────────────────────── 转换 ─────────────────────────\n/**\n * AI SDK 结果 → `{ events, usage, status }`,直接铺进 `Turn` 返回:\n *\n * ```typescript\n * const result = await generateText({ model, tools, prompt: input.text });\n * return { ...turnFromAiSdk(result), data: result.text };\n * ```\n *\n * `callId` 用 AI SDK 原生的 `toolCallId`(显式配对,不合成);工具名保留原名进 `name`,\n * canonical 名进 `tool`(认不出的域内工具落 \"unknown\",`calledTool(\"get_weather\")`\n * 仍按原名匹配)。工具执行失败(v5+ 的 `tool-error` part)映射成 `status: \"failed\"` 的\n * `operation.finished`,喂 `noFailedActions()`。\n *\n * v7 tool approval:`needsApproval` 工具被拦下时返回 `status: \"waiting\"` + 每个待批准\n * 调用一条 `input.requested`(`id` = approvalId、`action` = 工具原名、`options` =\n * approve / deny)。resume(把 `tool-approval-response` 塞回 messages 再跑一次)后的结果\n * 再交给 turnFromAiSdk,会从 `responseMessages` 里补出执行 / 拒绝的 `operation.finished`。\n */\nexport function turnFromAiSdk(result: AiSdkResultLike): AiSdkTurn {\n const stepEvents: StreamEvent[] = [];\n const steps: readonly AiSdkStepLike[] = result.steps && result.steps.length > 0\n ? result.steps\n : [{ text: result.text, toolCalls: result.toolCalls, toolResults: result.toolResults }];\n const seen = { called: new Set<string>(), resolved: new Set<string>() };\n for (const step of steps) {\n if (Array.isArray(step.content) && step.content.length > 0) {\n pushContentParts(stepEvents, step.content, seen);\n }\n else {\n pushStepFields(stepEvents, step, seen);\n }\n }\n // approval resume 时被拦工具的执行结果只在 responseMessages 里;补出的 operation.finished\n // 排在本轮 step 事件之前 —— 时间上它确实先于模型看到结果后的新输出。\n const minedEvents = mineResponseMessages(result.responseMessages, seen.resolved);\n const events = [...minedEvents, ...stepEvents];\n const waiting = events.some((e) => e.type === \"input.requested\");\n const evidenceCoverage = unclassifiedToolActionsCoverage(events);\n return {\n events,\n usage: readUsage(result, steps.length),\n status: waiting ? \"waiting\" : \"completed\",\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n}\ninterface SeenCallIds {\n called: Set<string>;\n resolved: Set<string>;\n}\n/** v5+ 路径:content parts 自带真实顺序,逐个翻译。 */\nfunction pushContentParts(events: StreamEvent[], parts: readonly AiSdkContentPartLike[], seen: SeenCallIds): void {\n for (const part of parts) {\n switch (part.type) {\n case \"text\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n break;\n }\n case \"reasoning\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"thinking\", text });\n break;\n }\n case \"tool-call\": {\n pushCalled(events, seen, {\n toolCallId: str(part.toolCallId) ?? \"unknown\",\n toolName: str(part.toolName) ?? \"unknown\",\n input: part.input ?? part.args,\n });\n break;\n }\n case \"tool-result\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: asJson(part.output ?? part.result),\n status: \"completed\",\n });\n break;\n }\n case \"tool-error\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: { error: part.error instanceof Error ? part.error.message : String(part.error) },\n status: \"failed\",\n });\n break;\n }\n case \"tool-approval-request\": {\n // 同一 step 里通常已有配对的 tool-call part(去重);没有时从 toolCall 字段补。\n const call = part.toolCall;\n if (call) {\n pushCalled(events, seen, {\n toolCallId: str(call.toolCallId) ?? \"unknown\",\n toolName: str(call.toolName) ?? \"unknown\",\n input: call.input ?? call.args,\n });\n }\n if (part.isAutomatic === true)\n break; // SDK 自动裁决,不用等人\n const request: InputRequest = {\n id: str(part.approvalId),\n action: call ? str(call.toolName) : undefined,\n input: call ? asJson(call.input ?? call.args) : undefined,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n };\n events.push({ type: \"input.requested\", request });\n break;\n }\n default:\n break; // source / file 等其余 part 类型对断言无意义,丢弃\n }\n }\n}\n/** 退路(v4 / 无 content parts):toolCalls + toolResults + text,顺序按「调用 → 结果 → 文本」近似。 */\nfunction pushStepFields(events: StreamEvent[], step: AiSdkStepLike, seen: SeenCallIds): void {\n if (step.reasoningText)\n events.push({ type: \"thinking\", text: step.reasoningText });\n for (const call of step.toolCalls ?? []) {\n pushCalled(events, seen, { toolCallId: call.toolCallId, toolName: call.toolName, input: call.input ?? call.args });\n }\n for (const res of step.toolResults ?? []) {\n seen.resolved.add(res.toolCallId);\n events.push({\n type: \"operation.finished\",\n operationId: res.toolCallId,\n kind: \"tool\",\n output: asJson(res.output ?? res.result),\n status: \"completed\",\n });\n }\n if (step.text?.trim())\n events.push({ type: \"message\", role: \"assistant\", text: step.text });\n}\n/** 同一原生 tool call ID 只发一条 operation.started(tool-call part 与 approval-request 会重)。 */\nfunction pushCalled(events: StreamEvent[], seen: SeenCallIds, call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n}): void {\n if (seen.called.has(call.toolCallId))\n return;\n seen.called.add(call.toolCallId);\n events.push({\n type: \"operation.started\",\n operationId: call.toolCallId,\n operation: {\n kind: \"tool\",\n name: call.toolName,\n input: asJson(call.input),\n tool: normalizeToolName(call.toolName),\n },\n });\n}\n/**\n * 从 responseMessages 的 tool 消息里挖 steps 没有的 tool-result(v7 approval resume 的\n * 执行结果只在这里)。output 是 ToolResultOutput 包装({ type: \"json\" | \"text\" |\n * \"execution-denied\" | \"error-text\" | … }),按类型解包;`execution-denied` → \"rejected\"。\n */\nfunction mineResponseMessages(messages: readonly AiSdkResponseMessageLike[] | undefined, resolved: ReadonlySet<string>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const msg of messages ?? []) {\n if (msg.role !== \"tool\" || !Array.isArray(msg.content))\n continue;\n for (const part of msg.content as AiSdkContentPartLike[]) {\n if (part.type !== \"tool-result\")\n continue;\n const callId = str(part.toolCallId);\n if (!callId || resolved.has(callId))\n continue;\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", ...unwrapToolOutput(part.output) });\n }\n }\n return events;\n}\nfunction unwrapToolOutput(output: unknown): {\n output?: JsonValue;\n status: \"completed\" | \"failed\" | \"rejected\";\n} {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const wrapped = output as {\n type?: unknown;\n value?: unknown;\n reason?: unknown;\n };\n switch (wrapped.type) {\n case \"json\":\n case \"text\":\n case \"content\":\n return { output: asJson(wrapped.value), status: \"completed\" };\n case \"execution-denied\":\n return {\n output: str(wrapped.reason) ? { reason: str(wrapped.reason)! } : undefined,\n status: \"rejected\",\n };\n case \"error-text\":\n case \"error-json\":\n return { output: { error: asJson(wrapped.value) }, status: \"failed\" };\n default:\n break;\n }\n }\n return { output: asJson(output), status: \"completed\" };\n}\n/** totalUsage(v5/v6 的全 steps 聚合)优先;v7 的 usage 本身就是聚合;requests = step 数。 */\nfunction readUsage(result: AiSdkResultLike, stepCount: number): Usage | undefined {\n const u = result.totalUsage ?? result.usage;\n if (!u)\n return undefined;\n const rawInput = num(u.inputTokens) ?? num(u.promptTokens) ?? 0;\n const outputTokens = num(u.outputTokens) ?? num(u.completionTokens) ?? 0;\n if (rawInput === 0 && outputTokens === 0)\n return undefined;\n const cacheRead = num(u.cachedInputTokens) ?? num(u.inputTokenDetails?.cacheReadTokens) ?? 0;\n const cacheCreation = num(u.inputTokenDetails?.cacheWriteTokens) ?? 0;\n // AI SDK 的 inputTokens 是含缓存明细的输入总量,落互斥桶前扣掉在场的明细\n // (docs/feature/adapters/sdk/ai-sdk/cost.md)\n const inputTokens = Math.max(0, rawInput - cacheRead - cacheCreation);\n const usage: Usage = { inputTokens, outputTokens, requests: Math.max(stepCount, 1) };\n if (cacheRead)\n usage.cacheReadTokens = cacheRead;\n if (cacheCreation)\n usage.cacheCreationTokens = cacheCreation;\n const reasoning = num(u.reasoningTokens);\n if (reasoning)\n usage.reasoningTokens = reasoning;\n return usage;\n}\n/** AI SDK 应用的工具多为域内自定义名(get_weather…),canonical 落 \"unknown\" 即可;仅认通用别名基表。 */\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name);\n}\n/** 工具入参 / 出参来自可替换的 AI SDK 版本;在边界立即清洗成领域 JsonValue。 */\nfunction asJson(value: unknown): JsonValue {\n return normalizeJsonValue(value);\n}\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n// ───────────────────────── 内建 agent 工厂 ─────────────────────────\n/**\n * `generate` 收到的上下文。`messages` 是本会话的完整 ModelMessage 历史(含本轮的用户消息 /\n * approval 裁决),直接透传给 generateText / streamText 即可;泛型 `M` 由调用方钉成自己\n * AI SDK 版本的 `ModelMessage`,niceeval 不引 `ai` 包。\n */\nexport interface AiSdkGenerateContext<M = JsonValue, Integration extends object = object> {\n readonly messages: M[];\n /** 实验钉的 model(ctx.model);省略 → 用应用自己的默认。 */\n readonly model?: string;\n /** 实验钉的推理努力程度(ctx.reasoningEffort);省略 → 用应用自己的默认。应用自己决定怎么塞进 providerOptions(如 OpenAI 的 reasoningEffort)。 */\n readonly reasoningEffort?: string;\n readonly signal: AbortSignal;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /**\n * 配了 `tracing`(如 `aiSdkOtel()`)才有:直接放进 generateText / streamText 的\n * `telemetry` 选项。OTel provider、per-attempt 端点绑定和轮末 flush 都由工厂做,\n * 应用侧原样透传即可。\n */\n readonly telemetry?: AiSdkTelemetrySettings<Integration>;\n}\n/**\n * generateText / streamText 的 `telemetry` 选项的形状子集。integrations 的元素是\n * `@ai-sdk/otel` 的集成实例。`Integration` 由 tracing 实现携带,niceeval 不引\n * 用户版本的 `ai` 包,也不在中间层抹成 `any`。\n */\nexport interface AiSdkTelemetrySettings<Integration extends object = object> {\n readonly integrations: readonly Integration[];\n}\n/** tracing 管线为某一轮建好的遥测件(`AiSdkTracing.telemetryForEndpoint` 的返回值)。 */\nexport interface AiSdkTurnTelemetry<Integration extends object = object> {\n /** 直接放进 generateText / streamText 的 `telemetry` 选项。 */\n settings: AiSdkTelemetrySettings<Integration>;\n /** 每轮结束后由工厂调用:轮次归属靠时间窗口,span 必须立刻送到,不能等 batch。 */\n flush(): Promise<void>;\n}\n/**\n * `aiSdkAgent` 的 tracing 管线契约。内置实现是 `niceeval/adapter/otel` 的 `aiSdkOtel()`——\n * 独立子路径导出,OTel 三件套是可选 peer 依赖,只有 import 那个入口的项目才需要安装;\n * 这里只放形状,`niceeval/adapter` 本身零 OTel 依赖。\n */\nexport interface AiSdkTracing<Integration extends object = object> {\n /** 为本轮的 OTLP 接收端点建(或复用)一条导出管线。每个 attempt 端点不同,按端点缓存。 */\n telemetryForEndpoint(endpoint: string): AiSdkTurnTelemetry<Integration>;\n}\nexport interface AiSdkAgentOptions<M = JsonValue, Integration extends object = object> {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ai-sdk\"。 */\n name?: string;\n /**\n * 开 OTel 管线(拿 `niceeval view` 的瀑布图):传 `niceeval/adapter/otel` 的\n * `aiSdkOtel()`。设了运行器就为这个 agent 开 per-attempt OTLP 接收器,工厂每轮用\n * 管线建好绑定接收端点的集成,经 `generate` 的 ctx.telemetry 交给应用,原样透传给\n * generateText / streamText 的 `telemetry` 选项即可。省略则整个 OTel 管线不开,\n * `generate` 拿到的 `telemetry` 恒为 undefined,应用侧零开销。\n *\n * ```typescript\n * import { aiSdkOtel } from \"niceeval/adapter/otel\";\n * aiSdkAgent({ tracing: aiSdkOtel(), generate });\n * ```\n */\n tracing?: AiSdkTracing<Integration>;\n /**\n * 每轮一召:拿会话历史跑一次 generateText / streamText(await 完整结果)并原样返回。\n * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。\n */\n generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;\n /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */\n data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;\n}\n/**\n * 内建的 AI SDK 进程内 agent 工厂:把「一个 generateText 调用」变成完整的 niceeval agent。\n * 应用只写 `generate`(怎么召模型),协议侧的活全部由工厂承担:\n *\n * · 多轮会话:ctx.session.id 未记录时开新会话线并 capture 回写,同一 id 续接同一份\n * messages 历史;\n * · 事件流:结果经 {@link turnFromAiSdk} 直构(toolCallId 配对、时序保真、usage);\n * · HITL:`needsApproval` 工具停轮 → `waiting` + `input.requested`;下一轮输入按行翻译成\n * tool-approval-response(以 approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝)塞回\n * messages 再召 `generate`,SDK 才会执行(或跳过)被拦的工具;\n * · 失败兜底:`generate` 抛错或结果完全为空 → `status: \"failed\"` + error 事件;\n * · tracing:传 `tracing: aiSdkOtel()`(来自 `niceeval/adapter/otel`)后,工厂替应用\n * 做完 OTel 管线——为每轮建好绑定 niceeval 接收端点的 `@ai-sdk/otel` 集成(经\n * ctx.telemetry 交给 generate,原样透传给 generateText 的 `telemetry` 即可)并在轮末\n * flush;`aiSdkOtel({ backendUrl })` 可选双发到你自己的观测后端。应用侧零埋点代码。\n *\n * ```typescript\n * import { aiSdkAgent } from \"niceeval/adapter\";\n * import { generateText, isStepCount, type ModelMessage } from \"ai\";\n *\n * export const assistant = aiSdkAgent<ModelMessage>({\n * name: \"my-assistant\",\n * generate: ({ messages, model, signal }) =>\n * generateText({ model: resolveModel(model), system: SYSTEM_PROMPT,\n * tools, stopWhen: isStepCount(5), messages, abortSignal: signal }),\n * data: (result) => ({ reply: result.text }),\n * });\n * ```\n */\nexport function aiSdkAgent<M = JsonValue, Integration extends object = object>(options: AiSdkAgentOptions<M, Integration>): Agent {\n interface SessionState {\n messages: M[];\n /** 上一轮停下的 tool approval:下一轮输入按行翻译成裁决。 */\n pendingApprovals: string[];\n }\n const sessions = new Map<string, SessionState>();\n return defineAgent({\n name: options.name ?? \"ai-sdk\",\n // 官方 SDK 完整 steps/output:全通道 complete(见 adapters/architecture/evidence.md)。\n evidenceCoverage: completeEvidenceCoverage,\n // tracing 开了才让运行器为这个 agent 起 OTLP 接收器(ctx.telemetry 才会出现);\n // AgentTracing 的其余字段(env/configure/scope)这里都用不上,空对象即可。\n tracing: options.tracing ? {} : undefined,\n async send(input, ctx) {\n // 会话续接:ctx.session.id 未记录时开新会话并 capture 回写;否则按 id 续接同一份历史。\n const id = ctx.session.id ?? `ai-sdk-${randomUUID()}`;\n ctx.session.capture(id);\n let state = sessions.get(id);\n if (!state) {\n state = { messages: [], pendingApprovals: [] };\n sessions.set(id, state);\n }\n if (state.pendingApprovals.length > 0) {\n // HITL:t.respond 的回答到 adapter 就是一次普通的带 responses 的 send,按\n // requestId(= approvalId)对位取裁决;没答到的请求直接报错,不从文本猜。\n const content = state.pendingApprovals.map((approvalId) => ({\n type: \"tool-approval-response\" as const,\n approvalId,\n approved: approvalDecision(input.responses, approvalId),\n }));\n state.pendingApprovals = [];\n state.messages.push({ role: \"tool\", content } as M);\n }\n else {\n state.messages.push(userMessage(input.text, input.files) as M);\n }\n // tracing 管线由调用方显式传入(niceeval/adapter/otel 的 aiSdkOtel()),工厂只管\n // 每轮把 per-attempt 端点交给它、轮末 flush。\n const otel = ctx.telemetry && options.tracing ? options.tracing.telemetryForEndpoint(ctx.telemetry.endpoint) : undefined;\n let result: AiSdkResultLike;\n try {\n result = await options.generate({\n messages: state.messages,\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n signal: ctx.signal,\n flags: ctx.flags,\n telemetry: otel?.settings,\n });\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw makeSendFailure({ acceptance: \"unknown\", message, cause: normalizeExternalCause(error) });\n }\n finally {\n // 轮次归属靠时间窗口:本轮 span 必须在 send 返回前送到接收器,不能等 batch。\n await otel?.flush();\n }\n // resume 的另一半义务:本次调用新产生的消息(含 approval 执行结果)进历史。\n state.messages.push(...((result.responseMessages ?? []) as M[]));\n state.pendingApprovals = collectPendingApprovals(result);\n const turn = turnFromAiSdk(result);\n // 上游偶尔退化返回完全空的结果;当正常回复会把故障伪装成通过,按失败处理。\n if (turn.events.length === 0) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: \"AI SDK returned an empty result (no text, no tool calls)\",\n });\n }\n return { ...turn, data: options.data?.(result, turn) };\n },\n });\n}\n/** 裁决词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝。 */\nfunction isApproved(line: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(line);\n}\n/** 按 requestId(= approvalId)从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text?.trim() ?? \"\");\n}\n/** 待人批准的 approval 请求 id(非 automatic)。steps 优先,退回 v7 顶层聚合 content。 */\nfunction collectPendingApprovals(result: AiSdkResultLike): string[] {\n const parts: AiSdkContentPartLike[] = [];\n if (result.steps?.length) {\n for (const step of result.steps)\n if (Array.isArray(step.content))\n parts.push(...step.content);\n }\n else if (Array.isArray(result.content)) {\n parts.push(...result.content);\n }\n const ids: string[] = [];\n for (const part of parts) {\n if (part.type !== \"tool-approval-request\" || part.isAutomatic === true)\n continue;\n const approvalId = str(part.approvalId);\n if (approvalId)\n ids.push(approvalId);\n }\n return ids;\n}\n/**\n * t.sendFile 带来的文件(base64)转成 AI SDK 的多模态用户消息;纯文本就是纯文本。\n * 用 `file` part(v7 推荐;`image` part 已废弃),mediaType 原样透传,图片之外的附件也能走。\n */\nfunction userMessage(text: string, files: readonly {\n mimeType: string;\n dataBase64: string;\n}[] | undefined): unknown {\n if (!files || files.length === 0)\n return { role: \"user\", content: text };\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: text || \"请描述这个附件。\" },\n ...files.map((f) => ({ type: \"file\", mediaType: f.mimeType, data: f.dataBase64 })),\n ],\n };\n}\n"]}
1
+ {"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["ai-sdk.ts"],"names":[],"mappings":"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","sourcesContent":["// AI SDK(Vercel `ai` 包)结果 → 标准事件流的共享转换器(采集通道 0:进程内直构)。\n//\n// 结构化 typing,不依赖 `ai` 包:niceeval 只认识 generateText / streamText 完整结果的\n// 【形状子集】。字段名跨 AI SDK 大版本漂移(v4 args/result/promptTokens、v5+ input/output/\n// inputTokens、v7 inputTokenDetails)在这里统一兜住,adapter 作者不必各自写防御代码,也不必\n// 像手工 recorder 那样包住每个工具的 execute —— AI SDK 的 steps 里本来就有带 toolCallId 的\n// 完整调用记录。\n//\n// v7 的 tool approval(工具带 `needsApproval`)也在这里兜:\n// · `tool-approval-request` part → `input.requested` 事件 + 整轮 `status: \"waiting\"`,\n// 直接满足 HITL 契约的「waiting + input.requested」两条义务(resume 仍归 adapter 管);\n// · 批准 / 拒绝后的 resume 结果里,执行结果只出现在 `responseMessages` 的 tool 消息中\n// (不在 steps 里),这里挖出来补成 `operation.finished` —— 拒绝(execution-denied)映射成\n// `status: \"rejected\"`,喂 `calledTool(..., { status: \"rejected\" })` 与 `noFailedActions()`。\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { defineAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { normalizeJsonValue } from \"../shared/json-value.ts\";\nimport { normalizeToolName as normalizeShared } from \"../o11y/tool-names.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport type { Agent, InputRequest, InputResponse, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\n// ───────────────────────── AI SDK 结果的形状子集 ─────────────────────────\n/** 一次工具调用(v5+ 用 `input`,v4 用 `args`;两者都认)。 */\nexport interface AiSdkToolCallLike {\n toolCallId: string;\n toolName: string;\n input?: unknown;\n args?: unknown;\n}\n/** 一次工具结果(v5+ 用 `output`,v4 用 `result`)。 */\nexport interface AiSdkToolResultLike {\n toolCallId: string;\n toolName?: string;\n output?: unknown;\n result?: unknown;\n}\n/**\n * step.content 的一个 part(v5+)。带类型序:同一 step 里 reasoning / text / tool-call /\n * tool-result / tool-error / tool-approval-request 按真实发生顺序排 —— 有它就优先用它,时序保真。\n */\nexport interface AiSdkContentPartLike {\n type: string;\n text?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n output?: unknown;\n result?: unknown;\n error?: unknown;\n /** v7 tool approval:`tool-approval-request` part 的请求 id 与被拦下的调用。 */\n approvalId?: unknown;\n isAutomatic?: unknown;\n toolCall?: {\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n };\n}\n/** 一个 step = 一次模型调用(工具循环里的一圈)。 */\nexport interface AiSdkStepLike {\n content?: readonly AiSdkContentPartLike[];\n text?: string;\n reasoningText?: string;\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n}\nexport interface AiSdkUsageLike {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n cachedInputTokens?: number;\n /** LanguageModelUsage(v5+)对推理模型(o-series 等)带回的思考 token,已计入 outputTokens。 */\n reasoningTokens?: number;\n /** v7:cache 细分挪进了 inputTokenDetails。 */\n inputTokenDetails?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n}\n/** result.responseMessages 的一条(只认 tool 消息里的 tool-result part,其余略过)。 */\nexport interface AiSdkResponseMessageLike {\n role?: unknown;\n content?: unknown;\n}\n/** generateText / streamText 完整结果的形状子集。没有 steps 的老结果退回顶层字段。 */\nexport interface AiSdkResultLike {\n text?: string;\n steps?: readonly AiSdkStepLike[];\n /** v7:跨全部 step 聚合的 content parts(approval 请求也在里面)。 */\n content?: readonly AiSdkContentPartLike[];\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n /** v5/v6 聚合全部 step 的用量;优先于 usage(v6 的 usage 只是最后一个 step,v7 起也是聚合)。 */\n totalUsage?: AiSdkUsageLike;\n usage?: AiSdkUsageLike;\n /**\n * 本次调用新产生的消息(v7)。tool approval 批准 / 拒绝后,被拦工具的执行结果只出现在\n * 这里的 tool 消息里(不进 steps),turnFromAiSdk 从中补齐 `operation.finished`。\n */\n responseMessages?: readonly AiSdkResponseMessageLike[];\n}\n/** turnFromAiSdk 的返回:铺进 `Turn` 即可(data 仍归调用方 —— 结构化输出是应用自己的语义)。 */\nexport interface AiSdkTurn {\n events: StreamEvent[];\n usage?: Usage;\n /** 有待人批准的工具调用(非 automatic 的 tool-approval-request)→ \"waiting\",否则 \"completed\"。 */\n status: \"completed\" | \"waiting\";\n /** 通用 AI SDK tool call 没有原生 command 分类时,随有工具调用的 Turn 降级 actions。 */\n evidenceCoverage?: {\n readonly actions: {\n readonly status: \"partial\";\n readonly reason: string;\n };\n };\n}\n// ───────────────────────── 转换 ─────────────────────────\n/**\n * AI SDK 结果 → `{ events, usage, status }`,直接铺进 `Turn` 返回:\n *\n * ```typescript\n * const result = await generateText({ model, tools, prompt: input.text });\n * return { ...turnFromAiSdk(result), data: result.text };\n * ```\n *\n * `callId` 用 AI SDK 原生的 `toolCallId`(显式配对,不合成);工具名保留原名进 `name`,\n * canonical 名进 `tool`(认不出的域内工具落 \"unknown\",`calledTool(\"get_weather\")`\n * 仍按原名匹配)。工具执行失败(v5+ 的 `tool-error` part)映射成 `status: \"failed\"` 的\n * `operation.finished`,喂 `noFailedActions()`。\n *\n * v7 tool approval:`needsApproval` 工具被拦下时返回 `status: \"waiting\"` + 每个待批准\n * 调用一条 `input.requested`(`id` = approvalId、`action` = 工具原名、`options` =\n * approve / deny)。resume(把 `tool-approval-response` 塞回 messages 再跑一次)后的结果\n * 再交给 turnFromAiSdk,会从 `responseMessages` 里补出执行 / 拒绝的 `operation.finished`。\n */\nexport function turnFromAiSdk(result: AiSdkResultLike): AiSdkTurn {\n const stepEvents: StreamEvent[] = [];\n const steps: readonly AiSdkStepLike[] = result.steps && result.steps.length > 0\n ? result.steps\n : [{ text: result.text, toolCalls: result.toolCalls, toolResults: result.toolResults }];\n const seen = { called: new Set<string>(), resolved: new Set<string>() };\n for (const step of steps) {\n if (Array.isArray(step.content) && step.content.length > 0) {\n pushContentParts(stepEvents, step.content, seen);\n }\n else {\n pushStepFields(stepEvents, step, seen);\n }\n }\n // approval resume 时被拦工具的执行结果只在 responseMessages 里;补出的 operation.finished\n // 排在本轮 step 事件之前 —— 时间上它确实先于模型看到结果后的新输出。\n const minedEvents = mineResponseMessages(result.responseMessages, seen.resolved);\n const events = [...minedEvents, ...stepEvents];\n const waiting = events.some((e) => e.type === \"input.requested\");\n const evidenceCoverage = unclassifiedToolActionsCoverage(events);\n return {\n events,\n usage: readUsage(result, steps.length),\n status: waiting ? \"waiting\" : \"completed\",\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n}\ninterface SeenCallIds {\n called: Set<string>;\n resolved: Set<string>;\n}\n/** v5+ 路径:content parts 自带真实顺序,逐个翻译。 */\nfunction pushContentParts(events: StreamEvent[], parts: readonly AiSdkContentPartLike[], seen: SeenCallIds): void {\n for (const part of parts) {\n switch (part.type) {\n case \"text\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n break;\n }\n case \"reasoning\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"thinking\", text });\n break;\n }\n case \"tool-call\": {\n pushCalled(events, seen, {\n toolCallId: str(part.toolCallId) ?? \"unknown\",\n toolName: str(part.toolName) ?? \"unknown\",\n input: part.input ?? part.args,\n });\n break;\n }\n case \"tool-result\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: asJson(part.output ?? part.result),\n status: \"completed\",\n });\n break;\n }\n case \"tool-error\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: { error: part.error instanceof Error ? part.error.message : String(part.error) },\n status: \"failed\",\n });\n break;\n }\n case \"tool-approval-request\": {\n // 同一 step 里通常已有配对的 tool-call part(去重);没有时从 toolCall 字段补。\n const call = part.toolCall;\n if (call) {\n pushCalled(events, seen, {\n toolCallId: str(call.toolCallId) ?? \"unknown\",\n toolName: str(call.toolName) ?? \"unknown\",\n input: call.input ?? call.args,\n });\n }\n if (part.isAutomatic === true)\n break; // SDK 自动裁决,不用等人\n const request: InputRequest = {\n id: str(part.approvalId),\n action: call ? str(call.toolName) : undefined,\n input: call ? asJson(call.input ?? call.args) : undefined,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n };\n events.push({ type: \"input.requested\", request });\n break;\n }\n default:\n break; // source / file 等其余 part 类型对断言无意义,丢弃\n }\n }\n}\n/** 退路(v4 / 无 content parts):toolCalls + toolResults + text,顺序按「调用 → 结果 → 文本」近似。 */\nfunction pushStepFields(events: StreamEvent[], step: AiSdkStepLike, seen: SeenCallIds): void {\n if (step.reasoningText)\n events.push({ type: \"thinking\", text: step.reasoningText });\n for (const call of step.toolCalls ?? []) {\n pushCalled(events, seen, { toolCallId: call.toolCallId, toolName: call.toolName, input: call.input ?? call.args });\n }\n for (const res of step.toolResults ?? []) {\n seen.resolved.add(res.toolCallId);\n events.push({\n type: \"operation.finished\",\n operationId: res.toolCallId,\n kind: \"tool\",\n output: asJson(res.output ?? res.result),\n status: \"completed\",\n });\n }\n if (step.text?.trim())\n events.push({ type: \"message\", role: \"assistant\", text: step.text });\n}\n/** 同一原生 tool call ID 只发一条 operation.started(tool-call part 与 approval-request 会重)。 */\nfunction pushCalled(events: StreamEvent[], seen: SeenCallIds, call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n}): void {\n if (seen.called.has(call.toolCallId))\n return;\n seen.called.add(call.toolCallId);\n events.push({\n type: \"operation.started\",\n operationId: call.toolCallId,\n operation: {\n kind: \"tool\",\n name: call.toolName,\n input: asJson(call.input),\n tool: normalizeToolName(call.toolName),\n },\n });\n}\n/**\n * 从 responseMessages 的 tool 消息里挖 steps 没有的 tool-result(v7 approval resume 的\n * 执行结果只在这里)。output 是 ToolResultOutput 包装({ type: \"json\" | \"text\" |\n * \"execution-denied\" | \"error-text\" | … }),按类型解包;`execution-denied` → \"rejected\"。\n */\nfunction mineResponseMessages(messages: readonly AiSdkResponseMessageLike[] | undefined, resolved: ReadonlySet<string>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const msg of messages ?? []) {\n if (msg.role !== \"tool\" || !Array.isArray(msg.content))\n continue;\n for (const part of msg.content as AiSdkContentPartLike[]) {\n if (part.type !== \"tool-result\")\n continue;\n const callId = str(part.toolCallId);\n if (!callId || resolved.has(callId))\n continue;\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", ...unwrapToolOutput(part.output) });\n }\n }\n return events;\n}\nfunction unwrapToolOutput(output: unknown): {\n output?: JsonValue;\n status: \"completed\" | \"failed\" | \"rejected\";\n} {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const wrapped = output as {\n type?: unknown;\n value?: unknown;\n reason?: unknown;\n };\n switch (wrapped.type) {\n case \"json\":\n case \"text\":\n case \"content\":\n return { output: asJson(wrapped.value), status: \"completed\" };\n case \"execution-denied\":\n return {\n output: str(wrapped.reason) ? { reason: str(wrapped.reason)! } : undefined,\n status: \"rejected\",\n };\n case \"error-text\":\n case \"error-json\":\n return { output: { error: asJson(wrapped.value) }, status: \"failed\" };\n default:\n break;\n }\n }\n return { output: asJson(output), status: \"completed\" };\n}\n/** totalUsage(v5/v6 的全 steps 聚合)优先;v7 的 usage 本身就是聚合;requests = step 数。 */\nfunction readUsage(result: AiSdkResultLike, stepCount: number): Usage | undefined {\n const u = result.totalUsage ?? result.usage;\n if (!u)\n return undefined;\n const rawInput = num(u.inputTokens) ?? num(u.promptTokens) ?? 0;\n const outputTokens = num(u.outputTokens) ?? num(u.completionTokens) ?? 0;\n if (rawInput === 0 && outputTokens === 0)\n return undefined;\n const cacheRead = num(u.cachedInputTokens) ?? num(u.inputTokenDetails?.cacheReadTokens) ?? 0;\n const cacheCreation = num(u.inputTokenDetails?.cacheWriteTokens) ?? 0;\n // AI SDK 的 inputTokens 是含缓存明细的输入总量,落互斥桶前扣掉在场的明细\n // (docs/feature/adapters/sdk/ai-sdk/cost.md)\n const inputTokens = Math.max(0, rawInput - cacheRead - cacheCreation);\n const usage: Usage = { inputTokens, outputTokens, requests: Math.max(stepCount, 1) };\n if (cacheRead)\n usage.cacheReadTokens = cacheRead;\n if (cacheCreation)\n usage.cacheCreationTokens = cacheCreation;\n const reasoning = num(u.reasoningTokens);\n if (reasoning)\n usage.reasoningTokens = reasoning;\n return usage;\n}\n/** AI SDK 应用的工具多为域内自定义名(get_weather…),canonical 落 \"unknown\" 即可;仅认通用别名基表。 */\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name);\n}\n/** 工具入参 / 出参来自可替换的 AI SDK 版本;在边界立即清洗成领域 JsonValue。 */\nfunction asJson(value: unknown): JsonValue {\n return normalizeJsonValue(value);\n}\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n// ───────────────────────── 内建 agent 工厂 ─────────────────────────\n/**\n * `generate` 收到的上下文。`messages` 是本会话的完整 ModelMessage 历史(含本轮的用户消息 /\n * approval 裁决),直接透传给 generateText / streamText 即可;泛型 `M` 由调用方钉成自己\n * AI SDK 版本的 `ModelMessage`,niceeval 不引 `ai` 包。\n */\nexport interface AiSdkGenerateContext<M = JsonValue, Integration extends object = object> {\n readonly messages: M[];\n /** 实验钉的 model(ctx.model);省略 → 用应用自己的默认。 */\n readonly model?: string;\n /** 实验钉的推理努力程度(ctx.reasoningEffort);省略 → 用应用自己的默认。应用自己决定怎么塞进 providerOptions(如 OpenAI 的 reasoningEffort)。 */\n readonly reasoningEffort?: string;\n readonly signal: AbortSignal;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /**\n * 配了 `tracing`(如 `aiSdkOtel()`)才有:直接放进 generateText / streamText 的\n * `telemetry` 选项。OTel provider、per-attempt 端点绑定和轮末 flush 都由工厂做,\n * 应用侧原样透传即可。\n */\n readonly telemetry?: AiSdkTelemetrySettings<Integration>;\n}\n/**\n * generateText / streamText 的 `telemetry` 选项的形状子集。integrations 的元素是\n * `@ai-sdk/otel` 的集成实例。`Integration` 由 tracing 实现携带,niceeval 不引\n * 用户版本的 `ai` 包,也不在中间层抹成 `any`。\n */\nexport interface AiSdkTelemetrySettings<Integration extends object = object> {\n readonly integrations: readonly Integration[];\n}\n/** tracing 管线为某一轮建好的遥测件(`AiSdkTracing.telemetryForEndpoint` 的返回值)。 */\nexport interface AiSdkTurnTelemetry<Integration extends object = object> {\n /** 直接放进 generateText / streamText 的 `telemetry` 选项。 */\n settings: AiSdkTelemetrySettings<Integration>;\n /** 每轮结束后由工厂调用:轮次归属靠时间窗口,span 必须立刻送到,不能等 batch。 */\n flush(): Promise<void>;\n}\n/**\n * `aiSdkAgent` 的 tracing 管线契约。内置实现是 `niceeval/adapter/otel` 的 `aiSdkOtel()`——\n * 独立子路径导出,OTel 三件套是可选 peer 依赖,只有 import 那个入口的项目才需要安装;\n * 这里只放形状,`niceeval/adapter` 本身零 OTel 依赖。\n */\nexport interface AiSdkTracing<Integration extends object = object> {\n /** 为本轮的 OTLP 接收端点建(或复用)一条导出管线。每个 attempt 端点不同,按端点缓存。 */\n telemetryForEndpoint(endpoint: string): AiSdkTurnTelemetry<Integration>;\n}\nexport interface AiSdkAgentOptions<M = JsonValue, Integration extends object = object> {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ai-sdk\"。 */\n name?: string;\n /**\n * 开 OTel 管线(拿 `niceeval view` 的瀑布图):传 `niceeval/adapter/otel` 的\n * `aiSdkOtel()`。设了运行器就为这个 agent 开 per-attempt OTLP 接收器,工厂每轮用\n * 管线建好绑定接收端点的集成,经 `generate` 的 ctx.telemetry 交给应用,原样透传给\n * generateText / streamText 的 `telemetry` 选项即可。省略则整个 OTel 管线不开,\n * `generate` 拿到的 `telemetry` 恒为 undefined,应用侧零开销。\n *\n * ```typescript\n * import { aiSdkOtel } from \"niceeval/adapter/otel\";\n * aiSdkAgent({ tracing: aiSdkOtel(), generate });\n * ```\n */\n tracing?: AiSdkTracing<Integration>;\n /**\n * 每轮一召:拿会话历史跑一次 generateText / streamText(await 完整结果)并原样返回。\n * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。\n */\n generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;\n /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */\n data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;\n}\n/**\n * 内建的 AI SDK 进程内 agent 工厂:把「一个 generateText 调用」变成完整的 niceeval agent。\n * 应用只写 `generate`(怎么召模型),协议侧的活全部由工厂承担:\n *\n * · 多轮会话:ctx.session.id 未记录时开新会话线并 capture 回写,同一 id 续接同一份\n * messages 历史;\n * · 事件流:结果经 {@link turnFromAiSdk} 直构(toolCallId 配对、时序保真、usage);\n * · HITL:`needsApproval` 工具停轮 → `waiting` + `input.requested`;下一轮输入按行翻译成\n * tool-approval-response(以 approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝)塞回\n * messages 再召 `generate`,SDK 才会执行(或跳过)被拦的工具;\n * · 失败兜底:`generate` 抛错或结果完全为空 → `status: \"failed\"` + error 事件;\n * · tracing:传 `tracing: aiSdkOtel()`(来自 `niceeval/adapter/otel`)后,工厂替应用\n * 做完 OTel 管线——为每轮建好绑定 niceeval 接收端点的 `@ai-sdk/otel` 集成(经\n * ctx.telemetry 交给 generate,原样透传给 generateText 的 `telemetry` 即可)并在轮末\n * flush;`aiSdkOtel({ backendUrl })` 可选双发到你自己的观测后端。应用侧零埋点代码。\n *\n * ```typescript\n * import { aiSdkAgent } from \"niceeval/adapter\";\n * import { generateText, isStepCount, type ModelMessage } from \"ai\";\n *\n * export const assistant = aiSdkAgent<ModelMessage>({\n * name: \"my-assistant\",\n * generate: ({ messages, model, signal }) =>\n * generateText({ model: resolveModel(model), system: SYSTEM_PROMPT,\n * tools, stopWhen: isStepCount(5), messages, abortSignal: signal }),\n * data: (result) => ({ reply: result.text }),\n * });\n * ```\n */\nexport function aiSdkAgent<M = JsonValue, Integration extends object = object>(options: AiSdkAgentOptions<M, Integration>): Agent {\n interface SessionState {\n messages: M[];\n /** 上一轮停下的 tool approval:下一轮输入按行翻译成裁决。 */\n pendingApprovals: string[];\n }\n const sessions = new Map<string, SessionState>();\n return defineAgent({\n name: options.name ?? \"ai-sdk\",\n // 官方 SDK 完整 steps/output:全通道 complete(见 adapters/architecture/evidence.md)。\n evidenceCoverage: completeEvidenceCoverage,\n // tracing 开了才让运行器为这个 agent 起 OTLP 接收器(ctx.telemetry 才会出现);\n // AgentTracing 的其余字段(env/configure/scope)这里都用不上,空对象即可。\n tracing: options.tracing ? {} : undefined,\n async send(input, ctx) {\n // 会话续接:ctx.session.id 未记录时开新会话并 capture 回写;否则按 id 续接同一份历史。\n const id = ctx.session.id ?? `ai-sdk-${randomUUID()}`;\n ctx.session.capture(id);\n let state = sessions.get(id);\n if (!state) {\n state = { messages: [], pendingApprovals: [] };\n sessions.set(id, state);\n }\n if (state.pendingApprovals.length > 0) {\n // HITL:t.respond 的回答到 adapter 就是一次普通的带 responses 的 send,按\n // requestId(= approvalId)对位取裁决;没答到的请求直接报错,不从文本猜。\n const content = state.pendingApprovals.map((approvalId) => ({\n type: \"tool-approval-response\" as const,\n approvalId,\n approved: approvalDecision(input.responses, approvalId),\n }));\n state.pendingApprovals = [];\n state.messages.push({ role: \"tool\", content } as M);\n }\n else {\n state.messages.push(userMessage(input.text, input.files) as M);\n }\n // tracing 管线由调用方显式传入(niceeval/adapter/otel 的 aiSdkOtel()),工厂只管\n // 每轮把 per-attempt 端点交给它、轮末 flush。\n const otel = ctx.telemetry && options.tracing ? options.tracing.telemetryForEndpoint(ctx.telemetry.endpoint) : undefined;\n let result: AiSdkResultLike;\n try {\n result = await options.generate({\n messages: state.messages,\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n signal: ctx.signal,\n flags: ctx.flags,\n telemetry: otel?.settings,\n });\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw makeSendFailure({ acceptance: \"unknown\", message, cause: normalizeExternalCause(error) });\n }\n finally {\n // 轮次归属靠时间窗口:本轮 span 必须在 send 返回前送到接收器,不能等 batch。\n await otel?.flush();\n }\n // resume 的另一半义务:本次调用新产生的消息(含 approval 执行结果)进历史。\n state.messages.push(...((result.responseMessages ?? []) as M[]));\n state.pendingApprovals = collectPendingApprovals(result);\n const turn = turnFromAiSdk(result);\n // 上游偶尔退化返回完全空的结果;当正常回复会把故障伪装成通过,按失败处理。\n if (turn.events.length === 0) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: \"AI SDK returned an empty result (no text, no tool calls)\",\n });\n }\n return { ...turn, data: options.data?.(result, turn) };\n },\n });\n}\n/** 裁决词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝。 */\nfunction isApproved(line: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(line);\n}\n/** 按 requestId(= approvalId)从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text?.trim() ?? \"\");\n}\n/** 待人批准的 approval 请求 id(非 automatic)。steps 优先,退回 v7 顶层聚合 content。 */\nfunction collectPendingApprovals(result: AiSdkResultLike): string[] {\n const parts: AiSdkContentPartLike[] = [];\n if (result.steps?.length) {\n for (const step of result.steps)\n if (Array.isArray(step.content))\n parts.push(...step.content);\n }\n else if (Array.isArray(result.content)) {\n parts.push(...result.content);\n }\n const ids: string[] = [];\n for (const part of parts) {\n if (part.type !== \"tool-approval-request\" || part.isAutomatic === true)\n continue;\n const approvalId = str(part.approvalId);\n if (approvalId)\n ids.push(approvalId);\n }\n return ids;\n}\n/**\n * t.sendFile 带来的文件(base64)转成 AI SDK 的多模态用户消息;纯文本就是纯文本。\n * 用 `file` part(v7 推荐;`image` part 已废弃),mediaType 原样透传,图片之外的附件也能走。\n */\nfunction userMessage(text: string, files: readonly {\n mimeType: string;\n dataBase64: string;\n}[] | undefined): unknown {\n if (!files || files.length === 0)\n return { role: \"user\", content: text };\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: text || \"请描述这个附件。\" },\n ...files.map((f) => ({ type: \"file\", mediaType: f.mimeType, data: f.dataBase64 })),\n ],\n };\n}\n"]}
@@ -179,7 +179,7 @@ export interface AiSdkAgentOptions<M = JsonValue, Integration extends object = o
179
179
  * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。
180
180
  */
181
181
  generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;
182
- /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */
182
+ /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */
183
183
  data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;
184
184
  }
185
185
  /**
@@ -179,7 +179,7 @@ export interface AiSdkAgentOptions<M = JsonValue, Integration extends object = o
179
179
  * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。
180
180
  */
181
181
  generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;
182
- /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */
182
+ /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */
183
183
  data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;
184
184
  }
185
185
  /**
@@ -179,7 +179,7 @@ export interface AiSdkAgentOptions<M = JsonValue, Integration extends object = o
179
179
  * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。
180
180
  */
181
181
  generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;
182
- /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */
182
+ /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */
183
183
  data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;
184
184
  }
185
185
  /**
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AGENT_BASELINE_RECIPE_REVISION = exports.AGENT_BASELINE_VERSION = exports.DEFAULT_OPENCLAW_CLI_VERSION = exports.DEFAULT_HERMES_CLI_VERSION = exports.DEFAULT_OPENCODE_CLI_VERSION = exports.DEFAULT_BUB_VERSION = exports.DEFAULT_CLAUDE_CODE_CLI_VERSION = exports.DEFAULT_CODEX_CLI_VERSION = void 0;
3
+ exports.AGENT_BASELINE_RECIPE_REVISION = exports.AGENT_BASELINE_VERSION = exports.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = exports.DEFAULT_BUN_VERSION = exports.DEFAULT_OMP_CLI_VERSION = exports.DEFAULT_OPENCLAW_CLI_VERSION = exports.DEFAULT_HERMES_CLI_VERSION = exports.DEFAULT_OPENCODE_CLI_VERSION = exports.DEFAULT_BUB_VERSION = exports.DEFAULT_CLAUDE_CODE_CLI_VERSION = exports.DEFAULT_CODEX_CLI_VERSION = void 0;
4
4
  exports.agentBaselineVersionTag = agentBaselineVersionTag;
5
5
  /** Coding-agent CLI versions used by runtime fallback installs and official sandbox recipes. */
6
6
  exports.DEFAULT_CODEX_CLI_VERSION = "0.144.1";
@@ -18,6 +18,11 @@ exports.DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
18
18
  exports.DEFAULT_HERMES_CLI_VERSION = "0.19.0";
19
19
  /** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */
20
20
  exports.DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
21
+ /** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */
22
+ exports.DEFAULT_OMP_CLI_VERSION = "17.3.5";
23
+ exports.DEFAULT_BUN_VERSION = "1.3.14";
24
+ /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
25
+ exports.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
21
26
  /** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */
22
27
  exports.AGENT_BASELINE_VERSION = {
23
28
  "claude-code": exports.DEFAULT_CLAUDE_CODE_CLI_VERSION,
@@ -26,6 +31,8 @@ exports.AGENT_BASELINE_VERSION = {
26
31
  opencode: exports.DEFAULT_OPENCODE_CLI_VERSION,
27
32
  hermes: exports.DEFAULT_HERMES_CLI_VERSION,
28
33
  openclaw: exports.DEFAULT_OPENCLAW_CLI_VERSION,
34
+ omp: exports.DEFAULT_OMP_CLI_VERSION,
35
+ "deepseek-harness": exports.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION,
29
36
  };
30
37
  /**
31
38
  * NiceEval 基线配方自身的修订号——制品版本号的 `-r` 位。
@@ -58,6 +65,8 @@ exports.AGENT_BASELINE_RECIPE_REVISION = {
58
65
  // r2: 同上「USER node」配方变更
59
66
  // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)
60
67
  openclaw: 3,
68
+ omp: 1,
69
+ "deepseek-harness": 1,
61
70
  };
62
71
  /**
63
72
  * 官方基线制品的版本 tag:`<Agent 版本>-r<配方修订>`,如 `0.144.1-r2`。
@@ -1 +1 @@
1
- {"version":3,"file":"coding-cli-versions.js","sourceRoot":"","sources":["coding-cli-versions.ts"],"names":[],"mappings":";;;AAsEA,0DAEC;AAxED,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,SAAS,CAAC;AACtC,QAAA,+BAA+B,GAAG,SAAS,CAAC;AACzD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAC3C,6CAA6C;AAChC,QAAA,4BAA4B,GAAG,QAAQ,CAAC;AACrD,+CAA+C;AAClC,QAAA,0BAA0B,GAAG,QAAQ,CAAC;AACnD,0CAA0C;AAC7B,QAAA,4BAA4B,GAAG,YAAY,CAAC;AAQzD,0CAA0C;AAC7B,QAAA,sBAAsB,GAAmD;IAClF,aAAa,EAAE,uCAA+B;IAC9C,KAAK,EAAE,iCAAyB;IAChC,GAAG,EAAE,2BAAmB;IACxB,QAAQ,EAAE,oCAA4B;IACtC,MAAM,EAAE,kCAA0B;IAClC,QAAQ,EAAE,oCAA4B;CACzC,CAAC;AACF;;;;;;GAMG;AACH,0EAA0E;AAC1E,kDAAkD;AACrC,QAAA,8BAA8B,GAAmD;IAC1F,yDAAyD;IACzD,6EAA6E;IAC7E,kDAAkD;IAClD,8EAA8E;IAC9E,sBAAsB;IACtB,aAAa,EAAE,CAAC;IAChB,kDAAkD;IAClD,wBAAwB;IACxB,uCAAuC;IACvC,KAAK,EAAE,CAAC;IACR,kCAAkC;IAClC,GAAG,EAAE,CAAC;IACN,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,EAAE,CAAC;IACT,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;CACd,CAAC;AACF;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,KAA0B;IAC9D,OAAO,GAAG,8BAAsB,CAAC,KAAK,CAAC,KAAK,sCAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC","sourcesContent":["/** Coding-agent CLI versions used by runtime fallback installs and official sandbox recipes. */\nexport const DEFAULT_CODEX_CLI_VERSION = \"0.144.1\";\nexport const DEFAULT_CLAUDE_CODE_CLI_VERSION = \"2.1.207\";\n/**\n * Bub release installed from PyPI by runtime fallback installs and official sandbox recipes.\n *\n * 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,\n * 配错代不会安装失败,而是时间轨静默为空。\n */\nexport const DEFAULT_BUB_VERSION = \"0.4.0\";\n/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */\nexport const DEFAULT_OPENCODE_CLI_VERSION = \"1.18.5\";\n/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */\nexport const DEFAULT_HERMES_CLI_VERSION = \"0.19.0\";\n/** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */\nexport const DEFAULT_OPENCLAW_CLI_VERSION = \"2026.7.1-2\";\n/**\n * 有官方公共基线制品的内置 coding agent。\n *\n * Docker 侧六家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub\n *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。\n */\nexport type CodingAgentBaseline = \"claude-code\" | \"codex\" | \"bub\" | \"opencode\" | \"hermes\" | \"openclaw\";\n/** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */\nexport const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string> = {\n \"claude-code\": DEFAULT_CLAUDE_CODE_CLI_VERSION,\n codex: DEFAULT_CODEX_CLI_VERSION,\n bub: DEFAULT_BUB_VERSION,\n opencode: DEFAULT_OPENCODE_CLI_VERSION,\n hermes: DEFAULT_HERMES_CLI_VERSION,\n openclaw: DEFAULT_OPENCLAW_CLI_VERSION,\n};\n/**\n * NiceEval 基线配方自身的修订号——制品版本号的 `-r` 位。\n *\n * Agent 版本没变、配方变了(Node 工具契约、PATH 规范化、换 pin 的 commit、插件集合)就 +1;\n * Agent 版本一变归 1。已发布的 tag 不可原地覆盖,配方变更必须在版本里有位置表达。\n * 一个 Agent 的 E2B 与 Docker 制品共用这个号:一个版本号 = 一套基线配方,两侧同步重建。\n */\n// r4/r5(视 Agent 而定)未发布过镜像:补的「/usr/local/bin 与 /usr/local/lib/node_modules\n// 对运行用户可写」(跨 provider 基线工具面第三条)并进这次未发布修订,不再额外 +1。\nexport const AGENT_BASELINE_RECIPE_REVISION: globalThis.Record<CodingAgentBaseline, number> = {\n // r3: Dockerfile 里 npm 全局装完后显式 `USER node`——运行时不再强加执行身份,\n // 改为沿用镜像自己声明的 USER,非 root 必须由配方自己声明(见 docs/feature/sandbox/library.md「执行身份」)\n // r4: 跨 provider 基线工具面统一——不预装 yarn 实体,补齐 python3,\n // 并补 /usr/local 对运行用户可写(docs/feature/sandbox/library/prebuilt-environments.md\n // 「跨 provider 基线工具面」)\n \"claude-code\": 4,\n // r3: staged 安装改用自带运行时的原生平台包(不再要求沙箱里有 node / npm)\n // r4: 同上「USER node」配方变更\n // r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n codex: 5,\n // r2: 跨 provider 基线工具面统一(同上,含可写性)\n bub: 2,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n opencode: 3,\n // r2: 跨 provider 基线工具面统一——本 target 原本单独装的 python3 现由 base 统一提供,\n // 配方内容变了但不预装 yarn 不改变行为(同上,含可写性)\n hermes: 2,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n openclaw: 3,\n};\n/**\n * 官方基线制品的版本 tag:`<Agent 版本>-r<配方修订>`,如 `0.144.1-r2`。\n *\n * niceeval 自身的版本不参与命名——库与制品内容无关,发版不该连带重建没变的制品,\n * 换 Agent 版本也不该等库发版。\n */\nexport function agentBaselineVersionTag(agent: CodingAgentBaseline): string {\n return `${AGENT_BASELINE_VERSION[agent]}-r${AGENT_BASELINE_RECIPE_REVISION[agent]}`;\n}\n"]}
1
+ {"version":3,"file":"coding-cli-versions.js","sourceRoot":"","sources":["coding-cli-versions.ts"],"names":[],"mappings":";;;AA+EA,0DAEC;AAjFD,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,SAAS,CAAC;AACtC,QAAA,+BAA+B,GAAG,SAAS,CAAC;AACzD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAC3C,6CAA6C;AAChC,QAAA,4BAA4B,GAAG,QAAQ,CAAC;AACrD,+CAA+C;AAClC,QAAA,0BAA0B,GAAG,QAAQ,CAAC;AACnD,0CAA0C;AAC7B,QAAA,4BAA4B,GAAG,YAAY,CAAC;AACzD,2DAA2D;AAC9C,QAAA,uBAAuB,GAAG,QAAQ,CAAC;AACnC,QAAA,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,qDAAqD;AACxC,QAAA,oCAAoC,GAAG,YAAY,CAAC;AAQjE,0CAA0C;AAC7B,QAAA,sBAAsB,GAAmD;IAClF,aAAa,EAAE,uCAA+B;IAC9C,KAAK,EAAE,iCAAyB;IAChC,GAAG,EAAE,2BAAmB;IACxB,QAAQ,EAAE,oCAA4B;IACtC,MAAM,EAAE,kCAA0B;IAClC,QAAQ,EAAE,oCAA4B;IACtC,GAAG,EAAE,+BAAuB;IAC5B,kBAAkB,EAAE,4CAAoC;CAC3D,CAAC;AACF;;;;;;GAMG;AACH,0EAA0E;AAC1E,kDAAkD;AACrC,QAAA,8BAA8B,GAAmD;IAC1F,yDAAyD;IACzD,6EAA6E;IAC7E,kDAAkD;IAClD,8EAA8E;IAC9E,sBAAsB;IACtB,aAAa,EAAE,CAAC;IAChB,kDAAkD;IAClD,wBAAwB;IACxB,uCAAuC;IACvC,KAAK,EAAE,CAAC;IACR,kCAAkC;IAClC,GAAG,EAAE,CAAC;IACN,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,EAAE,CAAC;IACT,wBAAwB;IACxB,uCAAuC;IACvC,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,kBAAkB,EAAE,CAAC;CACxB,CAAC;AACF;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,KAA0B;IAC9D,OAAO,GAAG,8BAAsB,CAAC,KAAK,CAAC,KAAK,sCAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC","sourcesContent":["/** Coding-agent CLI versions used by runtime fallback installs and official sandbox recipes. */\nexport const DEFAULT_CODEX_CLI_VERSION = \"0.144.1\";\nexport const DEFAULT_CLAUDE_CODE_CLI_VERSION = \"2.1.207\";\n/**\n * Bub release installed from PyPI by runtime fallback installs and official sandbox recipes.\n *\n * 换版本时同批核对 `bub-install-spec.ts` 的 OTel 插件 pin:插件与 Bub 的 tape 协议同代,\n * 配错代不会安装失败,而是时间轨静默为空。\n */\nexport const DEFAULT_BUB_VERSION = \"0.4.0\";\n/** OpenCode CLI(npm `opencode-ai`)默认钉的版本。 */\nexport const DEFAULT_OPENCODE_CLI_VERSION = \"1.18.5\";\n/** Hermes Agent(PyPI `hermes-agent`)默认钉的版本。 */\nexport const DEFAULT_HERMES_CLI_VERSION = \"0.19.0\";\n/** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */\nexport const DEFAULT_OPENCLAW_CLI_VERSION = \"2026.7.1-2\";\n/** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */\nexport const DEFAULT_OMP_CLI_VERSION = \"17.3.5\";\nexport const DEFAULT_BUN_VERSION = \"1.3.14\";\n/** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */\nexport const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = \"0.1.0-rc.7\";\n/**\n * 有官方公共基线制品的 coding agent。\n *\n * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub\n *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。\n */\nexport type CodingAgentBaseline = \"claude-code\" | \"codex\" | \"bub\" | \"opencode\" | \"hermes\" | \"openclaw\" | \"omp\" | \"deepseek-harness\";\n/** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */\nexport const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string> = {\n \"claude-code\": DEFAULT_CLAUDE_CODE_CLI_VERSION,\n codex: DEFAULT_CODEX_CLI_VERSION,\n bub: DEFAULT_BUB_VERSION,\n opencode: DEFAULT_OPENCODE_CLI_VERSION,\n hermes: DEFAULT_HERMES_CLI_VERSION,\n openclaw: DEFAULT_OPENCLAW_CLI_VERSION,\n omp: DEFAULT_OMP_CLI_VERSION,\n \"deepseek-harness\": DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION,\n};\n/**\n * NiceEval 基线配方自身的修订号——制品版本号的 `-r` 位。\n *\n * Agent 版本没变、配方变了(Node 工具契约、PATH 规范化、换 pin 的 commit、插件集合)就 +1;\n * Agent 版本一变归 1。已发布的 tag 不可原地覆盖,配方变更必须在版本里有位置表达。\n * 一个 Agent 的 E2B 与 Docker 制品共用这个号:一个版本号 = 一套基线配方,两侧同步重建。\n */\n// r4/r5(视 Agent 而定)未发布过镜像:补的「/usr/local/bin 与 /usr/local/lib/node_modules\n// 对运行用户可写」(跨 provider 基线工具面第三条)并进这次未发布修订,不再额外 +1。\nexport const AGENT_BASELINE_RECIPE_REVISION: globalThis.Record<CodingAgentBaseline, number> = {\n // r3: Dockerfile 里 npm 全局装完后显式 `USER node`——运行时不再强加执行身份,\n // 改为沿用镜像自己声明的 USER,非 root 必须由配方自己声明(见 docs/feature/sandbox/library.md「执行身份」)\n // r4: 跨 provider 基线工具面统一——不预装 yarn 实体,补齐 python3,\n // 并补 /usr/local 对运行用户可写(docs/feature/sandbox/library/prebuilt-environments.md\n // 「跨 provider 基线工具面」)\n \"claude-code\": 4,\n // r3: staged 安装改用自带运行时的原生平台包(不再要求沙箱里有 node / npm)\n // r4: 同上「USER node」配方变更\n // r5: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n codex: 5,\n // r2: 跨 provider 基线工具面统一(同上,含可写性)\n bub: 2,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n opencode: 3,\n // r2: 跨 provider 基线工具面统一——本 target 原本单独装的 python3 现由 base 统一提供,\n // 配方内容变了但不预装 yarn 不改变行为(同上,含可写性)\n hermes: 2,\n // r2: 同上「USER node」配方变更\n // r3: 同上「跨 provider 基线工具面统一」配方变更(含可写性)\n openclaw: 3,\n omp: 1,\n \"deepseek-harness\": 1,\n};\n/**\n * 官方基线制品的版本 tag:`<Agent 版本>-r<配方修订>`,如 `0.144.1-r2`。\n *\n * niceeval 自身的版本不参与命名——库与制品内容无关,发版不该连带重建没变的制品,\n * 换 Agent 版本也不该等库发版。\n */\nexport function agentBaselineVersionTag(agent: CodingAgentBaseline): string {\n return `${AGENT_BASELINE_VERSION[agent]}-r${AGENT_BASELINE_RECIPE_REVISION[agent]}`;\n}\n"]}
@@ -14,13 +14,18 @@ export declare const DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
14
14
  export declare const DEFAULT_HERMES_CLI_VERSION = "0.19.0";
15
15
  /** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */
16
16
  export declare const DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
17
+ /** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */
18
+ export declare const DEFAULT_OMP_CLI_VERSION = "17.3.5";
19
+ export declare const DEFAULT_BUN_VERSION = "1.3.14";
20
+ /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
21
+ export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
17
22
  /**
18
- * 有官方公共基线制品的内置 coding agent。
23
+ * 有官方公共基线制品的 coding agent。
19
24
  *
20
- * Docker 侧六家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub
25
+ * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub
21
26
  *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。
22
27
  */
23
- export type CodingAgentBaseline = "claude-code" | "codex" | "bub" | "opencode" | "hermes" | "openclaw";
28
+ export type CodingAgentBaseline = "claude-code" | "codex" | "bub" | "opencode" | "hermes" | "openclaw" | "omp" | "deepseek-harness";
24
29
  /** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */
25
30
  export declare const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string>;
26
31
  /**
@@ -14,13 +14,18 @@ export declare const DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
14
14
  export declare const DEFAULT_HERMES_CLI_VERSION = "0.19.0";
15
15
  /** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */
16
16
  export declare const DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
17
+ /** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */
18
+ export declare const DEFAULT_OMP_CLI_VERSION = "17.3.5";
19
+ export declare const DEFAULT_BUN_VERSION = "1.3.14";
20
+ /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
21
+ export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
17
22
  /**
18
- * 有官方公共基线制品的内置 coding agent。
23
+ * 有官方公共基线制品的 coding agent。
19
24
  *
20
- * Docker 侧六家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub
25
+ * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub
21
26
  *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。
22
27
  */
23
- export type CodingAgentBaseline = "claude-code" | "codex" | "bub" | "opencode" | "hermes" | "openclaw";
28
+ export type CodingAgentBaseline = "claude-code" | "codex" | "bub" | "opencode" | "hermes" | "openclaw" | "omp" | "deepseek-harness";
24
29
  /** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */
25
30
  export declare const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string>;
26
31
  /**
@@ -14,13 +14,18 @@ export declare const DEFAULT_OPENCODE_CLI_VERSION = "1.18.5";
14
14
  export declare const DEFAULT_HERMES_CLI_VERSION = "0.19.0";
15
15
  /** OpenClaw CLI(npm `openclaw`)默认钉的版本。 */
16
16
  export declare const DEFAULT_OPENCLAW_CLI_VERSION = "2026.7.1-2";
17
+ /** Oh My Pi coding-agent CLI (npm) and its Bun runtime. */
18
+ export declare const DEFAULT_OMP_CLI_VERSION = "17.3.5";
19
+ export declare const DEFAULT_BUN_VERSION = "1.3.14";
20
+ /** DeepSeek Harness CLI (npm `@deepseek-ai/dsh`). */
21
+ export declare const DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION = "0.1.0-rc.7";
17
22
  /**
18
- * 有官方公共基线制品的内置 coding agent。
23
+ * 有官方公共基线制品的 coding agent。
19
24
  *
20
- * Docker 侧六家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub
25
+ * Docker 侧八家齐全;E2B 侧目前只发布 Claude Code / Codex / Bub
21
26
  *(见 `E2BCodingAgent`),其余 Agent 的 E2B 模板尚未进台账。
22
27
  */
23
- export type CodingAgentBaseline = "claude-code" | "codex" | "bub" | "opencode" | "hermes" | "openclaw";
28
+ export type CodingAgentBaseline = "claude-code" | "codex" | "bub" | "opencode" | "hermes" | "openclaw" | "omp" | "deepseek-harness";
24
29
  /** 每个官方基线制品里装的那个 Agent 的版本——制品版本号的版本位。 */
25
30
  export declare const AGENT_BASELINE_VERSION: globalThis.Record<CodingAgentBaseline, string>;
26
31
  /**
@@ -7,16 +7,22 @@ const __niceevalExport1 = __niceevalCanonical["AGENT_BASELINE_VERSION"];
7
7
  export { __niceevalExport1 as AGENT_BASELINE_VERSION };
8
8
  const __niceevalExport2 = __niceevalCanonical["DEFAULT_BUB_VERSION"];
9
9
  export { __niceevalExport2 as DEFAULT_BUB_VERSION };
10
- const __niceevalExport3 = __niceevalCanonical["DEFAULT_CLAUDE_CODE_CLI_VERSION"];
11
- export { __niceevalExport3 as DEFAULT_CLAUDE_CODE_CLI_VERSION };
12
- const __niceevalExport4 = __niceevalCanonical["DEFAULT_CODEX_CLI_VERSION"];
13
- export { __niceevalExport4 as DEFAULT_CODEX_CLI_VERSION };
14
- const __niceevalExport5 = __niceevalCanonical["DEFAULT_HERMES_CLI_VERSION"];
15
- export { __niceevalExport5 as DEFAULT_HERMES_CLI_VERSION };
16
- const __niceevalExport6 = __niceevalCanonical["DEFAULT_OPENCLAW_CLI_VERSION"];
17
- export { __niceevalExport6 as DEFAULT_OPENCLAW_CLI_VERSION };
18
- const __niceevalExport7 = __niceevalCanonical["DEFAULT_OPENCODE_CLI_VERSION"];
19
- export { __niceevalExport7 as DEFAULT_OPENCODE_CLI_VERSION };
20
- const __niceevalExport8 = __niceevalCanonical["agentBaselineVersionTag"];
21
- export { __niceevalExport8 as agentBaselineVersionTag };
10
+ const __niceevalExport3 = __niceevalCanonical["DEFAULT_BUN_VERSION"];
11
+ export { __niceevalExport3 as DEFAULT_BUN_VERSION };
12
+ const __niceevalExport4 = __niceevalCanonical["DEFAULT_CLAUDE_CODE_CLI_VERSION"];
13
+ export { __niceevalExport4 as DEFAULT_CLAUDE_CODE_CLI_VERSION };
14
+ const __niceevalExport5 = __niceevalCanonical["DEFAULT_CODEX_CLI_VERSION"];
15
+ export { __niceevalExport5 as DEFAULT_CODEX_CLI_VERSION };
16
+ const __niceevalExport6 = __niceevalCanonical["DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION"];
17
+ export { __niceevalExport6 as DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION };
18
+ const __niceevalExport7 = __niceevalCanonical["DEFAULT_HERMES_CLI_VERSION"];
19
+ export { __niceevalExport7 as DEFAULT_HERMES_CLI_VERSION };
20
+ const __niceevalExport8 = __niceevalCanonical["DEFAULT_OMP_CLI_VERSION"];
21
+ export { __niceevalExport8 as DEFAULT_OMP_CLI_VERSION };
22
+ const __niceevalExport9 = __niceevalCanonical["DEFAULT_OPENCLAW_CLI_VERSION"];
23
+ export { __niceevalExport9 as DEFAULT_OPENCLAW_CLI_VERSION };
24
+ const __niceevalExport10 = __niceevalCanonical["DEFAULT_OPENCODE_CLI_VERSION"];
25
+ export { __niceevalExport10 as DEFAULT_OPENCODE_CLI_VERSION };
26
+ const __niceevalExport11 = __niceevalCanonical["agentBaselineVersionTag"];
27
+ export { __niceevalExport11 as agentBaselineVersionTag };
22
28
  //# sourceMappingURL=coding-cli-versions.js.map
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deepSeekHarnessAgent = deepSeekHarnessAgent;
4
+ const effect_1 = require("effect");
5
+ const define_ts_1 = require("../define.cjs");
6
+ const util_ts_1 = require("../util.cjs");
7
+ const send_failures_ts_1 = require("../context/send-failures.cjs");
8
+ const shared_ts_1 = require("./shared.cjs");
9
+ const npm_staged_ts_1 = require("./npm-staged.cjs");
10
+ const coding_cli_versions_ts_1 = require("./coding-cli-versions.cjs");
11
+ const DSH_EVIDENCE_COVERAGE = {
12
+ events: { status: "unavailable", reason: "DSH headless mode exposes only the final assistant text." },
13
+ actions: { status: "unavailable", reason: "DSH headless mode does not expose tool lifecycle events." },
14
+ messages: { status: "complete" },
15
+ usage: { status: "unavailable", reason: "DSH headless mode does not expose token usage." },
16
+ status: { status: "complete" },
17
+ data: { status: "unavailable", reason: "DSH headless mode does not expose a separate Turn.data value." },
18
+ };
19
+ function resolveApiKey(config) {
20
+ return config?.apiKey ?? (0, util_ts_1.getEnv)("DSH_API_KEY") ?? (0, util_ts_1.requireEnv)("DEEPSEEK_API_KEY");
21
+ }
22
+ function resolveBaseUrl(config) {
23
+ return config?.baseUrl ?? (0, util_ts_1.getEnv)("DSH_BASE_URL") ?? (0, util_ts_1.getEnv)("DEEPSEEK_BASE_URL");
24
+ }
25
+ /** DeepSeek Harness sandbox adapter backed by its one-shot headless profile. */
26
+ function deepSeekHarnessAgent(config) {
27
+ const version = config?.version ?? coding_cli_versions_ts_1.DEFAULT_DEEPSEEK_HARNESS_CLI_VERSION;
28
+ const install = (0, npm_staged_ts_1.createNpmCliInstaller)({
29
+ identity: {
30
+ agent: "deepseek-harness",
31
+ version,
32
+ revision: String(coding_cli_versions_ts_1.AGENT_BASELINE_RECIPE_REVISION["deepseek-harness"]),
33
+ },
34
+ packageName: "@deepseek-ai/dsh",
35
+ bin: "dsh",
36
+ });
37
+ const homes = new Map();
38
+ return (0, define_ts_1.defineSandboxAgent)({
39
+ name: "deepseek-harness",
40
+ evidenceCoverage: DSH_EVIDENCE_COVERAGE,
41
+ ensure: install.ensure,
42
+ installers: [install.installer],
43
+ async setup(sb, ctx) {
44
+ const homeResult = await sb.runShell('test -n "$HOME" && printf "%s" "$HOME"');
45
+ const home = homeResult.stdout.trim();
46
+ if (homeResult.exitCode !== 0 || !home.startsWith("/")) {
47
+ throw new Error("DeepSeek Harness setup requires an absolute sandbox HOME directory");
48
+ }
49
+ const dshHome = `${home}/.niceeval-dsh`;
50
+ homes.set(sb.sandboxId, dshHome);
51
+ const settings = {
52
+ "agent-default-model": {
53
+ provider: "deepseek-official",
54
+ model: ctx.model ?? "deepseek-v4-flash",
55
+ },
56
+ permission: {
57
+ defaultPreset: "danger-full-access",
58
+ },
59
+ };
60
+ await shared_ts_1.shared.writeFile(sb, `${dshHome}/settings.yaml`, JSON.stringify(settings, null, 2));
61
+ },
62
+ send: (input, ctx) => effect_1.Effect.runPromise(effect_1.Effect.scoped(effect_1.Effect.gen(function* () {
63
+ const dshBin = yield* (0, npm_staged_ts_1.resolveAgentBinEffect)(ctx.sandbox, "dsh");
64
+ return yield* effect_1.Effect.tryPromise({
65
+ try: async (signal) => {
66
+ const apiKey = resolveApiKey(config);
67
+ const dshHome = homes.get(ctx.sandbox.sandboxId);
68
+ if (!dshHome)
69
+ throw new Error("DeepSeek Harness setup state is unavailable");
70
+ const env = {
71
+ DEEPSEEK_API_KEY: apiKey,
72
+ DSH_HOME: dshHome,
73
+ ...ctx.telemetry?.env,
74
+ };
75
+ const baseUrl = resolveBaseUrl(config);
76
+ if (baseUrl)
77
+ env.DEEPSEEK_BASE_URL = baseUrl;
78
+ const res = await ctx.sandbox.runCommand(dshBin, ["--profile", "headless", input.text], {
79
+ env,
80
+ sensitiveValues: [apiKey],
81
+ stream: true,
82
+ signal,
83
+ });
84
+ const text = res.stdout.trim();
85
+ if (res.exitCode !== 0 || !text) {
86
+ throw (0, send_failures_ts_1.makeSendFailure)({
87
+ acceptance: "unknown",
88
+ message: res.exitCode !== 0
89
+ ? shared_ts_1.shared.diagnoseFailure(res, [], undefined)
90
+ : "DeepSeek Harness exited successfully without a final assistant message.",
91
+ process: res,
92
+ });
93
+ }
94
+ const events = [{ type: "message", role: "assistant", text }];
95
+ return { events, status: "completed" };
96
+ },
97
+ catch: (cause) => cause,
98
+ });
99
+ })), { signal: ctx.signal }),
100
+ });
101
+ }
102
+ exports.default = deepSeekHarnessAgent;
103
+ //# sourceMappingURL=deepseek-harness.cjs.map