CHAPTER 12 · SESSION RUNTIME

Session Actor:綫程、狀態與取消邊界

每個 Session 在獨立 OS 綫程上運行 current-thread Tokio runtime 與 LocalSet。SessionActor 協調 turn,ChatStateActor 串行擁有對話狀態,CancellationToken 負責協作式終止。

課程目標
能解釋綫程隔離、Actor 狀態所有權和取消信號如何配合,並準確描述 Agent 的「有效不可變」邊界。
核心視覺 · 教學化運行時圖
Session OS thread · ses-<id> Tokio current-thread runtime + LocalSet SessionActorSessionCommandturn completion / events ChatStateActorconversationtokens / timing / persistence專屬狀態,無共享鎖 SamplerActorrequest taskSamplingEvent CancellationToken / handle drop 驅動協作式收尾
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 的真實字段邊界
definition

AgentDefinition,定義身份、模式與策略輸入。

prompt_context

支持檢查、重渲染與序列化的 PromptContext。

system_prompt

從 prompt context 渲染並緩存的字串。

tool_bridge

Arc<ToolBridge>,工具註冊與會話上下文橋樑。

reminder_policy

Session 級 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();
  });
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();
}
源碼快照説明:本頁依據本地同步副本核對。該副本沒有 .git 元數據,因此不聲稱對應某個 commit 版本。
課堂練習

給狀態找唯一擁有者

把 conversation、system_prompt、tool registry、sampling request 分別放到 ChatStateActor、Agent、ToolBridge、SamplerActor。再説明取消 token 與消息優先級屬於不同概念,本源碼沒有「高優先級消息插入隊首」的通用設計。

Takeaway:Session 的隔離單位是 OS 綫程加 LocalSet。SessionActor 負責 turn 編排,ChatStateActor 擁有對話狀態,CancellationToken 負責取消。Agent 以有效不可變為主,同時保留顯式重渲染入口。