Skip to content

第九章 子 Agent 与并行执行

Hermes 通过 delegate_task 工具实现子 Agent 委托——从当前对话中派生出独立的子 Agent,执行子任务后返回结果。这不仅是并行化手段,更是隔离的关键设计。

9.1 委托工具设计哲学

为什么需要子 Agent?

普通工具调用是单轮的:调用 → 返回结果。但有些任务需要多轮工具调用

  • "同时研究三个不同的技术方案" → 需要 3 个独立的工具调用链
  • "审查这段代码并修复问题" → 需要先读代码(读文件)、分析(多轮思考)、修改(写文件)
  • "在两个数据库中分别查询并对比" → 需要两组独立的终端调用

9.2 隔离保证

每个子 Agent 获得完全独立的运行环境:

四重隔离

维度实现原因
上下文skip_context_files=True, skip_memory=True避免子任务污染父对话
终端独立的终端会话 (task_id)防止命令冲突
工具屏蔽 delegate_task, clarify, memory防止递归委托和越权
预算独立的 IterationBudget子任务不会耗尽父预算

子 Agent 构造

python
# tools/delegate_tool.py 核心逻辑
child = AIAgent(
    base_url=effective_base_url,
    api_key=effective_api_key,
    max_iterations=max_iterations,       # 独立预算
    enabled_toolsets=child_toolsets,     # 受限工具集
    ephemeral_system_prompt=child_prompt,# 聚焦的提示词
    skip_context_files=True,             # 不继承上下文文件
    skip_memory=True,                    # 不继承记忆
    parent_session_id=self.session_id,   # 记录父会话
)

9.3 执行模式

单任务模式

直接执行,无线程开销:

批量并行模式

同时派遣多个子 Agent:

进度跟踪

批量模式下,父 Agent 会实时报告进度:

python
for i, task in enumerate(tasks):
    result = child.run_conversation(task)
    completed = i + 1
    progress = f"[{completed}/{len(tasks)}] Task {completed} done"
    # 通过 tool_progress_callback 报告

9.4 生命周期管理

中断传播

当用户中断父 Agent 时:

  1. 父 Agent 设置 _interrupt_requested = True
  2. 子 Agent 检测到中断标志
  3. 子 Agent 停止当前工具调用
  4. 资源自动清理(终端会话、浏览器实例等)

心跳保活

在网关模式下,长时间运行的子 Agent 需要定期发送心跳,防止网关超时断开:

python
# delegate_tool.py 心跳机制
while child_running:
    heartbeat_response = self._send_heartbeat()
    if heartbeat_response == "interrupted":
        child.interrupt()
        break
    time.sleep(HEARTBEAT_INTERVAL)

全局状态保存恢复

_last_resolved_tool_namesmodel_tools.py 中的进程全局变量。子 Agent 执行期间会临时修改它:

python
# delegate_tool.py
_saved_tool_names = _last_resolved_tool_names  # 保存
try:
    child.run_conversation(task)
finally:
    _last_resolved_tool_names = _saved_tool_names  # 恢复

9.5 凭证覆盖

子 Agent 可以使用与父 Agent 不同的 Provider 和凭证:

python
# 使用不同的模型/Provider
child = AIAgent(
    model="openai/gpt-4o-mini",       # 更便宜的模型用于研究
    api_key=different_api_key,         # 不同账户
    base_url=different_endpoint,       # 不同端点
)

典型场景

  • 研究任务用便宜模型(GPT-4o-mini),最终汇总用强模型(Claude Opus)
  • 不同任务使用不同 API key 分摊费用
  • 本地模型(Ollama)处理隐私敏感任务

源码导航

  • 委托工具 → tools/delegate_tool.py

下一章:第十章 多模型适配

基于 MIT 许可发布