Grok Build · Subagent Resolution

AgentDefinition 与 Persona 如何合并

子 Agent 先解析可执行骨架,再把 spawn 参数、role 默认值和 Persona 默认值折叠为运行时配置。两套结构在不同阶段生效,最终共同决定子会话。

课程目标

能区分 AgentDefinitionSubagentRoleSubagentPersonaEffectiveRuntimeConfig,并按字段准确判断合并优先级。

TEACHING DIAGRAM

定义解析与运行时覆盖是两条输入线

图中类型和函数名来自源码,箭头用于讲解数据汇合关系。

AgentDefinition 和运行时覆盖共同形成子 Agent AgentDefinitiontools · prompt · permission · model spawn / role / personaruntime defaults and overrides resolve_effective_overridesEffectiveRuntimeConfigprompt fragments + runtime choices child sessiondefinition filtered and rendered
四个真实结构各管什么

AgentDefinition:可版本化的 Agent 合同

.grok/agents/*.md 解析,真实字段包括 prompt_modetool_configcapability_modepermission_modetoolsisolationmodel、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 字段。

crates/codegen/xai-grok-agent/src/config.rs crates/codegen/xai-grok-agent/src/discovery.rs crates/codegen/xai-grok-subagent-resolution/src/config.rs resolve_effective_overrides
优先级需要按字段阅读
01 · spawn override调用 task 时显式给出的 model、reasoning、capability、persona、isolation。
02 · role defaultmodel、reasoning、capability 与 isolation 的 role 默认值。
03 · persona defaultmodel、reasoning 与 isolation。Persona 不提供 capability_mode。
04 · parent / none未命中的字段保留 None,交由下游继承父级;isolation 最终落到 None 模式。

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 仍继续解析。

真实源码快照
crates/codegen/xai-grok-subagent-resolution/src/types.rsREAL SOURCE · abridged
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。

Takeaway:AgentDefinition 提供 Agent 骨架,role 与 Persona 提供 spawn 阶段的运行时输入。优先级是逐字段级联,准确分析要先确认该字段真实存在于哪一种结构。