CHAPTER 12 · CALL PATH
从真实 main() 到第一轮采样
实际入口位于 xai-grok-pager-bin/src/main.rs。同一个组合入口解析命令与交互模式,再把工作交给 TUI 或 Shell Agent 宿主。
课程目标
能准确说出四种运行分支,并沿
能准确说出四种运行分支,并沿
connect_or_spawn、MvpAgent、spawn_session_on_thread、SessionActor、SamplerActor 定位第一轮对话。核心视觉 · 教学化调用图
run_headlessAgent 无头模式
grok agent headless 进入 Shell 提供的无头宿主。
run_stdio_agentStdio Agent
通过 ACP stdio 收发请求,适合外部客户端驱动。
run_leaderLeader 进程
承载长生命周期 Agent,并通过连接通道服务客户端。
app::run交互 TUI
默认交互分支进入 pager 应用,TUI 可经 leader 建立连接。
主轴交接
connect_or_spawn建立 leader 连接或按需启动进程。
MvpAgent响应 ACP 请求并管理会话句柄。
spawn_session_on_thread为 Session 创建 OS 线程。
SessionActor推进 turn loop,协调状态和工具。
SamplerActor为请求创建流式采样任务。
真实源码证据
crates/codegen/xai-grok-pager-bin/src/main.rs
use xai_grok_shell::agent::app::{
run_headless, run_leader, run_stdio_agent
};
let runtime = tokio::runtime::Builder
::new_multi_thread()
.enable_all()
.build()?;
run_headless, run_leader, run_stdio_agent
};
let runtime = tokio::runtime::Builder
::new_multi_thread()
.enable_all()
.build()?;
crates/codegen/xai-grok-shell/src/session/acp_session_impl/spawn.rs
/// Spawn a session actor on a dedicated thread
/// with its own tokio runtime and `LocalSet`.
pub(crate) async fn spawn_session_on_thread(...) {
let rt = tokio::runtime::Builder
::new_current_thread()
.enable_all().build()?;
let local = tokio::task::LocalSet::new();
}
/// with its own tokio runtime and `LocalSet`.
pub(crate) async fn spawn_session_on_thread(...) {
let rt = tokio::runtime::Builder
::new_current_thread()
.enable_all().build()?;
let local = tokio::task::LocalSet::new();
}
源码快照说明:本页依据本地同步副本核对。该副本没有
.git 元数据,因此不声称对应某个 commit 版本。课堂练习
画出一次交互请求的边界
标注哪些节点属于 xai-grok-pager-bin、xai-grok-pager、xai-grok-shell、xai-grok-sampler。说明 TUI 和 Agent 宿主为何是两个 crate。
Takeaway:真实入口是
xai-grok-pager-bin/src/main.rs。它负责分发模式,随后由 pager 承担界面、Shell 承担 Agent 与 Session 宿主、Sampler 承担模型请求。