🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

飞书私聊助理 wanjiaju3108/dsh-feishu-assistant

DeepSeek Harness
wanjiaju310840 天前有提交已提供中文文档扫描:未发现敏感能力

在飞书私聊机器人,直接对话你的 DSH 会话

29.7/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wanjiaju3108/dsh-feishu-assistant
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 40 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 7 处,展示前 7 条)
  • 发起网络请求
    lib/client.js:331
    const response = await fetch(STATE_ROUTE, { credentials: 'same-origin' });
  • 发起网络请求
    lib/client.js:352
    const response = await fetch(PAIRING_ROUTE, { method: 'POST', credentials: 'same-origin' });
  • 发起网络请求
    lib/client.js:364
    const response = await fetch(SESSIONS_ROUTE, { credentials: 'same-origin' });
  • 发起网络请求
    lib/client.js:399
    const response = await fetch(CONFIG_ROUTE, {
  • 发起网络请求
    lib/client.js:476
    const configResponse = await fetch(CONFIG_ROUTE, {
  • 发起网络请求
    lib/client.js:491
    const credentialResponse = await fetch(CREDENTIALS_ROUTE, {
  • 发起网络请求
    lib/wecom.js:165
    const response = await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 配对码绑定管理员
  • 审批卡放行
  • 回答以卡片返回飞书

飞书私聊机器人就是你的 DSH 助理:配对码绑管理员、审批卡放行、串行排队、回答成卡片回到飞书

README

由 DeepSeek 最新模型翻译生成
dsh-feishu-assistant 飞书上的 AI 助手:在飞书里私聊机器人,就是跟你指定的那条 DSH 会话对话——助手的回答以卡片回到飞书,Markdown 正常渲染。不需要公网入口。 装 dsh plugin --profile web add dsh-feishu-assistant 装完重启 dsh web。 DSH 版本:当前 0.1.6 需要 DSH 0.1.7-rc.1 及以上。 还在 DSH 0.1.5 上的,装最后一个支持它的版本: dsh plugin --profile web add dsh-feishu-assistant@0.1.4 装的时候如果收尾报 ERR_PNPM_IGNORED_BUILDS: protobufjs,插件其实没装上。 @larksuiteoapi/node-sdk 的依赖里有 protobufjs,它带 postinstall 脚本,pnpm 默认不跑;dsh 把 pnpm 的非零退出当成整体失败,于是没把插件登记进 profile。
展开完整文档(README 剩余 1 节)
dsh-feishu-assistant

飞书上的 AI 助手:在飞书里私聊机器人,就是跟你指定的那条 DSH 会话对话——助手的回答以卡片回到飞书,Markdown 正常渲染。不需要公网入口。

装

dsh plugin --profile web add dsh-feishu-assistant

装完重启 dsh web。

DSH 版本:当前 0.1.6 需要 DSH 0.1.7-rc.1 及以上。
还在 DSH 0.1.5 上的,装最后一个支持它的版本:

dsh plugin --profile web add dsh-feishu-assistant@0.1.4

装的时候如果收尾报 ERR_PNPM_IGNORED_BUILDS: protobufjs,插件其实没装上。
@larksuiteoapi/node-sdk 的依赖里有 protobufjs,它带 postinstall 脚本,pnpm 默认不跑;dsh 把 pnpm 的非零退出当成整体失败,于是没把插件登记进 profile。先放行再装一次:

~/.dsh/profiles//pnpm-workspace.yaml
allowBuilds:
protobufjs: true

做一个飞书AI助理(从零到能聊天)

第 1 步:飞书开放平台建应用

1. 到飞书开放平台 → 创建企业自建应用;
2. 「凭证与基础信息」里抄下 App ID 和 App Secret;
3. 「添加应用能力」里开启机器人;
4. 「权限管理」里加上四条权限:
- im:message.p2p_msg:readonly —— 接收私聊消息
- im:message:send_as_bot —— 以机器人身份发消息
- cardkit:card:write —— 回答卡片(建卡片实体、整块更新组件正文)。不加也能跑,只是回答退回"每段一张普通卡片"
- contact:contact:readonly —— 读通讯录,用来在审批卡片上把请求人显示成姓名。不加也能跑,卡片上会退回显示 open_id
5. 用上一条权限的话,还要把请求人放进应用的通讯录权限范围(开发配置 → 权限管理 → 数据权限):contact/v3/users 只返回权限范围内的用户,范围外的照样取不到名字,接口会报 41050 no user authority
6. 「事件与回调」里把订阅方式设为长连接,然后添加:
- 事件 im.message.receive_v1(收到消息)
- 回调 card.action.trigger(审批卡片的按钮点击)
7. 「版本管理与发布」里创建版本并申请发布 —— 企业自建应用要管理员通过后才对用户生效。

第 2 步:DSH 里装上并配好

打开 设置 → 「飞书AI助理」,四项:

| 项 | 填什么 | 存哪 |
| App ID / App Secret | 第 1 步抄下来的 | $DSH_HOME/.credentials.yaml |
| 目标会话 | 见下面「选一条会话」 | $DSH_HOME/settings.yaml |
| 人设文件 | 上传一份本地 md/txt;不上传就等于这个模式没开 | $DSH_HOME/settings.yaml |
| 管理员 | 不手填,用配对码绑 | $DSH_HOME/settings.yaml |

凭据写入后不再回显;被环境变量或 .env 遮蔽时,页面上显示为只读。

必须把 DSH 权限设成「完全权限」:

飞书来的消息是无人值守执行的——你在手机上,应答不了 DSH 的权限审批。而 DSH 的审批是 fail-close 的:没有应答方就直接拒绝。权限不放开的后果是,飞书发来的请求一碰到写文件、跑命令就失败,而你在手机上只看到一句报错,不知道为什么。

两处都要设,缺一处都不行:

| 哪里 | 设成什么 | 管什么 |
| 设置 → 通用 → 权限 | 完全权限 | 以后新建会话的默认档位 |
| 在会话里打 /permission | 完全权限 | 当前这条会话的档位 |

顺序有讲究:先改通用设置、再建目标会话,新会话就直接是完全权限;要是会话已经建好了,改默认值不会回头生效,得进去用 /permission 补一次。

附带后果:开了完全权限,等于机器人能在这台机器上做任何事。所以「管理员」那一项别漏——它决定谁能跟机器人说话。

选一条会话:

1. 在 Web UI 里新建一条会话;
2. 随便发一句话让它落盘 —— 有日志的会话才会出现在「目标会话」下拉里;
3. 到 设置 → 「飞书AI助理」→「目标会话」,选中它。

建议专开一条会话给飞书用,别跟自己写代码的会话共用:飞书来的消息会进同一条会话历史。

绑管理员:点「生成配对码」,把 8 位口令私聊发给机器人,发送者即被设为管理员。口令 8 位、10 分钟有效、用一次即废。

第 3 步:验证

在飞书里私聊机器人发一句话。管理员的消息直接进队列;回答以卡片回。设置页「状态」区能看到长连接、目标会话、人设三块的状态。

人设文件

「飞书AI助理模式」这个能力跟插件一起装,但人设内容不由插件提供:上传一份本地 md/txt 就行。

- 上传后内容是插件自己配置里的一份副本($DSH_HOME/settings.yaml 的 feishu-assistant.persona),插件不会动你的原文件
- 上限 64 KB;空文件或超限,设置页直接拒绝
- 内容为空时飞书消息不处理(管理员收到一句指路,其他人静默丢弃,审批卡片也不发)
- 内容会盖掉该会话原本的个人设定
- 上传后不用重启、也不用新建会话:下一条飞书消息就是新人设
- 代价:上传之后再改原文件,插件不会跟过来,要重新上传一次

写什么随意。典型内容是助手的身份、语气,以及"正文直接用 Markdown"这类格式约定。

行为

飞书私聊文本 ├─ 配对码 → 把发送者设为管理员,回执 ├─ 人设内容为空 → 管理员收到指路;其他人静默丢弃 ├─ 管理员 → 直接进请求队列 └─ 其他人 → 发审批卡片给管理员;同意后进请求队列,拒绝则回执(待审批最多 20 条、30 分钟过期,作废时回消息告知)

- 请求队列串行:先进先出,前一条整轮 turn/end 结束才注入下一条
- 重复投递只答一次:飞书长连接是“至少一次”投递,断线重连可能把同一条消息再送一遍;按 message_id 去重(lru-cache,记最近 200 条),重投只记一条日志
- 注入前等目标会话空下来:目标会话是共享的,DSH 界面里那一轮可能正在跑。飞书这条会先挂在队列里,等会话真空下来(当前轮跑完、没有排队输入,靠 agent.whenIdle())再注入——这样它就是下一轮,“这一轮跑完了”的判定必然落在自己身上,不会和界面里的轮次交错。等待期间请求人已经在卡片上看到「正在处理」
- 回写粒度是 step:插件只消费已提交的 assistant/message,所以每产出一条就更新一次那张卡片(上面那条);退回普通卡片时才是每段发一条、超过 3000 字按换行分片。DSH 另有 token 级的 agent/assistant-stream(网页界面用它逐字渲染),插件没有接
- 回答走一张卡片,整块替换:文本消息不渲染 Markdown,所以回答用卡片回;而且一条回答只用一张卡——先发一张写着「正在处理」的卡,之后每段把 markdown 组件整块换掉(cardkit.cardElement.update),客户端立刻显示。不用卡片流式接口:那是给逐字生成准备的,客户端会按打字机慢慢打,一段几百字要打好几秒,收尾还会把没打完的一次性刷出来(“打几个字突然整段蹦出”)。正文超过卡片上限(30 KB)会自动翻页再接一张卡
- 卡片开不出来就退回普通卡片:没 cardkit:card:write 权限或接口失败时,退回“每段一张普通卡片”的老行为;卡片中途失败会把没上屏的内容补发成普通消息,不丢内容
- 回写重试:单条失败重试 3 次(500ms / 1000ms 退避)
- 直发有回执:管理员私聊发来的请求先回一句「正在处理」再跑,长回答期间不会让你以为它死了(审批通过的请求人由审批流程回同一句)
- 没产出会说明:这一轮结束时一个字都没产出(例如跑到一半出错)就回一条失败文案,不再静默;管理员还会看到具体失败原因
- 不是飞书发起的轮次也推给你:目标会话是共享的——你可能在 DSH 界面上继续问同一件事。插件按「这一轮里有没有自己注入的那条消息」认领轮次:不是它发起的,就把回答以卡片主动私聊推给管理员,而不是静默丢掉(也没有可回复的飞书消息,所以用主动私聊)
- 会话主动打开:启动、换目标会话、收到消息时都会 sessionController.resolveAgent() 把会话拉起来
- 会话失效有反馈:目标会话打不开(例如被删掉)时,设置页「状态」区会出现红色的「会话错误」并写明原因;同一条失败还会主动私聊告知管理员一次,恢复后再坏会重新告知。确认打不开之后的后续消息不再白开一张卡片(直接回一句报错);请求照常入队,会话恢复后照常处理——那一轮回答先以普通卡片回来,下一轮恢复成回答卡片
- 人设有状态:设置页「状态」区显示「飞书AI助理模式 已导入 (N / 65536 字节)」,没上传则显示未启用
- 助手反问会提示:助手调用提问工具(ask_user_question)时会往飞书回一条提示——那个问题只在 DSH 界面上等人回答,飞书看不到也答不了;提示里会建议用人设禁止它提问、改用回答正文
- 审批人校验:卡片回调校验点击人的 open_id / user_id / union_id,非管理员点不了

配置项

设置页改的都会即时生效(applies: 'live'),不需要重启。

补丁层也可以给初始值:

- id: feishu-assistant
name: dsh-feishu-assistant
config:
sessionId: ''
managerId: ''
persona: ''

怎么验证

npm test # 等价于 node test/all.mjs

六个用例、79 条断言,全部用假飞书 SDK 跑真实的 apply()(不打真接口、不需要凭据):

| 用例 | 覆盖 |
| outbound-check | 出站返回值语义:卡片成功 / 被拒退回文本 / 没有收件人不发 |
| answer-card-check | 回答卡片:整块替换、翻页、失败补发、收尾不多调接口 |
| plugin-routing-check | 轮次归属:飞书请求回原消息、外部轮次走私聊、反问提示 |
| idle-hold-check | 注入前等会话空闲:忙时不注入、被插队继续等、前提被破坏时告警 |
| broken-session-check | 会话打不开:第一次闪一下、之后不再白开卡片、修好后恢复 |
| inbound-dedupe-check | 重复投递只答一次 |

测试放在 test/,不随 npm 包发布(package.json 的 files 只有 lib 和 cordis.patch.yml)。

已知边界

- 只处理私聊文本消息:群聊、图片、文件、富文本、语音一律忽略
- 目标会话必须能被本进程 resume;被另一个进程占着时会失败(DSH 会话是单进程独占的)
- 待审批缓存是内存态,DSH 重启即丢
- 回答卡片用的是卡片 JSON 2.0,要求飞书客户端 7.20 及以上:低于 7.20 时卡片正文会显示成“升级提示”占位图
- 目标会话忙着(界面里那一轮正在跑)时,飞书请求要等它跑完才开始;等待时间等于那一轮的时长。等待期间请求人的卡片显示「正在处理」
- 回答卡片是普通卡片(非流式),没有「生成中」状态,生成期间也能转发
- 每段正文是整块替换、不是逐字流式:答案会在每个 step 结束时成段出现(这是有意的,见上)
- 没有发送者限流;没有 / 命令

依赖的 DSH 服务

agents、settings、credentials、webServer 列在 inject 里,缺一个插件就不会加载。
四个都是官方包(@deepseek-ai/dsh-agent / dsh-settings / dsh-credentials / dsh-host-webserver)。前三个随 dsh-base 走,任何 profile 都有;webServer 只有 dsh-web-app 提供,所以:

这个插件只能在 web profile 里用。 装进 acp、headless、sdk 之类的 profile 时,因为 webServer 不存在,插件会静默不加载——不报错,就是没反应。安装时 --profile web 不要省。

更新日志

见 CHANGELOG.md。
预览分享卡片长什么样 ↓wanjiaju3108/dsh-feishu-assistant
分享 · DeepSeek Harness Hub
wanjiaju3108/dsh-feishu-assistant

在飞书私聊机器人,直接对话你的 DSH 会话

这是你的仓库?认领条目

回到顶部