前言¶
在 DeepSeek Harness(dsh)里跑长会话时,上下文会不断堆叠:整轮对话、助手消息里的 reasoning 块、以及工具返回的超长正文,都会占满窗口并推高调用成本。常见做法是手动删消息或整段放弃历史,既容易打断工具调用与结果的对应关系,也难以区分「该用模型摘要」和「用截断就能省 token」的场景。
dsh-compact-arsenal(压缩工坊)是社区维护者 TacitSay 为 DSH 提供的可配置上下文压缩插件:总压缩、思考压缩、工具输出压缩三个板块各自独立开关、阈值与方法,并在左栏提供「上下文压缩」面板,改完自动保存,无需命令行。设计原则是:能机械解决的先机械解决;需要调用模型的部分由你显式打开。
这是什么¶
插件全名 dsh-compact-arsenal,面向 DeepSeek Harness 宿主;源码与说明见 GitHub,社区目录页见 SkillHub。分类为模型推理相关能力;当前 package 版本为 0.2.0,许可证 MIT。插件以当前 dsh 进程权限运行,安装前建议自行审阅源码与许可证;SkillHub 为独立社区目录,与 DeepSeek / 幻方无官方从属关系。
三个压缩板块¶
下面三个板块互不影响,各自满足「开关打开 + 上下文压力 + 内容量门槛」才会改写。
| 板块 | 对象 | 方式 | 是否调用模型 |
|---|---|---|---|
| 总压缩 | 最旧的若干整轮对话 | 模型写检查点 → 整段替换 | 是 |
| 思考压缩 | 旧轮次助手消息里的 reasoning 块 |
机械截断 / 整块清除 / 模型要点 | 机械模式否 |
| 工具输出压缩 | 旧轮次里超长的 tool/result 正文 |
按字符预算 / 模型要点 | 机械模式否 |
思考压缩不按「单条超过 N 字」触发:模型思考多为短片段散落在大量消息里。插件改为汇总所有「旧轮次、未压过」的碎片总字数,达到默认 15,000 字门槛后再处理;最多 8 条、合计不超过 12,000 字的碎片打包成一次模型调用,返回逐条要点(JSON),原位替换为「头 + 要点 + 尾」;一次触发最多处理 12 条、省下 40,000 字,避免单次花销失控。
左栏面板与配置¶
重启 DSH 后,左栏会出现「上下文压缩」图标。所有板块默认关闭,装上不改变任何行为。
面板提供总开关、各板块开关;压缩方式以卡片呈现,未实现的方式为灰色;参数为数字输入框,修改后约 500 ms 自动保存并热重载。模型方式下,提供方/模型留空即跟随当前会话模型。底部显示本进程已执行次数与省下的字符数。
面板通过本机路由读写配置,写入走官方 ctx.configEditor,与手动改 profile 等价:
| 路由 | 方法 | 作用 |
|---|---|---|
/compact-arsenal/api/state |
GET | 当前生效配置与运行统计 |
/compact-arsenal/api/config |
POST | 保存配置(落到 profile 的 cordis.patch.yml) |
也可直接编辑 profile 的 cordis.patch.yml,例如:
- id: compact-arsenal
name: dsh-compact-arsenal
config:
enabled: true
total:
enabled: true
pressureRatio: 0.8 # 本板块的触发阈值
retainTurns: 2 # 最近的整轮不动
maxInputChars: 60000 # 一次摘要读入的上限
provider: '' # 留空 = 当前会话模型
model: ''
reasoning:
enabled: true
pressureRatio: 0.75
mode: truncate # truncate | clear | model
keepLast: 3 # 最近 3 条助手消息不动
minTotalChars: 15000 # 总量门槛
minChars: 200 # 单项下限
headChars: 600
tailChars: 300
batchChars: 12000
maxItems: 12
model:
provider: ''
model: ''
prompt: '' # 留空 = 内置默认提示词
tools:
enabled: true
mode: truncate
thresholdChars: 8192
keepLast: 2
触发顺序为:本板块开关打开;上下文压力 ≥ 该板块 pressureRatio;目标内容总量 ≥ 该板块 minTotalChars(工具板块用 thresholdChars 作单项预算)。三者都满足才会改写。
安装与启用¶
宿主要求(来自 package.json):Node >=22.19.0,DSH >=0.2.0-rc.2 || >=0.2.1-rc.2;文档中标注与 0.2.1-rc.5 兼容。
安装命令(README 原文):
# GitHub 源(把 web 换成你的 profile 名)
dsh plugin --profile web add "github:TacitSay/dsh-compact-arsenal#main"
# 或本地目录(开发)
dsh plugin --profile web add E:\path\to\dsh-compact-arsenal
安装后重启 DSH,在左栏打开「上下文压缩」,按需开启各板块并选择方式与参数即可;不必先改 YAML,面板与配置文件等价。
模型压缩在消息层的行为¶
以思考压缩为例,一条碎片可能被改写为:
[原开头 600 字]
[... reasoning middle trimmed ...]
<该条的要点>
[... reasoning middle trimmed ...]
[原结尾 300 字]
同一批最多 8 条碎片共用一次模型调用;写回原来那条消息(表层替换),不新增消息、不打乱顺序;原始内容完整保留在会话日志中;已带压缩标记的内容不会再次压缩;模型不可用时自动退回机械头尾截断,不会让当前步骤失败。
安全边界与适用注意¶
插件声明的安全边界包括:不动系统提示词、工具 schema、用户消息、tool-call 参数;总压缩按整轮替换,工具调用与结果成对进出;任何改写失败只记日志,不中断当前步骤;文本按 Unicode 码点切片。
适合需要长时间 Agent 会话、又希望按板块控制「是否花模型钱」的 DSH 用户。总压缩会改写历史整轮,启用前请理解检查点摘要可能丢失细节;模型压缩依赖当前会话或你配置的 provider/model,网络或配额异常时会降级为机械截断。
路线图(README)包括面板内编辑提示词模板、工具白名单图形化、压缩前后 token 差值图表、英文界面等,当前面板文案为中文。
结尾¶
dsh-compact-arsenal 把上下文压缩拆成总压缩、思考压缩、工具输出三条可独立配置的链路,并用左栏面板降低调参成本,与 DSH「一切皆插件」的扩展方式一致。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。