前言¶
在 DeepSeek Harness(DSH)里跑长对话时,自动压缩(compact)何时触发,取决于上下文窗口大小和阈值比例。窗口默认值来自 adapter 的 model catalog,写在 settings.yaml 侧;阈值比例则多半由 compaction-basic 全局或按 provider+model 配置。结果是:同一个 1M 窗口的模型,所有对话共享「前 800K 都不压缩」这条线——短对话被长历史拖着走,token 白白消耗;若希望某条对话早点压缩,改全局配置又会牵连其它会话。
维护者 qq-24 的插件 dsh-context-window(分类:记忆)补的是会话级一层:不改 settings.yaml 里的模型配置,只在会话日志里存覆盖值,切换对话、重开 DSH、导出导入都保留,删对话即消失,并且即时改变该对话的自动 compact 触发线与界面上下文环。
这是什么¶
dsh-context-window 给 DSH 的每个对话一个独立的上下文窗口覆盖。压缩判定使用的算式为:
thresholdTokens = floor(contextWindow × thresholdRatio)
其中 thresholdRatio 仍由 compaction-basic 决定(默认 0.8);本插件改的是当前会话参与计算的 contextWindow。例如把某对话从 1M 调到 256K,该对话会在约 256K × 0.8 ≈ 205K 开始走压缩流程,其它对话与模型默认配置不受影响。
- 目录页:https://www.skillhub.cn/plugins/qq-24/dsh-context-window
- 源码:https://github.com/qq-24/dsh-context-window
- 许可证:MIT(见仓库
package.json) - 当前 package 版本:1.0.0
核心功能¶
下面介绍已写在 README 与实现说明中的能力,均可对照仓库文档核对。
会话级覆盖,不动全局 settings¶
覆盖值写入会话日志,不修改 settings.yaml。模型默认值始终是 adapter 那份;用户可随时「用模型默认」清除覆盖。值随会话走:重开、fork、导出导入都带着;删除对话后不留孤儿文件。
持久化使用插件自定义事件(核心允许 merge-extensible 的事件类型):
| 事件 | 负载 | 含义 |
|---|---|---|
context-window/set |
{ window: number } |
该会话的自定义窗口 |
context-window/clear |
{} |
清除覆盖 |
即时影响 compact 与界面上下文环¶
只改压缩判定或只改界面分母,会出现「线动了但环不动」的错觉。本插件通过两条路径同时接入:在 agent/pre-step 链上用 AsyncLocalStorage 包装 llm.resolveModelInfo,让 compaction-basic 读到会话覆盖;并 patch 会话的 requestContext() 读与 append 写,使 request/context 里的 contextWindow 与设定一致,token-meter 的环分母同步更新。压缩动作仍由官方 compaction-basic 执行,本插件只提供窗口值。
Web 侧调节 UI¶
入口在输入框右侧胶囊:
| 形态 | 用模型默认 | 有会话覆盖 |
|---|---|---|
| 桌面(>640px) | 上下文 默认 1.0M |
上下文 256K |
| 手机(≤640px) | ctx 1.0M |
ctx 256K |
面板内可:
- 用对数刻度滑块在 16K~2M 间预览(拖动不提交,点「应用」或数字框回车才生效)。
- 数字输入任意精确值。
- 点预设档位:64K / 128K / 256K / 512K / 1M / 2M。
- 选「用模型默认」清除覆盖。
- 看对比行:
模型默认 X · 模型名 · 当前 Y;超过模型默认时 UI 标黄。
UI 使用 DSH 语义色变量(--dsw-alias-*),深浅色随宿主主题切换,无需插件单独配置。手机端(≤640px)同一入口改为底部抽屉,避让 safe-area-inset-bottom。
设计边界(使用前宜知)¶
- 不钳制、仅提示:允许把窗口设得比模型真实容量更大或更小;插件不在服务端替用户猜容量。
- 调高超过真实窗口会撞墙:
contextWindow也用于request/context与溢出检测。设得比真实容量大时,压缩可能长期不触发,直到 provider 返回上下文超限错误;README 在 UI 中给了显式警告。 - 达到
floor(contextWindow × thresholdRatio)是 compact 的必要条件,官方引擎还需可压缩的历史前缀等条件;首次 compact 可能晚于名义阈值,不能只凭环上整数判断。
安装与启用¶
要求:DSH ≥ 0.1.2-rc.1,Node ≥ 22。
安装命令(来自 README 原文):
dsh plugin --profile web add github:qq-24/dsh-context-window
然后重启 dsh web(宿主侧代码不热载),重启后刷新页面即可。插件面向 web profile(package.json 中 dsh.client.platform 为 web)。
典型用法¶
- 安装并重启 dsh web 后,打开目标对话。
- 点击输入框右侧「上下文 …」或「ctx …」胶囊,打开面板。
- 拖动滑块预览后点「应用」,或输入数字后回车,或点 256K 等预设档位。
- 下一条消息起,该对话的 compact 触发线与上下文环分母按新窗口计算;其它对话不变。
- 需要恢复模型默认时,在面板选择「用模型默认」(对应日志里的
context-window/clear)。
适用场景与注意¶
适合谁
- 需要在单条对话上提前或推迟自动压缩,而不想改全局
compaction-basic或settings.yaml里模型窗口的开发者。 - 同时依赖 DSH 上下文用量环观察余量的 web 用户(环分母会随会话覆盖变化)。
安装前注意
DSH 插件在当前 dsh 进程权限下运行,安装前请自行阅读仓库源码与 MIT 许可证,确认行为符合你的环境与合规要求。SkillHub 上的插件目录为社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-context-window 解决的是「压缩阈值只能全局跟模型走」的空档:会话级 contextWindow 覆盖、日志持久化、compact 与 UI 环同步,且不动核心 settings。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。