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

两点和 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. 创建企业自建应用,开启机器人能力
- 登录 飞书开发者后台,创建企业自建应用。
- 进入应用管理页,点 添加应用能力,添加 机器人(飞书文档《如何启用机器人能力》)。
- 在 凭证与基础信息 里记下 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
- 进入 事件与回调 > 事件配置,订阅方式选 使用长连接接收事件。
- 添加事件:消息与群组 分类下的 接收消息 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
预期:
- 面板 Overview 出现一个 Ticket;
- 机器人在原消息下回复确认(以话题回复的形式);
- agent GitHub 账号开出 PR,链接回到这个话题里。
需要说明的是,worker 读飞书上下文时(仓库里的 dsh-superagent-feishu skill),会按需读取原消息、根消息、父消息、所在话题,以及消息前后各 5 条群聊。所以“修一下上面那个问题”这类说法它会先回去读上下文,也意味着群里附近的消息都可能进入它的上下文。
九、排错表
前 7 行来自 docs/006 的 Troubleshooting 表和状态说明;后 4 行是根据飞书和 lark-cli 文档补的,标了“推断”。

| 现象 / 报错 | 原因和处理 |
|---|---|
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 运行的问题,接飞书之后再补三条:
- 群消息也是输入,不是授权。 docs/002 的说法是:消息、评论和引用的文档只是决策的输入,不能改变权限;
dsh-superagent-feishuskill 也写明,其他参与者、机器人和引用的指令“never authorize work”。这是正确的设计,但 worker 读到的文字仍然可能被模型当成指令,和 AGENTS.md 投毒 是同一类风险。白名单越小,能把文字送到它面前的人就越少。 - 只给机器人身份,只开需要的权限。 不开“全部消息”就不要申请
im:message.group_msg。lark-cli 的 README 本身也提示 AI agent 调用存在“模型幻觉、执行不可控、提示词注入等固有风险”,还建议把对接它的机器人当私人助手用、不要拉进群聊。dsh-superagent 的做法是强制只用机器人身份,再加白名单,在这个前提下用群聊。要不要放进团队群,可以据此自己判断。 - 隔离照旧。 单独的 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:配置与价格。
参考来源
- dsh-superagent-prototype 仓库与 README:https://github.com/deepseek-ai/dsh-superagent-prototype
- 部署文档 docs/006-deployment.md(Feishu bot、Troubleshooting):https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/docs/006-deployment.md
- 授权文档 docs/002-authorization.md(准入表、accept mode):https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/docs/002-authorization.md
- SETUP.md:https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/SETUP.md
- 飞书 Source 源码 src/sources/feishu.ts:https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/src/sources/feishu.ts
- 飞书读取 skill:https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/skills/dsh-superagent-feishu/SKILL.md
- lark-cli(飞书官方 CLI)仓库与 README:https://github.com/larksuite/cli
- lark-cli 事件订阅文档(lark-event):https://github.com/larksuite/cli/blob/main/skills/lark-event/SKILL.md
- lark-cli 身份与权限说明:https://github.com/larksuite/cli/blob/main/skills/lark-shared/references/lark-shared-identity-and-permissions.md
- 飞书开放平台·接收消息事件:https://open.feishu.cn/document/server-docs/im-v1/message/events/receive
- 飞书开放平台·使用长连接接收事件:https://open.feishu.cn/document/server-docs/event-subscription-guide/event-subscription-configure-/request-url-configuration-case
- 飞书开放平台·如何启用机器人能力:https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-enable-bot-ability
- 飞书开放平台·自动回复机器人教程(群设置添加机器人):https://open.feishu.cn/document/develop-an-echo-bot/introduction
- npm:@deepseek-ai/dsh、@larksuite/cli 版本信息(2026-11-03 查阅)
相关阅读:
- DeepSeek dsh-superagent 部署指南:在 GitHub 仓库里跑一个“@ 它就干活”的 coding agent
- dsh-superagent 接入 Lark(飞书国际版)教程
- dsh-superagent 接入 Slack 和 Linear:官方没有的 Source 怎么自己加
- DeepSeek V4.1 Flash 接进 OMP 和 DSH 后:慢了,但做需求更周到了
- DeepSeek V4.1 Flash 1017 接入 Claude Code:配置、价格与 4 个省钱设置
- AGENTS.md 投毒自查:别在 Downloads 里开 Claude Code / Codex
Comments