dsh-dialog-fence:不破坏前缀缓存的对话行为围栏

前言

在 DSH(DeepSeek Harness)里跑智能体时,模型每一轮都会「忘掉」你为这次对话定下的规矩。常见补救方式各有代价:把规矩写进系统提示词,内容一变就容易让前缀缓存整体失效;每轮用 user 消息追加规则虽然安全,但几十轮后会吃掉大量 token;依赖压缩插件自带的规则能力时,在部分版本与模式下规则可能只存不注。

下面介绍社区插件 dsh-dialog-fence(维护者 ILoveHAKU):把通用规则与会话专属规则写进一个 JSON 文件,注入到运行时上下文快照里,在不动系统提示词、规则未变化时不重复占 token 的前提下,让约束在下一轮即可生效。适用 dsh CLI(web / headless / acp 等 profile)与 DSH Desktop。

这是什么

dsh-dialog-fence 是一套「对话围栏」:随时增删的行为约束规则,全部落在一个 JSON 文件(默认 <DSH_HOME>/dialog-fence/fence.json),可用编辑器直接改,或在 DSH 设置页、会话浮层里逐条维护。

规则分两层叠加注入:

  1. 通用规则(fence.json 的 rules 数组)——对每个对话都生效,包括新开的对话。
  2. 会话规则(fence.json 的 sessions.<会话 id>.rules)——只作用于某一个对话,可选;通常在会话右上角「围栏」浮层里维护。

插件通过 systemPrompt.context({ name: 'dialog-fence:rules', order: 118 }) 把两层规则拼成文本写入运行时上下文;与 billion-context 压缩可共存(快照头 Current runtime context 会被归为 durable/runtime-context)。总开关关闭,或通用与会话层都为空时,渲染为空串,不产生额外 token。

社区目录页:dsh-dialog-fence @ SkillHub。源码与说明:GitHub - ILoveHAKU/dsh-dialog-fence。当前包版本 0.10.0(以仓库 package.json 为准);声明与 DSH 0.2.0-rc.2 兼容。

核心功能

缓存与上下文行为

  • 不碰系统提示词:历史里只有规则文本变化时的纯 append,不重写前缀。
  • 文本不变则不注入:与上次相同的运行时上下文快照不会每轮再发一条 user 消息。
  • 与其它对话隔离:通用规则为空且当前会话未启用专属规则时,零注入、零副作用。

配置与界面

五处入口读写同一份 fence.json,改完落盘,下一轮装配时生效,无需重启(安装/卸载插件本身仍需完全退出并重启 DSH):

入口 说明
设置左栏 →「对话围栏」 总开关、通用规则可视化编辑、按对话名选择并编辑专属规则、「打开文件夹」「更改位置」
插件 → 已安装 → dsh-dialog-fence 详情页 同上配置区(组合包 plugins.bundle.config 槽位)
会话右上角「围栏」按钮 徽标为真实注入条数(通用 + 本会话);打开浮层编辑本会话与通用规则
规则浮层 多行编辑、启停、增删;点击面板外关闭
设置 → 内置插件 →「对话围栏」标签页 老入口,行为一致

Web / Desktop 才有上述面板;CLI / TUI / headless 无 connection 服务时会跳过 UI 路由,斜杠命令仍可用。

斜杠命令(全形态)

命令 作用
/fence 状态:启用与否、条数、注入文本、token 估算、文件路径
/fence on / /fence off 本会话专属规则启停(不影响通用规则)
/fence add <文本> 追加本会话专属规则
/fence rm <序号> / /fence clear / /fence reset 删条、清空会话规则、删除本会话记录
/fence dir / /fence open / /fence file <路径> 路径、打开文件夹、搬迁围栏文件
/fence switch on / switch off 通用总开关
/fence all 及 all add / all rm / all clear 查看与管理通用规则
/fence help 帮助

也可用环境变量 DIALOG_FENCE_FILE 或 DIALOG_FENCE_HOME 指定文件或基目录;设置页「更改位置」会在原目录留下 location.json 指针。

安装与启用

推荐走官方插件安装器(卡片出现在「已安装」分组,可一键卸载)。0.5.0 起插件以组合包形式安装(dependencies + dsh.profile.bundles + dsh.bundle.patch)。改完安装方式后必须完全退出并重启 DSH(宿主侧不走 dsh-hmr 热重载)。

方式 A:官方安装器(推荐)

图形界面:左侧「插件」→ 右上角「添加插件」→ 在输入框填写本包在本机的绝对路径(示例为 Windows Desktop 默认 harness 目录下的副本路径,请按你机器实际路径填写):

C:\Users\<你>\AppData\Roaming\dsh-desktop\harness\dialog-fence

命令行(profile 为 web 时示例):

dsh plugin --profile web add "C:\Users\<你>\AppData\Roaming\dsh-desktop\harness\dialog-fence"

说明:Desktop 安装后端会把源码目录复制到 generation 快照再 pnpm add;改 harness 里原始目录的源码不会自动反映到已安装副本,需卸载后重装或重跑上述命令。规则数据在 <DSH_HOME>/dialog-fence/,与 generation 无关,升级不丢规则。

方式 B:file:/// 挂载(开发)

在插件仓库根目录执行:

node scripts/install.mjs install

脚本向 <DSH_HOME>/profiles/<profile>/cordis.patch.yml 追加带标记的 file:/// 插入行;改 client.js 刷新即可,改 index.js 需重启。此方式不会出现在「已安装」清单;与方式 A 不要同时使用。切回方式 A 前请先 node scripts/install.mjs uninstall。

验证

重启并开启围栏后,在会话中执行:

/fence status

若下一轮运行时上下文中出现以 Dialog fence (user-set rules binding this conversation; ...) 开头的段落,即表示注入成功。无宿主自检可跑:

node test/smoke.mjs && node test/route.mjs && node test/client.mjs && node test/render.mjs && node test/opensource.mjs

典型用法

直接编辑 fence.json

默认文件 <DSH_HOME>/dialog-fence/fence.json 结构要点:

{
  "version": 3,
  "enabled": true,
  "rules": [
    "结论必须给出可复现证据(命令 / 文件:行号 / 实测输出三者至少其一);给不出就明说「未验证」。"
  ],
  "sessions": {
    "<会话 id>": {
      "enabled": true,
      "rules": ["本会话额外一条约束"]
    }
  }
}

enabled: false 时所有对话零注入,文件内容保留。

面板与命令组合示例

  1. 在设置 →「对话围栏」里为所有对话加通用规则(例如「改文件前先读该文件」)。
  2. 在当前会话点「围栏」,只为本对话追加一条(或用 /fence add 不要执行 destructive git 命令)。
  3. 用 /fence 查看条数与估算 token;临时关掉本会话专属层用 /fence off,不关通用层。

所有 UI 改动下一轮生效;总开关关掉后立刻零注入。

适用场景与注意

适合:需要长期、可版本管理的对话级规矩;希望与前缀缓存、billion-context 压缩并存;希望在 Desktop / Web 里可视化维护,同时在 headless 用 /fence 脚本化。

注意:

  • 插件在当前 dsh 进程权限下运行,安装前请阅读 GitHub 仓库 源码与许可证(仓库含 LICENSE)。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态是「一切皆插件」,安装来源需自行甄别。
  • 需要 Node >= 20.16.0(开发脚本与测试);Desktop 无独立 node 时 README 给出用 Electron 跑 install.mjs 的示例。
  • 本地路径安装是复制而非符号链接;开发迭代优先方式 B,日常使用优先方式 A。

结尾

dsh-dialog-fence 把「每轮都要重新强调的规矩」收敛到一个 JSON、一层运行时上下文注入:系统提示词不动、规则不变就不多占 token、压缩后仍能通过 durable runtime-context 保住最新快照。若你已经在用 DSH 做长对话智能体,值得用 /fence status 和设置里的「对话围栏」试一轮。

  • 目录页:https://www.skillhub.cn/plugins/ILoveHAKU/dsh-dialog-fence
  • GitHub:https://github.com/ILoveHAKU/dsh-dialog-fence
羽毛球分组比赛记分
小程序二维码

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

Xiaoye