dsh-plugin-feishu:在飛書裏用長連接跑 DSH 會話

前言

把 DSH(DeepSeek Harness)接到 IM 上,常見做法是另起一個橋接進程,再配公網回調或 ngrok。對只想在本機出網、不想多維護一個守護進程的場景,這套鏈路偏重。

dsh-plugin-feishu 是 maintainer suveng 發佈的 DSH 客戶端類插件(cordis 插件包):裝進 profile 後由 DSH 進程加載,通過飛書 / Lark 長連接(WebSocket) 收消息,回覆以流式卡片寫回。思路與同作者的 pi-feishu-bridge 相近,但嵌在宿主進程裏,用 DSH 自己的 Agent API 驅動會話。

下面介紹定位、能力、安裝配置與使用注意。

這是什麼

  • 名稱:dsh-plugin-feishu(npm 包名一致,當前資料中版本 0.6.2,MIT 許可證)。
  • 維護者:suveng;源碼與說明見 GitHub 倉庫,社區目錄頁:skillhub.cn/plugins/suveng/dsh-plugin-feishu。
  • 一句話:把 DSH 會話接進飛書 / Lark 長連接,回覆以流式卡片回寫;不需要另起守護進程,不需要公網回調地址。

插件安裝後默認處於休眠狀態(無憑證時只打 warn,不影響 dsh --dump-config 與其它插件)。憑證配好後自動連上。

核心功能

資料中列出的能力如下(節選,均以 README 爲準)。

會話與消息

能力 說明
單聊 / 羣聊 / 話題 一個飛書會話對應一個 DSH 會話;話題(thread)單獨成會話
會話保持 飛書會話 ↔ DSH 會話映射落盤,DSH 重啓後可接着聊;網頁端同會話能複用則直接複用
消息串行 同一會話連發多條按順序處理,避免兩條消息搶同一輪次
內容去重 同一會話 5 秒內完全相同的一條文字只處理一次

回覆與交互

  • 流式卡片:邊生成邊往卡片裏寫,輪次結束卡片轉終態。
  • 正文模式:默認 replyBodyMode=final,只把本輪最終回覆寫進卡片正文;中間旁白、思考收進「執行過程」摺疊面板(live 可退回舊行爲)。
  • 執行過程:工具調用在卡片頂部摺疊面板逐條顯示步驟、成敗與耗時。
  • 停止按鈕:卡片末尾「停止」等價於 /stop。
  • 表情回執:收到消息先掛「收到」類表情(默認 Get),跑完 DONE,失敗 CRY(可關或自定義收到表情)。
  • 引用展開:回覆某條消息時,被引用內容以 [Quoted message] 前綴附在正文前(可配置字數上限)。
  • 選擇題:模型用 ask_user_question 時,問題以卡片發到飛書,可點按鈕、在輸入框填寫(最多 200 字)或直接回文字。

權限與安全

  • 權限白名單 allowedOpenIds:只認指定 open_id;留空則誰都能用(README 建議自用也配一下)。
  • 羣聊 @:默認 requireMentionInGroup=true,羣裏需 @ 機器人才響應;不 @ 也要響應時需開「獲取羣組中所有消息」並設 requireMentionInGroup=false。

斜槓命令與身份

斜槓命令不進模型上下文:/new、/stop、/status、/cwd、/whoami、/help。

每條普通消息首行帶提問人來源摘要(如 【飛書 · 羣聊|單聊 · …】);詳細字段可通過飛書專用工具 feishu_identity 查詢。

僅在飛書發起的輪次裏可見的飛書工具包括:feishu_identity、feishu_send,以及審批相關 feishu_learn_approval_submit / feishu_learn_approval_status(審批定義號在插件「審批」分組配置)。

工作原理(概要)

飛書客戶端經長連接上報 im.message.receive_v1 → 插件內 FeishuBridge 做歸一化、去重、白名單與 per-session 串行隊列 → 斜槓命令本地處理,普通消息進入 AgentPool,由 DSH Agent 跑一輪,經 assistant-stream 更新 ReplyCard,工具 call/result 同步進「執行過程」面板。

長連接爲集羣模式、不廣播:同一 appId 多條連接時事件隨機落到一條。一個飛書應用只應配一個 DSH 實例;多工作區請各建獨立應用。

環境要求

  • Node.js >= 22
  • DSH >= 0.2.1-rc.2,< 0.3.0
  • 飛書企業自建應用,並開通 README 所列 IM、通訊錄(可選)等權限;事件訂閱方式爲使用長連接接收事件(含 im.message.receive_v1;選擇題需額外長連接訂閱 card.action.trigger)。

國際版 Lark 將 domain 設爲 https://open.larksuite.com。

安裝與啓用

官方 README 給出的安裝方式如下(不要自行拼接未在文檔出現的 github:owner/repo 形式):

# 從本地目錄安裝(開發 / 自用)
dsh plugin --profile web add /absolute/path/to/dsh-plugin-feishu

# 發佈到 npm 之後
dsh plugin --profile web add dsh-plugin-feishu

插件自帶 cordis.patch.yml,安裝後在 bundle 中插入 id 爲 feishu 的插件行。

可選:將倉庫託管的插件索引添加爲 DSH 自定義索引源(插件頁 → 實驗性插件 → 自定義插件索引 → 發現 → 添加):

https://raw.githubusercontent.com/suveng/dsh-plugin-feishu/main/market/index.json

DSH 不內置索引源;索引由發佈者託管,安裝前自行判斷是否信任來源。

配置(三種方式)

優先級:界面 / 配置文件 > 環境變量。

推薦:側邊欄掃碼創建應用

側邊欄 飛書 →「掃碼創建應用」→ 飛書 / Lark 掃碼確認。應用自動創建並作爲機器人加入列表,插件即用該憑證連上。一個工作區可綁多臺機器人(多 App ID,各一條長連接);配置形態爲 bots: { "cli_xxx": { name, appSecret } }。

手動:App ID / App Secret

  • 側邊欄飛書圖標 →「飛書 / Lark」表單,或插件頁 dsh-plugin-feishu →「飛書 / Lark 連接」卡片。
  • 保存後插件自動斷開重連,無需重啓 dsh;連接狀態經 GET /api/feishu.status 反映到界面(非「填了憑證就亮綠燈」)。

環境變量(密鑰不落地 profile 時):

export DSH_FEISHU_APP_ID=cli_xxxxxxxxxxxx
export DSH_FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxx

配置文件示例(改 profile 內 cordis 配置後需重啓 dsh):

- id: feishu
  name: dsh-plugin-feishu
  config:
    appId: cli_xxxxxxxxxxxx
    appSecret: xxxxxxxxxxxxxxxxxxxx
    workdir: /home/me/work/my-repo
    allowedOpenIds:
      - ou_xxxxxxxxxxxxxxxx

常用配置項(完整表見 README):

配置項 默認值 說明
workdir 跟隨最近一次 dsh 會話工作區 飛書會話建在哪個工作區;顯式填寫則固定
agentPreset 本機 dsh 默認(如 ptc) 決定飛書會話掛哪些工具
permissionPreset 空(跟隨 dsh 默認) 如 danger-full-access 關閉沙箱與審批;改配置後下一輪對話生效
allowedOpenIds [] 空 = 不限制
requireMentionInGroup true 羣聊是否必須 @ 機器人
streamIntervalMs 700 卡片流式刷新間隔,不建議低於 200
progressMode steps 執行過程:steps / action / off
replyBodyMode final 卡片正文:final 或 live
approvalCode 空 飛書審批定義號;未配置時審批工具明確失敗

執行過程、表情回執、引用展開等可在側邊欄 飛書 → 消息交互 分組裏改,保存後下一輪消息生效。

典型用法

  1. 按上文安裝插件並配置憑證(或掃碼),確認側欄飛書圖標爲已連接(綠點)。
  2. 在飛書單聊或羣裏 @ 機器人(若未改 requireMentionInGroup)發送任務描述;插件爲每個飛書會話維護 DSH Agent,workdir 決定代碼與文件操作落在哪個目錄。
  3. 需要新開上下文時發送 /new;長任務可在卡片點「停止」或發 /stop。
  4. 若使用 /learn 等需人工把關的流程,可在插件配置 approvalCode,由模型走飛書審批工具,拿到 APPROVED 後再動文件(具體審批定義需在飛書後臺準備)。

飛書側新建的會話使用 profile 的默認模型(agent-default-model);與網頁端是同一套 DSH 能力,只是入口在 IM。

適用場景與注意

適合:希望在飛書 / Lark 裏直接驅動本機 DSH Agent、看重流式卡片與工具過程可視化、且能接受企業自建應用(或掃碼創建)配置流程的開發者或小團隊自用。

務必注意:

  • 插件在 當前 dsh 進程的權限下運行;permissionPreset 若設爲高權限預設,飛書一條消息即可觸發與本地終端等價的操作。安裝前應閱讀源碼與 MIT 許可證,並配置 allowedOpenIds。
  • 依賴 DSH 0.2.x 與 Node 22+,大版本升級宿主前需覈對 engines.dsh 範圍。
  • 社區目錄 skillhub.cn 與 DeepSeek / 幻方無官方從屬關係;DSH 生態是「一切皆插件」,索引與包裝由社區維護者自行發佈。

結尾

dsh-plugin-feishu 把飛書長連接、DSH Agent 與會話持久化收進一個 cordis 插件:少一層橋接進程,也少公網回調。若要試用,可從目錄頁瞭解分類與簡介,並按 README 安裝、配憑證後直接在飛書裏發消息驗證流式卡片與斜槓命令。

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

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

小夜