dsh-ctx-trim:会话头部一键手动压缩上下文

前言

长会话跑上一段时间,上下文很容易涨到二十几万 token。DSH 自带的自动压缩只会把最后那条消息留下,前面的内容全丢。你想自己决定「切到哪一轮、留多少原文」,却又找不到入口。dsh-ctx-trim 就是补这个入口的:它会在会话标题右边加一个「上下文」按钮,点一下弹两档压缩,摘要在本地完成,不调模型。

这是什么

dsh-ctx-trim 是一个 DSH 客户端插件,维护者是 AlexSh1ne。它解决的问题很单一:在不打断流程的前提下,让开发者手动选定一种压缩力度,把会话头部的上下文换成本地摘要。它针对的是「自动压缩太粗暴且没有控制权」的场景,不是通用的会话管理工具。

核心功能:两档压缩

按钮点开后面板里显示两行数字,对应两个档位:

档位 保留 下限 多余的动作
正常压缩 最近 30% token 的原文 至少 6k —
深度压缩 最近 10% token 的原文 至少 2.5k 切下的原文打包进 ~/.dsh/im/ctxpacks/

切点两端都落在结构边界上:不切在工具调用中间,也不切在压缩标记中间。所以压完的会话仍然是一条合法的对话。

摘要从哪来:本地摘要不调模型

摘要按下面的顺序取:

1、优先用同 profile 里 dsh-live-compact/plan.js 的本地摘要器,装了这个插件就用它,没装就跳过;
2、都没有时用内置摘录:每条只留开头,并保留硬性条款行。

全程不调用模型,因此不产生费用,也不需要等生成。还有一个保护:如果摘要算出来比切掉的原文还大,这次直接放弃不落盘,宁可不动,也不写一条更长的上下文。

它怎么保证「空闲才能压」

插件走的是 DSH 公开的压缩事务:

compaction/start → compaction/summary → user/message(replace) → compaction/end → flush

外层套了 agent.runMaintenance,跟正在跑的回合互斥。所以当你点击按钮时如果这一轮还没结束,它会明确提示会话正在跑、等这一轮结束再压,不会把日志写坏。

安装与启用

用官方安装命令,不要 npm i dsh-ctx-trim 装进普通项目:

dsh plugin --profile <你的profile> add dsh-ctx-trim

装完刷新页面,会话标题右边就会出现「上下文」按钮。

直接用 npm 从普通项目安装会踩坑,它会去解析 @deepseek-ai/* 的 peer 依赖,撞出一串 ERESOLVE。所有 DSH 插件的入口都是 dsh plugin add,插件市场也走这条。

典型用法

点按钮 → 面板里看两行数字 → 点其中一档 → 等它跑完。没有额外配置项,保留比例是写死的两档。

插件还挂了两个路由,客户端在用,你也可以自己 curl:

# 看一眼这个会话现在多少条、两档各会切多少
curl "http://<host>:<port>/dsh-ctx-trim/status?sessionId=session-xxx"

先试跑、不落盘,看会切多少、摘要多大:

curl -X POST http://<host>:<port>/dsh-ctx-trim/run \
  -H 'content-type: application/json' \
  -d '{"sessionId":"session-xxx","mode":"normal","dry":true}'

确认没问题再真压:

curl -X POST http://<host>:<port>/dsh-ctx-trim/run \
  -H 'content-type: application/json' \
  -d '{"sessionId":"session-xxx","mode":"deep"}'

接口只收 application/json,浏览器从别的站发来的跨站请求(带 sec-fetch-site: cross-site)直接 403。

适用场景与限制

适合需要在长会话里自己控制保留范围的 DSH 开发者,尤其是不想依赖自动压缩、希望保留最近一段原文的人。

它有几个明确限制,用之前要知道:

  • 只在会话空闲时能压,回合进行中会被拒绝,这是故意的;
  • 没有撤销按钮,被折叠的原文还在 session log 里,但界面上看不见了;
  • 只有 Web 端有按钮;
  • 保留比例是写死的两档,暂不支持自定义;
  • 没有用 ctx.compaction.compactRegion,它写死 owner:'current-turn',空闲会话上必抛 no open turn。

安全方面要注意:路由不做身份校验(它拿不到 GUI 的登录态),只挡跨站。也就是说,谁能连上宿主端口、又知道某个会话的 id,谁就能压那个会话。别把 DSH 端口暴露到不受信任的网络,需要外网访问就在前面用 --trusted-host 那一套加一层。另外,插件以当前 dsh 进程权限运行,安装前应先检查源码与许可证。

兼容与已知实测

  • DSH >=0.2.0-rc.2 <0.3.0-0
  • Node >=22.13.0
  • 许可:MIT
  • 已在 DSH 0.2.1-rc.5 + Web profile 上实测:353 条 / 263k token 压到 194 条 / 127.8k token。

结尾

dsh-ctx-trim 的价值不在于压缩算法多新,而在于给了你一个入口:手动选一档,摘要在本地生成,切点落在结构边界上。如果你在长会话里受够了自动压缩把历史清空,值得装一个试试。目录页见 https://www.skillhub.cn/plugins/AlexSh1ne/dsh-ctx-trim,源码见 https://github.com/AlexSh1ne/dsh-ctx-trim。

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

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

小夜