dsh-feishucard:爲 DeepSeek Harness 提供飛書流式卡片橋接

前言

把 DeepSeek Harness 的 Agent 會話接到飛書聊天裏,常見的問題是:機器人怎麼收發消息、Agent 執行過程怎麼展示、工具調用結果怎麼呈現,以及沒有公網地址時如何保持連接。

下面介紹的 dsh-feishucard 是一個面向 DSH 的飛書橋接插件。它使用官方 SDK 的 WebSocket 長連接收發飛書消息,無需公網 IP、域名或隧道;在飛書卡片裏流式展示回覆過程,併爲每個聊天維護獨立會話。

這是什麼

dsh-feishucard 是 cmfok 維護的 DeepSeek Harness 與飛書(Lark)之間的自研橋接插件,許可證爲 MIT。

它解決的問題比較集中:

  • 通過飛書官方 SDK 長連接接收和發送消息
  • 在飛書卡片中流式更新 Agent 回覆
  • 爲每個飛書聊天維護獨立 Agent 會話
  • 提供基本聊天命令、處理中表情回執、主動發消息工具和審批卡片
  • 支持多機器人配置和運行保活

單包內包含三類內容:Host 插件、長連接 helper 子進程,以及自動註冊 bundle 補丁。

核心功能

長連接收發

插件通過官方 SDK WebSocket 長連接接收飛書消息,再把消息注入 Agent 會話,並以交互卡片回覆同一會話。

這條鏈路不需要公網 IP、域名或隧道,適合本地或內網環境使用。

流式回覆卡片

飛書回覆採用卡片形式,支持:

  • 即時 PATCH 更新
  • 過程話語內聯顯示
  • 工具調用摺疊面板
  • 限流、退避、熔斷和純文本兜底

當卡片鏈路不可用時,可以降級爲純文本回復。

每個聊天獨立會話

每個飛書聊天對應獨立的專屬 Agent 會話,會話狀態會持久化,並在重啓後恢復。

聊天內支持以下命令:

/new [名稱]
/switch <序號>
/list
/help

處理中表情回執

消息到達後,插件可以添加處理中表情回執。默認是 OnIt,也可配置爲 none 關閉。

模型工具

插件提供 feishu_send 模型工具,支持 Agent 主動發消息。

審批卡片

當會話需要審批時,飛書側會給出交互卡片,包含“允許一次”和“拒絕”按鈕。

審批卡片有以下行爲:

  • 5 分鐘超時自動拒絕
  • 會話取消時自動取消審批

多機器人支持

一個實例可以配置多個飛書機器人,每個機器人可以綁定各自的工作區。

保活機制

插件包含以下保活能力:

  • helper 崩潰後自動重啓,並有 5s 冷卻
  • 憑據變更時自動重連
  • 使用 SDK 自帶重連能力

安裝與啓用

使用以下命令安裝插件,然後重啓 dsh web

dsh plugin --profile web add dsh-feishucard
dsh web

首次安裝時,如果 pnpm 攔截 protobufjs 構建腳本,並在日誌中出現 ERR_PNPM_IGNORED_BUILDS,需要允許該構建腳本。

將對應 profile 的 pnpm-workspace.yamlallowBuilds.protobufjs 設爲 true

allowBuilds:
  protobufjs: true

然後重跑安裝命令:

dsh plugin --profile web add dsh-feishucard

本地開發安裝時,也可以使用本包目錄:

dsh plugin --profile web add <本包目錄>

或使用 file: 協議:

dsh plugin --profile web add file:<本包目錄>

飛書開放平臺配置

在飛書開放平臺側,需要完成一次性配置:

  1. 創建企業自建應用,並啓用機器人能力。
  2. 添加所需權限。
  3. 在事件與回調中訂閱長連接事件 im.message.receive_v1
  4. 創建版本併發布。

需要配置的權限包括:

im:message.p2p_msg:readonly
im:message.group_at_msg:readonly
im:message:send_as_bot
im:message.reaction

其中 im:message.reaction 爲可選權限。

配置示例

插件配置獨立存放於:

~/.dsh-feishucard/feishu.config.json

配置文件與倉庫解耦。示例如下:

{
  "bots": [
    {
      "name": "我的機器人",
      "workspace": "C:\\path\\to\\workspace",
      "appId": "cli_xxxxxxxxxxxxxxxx",
      "appSecret": "your_app_secret",
      "reactionEmoji": "OnIt"
    }
  ]
}

配置支持熱更新,輪詢週期爲 10 秒,改完配置後無需重啓。

會話狀態持久化在:

~/.dsh-feishucard/state-<appId>.json

如果檢測到舊生態路徑:

~/.cc-connect/

且其中存在配置,插件首次啓動時會自動遷移一次。

典型用法

安裝並配置機器人後,在飛書聊天中可以直接使用:

/new

創建新會話。

/new 訂單排查

創建帶名稱的新會話。

/list

查看會話列表。

switch 2

或:

/switch 2

切換到第 2 個會話。

/help

查看幫助。

需要主動發消息時,可以由 Agent 調用 feishu_send 工具。需要審批時,按飛書卡片中的按鈕進行“允許一次”或“拒絕”。

開發與排障

本地開發時可以先安裝依賴:

npm i

語法檢查:

npm run check

冒煙測試:

npm run smoke

插件的依賴要求包括:

"@deepseek-ai/dsh-tools": "^0.1.0-rc.5"

以及:

"@larksuiteoapi/node-sdk": "^1.73.0"

在 Windows 下使用 file: 依賴安裝時,profile 中的 node_modules/dsh-feishucard 可能是實體副本,而不是軟鏈。修改源文件後,需要同步副本,或重新執行安裝命令後再重啓。

適用場景與注意

這個插件適合以下場景:

  • 想在飛書裏直接使用 DSH Agent 會話
  • 希望看到 Agent 的過程話語和工具調用面板
  • 不想依賴公網 IP、域名或隧道
  • 需要每個聊天獨立會話和重啓後恢復
  • 需要審批卡片和主動發消息工具

使用前需要注意:

  • 不要與其他 DSH 飛書插件同時安裝。同一飛書 App 的 WS 長連接會互踢。
  • 插件以當前 dsh 進程權限運行。安裝前應檢查源碼與許可證。
  • 飛書開放平臺需要正確配置權限、事件訂閱和版本發佈。
  • 首次安裝可能遇到 ERR_PNPM_IGNORED_BUILDS,需要允許 protobufjs 構建腳本。
  • 本地開發使用 file: 安裝時,注意 Windows 下副本同步問題。

鏈接

GitHub 地址:

https://github.com/cmfok/dsh-feishucard

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

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

小夜