第九章 子 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 时:
- 父 Agent 设置
_interrupt_requested = True - 子 Agent 检测到中断标志
- 子 Agent 停止当前工具调用
- 资源自动清理(终端会话、浏览器实例等)
心跳保活
在网关模式下,长时间运行的子 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_names 是 model_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
下一章:第十章 多模型适配