前言¶
在 DeepSeek Harness(DSH)里跑智能体时,会话常会调用 ask_user_question 等人机交互工具,问题会出现在 Web GUI 上。人不在电脑前、只想在手机上回一句时,Web 并不总是顺手。社区插件 dsh-feishu-board(维护者 AAAAaron,分类:联网工具)把这类提问推到飞书私聊,你在飞书里回复的原文会原样送回发起提问的那条会话,会话接着执行。它是 web profile 下的宿主插件,与具体对话窗口无关;关对话或断手机不影响常驻逻辑,dsh web 重启后会自动重新加载。
下面按定位、能力、安装配置和边界说明用法。事实以 GitHub 仓库 README 为准。
这是什么¶
一句话:任一会话里出现 ask_user_question,问题和选项经本插件推到你的飞书私聊;你在飞书里的回复原文,会被当作答案写回该会话。
插件在全局 user-questions/request 上 prepend 注册,与 Web GUI 竞争处理——谁先答谁生效。流程概要如下:
任一会话 ask_user_question
│
▼
[本插件] 写 board/questions.jsonl,lark-cli 发私聊(bot,无 LLM),等待答案
│
▼
[本插件] 约每 10s 轮询私聊历史 → answers.jsonl → 解析选项/自由文本 → 返回瀑布
│
▼
原会话继续(Web 若先答则本条作废,状态记为 answered-web)
npm 包名 dsh-feishu-board,当前 README 示例版本 0.2.2,许可证 MIT,Node.js >= 20,DSH >= 0.2.1-rc.2。
前置条件¶
- 已安装并运行
dsh web,且 web profile 能加载宿主插件 bundle。 - 安装飞书官方 lark-cli,并用 bot 身份登录:
lark-cli auth status显示 bot ready。 - bot 具备给你发私聊、读私聊消息的权限(README 提到
im:message.p2p_msg:readonly等)。 - 自行配置
chatId与userOpenId(见下节);缺失时插件不启动,只在board/plugin.json留enabled:false,不会静默吞问题。
核心功能¶
飞书公告板与轮询回填¶
- 待答问题写入公告板目录(默认
~/.dsh-feishu-board)下的questions.jsonl等文件。 - 通过
lark-cli im +messages-send以 bot 身份发到你的私聊。 - 默认每 10 秒 用
lark-cli im +chat-messages-list读私聊;只认userOpenId对应用户的消息作为答复。 - 工具调用被 abort 时,等待逻辑同步退出;Web 先答则飞书侧待答作废。
回复如何匹配回原会话¶
- 引用回复:用
+messages-mget取reply_to,精确锚定某条通知,投回发信会话。 - 未引用:只认 30 分钟内最近一封已登记的通知;超时会在飞书回执提示你引用回复。
- 匹配失败或投递失败时,插件会在飞书说明原因,原文仍写入
answers.jsonl。
与 Web GUI 的竞争关系¶
本插件适配阻塞式 ask_user_question。README 注明 timed 模式的迟到回填路径尚未实现;若你改 timed,需另寻方案。
可选:lark-cli 发送出口包装与重复发送抑制(v0.2.0)¶
会话侧若用 grep 过滤 lark-cli 输出,插件可能拿不到 message_id,从而无法登记「谁发的通知」。仓库提供 lark-cli-shim.js 与 install-lark-shim.sh:在真实发送出口记录 message_id 与 $DSH_SESSION_ID 到 outbound-events.jsonl,并合并进 outbound-index.json。
同一套包装还提供 重复发送抑制:在时间窗内(默认 3 分钟,可配置)同一会话、同一目标、同一正文不再真发,而是回放上次 stdout(含 message_id),减轻模型误以为未发送而连发同文的问题。
安装与启用¶
安装命令须使用 README 原文,装到 web profile:
# 1) 装到 profile(三选一:npm / Git / 本地目录)
dsh plugin --profile web add dsh-feishu-board@0.2.2
# 或:dsh plugin --profile web add "git+https://github.com/AAAAaron/dsh-feishu-board#<40位commit>"
# 或:dsh plugin --profile web add "link:/path/to/dsh-feishu-board"
# 2) 确认 profiles/web/package.json 的 dsh.profile.bundles 里有 "dsh-feishu-board"
# (dsh plugin add 不一定自动写这一条)
# 3) 配好 chatId / userOpenId(见下节),重启一次 dsh web
卸载:
dsh plugin --profile web remove dsh-feishu-board
并从 dsh.profile.bundles 删除插件名。
可选安装发送包装:
LARK_BIN_DIR=~/bin/bin ./install-lark-shim.sh
# 回滚:mv ~/bin/bin/lark-cli.real ~/bin/bin/lark-cli
lark-cli update 会覆盖真实 CLI,更新后需重跑 install-lark-shim.sh。
配置¶
优先级:插件 config(cordis.patch.yml)→ 环境变量 → 内置默认值。仓库不含个人 chat_id / open_id,必须自填。
| 键 | 环境变量 | 必填 | 含义 |
|---|---|---|---|
chatId |
DSH_FEISHU_CHAT_ID |
是 | 你与 bot 的私聊 oc_… |
userOpenId |
DSH_FEISHU_USER_OPEN_ID |
是 | 本人 ou_…(仅该 id 的消息算答复) |
boardDir |
DSH_FEISHU_BOARD_DIR |
否 | 公告板目录,默认 ~/.dsh-feishu-board |
larkCli |
DSH_FEISHU_LARK_CLI |
否 | lark-cli 路径,默认 PATH 中的 lark-cli |
pollIntervalMs |
DSH_FEISHU_POLL_MS |
否 | 轮询间隔,默认 10000 |
enabled |
DSH_FEISHU_ENABLED |
否 | 设 0 临时停用 |
重复发送抑制相关:
| 环境变量 | 含义 |
|---|---|
DSH_FEISHU_DEDUPE_WINDOW_MS |
时间窗,默认 180000;设 0 关闭 |
DSH_FEISHU_ALLOW_DUPLICATE |
设 1 强制发送 |
获取 chatId 与 userOpenId¶
你给 bot 发一条私聊后:
lark-cli im +chats-list --as bot --page-size 20
lark-cli im +chat-members --chat-id oc_xxx --as bot
也可用 lark-cli im +messages-send --as bot --user-id ou_xxx --text hi 的返回核对。
典型用法与公告板文件¶
典型路径:保持 dsh web 运行且插件已启用 → 任一会话触发 ask_user_question → 飞书收到 bot 私聊 → 你回复(建议引用该条通知)→ 原会话收到答案并继续。
便于排查的状态文件(均在 boardDir 下):
| 路径 | 说明 |
|---|---|
questions.jsonl |
问题台账与状态 |
answers.jsonl |
回复原始记录 |
cursor.json |
轮询游标 |
plugin.json |
心跳与最近错误 |
outbound-index.json / outbound-events.jsonl |
发信会话索引(配合 shim) |
send-dedupe.json |
重复发送抑制状态 |
状态流转包括 pending → sent → answered(飞书答)、answered-web(Web 先答)、orphaned(宿主重启时仍有待答)。
适用场景与注意¶
适合:长时间挂着 DSH Web,但人经常离开电脑;需要在飞书私聊里快速点选或打一句,让原会话继续跑。
务必知晓:
- 插件以当前 dsh 进程权限运行,安装前请阅读源码与 MIT 许可证,确认 lark-cli bot 权限范围仅覆盖你配置的私聊。
- 延迟:默认 10 秒轮询,不是实时推送。
dsh web重启:内存中等待中的提问会丢,板子上可能标orphaned;此时在飞书回复会被告知无待答问题。- 跨机器:只认本机登记过的 outbound 索引;别机发的通知无法通过本机插件回填。
- 社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本文仅介绍该社区插件能力。
结尾¶
dsh-feishu-board 把 DSH 全局的 ask_user_question 接到飞书私聊,并用公告板文件与可选 lark-cli 包装解决登记与重复发送问题。需要试用时,按 README 安装到 web profile、配齐 chatId / userOpenId 并重启 dsh web 即可。