dsh-feishu-board:把 DSH 会话提问推到飞书私聊并回填答案

前言

在 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。

前置条件

  1. 已安装并运行 dsh web,且 web profile 能加载宿主插件 bundle。
  2. 安装飞书官方 lark-cli,并用 bot 身份登录:lark-cli auth status 显示 bot ready。
  3. bot 具备给你发私聊、读私聊消息的权限(README 提到 im:message.p2p_msg:readonly 等)。
  4. 自行配置 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 先答则飞书侧待答作废。

回复如何匹配回原会话

  1. 引用回复:用 +messages-mget 取 reply_to,精确锚定某条通知,投回发信会话。
  2. 未引用:只认 30 分钟内最近一封已登记的通知;超时会在飞书回执提示你引用回复。
  3. 匹配失败或投递失败时,插件会在飞书说明原因,原文仍写入 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 即可。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜