dsh-phone-link:飛書私聊與 DSH 會話的直連橋

前言

用 DSH 做智能體會話時,常見需求是:不在電腦前也能往某個會話裏丟一句話、看助手回覆。飛書私聊是順手渠道,但若每條消息都經模型中轉,既燒 token,也不一定真能喚醒目標會話。DeepSeek Harness(DSH)支持以插件擴展宿主與客戶端;社區目錄裏維護者 jieye666 提供的 dsh-phone-link(客戶端類插件)做的是另一類事——在桌面 GUI 右側欄「手機」tab 上點按鈕接通後,入站走輪詢與 HTTP,出站走會話事件鏡像,不經過模型決策鏈路。

下面介紹它解決什麼問題、怎麼裝、面板上怎麼用,以及配置與限制。

這是什麼

dsh-phone-link 把飛書私聊接到指定的 DSH 會話:右側欄「手機」tab 一個按鈕直連,不看模型臉色。

宿主半邊負責輪詢、/plugins/phone-link/* 路由與消息注入;瀏覽器半邊註冊側欄 tab,可見時約 2 秒輪詢狀態,後臺約 15 秒。傳輸層依賴本機 ~/.dsh/bin/lark-inbox.py(按 --chat-id 記賬),配置寫在 ~/.dsh/phone-link/config.json。

核心功能

入站:手機消息進會話

輪詢子進程拉取飛書消息後,插件會:

  1. 用 ctx.agents.get(id) 取活着的 agent;沒有則 ctx.agents.resume({ resumeSessionId }) 復活。
  2. 再 agent.followup(createUserMessage(...)) 投進收件箱(README 寫明不用 agent.inject,因其只排隊不喚醒)。
  3. 最後 ctx.sessions.flush(...) 確認寫入。

注入內容帶 📱 前綴,便於在 GUI 裏區分來源。文本 / 富文本(post) / 圖片 / 文件會處理;表情、卡片、系統消息不注入。

同 chat 的游標在 0.4.0 起按聊天拆開:~/.dsh/phone-link/cursor/<chatId>.json,避免多綁定互相覆蓋導致丟消息。投遞前有 delivered.json、內存 inflight 等去重;失敗不記賬,下次可補投。

出站:助手回覆鏡像回飛書

訂閱 ctx.on('session/event', …):assistant/message 累積文本,turn/end 時整輪經 lark-inbox.py send --chat-id … --text 推到綁定聊天。只取 type === 'text' 塊,跳過 reasoning / tool;超長按段落切成 ≤3500 字符分條。dsh-ui 表格在正文留「(表格見下圖)」後另發 PNG(table-png.py)。config.json 裏 mirrorReplies: false 可關閉鏡像;mirrorScheduled 默認 false,避免定時任務輪次重複推送。

客戶端:右側欄「手機」tab

面板提供:

  • 「接通手機 / 斷開手機」
  • 「把飛書私聊綁定到這個會話」/「重設綁定」
  • 發探針、立即拉一次
  • 收發時間、輪詢間隔、綁定列表、最近注入摘要
  • 飛書內可用命令提示:/status /use /ping /help(本地處理,不進會話、不燒 token)

按鈕側直接 fetch('/plugins/phone-link/...');寫操作路由過瀏覽器柵欄(ctx.connection.requestRejection),本機 GUI 以外 POST 會 403。只讀 GET /plugins/phone-link/status 無柵欄,供探活腳本使用。

安裝與啓用

資料中的安裝方式爲本地 file: 路徑(示例爲 Windows 路徑,Linux 用戶需換成自己機器上的源碼目錄):

dsh plugin --profile desktop add file:C:/Users/LENOVO/.dsh/src/dsh-phone-link

修改源碼後需先卸再裝(pnpm 會把 file: 依賴拷進 node_modules,不會隨源碼自動更新):

dsh plugin --profile desktop remove dsh-phone-link
dsh plugin --profile desktop add file:C:/Users/LENOVO/.dsh/src/dsh-phone-link

裝完必須重啓 DSH(宿主註冊路由 + 瀏覽器重拉 client bundle)。

插件以當前 DSH 進程權限運行;安裝前請自行查看倉庫源碼與 MIT 許可證,確認 lark-inbox.py 與飛書憑據佈局符合你的環境。

典型用法

面板上接通

  1. 打開目標 DSH 會話。
  2. 右側欄切到「手機」tab。
  3. 點「接通手機」,必要時「把飛書私聊綁定到這個會話」。
  4. 可用「發探針到手機」驗證鏈路;手機上新消息默認最多等 pollSeconds(默認 5 秒)輪詢進會話。

手工只看狀態(curl)

寫路由需過柵欄,curl 會 403;唯一適合 curl 的是狀態:

curl -s http://127.0.0.1:<GUI端口>/plugins/phone-link/status

改綁定可改 ~/.dsh/phone-link/config.json 後在面板點「斷開 → 接通」,或直接用面板按鈕。

飛書內命令(不進模型)

在飛書私聊裏發送,例如:

  • /status:連接狀態、投遞目標、最近收發時間
  • /use <會話 id 前 8 位以上>:切換投遞目標
  • /ping、/help

可調配置(節選)

~/.dsh/phone-link/config.json 示例結構(README):

{
  "enabled": true,
  "pollMinutes": 20,
  "bindings": [{ "id": "...", "chatId": "...", "chatName": "...", "sessionId": "..." }]
}

常用鍵:pollSeconds(默認 5)、pollMinutes(輪詢進程壽命,默認 20)、mirrorReplies(默認 true)、mirrorScheduled(默認 false)、defaultChat(面板綁定默認飛書 chat)。改 pollSeconds 後點「斷開→接通」即可,無需重啓 DSH。

適用場景與注意

適合誰:已在 DSH Desktop 使用固定會話、並用飛書私聊做移動端觸點的開發者;希望入站喚醒真實 agent、出站自動回手機,且接受 REST 輪詢而非秒級推送。

務必注意:

  • 輪詢默認 5 秒,不是實時 WebSocket;將來 README 提到可走 lark-cli event consume,當前未用。
  • 同一 chat 不要同時掛手工 lark-inbox.py wait,會搶游標。
  • 出站已鏡像時,不要再用 lark-cli / lark-inbox.py send 手工回話,會重複。
  • 舊版依賴的 ctx.get('sessionController') 在當前 Host 不存在,0.3.x 入站不通的問題與此有關;請使用 0.4.x 線(README 描述 0.4.0 起模塊拆分與游標修復)。
  • 社區目錄(SkillHub)爲獨立生態站點,與 DeepSeek / 幻方無官方從屬關係;星標與收錄情況以目錄頁爲準。

自檢(來自 README):

cd ~/.dsh/src/dsh-phone-link && node --test
python ~/.dsh/bin/phone-link-selftest.py
python ~/.dsh/bin/phone-link-selftest.py --live

結尾

dsh-phone-link 的價值可以概括爲:指定會話 ↔ 飛書私聊 的雙向橋,側欄一鍵接通,入站用 agent followup 喚醒會話,出站按輪次鏡像回覆,並針對飛書富文本做了表格 PNG 與文本降級。需要細節、Issue 或 PR 請走 GitHub;在目錄中查找同名插件請用 SkillHub 插件頁。

羽毛球分组比赛记分
小程序二维码

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

小夜