dsh-reflex:用 L0/L1 本地层筛噪,只在必要时唤醒 ds-bot

前言

在 DSH 里跑 ds-bot 一类推理 Bot 时,常见做法是定时或事件触发后每次都问大模型「要不要处理」。多数轮次答案是「没有」,但每次仍要占配额、重建上下文。更省的做法是把「值不值得占用注意力」前移到便宜层:持续采集事实、用本地决策模型打分,只有跨过阈值才唤醒 L2。下面介绍 onesmash 维护的兄弟插件 dsh-reflex,它与 ds-bot 同进程并存,不修改 ds-bot 源码。

这是什么

dsh-reflex 是 DeepSeek Harness(DSH)的 cordis 插件:L0 事实层 + L1 本地决策层(默认 SemIf,可选 Jev)+ L2 事件驱动唤醒 ds-bot 里的 Bot。仓库:github.com/onesmash/dsh-reflex;社区目录页:skillhub.cn/plugins/onesmash/dsh-reflex。许可证 MIT,当前包版本 0.3.16(以 package.json 为准)。

核心功能:三层分工

层 职责 成本 实现要点
L0 采集事实,落盘成可追溯时间线 极低 脚本驱动,自动发现 collectors/*.sh
L1 判断「这条值不值得占用 L2 注意力」 极低(本地决策模型,一次前向,SemIf 约 0.3 秒、不联网) 脚本驱动,自动发现 targets/*.sh
L2 真正需要判断「要不要打扰人、以什么形式」 高 唤醒 ds-bot 中的 Bot(如 Chief)

L1 命中后交给 L2 的是结构化通知;是否打扰、以什么形式,由 L2 决定。与 ds-bot 的关系:通过 cordis.patch.yml 以 insert 挂载,拿到 sessionController 用于投递;初始化失败会降级为日志,不拖垮宿主。

内置采集源示例包括 disk、swap;内置判定目标示例包括 disk。插件仓库不包含你的 collectors/、targets/、tools/——这三样落在运行目录(默认 ~/.dsh/dsh-reflex/),契约见仓库 DATASOURCE.md。随包还有 reflex-tuning skill,用于 shadow 记录、历史回放、阈值拟合等调优闭环(见 README 与 docs/threshold-fitting.md)。

安装与启用

DSH 生态里插件通过 profile 安装;社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,安装前建议自行查看源码与许可证——插件以当前 dsh 进程权限运行。

1、安装到指定 profile(命令来自官方 README):

dsh plugin --profile <你的 profile> add github:onesmash/dsh-reflex

dsh plugin 会把包装进 profile,并根据 package.json 里的 dsh.bundle 把 dsh-reflex 写入该 profile 的 dsh.profile.bundles。

2、不启动进程,先确认 bundle 已生效:

dsh --profile <你的 profile> --dump-config    # 应出现 "# == dsh-reflex"

3、在同一 profile 的 cordis.patch.yml 里配置插件块,例如:

- id: dsh-reflex
  config:
    l0:
      sources: [disk, swap]        # 启用哪些采集源
    l1:
      targets: [disk]              # 启用哪些判定目标
      targetBot: Chief             # 唤醒哪个 Bot
      quietHours: { from: '18:00', to: '09:00' }

重启 DSH 后,日志中可能出现类似:

dsh-reflex installed: L0=60000ms L1=60000ms target="Chief" sources=[disk,swap] targets=[disk,x-timeline]

collectors/、targets/ 下的脚本落盘即热发现启用;<name>.paused 或删文件即退出,无需在 YAML 里逐项声明脚本 target。

本地改插件源码时,可用路径安装(pnpm 符号链接),并在 checkout 内单独 pnpm install——详见 README「本地开发」一节。

典型配置项

全部项可在 profile patch 的 dsh-reflex.config 下覆盖。常用默认值如下(摘自 README 配置表):

项 默认 说明
l0.intervalMs 60000 采集周期
l0.sources [disk] 内置源;扩展靠 collectors/*.sh
l0.homeDir ~/.dsh/dsh-reflex 工作目录;可用 REFLEX_HOME 覆盖
l1.intervalMs 60000 判定周期
l1.threshold 0.8 本地模型打分阈值
l1.hardRule {lowAvailableGB:20, highUsedPct:90} 硬规则,可穿透安静时段
l1.targetBot Chief L1 命中后唤醒的 Bot
l1.cooldownMs 1800000 同状态冷却,避免重复唤醒
l1.quietHours null 安静时段内内容类命中可攒到时段结束合并

l1.backend 可在本地 SemIf(默认)与托管 Jev 之间切换;适配在 tools/semif-adapt.py(运行目录侧,非仓库内置)。

运行目录结构示意:

~/.dsh/dsh-reflex/
├── collectors/     <name>.sh → 采集源(可选 <name>.env.json)
├── targets/          <name>.sh → 判定目标
├── tools/
├── facts/            L0 原始事实
└── dsh-reflex.log

适用场景与注意

适合已经使用 ds-bot、又希望用脚本接监控/时间线等数据源、且不想每次采集都调用大模型的 DSH 用户。L1 负责挡掉绝大多数「不值得」的候选;磁盘类硬规则可在 quiet hours 仍触发。

注意:依赖 ds-bot 同进程与 cordis 挂载方式;无 ds-bot 时 L2 唤醒路径无意义。SemIf/Jev 与随包 skill/ 下的第三方快照为 seed-only,本地已有版本不会被降级。调阈值不要拍脑袋,可走随包的 reflex-tuning 闭环。

结尾

dsh-reflex 把「反射」放在 L0/L1:便宜层一直跑,贵层只在必要时被叫醒。进一步了解可打开 SkillHub 目录页 与 GitHub 仓库 README。

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

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

小夜