dsh-context-window:为每个 DSH 对话单独设定上下文窗口

前言

在 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 开始走压缩流程,其它对话与模型默认配置不受影响。

核心功能

下面介绍已写在 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

面板内可:

  1. 用对数刻度滑块在 16K~2M 间预览(拖动不提交,点「应用」或数字框回车才生效)。
  2. 数字输入任意精确值。
  3. 点预设档位:64K / 128K / 256K / 512K / 1M / 2M。
  4. 选「用模型默认」清除覆盖。
  5. 看对比行:模型默认 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)。

典型用法

  1. 安装并重启 dsh web 后,打开目标对话。
  2. 点击输入框右侧「上下文 …」或「ctx …」胶囊,打开面板。
  3. 拖动滑块预览后点「应用」,或输入数字后回车,或点 256K 等预设档位。
  4. 下一条消息起,该对话的 compact 触发线与上下文环分母按新窗口计算;其它对话不变。
  5. 需要恢复模型默认时,在面板选择「用模型默认」(对应日志里的 context-window/clear)。

适用场景与注意

适合谁

  • 需要在单条对话上提前或推迟自动压缩,而不想改全局 compaction-basic 或 settings.yaml 里模型窗口的开发者。
  • 同时依赖 DSH 上下文用量环观察余量的 web 用户(环分母会随会话覆盖变化)。

安装前注意

DSH 插件在当前 dsh 进程权限下运行,安装前请自行阅读仓库源码与 MIT 许可证,确认行为符合你的环境与合规要求。SkillHub 上的插件目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-context-window 解决的是「压缩阈值只能全局跟模型走」的空档:会话级 contextWindow 覆盖、日志持久化、compact 与 UI 环同步,且不动核心 settings。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。

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

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

Xiaoye