第四章 子代理与并行编排
一个人干不过来?让墨鱼分身——同时处理多个独立任务,速度翻倍。
两种并行机制
Hermes Agent 提供两种并行处理方式:
| 机制 | 工具 | 适合场景 |
|---|---|---|
| 子代理 | delegate_task | 需要推理的复杂任务 |
| 脚本批量 | execute_code | 机械式多步骤操作 |
选哪个?
需要推理/决策? ──→ delegate_task(子代理)
纯机械操作? ──→ execute_code(脚本)
3个以上工具调用且有处理逻辑? ──→ execute_code
单次工具调用? ──→ 直接调用工具
需要用户交互? ──→ 都不行,自己做delegate_task 子代理
基本原理
┌─────────────────────────────────┐
│ 主 Agent(你对话的) │
│ │
│ delegate_task ──→ 子 Agent 1 │ → 研究主题 A
│ delegate_task ──→ 子 Agent 2 │ → 研究主题 B
│ delegate_task ──→ 子 Agent 3 │ → 写代码 C
│ │
│ ← 汇总所有子 Agent 结果 │
│ ← 整合后回复你 │
└─────────────────────────────────┘每个子代理有:
- 独立的对话上下文
- 独立的终端会话
- 独立的工具集
- 只有最终摘要返回给主 Agent
两种模式
单任务模式:
python
delegate_task(
goal="分析 hermes-agent 仓库的代码统计",
context="仓库路径: /path/to/hermes-agent",
toolsets=["terminal", "file"]
)批量模式(并行):
python
delegate_task(
tasks=[
{"goal": "研究 Python asyncio", "context": "..."},
{"goal": "研究 Rust tokio", "context": "..."},
{"goal": "研究 Go goroutines", "context": "..."}
]
)最多 3 个子代理同时运行。
两个关键参数
| 参数 | 说明 |
|---|---|
goal | 任务目标(具体、自包含) |
context | 背景信息(文件路径、错误消息、约束) |
WARNING
子代理没有你对话的记忆!必须通过 context 传递所有必要信息。
execute_code 脚本批量
基本原理
execute_code 在 Python 沙箱中运行脚本,可以调用 Hermes 工具:
python
from hermes_tools import terminal, read_file, write_file, search_files
# 批量操作
files = search_files(pattern="*.py", target="files", path="./src")
for f in files["matches"][:10]:
content = read_file(path=f)
# 处理...特性
| 特性 | 说明 |
|---|---|
| 内置工具 | terminal, read_file, write_file, search_files, patch 等 |
| 内置函数 | json_parse, shell_quote, retry |
| 限制 | 5 分钟超时,50KB stdout 上限,最多 50 次工具调用 |
适用场景
- 需要循环处理 N 个文件
- 需要条件分支(if/else)
- 需要在工具调用间做数据处理
- 需要重试逻辑
实战案例
案例 1:并行研究
你:帮我对比分析三个 AI Agent 框架:
Hermes Agent、OpenAI Agents SDK、LangGraph。
从架构设计、工具系统、部署方式三个维度对比。Agent 会创建 3 个子代理并行研究,汇总后生成对比表。
案例 2:批量文件处理
你:把 src/ 目录下所有 Python 文件的 docstring 翻译成英文Agent 使用 execute_code 循环处理,避免逐个调用的开销。
案例 3:代码审查 + 测试并行
你:审查这个 PR 的代码变更,同时运行测试套件┌─ 子代理1:代码审查(加载 github-code-review 技能)
│
├─ 子代理2:运行测试(终端执行 pytest)
│
└─ 主代理:汇总两份报告案例 4:多仓库同步
你:检查我的 5 个活跃项目,每个项目:
1. 检查是否有未提交的变更
2. 检查是否落后于远程
3. 检查 CI 状态用 execute_code 循环遍历 5 个仓库,一次性收集所有信息。
性能与限制
delegate_task 限制
| 限制 | 值 |
|---|---|
| 最大并行数 | 3 |
| 最大工具调用轮次 | 50(可配置) |
| 上下文隔离 | 完全隔离 |
| 用户交互 | 不支持 |
execute_code 限制
| 限制 | 值 |
|---|---|
| 执行超时 | 5 分钟 |
| stdout 上限 | 50KB |
| 工具调用上限 | 50 次 |
| 前台执行 | 不支持后台 |
何时不用并行
- 单次工具调用 → 直接调用
- 任务有前后依赖 → 串行执行
- 需要用户反馈 → 亲自处理
高级模式
ACP 子代理
可以让子代理使用不同的 AI 模型:
python
delegate_task(
goal="深度代码审查",
acp_command="claude", # 使用 Claude Code 作为子代理
acp_args=["--acp", "--stdio", "--model", "claude-opus-4"]
)子代理工具集控制
限制子代理可用的工具,提高安全性:
python
delegate_task(
goal="搜索论文",
toolsets=["web"], # 只给 web 搜索工具
max_iterations=10 # 限制最多 10 轮
)嵌套限制
子代理不能再创建子代理(防止无限递归)。但子代理可以使用 execute_code。
最佳实践
- goal 要具体:不要说"帮我做研究",要说"分析 xxx 仓库的代码统计,包括 LOC、语言分布、文件数量"
- context 要完整:包含所有文件路径、URL、错误消息
- 控制并行度:最多 3 个,间隔适当,避免 API 限流
- 结果汇总:子代理只返回摘要,主 Agent 负责整合