前言¶
在 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。