Skip to content
FunCoding

Search

Search docs, Skills and MCP

代理循环与完成信号

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

This page has not been translated into English yet. The original Chinese version is shown below.

应用通过 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;实际字段与暂存/持久差别见事件流。有排队消息时,还需按消息投递跟踪接受和消费状态。