dsh-interconnect:让多个 DSH 实例互通消息与事件

前言

在 DeepSeek Harness(DSH)里跑 agent,常见需求是跨 session、跨机器协作:一台机器上的 agent 需要给另一台机器上的 session 发消息,或者探测对端是否在线、列出可投递的目标。单靠本机 API 或手工拼 HTTP 请求,既要维护地址映射,又要处理连接保活和失败重试,成本不低。

dsh-interconnect 是社区维护者 Chinesezjc 发布的工作流类插件,当前在 GitHub 上有 34 stars。它把跨实例消息投递、活性探测、事件推流和模型侧工具封装成一套 host 服务,让多个 DSH 实例通过持久 WebSocket 链路互相通信。

这是什么

dsh-interconnect(npm 包名 dsh-interconnect,当前版本 0.10.0,MIT 许可)是面向 DeepSeek Harness 的跨实例消息互通与事件通知插件。一句话定位:让一个 DSH 实例能向本机、另一台机器、或另一台机器上的其他 DSH 实例发送消息、探测活性,并在实例之间双向推送事件。

插件以 bundle 形式提供三个组件:

组件 作用
interconnect host 服务(ctx.interconnect),提供 /interconnect/link WebSocket 端点
tool-interconnect 模型可见工具:interconnect_sendinterconnect_listinterconnect_pinginterconnect_reply
skill-interconnect 配套 skill,向模型说明上述工具的用法与失败处理

核心功能

下面按传输层、工具层和配套 skill 分开说明。

持久 WebSocket 链路

从 0.9 起,传输只走 WebSocket 持久链接,不再有 HTTP 端点。sendreplypinglist 全部经 /interconnect/link 上的 msg / query 帧完成。激活时插件会按 peers 映射自动对每个对端建链,带心跳与指数退避重连。

寻址参数是 instanceId,不再是 baseUrlinstanceId 是配置里 peers 映射的键;真正用来拨号的 origin 由映射值给出(例如隧道端点 http://127.0.0.1:13080)。到未配置或未联通的对端,send / ping / list 返回 unreachable,没有 HTTP 回退。

鉴权使用共享密钥 DSH_INTERCONNECT_TOKEN(bearer,fail-closed,timing-safe 比较),配置在凭据源而非插件 config 里。

模型可见工具

tool-interconnect 暴露四个工具:

  1. interconnect_send:向对端实例的指定 session 投递消息;可选 delivery 选投递模式、resume 唤醒离线 session。发送时会自动注入本机 instanceIdsessionId
  2. interconnect_list:列出对端当前 live 的 session(id、标题、状态),用于不知道 session id 时寻址。
  3. interconnect_ping:探测对端实例活性与身份。
  4. interconnect_reply:向记录过的发送方回传消息,只需本机 session id 和文本,无需再次寻址。

interconnect_list 只返回当前有运行中 agent 的 session——send 能到达的正是这些。subagent 拥有的 session 不会出现在列表里,也不能直接投递。

双向回复

收到带 senderinstanceId + sessionId)的 send 后,接收方会记下「本地 session id → sender」的映射。之后该 session 可用 interconnect_reply 回信,目标从记录的 sender 解析,走本机到对端的持久链接。sender 用于 reply 归因,不是路由或鉴权依据;也不进模型上下文。

投递模式与唤醒

delivery 有三个取值,发送方可按消息覆盖接收方默认值:

模式 行为
followup 排队成独立一轮,等接收方当前轮结束
steer 插进运行中那轮的最近 step 边界
inject 只写入上下文,不唤醒 idle 的 agent

resume 默认关闭。设为 true 可唤醒已持久化但没有运行 agent 的 session,但会触发完整 agent 回合(含模型调用),发送方需显式请求,接收方可用 allowResume: false 拒绝。

投递失败时,SendResult.reason 会指明原因,例如 session-not-liveunreachableresume-refusedsession-owned-by-subagentno-sender-known 等,便于调用方决定重试还是换目标。

配套 skill

skill-interconnect 向模型注册 dsh-interconnect skill,说明 list / ping / send / reply 的完整用法、投递模式、resume 唤醒语义与失败处理。它依赖 interconnect 服务,只有传输层存在时才注册进 ctx.skills

安装与启用

本包已发布到 npm。仓库是一个 DSH profile bundle,根 package.json 声明 dsh.bundle.patch 指向 cordis.patch.yml,后者会插入三个插件行。

从 npm 安装:

dsh plugin --profile <name> add dsh-interconnect

或从本地路径安装(开发调试时):

dsh plugin --profile <name> add file:/path/to/dsh-interconnect

dsh plugin add 会把仓库识别为 bundle 并追加进 profile 的 dsh.profile.bundles。重启 web 服务使 host 侧生效。两端实例的 .credentials.yaml(或等价凭据源)需设置相同的 DSH_INTERCONNECT_TOKEN 作为共享密钥。

配置示例(interconnect 行的 config,字段均可选):

- id: interconnect
  config:
    instanceId: my-box
    peers:
      peer-a: http://127.0.0.1:13080
      peer-b: http://127.0.0.1:13081
    delivery: followup
    allowResume: false

典型用法

寻址与投递

先用 interconnect_list 查看对端 live session,再向指定 session 发消息:

interconnect_list(instanceId="peer")
interconnect_send(instanceId="peer", sessionId="session-264d37b0-…", text="…")
interconnect_ping(instanceId="peer")

interconnect_list 返回示例:

session-264d37b0-  重构 interconnect 插件  [idle]
session-b07326da-                          [running]

双向回复

实例 A 向实例 B 的 session 发消息,B 凭本地 session id 回信,无需再次给出对端地址:

# A 发往 B
interconnect_send(instanceId="b", sessionId=B-sess, text="…")

# B 回传
interconnect_reply(sessionId=B-sess, text="reply")

唤醒离线 session

唤醒并让对方实际处理(会起一个计费回合):

interconnect_send(instanceId="peer", sessionId, text, resume=true, delivery="followup")

唤醒但不起回合,只写入上下文:

interconnect_send(instanceId="peer", sessionId, text, resume=true, delivery="inject")

适用场景与注意

适合谁:

  • 需要在多台机器或多个 DSH 实例之间做 agent 协作的开发者
  • 希望模型能通过工具主动发现对端 session、投递消息、收回复的场景
  • 需要跨实例事件推流(生命周期事件经 interconnect/event 发出)的集成

使用前注意:

  1. 插件以当前 DSH 进程的权限运行,安装前应检查 源码 与 MIT 许可证。
  2. 0.9 起传输只走 WebSocket,到未联通对端无 HTTP 回退;部署时需保证 peers 映射中的 origin 可达,且两端 DSH_INTERCONNECT_TOKEN 一致。
  3. resume 会触发完整 agent 回合并产生模型调用费用,默认关闭;接收方可设 allowResume: false 拒绝。
  4. 不能直接投递 subagent 拥有的 session,需通过父 agent 触达。
  5. 没有 Host agent lookup 的部署(headless、无 api-proxy)无法唤醒离线 session,会降级为 session-not-live

结尾

dsh-interconnect 把跨实例消息投递、活性探测、事件推流和模型工具收进一个 bundle,用 instanceId + 持久 WebSocket 链路替代手工维护 HTTP 端点。如果你需要在多个 DSH 实例之间让 agent 互相发消息、列 session、探测在线状态,dsh-interconnect 是目前社区里较完整的工作流方案。

  • 社区目录页:https://www.skillhub.cn/plugins/Chinesezjc/dsh-interconnect
  • GitHub:https://github.com/Chinesezjc/dsh-interconnect
  • npm:https://www.npmjs.com/package/dsh-interconnect
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜