前言¶
在 DeepSeek Harness (DSH) 的开发实践中,我们通常会在同一台宿主上运行多个独立的 Agent 会话。当这些会话需要协同工作,例如“产品”会话向“开发”会话派发任务,或者不同角色会话之间进行多轮对话时,直接的网络通信往往会带来不必要的复杂性。
dsh-s2s 是一个用于解决这一问题的插件。它不依赖跨主机的网络层,而是采用同宿主/单进程路径,通过进程内的 Broker 实现会话之间的直接投递。
核心定位¶
这是一个 DeepSeek Harness 插件,用于在同一台机器上连接 AI Agent 会话。它由 ashuai 维护,专注于解决同一进程内多会话的协作问题,支持会话生命周期管理、静止会话拉起以及防止回环的预算机制。
设计思路¶
本插件的设计思路受 a2a 启发,但并非其 fork。
- 拓扑结构:
a2a依赖 Hub 和 WebSocket,构建跨进程/跨机的 Mesh 网络;s2s则采用同宿主单进程路径。 - 传输方式:
s2s使用进程内 Broker 进行直接投递,具备零端口、零 WebSocket、零重连的特性。 - 实现机制:借鉴了
a2a的注入习语(空闲调用followup,忙碌调用inject),但移除了所有网络依赖,仅保留内存通信能力。
核心功能¶
- 进程内投递:利用
S2sBroker在内存中直接传递消息,跳过序列化和网络 IO。 - Name 主寻址:通过会话标题进行点名。标题读取自宿主的零 I/O 投影缓存。
- 拉起静止会话:支持唤醒已结束的会话,且拉起的会话保留
live-idle状态(不自动归眠)。 - 6 个模型工具:
s2s_peers:列出当前活跃的 peers。s2s_sessions:列出会话列表(可设置all=true获取全量)。s2s_message:向指定会话发送消息或唤醒会话。s2s_resume:显式拉起指定会话。s2s_history:获取进程作用域的历史记录。s2s_schedule:支持会话内的定时注入。
- 持久信箱:消息持久化存储在
~/.dsh/s2s/mailboxes/<sessionId>/*目录下,支持原子写入和损坏自愈。 - 防回环与限流:通过配置
budget限制消息跳数(maxHops)和发送速率(ratePerMinute)。
安装与启用¶
安装新插件必须使用 - insert: 形式,name 指向可解析的 ESM 入口。以下配置启用了 autoResume(允许自动拉起静止会话)和基本的预算限制:
- insert:
- id: dsh-s2s
name: ./dsh-s2s/lib/index.js
config:
lifecycle:
autoResume: allow # 允许通过 s2s_resume 点名拉起
budget:
maxHops: 6 # 限制消息最大跳数
ratePerMinute: 10 # 限制每分钟发送次数
典型用法¶
在代码或工具调用中,使用 name 参数进行寻址:
// 显式唤醒名为“开发”的会话
s2s_resume(name: "开发", ...)
// 向名为“产品”的会话发送消息
s2s_message(name: "产品", ...)
// 查看所有 peers
s2s_peers
// 查看所有会话(包含静止)
s2s_sessions(all=true)
注意事项¶
- 改名生效时机:由于标题读取自宿主缓存,修改会话标题不会在操作瞬间生效,需等待下一个标题检查点。
- 同名消歧:若遇到同名会话,系统会提示
ambiguous,需使用session_id进行消歧。若查无会话,会显示not-found并列出候选。 - 配置挂载:若 YAML 中缺失
lifecycle或budget配置块,相关功能将不挂载(即不启用)。 - 持久化路径:持久信箱路径为
~/.dsh/s2s/mailboxes。
结语¶
dsh-s2s 提供了一套轻量级的同宿主会话协作方案。对于不需要跨机通信的场景,它比引入 a2a 更为轻便,且消除了网络层的复杂性。
- GitHub: https://github.com/ashuai/dsh-s2s
- 目录: https://www.skillhub.cn/plugins/ashuai/dsh-s2s