用 billion-context-dsh 把 DeepSeek Harness 的上下文压缩交给模型自己

前言

长会话里,模型最先撞上的往往不是任务本身,而是上下文窗口。对话一长,早期的文件路径、决策和报错会被硬截断悄悄丢掉;另一种常见做法是系统到了阈值就自动摘要,摘要写得好不好,模型自己看不见。DeepSeek Harness(DSH)内置了自动压缩后端,思路接近后者:用自动生成的摘要替换一段范围。

billion-context-dsh 走的是另一条路。它把压缩做成模型可调用的工具:由模型决定何时压缩、压缩哪一段,并自己写出摘要。自动策略只 nudge(提醒),不替模型摘要。社区目录把它归在「会话与消息」。需要说明的是,DeepSeek Harness 插件库是独立社区站点,和 DeepSeek / 幻方没有官方从属关系;DSH 官方仓库的核心理念是「一切皆插件」,这个插件是社区移植,不是官方应用商店里的内置件。

本文按社区目录详情页、GitHub 仓库 README / docs/INSTALL.md / package.json,以及 npm 发布页核对后整理:它是什么、装完怎么挂、模型侧有哪些工具。

这是什么

billion-context-dsh 是 DeepSeek Harness 的 CompactionEngine 后端,实现的是 Active Context Pruning(ACP,主动上下文裁剪):给模型一个 compress 工具,让它把一段会话范围写成高保真摘要,同时把关键细节(路径、决策、错误信息)留下来,回收上下文空间。维护者是 Tyan66666,仓库与 npm 包均使用 MIT 许可证,主要语言是 TypeScript,要求 Node.js ≥ 20。

这里的 ACP 不要和 DSH 官方包 @deepseek-ai/dsh-acp 搞混。后者是面向编辑器等客户端的 Agent Client Protocol 桥;本插件的 ACP 来自 opencode-acp 那套「模型决定何时压缩、压缩什么」的设计,压缩内核原样复用 acp-kernel,适配层移植自 billion-context-pi(Pi 编码代理上的同名方案)。仓库说明:内核与 Pi 侧默认行为保持一致,DSH 适配层(会话事件投影、持久化 surface 事务、模型工具、nudge、配置)是本仓库的工作。

版本以仓库和 npm 为准。2026-08-17 查询时,GitHub package.jsonnpm 包 均为 v0.2.2;社区目录页仍写着 v0.1.7,星标也停在 11,而 GitHub 仓库为 20 星。目录页会滞后,安装和能力边界请以仓库 README 为准。插件与 DSH 本身都还在公开测试版,README 明确写了:不要用于工程化 / 生产环境,预期会有破坏性变更。

核心功能

摘要由模型自己写

DSH 内置的自动压缩会再跑一次摘要流程,用生成结果替换一段范围。ACP 不这么做:模型调用 compress 时就把摘要写进去,没有第二次 LLM 摘要调用。仓库把它写成成本上的差异——压缩内容是当前对话模型的产物,而不是另一路静默摘要器。

只提醒,不替模型按下压缩

压力策略在 agent/pre-step 注入 nudge:效率提示、上下文分解、压缩规则,以及一张可压缩范围表(surface seq)。compactIfNeeded 返回 null,也就是自动路径不会自己摘要。是否调用 compress、压哪一段,仍由模型决定。引擎默认把过限 nudge 线放在用量约 70%、紧急 nudge 放在约 85%,刻意低于宿主 compaction-basic 常见的 80% 自动压缩线,让提醒先出现。增长路径还可以在中前期触发:某层 pending ≥ 5 万 token 且较上次检测增长 ≥ 2.25 万 token(这条没有百分比下限)。这些阈值来自仓库 README 与 docs/INSTALL.md,不是实测会话数据。

压缩可恢复,原文还在日志里

DSH 的每次模型请求都从 append-only 会话日志(surface)派生。compress 落地的是持久化 surfaceOp: { op: 'replace' }:模型写的摘要成为 checkpoint 节点,原文仍留在日志中。因此可以:

  • decompress:只读恢复被遮蔽的原文
  • search_context:在块摘要和原文里按关键词查找
  • 重启后从日志重建块账本,不另写旁车文件

引用用的是 surface seq,不需要给每条消息打 m00001 这类标签。范围边界会自动平衡到 tool-call / result 配对点,seq 上带 #callId 片段也可以。

四个模型工具,外加 /acp

默认会在 ctx.tools 注册四个工具,并在命令栏挂 /acp

名称 作用
compress 用模型书写的摘要替换一段 seq 范围;对某块的摘要节点再压一次,就是分层蒸馏(tier 2/3)
decompress 按块恢复原文
search_context 搜索压缩块的摘要与原文
acp_status 看占用、压缩块、可压缩范围、窗口来源
/acp 在命令栏做 status / compress / decompress

分层蒸馏会把 tier 和内核块 id 写进日志,重启后内核状态可以从日志再水合,并继续蒸馏。命令栏的 /acp compress 只做普通 T1 范围压缩;碰到已有压缩块的摘要节点时,源码会拒绝,要求改用 compress 工具做蒸馏。

上下文窗口可以自动探测

modelContextLimit 省略时,会走 agent.ctx.llm.resolveModelInfo 探测模型真实窗口,失败则回退 128000。显式写了这个值就会跳过探测。INSTALL 提醒:分母配小(例如百万窗口模型写成 128K)会让使用率虚高,nudge 过频。

安装与启用

社区目录页给出的安装命令是:

dsh plugin add github:Tyan66666/billion-context-dsh

需要可复现安装时,目录页建议固定 commit:

dsh plugin add github:Tyan66666/billion-context-dsh#<commit>

DSH 官方 CLI 的完整形态是 dsh plugin --profile <profile> add <source>。仓库从 v0.2.0 起声明了 dsh.bundle manifest,README 推荐的一键安装是从 npm 装进 web profile(发布物带预构建的 dist):

dsh plugin --profile web add billion-context-dsh

装完需要重启 dsh,bundle 层在启动时才会组合进去。这一点值得单独说:GitHub 仓库的 .gitignore 忽略了 dist/package.json 也没有 prepare 构建脚本;官方文档也写过,从 git 安装拿到的是源码而不是构建产物。目录页的 github: 命令仍可按原文使用,但若加载失败,优先改用上面的 npm 包名,或先在本地 npm run build 再按 docs/INSTALL.md 的 tarball / symlink 方式挂。

插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前请自己看源码和许可证。

挂上压缩后端

每个 agent 只能有一个上下文管理器。同一 realm 里两个后端同时 provide ctx.compaction 会冲突,所以要先禁用宿主的 compaction-basic,再插入本引擎。仓库推荐全局挂到 host 平面,对 standard / code / minimal / cordis / 自定义预设都生效。编辑 profile 补丁,例如 ~/.dsh/profiles/web/cordis.patch.yml

- id: compaction-basic
  disabled: true

- insert:
    - id: compaction-acp
      name: 'billion-context-dsh'
      config:
        modelContextLimit: 128000   # 可选;省略则自动探测,失败回退 128000

bundle 自带的 cordis.patch.yml 只插入无 config 的默认行。需要改窗口或提示词时,按上面手写组合行。只想在某一个 agent preset 的 compaction realm 里替换默认后端,同样是先 disabled: true,再插入 compaction-acp

INSTALL 还写了一层细节:shipped 预设(standard / code / cordis)内部仍可能带着 realm 级 dsh-compaction-basic 兜底,ACP 的工具和 nudge 可用,但系统自动摘要仍可能在压力过高时触发。若某个模式要完全由模型决定压缩时机,文档的做法是复制该预设,并把副本里 compaction-basicauto 设为 false。shipped 安装本身不可直接改。

可选的 config.prompts 能覆盖 nudge 首句、范围表、系统提示段和四个工具描述。模板用命名占位符(如 {pct}),拼写错误会在引擎启动时抛错,而不是把字面 {pct} 漏进模型上下文。未配置时直接用 acp-kernel 的渲染。

典型用法

下面步骤来自仓库 docs/INSTALL.md 的验证清单和工具约定,可以按原文复现。

1. 确认工具挂上了

新开一个会话,让模型列出可用工具,或看工具目录。应出现 compressdecompresssearch_contextacp_status。也可以直接让模型调用 acp_status,返回块数、已压缩 token、估计占用和窗口来源。

命令栏等价写法:

/acp status

2. 在长会话里压缩一段范围

上下文涨起来之后,模型会按 nudge 里的范围表调用 compress。参数形状是一段或多段 surface seq,外加模型自己写的摘要(源码要求摘要至少 50 个字符):

compress({ content: [{ startSeq, endSeq, summary }] })

成功时文档预期返回类似 Compressed N block(s),会话可见上下文变短,acp_status 的 blocks 增加。命令栏也可以压一段 T1 范围(摘要不要碰到已有压缩块的 checkpoint 节点):

/acp compress <startSeq> <endSeq> <summary...>

3. 恢复和检索

压缩不是删除。需要原文时:

decompress({ blockId })
/acp decompress <blockId>

在块内查找:

search_context({ query })

重启同一会话后,再跑一次 acp_status,块账本应从日志里的 compaction/summary 事件重建出来。

4. 把安装指南交给当前会话

README 还写了一种用法:本仓库本身就跑在 DSH 上,把 docs/INSTALL.md 交给会话里的 agent,让它读指南、看 profile、改组合配置并验证挂载。前提是配置在 ~/.dsh 下,需要批准一次文件权限;装完再让它调用 acp_status 自证。

适用场景与注意事项

适合已经在用 DSH、会话经常跨很多轮工具调用的人:编码智能体、需要反复对照早期报错和文件路径的长任务。它解决的是「窗口满了之后,早期细节被静默丢掉或被另一路摘要器改写」这一类问题,不是把上下文窗口真的扩到无限大。插件名里的 billion 来自上游 ACP 方案的命名,本仓库没有给出 DSH 侧自己的压测数字。

使用前注意这几条:

  1. 测试版。README 要求不要把本插件和 DSH 用于生产;破坏性变更是预期行为。
  2. 同一 realm 不要挂两个压缩后端。冲突对象是 ctx.compaction。全局方案要禁用 host 的 compaction-basic;单模式方案要先处理该 realm 里的 dsh-compaction-basic
  3. shipped 预设可能仍有自动摘要兜底。只插 host 平面时,standard / code / cordis 的 realm 级 basic 仍可能在高压时自动摘要,和「纯模型驱动」不完全一致。
  4. 窗口分母不要配错modelContextLimit 写小了,nudge 会过频。
  5. 权限与来源。插件以当前 dsh 进程权限运行。安装前检查 GitHub 源码和 MIT 许可证;需要可复现环境时固定 commit 或使用已发布的 npm 版本。
  6. 缩写冲突。本文的 ACP 是 Active Context Pruning。DSH 另有 Agent Client Protocol 相关插件,不是同一件事。
  7. 和 Pi 版能力不完全相同。上游 billion-context-pi 还带 acp_delegate 一类委派工具;DSH 这个移植暴露的是压缩四件套和 /acp,不要按 Pi 文档去找委派接口。

小结

billion-context-dsh 把 DSH 的上下文压缩从「系统到点就自动摘要」换成「模型自己决定压什么」。压缩结果是 checkpoint,原文留在 append-only 日志里,可以恢复、可以搜索,重启后账本还能从日志重建。它是社区维护的 MIT 插件,不是 DeepSeek 官方商店应用;和宿主一样仍在测试期,适合先在自己的 profile 里验证,而不是直接铺到生产会话。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/billion-context-dsh/

GitHub:https://github.com/Tyan66666/billion-context-dsh

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

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

小夜