manualcompact-billion:与 billion-context 共存时恢复 DSH 原生 /compact

前言

在 DeepSeek Harness(DSH)里,长会话往往要靠压缩把上下文收进可管理的范围。DSH 自带手动压缩命令 /compact,也有可选的自动压缩后端。社区插件 billion-context 走另一套自动压缩方案;装上之后,原生 /compact 会从命令面板里消失——这不是偶然 bug,而是其配套 gate 在配置解析阶段把 DSH 的两个压缩相关包标成禁用。

部分场景下 billion 自己的压缩并不生效(例如非标准线路、拦截未命中),此时既没有 billion 的自动压,也没有 DSH 的手动压,会话容易顶满上下文。下面介绍维护者 k-ying 发布的 manualcompact-billion:在不动 billion 自动压缩的前提下,把 DSH 原生手动 /compact 和压缩后端重新挂回来,并把后端钉在「只手动、不自动」。

这是什么

manualcompact-billion 是 DSH 社区插件,归类为模型推理相关能力。一句话定位:让 DSH 的原生手动 /compact 回来,同时不改动 billion-context 的自动压缩逻辑。

维护者:k-ying。源码与说明见 GitHub 仓库;社区目录页:SkillHub 插件页(独立站点,与 DeepSeek / 幻方无官方从属关系)。

它解决什么问题

安装 billion-context 后,bili-compaction-gate 会在配置 waterfall 里把下列包设为 disabled: true:

  • @deepseek-ai/dsh-compaction-basic(压缩后端)
  • @deepseek-ai/dsh-command-compact(/compact 命令)

结果是 DSH 侧两条压缩链路都被关掉。本插件在检测到上述「被 gate 禁用」的配置时,把这两个包改回启用,并对压缩后端设置 config.auto = false,从而:

  1. /compact 命令可用,仅手动触发压缩;
  2. billion-context 仍负责它自己的自动压缩,两者不抢同一套开关。

若配置里没有任何被 gate 禁用的行(例如已卸载 billion),插件原样透传,连 auto 也不改,避免在单独使用 DSH 时误关自动压缩。

工作原理(简述)

DSH 插件配置经 Cordis 的 waterfall(洋葱模型)解析:内层 listener 调用 next() 拿到下游结果,外层可以再改。billion 的 gate 在内层返回「已禁用」;本插件用 { global: true, prepend: true } 注册在最外层,收到「已禁用」后改回「启用 + auto:false」,最终生效的是外层返回值,gate 无感知。

插件只改三类值:两个包的 disabled: true → false,以及后端的 config.auto = false。不修改 billion 的包、代理或 gate,也不注册额外服务。

安装与启用

DSH 按 profile 隔离插件;装错 profile 等于未安装。不确定时先看本机有哪些 profile:

ls ~/.dsh/profiles

命令行 dsh 或浏览器 Web UI 通常用默认 profile web;桌面 Tauri 版常见为 tauri。查看某 profile 已装插件:

dsh plugin --profile web list

配置文件路径示例:~/.dsh/profiles/web/cordis.patch.yml。

从 GitHub 安装(推荐)

dsh plugin --profile web add github:k-ying/manualcompact-billion

web 为 dsh 默认 profile;github:owner/repo 由 dsh 转成真实 Git 地址拉取,cordis.patch.yml 随包挂载。桌面版可将 web 换成 tauri:

dsh plugin --profile tauri add github:k-ying/manualcompact-billion

锁定版本可带 tag(资料中示例为 v0.1.0):

dsh plugin --profile web add github:k-ying/manualcompact-billion#v0.1.0

其他安装方式

本地目录:

dsh plugin --profile web add ~/Documents/AI/manualcompact-billion

或在 profile 的 cordis.patch.yml 手写条目(路径换成你的实际路径):

- id: manualcompact-billion
  name: 'file:///path/to/manualcompact-billion/index.js'

装完后必做

完全退出 dsh 再启动(不是只关窗口)。配置在启动时计算,热改不会重新走 waterfall。

验证与典型用法

重启后开任意会话:

  1. 输入 /compact,应能执行压缩,或提示「没有可压缩的历史」(同样说明命令已挂载)。
  2. 若命令面板没有 /compact,或报「没有压缩后端」,说明未恢复成功。

日志中搜索 manualcompact-billion:,成功加载时会出现自检行,例如:

manualcompact-billion: native compaction restored (command×1, basic×1, groups×2, auto=off)

没有该行,表示插件未加载,或当前配置里没有被 gate 禁用的项。

日常用法即在长会话中按需执行 /compact,与 billion 的自动压缩并行;注意下文「适用场景与注意」中的 resync 与兼容风险。

环境变量开关

环境变量 作用
MANUALCOMPACT_OFF=1 插件完全让位,不修改配置
MANUALCOMPACT_ALLOW_AUTO=1 不强制 auto: false,保留原有自动压缩设置(可能与 billion 争用历史,资料不建议开启)

卸载

dsh plugin --profile tauri remove manualcompact-billion

将 tauri 换成你安装时用的 profile 名。重启即可;无持久副作用。

适用场景与注意

适合谁: 已安装 billion-context,又需要在 DSH 里保留手动 /compact 作为兜底或习惯操作的开发者。

权限与信任: 插件以当前 dsh 进程权限运行,会在配置解析阶段改写压缩相关包的启用状态。安装前应阅读仓库源码与许可证(MIT),自行判断是否接受。

风险与限制(来自上游 README):

  • 行为与 billion 上游「接管后禁止宿主压缩」的假设相反,上游不保证长期兼容。
  • billion 正在压缩时,手动 /compact 会改变会话历史,billion 下次请求可能触发全量 resync,带来额外请求与缓存命中下降,非数据损坏。
  • 不解决「billion 能否压某个供应商」;非标准线路仍可能压不了。
  • 上游改包名或事件名时插件可能静默失效,需更新插件内 BASIC_PACKAGE / COMMAND_PACKAGE 常量。

结尾

manualcompact-billion 补的是「billion 与 DSH 原生压缩二选一」留下的缺口:自动仍由 billion 管,手动 /compact 回到 DSH 侧且固定为不自动压。需要安装命令、原理与开关细节时,以 GitHub README 为准;浏览社区条目可打开 SkillHub 目录页。

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

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

小夜