把 DSH Agent 接进飞书/Lark:在聊天里派任务、看过程、切换工作区和模型;提问、计划、工具审批用卡片回到聊天处理。
- 语言
- TypeScript
- License
- BSD-3-Clause
- 分支
- main
安装
$ dsh plugin --profile web add github:omdsh-dev/dsh-lark在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
把 DeepSeek Harness (DSH) Agent 接到飞书/Lark 聊天里——在聊天中派任务、看思考与工具调用过程、切换工作区与模型,提问/计划/审批都回到当前聊天处理;必要时还能让多个机器人同群按 @ 接力协作。
核心能力
- 在飞书聊天里直接给 Agent 派任务,思考过程、工具调用和结果以原生思维过程形式回写到聊天,最终答案单独成消息
- 用
/ws列出可选工作区、用/cd切换到指定目录,每个对话 × 当前目录对应一个独立 Agent 会话 - 用
/model卡片切换当前对话的模型(保留上下文),也可一行命令/model use <provider/model>直切 - 用
/new原地开一个新会话(清空上下文,保留工作区和模型),用/sessions列出本工作区可接续的会话并一键接续 - 用
/permission卡片选择权限预设,提问、计划确认、工具审批全部以交互卡片在聊天中答复(单选/多选/文字均可) - 文件收发:用户发进聊天的文件落到工作区的
.dsh-lark/inbox/<时间戳>-<消息哈希>/供 Agent 读取;Agent 发回文件在私聊直接发,群聊每发一张都弹审批卡片 - 多机器人协作:
dsh-lark-channel add <name>加挂第二个机器人实例,它们在同一群里用 @ 交接回合,连续机器人轮次上限默认 6 轮
技术实现
- 语言: TypeScript(ESM,
package.json:5),通过tsdown打包成lib/index.js,同时提供dsh-lark-channelCLI - 关键依赖:
@deepseek-ai/cordis^4.0.1(peer dep,插件宿主框架)、@larksuite/channel^0.4.1(飞书 IM 长连接传输层)、@deepseek-ai/schemastery^3.18.1(配置 Schema 校验)、qrcode-terminal^0.12.0(首次扫码) - 架构模式: Cordis function-plugin 形态——
src/index.ts导出name='lark-channel'、inject=['agents']、ConfigSchema 和apply(ctx, config);cordis.patch.yml把这一行插入 DSH profile 的 bundles,由宿主启动时挂载;CLIdsh-lark-channel是独立进程,用自带的 provision 脚本为单实例机器人写独立的 profile + launchd/systemd 用户服务 - 入口文件: DSH profile 内入口
src/runtime.ts(apply + 引导启动),CLI 入口src/cli.ts(仅 re-exportprovision.ts的 main),扫描二维码 + 凭据落盘见src/onboarding.ts
适用场景
适合已经在 DSH 里跑 Agent、想用手机/飞书客户端继续推进任务的用户:让 DSH Agent 在飞书私聊或群里替你推进工作,不用守在终端前;或让多个 Agent 共用一组项目目录——把工作区切换和多 Bot 协作结合,让一个机器人做改动、另一个机器人评审。需要即时聊天分发、文件互传、审批回收的人会常用;如果只是想跑本地命令或纯 Web 端界面,这个插件不起作用。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness | >=0.1.0-rc.6 | README 明确要求;低于此版本 DSH 找不到此插件的 bundle 行 |
| Node.js | ^22.19.0 || >=24.0.0 | package.json engines 字段 |
| 平台 | macOS / Linux / Windows | 跨平台;macOS 用 launchd,systemd Linux 用 systemd --user,Windows / 无 systemd 的 Linux CLI 降级为前台运行(src/provision.ts:11-14,290-296) |
| 飞书客户端 | PC 7.70 / 移动 7.74+(推荐) | 用思维过程渲染需要较新的客户端;旧客户端可设 output: 'stream' 走整段打字机卡片 |
| 原生模块 | 无 | 纯 JS/TS 实现,不依赖 node-gyp 编译模块 |
安装方式
dsh plugin --profile web add github:omdsh-dev/dsh-lark
也可通过 npm i -g dsh-lark-channel + dsh-lark-channel start 命令在终端生成二维码走单机模式。
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| appId / appSecret / appSecretRef | 字符串 | 飞书应用凭据;扫码完成后由插件落进宿主 credentials/secrets 服务;也可通过 LARK_APP_ID / LARK_APP_SECRET 环境变量直接提供 | 未设时首次启动打印二维码 |
| domain | URL | 飞书开放平台域名,飞书默认 https://open.feishu.cn,国际版 Lark 用 https://open.larksuite.com | 飞书 |
| cwd | 路径 | 聊天 Agent 的默认工作区目录 | 宿主进程 cwd |
| workspaceRoots | 字符串数组 | 限制 /cd 可切换到的目录前缀;空表示不限 | [] |
| provider / model | 字符串 | Agent 使用的模型路由;为单个聊天用 /model 切换此字段 | 宿主 agentDefaultModel |
| sessionScope | chat | chat-thread | chat-sender | 会话粒度:整聊一个、按话题分、按人分 | chat |
| output | cot | stream | 思维过程形态;cot 用原生思维过程消息,stream 一段打字机卡片(旧客户端) | cot |
| showProcess | 布尔 | 是否在飞书中展示推理与工具调用过程 | true |
| attachImages | 布尔 | 把聊天图片作为内容块送给模型;只在你确认模型支持视觉时打开 | false |
| receiveFiles / maxReceiveFileBytes | 布尔 / 字节数 | 入站文件是否落工作区,单文件上限 | true / 20 MiB |
| sendFiles / maxSendFileBytes | 布尔 / 字节数 | Agent 主动出站文件是否放行,单文件上限 | true / 20 MiB |
| hideProcessWhenDone | 布尔 | 任务结束后让平台把思维过程消息收起(只 cot) | false |
| syncSlashCommands | 布尔 | 把插件提供的斜杠命令同步到飞书 / 面板 | true |
| denyTools | 字符串数组 | 在 Agent 端禁用某些工具(用 Agent 影子问答替代) | [] |
| botPeers | open_id 数组 | 限制只回应哪些机器人发送的消息 | [] |
| botHops | 数字 | 连续机器人轮次上限;人发言恢复额度 | 6 |
| requireMention | 布尔 | 群聊是否必须 @ 才回应 | true |
| senderAllowlist / groupAllowlist / approvers | open_id 数组 | 进一步收窄私聊可发者、可服务群、可回答审批者 | [] |
| instance | 字符串 | 给插件行起名(多机器人场景);第一个机器人必须留空以保持兼容 | — |
| chatWorkspaces / chatModels / chatEpochs / chatSessions | 对象 | 每个对话的状态映射(工作区、模型、新开会话计数、绑定会话),由 /cd /new /model /session 写回 | {} |
常见问题
Q: 安装之后要怎么让机器人在飞书里活起来?
A: 用 dsh plugin --profile web add github:omdsh-dev/dsh-lark 加进 DSH profile 后通过 dsh web 启动即可;或 npm i -g dsh-lark-channel + dsh-lark-channel start,终端打印二维码,用飞书 App 扫码完成应用创建。凭据会落进宿主 secrets 服务而不是明文 settings。
Q: 机器人默认只在群里 @ 才回话,怎么改成群里也被动回应?
A: 在配置里把 requireMention 设为 false 后重启服务。注意这是会话级别的开关,谁能把机器人加进去仍由飞书应用的可见性范围决定;改此项不会扩大可见范围。
Q: 我中途切换了工作区或工作区里 git 历史不想要 .dsh-lark 这个目录,怎么办?
A: 第一次有文件落盘时插件会提醒把 .dsh-lark/ 加进 .gitignore,但插件本身不会去改这个文件。入站文件按消息分组只增不删(src/files.ts:42-46),清理由你自己决定——这是显式设计,渠道不替你清。
Q: 群聊里 Agent 想把文件发回去,每次都要我点审批卡烦不烦?
A: 私聊直接发,群聊每次都弹审批卡,并且没有关闭群聊审批的开关——这是源码层面固定死的(src/config.ts:177-180、README:159),被定位成"提示注入外泄链的官方后门"。
Q: 我能一次配多个机器人,让它们互相协作吗?
A: 能。dsh-lark-channel add reviewer 添加第二个飞书应用,形成独立 profile 行;扫码后机器人各自有设置、凭据和会话。把它们加到同一个群,用 @ 接力回合,连续机器人轮次上限默认 6 轮到 9 轮(任一人发言即重置)。dsh-lark-channel remove <name> 可移除,名称和凭据保留以便下次再加回来。
Q: 我想清掉上下文重新开始,但保留工作区和模型,怎么做?
A: 用 /new。它会原地开一个新会话、清空消息历史,工作区和当前模型保持不变。要彻底切上下文(连工作区一起换)用 /cd <新路径>。
Q: 修改配置项后多久生效?
A: 配置在启动时读取,修改后需要重启服务生效(README.md:165)。macOS 上是 launchctl kickstart -k、systemd Linux 上 systemctl --user restart dsh-lark。
上手难度
入门 — 用一条 DSH 插件命令即可启用,或 npm i -g 后一条 start 命令即可上手;最常见的"扫个码就能用"路径不需要理解内部结构。要调高级选项才需要了解白名单、会话粒度、思维过程形态这些概念。
已知问题与限制
- 群聊文件审批数量固定写死 3:群聊里同时最多挂 3 个待审批文件,第 4 个会被直接拒绝并提示等前面先有结果;此上限不可配置(
README.md:161-162/src/config.ts:179-182) - 群聊审批始终保留,无开关:私聊直发、群聊每发一张都弹审批卡(
src/config.ts:177-180),源码明确拒绝提供关闭项以避免提示注入外泄链后门 - macOS / Linux 行为差异:macOS 用 launchd、systemd Linux 用 systemd-user;Windows 和无 systemd 的 Linux CLI 入口
start会降级为前台运行(src/provision.ts:11-14,290-296) - 图片附件默认不送进模型:聊天里发的图片默认只落盘不作为视觉内容传给模型,需要确认模型支持视觉后再在配置中开
attachImages——否则一次截图就能拖累整个会话(src/config.ts:128-143) - 文档类附件无在线预览:pdf / xlsx / docx 上传后只能下载不能预览,这是上游
@larksuite/channel把普通文件固定按stream类型上传带来的固有限制(README.md:163) - 语音消息只落盘不转写:插件不做语音识别(README:164)
- 出站文件路径会被截断到工作区内:任何给人或给模型看的文案都只说"工作区内相对路径",包括
send_file失败时文件系统自身那行报错;这是有意为之以避免提示注入时外泄宿主页前缀 - 维护命令排队为每会话一队:两个用户在空闲期点维护命令会按每个 Agent 一条队列依次执行,超时会失败(
src/maintenance.ts:1-19) - 修改配置需重启生效:Cordis 启动期读取配置,运行时改
cordis.patch.yml不会自动 reload,需要重启宿主服务(README.md:165)
简体中文 | English
把你正在使用的 DeepSeek Harness(DSH)接进飞书。
直接在聊天里给 Agent 派任务、看执行过程、切换工作区和模型。遇到提问、计划确认或工具审批,也不用回到终端,直接在飞书里处理。需要时,还能把多个 Agent 放进同一个群里协作。
快速开始
npm i -g dsh-lark-channel
dsh-lark-channel start
终端会显示二维码。用飞书扫码完成应用创建,然后私聊机器人,或在群里 @ 它即可开始。
启动命令会在首次安装依赖前写好 profile 的 pnpm 构建策略:未经批准的依赖构建脚本一律警告并跳过,而不是让安装失败;protobufjs 那个只打印提示的 postinstall 还会被按名字记为跳过。因此不需要手工执行 pnpm approve-builds。
不想装到全局也可以直接跑,只是之后每条命令都要带 npx:
npx dsh-lark-channel@latest start
如果还没有安装 DeepSeek Harness,先运行:
npm i -g @deepseek-ai/dsh
无需公网服务器,也无需配置回调地址。
为什么值得装
- 不用守着终端:从飞书发起任务,随时查看进度和结果。
- 不只是聊天机器人:可以切换真实工作区和模型,执行 Harness 已有的命令与工具。
- 关键决定仍由你控制:模型提问、计划审阅和工具审批都会回到当前聊天,按钮或文字都能作答。
- 上下文不会混在一起:不同聊天、话题和工作区可以保留各自的会话。
- Agent 之间也能协作:一条命令添加更多机器人,让它们在群聊中通过 @ 交接回合,并用轮数上限防止无限对话。
可以这样开始
先看看当前状态和可用工作区:
/status
/ws
/cd my-project
/model
然后直接派一个任务:
检查这个项目为什么构建失败。先给我计划,需要操作时让我确认。
Agent 的执行过程会显示在飞书中;需要你参与时,会发送提问、计划或审批卡片。渠道自带文案会按每位读者的飞书语言显示中文或英文。
主要能力
| 能力 | 使用体验 |
|---|---|
| 持久会话 | 重启后可以恢复;后续消息继续当前上下文,/new 可以原地重开一个 |
| 接续已有会话 | /sessions 列出这个工作区里可以接续的会话——自己的历史,以及网页端/命令行开的——点一行就切过去;/cd、/new 会回到自动派生的会话 |
| 多工作区 | /ws 查看、/cd 切换;回到原工作区时继续之前的任务 |
| 模型切换 | /model 打开模型选择卡片;切换后保留当前会话,也可随时恢复默认模型 |
| 原生执行过程 | 在飞书中查看推理、工具调用和结果,最终答案单独发送 |
| 人机协作卡片 | 单选、多选或文字回答问题;批准计划或提出修改意见;允许或拒绝工具调用 |
| 权限预设 | /permission 打开预设卡片,写明每个预设能碰到什么、会不会弹审批;放开沙箱需要审批人权限,切回更安全的预设不需要 |
| 实时状态 | /status 展示工作区、模型、session 和当前权限预设;可用时还显示上下文占用与累计 token,并支持刷新 |
| 会话隔离 | 可按聊天、话题或群成员划分独立 Agent 会话 |
| 多 Agent 协作 | 多个机器人拥有独立设置、凭据和 session,可以在同一个群里对话与交接任务 |
| 斜杠命令 | 宿主自带的命令(/plan、/compact 等)直接进入 DSH 命令运行时 |
| 文件收发 | 人发文件进聊天,agent 在工作区里读;agent 的产物发回聊天,群聊里先弹审批卡 |
常用命令
| 命令 | 用途 |
|---|---|
/status | 查看并刷新工作区、模型和 session;可用时包含上下文与 token 状态 |
/ws | 查看可用工作区 |
/cd <名称或路径> | 切换工作区 |
/get <路径> | 把工作区里的文件发到聊天 |
/model | 打开模型选择卡片 |
/model use <provider/model> | 直接切换模型 |
/model reset | 恢复默认模型 |
/permission | 打开权限预设卡片 |
/permission <预设名> | 直接切换权限预设 |
/new | 原地开一个新会话,清空上下文,工作区和模型保持不变 |
/sessions | 列出可接续的会话,点一行切过去 |
/sessions <关键词> | 按标题或 id 过滤列表 |
/stop | 停止当前任务 |
/help | 查看全部命令(含宿主提供的) |
日常运行
macOS 和采用 systemd 的 Linux 会使用用户级后台服务,关闭终端后仍可运行:
dsh-lark-channel status
dsh-lark-channel logs -f
dsh-lark-channel restart
dsh-lark-channel stop
用 npx 启动的话,这些命令同样要带 npx dsh-lark-channel@latest 前缀——工具会按你实际的启动方式打印提示,读到什么就能直接粘贴。
升级:
dsh-lark-channel upgrade
它会装上最新的 CLI 并在新版本上重启机器人。用 npx 的话不需要这一步,npx dsh-lark-channel@latest start 本来就是最新。有新版本时,start 和 status 会顺带提醒你一行。
连接异常时,插件会在限额和退避控制下自动重建 WebSocket,避免进程仍在但机器人已经静默离线。
添加更多 Agent
给第二个飞书应用添加一套独立的 Agent:
dsh-lark-channel add reviewer
命令会写入新实例、重启服务并显示二维码。扫码后,这个机器人拥有自己的设置、App Secret 和 session,不会与第一个机器人共享上下文。
把两个机器人加入同一个群后,它们可以通过 @ 把回合交给对方。例如,让一个 Agent 完成修改后 @ 另一个 Agent 复核,后者也可以 @ 回去要求调整。默认最多连续进行 6 个机器人轮次;任何人发言都会恢复额度。需要移除时:
dsh-lark-channel remove reviewer
移除会保留该实例的凭据和设置,之后用同一个名字重新添加即可恢复。
如果希望飞书和 dsh web 共用同一个 profile:
dsh plugin --profile web add dsh-lark-channel@latest
dsh web
权限与高级选项
- 飞书应用的可用范围决定谁能找到机器人;
senderAllowlist、groupAllowlist和approvers可以进一步收窄权限。 workspaceRoots可以限制聊天中允许切换到的目录。sessionScope支持chat、chat-thread和chat-sender三种会话粒度。instance用于命名额外的机器人实例;第一个机器人保持未命名,以兼容已有设置和会话。botPeers可以限制允许对话的机器人,botHops控制连续机器人轮次,默认是 6。- 会改变状态的卡片绑定原聊天,转发到其他聊天后不能操作原会话。
- 部署提供 credentials 服务时,扫码得到的 App Secret 会存入其中;旧版本写在 settings 中的 secret 会在下次启动时自动迁移。
- 图片附件默认关闭;只有确认当前模型支持视觉时,才应开启
attachImages。 receiveFiles默认开:入站文件落在当前会话工作区的.dsh-lark/inbox/<时间戳>-<消息哈希>/下,只增不删,清理是你的决定;首次落地时会提醒把.dsh-lark/加进.gitignore,但不会替你去改这个文件。sendFiles默认开:私聊直接发,群聊每次弹审批卡片,卡片上是文件在工作区内的位置、工作区名和大小(不是宿主的绝对路径——群里每个人都会看到它);没有关闭群聊审批的开关,因为那会是提示注入外泄链的官方后门。- 出站文件的路径一律只说"工作区内的相对位置",宿主绝对前缀不会出现在任何一句给人或给模型看的话里——包括读取失败时文件系统自己那句报错(
/get的回复和send_file给模型的报错都在内)。失败分支恰恰是提示注入能主动触发的那条。 - 一个群同时最多挂 3 个待审文件:群聊发送会在问群之前就把整个文件读进内存,好让群里批的和最终发出去的是同一份,所以待审数量必须有上限。第 4 次会被直接拒绝并告诉模型等前面几个先有结果。这个数字不可配置,调大等于同时买回内存风险和审批疲劳。
- 审批结束卡会记录决定人:回调未带姓名时,渠道会尽力从当前聊天成员名单解析;没有成员查询权限、查询失败或成员已不在群内时仍安全显示 open_id,绝不会影响审批或文件发送。
- 单文件上限默认 20 MiB,收发分别由
maxReceiveFileBytes/maxSendFileBytes配置;文档类产物(pdf / xlsx / docx)在聊天里只能下载、没有在线预览,这是上游 SDK 把普通文件固定按stream类型上传带来的已知取舍。 - 语音消息只落盘,不会被转写成文字。
- 配置在启动时读取,修改后需要重启服务。
环境要求
- Node.js
^22.19.0 || >=24 - DeepSeek Harness
0.1.0-rc.6或更新版本 - 飞书或 Lark 租户
原生思考过程需要飞书 PC 7.70、移动端 7.74 或更新版本;旧客户端可以使用 output: 'stream'。
开发
pnpm install
pnpm test
pnpm build
License
本项目是非官方社区插件,与 DeepSeek、飞书或 Lark 不存在隶属、授权或背书关系。