AgentDefinition 與 Persona 如何合併
子 Agent 先解析可執行骨架,再把 spawn 參數、role 預設值和 Persona 預設值摺疊為運行時配置。兩套結構在不同階段生效,最終共同決定子會話。
能區分 AgentDefinition、SubagentRole、SubagentPersona 與 EffectiveRuntimeConfig,並按字段準確判斷合併優先級。
定義解析與運行時覆蓋是兩條輸入綫
圖中類型和函式名來自源碼,箭頭用於講解數據匯合關係。
AgentDefinition:可版本化的 Agent 合同
從 .grok/agents/*.md 解析,真實字段包括 prompt_mode、tool_config、capability_mode、permission_mode、tools、isolation、model、hooks 與 MCP 繼承等。項目定義的發現優先級高於 user 與 bundled。
SubagentRole:按類型命中的運行時預設
role 可給出 capability、model、reasoning effort、prompt file 與預設 isolation。它由 subagent_type 查找,role prompt 在 spawn 時讀取。
SubagentPersona:按名稱選擇的行為層
Persona 有 inline instructions、instructions file、inputs、outputs、model、reasoning effort 與 default isolation。inline 文本在檔案內容之前合併,再作為 <persona> 塊進入 prompt。
EffectiveRuntimeConfig:已解析結果
真實字段是 model、reasoning_effort、capability_mode、persona、persona_instructions、role_prompt、role_prompt_warning、role_name、persona_error 與 isolation。源碼中沒有 temperature、max_tokens 或 tools 字段。
EffectiveRuntimeConfig 之後還有 definition fallback
shell 收到解析結果後,若 reasoning_effort 仍為空,會讀取 AgentDefinition.effort;若 runtime isolation 為 None 且 definition isolation 為 Worktree,也會升級為 Worktree。model 解析中,已解析的 runtime override 先於 per-agent pin、AgentDefinition.model 與父模型繼承。
失敗關閉:Persona
請求了 Persona 後,找不到、內容為空或讀取檔案失敗都會寫入 persona_error。檔案 I/O 失敗會提前返回預設化結果;spawn 側看到 Persona 錯誤後中止創建。
軟降級:role prompt
role 的 prompt_file 讀取失敗只產生 role_prompt_warning,其餘 model、reasoning、capability 與 isolation 仍繼續解析。
pub struct EffectiveRuntimeConfig {
pub model: Option<String>,
pub reasoning_effort: Option<String>,
pub capability_mode: Option<SubagentCapabilityMode>,
pub persona: Option<String>,
pub persona_instructions: Option<String>,
pub role_prompt: Option<String>,
pub persona_error: Option<String>,
pub isolation: SubagentIsolationMode,
}
快照説明:字段名與類型來自真實結構體,省略了註釋和兩個觀測字段。上方合流圖是教學化視覺,不表示源碼中存在同名的單體管綫類。
課堂練習:手算有效配置
spawn 指定 reasoning_effort=high 和 Persona reviewer;role 指定 model=A、capability=read-only、isolation=worktree;Persona 指定 model=B、reasoning=low、isolation=none。寫出四個字段的最終值,並解釋 capability 為何不會讀取 Persona。