运行循环

Agent 到底循环什么?

循环的单位不是“消息”,而是 Step:组装一次模型请求,接收一次模型输出,并完成这次输出要求的工具调用。多个 Step 组成一个 Turn;多个排队的 Turn 可以由同一个持续运行的 Driver 依次排空。

问题 01

Turn 和 Step 为什么要分开?

答案:Turn 表示一次完整的任务推进区间,Step 表示其中一次模型判断。模型要求工具时,当前 Step 在工具完成后结束,但 Turn 仍未完成;工具结果会触发下一个 Step,直到模型不再要求行动。

一个 Turn 可以包含任意多个 Step。每个 Step 恰好围绕一次模型调用及其请求的工具执行。

问题 02

followup、steer 和 inject 有什么区别?

答案:三者传递的都是可识别的用户角色消息,差别在“投递到哪里”以及“是否唤醒 Driver”。followup 排到下一 Turn;steer 进入最近的下一 Step 并唤醒空闲 Agent;inject 也进入下一 Step,但只附加上下文,不会单独启动工作。

“下一 Step”仍是安全边界:已经开始组装或发送的请求不会被中途改写。inject 适合文件变化、技能内容等上下文,不适合独立触发任务。

容易误解的点:followup() 没有“这条消息何时完成”的返回值;whenIdle() 观察的是整个 Agent 的排空状态,不能自动把某个后续输出归因给一条 followup。

问题 03

为什么工具执行后还要再请求一次模型?

答案:工具调用只表达“我需要这个事实或动作”,工具结果才提供真实世界的反馈。模型必须在下一 Step 看到结果,才能判断任务是否完成、是否需要补救,或怎样向用户解释。

请求 B 不是重复请求;它比请求 A 多了工具结果这一项新事实,因此模型能作出下一步决策。

问题 04

一个 Turn 在什么条件下真正结束?

答案:模型没有留下待执行工具,next-step 收件箱也已排空,运行循环才到达停止检查。agent/turn-stopping 监听器仍可提交 steering;循环会重新读取队列,有新输入就再开 Step,没有才记录 turn/end

停止不是某个监听器的返回值,而是运行状态与队列状态共同给出的事实;因此监听器顺序不会改变最终判断。