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

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

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

小夜