1. 从“虾马同笼”说起:QClaw 融合 Hermes 到底解决了什么
如果你最近在 OpenClaw 生态里折腾 Agent 编排,大概率听过“养虾又养马”这个说法。虾是 OpenClaw,马是 Hermes。前者擅长把确定性任务跑得又快又稳,后者主打从执行经验里沉淀技能、越用越顺手。QClaw 把两套内核放进同一个平台,真正有意思的地方不是“谁替代谁”,而是让不同心智模式的 Agent 在同一张工作流里各司其职。
我先把结论摆出来:QClaw 融合 Hermes 的核心价值,是让 OpenClaw 负责可预测的稳定环节,让 Hermes 负责需要试错和经验积累的探索环节。你可以把它理解成一个团队——OpenClaw 是执行标准作业的工兵,Hermes 是带着过程记忆的老兵。两者共享同一套任务入口和结果回传,编排层不需要为“这个步骤该用谁”写两套胶水代码。
这篇文章面向的是已经在 OpenClaw 生态里做 Agent 编排、或者准备把 Hermes 能力挂载进现有工作流的开发者。我会交付可复制的 QClaw 接入配置、Hermes 能力挂载示例,以及多步任务链的验证动作。你不需要先成为 Hermes 专家,只要能把配置跑通,就能看到“虾马协同”在一条任务链上的实际表现。
需要提前说明的是,Hermes 的“自进化”不是玄学。它的五层记忆里,过程记忆保存的是成功任务的步骤序列、调用参数和中间决策,技能生成就是把这段过程记忆封装成可复用的 Skill 对象。下次遇到相似任务,匹配到 Skill 就直接执行,省掉重新探索的推理开销。QClaw 做的,是让这套机制和 OpenClaw 的确定性执行在同一个编排平面里共存。
所以这篇不是概念科普。我会从接入配置开始,一步步走到验证请求和排错,中间所有命令、JSON、TOML 都可以直接复制。你跟着做,最后应该能跑通一条“OpenClaw 做前置处理、Hermes 做探索决策、再回到 OpenClaw 做收尾”的多步任务链。
2. TaoToken 前置:给 QClaw 和 Hermes 准备统一模型入口
在把 QClaw 和 Hermes 接起来之前,得先解决模型调用的问题。QClaw 平台本身负责 Agent 编排,但底层对话、代码生成、工具调用这些能力,需要一个稳定的模型入口。TaoToken 在这里的角色,是给 OpenClaw 和 Hermes 提供统一的 Base URL 和 Key,避免你在两套内核里分别维护不同的模型配置。
你可以把 TaoToken 理解成一个模型能力的统一网关。QClaw 里的 OpenClaw 内核和 Hermes 内核,都通过同一个 API 地址发起请求,Key 也共用一套。这样在编排层切换内核时,不需要改模型配置,只需要改 Agent 的内核类型。
先拿到 API Key。访问 TaoToken 控制台,在 API Keys 页面创建一个新 Key。建议按项目命名,比如qclaw-hermes-demo,方便后面在 QClaw 配置里对应。创建后把 Key 复制出来,只显示一次,丢了就得重建。
控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
拿到 Key 之后,记下两个地址。Base URL 用https://taotoken.net/api,注意这个地址不带 UTM 参数,是给程序调用的。文档地址在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有模型列表和参数说明,配置 Model ID 的时候对照着填。
这里有个容易踩的坑:QClaw 里 OpenClaw 和 Hermes 可能读不同的配置文件。OpenClaw 通常读环境变量或项目根目录的.env,Hermes 可能读自己的settings.json或config.toml。我的做法是先把 Base URL 和 Key 写进一个共享的环境变量文件,再让两套配置都引用它。这样后面换 Key 只改一处。
如果你还没决定用哪个模型,可以先在模型对话页面试一下。用同一个 Key 发一条测试消息,确认能正常返回,再去配 QClaw。模型对话地址:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite
对于长期跑编码和 Agent 任务的场景,Coding Plan 会比按量调用更省心。地址:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。不过这篇的重点是接入配置,套餐选择你可以后面再定。
3. 可复制配置:QClaw 接入 Hermes 与能力挂载
这一节是全文的核心。我会给出 QClaw 里启用 Hermes 内核的配置片段、Hermes 能力挂载的 JSON 示例,以及 OpenClaw 和 Hermes 混用时的编排配置。所有路径和字段名都按 QClaw 常见项目结构来写,你按自己项目的实际路径调整。
先看 QClaw 的项目结构。通常根目录下有一个qclaw.config.toml,里面定义 Agent 的内核类型和模型入口。还有一个agents/目录,每个 Agent 一个子目录,里面放agent.json和可选的skills/目录。Hermes 的技能库一般落在agents/<agent-name>/skills/下。
第一步,配置模型入口。在项目根目录创建或修改.env:
# .env TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=sk-你的Key TAOTOKEN_MODEL_ID=你的模型ID注意 Base URL 不要加 UTM 参数,程序调用用干净地址。Model ID 去文档页对照模型列表填。
第二步,在qclaw.config.toml里声明双内核。这个文件控制 QClaw 平台加载哪些 Agent 内核:
# qclaw.config.toml [platform] name = "qclaw-hermes-demo" default_kernel = "openclaw" [model] base_url = "${TAOTOKEN_BASE_URL}" api_key = "${TAOTOKEN_API_KEY}" model_id = "${TAOTOKEN_MODEL_ID}" [kernels.openclaw] enabled = true config_path = "kernels/openclaw.toml" [kernels.hermes] enabled = true config_path = "kernels/hermes.toml" memory_layers = ["working", "semantic", "episodic", "procedural"] skill_auto_generate = true sandbox_approval = ["file_delete", "network_write", "system_config"]这里memory_layers只开了四层,集体记忆是可选的,先不开,避免多实例共享经验时引入额外变量。skill_auto_generate = true是 Hermes 自动封装 Skill 的开关。sandbox_approval列出高风险操作,命中时 Hermes 会进入审批模式。
第三步,配置 Hermes 内核。创建kernels/hermes.toml:
# kernels/hermes.toml [kernel] type = "hermes" version = "latest" [memory] working_ttl_seconds = 3600 semantic_store = "local" episodic_store = "local" procedural_store = "local" skill_index = "agents/hermes-agent/skills/index.json" [skill] auto_generate = true min_steps_to_pack = 3 dedup_threshold = 0.92 deprecation_days = 90 [sandbox] approval_required = true risk_actions = ["file_delete", "network_write", "system_config"]min_steps_to_pack = 3表示任务步骤少于 3 步不封装 Skill,避免碎片化。dedup_threshold = 0.92是技能去重阈值,相似度超过这个值就不重复生成。deprecation_days = 90是技能过期天数,90 天没被调用就标记为待淘汰。
第四步,挂载 Hermes 能力到具体 Agent。创建agents/hermes-agent/agent.json:
{ "name": "hermes-agent", "kernel": "hermes", "description": "负责探索性任务与技能沉淀", "model": { "base_url": "${TAOTOKEN_BASE_URL}", "api_key": "${TAOTOKEN_API_KEY}", "model_id": "${TAOTOKEN_MODEL_ID}" }, "capabilities": [ { "type": "skill_generation", "enabled": true, "output_dir": "agents/hermes-agent/skills" }, { "type": "procedural_memory", "enabled": true, "max_entries": 500 }, { "type": "sandbox_approval", "enabled": true, "risk_actions": ["file_delete", "network_write", "system_config"] } ], "tools": [ "shell", "file_read", "file_write", "http_request" ] }这里capabilities里挂了三项 Hermes 能力:技能生成、过程记忆、沙箱审批。tools是 Agent 可调用的工具集,Hermes 在执行任务时会从这些工具里选。
第五步,配置 OpenClaw 内核,让它和 Hermes 共用模型入口。创建kernels/openclaw.toml:
# kernels/openclaw.toml [kernel] type = "openclaw" version = "latest" [model] base_url = "${TAOTOKEN_BASE_URL}" api_key = "${TAOTOKEN_API_KEY}" model_id = "${TAOTOKEN_MODEL_ID}" [execution] mode = "deterministic" max_retries = 2 timeout_seconds = 120OpenClaw 这边保持确定性执行,mode = "deterministic",不开启技能生成。这样两套内核各管各的,不会互相干扰。
第六步,编排一条混用任务链。创建workflows/deploy-check.json:
{ "name": "deploy-check", "steps": [ { "id": "precheck", "kernel": "openclaw", "action": "shell", "command": "ls -la ./project && cat ./project/package.json", "description": "前置检查:确认项目结构和依赖文件" }, { "id": "explore", "kernel": "hermes", "action": "task", "prompt": "根据上一步的 package.json,尝试安装依赖并启动服务,记录成功路径", "depends_on": ["precheck"], "skill_output": "agents/hermes-agent/skills/deploy-project.json" }, { "id": "finalize", "kernel": "openclaw", "action": "shell", "command": "curl -s http://localhost:3000/health", "depends_on": ["explore"], "description": "收尾验证:检查服务健康接口" } ] }这条任务链里,第一步用 OpenClaw 做确定性前置检查,第二步用 Hermes 做探索性安装和启动,第三步回到 OpenClaw 做收尾验证。Hermes 在第二步成功后,会把过程记忆封装成deploy-project.json这个 Skill。
配置写完后,用 QClaw CLI 加载:
qclaw config validate --file qclaw.config.toml qclaw kernel list qclaw workflow run --file workflows/deploy-check.jsonconfig validate会检查 TOML 语法和字段完整性。kernel list应该能看到 openclaw 和 hermes 两个内核都是 enabled。workflow run触发任务链执行。
4. 验证请求:多步任务链跑通与成功结果确认
配置写完不算完,得实际跑一遍,确认 OpenClaw 和 Hermes 真的在协同。这一节我会给出验证请求的具体动作、预期输出,以及怎么确认 Hermes 生成了 Skill。
先确认模型入口是通的。在项目根目录执行一条最小请求:
curl -s -X POST "${TAOTOKEN_BASE_URL}/v1/chat/completions" \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "'"${TAOTOKEN_MODEL_ID}"'", "messages": [{"role": "user", "content": "回复 OK"}], "max_tokens": 16 }'如果返回里有choices字段且内容包含 OK,说明 Base URL 和 Key 没问题。这一步是后面所有验证的前提,别跳过。
接着验证 QClaw 能加载双内核:
qclaw kernel list --format json预期输出类似:
{ "kernels": [ {"name": "openclaw", "enabled": true, "type": "openclaw"}, {"name": "hermes", "enabled": true, "type": "hermes", "memory_layers": 4} ] }如果 hermes 的enabled是 false,回去检查qclaw.config.toml里[kernels.hermes]的enabled字段,以及kernels/hermes.toml是否存在。
然后跑任务链。先确保./project目录存在,里面有一个package.json。如果没有,可以临时建一个:
mkdir -p ./project cat > ./project/package.json <<'EOF' { "name": "demo-project", "version": "1.0.0", "scripts": { "start": "node -e \"require('http').createServer((q,s)=>s.end('ok')).listen(3000)\"" } } EOF执行任务链:
qclaw workflow run --file workflows/deploy-check.json --verbose预期输出会分三段。第一段是 precheck,OpenClaw 执行ls和cat,输出项目结构。第二段是 explore,Hermes 读取 package.json,尝试安装依赖(这里没有依赖,直接启动),记录成功路径。第三段是 finalize,OpenClaw 请求http://localhost:3000/health,返回 ok。
关键验证点在第二步之后。检查 Hermes 是否生成了 Skill:
ls -la agents/hermes-agent/skills/ cat agents/hermes-agent/skills/deploy-project.jsondeploy-project.json里应该包含步骤序列、调用参数、成功路径。结构大致是:
{ "skill_id": "deploy-project", "created_at": "2025-01-01T00:00:00Z", "steps": [ {"action": "read_file", "target": "package.json"}, {"action": "shell", "command": "npm install"}, {"action": "shell", "command": "npm start"}, {"action": "http_request", "url": "http://localhost:3000/health"} ], "success_path": ["read_file", "shell:npm install", "shell:npm start", "http_request:health"], "call_count": 1 }再跑一次同样的任务链,观察 Hermes 是否直接匹配到 Skill:
qclaw workflow run --file workflows/deploy-check.json --verbose第二次执行时,explore 步骤的日志里应该出现skill matched: deploy-project,执行时间明显短于第一次。这就是“越用越聪明”的实际表现——不是模型变强了,而是过程记忆被复用,省掉了重新探索的推理开销。
最后确认过程记忆有落盘:
qclaw memory inspect --agent hermes-agent --layer procedural --limit 5预期能看到刚才那次任务的步骤记录。如果这一步为空,检查kernels/hermes.toml里procedural_store的路径是否正确,以及agents/hermes-agent/agent.json里procedural_memory的enabled是否为 true。
5. 常见错排查:401、local proxy failed、reading choices、OAuth
配置和验证过程中,最容易撞上四类报错。我按实际遇到的频率排一下,每个给出定位方法和修复动作。
第一类,401 Unauthorized。这个最常见,通常是 Key 没读到或者 Key 失效。先确认环境变量有没有被正确加载:
echo $TAOTOKEN_API_KEY如果输出为空,说明.env没被 source,或者 QClaw 启动时没加载.env。在 QClaw 项目里,.env通常需要显式加载,可以在启动命令前加source .env,或者在qclaw.config.toml里确认[model]段引用的变量名和.env里一致。如果 Key 有值但还是 401,去控制台确认 Key 是否被禁用或删除,必要时重建一个。
第二类,local proxy failed。这个报错通常出现在 QClaw 尝试通过本地代理转发请求时。先检查TAOTOKEN_BASE_URL是不是写成了带 UTM 的地址。程序调用要用https://taotoken.net/api,不要带?utm_source=...那串。带参数的地址是给浏览器访问的,程序请求会解析异常。另外确认本地没有多余的代理环境变量干扰:
env | grep -i proxy如果有HTTP_PROXY或HTTPS_PROXY指向一个不可用的地址,清掉再试:
unset HTTP_PROXY HTTPS_PROXY第三类,reading choices 相关报错。典型信息是cannot read property 'choices' of undefined或reading 'choices'。这说明请求返回的结构里没有choices字段,通常是模型 ID 填错了,或者请求体格式不对。先确认TAOTOKEN_MODEL_ID和文档页里的模型列表一致。然后检查请求体里model字段有没有拼写错误。如果用的是 QClaw 内部封装的调用,检查kernels/hermes.toml和kernels/openclaw.toml里model_id是否都引用了正确的变量。还有一种情况是返回了错误信息但被吞掉了,可以在 curl 请求里加-v看完整响应。
第四类,OAuth 相关报错。如果你在 QClaw 里配了 OAuth 登录或者第三方授权,可能会遇到OAuth token expired或invalid_grant。这类报错和模型调用无关,是 QClaw 平台侧的授权问题。先确认 OAuth 配置里的回调地址和 QClaw 控制台里登记的一致。如果 token 过期,重新走一遍授权流程。注意 OAuth 的 scope 要包含 Agent 编排和模型调用所需的权限,缺 scope 也会报错。
除了这四类,还有一个配置层面的坑:OpenClaw 和 Hermes 的 Model ID 不一致。如果你在kernels/openclaw.toml里写了一个模型,在agents/hermes-agent/agent.json里写了另一个,任务链跑到 Hermes 步骤时可能因为模型不支持某些工具调用而失败。我的做法是两处都引用同一个${TAOTOKEN_MODEL_ID},需要换模型时只改.env一处。
排查顺序建议是:先 curl 确认模型入口通,再qclaw kernel list确认双内核加载,再单步跑 workflow,最后看 memory inspect。这样能把问题范围逐步缩小,不用一上来就翻所有配置。
6. 把虾和马用起来:从单次编排到长期 Agent
配置跑通、任务链验证过、报错也排查完了,接下来是怎么把这套东西用进日常。我的建议是从一条真实的小任务链开始,不要一上来就搭复杂编排。
选一个你每周都要重复做的任务,比如“拉取代码、跑测试、生成报告”。把确定性部分交给 OpenClaw,把需要试错的部分交给 Hermes。第一次跑的时候 Hermes 会慢一些,因为它要探索。跑成功之后,Skill 就沉淀下来了。第二次、第三次会越来越快。这个过程你不需要干预,Hermes 自己会封装。
如果你要长期跑编码和 Agent 任务,Coding Plan 会比按量调用更稳定。地址:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有模型参数和工具调用的详细说明。API Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,建议按项目分 Key,方便追踪调用量。
有一个实际经验:Hermes 的 Skill 库需要定期清理。我试过跑了一个月之后,skills/目录下堆了上百个文件,其中不少是相似度很高的碎片。后来把dedup_threshold从 0.92 调到 0.88,又加了每周一次的qclaw skill prune --older-than 60d,库才保持精炼。这个 prune 命令不是内置的,是我用 QClaw 的 skill 列表接口加 shell 脚本拼的,你可以根据自己的技能命名规则写一个。
另外,集体记忆层先别急着开。多 Agent 共享经验听起来很美,但实际跑起来,不同项目的 Skill 混在一起会互相干扰。等你的单 Agent 技能库稳定了,再考虑开集体记忆,并且要加脱敏和审核。
最后说一个观察:QClaw 融合 Hermes 之后,编排层的心智负担其实降低了。以前你要为每个步骤写详细的 Prompt 和异常处理,现在可以把“怎么做”交给 Hermes 去探索,你只需要定义“做什么”和“什么算成功”。这个转变需要适应,但适应之后,Agent 编排会从写流程变成定目标。虾负责稳,马负责进,你负责定方向。