DSH Feishu 插件:飞书机器人桥接 DeepSeek Harness

前言

在本地使用 DeepSeek Harness(DSH)运行智能体时,常见问题不只是“能不能执行”,还包括:从哪里下发任务、谁能执行、执行中如何看进度、高风险操作如何审批、结果和文件如何回来。

yangzhaofeng496/dsh-feishu-plugin 是一个社区 DSH 插件,把 Feishu/Lark 机器人接到 DeepSeek Harness。用户在飞书中发送文字任务后,插件会把任务交给指定的 dsh profile 执行,并把进度、审批请求和执行结果回复到原会话。

定位

  • 插件名:yangzhaofeng496/dsh-feishu-plugin
  • 维护者:yangzhaofeng496
  • 许可证:MIT
  • 一句话定位:Feishu/Lark bot bridge for DeepSeek Harness with approvals, progress updates, context, and file transfer.

它面向需要把本地 DSH 任务接入飞书会话的开发者,而不是替代 DSH 本身。

核心能力

插件覆盖从消息接收、用户授权、执行反馈、权限审批到文件回传的主要链路。

  1. 飞书接入
    通过飞书开放平台长连接接收消息,无需公网回调地址。目前只支持文字消息。

  2. 用户授权
    使用 open_id 白名单限制可执行任务的用户。支持用户在飞书内申请授权,由管理员审批、撤销和查询。动态授权会持久化保存,重启后继续生效。

  3. 执行反馈
    执行期间会定时更新同一条飞书消息,显示运行时长和最新输出。排队、执行和结果消息中会显示当前 Provider 与模型。过长回复会自动拆分。

  4. 上下文管理
    按飞书会话和用户隔离最近对话上下文,并持久化保存。后续任务可以基于此前上下文继续处理。

  5. 权限审批
    插件可以处理 Harness 原生的一次性权限审批。任务发起者或管理员在飞书中批准或拒绝后,审批结果会回到执行流程。

  6. 文件传输
    支持授权用户从飞书发送文件给 Harness,也支持 Harness 生成文件后自动回传到原飞书会话。入站和回传都受工作区边界、文件大小和文件数量限制。

  7. 运行稳定性
    使用串行任务队列,避免多个任务同时操作同一工作区。插件会记录任务接收、开始、完成、失败和队列深度日志,自动过滤重复消息,并在执行超时、输出长度限制、插件停止等场景中保持可控。

安装与启用

安装插件

先确认本机已有可用的 DSH 环境和飞书企业自建应用。然后执行官方安装命令,把插件添加到 web profile:

dsh plugin --profile web add github:yangzhaofeng496/dsh-feishu-plugin#main

安装完成后,主插件默认处于禁用状态,且用户白名单为空。接下来需要保存飞书凭据、配置管理员和工作区,再手动启用插件。

配置飞书应用

在飞书开放平台创建企业自建应用,并完成机器人能力配置。关键点是使用长连接接收事件,而不是公网回调。

通常需要做以下事情:

  1. 添加“机器人”能力。
  2. 开通接收消息和发送消息所需的即时通讯权限。
  3. 在事件与回调配置中选择长连接。
  4. 添加接收消息事件 im.message.receive_v1
  5. 创建版本并发布应用,使机器人和权限配置生效。

具体权限名称可能随飞书开放平台界面更新而变化。发布前确认机器人能够接收用户消息,并能向原会话发送消息。

保存凭据

不要把 App Secret 写入 Git 仓库或 cordis.patch.yml。将它保存到 Harness 凭据文件:

FEISHU_APP_ID: cli_xxxxxxxxxxxxxxxx
FEISHU_APP_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

保存后限制该文件只对当前用户可读:

chmod 600 ~/.dsh/.credentials.yaml

启用插件

编辑 ~/.dsh/profiles/web/cordis.patch.yml,加入或覆盖 feishu 配置:

- id: feishu
  disabled: false
  config:
    appIdEnv: FEISHU_APP_ID
    appSecretEnv: FEISHU_APP_SECRET
    adminOpenIds:
      - ou_admin_xxxxxxxxxxxxxxxxxxxxxxxxxx
    allowedOpenIds:
      - ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    authorizationFile: ~/.dsh/feishu-authorizations.json
    contextFile: ~/.dsh/feishu-contexts.json
    workspace: /absolute/path/to/your/workspace
    attachmentDirectory: .dsh-feishu/inbox
    maxInboundFileBytes: 31457280
    maxOutboundFileBytes: 31457280
    maxOutboundFiles: 5
    timeoutMs: 900000
    maxOutputChars: 50000

这里有几个字段需要特别注意:

  • adminOpenIds:可以审批和撤销授权的管理员 open_id 列表。
  • allowedOpenIds:允许发布任务的普通飞书用户 open_id 列表。
  • authorizationFile:动态授权和待审批申请的持久化文件。
  • contextFile:对话上下文持久化文件。
  • workspace:执行任务时使用的工作目录。

allowedOpenIds 默认为空,因此没有普通用户能够执行任务。adminOpenIds 中的管理员始终拥有执行权限。未授权用户可以在飞书内发起授权申请,由管理员审批,无需重启插件。

典型用法

启动服务

完成配置后,启动 DSH Web 服务:

dsh web --port 3081

启动成功后,可以在飞书中直接向机器人发送文字任务,也可以发送 /help 查看简要说明。

授权管理

未授权用户可以发送:

申请授权

或:

/request

机器人会记录申请,并回复申请人的 open_id

管理员可以使用以下命令:

/requests
/approve ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
/revoke ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
/users

各命令作用如下:

  1. 申请授权/request:创建或更新自己的授权申请。
  2. /requests:查看待审批申请。
  3. /approve <open_id>:批准用户执行任务。
  4. /revoke <open_id>:撤销普通用户权限。
  5. /users:查看管理员和已授权用户。

动态授权默认保存在 ~/.dsh/feishu-authorizations.json。该文件以 0600 权限创建,不应提交到 Git。配置文件中的管理员不能通过飞书命令撤销,必须由本机管理员修改 adminOpenIds 并重启服务。

上下文管理

插件会按飞书会话和用户隔离上下文,并持久化最近对话内容。这样“继续刚才的任务”“修改上一版”这类表达更容易被后续任务理解。

失败或超时任务不会写入上下文。

在飞书中可以使用以下命令管理上下文:

/new
/clear
/history
/context

说明:

  1. /new:新建会话并清除此前上下文。
  2. /clear:清除当前上下文。
  3. /history:查看最近上下文摘要。
  4. /context:查看上下文轮数和字符用量。

上下文默认保存在 ~/.dsh/feishu-contexts.json,以 0600 权限创建。该文件可能包含任务和回答中的敏感内容,请勿提交到 Git 或发送给他人。

一次性权限审批

当工具执行需要更高权限时,Harness 会发起一次性权限审批。插件会在飞书中给出审批编号,任务发起者或管理员可以批准或拒绝:

/allow a1b2c3d4
/deny a1b2c3d4

批准仅对该次工具调用有效,不会永久提升权限。其他普通用户不能审批不属于自己的任务。如果审批等待超时,插件会按拒绝处理,避免任务长期挂起。

文件收发

授权用户可以直接向机器人发送文件、图片、音频或视频。插件会把入站文件保存到工作区内的目录:

<workspace>/.dsh-feishu/inbox/<message_id>/<safe_filename>

随后插件创建任务,并把工作区相对路径交给 Harness。

文件限制:

  1. 入站文件必须位于工作区内部。
  2. 超过 maxInboundFileBytes 或为空的文件会被拒绝。
  3. 回传文件只接受工作区内部路径。
  4. 符号链接解析后如果越出工作区,会被拒绝。
  5. 默认单任务最多自动发送 5 个文件,每个文件不超过 30 MB。

用户也可以手动要求机器人发送已有文件:

/send outputs/report.pdf

运行限制与日志

插件在运行过程中会做几类限制,避免飞书消息和执行环境失控。

  1. 串行任务队列
    避免多个任务同时操作同一工作区。

  2. 重复消息过滤
    自动过滤重复消息,减少重复触发。

  3. 执行超时
    单个任务超过 timeoutMs 后会被终止。

  4. 输出长度限制
    捕获输出受 maxOutputChars 限制。

  5. 长消息拆分
    过长的飞书回复会自动拆分。

  6. 停止时清理子进程
    插件停止时,会终止仍在运行的子进程。

运行日志会显示任务接收、开始、完成、失败和队列深度等信息。日志不会输出 App Secret,但可能包含用户 open_id、飞书消息 ID 和任务执行错误。共享日志前请先脱敏。

适用场景与注意

适合这些场景:

  1. 想在飞书中直接触发本机 DSH 任务。
  2. 需要给飞书用户做授权和审批。
  3. 需要在执行过程中看到进度和最新输出。
  4. 需要保留跨任务上下文。
  5. 需要在飞书和 Harness 工作区之间来回传文件。

使用前注意:

  1. 插件会在本机 dsh 进程环境中执行任务。安装前应先检查源码和 MIT 许可证,并确认所配置的工作区、profile 和凭据权限。
  2. 不要把 FEISHU_APP_SECRET 写入 Git 仓库或 cordis.patch.yml
  3. ~/.dsh/.credentials.yaml~/.dsh/feishu-authorizations.json~/.dsh/feishu-contexts.json 都可能包含敏感信息,不要提交到 Git,也不要随意发送给他人。
  4. 主插件默认禁用,且 allowedOpenIds 默认为空。完成凭据、管理员和工作区配置后,再手动启用。
  5. 目前只支持文字消息。
  6. DSH 社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。

链接

GitHub:

https://github.com/yangzhaofeng496/dsh-feishu-plugin

目录页:

https://www.skillhub.cn/plugins/yangzhaofeng496/dsh-feishu-plugin
羽毛球分组比赛记分
小程序二维码

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

Xiaoye