CHAPTER 12 · SESSION RUNTIME
Session Actor:綫程、狀態與取消邊界
每個 Session 在獨立 OS 綫程上運行 current-thread Tokio runtime 與 LocalSet。SessionActor 協調 turn,ChatStateActor 串行擁有對話狀態,CancellationToken 負責協作式終止。
課程目標
能解釋綫程隔離、Actor 狀態所有權和取消信號如何配合,並準確描述 Agent 的「有效不可變」邊界。
能解釋綫程隔離、Actor 狀態所有權和取消信號如何配合,並準確描述 Agent 的「有效不可變」邊界。
核心視覺 · 教學化運行時圖
Turn loop 的真實職責
SessionActor 協調
run_session同時接收 SessionCommand、ChatStateEvent、SessionEvent 與 turn completion。maybe_start_running_task啓動待處理 turn。- turn 完成後執行 completion、turn end 和後續通知處理。
ChatStateActor 擁有狀態
- 專屬擁有 conversation、token、配置與 persistence。
- 通過
mpsc::UnboundedReceiver串行處理命令。 - 取消 token 觸發退出,全部 handle 被丟棄也會結束循環。
Agent 的真實字段邊界
definitionAgentDefinition,定義身份、模式與策略輸入。
prompt_context支持檢查、重渲染與序列化的 PromptContext。
system_prompt從 prompt context 渲染並緩存的字串。
tool_bridgeArc<ToolBridge>,工具註冊與會話上下文橋樑。
reminder_policySession 級 reminder 策略。
compaction_policy自動壓縮、memory flush 和 two-pass 配置。
hosted_tools發送給 API 的後端託管工具定義。
backend_search_enabled構建時的服務端搜索開關。
準確表述:源碼註釋稱 Agent 構建後「effectively immutable」。它仍提供
finalize_prompt(&mut self) 更新構建時間並重新渲染 prompt,所以不能描述成絕對不可變。真實源碼證據
crates/codegen/xai-grok-shell/src/session/acp_session_impl/spawn.rs
let join_handle = std::thread::Builder::new()
.name(thread_name)
.stack_size(8 * 1024 * 1024)
.spawn(move || {
let rt = tokio::runtime::Builder
::new_current_thread().enable_all().build()?;
let local = tokio::task::LocalSet::new();
});
.name(thread_name)
.stack_size(8 * 1024 * 1024)
.spawn(move || {
let rt = tokio::runtime::Builder
::new_current_thread().enable_all().build()?;
let local = tokio::task::LocalSet::new();
});
crates/codegen/xai-grok-agent/src/agent.rs
/// Re-render the system prompt
pub async fn finalize_prompt(&mut self) {
self.prompt_context.build_timestamp_utc =
chrono::Utc::now().to_rfc3339();
self.system_prompt = self.prompt_context
.render(&self.tool_bridge).await
.unwrap_or_default();
}
pub async fn finalize_prompt(&mut self) {
self.prompt_context.build_timestamp_utc =
chrono::Utc::now().to_rfc3339();
self.system_prompt = self.prompt_context
.render(&self.tool_bridge).await
.unwrap_or_default();
}
源碼快照説明:本頁依據本地同步副本核對。該副本沒有
.git 元數據,因此不聲稱對應某個 commit 版本。課堂練習
給狀態找唯一擁有者
把 conversation、system_prompt、tool registry、sampling request 分別放到 ChatStateActor、Agent、ToolBridge、SamplerActor。再説明取消 token 與消息優先級屬於不同概念,本源碼沒有「高優先級消息插入隊首」的通用設計。
Takeaway:Session 的隔離單位是 OS 綫程加 LocalSet。SessionActor 負責 turn 編排,ChatStateActor 擁有對話狀態,CancellationToken 負責取消。Agent 以有效不可變為主,同時保留顯式重渲染入口。