代理循环与完成信号
区分模型轮次、工具循环、session.idle 与任务完成,并正确计数事件。
应用通过 SDK 发送提示,runtime 执行模型调用与工具循环,再把事件传回应用。SDK 本身主要承担传输与接口工作,是否继续请求工具由模型决定。
一条消息可能对应多次模型调用
模型获得当前会话上下文,可能先搜索代码,再读取文件,最后给出回答。每次模型 API 调用及其工具后续构成 agent-loop 专题中的一个 turn,可由 assistant.turn_start 与 assistant.turn_end 对应。
因此“用户发了一条消息”“模型调用一次”和“整个工作结束”不是同一个计数单位。工具完成后 runtime 可以把结果带回模型,再开始下一轮。
两种完成信号
| 信号 | 含义 | 持久化 |
|---|---|---|
session.idle | runtime 已停止处理,可以接收下一条消息 | 不保存,恢复时不重放 |
session.task_complete | 模型认为整体任务完成,可含 summary | 保存,但不保证每次出现 |
sendAndWait 等待 idle。界面要停止加载状态,应使用 idle 并同时处理 session.error;任务是否真正完成还需结合结果验证,不能只等待可选 task_complete。
session.on("session.task_complete", (event) => {
console.log("Task done:", event.data.summary);
});
const response = await session.sendAndWait({ prompt: "Fix the bug" });Autopilot 的继续机制
在 Autopilot 中,模型停止但尚未调用 task_complete 时,runtime 可以加入合成提示,要求继续完成工作。交互问答不要求每次明确调用 task_complete,因此没有该事件不代表事件流损坏。
中断的轮次也会进入 idle,事件参考通过 data.aborted 表达取消情况。idle 表示处理结束,不代表测试通过或修改成功。
计数的适用范围
agent-loop 专题说明一对 turn_start/turn_end 对应一次循环中的模型调用,并用此计数解释工具循环。但事件参考另列压缩模型调用的 compactionTokensUsed,不能把主循环 turn 数直接当作所有推理费用的完整账单。
统计用量时同时查看模型 usage、压缩用量和持久 checkpoint;实际字段与暂存/持久差别见事件流。有排队消息时,还需按消息投递跟踪接受和消费状态。