前言¶
在 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