dsh-compact-arsenal:可配置的三段式上下文压缩

前言

在 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 仓库。

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

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

小夜