Hermes 跨服务器协作实战:一个机器人如何调度另一台服务器上的机器人

一条飞书消息,如何让本地 Hermes 把任务交给另一台服务器上的 Hermes,调用远端专用 Skill 完成官网内容操作,再把结果送回当前会话?

本文记录一条已经实际运行的跨服务器协作链路。案例中的发起方就是当前“AI创意”机器人,执行方是另一台服务器上的公司内容机器人。公开版已经隐藏主机名、端口、账户、路径、Token 和会话身份。

说明:本文描述的是基于 Hermes Gateway、OpenAI 兼容接口、SSH 本地端口转发和项目级包装器搭建的本地实践,不代表 Hermes 上游提供了开箱即用的“跨服务器机器人集群”产品。不同版本的接口、配置和安全边界可能变化,部署时应以当前 Hermes 官方文档和实际代码为准。

跨服务器 Hermes 通信架构

案例背景:一台服务器不必承担所有角色

当前业务有两个职责不同的 Hermes Profile:

  • 本地业务机器人负责理解飞书指令、确认授权范围、整理最终产物和向用户反馈;
  • 远端公司内容机器人拥有自己的角色设定、Skill、内容资料和官网发布能力。

如果把所有职责都塞进一个机器人,它需要同时掌握聊天上下文、内容生产、网站接口、账号状态和发布安全,权限会越来越宽,故障也难以隔离。

跨服务器协作把两者拆开:本地机器人只负责“决定做什么”,远端机器人负责“在自己的服务器上怎么做”。

本案例实际完成的任务,是把《Hermes:让一个机器人代替你进行权限审核》发布到官网及同源小程序接口。最终生产记录为内容 ID 31,官网、列表、sitemap、小程序 API、图片与 390/768/1280 三种视口均完成回读验证。

第一层:业务机器人负责任务编排

用户在飞书中给本地 Hermes 下达自然语言任务。本地机器人先完成四件事:

  1. 判断任务是内部草稿还是生产发布;
  2. 核对正文、图片、目标渠道和自动关联渠道;
  3. 把必要上下文整理成自包含任务;
  4. 调用窄范围包装器,不直接操作远端网站凭据。

包装器提供两个模式:

draft    只允许内部草稿与检查
publish  必须已有明确发布授权

草稿模式会在任务前自动加入“不得修改生产环境、公开发布或向第三方发送消息”的门禁。发布模式也不是无限放行,它仍要求远端机器人核对目标内容、渠道、事实来源和回滚条件。

因此,模式参数控制的是任务边界,不是绕过安全检查的开关。

第二层:SSH 隧道承载跨服务器通信

本地包装器请求的是一个回环地址,而不是远端公网地址:

本机回环端口
  ↓ SSH 本地端口转发
远端回环端口

真实链路由 systemd 用户服务维护。公开化后的关键配置如下:

[Service]
ExecStart=ssh -NT \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  -L 127.0.0.1:<本地端口>:\
127.0.0.1:<远端端口> \
  <远端主机别名>
Restart=always
RestartSec=5

这个设计有三个直接好处:

  • 远端 Hermes API 只监听远端回环地址,不必直接暴露到公网;
  • SSH 负责加密和主机认证,业务提示词不需要携带 SSH 密码或私钥;
  • systemd 在隧道断开后自动重启,心跳连续失败时会主动重连。

在本次证据采集时,本地隧道和远端 Gateway 都处于 active/running,隧道服务自当前启动以来重启次数为 0。

第三层:远端 Gateway 把请求交给指定 Profile

隧道另一端是远端 Hermes Gateway 的 OpenAI 兼容接口。包装器发送的请求结构可抽象为:

{
  "model": "hermes",
  "messages": [
    {
      "role": "user",
      "content": "门禁 + 完整任务"
    }
  ],
  "stream": false
}

认证信息由包装器从独立凭据文件读取,只进入 HTTP Authorization 请求头,不写进任务描述,也不回传给聊天会话。

远端 Gateway 收到请求后,加载指定内容 Profile 的:

  • SOUL 与角色边界;
  • 模型配置;
  • 可用工具;
  • 内容写作和发布 Skill;
  • Profile 内的历史资料与工作目录。

当前包装器按单次任务调用,不自动继承本地飞书聊天记录。因此,本地机器人必须把目标、事实、授权、产物哈希和验收条件一次写完整。需要长期连续维护同一任务时,才适合进一步使用固定 Session Key 和持久 Session ID。

跨服务器调度时序

第四层:结果不是一句“成功”,而是一组可核验状态

远端 Hermes 完成任务后,会通过 OpenAI 兼容响应返回文字结果。但对生产任务来说,聊天回复只是第一层证据。

本案例还要求远端持久化:

  • 最终正文和元数据;
  • dry-run 结果;
  • 固定发布器及其 SHA256;
  • 发布前查重结果;
  • 内容创建响应;
  • 内容 ID 和正式 URL;
  • 发布后网站、小程序和图片回读;
  • 390、768、1280 三种视口的几何检查。

本地机器人再独立访问正式 URL 和公开 API,确认远端机器人报告的 ID、标题、图片和状态与生产事实一致。

这形成了三层证据:

远端聊天响应
  ↓
远端持久化结果
  ↓
本地独立公开回读

只有第三层也通过,才能向用户报告“已经发布”。

一次真实调度经历了什么

这次发布并不是一次请求就毫无波折地结束。

第一版文章成功创建了生产记录,但 390px 下长代码行触发了文章模板的 flex 最小宽度问题,正文被撑宽。发布器按预设条件只回滚了本次新建文章,没有删除已校验的脱敏图片,也没有触发公众号、头条或知识库分发。

随后本地机器人根据生产几何数据生成移动安全版:

  • 缩短公开标题;
  • 把内部绝对路径改为仓库相对路径;
  • 把长命令拆成短行;
  • 把 YAML 示例限制在移动端安全列宽;
  • 重新锁定正文、元数据、预检和发布器哈希。

第二版执行一次 publish-once 后成功创建内容 ID 31,并通过全部生产回读。

这也说明跨服务器调度不是简单的“远程执行命令”,而是一个有状态的工作流:

授权 → 固化产物 → dry-run
→ 单次写入 → 持久化 ID
→ 多表面回读 → 成功或回滚

真实调度证据(脱敏重构)

为什么本地超时不等于远端失败

跨服务器调用中,本地包装器有等待上限。调用超时只说明本地不再等待,不代表远端 Agent、浏览器或发布器一定停止。

如果不检查就重试,可能出现重复草稿、重复文章或重复提交。

正确处理顺序是:

  1. 检查远端是否仍有相关进程;
  2. 检查持久化结果文件是否已经生成;
  3. 查询内容管理接口是否已有非零 ID;
  4. 回读正式页面和发布状态;
  5. 只有确认没有跨过写入边界,才允许重新发起。

本案例中就出现过本地等待超时、远端产物已经落盘的情况。最终状态以远端持久化文件和公开页面为准,而不是以本地调用是否在时间内返回为准。

性能教训:远端机器人应做执行器,而不是反复做编辑器

最初流程把正文整理、图片检查、发布器生成、响应式验证和故障诊断都交给远端 Agent,每个阶段都重新启动一次推理,导致一次发布需要等待多轮远程调用。

优化后的快速通道是:

  1. 本地完成正文、脱敏图片和移动端预检;
  2. 一次传输不可变产物并计算哈希;
  3. 远端只运行已经审计的固定发布器;
  4. 一次完成查重、写入和生产回读;
  5. 只有失败时才进入远端诊断。

这种方式既保留了远端 Profile 的权限隔离,也显著减少了重复推理和盲等。

安全边界

跨服务器 Hermes 协作至少需要守住以下边界:

  • 远端 API 优先只监听回环地址,通过受控隧道访问;
  • 不把 Token、Cookie、私钥或 SSH 密码写进提示词;
  • 本地业务机器人不直接获得远端网站凭据;
  • 草稿与发布模式分离,发布必须有当前任务的明确授权;
  • 自动关联的官网列表、小程序 API 等表面必须一起确认;
  • 写入前按标题和 slug 查重;
  • 单次发布器不得自动重试 POST;
  • 非零内容 ID 必须先落盘,再执行发布后回读;
  • 失败时只回滚本次新建资源;
  • 截图公开前必须完全遮挡身份、主机、端口、路径和凭据。

SSH 隧道解决的是通信安全,不会自动解决内容授权、命令审批、平台登录、验证码、重复发布和审计问题。这些仍需要各自独立的门禁。

适合使用这种架构的场景

这种模式适合:

  • 不同服务器分别承载研发、内容、运维或数据 Profile;
  • 本地聊天机器人需要调用远端专用 Skill;
  • 敏感凭据必须留在资源所在服务器;
  • 希望把任务编排与生产执行分开;
  • 需要远端产物落盘和本地独立验收;
  • 需要在断线、超时和失败后继续追踪真实状态。

如果只是偶发执行一个明确命令,直接使用受控 SSH 工具可能更简单。只有当远端需要自己的角色、资料、工具、Skill、会话和工作流时,才有必要调度另一个完整 Hermes Profile。

结语

这个案例中的“跨服务器通信”不是两个机器人在聊天,而是本地 Hermes 把一份受约束、自包含、可审计的任务交给远端 Hermes Profile;远端在自己的权限边界内执行,并用持久化结果和生产状态回答。

真正可靠的链路不是:

发出请求 → 收到一句成功

而是:

明确授权 → 安全传输
→ 远端受限执行 → 结果落盘
→ 本地独立回读 → 可验证完成

把机器人放到不同服务器上只是物理隔离;让每个机器人只掌握完成自身职责所需的权限,并让每一步都留下可以核对的结果,才是这套调度架构真正有价值的地方。