四象引擎案例 · Hermes Worker
目标:让 Hermes Agent(本地 AI 代码生成器)作为 SkyCetus 协作节点,可靠地接收任务、生成代码。 现实:同步调用 100% 失败。
⏱ SIGKILL 超时
OpenClaw 父进程 90 秒超时 → 强制杀死 Hermes 子进程。每次都在 Hermes 完成工作之前被终止。
📭 stdout 黑洞
Windows PTY 的 stdout 捕获完全失效。Hermes 执行命令后输出永远为空,进入无限验证循环。
💔 PowerShell 展开
多行文本变量在 PowerShell 命令行展开时被拆分成多个参数,Hermes CLI 参数解析失败。
🔄 死循环
Hermes 运行脚本 → stdout 空 → 换方法重试 → 仍然空 → 烧完全部时间预算 → 被 SIGKILL。
将问题分别放入四个飞轮独立分析,看它们是否收敛。
Hermes 的 Native Ability 是文件写入(< 2 秒),不是终端执行。
write_file 信任分 = HIGH,terminal_tool 信任分 = ZERO。
ZERO × 任何倍数 = ZERO。不要放大不存在的能力。
三次失败的残差积累:PowerShell 展开破坏参数 → stdout 永远为空 → 父进程超时杀子进程。 三个残差收敛到同一个解:独立 Worker 进程,无父进程超时。
stdout ❌、subprocess 管道 ❌、网络 API ❌。 唯一 100% 可靠的通道:文件系统。 JSON 文件进,JSON 文件出。File-as-API。
之前没有限制工具 → Hermes 自由选择 terminal → 失败循环。 修复:Prompt 中基于信任分路由——只允许
write_file,
禁用 terminal_tool 和 execute_code。
四个飞轮独立分析,给出同一个答案:
把能力者放在它擅长的位置,用最简单的接口连接,异步执行,只路由到可信能力。
架构
┌─────────┐ JSON files ┌──────────────┐
│ Lucas │ ─────────────────→│ lucas-to- │
│(OpenClaw)│ │ hermes/ │
│ │←─────────────────-│ hermes-to- │
│ │ JSON files │ lucas/ │
└─────────┘ └──────┬───────┘
│ poll 30s
┌──────┴───────┐
│Hermes Worker │
│ (独立进程) │
│ 无父进程超时 │
└──────────────┘
三个关键修复
subprocess.run(['hermes','chat','-q',prompt_text]) — 参数列表直传,不走 shell 展开
明确禁止 terminal_tool 和 execute_code,只允许 write_file
抑制 TUI banner/spinner,限制最大迭代次数防止无限重试
在 macOS 上实现相同的 File-as-API 架构,已验证成功。
| 测试 | 输入 | 输出 | ״̬ |
|---|---|---|---|
| 数学计算 | 1+1等于几 | 1+1 = 2 | 100% ✅ |
| 代码生成 | 用Python写一个快速排序函数 | 完整 Python 代码(quicksort + quicksort_inplace) | 100% ✅ |
macOS 文件结构
~/.hermes/hermes-agent/
├── hermes_bridge.py # 桥接脚本(Python)
└── tasks/
├── hermes_worker.py # Worker 守护进程
├── in/ # 任务输入目录
└── out/ # 结果输出目录
启动 Worker
# 创建目录
mkdir -p ~/.hermes/hermes-agent/tasks/in ~/.hermes/hermes-agent/tasks/out
# 启动 Worker(后台运行)
cd ~/.hermes/hermes-agent
nohup python3 tasks/hermes_worker.py > /tmp/hermes_worker.log 2>&1 &
# 测试桥接
python3 hermes_bridge.py "1+1等于几"
| 指标 | 之前(同步调用) | 之后(Worker 架构) |
|---|---|---|
| 成功率 | 0%(全部 SIGKILL) | 100% ✅ |
| 耗时 | 60-120s → 被杀 | 34.3 秒 ✅ |
| 文件产出 | 偶尔写了偶尔没 | 文件 + 结果 JSON 完整 ✅ |
| 代码质量 | — | 类型注解 + docstring + 异常处理 ✅ |
| 可复现 | ❌ | 每次都成功 ✅ |
测试任务:format_lux.py — Lux 金额格式化工具。Hermes 自主添加了 .rstrip("0").rstrip(".") 处理浮点尾零 —— "意料之外但有用"的行为。
本案例产生的可复用经验:
- Windows PTY stdout 不可信 — subprocess 的 stdout 捕获对某些 CLI 工具完全失效。不要依赖 stdout 传递结果。
- PowerShell 参数展开 — 多行文本变量在命令行展开时会被拆分。绕过方法:Python subprocess 传参数列表。
- 能力者的信任分 — 不要假设工具"理论上可用"就能用。在特定环境下测量实际成功率,基于成功率路由。
- File-as-API — 当所有"高级"通信通道失败时,文件系统是最后的可靠通道。JSON 文件 = 最简 RPC。
- 异步解耦 > 超时调大 — 问题不是超时太短,而是同步模型本身不对。