跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

代理循环与完成信号

区分模型轮次、工具循环、session.idle 与任务完成,并正确计数事件。

应用通过 SDK 发送提示,runtime 执行模型调用与工具循环,再把事件传回应用。SDK 本身主要承担传输与接口工作,是否继续请求工具由模型决定。

一条消息可能对应多次模型调用

模型获得当前会话上下文,可能先搜索代码,再读取文件,最后给出回答。每次模型 API 调用及其工具后续构成 agent-loop 专题中的一个 turn,可由 assistant.turn_start 与 assistant.turn_end 对应。

因此“用户发了一条消息”“模型调用一次”和“整个工作结束”不是同一个计数单位。工具完成后 runtime 可以把结果带回模型,再开始下一轮。

两种完成信号

信号含义持久化
session.idleruntime 已停止处理,可以接收下一条消息不保存,恢复时不重放
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;实际字段与暂存/持久差别见事件流。有排队消息时,还需按消息投递跟踪接受和消费状态。