Grok Build · Agent 运行时 —— 思考-行动循环的内幕 章节摘要:环境就绪之后,我们进入 Grok Build 最核心的部分——Agent 运行时,即 shell 层。这是把「会聊天的模型」变成「能干活的助手」的关键所在。它的全部精妙之处,集中在一个叫「思考-行动循环」(think-act loop)的过程里:Agent 收到任务后,不是一次性给出答案,而是多轮地「思考→调用工具→基于工具结果继续思考」,直到任务完成。
章节摘要:环境就绪之后,我们进入 Grok Build 最核心的部分——Agent 运行时,即 shell 层。这是把「会聊天的模型」变成「能干活的助手」的关键所在。它的全部精妙之处,集中在一个叫「思考-行动循环」(think-act loop)的过程里:Agent 收到任务后,不是一次性给出答案,而是多轮地「思考→调用工具→基于工具结果继续思考」,直到任务完成。本章会带你深入 shell 层的源码,拆解 SessionActor 这个承载会话的 Actor、五种运行入口如何汇聚到同一套内核、process_conversation_turn 这个核心循环的逐段逻辑、ChatStateActor 如何管理历史与 token、以及 sampler 桥接与错误分层处理。读完后,你就真正理解了「Agent 是怎么转起来的」。
阅读完本章,你应当能够:
整章逻辑可浓缩为一句话:Agent 的本质是一个「组装请求→调模型→有工具就执行→继续」的多轮循环,而 SessionActor 用单线程隔离了每个会话的状态,让并发既安全又清晰。
讲清每个会话为何由一个独立的 Actor 承载,它如何用单线程命令循环 + channel 通信来避免共享状态,以及这种设计相对于「多线程共享可变状态」的优势。
Grok Build 有 interactive(TUI)、headless(CI)、stdio(IDE)、serve(WS 服务器)、leader(共享后端)五种入口,但它们最终都汇聚到 SessionActor + sampler 这套内核。本节讲清这种「多入口单内核」架构。
本章的重头戏。用伪代码逐段拆解这个核心循环:准备工具、组装请求、调 sampler、处理响应、执行工具、回填结果、决策下一轮。
讲清会话历史如何被独立 actor 管理,token 如何计数,以及这些计数如何驱动上下文压缩决策。
拆解 shell 如何通过一个桥接函数与 sampler 协作,把流式事件收集成可决策的结果,处理 ChannelToken、ToolCallDelta、Completed、Retrying 等事件。
讲清错误的分层:sampler 只管可重试的传输/协议错误(网络、限流),shell 翻译语义错误(401→重新认证重试,上下文超限→压缩后重发)。这种分层让错误处理既聚焦又完整。
本章遵循「理解容器 → 看清入口 → 拆解循环 → 认识配角 → 理解桥接 → 分层错误」的认知路径:
Actor 模型 (01) ──Agent 的状态容器,理解一切的基础 │ ▼ 五种入口 (02) ──多入口汇聚单内核,建立全局 │ ▼ 核心循环 (03) ──process_conversation_turn,本章重心 │ ▼ ChatState (04) ──历史与 token,循环的「记忆」 │ ▼ sampler 桥接 (05) ──循环如何下沉到 sampler │ ▼ 错误分层 (06) ──循环如何应对出错 │ ▼ 第 4 章:深入 sampler 层的内部
每一节都为下一节铺垫:不理解 Actor,就看不懂循环为何如此组织;不看入口,就理解不了「同一内核」的价值;不拆循环,ChatState 与 sampler 桥接就无从挂靠;不认识桥接,错误分层就缺乏语境。
前置知识:
本章为后续章节奠定的基础:
若希望进一步了解 Actor 模型与异步消息传递并发的原理,可参考 Erlang/OTP 与 Akka 的设计文档,它们是这一范式的经典来源;Rust 的 tokio 与 channel 则是这一范式在系统语言里的现代实现。