第 1 章 · 中央回复循环
这一章讲 goose 的「心跳」:一条用户消息进来后,
reply/reply_internal怎么把「反复问模型、反复跑工具」变成一个可以边跑边往 UI 推送的流。读懂这个循环,你就读懂了 goose 的主线。
1.1 入口:reply 做的几件「门口的事」
Agent::reply(agents/agent.rs:1522)是公开入口,它不直接进循环,而是先处理几类「在真正开跑之前必须先解决」的情况,然后才把活交给 reply_internal:
- elicitation 回复:如果这条消息其实是用户对某个工具「请你确认一下」弹窗的回应,就走
complete_elicitation_with_message把那个被挂起的工具调用解锁,然后返回一个空流(agents/agent.rs:1534-1566)。 - 生命周期 hook
UserPromptSubmit:有注册就先触发(agents/agent.rs:1572)。 - 斜杠命令:
execute_command处理/goal、/grind这类命令(agents/agent.rs:1586)。设定 goal/grind 的命令会「立刻开一回合」让 agent 马上去追这个目标。 - 自动压缩预检:在进循环前先看上下文是否已超阈值,超了就先压(
check_if_compaction_needed,agents/agent.rs:1702),细节见第 4 章。
这一层的设计意图:把「不需要问模型就能处理」的分支挡在循环之外,保持核心循环的纯粹。