dsh-auto-compact:空闲时按阈值自动压缩 DSH 会话历史

前言

DeepSeek Harness(DSH)把能力拆成可挂载的插件;长会话里上下文占用会一路涨,首 token 变慢、请求变贵,再聊几轮还容易顶到模型窗口上限。宿主自带的自动压缩多在「回合进行中、接近默认 80% 阈值」才触发;回合结束后上下文常停在 60%~80%,你暂时不输入,下一句话仍要带着整段旧历史进请求。

下面介绍社区插件 dsh-auto-compact(维护者 fpm0312,分类:记忆):在会话已静默、且占用超过可配置比例时,后台把可压缩历史压成 checkpoint,等你回来上下文更干净。压缩摘要本身交给官方 @deepseek-ai/dsh-compaction-basic 链路(经 /compact),插件只决定「什么时候压」。

这是什么

dsh-auto-compact 是 DSH 宿主侧插件:当某个存活会话的上下文占用超过阈值(默认 30%),且对话在设定时间内没有动静(默认 3 分钟),即触发一次自动压缩。阈值、静默时长、巡检间隔、冷却时间等均可配置;运行时零 @deepseek-ai/* 依赖,安装为 tgz 后不必解析宿主 peer 依赖。

与内置「跑回合时顶阈值再压」的行为互补:本插件只在 agent 空闲时介入,不和进行中的回合抢状态。

判定规则与核心行为

每个巡检周期(默认 15s)对每个存活会话依次检查,全部满足才尝试压缩:

  1. agent.status === "idle" — 回合进行中绝不压缩。
  2. 静默时间 ≥ idleMs — 会话日志事件、agent 状态变化、收件箱投递都会刷新「最后活跃时间」。
  3. 上下文占用 ≥ thresholdRatio — 优先读 token-meter 的上下文投影(与界面百分比同源);拿不到再退回 measure().totalTokens 估算。
  4. 距离上次尝试 ≥ cooldownMs — 成功、失败、跳过都计入冷却,避免反复调模型。
  5. 该会话当前不在压缩中 — 单会话同时只允许一次自动压缩。

命中后走官方压缩链路;压缩产生的事件会刷新活跃时间,不会连环触发。

安装与启用

插件以当前 dsh 进程权限运行,安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。社区目录页:SkillHub 插件页(独立站点,与 DeepSeek / 幻方无官方从属关系)。

从 tgz 安装(README 推荐写法)

dsh plugin --profile desktop add file:C:/Plugins/dsh-auto-compact-0.1.0.tgz

路径按你本机实际 tgz 位置修改。

从源码打包后安装

git clone https://github.com/fpm0312/dsh-auto-compact.git
cd dsh-auto-compact
npm pack
dsh plugin --profile desktop add "file:$PWD/dsh-auto-compact-0.1.2.tgz"

PowerShell 最后一行:

dsh plugin --profile desktop add "file:$((Get-Location).Path)\dsh-auto-compact-0.1.2.tgz"

开发调试可用 link: 挂目录(改动免重装,需重启应用让宿主重新 import):

dsh plugin --profile desktop add "link:$PWD"

手工挂载

  1. 在 ~/.dsh/profiles/desktop/package.json 的依赖里加入本包(示例:"dsh-auto-compact": "file:C:/Plugins/dsh-auto-compact-0.1.0.tgz")。
  2. 在同一文件的 dsh.profile.bundles 里追加 "dsh-auto-compact"。
  3. 在 profile 目录执行 pnpm install。

包内自带 cordis.patch.yml(dsh.bundle.patch),安装后会把 auto-compact 插入配置树,一般不必手改 cordis.patch.yml。桌面端 profile 监听会在 package.json / patch 变化时热重载;否则重启一次应用即可。

配置

写在插件行的 config 段(profile 的 cordis.patch.yml 或等价覆盖):

- id: auto-compact
  name: dsh-auto-compact
  config:
    thresholdRatio: 0.30     # 上下文占用阈值(占模型上下文窗口比例)
    idleMs: 180000           # 静默多久算「没动静」(毫秒)
    pollMs: 15000            # 巡检间隔(毫秒)
    cooldownMs: 300000       # 两次尝试之间的最小间隔(毫秒)
    minTokens: 0             # 低于这个绝对 token 数不压缩
    compactTimeoutMs: 600000 # 单次压缩超时
    dryRun: false            # true = 只记录「本该压缩」,不真的压
    statusFile: true         # 心跳状态文件;false 关闭,或给绝对路径
    via: auto                # auto | service | command
    verbose: true            # 是否输出 info 日志

via:如何调到压缩后端

压缩后端挂在每个 agent preset 的隔离作用域,宿主平面拿不到 ctx.compaction。插件按顺序选通道:

  1. service:agent.ctx.get("compaction") 可用则调 compactNow()。
  2. command:否则执行内置 /compact — 与会话日志里可见的 command/run、command/done 同源。

auto(默认)先试 1 再退 2;service / command 可强制只走一条。

典型用法与可观测性

命令(当前会话)

  • /autocompact — 查看占用与判定情况。
  • /autocompact now — 立即评估一次(跳过静默等待,仍受阈值与冷却约束)。

心跳文件

默认 ~/.dsh/auto-compact.status.json,每次巡检后刷新;含各会话的 totalTokens、contextWindow、ratio、reason、lastAction,便于判断「这次为什么没压」。

日志

[auto-compact] 前缀;info 汇报压缩结果,warn 汇报故障;agent 忙或被取消等竞争情况记 info。

适用场景与注意

适合长时间挂着、回合结束后上下文仍偏高、希望趁空闲把历史收成 checkpoint 的桌面 DSH 用户。若希望更早开始「空闲压缩」,可把 thresholdRatio 从默认 0.30 调高或调低,按你对首包体积与压缩频次的权衡来设。

务必知晓:

  • 只对空闲会话生效;回合进行中的压力压缩仍由 compaction-basic 默认阈值(约 80%)处理,两者不冲突。
  • 压缩会真实调用模型做摘要,会计费;cooldownMs 用于限制尝试频率。
  • profile 未挂载任何压缩后端时,/compact 不存在,插件会报 missing 并在心跳文件留痕,不会静默失败。
  • 插件随 dsh 进程权限运行;安装与配置变更前请核对源码与许可证。

结尾

dsh-auto-compact 补上「空闲期」自动压缩:占用过线且静默够久,后台压历史,回来再聊时上下文更轻。决策在插件,摘要在官方 compaction 链路。

  • 目录页:https://www.skillhub.cn/plugins/fpm0312/dsh-auto-compact
  • 源码与文档:https://github.com/fpm0312/dsh-auto-compact
羽毛球分组比赛记分
小程序二维码

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

Xiaoye