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。