agentscope — 本课题摘录
读了哪几篇: 01-reply-loop(回复状态机与事件流)、03-context-engineering(上下文工程三件套)。
其余四篇本轮没读。
这一家给了本课题一个结构性答案:循环体里不写任何"该不该结束"的判断。
它对本课题回答了什么
决定四(结构):把出口从循环体里搬出去
常见写法的问题它说得很准:出口和状态判断散落在循环体各处。 一旦要加"这个工具调用得等用户点同意",你就得在执行里往外抛信号、在循环里接、还要记住恢复时跳回哪一行。
它的形状是这样:
while 真:
动作 = 看一眼当前状态,算出该干什么 ← 只读,不改任何东西
照着动作做: 推理(调模型) / 行动(跑工具) / 收工(返回)
(依据:Agent 库 · AgentScope · reply 状态机与事件流 —— _next_action 是只读状态的决策函数,返回 Reasoning/Acting/Exit 三选一,循环体里没有任何判断「该不该结束」的逻辑)
这一条是本课题"循环怎么写"的最佳结构答案,值得直接抄: 循环体只负责执行动作,"下一步该干什么"是一个可以单独测试的纯函数。
好处不是好看,是可存盘: 状态在外面,那么任何时刻停下来、把状态存了、明天再算一次"下一步该干什么",循环就能接上。
它的决策顺序是一张表,三步走:
第一步 有没有能跑的工具调用?
├ 有 ──────────────────────► 行动
└ 没有,但有在等用户/等外部的 ─► 收工(但不发"真结束"的信号)= 挂起
第二步 这次要求结构化输出吗?
├ 要求了且已拿到 ──────────► 收工
├ 要求了还没拿到 ──────────► 推理(塞一条提醒)
└ 没要求 ↓
第三步 上一轮是不是产出了纯文本?
├ 是 ──────────────────────► 收工
├ 否且轮数到顶 ────────────► 收工(原因=超轮数)
└ 否 ──────────────────────► 推理
注意第三步的两个出口带着不同的原因——正常完成 vs 超轮数。这跟 fara 把超轮数混成"完成"正好相反,跟 kun 的"异常停要给原因"是同一条。