2026年4月12日 · 阅读 —
OpenClaw 直接调用 Hermes CLI 方案
OpenClaw 直接调用 Hermes CLI 方案
一、结论
当前推荐方案:
- 不再把“OpenClaw -> Hermes”默认建成
inbox/outbox + worker_loop的异步文件队列 - 默认改为:
OpenClaw 直接本地调用 Hermes CLI - 保留旧的文件桥接脚本作为兼容层与后续异步扩展备用
一句话:
同机部署场景下,OpenClaw 作为主入口,直接调用 Hermes CLI 是当前阶段最短、最稳、最好接入的实现。
二、为什么改成直接调用
这次调整的核心判断是:
- 当前目标是“先把主入口到执行器的直连链路跑通”
- 不是先做一个完整的任务队列系统
因此:
- 如果任务是 OpenClaw 收到后立即转给 Hermes 执行
- 而且 Hermes 本身已经支持 CLI 模式
- 那最自然的实现就是 OpenClaw 直接起 Hermes CLI 子进程
相比旧链路:
OpenClaw
-> 写 task JSON
-> inbox/
-> worker_loop 轮询
-> execute_task.py
-> Hermes CLI
-> outbox/report
-> OpenClaw 回收
当前推荐链路:
OpenClaw
-> direct_invoke.py / execute_task.py
-> Hermes CLI
-> 返回 result JSON
-> OpenClaw 回复用户
三、适用场景
这套方案适合:
- OpenClaw 与 Hermes 同机部署
- OpenClaw 是唯一对外入口
- Hermes 主要承担工程执行、分析、读写工作区、生成报告
- 当前以同步执行为主
- 任务量还没大到必须引入任务队列
典型任务:
- 代码分析
- 项目目录扫描
- 配置诊断
- 读文件总结
- 生成实施方案
- 输出技术报告
四、当前落地文件
本次已落地的核心文件:
07-Scripts/openclaw-hermes/execute_task.py07-Scripts/openclaw-hermes/direct_invoke.py07-Scripts/openclaw-hermes/collect_result.py
兼容保留但不再作为默认主路径的旧文件:
07-Scripts/openclaw-hermes/submit_task.py07-Scripts/openclaw-hermes/worker_loop.py
五、脚本职责
1. 07-Scripts/openclaw-hermes/direct_invoke.py
定位:
- 给 OpenClaw 直接调用 Hermes 的最小入口脚本
- 不经过
inbox/worker_loop - 适合作为主入口直接 shell/subprocess 调用的统一壳子
职责:
- 接收标题、摘要、target path、instructions 等参数
- 组装标准请求对象
- 直接调用 Hermes CLI
- 返回最终 JSON 或 summary
2. 07-Scripts/openclaw-hermes/execute_task.py
定位:
- 直接调用能力的核心实现
- 同时兼容旧的
task-*.json文件模式
当前支持两种模式:
模式 A:旧兼容模式
python3 07-Scripts/openclaw-hermes/execute_task.py path/to/task.json
模式 B:直接调用模式
python3 07-Scripts/openclaw-hermes/execute_task.py \
--title "检查项目配置" \
--summary "先读 AGENTS.md,再输出结论" \
--target-path "03-Projects/demo-project" \
--instruction "先读 AGENTS.md" \
--instruction "默认非破坏性" \
--print-json
核心职责:
build_request(...):构造标准任务请求build_prompt(...):把请求转成 Hermes 可执行 promptrun_hermes(...):本地起 Hermes CLI 子进程execute_request(...):执行并返回最终 payloadensure_fallback_result(...):Hermes 未落结果 JSON 时自动兜底
3. 07-Scripts/openclaw-hermes/collect_result.py
定位:
- 把结果 JSON 转成适合 OpenClaw 回复用户的文本块
- 现在文案已去掉对
worker的强绑定
六、实际调用机制
1. OpenClaw 侧发起调用
OpenClaw 直接调用:
python3 07-Scripts/openclaw-hermes/direct_invoke.py ...
2. direct_invoke.py 内部构造请求
请求包含这些核心字段:
task_idtitlesummaryworkspacetarget_pathinstructionsdeliverablesconstraintsoutput.report_pathoutput.result_path
3. execute_task.py 组装 prompt 并执行
内部最终通过子进程调用 Hermes CLI:
python -m hermes_cli.main chat -q "<prompt>" --source tool
执行时会显式设置:
HERMES_HOMETERMINAL_CWDMESSAGING_CWDcwd=workspace
4. Hermes 返回执行结果
结果优先写到:
90-System/shared/outbox/result-<task_id>.json90-System/shared/reports/report-<task_id>.md
如果 Hermes 没按约定写结果 JSON,桥接脚本会自动回填 fallback result。
七、推荐接入方式
方案 A:OpenClaw 直接调 direct_invoke.py
这是当前默认推荐。
示例:
python3 07-Scripts/openclaw-hermes/direct_invoke.py \
--title "检查 demo-project 配置" \
--summary "先读 AGENTS.md,检查配置问题,先给结论再给依据" \
--target-path "03-Projects/demo-project" \
--instruction "先读 AGENTS.md" \
--instruction "默认非破坏性" \
--instruction "先给结论,再给依据" \
--deliverable summary \
--print-json
适合:
- 主入口直接执行
- OpenClaw 直接拿 stdout / 退出码 / result JSON
- 不想暴露内部实现细节给主逻辑
方案 B:OpenClaw 直接调 execute_task.py
如果不想再多套一层壳,也可以直接调:
python3 07-Scripts/openclaw-hermes/execute_task.py \
--title "检查 demo-project 配置" \
--summary "先读 AGENTS.md,检查配置问题,先给结论再给依据" \
--target-path "03-Projects/demo-project" \
--instruction "先读 AGENTS.md" \
--instruction "默认非破坏性" \
--print-json
八、OpenClaw 侧建议拿什么结果
建议最少拿这几项:
- 进程退出码
- stdout
result-*.json
重点字段:
statussummaryartifacts.report_patherror
推荐回复策略:
- 先给结论
- 再给状态
- 再给摘要
- 如果有报告路径,再附上路径
九、当前验证结果
本次已完成以下验证:
1. 语法验证
已通过:
python3 -m py_compile \
07-Scripts/openclaw-hermes/execute_task.py \
07-Scripts/openclaw-hermes/direct_invoke.py \
07-Scripts/openclaw-hermes/collect_result.py
2. 直接调用烟雾测试
已生成测试结果:
90-System/shared/outbox/result-direct-20260412-120003.json
测试结果摘要:
status: completedworker: hermes-direct-clisummary: 烟雾测试已通过。
十、这套方案相对旧文件桥接的优势
优势
- 链路更短
- 调试更简单
- 延迟更低
- 更适合当前同机直连场景
- 更贴合 Hermes 已有 CLI 能力
代价
- 默认更偏同步执行
- 对超长任务、队列管理、并发调度支持较弱
- 如果后续任务量上来,仍可能需要重新引入异步任务层
十一、什么时候再回到文件桥接 / 队列模式
当出现下面这些情况时,再考虑把 submit_task.py + worker_loop.py 重新升为主路:
- 长任务越来越多
- 需要异步回收结果
- 需要失败重试
- 需要任务排队
- 需要多 worker 并发消费
- 需要任务状态机与更强的审计追踪
一句话:
当前先用“直调 CLI”跑通主链路;只有当同步直调不够用时,再升级回任务队列。
十二、推荐口径
后续统一对外描述建议使用:
OpenClaw 作为主入口,在本机直接调用 Hermes CLI 执行重任务。
当前默认不经过 inbox/worker_loop 异步队列。
旧的文件桥接脚本仍保留,作为兼容模式和后续异步扩展备用。
十三、相关文件引用
- 主文档:
01-Articles/2026-04-12-OpenClaw-直接调用-Hermes-CLI-方案.md - 直接调用脚本:
07-Scripts/openclaw-hermes/direct_invoke.py - 核心执行脚本:
07-Scripts/openclaw-hermes/execute_task.py - 结果渲染脚本:
07-Scripts/openclaw-hermes/collect_result.py - 旧 worker 脚本:
07-Scripts/openclaw-hermes/worker_loop.py - 旧提交脚本:
07-Scripts/openclaw-hermes/submit_task.py - 共享工作区方案:
OpenClaw Hermes Obsidian 共享工作区方案 - 最小闭环桥接方案:
boeai_murph_bot 到 Hermes worker 最小闭环桥接方案 - 实施骨架记录:
Murph 调用 Hermes 实施进度与脚本骨架
十四、最终建议
当前阶段直接拍板:
- 默认主路径:
OpenClaw -> direct_invoke.py -> Hermes CLI - 保留兼容路径:
OpenClaw -> task.json -> worker_loop -> Hermes CLI - 真正需要异步队列时,再切回旧桥接模式
一句话收口:
这版方案的核心不是再造一个任务系统,而是先把 OpenClaw 到 Hermes 的最短可用链路固定下来。