•
8 min read
dsh-superagent 接入飞书机器人教程:自建应用、权限、lark-cli 机器人身份配置,群里 @ 它开工单(附排错表)

上一篇 DeepSeek dsh-superagent 部署指南 讲了怎么在 GitHub 仓库里跑起来。国内团队更常问的是另一件事:能不能在飞书群里 @ 它,让它开工单、改代码、回 PR?

可以。仓库的部署文档(docs/006-deployment.md)里本来就有一节 “Feishu bot (optional)”,飞书是官方支持的第二个 Source。这篇只讲飞书这一段,GitHub 账号、DSH 安装、Policy 的基础概念请先看上一篇。

先说结论:dsh-superagent 接飞书 = 一个开了机器人能力的企业自建应用 + 一份“只允许机器人身份”的 lark-cli 配置 + 在面板里打开飞书 Source 并把人加进白名单。 它监听的是群里 @ 机器人的消息,干完活仍然是在 GitHub 上开 PR,然后在飞书原消息下面以话题形式回复。

说明:dsh-superagent 的 README 第一句是 “Research prototype for reference only, not an official DeepSeek product.”——研究原型,非 DeepSeek 官方产品。本文命令、配置项和报错文案均来自该仓库的 README、SETUP.md、docs/002、docs/006 和源码,以及 lark-cli 仓库和飞书开放平台文档(2026-11-03 查阅,dsh-superagent 版本 0.1.0)。我没有在自己的飞书租户里完整跑过这一套,文中没有实测数据。

一、整体流程:飞书群 @ 机器人之后发生了什么

按仓库文档和飞书 Source 的源码(src/sources/feishu*.ts),一条请求的路径是:

  1. 你在群里发消息 @ 机器人。
  2. dsh-superagent 用机器人的 lark-cli 跑着一个常驻的事件消费进程(lark-cli event consume im.message.receive_v1 --as bot),通过飞书长连接收到这条消息。
  3. 准入:发消息的人(按飞书 open_id,形如 ou_…)在飞书 Source 的白名单里,并且 @ 了机器人,这条消息才是“明确请求”。
  4. 主 Session 决定接单,开一个 Ticket,在独立的 DSH Session 和独立目录(通常是 git worktree)里干活。
  5. 干完通过 agent 的 GitHub 账号推分支、开 PR。
  6. 在飞书原消息下面 以话题形式回复(源码里是 im +messages-reply ... --reply-in-thread),之后这个话题里的追问会接着交给同一个 Ticket。

dsh-superagent 飞书流程:群里 @ 机器人,lark-cli 长连接收到消息,白名单校验后开 Ticket,在独立 worktree 干活,用 agent GitHub 账号开 PR,再回到飞书原消息话题里回复

两点和 GitHub 不一样:

  • GitHub 是轮询 notifications(默认一分钟一次),飞书是长连接实时推送,另外还会补收群历史、轮询已订阅的话题,漏掉的回复也能补上。
  • GitHub 白名单写的是 login,飞书白名单写的是 open_id(ou_…),不是名字也不是手机号。

二、前置条件

项目 要求 来源
GitHub 部分 已按上一篇装好 DSH、superagent profile、agent GitHub 账号,scripts/dsh-superagent status 能正常跑 上一篇 / docs/006
lark-cli 文档写的测试版本是 1.0.90 docs/006 Prerequisites
飞书应用 一个企业自建应用,开启机器人能力,并已发布版本 docs/006 Feishu bot
网络 运行 dsh-superagent 的机器能访问公网(长连接不需要公网 IP 或域名) 飞书长连接文档

lark-cli 的官方安装方式(lark-cli README):

npx @larksuite/cli@latest install

注:11 月 3 日 npm 上 @larksuite/cli 的 latest 是 1.0.98,比文档测试的 1.0.90 新,dsh-superagent 依赖 lark-cli 的子命令和输出格式(docs/006 原话:“the host relies on their subcommands and output formats”),新版本是否兼容尚未验证。

DSH 版本也再提醒一次:dsh-superagent 的 package.json 里是 engines.dsh: ^0.2.1-alpha.2,文档固定安装 0.2.1-rc.3。npm 上 @deepseek-ai/dsh 现在的 latest 是 0.2.1-rc.5,alpha 标签是 11 月 3 日发布的 0.2.2-alpha.3。按 npm semver 的预发布版本规则,0.2.2-alpha.3 不满足 ^0.2.1-alpha.2,装了会在日志里看到“插件和当前 dsh 不兼容”。不要为了接飞书去升级 DSH 到 alpha。

三、第 1 步:在飞书开放平台创建自建应用机器人

docs/006 只有一句话:创建一个带机器人能力的自建应用,授予接收消息事件、读取和发送群消息、读取群成员的权限,然后发布版本。下面按飞书开放平台文档拆开。

1. 创建企业自建应用,开启机器人能力

  1. 登录 飞书开发者后台,创建企业自建应用。
  2. 进入应用管理页,点 添加应用能力,添加 机器人(飞书文档《如何启用机器人能力》)。
  3. 在 凭证与基础信息 里记下 App ID(形如 cli_…)和 App Secret,下一步配置 lark-cli 要用。

注意要用企业自建应用:飞书文档写明“长连接模式仅支持企业自建应用”,而 dsh-superagent 正是靠 lark-cli 的长连接收消息。

2. 开通权限(scope)

docs/006 没有列具体的 scope 名,下表是按 dsh-superagent 源码里实际调用的 lark-cli 命令,对照 lark-cli 文档和飞书“接收消息”事件文档整理的:

用途 dsh-superagent 调用的命令 需要的权限
收群里 @ 机器人的消息 event consume im.message.receive_v1 im:message.group_at_msg:readonly(接收群聊中 @ 机器人消息事件)
收私聊消息(lark-cli 订阅该事件时也会检查这个 scope) 同上 im:message.p2p_msg:readonly(读取用户发给机器人的单聊消息)
读消息、话题、上下文 im +messages-mget、im +threads-messages-list im:message:readonly
以机器人身份回复 im +messages-reply im:message:send_as_bot
列出机器人所在的群 im +chat-list im:chat:read
读群成员(白名单同步) im +chat-members-list im:chat.members:read

几点补充:

  • lark-cli 的事件定义里,im.message.receive_v1 要求的最小 scope 就是 im:message.p2p_msg:readonly,所以即使你在 dsh-superagent 里关掉私聊,这个权限也建议开,否则事件消费可能起不来。
  • 群里的“全部消息”模式(下文会讲)还需要飞书的敏感权限 im:message.group_msg(获取群组中所有消息)。只用“仅 @”就不要申请它。
  • lark-cli 文档里 im +messages-mget 还提到 contact:user.base:readonly,缺了可能拿不到发送人名字。是否必需尚未验证。

注:这张 scope 表是从源码调用反推的,不是 dsh-superagent 官方列表。配置时请在开发者后台对照一次;缺权限时,按 lark-cli 报错里的 missing_scopes 和 console_url 补齐。

3. 事件订阅:长连接 + 接收消息 v2.0

  1. 进入 事件与回调 > 事件配置,订阅方式选 使用长连接接收事件。
  2. 添加事件:消息与群组 分类下的 接收消息 v2.0(im.message.receive_v1)。

飞书文档有一句要注意:“必须确保本地客户端启动正常,有长连接在线的情况下,才能保存成功。”也就是说,保存长连接订阅方式时需要有一个客户端在线。官方文档的例子用 SDK 起客户端;用 lark-cli 的话,可以在配置好下一步的 lark-bot 之后临时跑一次 lark-bot event consume im.message.receive_v1 --max-events 1 --timeout 30s --as bot(lark-event 文档里的示例命令)。

注:“用 lark-cli 临时起长连接来保存订阅方式”这个顺序是根据两份文档推出来的,未实际操作验证。

4. 发布版本

修改权限、能力、事件后都要在 版本管理与发布 里创建版本并发布,配置才生效。还要确认可用范围包含要用它的同事:飞书文档里“无法搜索到应用”的常见原因就是当前用户不在应用可用范围内。

四、第 2 步:给 lark-cli 一份“只允许机器人身份”的配置

这是 docs/006 里写得最具体、也最容易出错的一步。官方命令:

LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent" lark-cli config init --app-id <cli_…> --app-secret-stdin
LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent" lark-cli config strict-mode bot --global
cat > ~/.local/bin/lark-bot <<'EOF'
#!/bin/sh
export LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent"
exec lark-cli "$@"
EOF
chmod +x ~/.local/bin/lark-bot

逐行解释:

  • config init --app-id <cli_…> --app-secret-stdin:从标准输入读 App Secret(lark-cli 的说明是“避免出现在进程列表里”)。用的是 Lark 国际版的话,lark-cli 的 config init 还有一个 --brand 参数(feishu 或 lark,默认 feishu)。
  • config strict-mode bot --global:把这份配置锁成只允许机器人身份。lark-cli 对 strict mode 的说明是:bot 只允许机器人身份,用户身份的命令会被隐藏。
  • LARKSUITE_CLI_CONFIG_DIR:单独一个配置目录。docs/006 的原因是:lark-cli 一个 app id 只能有一个 profile,而你个人的 lark-cli 配置里可能已经用同一个应用登录过用户身份。
  • lark-bot 包装脚本:和 GitHub 那边的 gh-agent 一个思路,之后面板里填的就是它。

为什么不能用用户身份

docs/006 写得很直接:“The host refuses a CLI that can act as a user.” 如果 lark-cli 能以用户身份执行,dsh-superagent 会拒绝启动飞书 Source,报 The bot lark-cli allows user identities。

原因从 lark-cli 自己的文档就能看出来:--as user 代表用户本人,能看到、也能操作这个用户的日历、云空间等个人资源;--as bot 只能访问应用自己的资源,发消息也是以应用名义。dsh-superagent 的 worker 以 danger-full-access 运行,还会读群消息内容来干活,给它一个能代表你本人操作飞书的身份,风险显然比只给机器人身份大得多。

删除时别用 config remove

docs/006 还有一个容易踩的坑:两份配置(你个人的和 lark-bot 的)共用钥匙串里同一条 App Secret。只想删机器人这份配置时,直接删目录,不要跑 lark-cli config remove,后者会影响共享的 secret。

自检

lark-bot auth status
lark-bot im +chat-list

auth status 是 lark-cli README 里的验证命令;im +chat-list 是 dsh-superagent 刷新群列表时用的命令,能列出机器人已加入的群就说明机器人身份和 im:chat:read 都正常。

五、第 3 步:把机器人拉进飞书群

在飞书客户端进入目标群,设置 > 群机器人,搜索你的应用机器人并添加(飞书“自动回复机器人”教程里的路径)。

机器人不在群里时,dsh-superagent 会报 The Feishu bot is not a member of the chat.。按 docs/006,加进群之后下一次尝试就会成功,不用重启。

建议单独建一个工作群给它,不要直接拉进几百人的大群,原因见第七节和第十节。

六、第 4 步:在 superagent 里启用飞书 Source

1. 打开插件

编辑 ~/.dsh/profiles/superagent/cordis.patch.yml,把示例文件里注释掉的飞书条目打开:

- id: dsh-superagent-feishu
  disabled: false

然后重启:

scripts/dsh-superagent restart
scripts/dsh-superagent status

2. 面板里配置飞书卡片(Sources)

在面板 Sources 的飞书卡片里,各字段的含义(中文标签取自源码):

字段 填什么 建议
机器人的 lark-cli lark-bot 的绝对路径,如 /home/me/.local/bin/lark-bot 保存时会读取应用和机器人信息,然后重启 dsh-superagent
接收的群 选“机器人已加入的群”(oc_…),每个群选 仅 @ 或 全部消息 先用 仅 @
其他群 不接收 / 仅 @:机器人已加入、但没列在上面的群 保持默认 不接收
接收私聊 开 / 关 SETUP.md 的默认建议是开;只想在群里用可以关

“仅 @”只接收 @ 机器人的消息和已有工单的话题;“全部消息”会把群里其他消息也交给评估,按规则推断要不要主动干活,并且需要读全部群消息的敏感权限。按上一篇的思路,先“仅 @”,等看过一段时间的决策记录再说。

3. 用 Management API 配置(可选)

SETUP.md 里让 coding agent 走本地 Management API 保存设置,顺序是 github Source → feishu Source → policy → executor。docs/006 给出的飞书块结构是:

{"enabled": true, "config": {"cli": "/home/me/.local/bin/lark-bot",
  "chats": [{"chatId": "oc_…", "name": "研发群", "listen": "mentions"}],
  "directMessages": true, "otherChats": "none"}}

保存方式和上一篇里 GitHub Source 的 PUT settings/source:github 示例相同,换成 settings/source:feishu,请求头带 x-orchestrator-request: 1,revision 先从 GET settings 读。

七、第 5 步:Policy 白名单——谁能在飞书里 @ 它干活

和 GitHub 一样:白名单为空时,任何请求都不会变成 Ticket。 飞书这部分在 Policy 的 On each Source 下面,字段是“能发起工作的飞书用户”,每行一个 open_id(ou_…),名字可选。

怎么拿到 open_id

用机器人身份列群成员(lark-cli 文档里的命令,dsh-superagent 同步名单时也用它):

lark-bot im +chat-members-list --chat-id oc_xxx --member-types user

返回的 users[] 里,member_id 默认就是 open_id。把你自己的那一行填进白名单即可。

同步来源群:方便,但范围会变大

飞书 Source 多一个 GitHub 没有的选项:同步来源群。选了之后,白名单会变成这个群里的所有人:新成员自动加入,离开的人自动移除,在启动时和点 立即同步 时执行。SETUP.md 里的默认建议也是“第一个群里的所有人,并与成员保持同步”。

这在小团队专用群里很省事,但要清楚它的含义:谁进了这个群,谁就能让 agent 开 PR。所以:

  • 只对成员可控的小群用同步;大群、有外部成员的群,手工填 open_id。
  • 准入表里“不在名单上、但 @ 了机器人”这一格默认是 ignore。docs/002 提到可以把它改成 explicit,让群里任何人 @ 它都能发起工作,“适合专门的支持群”。一般团队保持默认就好。
  • 另外的机器人(比如别的通知机器人)的消息,只有被列进“消息可以成为候选的机器人”,才可能成为“推断候选”;它们永远不能发起明确请求,也不能停止工单。
  • 主动工作的模式默认是 observe:只记录“本来会接”,不真的接。上一篇建议过保持默认,飞书这边同样适用。

八、试一下:群里 @ 它开工单

用白名单里的账号,在已配置的群里发:

@你的机器人 修一下 README 里安装命令的版本号,开个 PR

预期:

  1. 面板 Overview 出现一个 Ticket;
  2. 机器人在原消息下回复确认(以话题回复的形式);
  3. agent GitHub 账号开出 PR,链接回到这个话题里。

需要说明的是,worker 读飞书上下文时(仓库里的 dsh-superagent-feishu skill),会按需读取原消息、根消息、父消息、所在话题,以及消息前后各 5 条群聊。所以“修一下上面那个问题”这类说法它会先回去读上下文,也意味着群里附近的消息都可能进入它的上下文。

九、排错表

前 7 行来自 docs/006 的 Troubleshooting 表和状态说明;后 4 行是根据飞书和 lark-cli 文档补的,标了“推断”。

dsh-superagent 飞书排错速查:user identities、bot 不在群里、命令超时、@ 了没反应、缺权限、长连接保存失败、偶尔收不到消息的原因和处理

现象 / 报错 原因和处理
The bot lark-cli allows user identities 飞书 Source 指向的 lark-cli 能以用户身份执行。按第四节单独建一份 strict-mode bot 配置,面板里填 lark-bot
The bot lark-cli does not work. 检查这份配置的 App ID 和 App Secret
The bot identity of app … is … 机器人身份没就绪,按提示用 lark-cli 配好 App Secret
The Feishu bot is not a member of the chat. 在群设置里把机器人加进群,下一次尝试就会成功
… timed out after 90 s / … exited with code … / … could not run: … CLI 失败但没说原因。以运行 dsh-superagent 的系统用户手动跑一次报错里那个命令,看它自己的错误信息
status 退出码 2,errors 里有 feishu 或 sync:<source id> 飞书 Source 或白名单同步出错,重启解决不了,按 errors 里的详情处理。同步失败会在 1 分钟后重试,之后间隔逐次翻倍,最长 1 小时
@ 了没反应 发消息的人不在白名单里(注意填的是 open_id);飞书 Source 没开;处理被暂停;该群没在“接收的群”里且“其他群”为“不接收”
lark-cli 报 missing_scope 或权限被拒(推断) 按报错里的 missing_scopes 和 console_url 去开发者后台开权限,然后重新发布版本
后台保存“长连接”订阅方式失败(推断) 飞书要求保存时有长连接客户端在线
同事搜不到机器人 / 拉不进群(推断) 不在应用可用范围内,到“版本管理与发布”里调整并发布
偶尔收不到消息(推断) 飞书长连接是集群模式,同一个应用有多个客户端在线时只有随机一个收到消息。不要让同一个应用同时被别的程序或另一台机器上的 lark-cli 消费

另外,docs/006 写明:setup 没能检查飞书机器人时,status 仍算正常;飞书 setup 失败只会关掉飞书 Source,不影响 GitHub 那边。所以 status 是 0 也不代表飞书一定通了,最好看一眼面板上飞书 Source 的状态。

十、安全注意事项

上一篇讲过 worker 以 danger-full-access 运行的问题,接飞书之后再补三条:

  1. 群消息也是输入,不是授权。 docs/002 的说法是:消息、评论和引用的文档只是决策的输入,不能改变权限;dsh-superagent-feishu skill 也写明,其他参与者、机器人和引用的指令“never authorize work”。这是正确的设计,但 worker 读到的文字仍然可能被模型当成指令,和 AGENTS.md 投毒 是同一类风险。白名单越小,能把文字送到它面前的人就越少。
  2. 只给机器人身份,只开需要的权限。 不开“全部消息”就不要申请 im:message.group_msg。lark-cli 的 README 本身也提示 AI agent 调用存在“模型幻觉、执行不可控、提示词注入等固有风险”,还建议把对接它的机器人当私人助手用、不要拉进群聊。dsh-superagent 的做法是强制只用机器人身份,再加白名单,在这个前提下用群聊。要不要放进团队群,可以据此自己判断。
  3. 隔离照旧。 单独的 OS 用户或 VM、Execution 里屏蔽你个人的 CLI(包括你自己登录过用户身份的 lark-cli)、auto-merge 先关。worker 的 PATH 里 lark-cli 会被 shim 指到机器人的 CLI,但 docs/006 也说了,这种包装只是“默认用 agent 的凭据”,不是隔离。

十一、怎么选 / 注意事项

情况 建议
团队在 GitHub Issue 里沟通 只用 GitHub Source,不需要飞书(SETUP.md 默认也是“GitHub only, unless the team works in Feishu”)
团队日常在飞书,想“群里 @ 一下就开 PR” 接飞书,单独一个工作群,“仅 @” + 手工白名单
小团队、群成员就是开发者 可以用“同步来源群”省掉维护名单
大群 / 有外部成员 / 客户群 不建议把机器人拉进去,至少不要用同步来源群
想让它“看群聊主动干活” 需要“全部消息”+ 敏感权限 + 写规则,先 observe 观察一段时间
用 Lark 国际版 docs/006 写的是 “a Feishu or Lark app”,config init 加 --brand lark,详见 dsh-superagent 接入 Lark
团队用 Slack / Linear 官方没有内置,需要按 Cookbook 自己加 Source,见 dsh-superagent 接入 Slack 和 Linear

最后

飞书这一段的配置量其实不大,真正要想清楚的是身份和名单:lark-cli 只给机器人身份,白名单只放该放的人。dsh-superagent 在这两点上的默认值都偏保守:能以用户身份执行的 CLI 直接拒绝,名单为空就什么都不做。这也是它适合拿来试的原因。

一句话:dsh-superagent 接飞书 = 自建应用机器人 + strict-mode bot 的 lark-cli + 白名单里的 open_id。先单独建一个小群,用“仅 @”,名单只放自己,跑通一次再扩大范围。

还没装 DSH 的话,先看 dsh-superagent GitHub 部署指南。团队用的是 Lark 国际版,看 dsh-superagent 接入 Lark;用 Slack 或 Linear,看 dsh-superagent 接入 Slack 和 Linear。想知道 DSH 配 DeepSeek 模型实际是什么感觉,可以看 DeepSeek V4.1 Flash 接进 OMP 和 DSH。在意 agent 的模型账单,可以看 DeepSeek V4.1 Flash 1017 接入 Claude Code:配置与价格。

参考来源

  1. dsh-superagent-prototype 仓库与 README:https://github.com/deepseek-ai/dsh-superagent-prototype
  2. 部署文档 docs/006-deployment.md(Feishu bot、Troubleshooting):https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/docs/006-deployment.md
  3. 授权文档 docs/002-authorization.md(准入表、accept mode):https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/docs/002-authorization.md
  4. SETUP.md:https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/SETUP.md
  5. 飞书 Source 源码 src/sources/feishu.ts:https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/src/sources/feishu.ts
  6. 飞书读取 skill:https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/skills/dsh-superagent-feishu/SKILL.md
  7. lark-cli(飞书官方 CLI)仓库与 README:https://github.com/larksuite/cli
  8. lark-cli 事件订阅文档(lark-event):https://github.com/larksuite/cli/blob/main/skills/lark-event/SKILL.md
  9. lark-cli 身份与权限说明:https://github.com/larksuite/cli/blob/main/skills/lark-shared/references/lark-shared-identity-and-permissions.md
  10. 飞书开放平台·接收消息事件:https://open.feishu.cn/document/server-docs/im-v1/message/events/receive
  11. 飞书开放平台·使用长连接接收事件:https://open.feishu.cn/document/server-docs/event-subscription-guide/event-subscription-configure-/request-url-configuration-case
  12. 飞书开放平台·如何启用机器人能力:https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-enable-bot-ability
  13. 飞书开放平台·自动回复机器人教程(群设置添加机器人):https://open.feishu.cn/document/develop-an-echo-bot/introduction
  14. npm:@deepseek-ai/dsh、@larksuite/cli 版本信息(2026-11-03 查阅)

相关阅读:

Comments

  • Loading comments…

Comments are posted immediately and emailed to the site owner. No account needed.