Hermes Agent

Hermes Agent 调用 Claude Code、Codex 与 OpenHands 指南

Hermes Agent 可以通过 Skills 把编码任务委派给 Claude Code、Codex、OpenCode 或 OpenHands,自己负责选择工具和汇总结果。页面以 OpenHands Skill 为范本,拆解参数核验、负向清单、平台门控和许可证隔离,帮助你设计可靠的外部编码 Agent 调度入口。

写代码 进阶

📚 系列导航:上一篇 Hermes Agent Skills 系统教程 已经讲清“Skills 系统教程:安装、加载与信任边界”;本篇聚焦 Hermes Agent 调用编码 Agent ;下一篇 Hermes Agent 工具系统教程 继续学习“工具系统与渐进式工具披露”。

先给结论:Skill 不只可以装知识,也可以封装另一个 Agent 的命令行入口。 Hermes 可以把 Claude Code、Codex、OpenHands、OpenCode、Grok 当成执行者,自己负责拆任务和调度。

ℹ️ 版本说明: 原稿基于 Hermes Agent v0.16.0(2026 年 6 月)源码整理。本文保留其版本化机制分析;命令、数量和界面请以 Hermes Agent 官方文档 与本地输出为准。

Hermes 如何委派编码任务

设想你让 Hermes 实现一个功能。它当然可以自己上手,调 terminal、写文件、跑测试。但 v0.16.0 里它多了一个选择:把这单活外包出去。

在 skills/autonomous-ai-agents/ 这个目录下,源码里躺着四个内置 skill。它们不是教 Hermes「怎么写 Python」,而是教它怎么调用另一个 coding agent 帮自己写。Claude Code 是一个,Codex 是一个,OpenCode 是一个,连 Hermes 自己也有一个(用来给本体贡献代码)。

Skill版本它指挥谁去干活
claude-code2.2.0委派编码给 Claude Code CLI(做 feature / 提 PR)
codex1.0.0委派编码给 OpenAI Codex CLI
opencode1.2.0委派编码给 OpenCode CLI(可挂多个 provider)
hermes-agent2.1.0配置、扩展、给 Hermes 本体贡献代码

optional 目录里还有更多:OpenHands、Grok 的 Build CLI、antigravity-cli。装上之后,Hermes 手里就握着一整排可以差遣的 coding agent。

Hermes Agent 通过 Skills 调度 Claude Code、Codex 与 OpenHands

这个结构有点反直觉。我们一直把 Claude Code、Codex 当成「终端」,那个你直接对它说话的 agent。可在 Hermes 眼里,它们是「下属」。谁在最前面收下你的需求,谁就是指挥官;其他 agent 只是它工具箱里的一把扳手。

为什么要这么干?因为不同的 agent 各有各的脾气。Claude-native 的活交给 claude-code,OpenAI 原生 的活交给 codex,需要换模型的场合再换别的。Hermes 不必把每家模型的特长都学一遍,它只要知道「这单该派给谁」就够了。指挥官的本事,是调度,不是亲手做。

OpenHands Skill 的可靠封装方式

这群编排 skill 里,OpenHands 那份写得最讲究,我想把它拎出来当标本。如果你想知道「一个好 skill 到底长什么样」,照着这份抄就对了。

先说它干的事:OpenHands 是 model-agnostic 的,背后能接任何 LiteLLM 支持的 provider,OpenAI、Anthropic、OpenRouter、DeepSeek、Ollama、vLLM 都行。所以这个 skill 的定位很清楚:要 Claude 原生就走 claude-code,要 OpenAI 原生就走 codex,要换着模型玩,才轮到 OpenHands。skill 开头就把这条选择题替你做了。这是第一个细节,好 skill 会告诉你它「什么时候不该用」。

往下看,它的工程化程度才是真正可怕的地方。我把它的几个关键设计列出来。

设计具体做法为什么是范本
真实 flag 表给出可用参数表,并标注「verified against openhands —help, CLI 1.16.0」不是凭记忆瞎写,是对着帮助文档逐条核对过的
负向清单明确写出哪些 flag 不存在(没有 —model / —max-iterations / -workspace / —sandbox)主动告诉调用者「别试这些,试了也是错」,省一整轮试错
一整段 PitfallsLiteLLM 的噪声 warning、banner 刷屏、model slug 是 LiteLLM 的不是 provider 的、pip install openhands-ai 装的是错包(那是 legacy V0)把踩过的坑全写进去,后来者直接绕过
平台门控[linux, macos] 门控,OpenHands 上游在 Windows 要 WSL不兼容的系统上这 skill 直接隐身,不污染索引

调用方式也很克制:通过 terminal 工具 headless 调一行 openhands -headless -json -override-with-envs -exit-without-confirmation 。没有花哨的封装,就是把命令行调对、把坑标清楚。

好 skill 的判据:不在于它写了多少「该做什么」,而在于它写了多少「别做什么」。负向清单、Pitfalls、「什么时候不用我」,这三样才是把一份文档从「看着像对的」变成「跑起来真的对」的分水岭。一个只列正确步骤的 skill,等于一份没经过实战的说明书。

这里还藏着一个本节的关键转变。skill 不再只是「写给 agent 看的知识」,它也可以是对一个外部 CLI 的封装。OpenHands Skill 本质上是一层薄薄的胶水:把 agent 的意图,翻译成另一个 agent 听得懂的命令行。skill 的边界,被悄悄推宽了。

darwinian-evolver Skill 的进化搜索

编排别的 agent 是一种玩法,让 skill 帮你优化东西是另一种。optional 的 research 目录里有个 darwinian-evolver ,薄封装了 Imbue 开源的 darwinian_evolver,一个 LLM 驱动的进化搜索循环。

它的用法是:你给它一个 fitness 函数(一个打分器),它就用进化的方式去优化某个 artifact,可以是一段 prompt、一条 regex、一句 SQL、一小段代码。生成一批变体,打分,留下高分的,再变异,一轮一轮爬坡。

要分清它和 Hermes 自带的自进化不是一回事。内置自进化改的是 skill 库本身;darwinian-evolver 改的是你手里任何「有打分器的东西」。一个对内,一个对外。说起来,这套 hill-climbing 加独立评判加进化树的思路,和我自己做的 darwinskill 是同源的:给定一个客观分数,让机器自己一代代往上爬,比人手调要稳。

还有个细节我挺欣赏:它对上游用的是干净的 license 隔离。Imbue 那个库是 AGPL-3.0,skill 只通过 subprocess 调它的命令行,刻意不去 import 上游的类,这样就只是「调用」而非「合并」,把传染性 license 的边界划得清清楚楚。一个 skill 该怎么和一个许可证不友好的外部依赖打交道,这就是范例。

Skill 如何成为 Agent 调度接口

把这一节往回看一步。前面我们讲 skill 是怎么被造出来、被改进、被开放标准白嫖来的。到这里,skill 显出了它的第二张脸:它不光是知识,也是 agent 之间互相调度的接口。

当一个 skill 可以是「调用另一个 agent」的封装,一个有意思的问题就浮上来了—如果 Hermes 能指挥 Claude Code,那它能不能同时指挥一群 agent,让它们分工协作、并行干活?指挥棒握在手里之后,下一步自然是编队。

这正是后面 Part 5 要展开的:从 delegate_task 派一个隔离上下文的子 agent,到 Kanban 看板上一群 agent 排队认领任务。skill 把「调度」这件事变得可调用,多 agent 编排把它变得可规模化。这一节是那一章的引子。

常见问题

Hermes Agent 为什么要调用其他编码 Agent?

不同编码 Agent 对模型、工具和工作流的支持不同。Hermes 可以把它们当作可调度能力,根据任务选择更合适的执行者。

封装编码 Agent 的 Skill 要写什么?

除了正确命令,还要写清什么时候不该使用、哪些参数不存在、常见依赖问题和支持平台。负向信息通常比功能列表更能减少失败。

这篇教程里的版本数字会变化吗?

会。原稿以 Hermes Agent v0.16.0 为分析基线,平台、工具、命令参数和默认配置可能继续变化;实际操作前请核对当前官方文档和本地命令帮助。