让 Hermes 与 MiMo 像两个真正的协作同事一样互相交任务。
Hermimo Link 是一个仅依赖 Python 标准库的双 Agent 共享任务总线。你只需要对当前 Agent 说“让另一边帮我做这个”,任务就会被准确投递到另一端,自动执行、失败重试并回传结果。
English quick start is available near the end of this page.
- 准备 Python 3.10+,并确认终端能够分别调用 Hermes 和 MiMo。
- 下载并完整解压发布包;不要直接在 ZIP 压缩包内运行安装或升级脚本。
- 按下方“安装”章节分别安装 Hermes 端和 MiMo 端。两端必须指向同一个物理共享目录,但必须使用各自独立的 Skill 安装目录。
- 启动两个 worker;使用 Windows MiMo + WSL Hermes 的一键升级时,升级程序会安装后台启动器并自动启动。
- 各自新开一次 Hermes 和 MiMo 会话,然后直接用自然语言交任务。
例如,对 Hermes 说:
请确认 Hermimo Link v1.0.5 已加载,并让 MiMo 检查这个项目的报错;等结果回来后再汇总给我。
对 MiMo 反向委派时说:
让 Hermes 评审这个方案,要求它给出风险和验证依据;等结果回来后告诉我。
正常投递会出现 TASK|<任务ID>|...,正常完成会出现 RESULT|<任务ID>|success|...。如果自动接收暂时异常,保留这个任务 ID,按“发送任务 ID 补收”章节恢复即可。
Hermes 和 MiMo 各有所长,但普通文件共享不能解决这些关键问题:
- 谁应该执行这个任务?
- 两端同时扫描时,如何避免重复执行?
- 写到一半的 JSON 被另一端读到怎么办?
- Agent 暂时失败后,如何自动重试?
- MiMo 发给 Hermes 的任务会不会被 MiMo 自己拿走?
- 两个 Agent 会不会把同一个任务来回踢成死循环?
Hermimo Link 使用独立收件箱、原子写入、原子认领、最终结果标记和转交深度限制解决这些问题。
| 能力 | 说明 |
|---|---|
| 真正双向 | Hermes → MiMo 与 MiMo → Hermes 使用同一套协议和 worker |
| 自动路由 | 已安装 Skill 的 endpoint.json 标识本端并自动选择另一端 |
| 快速响应 | 默认每 0.2 秒检查一次任务,可用环境变量调整 |
| 防重复执行 | 任务从 inbox 原子移动到 processing,只有一个 worker 能认领 |
| 自动重试 | 默认最多尝试 3 次,重试结果不会被误认为最终失败 |
| 防无限转交 | 嵌套任务继承父任务和深度,默认最多转交 4 层 |
| 安全路径 | HERMIMO_ALLOWED_ROOTS 限制 Agent 可以进入的工作目录 |
| 可选签名 | HERMIMO_SHARED_SECRET 为任务、结果和事件添加 HMAC-SHA256 签名 |
| 可追溯 | 每次排队、认领、完成、重试和拒绝都会留下事件记录 |
| 条件协作 | 显式要求或遇到明确阻塞、能力缺失时,先通知用户再转交有边界的小任务 |
| 崩溃恢复 | worker 中断后会回收超时的 processing 任务并按重试策略继续 |
| 后台自启动 | Windows MiMo + WSL Hermes 可通过一键升级安装隐藏启动器 |
| 任务 ID 补收 | 自动接收异常时,把 `TASK |
| 零第三方依赖 | 只需要 Python 3.10+ |
sequenceDiagram
participant U as 用户
participant H as Hermes
participant B as Hermimo Link
participant M as MiMo
U->>H: 让 MiMo 优化这个模块
H->>B: 原子写入 inbox/mimo
B->>M: MiMo worker 原子认领
M->>M: 执行并验证
M->>B: 写入最终结果
B-->>H: RESULT|id|success
H-->>U: 汇报结果与证据
共享目录结构:
.hermimo-link/
├── inbox/hermes/ # 等待 Hermes 执行
├── inbox/mimo/ # 等待 MiMo 执行
├── processing/<agent>/ # 已被对应 worker 认领
├── results/ # 最新结果
├── events/ # 不可变事件记录
├── archive/<agent>/ # 成功完成的任务
├── dead-letter/<agent>/ # 拒绝或重试耗尽的任务
├── state/ # worker 心跳和历史结果
├── scripts/ # 运行脚本
├── service/ # Windows 隐藏自启动包装器
├── instructions/ # 两端长期协作规则
└── references/ # 协议说明
upgrade.cmd 适用于 Windows MiMo + WSL Hermes,并会保留现有任务、结果和事件记录。升级前先让旧版正在排队或执行的任务结束,并关闭旧 worker:
.\upgrade.cmd如果 Hermes 不在默认 WSL 发行版中:
.\upgrade.ps1 -WslDistro "你的发行版名称"升级程序会备份旧运行文件,修复并覆盖两端 Skill,写入长期协作规则,安装隐藏开机启动 worker,运行双向协议自检,然后检查两个 worker 心跳。看到以下两行才表示升级完成:
SELFTEST|PASS|19 checks
Hermimo Link v1.0.5 upgrade completed
升级完成后,各自新开一次 Hermes 和 MiMo 会话,让两端重新加载长期指令。Linux、纯 Windows 或其他部署方式没有使用上述组合时,请分别在两端重新运行对应的 setup.sh 或 setup.ps1,不要直接套用 Windows + WSL 专用升级流程。
高级用户可运行 upgrade.ps1 -NoStart 只安装而暂不启动,或使用参数覆盖 WSL 发行版、Skill 路径和共享目录。
从 V1.0.4 开始启用 HERMIMO_SHARED_SECRET 时,旧版已生成的无签名任务或结果不能通过 V1.0.5 的签名校验。因此应先完成旧任务,并把旧结果仅作为历史存档保留,不要重新放回 V1.0.5 队列。
- Python 3.10 或更高版本
- 已安装并能从终端调用 Hermes 和 MiMo
- 两端能够读写同一个物理目录
在 Hermes 端运行:
.\setup.ps1 -Agent hermes -SharedDir "$env:USERPROFILE\.hermimo-link"在 MiMo 端运行,并使用同一个目录:
.\setup.ps1 -Agent mimo -SharedDir "$env:USERPROFILE\.hermimo-link"如果系统提示“running scripts is disabled”,使用一次性执行策略运行,不会修改系统的永久策略:
powershell -NoProfile -ExecutionPolicy Bypass -File .\setup.ps1 `
-Agent hermes -SharedDir "$env:USERPROFILE\.hermimo-link"如果还要把 Skill 自动复制进某个 Agent 的 skills 父目录:
.\setup.ps1 -Agent hermes `
-SharedDir "$env:USERPROFILE\.hermimo-link" `
-SkillDir "C:\path\to\agent\skills"不同 Agent 版本的 skills 目录可能不同,因此安装脚本不会猜测路径;传入 -SkillDir 时,它会创建 hermimo-link 子目录。
V1.0.5 不再把 HERMIMO_AGENT 写入用户级全局环境。每个 Skill 安装目录会生成自己的 endpoint.json;同一系统用户运行两端时,请为两端传入不同的 skills 父目录。直接从发布目录运行命令时,使用 --from hermes 或 --from mimo 明确本端。
# Hermes 端
bash setup.sh hermes "$HOME/.hermimo-link" "/path/to/hermes/skills"
# MiMo 端
bash setup.sh mimo "$HOME/.hermimo-link" "/path/to/mimo/skills"Linux/WSL 安装同样使用各 Skill 目录内的 endpoint.json 保存身份,不会在 .bashrc 中写入全局 HERMIMO_AGENT。
两端必须指向 Windows 上的同一个物理目录。例如 Windows 用户名是 alice:
# Windows / MiMo
.\setup.ps1 -Agent mimo -SharedDir "C:\Users\alice\.hermimo-link"# WSL / Hermes
bash setup.sh hermes "/mnt/c/Users/alice/.hermimo-link"不要让 WSL 使用自己的 ~/.hermimo-link、Windows 又使用另一个目录,否则两端互相看不到任务。
Hermes 端:
python scripts/worker.py --agent hermesMiMo 端:
python scripts/worker.py --agent mimo启动成功会输出:
READY|hermes|<shared-directory>|0.2
READY|mimo|<shared-directory>|0.2
如果 Agent 的实际命令与默认值不同,请先设置命令模板:
$env:HERMIMO_HERMES_COMMAND = 'hermes run {prompt}'
$env:HERMIMO_MIMO_COMMAND = 'mimo.exe run {prompt}'- 对 Hermes 说:
让 MiMo 帮我分析这个报错,并把修复方案发回来。 - 对 MiMo 说:
这个架构问题让 Hermes 帮我判断一下。 - 对任意一端说:
这部分另一边更擅长,转给它,等结果回来。
Skill 会读取本端身份并自动投递给另一端。
python scripts/delegate_task.py \
--from hermes \
--goal "优化 parser.py 的性能" \
--context "项目位于 D:/work/app,热点函数是 parse_tokens" \
--verification "返回修改文件和基准测试结果" \
--wait成功投递和完成会分别返回:
TASK|<uuid>|<task-path>
RESULT|<uuid>|success|<result-path>
异步执行时去掉 --wait,之后用任务 ID 查询:
python scripts/taskctl.py wait <task-id>
python scripts/taskctl.py show <task-id>需要让接收端直接进入项目目录时,先在接收端设置允许范围,再添加 --workdir:
$env:HERMIMO_ALLOWED_ROOTS = 'D:\work'
python scripts/delegate_task.py --from hermes --goal '检查项目' --workdir 'D:\work\app' --waitpython scripts/taskctl.py list
python scripts/taskctl.py workers
python scripts/taskctl.py show <task-id>
python scripts/taskctl.py wait <task-id> --timeout 600
python scripts/taskctl.py retry <task-id>
python scripts/taskctl.py cancel <task-id>投递成功后会显示:
TASK|<task-id>|<task-path>
把其中的 <task-id> 发给应该接收任务的 Agent,并对它说:
请通过 Hermimo Link 补收任务:<task-id>
接收方会先确认任务确实发给自己;如果任务仍在收件箱,就只认领这个 ID:
python scripts/taskctl.py show <task-id>
python scripts/worker.py --agent <hermes-or-mimo> --task-id <task-id> --once
python scripts/taskctl.py wait <task-id> --timeout 300这里必须使用 Hermimo 输出的任务 ID。有些界面会把聊天编号称为“会话 ID”,但 Hermes 与 MiMo 各自的聊天会话 ID 不能互相通用,也不能代替任务 ID。已经处于 processing 或已经完成的任务只需等待或查看结果,不要再次执行;进入 dead-letter 的任务应先查明原因,再使用 taskctl.py retry <task-id>。
安装脚本会自动运行不调用真实 Agent 的双向自检,也可以随时手动运行:
python scripts/self_test.py正确输出:
SELFTEST|PASS|19 checks # Windows
SELFTEST|PASS|18 checks # Linux / WSL
这个自检会验证双向投递、任务/结果/事件 HMAC、子进程密钥隔离、并发原子认领、取消终态、结果发布顺序、失败重试、拒绝结果、崩溃恢复、手动重试清理和 Windows 命令路径,但不会消耗 Hermes 或 MiMo 的模型额度。
| 环境变量 | 用途 | 默认值 |
|---|---|---|
HERMIMO_LINK_DIR |
两端共享目录 | ~/.hermimo-link |
HERMIMO_AGENT |
当前端身份 | 优先读取进程变量,否则读取已安装 Skill 的 endpoint.json |
HERMIMO_POLL_INTERVAL |
轮询间隔 | 0.2 秒 |
HERMIMO_HERMES_COMMAND |
Hermes 命令模板 | hermes run {prompt} |
HERMIMO_MIMO_COMMAND |
MiMo 命令模板 | mimo.exe run {prompt} |
HERMIMO_ALLOWED_ROOTS |
可接受的任务工作目录 | 未配置时拒绝 workdir |
HERMIMO_SHARED_SECRET |
两端 worker/根会话共享的主签名密钥 | 默认不签名 |
HERMIMO_DELEGATION_TOKEN |
仅限当前父任务的嵌套委派令牌 | worker 自动生成 |
- 把共享目录视为一个命令通道,不要公开写权限。
- 两端设置相同且随机的
HERMIMO_SHARED_SECRET。 - 使用
HERMIMO_ALLOWED_ROOTS限制 Agent 能操作的项目目录。 - Worker 使用普通用户运行,不要使用管理员或 root 权限。
- 不要把 API Key、密码或访问令牌放进任务 context。
- Agent 原有的系统规则和安全限制始终高于收到的任务内容。
- 一键升级会把旧启动脚本中的内联
DEEPSEEK_API_KEY迁移到 WSL 权限为600的环境文件,并脱敏备份;已经出现在进程命令行中的旧密钥仍应立即撤销和轮换。
- 当前不是任意 Agent 的通用适配器。 V1.0.5 内置的是 Hermes 与 MiMo 的命令模板、身份和路由;接入其他 Agent 需要为其补充命令适配、身份配置和协议测试。
- HMAC 只校验来源和完整性,不加密内容。 任务、结果、事件、日志以及 Agent 的标准输出/错误仍以明文保存在共享目录中,不要在里面放 API Key、密码、个人隐私或其他机密。
- 崩溃恢复是至少执行一次,不是严格只执行一次。 worker 在崩溃恢复或超时重试后,任务可能再次执行。涉及付款、发邮件、发布、删除或写入外部系统的任务必须设计成幂等操作,并保留人工确认。
- 取消只适用于仍在 inbox 中的排队任务。
taskctl.py cancel不会强制终止已经进入 processing 的 Agent 进程;执行中的任务应等待结束,或由操作者单独停止对应进程并检查现场。 - 两端签名密钥必须完全一致。 只给一端设置或两端值不同都会导致任务被拒绝。
HERMIMO_DELEGATION_TOKEN由 worker 自动生成,不要手工配置或长期保存。 workdir使用接收端能识别的本机路径。 它还必须位于接收端的HERMIMO_ALLOWED_ROOTS内;Windows 路径和 WSL 路径不能直接混用。- 同一用户运行双端时,Skill 目录必须分开。 Hermes 与 MiMo 各自的
endpoint.json代表本端身份,不能复制同一份安装目录给两端共用。 - 任务 ID 不等于聊天或会话 ID。 补收、查询、取消和重试只能使用
TASK|后显示的 UUID。 - 后台环境和当前终端可能不同。 后台 worker 使用的账户必须能找到 Python、Hermes/MiMo 命令和所需环境变量;终端里能运行不代表后台一定能运行。
- 不要把运行时数据提交到 GitHub。
.hermimo-link/、.mimocode/、endpoint.json、任务、结果、日志、备份和包含密钥的配置都属于本机数据。仓库只应包含干净的发布源码。
- 确认目标端 worker 正在运行并输出了正确的
READY|...。 - 确认两端使用同一个物理
HERMIMO_LINK_DIR。 - 检查任务是否进入了正确的
inbox/hermes或inbox/mimo。
查看对应任务事件和最终结果:
python scripts/taskctl.py show <task-id>常见原因包括 Agent 命令不存在、签名不一致、workdir 不在允许范围、任务格式错误或执行超时。
根据本机安装方式修改命令模板。例如:
$env:HERMIMO_MIMO_COMMAND = 'C:\Tools\mimo.exe run {prompt}'
# 路径含空格时,给可执行文件路径加双引号:
$env:HERMIMO_MIMO_COMMAND = '"C:\Program Files\MiMo\mimo.exe" run {prompt}'- V1.0.3 简化包使用公共
tasks/和.seen_tasks.json,请不要与 V1.0.5 worker 混用。 - V1.0.5 默认使用
.hermimo-link/,仍接受 V0.1.4 的协议 v2 任务和旧的HANDSHAKE_DIR回退。 - 先停止旧轮询脚本,再分别在两端运行新的安装脚本。
- 保留旧目录作为备份,确认 V1.0.5 自检通过后再迁移任务。
- 为结果和事件增加带类型隔离的 HMAC-SHA256 签名,并在等待和查看结果时验证签名。
- Agent 子进程不再继承
HERMIMO_SHARED_SECRET,嵌套委派改用父任务范围的受限令牌。 taskctl严格校验 UUID、任务字段、文件名和签名,阻止路径越界。- 取消任务会发布签名的最终结果,不再让等待方超时。
- 最终结果改为终态移动后的两阶段发布,并支持恢复待发布结果。
- 每个已安装 Skill 使用独立
endpoint.json,避免同一用户下双端身份互相覆盖。 - Skill 指令使用自身绝对目录定位脚本,并收窄自动触发条件。
- 增加
agents/openai.yaml,扩充安全、取消、并发和状态一致性自检。
- 修复公共
.seen_tasks.json格式冲突和双端误消费问题。 - Hermes 与 MiMo 使用完全相同的自动 worker。
- 增加本端身份和自动选择另一端的路由机制。
- 默认轮询间隔从 1 秒降低到 0.2 秒。
- 增加
--wait和taskctl wait,忽略中间重试结果。 - 默认失败尝试次数调整为 3 次,默认重试等待 2 秒。
- 增加父任务继承和最大转交深度,防止无限来回委派。
- 修复 Windows 安装路径,加入可选 skills 目录安装和自动自检。
- 接受带 UTF-8 BOM 的 Windows JSON 文件。
- 统一发布包、Skill 指令、协议文档和版本号。
- 修复 Windows 完整命令路径中的反斜杠丢失。
- 被拒绝的任务现在会立即生成最终结果,不再让
--wait空等到超时。 - 增加 processing 租约、worker 心跳和崩溃后的超时恢复。
- 修复
taskctl retry留下重复任务和旧结果的问题,并保留历史结果。 - 加入长期主动委派规则和 Windows MiMo + WSL Hermes 一键覆盖升级。
- 增加按 Hermimo 任务 ID 精确补收,目标端可在自动接收异常时只认领指定任务。
Hermimo Link is a standard-library-only task bus that lets Hermes and MiMo route work to each other, execute it automatically, retry failures, and return final results.
# Hermes endpoint
.\setup.ps1 -Agent hermes -SharedDir "$env:USERPROFILE\.hermimo-link"
# MiMo endpoint, using the same physical directory
.\setup.ps1 -Agent mimo -SharedDir "$env:USERPROFILE\.hermimo-link"Start one worker on each endpoint:
python scripts/worker.py --agent hermes
python scripts/worker.py --agent mimoAn installed Skill reads its endpoint-local identity automatically. When running directly from the release directory, pass --from explicitly:
python scripts/delegate_task.py \
--from hermes \
--goal "Review this module" \
--context "Repository: D:/work/app" \
--verification "Return findings and evidence" \
--waitIf automatic receipt is delayed, give the receiving endpoint the UUID printed after TASK|:
python scripts/worker.py --agent <receiver> --task-id <task-id> --once
python scripts/taskctl.py wait <task-id> --timeout 300Use the Hermimo task ID, not a Hermes or MiMo native chat/session ID.
Important limitations:
- V1.0.5 is specifically adapted for Hermes and MiMo; other agents require an adapter and protocol tests.
- HMAC authenticates records but does not encrypt task content, results, events, or logs.
- Crash recovery provides at-least-once execution, so externally visible side effects must be idempotent and user-confirmed.
taskctl.py cancelonly cancels tasks that are still queued in an inbox; it does not kill a task already being processed.- Use separate Skill directories for the two endpoints, while pointing both endpoints to the same physical shared runtime directory.
- Do not commit runtime queues,
endpoint.json, logs, backups, or secrets to GitHub.
MIT © 2026 kio831