委托与并行工作
Hermes 可以派生出彼此隔离的子 agent,并行处理任务。每个子 agent 都有自己的对话、终端会话和工具集。只有最终摘要会返回给父 agent,中间的工具调用不会进入你的上下文窗口。
完整功能参考请参阅 Subagent Delegation。
什么时候该用委托
适合委托的任务:
- 推理密集型子任务(调试、代码审查、研究综合)
- 会把你的上下文塞满中间数据的任务
- 可以并行且彼此独立的工作流(例如同时研究 A 和 B)
- 需要“全新视角”的任务,希望 agent 在没有先入为主偏见的情况下重新接手
其它场景更适合用别的方式:
- 单个工具调用 -> 直接调用工具
- 需要多步机械执行、且步骤间存在逻辑控制 -> 用
execute_code - 需要用户交互的任务 -> 子 agent 不能使用
clarify - 快速文件编辑 -> 直接自己处理
模式:并行研究
同时研究三个主题,并拿回结构化摘要:
Research these three topics in parallel:
1. Current state of WebAssembly outside the browser
2. RISC-V server chip adoption in 2025
3. Practical quantum computing applications
Focus on recent developments and key players.
在底层,Hermes 会使用类似这样的调用:
delegate_task(tasks=[
{
"goal": "Research WebAssembly outside the browser in 2025",
"context": "Focus on: runtimes (Wasmtime, Wasmer), cloud/edge use cases, WASI progress",
"toolsets": ["web"]
},
{
"goal": "Research RISC-V server chip adoption",
"context": "Focus on: server chips shipping, cloud providers adopting, software ecosystem",
"toolsets": ["web"]
},
{
"goal": "Research practical quantum computing applications",
"context": "Focus on: error correction breakthroughs, real-world use cases, key companies",
"toolsets": ["web"]
}
])
三个子任务会并发执行。每个子 agent 都会独立搜索 Web,并返回自己的总结。随后父 agent 再把这些结果综合成一份统一 briefing。
模式:代码审查
把安全审查委托给一个“全新上下文”的子 agent,让它在没有既有假设的情况下重新审视代码:
Review the authentication module at src/auth/ for security issues.
Check for SQL injection, JWT validation problems, password handling,
and session management. Fix anything you find and run the tests.
这里的关键是 context 字段,它必须包含子 agent 所需的全部信息:
delegate_task(
goal="Review src/auth/ for security issues and fix any found",
context="""Project at /home/user/webapp. Python 3.11, Flask, PyJWT, bcrypt.
Auth files: src/auth/login.py, src/auth/jwt.py, src/auth/middleware.py
Test command: pytest tests/auth/ -v
Focus on: SQL injection, JWT validation, password hashing, session management.
Fix issues found and verify tests pass.""",
toolsets=["terminal", "file"]
)
子 agent 对你当前会话里的内容一无所知。它们是彻底全新的。如果你只委托一句“修一下我们刚才讨论的那个 bug”,子 agent 根本不知道你说的是哪个 bug。一定要把文件路径、错误信息、项目结构和约束条件都显式传进去。
模式:并行比较备选方案
把同一个问题的多个方案拆开并行评估,再选择最优解:
I need to add full-text search to our Django app. Evaluate three approaches
in parallel:
1. PostgreSQL tsvector (built-in)
2. Elasticsearch via django-elasticsearch-dsl
3. Meilisearch via meilisearch-python
For each: setup complexity, query capabilities, resource requirements,
and maintenance overhead. Compare them and recommend one.
每个子 agent 独立研究其中一个方案。由于它们彼此隔离,不会相互污染结论,每个方案都能按自身优劣被单独评估。父 agent 则汇总三个结果并做最终推荐。
模式:多文件重构
把一个大型重构任务拆成多个并行子 agent,让它们分别负责代码库不同部分:
delegate_task(tasks=[
{
"goal": "Refactor all API endpoint handlers to use the new response format",
"context": """Project at /home/user/api-server.
Files: src/handlers/users.py, src/handlers/auth.py, src/handlers/billing.py
Old format: return {"data": result, "status": "ok"}
New format: return APIResponse(data=result, status=200).to_dict()
Import: from src.responses import APIResponse
Run tests after: pytest tests/handlers/ -v""",
"toolsets": ["terminal", "file"]
},
{
"goal": "Update all client SDK methods to handle the new response format",
"context": """Project at /home/user/api-server.
Files: sdk/python/client.py, sdk/python/models.py
Old parsing: result = response.json()["data"]
New parsing: result = response.json()["data"] (same key, but add status code checking)
Also update sdk/python/tests/test_client.py""",
"toolsets": ["terminal", "file"]
},
{
"goal": "Update API documentation to reflect the new response format",
"context": """Project at /home/user/api-server.
Docs at: docs/api/. Format: Markdown with code examples.
Update all response examples from old format to new format.
Add a 'Response Format' section to docs/api/overview.md explaining the schema.""",
"toolsets": ["terminal", "file"]
}
])
每个子 agent 都有独立的终端会话。只要它们编辑的是不同文件,就可以在同一个项目目录里并行工作而互不干扰。如果两个子 agent 可能会碰到同一个文件,最好把这个文件留给你在并行阶段结束后自己统一处理。
模式:先采集,再分析
让 execute_code 负责机械化采集数据,再把需要重推理的分析工作委托出去:
# Step 1: Mechanical gathering (execute_code is better here — no reasoning needed)
execute_code("""
from hermes_tools import web_search, web_extract
results = []
for query in ["AI funding Q1 2026", "AI startup acquisitions 2026", "AI IPOs 2026"]:
r = web_search(query, limit=5)
for item in r["data"]["web"]:
results.append({"title": item["title"], "url": item["url"], "desc": item["description"]})
# Extract full content from top 5 most relevant
urls = [r["url"] for r in results[:5]]
content = web_extract(urls)
# Save for the analysis step
import json
with open("/tmp/ai-funding-data.json", "w") as f:
json.dump({"search_results": results, "extracted": content["results"]}, f)
print(f"Collected {len(results)} results, extracted {len(content['results'])} pages")
""")
# Step 2: Reasoning-heavy analysis (delegation is better here)
delegate_task(
goal="Analyze AI funding data and write a market report",
context="""Raw data at /tmp/ai-funding-data.json contains search results and
extracted web pages about AI funding, acquisitions, and IPOs in Q1 2026.
Write a structured market report: key deals, trends, notable players,
and outlook. Focus on deals over $100M.""",
toolsets=["terminal", "file"]
)
这通常是最高效的模式之一:execute_code 先以较低成本完成 10+ 次顺序工具调用,然后把干净上下文交给子 agent 去做一次昂贵但高价值的推理任务。
选择工具集
根据子 agent 的任务类型来选 toolset:
| Task type | Toolsets | Why |
|---|---|---|
| Web 研究 | ["web"] | 只需要 web_search 和 web_extract |
| 代码工作 | ["terminal", "file"] | 需要 shell 和文件操作 |
| 全栈任务 | ["terminal", "file", "web"] | 除消息平台外都需要 |
| 只读分析 | ["file"] | 只能读文件,不能跑 shell |
限制 toolset 能让子 agent 更聚焦,也能减少意外副作用(例如一个纯研究子 agent 不该去执行 shell 命令)。
约束
- 默认并发 3 个任务 —— 批量委托默认最多同时跑 3 个子 agent(可通过
config.yaml中的delegation.max_concurrent_children调整;没有硬上限,只有最小值 1) - 嵌套委托默认关闭 —— 叶子子 agent(默认)不能再调用
delegate_task、clarify、memory、send_message或execute_code。只有 orchestrator 子 agent(role="orchestrator")在你把delegation.max_spawn_depth提高到默认值 1 以上时,才能继续做委托(支持 1-3);其余四个工具仍然被禁用。也可以用delegation.orchestrator_enabled: false全局关闭 - 独立终端 —— 每个子 agent 都有自己的终端会话、工作目录和状态
- 没有会话历史 —— 子 agent 只能看到父 agent 在调用
delegate_task时传入的goal和context - 默认 50 次迭代 —— 对简单任务可以把
max_iterations设低一点,以节省成本
小贴士
目标要写具体。 “修一下 bug”太模糊了;“修复 api/handlers.py 第 47 行 process_request() 从 parse_body() 收到 None 导致的 TypeError”才足够让子 agent 上手。
一定要给文件路径。 子 agent 并不知道你的项目结构。相关文件的绝对路径、项目根目录、测试命令,都应该显式给出。
委托很适合做上下文隔离。 有时候你就是需要一个全新的视角。委托会逼你把问题表达清楚,而子 agent 会在没有你当前会话既有假设的情况下重新思考。
结果要复核。 子 agent 返回的是摘要,不是证明。如果它说“bug 已修好,测试已通过”,你最好还是自己再跑一下测试,或者读一下 diff 进行验证。
完整委托参考,包括所有参数、ACP 集成和高级配置,请参阅 Subagent Delegation。