niceeval 0.13.0 → 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.
- package/INDEX.md +1 -0
- package/README.md +9 -10
- package/README.zh.md +9 -10
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/ai-sdk.d.cts +1 -1
- package/dist/agents/ai-sdk.d.mts +1 -1
- package/dist/agents/ai-sdk.d.ts +1 -1
- package/dist/agents/coding-cli-versions.cjs +10 -1
- package/dist/agents/coding-cli-versions.cjs.map +1 -1
- package/dist/agents/coding-cli-versions.d.cts +8 -3
- package/dist/agents/coding-cli-versions.d.mts +8 -3
- package/dist/agents/coding-cli-versions.d.ts +8 -3
- package/dist/agents/coding-cli-versions.js +18 -12
- package/dist/agents/deepseek-harness.cjs +103 -0
- package/dist/agents/deepseek-harness.cjs.map +1 -0
- package/dist/agents/deepseek-harness.d.cts +12 -0
- package/dist/agents/deepseek-harness.d.mts +12 -0
- package/dist/agents/deepseek-harness.d.ts +12 -0
- package/dist/agents/deepseek-harness.js +7 -0
- package/dist/agents/deepseek-harness.js.map +1 -0
- package/dist/agents/index.cjs +5 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +4 -0
- package/dist/agents/index.d.mts +4 -0
- package/dist/agents/index.d.ts +4 -0
- package/dist/agents/index.js +54 -50
- package/dist/agents/index.mjs +54 -50
- package/dist/agents/omp.cjs +170 -0
- package/dist/agents/omp.cjs.map +1 -0
- package/dist/agents/omp.d.cts +14 -0
- package/dist/agents/omp.d.mts +14 -0
- package/dist/agents/omp.d.ts +14 -0
- package/dist/agents/omp.js +7 -0
- package/dist/agents/omp.js.map +1 -0
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +2 -2
- package/dist/agents/types.d.mts +2 -2
- package/dist/agents/types.d.ts +2 -2
- package/dist/analysis/api.cjs +9 -1
- package/dist/analysis/api.cjs.map +1 -1
- package/dist/analysis/api.d.cts +21 -0
- package/dist/analysis/api.d.mts +21 -0
- package/dist/analysis/api.d.ts +21 -0
- package/dist/analysis/api.js +8 -6
- package/dist/cli.cjs +10 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/i18n/en.cjs +7 -2
- package/dist/i18n/en.cjs.map +1 -1
- package/dist/i18n/en.d.cts +7 -2
- package/dist/i18n/en.d.mts +7 -2
- package/dist/i18n/en.d.ts +7 -2
- package/dist/o11y/parsers/hermes.cjs +1 -1
- package/dist/o11y/parsers/hermes.cjs.map +1 -1
- package/dist/report/built-in/analysis-values.cjs +21 -5
- package/dist/report/built-in/analysis-values.cjs.map +1 -1
- package/dist/report/built-in/analysis-values.d.cts +11 -9
- package/dist/report/built-in/analysis-values.d.mts +11 -9
- package/dist/report/built-in/analysis-values.d.ts +11 -9
- package/dist/report/built-in/overview.cjs +1 -0
- package/dist/report/built-in/overview.cjs.map +1 -1
- package/dist/report/built-in/result-components.cjs +58 -12
- package/dist/report/built-in/result-components.cjs.map +1 -1
- package/dist/report/built-in/result-components.d.cts +15 -0
- package/dist/report/built-in/result-components.d.mts +15 -0
- package/dist/report/built-in/result-components.d.ts +15 -0
- package/dist/report/built-in/run-membership-overview.cjs +100 -4
- package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
- package/dist/report/built-in/standard.cjs +1 -0
- package/dist/report/built-in/standard.cjs.map +1 -1
- package/dist/report/built-in/standard.d.cts +1 -0
- package/dist/report/built-in/standard.d.mts +1 -0
- package/dist/report/built-in/standard.d.ts +1 -0
- package/dist/report/components/entity-lists/compute.cjs +40 -3
- package/dist/report/components/entity-lists/compute.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.d.cts +8 -6
- package/dist/report/components/entity-lists/compute.d.mts +8 -6
- package/dist/report/components/entity-lists/compute.d.ts +8 -6
- package/dist/report/components/entity-lists/content.cjs +31 -6
- package/dist/report/components/entity-lists/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.cjs +3 -2
- package/dist/report/components/entity-lists/index.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.d.cts +1 -1
- package/dist/report/components/entity-lists/index.d.mts +1 -1
- package/dist/report/components/entity-lists/index.d.ts +1 -1
- package/dist/report/definition/cell.cjs +3 -0
- package/dist/report/definition/cell.cjs.map +1 -1
- package/dist/report/definition/cell.d.cts +2 -0
- package/dist/report/definition/cell.d.mts +2 -0
- package/dist/report/definition/cell.d.ts +2 -0
- package/dist/report/definition/primitives.cjs +9 -2
- package/dist/report/definition/primitives.cjs.map +1 -1
- package/dist/report/execution/machine.cjs +1 -1
- package/dist/report/execution/machine.cjs.map +1 -1
- package/dist/report/host/execute.cjs +14 -4
- package/dist/report/host/execute.cjs.map +1 -1
- package/dist/report/host/execute.d.cts +5 -0
- package/dist/report/host/execute.d.mts +5 -0
- package/dist/report/host/execute.d.ts +5 -0
- package/dist/report/host/from-record.cjs +6 -1
- package/dist/report/host/from-record.cjs.map +1 -1
- package/dist/report/host/from-record.d.cts +5 -0
- package/dist/report/host/from-record.d.mts +5 -0
- package/dist/report/host/from-record.d.ts +5 -0
- package/dist/report/runtime/resolved-page.cjs +16 -6
- package/dist/report/runtime/resolved-page.cjs.map +1 -1
- package/dist/report/runtime/resolved-page.d.cts +3 -0
- package/dist/report/runtime/resolved-page.d.mts +3 -0
- package/dist/report/runtime/resolved-page.d.ts +3 -0
- package/dist/report/runtime/text.cjs +1 -0
- package/dist/report/runtime/text.cjs.map +1 -1
- package/dist/report/runtime/text.d.cts +4 -0
- package/dist/report/runtime/text.d.mts +4 -0
- package/dist/report/runtime/text.d.ts +4 -0
- package/dist/runner/feedback/human.cjs +180 -16
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/run.cjs +43 -0
- package/dist/runner/run.cjs.map +1 -1
- package/dist/sample/capability.cjs +93 -0
- package/dist/sample/capability.cjs.map +1 -1
- package/dist/sample/capability.d.cts +3 -1
- package/dist/sample/capability.d.mts +3 -1
- package/dist/sample/capability.d.ts +3 -1
- package/dist/sample/capability.js +8 -6
- package/dist/sandbox/docker-agent-image.cjs +5 -1
- package/dist/sandbox/docker-agent-image.cjs.map +1 -1
- package/dist/sandbox/docker-agent-image.d.cts +2 -0
- package/dist/sandbox/docker-agent-image.d.mts +2 -0
- package/dist/sandbox/docker-agent-image.d.ts +2 -0
- package/dist/sandbox/docker-agent-image.js +14 -10
- package/dist/sandbox/index.cjs +4 -2
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +1 -1
- package/dist/sandbox/index.d.mts +1 -1
- package/dist/sandbox/index.d.ts +1 -1
- package/dist/sandbox/index.js +120 -116
- package/dist/sandbox/index.mjs +120 -116
- package/docs-site/images/hitl-handshake-zh.svg +3 -3
- package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +3 -3
- package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
- package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
- package/docs-site/zh/examples/integrations/langgraph.mdx +3 -3
- package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
- package/docs-site/zh/explanation/adapter.mdx +5 -5
- package/docs-site/zh/explanation/assert.mdx +1 -1
- package/docs-site/zh/explanation/drive.mdx +3 -1
- package/docs-site/zh/explanation/evals.mdx +3 -1
- package/docs-site/zh/explanation/hitl.mdx +7 -7
- package/docs-site/zh/explanation/runner.mdx +2 -2
- package/docs-site/zh/index.mdx +2 -2
- package/docs-site/zh/reference/builtin-agents.mdx +4 -4
- package/docs-site/zh/reference/capabilities.mdx +1 -1
- package/docs-site/zh/reference/cli.mdx +14 -14
- package/docs-site/zh/reference/events.mdx +11 -11
- package/docs-site/zh/reference/official-adapters.mdx +1 -1
- package/docs-site/zh/reference/results-data.mdx +6 -0
- package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
- package/docs-site/zh/tutorials/agent-feedback-loop.mdx +2 -2
- package/docs-site/zh/tutorials/ci-integration.mdx +1 -1
- package/docs-site/zh/tutorials/connect-your-agent.mdx +2 -2
- package/docs-site/zh/tutorials/custom-reports.mdx +4 -4
- package/docs-site/zh/tutorials/deploy-report-site.mdx +3 -3
- package/docs-site/zh/tutorials/docker-in-docker.mdx +3 -0
- package/docs-site/zh/tutorials/experiments.mdx +2 -2
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +1 -1
- package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +1 -1
- package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
- package/docs-site/zh/tutorials/publish-report.mdx +4 -4
- package/docs-site/zh/tutorials/reporters.mdx +1 -1
- package/docs-site/zh/tutorials/rerun-and-cache.mdx +16 -0
- package/docs-site/zh/tutorials/viewing-results.mdx +28 -10
- package/docs-site/zh/tutorials/write-send.mdx +7 -6
- package/package.json +1 -1
|
@@ -70,6 +70,22 @@ npx niceeval accept @1K1P0VJAPVJ12
|
|
|
70
70
|
|
|
71
71
|
`accept` 先检查所有输入,再发布一个以 `reference` 采用该 Attempt 的新 Run。操作者理由、差异和资格会随该 Run 保存。它不会修改源 Attempt,也不会复制源 Attempt 的业务值。
|
|
72
72
|
|
|
73
|
+
新 Run 保留该 Experiment 当前完整的 expected-slot 分母。命令中选中的 slot 写作 `accepted`,同 Run 中没有被选中的 sibling slot 写作 `not-dispatched`。因此一次只接受一个 locator 时,这个 Run 的其它位置可能没有指标输入。
|
|
74
|
+
|
|
75
|
+
每次 `accept` 调用都会发布新 Run,不会修改或合并上一次调用。连续接受同一 Experiment 的多个 locator 后,`project-current` 会保留这些仍匹配的 Run occurrence。默认 Overview 会在有边框的 `Result coverage` 区域提示只有部分预期结果可用;这里的可用数是结果覆盖率,不是通过率或 score。
|
|
76
|
+
|
|
77
|
+
需要接受同一 Experiment 的多个结果时,把 locator 放进同一条命令:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
npx niceeval accept @1K1P0VJAPVJ12 @1K1P0VJAPVJ13
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
同一次调用会为该 Experiment 发布一个 Run,并让两个目标 slot 都成为 `accepted`。需要核对某次接受的精确分母时,复制成功反馈中的 Run ID:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
npx niceeval show --run <accepted-run-id>
|
|
87
|
+
```
|
|
88
|
+
|
|
73
89
|
## 发布后不可修改
|
|
74
90
|
|
|
75
91
|
Attempt 发布后不可修改。每一次查看都读取当时 Record 中已发布的值;新 Run 或新事实只会以新的发布出现。若 Attempt 或引用无效,Sample 将该 slot 标为 `core-invalid`,而不是 `not-recorded`。
|
|
@@ -7,8 +7,8 @@ description: "用 show 或 view 从已发布的 Record 选择固定 Sample,并
|
|
|
7
7
|
运行结束后,从下面两条命令开始:
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
pnpm exec niceeval show
|
|
11
|
+
pnpm exec niceeval view
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
两条命令用相同选择规则形成固定 `Sample`,但执行范围不同。`show` 只读取一个目标 Page;`view` 会先构建完整站点,再把它托管在浏览器中。
|
|
@@ -18,7 +18,7 @@ npx niceeval view
|
|
|
18
18
|
选择一个明确 Run:
|
|
19
19
|
|
|
20
20
|
```sh
|
|
21
|
-
|
|
21
|
+
pnpm exec niceeval show --run 7b8d2ea4-b840-4870-9840-f85a436a5527
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
普通运行可从 `exp --json` 最后一条 receipt 的 `runIds` 读取 Run ID:
|
|
@@ -29,6 +29,8 @@ npx niceeval show --run 7b8d2ea4-b840-4870-9840-f85a436a5527
|
|
|
29
29
|
|
|
30
30
|
不带 locator、`--run` 或 `--experiment` 时,命令使用 `project-current`:它保留全部仍与当前项目身份匹配的已发布结果,而不是只选最新一条。需要阅读历史结果时,传入完整 `--run`;要限制当前项目结果时,重复传入完整的 `--experiment <id>`。
|
|
31
31
|
|
|
32
|
+
`project-current` 按 Run 中的 slot occurrence 保留结果。它不会把多个 Run 里同名的 Experiment、评估用例和 Attempt 序号合并成一个位置。重复运行或分多次执行 `accept` 都可能增加当前 `Sample` 的分母。
|
|
33
|
+
|
|
32
34
|
Sample 记录每个位置的状态:
|
|
33
35
|
|
|
34
36
|
| 状态 | 含义 |
|
|
@@ -43,10 +45,10 @@ Sample 记录每个位置的状态:
|
|
|
43
45
|
## 在终端读取一个 Page
|
|
44
46
|
|
|
45
47
|
```sh
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
pnpm exec niceeval show --run <run-id>
|
|
49
|
+
pnpm exec niceeval show --run <run-id> --page /
|
|
50
|
+
pnpm exec niceeval show @<attempt-locator>
|
|
51
|
+
pnpm exec niceeval show --run <run-id> --report ./reports/quality.tsx --json
|
|
50
52
|
```
|
|
51
53
|
|
|
52
54
|
省略 `--page` 时,`show` 使用 Report 的默认可导航页面。提供 `--page` 时,它只 decode、load、render 和关闭这一个精确 route。参数 Page 不会因此调用 `enumerate()`;其它 Page、Analysis 查询和作者 callback 也不会执行。
|
|
@@ -66,11 +68,27 @@ npx niceeval show --run <run-id> --report ./reports/quality.tsx --json
|
|
|
66
68
|
|
|
67
69
|
JSON 不包含其它 Page、HTML、React tree、站点 identity 或 Record 读取能力。
|
|
68
70
|
|
|
71
|
+
## 按题型读取主读数
|
|
72
|
+
|
|
73
|
+
默认报告按评估类型选择主读数:
|
|
74
|
+
|
|
75
|
+
- Pass Eval 显示通过率。
|
|
76
|
+
- Score Eval 显示 earned score。
|
|
77
|
+
- mixed Experiment 显示 Score,并在 Pass Eval 子行显示通过率,不把两者合成百分比。
|
|
78
|
+
|
|
79
|
+
Score Eval 上声明的 `points` 是评分项的贡献权重,不是 Experiment 的固定满分。动态执行、条件分支或不可用材料可能让评分项集合不同,因此默认报告不会自动把 earned score 除以所有源码里声明的 `points`。
|
|
80
|
+
|
|
81
|
+
项目没有配置 Report 时,`project-current` 使用单页 `default-overview`。显式传入 `--report standard` 会使用相同的题型主读数,并额外提供 Attempts、Traces、Experiment 和 Attempt 详情页。增加详情页不会改变 Score 或通过率的计算口径。
|
|
82
|
+
|
|
83
|
+
默认 Overview 让主读数保持独立:Score 只显示 earned score,耗时和 token 也只显示各自的值。它不会在这些单元格后面追加容易与分数混淆的 `2 / 4 slot · partial`。
|
|
84
|
+
|
|
85
|
+
如果部分预期结果不可用,Overview 会在 KPI 和实验表之外显示独立的 `Result coverage` 区域。终端中的这个区域有边框,标题行直接写出“多少个结果可用”;它说明结果完整度,不表示分数、通过率或工作完成比例。结果完整时不显示这个区域。
|
|
86
|
+
|
|
69
87
|
## 在浏览器读取完整站点
|
|
70
88
|
|
|
71
89
|
```sh
|
|
72
|
-
|
|
73
|
-
|
|
90
|
+
pnpm exec niceeval view --experiment checkout --no-open
|
|
91
|
+
pnpm exec niceeval view --run <run-id> --page / --no-open
|
|
74
92
|
```
|
|
75
93
|
|
|
76
94
|
view 在启动 server 前枚举所有显式声明的普通 Page 与参数 Page 的全部实例,并验证路径、链接、资源、下载、`_niceeval/data/projections.json` 和预算。`pages` 是唯一页面集合,Host 不会补建详情 route。`--page` 只决定初始打开的已存在 route,不能缩小构建范围。全站 projections 文件的 bytes 属于 revision identity。
|
|
@@ -81,7 +99,7 @@ view 在启动 server 前枚举所有显式声明的普通 Page 与参数 Page
|
|
|
81
99
|
|
|
82
100
|
## 读懂不完整数据
|
|
83
101
|
|
|
84
|
-
`MetricValue` 的 `samples` 是实际贡献数,`total` 是既定分母,`state` 和 `issues`
|
|
102
|
+
`MetricValue` 的 `samples` 是实际贡献数,`total` 是既定分母,`state` 和 `issues` 说明为什么数据不完整。自定义 Report 使用 `formatMetricValue()` 时仍可得到 `2 / 4 slot · partial` 这类紧凑格式;它表示四个已选位置中有两个提供该指标,不是 score,也不是“完成了一半”。默认 Overview 改用上面的独立覆盖区域。`partial` 可以有数值;`empty`、`unsupported` 与 `failed` 不是零。Evidence refs 保留可复核的定位信息。
|
|
85
103
|
|
|
86
104
|
Analysis 数据问题继续作为页面内容显示。相反,选中 Page 的 callback、参数 key 或成员资格失败会让 `show` 返回单目标错误;任何全站 Page、路径、资源或预算失败都会阻止新的站点发布。
|
|
87
105
|
|
|
@@ -75,7 +75,7 @@ if (!res.requestId) {
|
|
|
75
75
|
|
|
76
76
|
`progress` 不落盘。diagnostic 会写入 Attempt-owned 通道,并从已选 Run 的详情页面回顾。HTTP 连接失败或响应无法解析时直接抛错;runner 会记录错误发生在 `agent.run`,并在 `niceeval.verdict` 通道形成 `errored` Verdict。
|
|
77
77
|
|
|
78
|
-
**这一步支持**:`t.reply
|
|
78
|
+
**这一步支持**:`t.reply` 的直接值检查(`t.check(t.reply, includes(...))` 或 `pattern(...)`)、Judge 的全部对话材料,以及 Experiment 侧的**模型对比**。`ctx.model` 来自 Experiment 的 `model`。运行器原样传递,Adapter 只负责转发。接入等级见 [Tier](/zh/explanation/tier)。
|
|
79
79
|
|
|
80
80
|
它有两个明显的局限:每轮都是一场全新对话(第二次 `t.send` 接不上第一次),工具调用完全看不见。后面两步各解决一个。
|
|
81
81
|
|
|
@@ -236,10 +236,10 @@ type StreamEvent =
|
|
|
236
236
|
|
|
237
237
|
| 你吐的事件 | 解锁的断言 |
|
|
238
238
|
|---|---|
|
|
239
|
-
| `message` | `t.reply`、`t.
|
|
239
|
+
| `message` | `t.reply`、`t.check(turn.message, includes(...))` / `pattern(...)`、Judge 的对话材料 |
|
|
240
240
|
| tool `operation.started` / `operation.finished`(靠 `operationId` 配对) | `turn.calledTool()` / `turn.toolOrder()` / `turn.maxToolCalls()` / `turn.noFailedActions()`… |
|
|
241
|
-
| `input.requested`(配合 status `"waiting"`) | `t.
|
|
242
|
-
| `thinking` / `compaction` / `error` |
|
|
241
|
+
| `input.requested`(配合 status `"waiting"`) | `t.check(turn.status, equals("waiting"))`、`t.requireInputRequest()`、`t.respond()`(第五步) |
|
|
242
|
+
| `thinking` / `compaction` / `error` | 报告与诊断;当前没有对应的公开 `eventMatch` selector |
|
|
243
243
|
|
|
244
244
|
Chat Completions 响应**不保证包含完整过程记录**。应用可能在服务端完成工具循环,只返回最终答案。因此,`turnFromChatCompletion` 的返回不带完整性证明:`calledTool` 等正断言可用,`notCalledTool` 等负断言会提示证据不完整。Responses 协议要求 `output` 数组记录完整过程,`turnFromResponses` 的返回带完整性证明,负断言可信。两者的可信度差异来自接口契约。
|
|
245
245
|
|
|
@@ -249,7 +249,7 @@ Chat Completions 响应**不保证包含完整过程记录**。应用可能在
|
|
|
249
249
|
|
|
250
250
|
应用中途停下来等人(工具审批、等补充信息)时,`send` 两侧各有义务:
|
|
251
251
|
|
|
252
|
-
- **停轮**:返回 `status: "waiting"`,并且每个待回答的问题吐一条带稳定 `id` 的 `input.requested` 事件——`t.
|
|
252
|
+
- **停轮**:返回 `status: "waiting"`,并且每个待回答的问题吐一条带稳定 `id` 的 `input.requested` 事件——`t.check(turn.status, equals("waiting"))` 与 `t.requireInputRequest()` 读取它,回答靠这个 `id` 对位。
|
|
253
253
|
- **回答轮**:评估用例里的 `t.respond(...)` 到 Adapter 是**又一次普通的 `send`**(还是同一条会话线、同一份状态),人的裁决以结构化形式随 `input.responses` 到达,每条带 `requestId`、`optionId` 或 `text`(形态见[不同回答的入参](/zh/explanation/adapter#不同回答的入参))。Adapter 先把裁决交回应用,再接着取结果。被人拒绝的调用,tool `operation.finished` 的 `status` 置 `"rejected"` 而不是 `"failed"`——拒绝是人的决定、不是工具故障,`noFailedActions()` 不误伤。
|
|
254
254
|
|
|
255
255
|
"停轮时读了一半的现场"(比如一条读到一半的 SSE 流)也存在 `ctx.session` 上。Adapter 先用 `createSessionSlot<Pending>()` 创建私有 slot,停轮时 `ctx.session.set(slot, pending)`,回答轮开头 `ctx.session.take(slot)` 取回。取到即清除,一次消费。
|
|
@@ -312,7 +312,8 @@ export default defineAgent({
|
|
|
312
312
|
|
|
313
313
|
不需要 HITL 的接口,删掉停轮现场相关的三处(`Pending`、`hold`、开头的 `take` 分支)即可,其余不变。停轮 / 回答 / 续跑的完整心智模型见 [HITL](/zh/explanation/hitl)。
|
|
314
314
|
|
|
315
|
-
**这一步支持**:`t.
|
|
315
|
+
**这一步支持**:`t.check(turn.status, equals("waiting"))`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()`。
|
|
316
|
+
被人拒绝的调用可用 `calledTool(toolMatch(..., { status: "rejected" }))` 精确断言。
|
|
316
317
|
|
|
317
318
|
## 第六步:接上 OTel trace
|
|
318
319
|
|