前言¶
在 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,从而:
/compact命令可用,仅手动触发压缩;- 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。
验证与典型用法¶
重启后开任意会话:
- 输入
/compact,应能执行压缩,或提示「没有可压缩的历史」(同样说明命令已挂载)。 - 若命令面板没有
/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 目录页。