send 返回一个 Turn,其中 events: StreamEvent[] 是断言的唯一数据源:t.calledTool()、t.reply、toolOrder、noFailedActions……全部从这条流上读。把你的 agent”这一轮做了什么”翻成这条流,整套断言就都能用。
Turn:send 的返回值
data 放结构化输出,不要序列化塞进 events;usage 拿得到就带,拿不到就不填——别编数字。
事件总表
| 事件 | 说什么 | 消费它的断言 / API |
|---|---|---|
message | agent(或用户)说了一段话 | t.reply、messageIncludes、judge 的材料 |
action.called | 发起一次工具调用 | calledTool、toolOrder、maxToolCalls、notCalledTool |
action.result | 该次调用的结果 | calledTool 的 status 匹配、noFailedActions |
subagent.called | 委派一个子 agent | calledSubagent |
subagent.completed | 子 agent 返回 | calledSubagent 的 status、noFailedActions |
input.requested | 停下来等人输入(HITL) | t.parked()、t.requireInputRequest() |
thinking | 思考文本 | event("thinking")、view 展示 |
compaction | 上下文被压缩 | event("compaction")(需声明 compactionObservability) |
error | 本轮出错 | event("error")、view 展示 |
event(type) / notEvent(type) / eventOrder(types) / eventsSatisfy(label, predicate)。
逐事件说明
message —— 说了什么
role: "assistant" 的 message。工具结果不是助手消息——不要把工具输出包成 message,否则 t.reply 会读到错误内容。用户输入的 message 由 NiceEval 自动记录,adapter 不用吐。
action.called / action.result —— 调了什么工具、结果如何
- 每个
action.called配一个同callId的action.result——并发调用靠它不错配。你的 agent 返回里有显式 id(AI SDK 的toolCallId、Anthropic 的tool_use.id)就直接用;实在没有再按顺序合成。 status如实填:工具执行失败是"failed"(noFailedActions()会响);人否决是"rejected"(noFailedActions()依然通过,calledTool(..., { status: "rejected" })可精确断言)。两回事,别混。name用工具的原始名字。
subagent.called / subagent.completed —— 委派了谁
callId 配对规则同上。喂 calledSubagent("researcher") 这类断言。
input.requested —— 停下等人(HITL)
status 返回 "waiting"。t.requireInputRequest(filter) 的 filter 逐字段匹配这个 request——能填的字段尽量填,否则 eval 侧筛选不到。接法见接入教程的 HITL 部分。
thinking / compaction / error
compaction 主要来自 coding agent CLI(上下文满了自动压缩)。
映射的三条纪律
- 时序即事实:事件按真实发生顺序排。
toolOrder/eventOrder靠子序匹配,顺序错了断言就失真。 callId配对:每个called都要有同 id 的result,缺一半会让calledTool(..., { status })匹配不上。- 完整性:声明了
toolObservability: true就意味着所有工具调用都在流里。只吐一部分时,notCalledTool/maxToolCalls这类负断言会静默通过——没有报错,比失败更难发现。手工映射做不到完整就不要声明这个能力。
一个完整的映射示例
agent 返回里带步骤记录时,映射就是一段小循环:相关阅读
- 接入你的 agent —— 从零跑通的教程。
- 能力位 —— 声明”事件流是完整的”意味着什么。
- 编写 eval —— 消费这条流的断言全集。