前言¶
在 DSH 里跑长会话——多轮任务、反复改文件、反复跑测试——上下文窗口迟早会被历史消息占满。表现通常是模型开始遗忘早期约束,或者触发上下文告警。靠人工压缩不现实,靠模型自己「忘记」也不可控。
dsh-Context-Drawer 把这件事做成一个确定的小工具:只在上下文到达阈值时,先把更早的消息归档到磁盘上一个与本次会话关联的文件夹,落盘成功后再从模型可见上下文里释放最旧的已结束轮次。聊天记录原文和会话追加日志全程不动。
下面介绍它的定位、行为、配置和安装方式。
这是什么¶
dsh-Context-Drawer 是 yue7ye 维护的 DeepSeek Harness(DSH)插件,版本 0.1.0,MIT License。它只做一件事:当对话上下文达到阈值(默认 50% 的模型窗口)时,将更早的消息追加写入「与该会话关联的文件夹」,随后把最旧的已结束轮次从模型可见上下文中移除。它没有界面、没有按钮、不写记忆、不做 prompt 注入,也不修改聊天记录和追加式会话日志。
在社区插件目录中,它被归入「记忆」分类。但从功能看,它更像一个上下文管理插件:真正被调整的只有「模型能看到的上下文」,磁盘存档和会话日志保持完整。
DSH 的理念是「一切皆插件」,插件由第三方维护。本文提到的目录页是独立社区站点,与 DeepSeek / 幻方无官方从属关系,不是官方应用商店。
核心功能¶
插件在每一轮对话的第一步估算上下文占用:优先使用 provider 返回的真实用量,没有则用字符估算。当占用达到模型窗口的 thresholdRatio(默认 0.5)时,执行归档与释放。
1、把「上一个存档水位之后」的新消息追加到 {archiveDir}/{sessionShort}/{date}.md,先 fsync 确保落盘;
2、文件安全写入磁盘后,才通过表面层的 replace 事件,把最旧的已结束轮次从模型可见上下文中移除。
释放有三条约束:
- 最近
keepRecentTurns轮(默认 6)永远保留; - 单次最多释放
releaseMaxTurns轮(默认 40); - 释放到接近
releaseTargetRatio(默认 0.45)即停止。
存档是纯文本 Markdown,随时可以打开查看。会话日志和聊天记录保持完整:被释放的部分只是对模型不可见,磁盘上的存档始终有它。
状态写在 ~/.dsh/context-drawer/state/state.json,每个会话一条水位记录,用于防止重复归档。
默认存档路径:
~/上下文存档/{sessionShort}/{YYYY-MM-DD}.md
sessionShort 是会话 id 去掉 session- 前缀后的前 8 个字符。一个会话一个子文件夹,因此可以随时分辨某个文件属于哪次对话。
安装与启用¶
官方提供两种方式。一种是从 DSH 插件市场搜索 dsh-Context-Drawer 安装;另一种是用命令:
dsh plugin --profile <profile> add dsh-context-drawer
命令中的 <profile> 需要替换成实际使用的 profile 名称。插件要求 DSH 版本不低于 0.2.0-rc.2(见 engines 字段),安装前可先确认当前环境版本。
启用后插件通过 bundle patch 注入,配置写在 cordis.patch.yml:
- insert:
- id: context-drawer
name: dsh-context-drawer
config:
archiveDir: C:/deepseek/上下文存档 # optional; default ~/上下文存档
thresholdRatio: 0.5
archiveDir 是可选字段,不填则使用默认的 ~/上下文存档;thresholdRatio 控制触发归档的占用比例。
可配置项¶
除 archiveDir、thresholdRatio 外,cordis.patch.yml 还支持以下可选字段:
thresholdTokens:绝对 token 阈值,配置后按 token 数触发;modelWindow:模型窗口大小,默认1048576;charsPerToken、baselineTokens:字符估算参数;keepRecentTurns:始终保留的最近轮数,默认6;releaseMaxTurns:单次最多释放轮数,默认40;releaseTargetRatio:释放目标比例,默认0.45;format:存档格式,可选md、jsonl、txt;includeRoles:归档时包含的角色;minTextLength、maxEntryChars:文本长度过滤;timeZone:时间戳时区,默认Asia/Shanghai;stateDir:状态目录。
插件没有独立文档,字段含义以源码为准。
典型用法¶
仓库自带一个离线测试脚本,可以用来复现归档与释放流程。进入插件目录执行:
node test.mjs
README 描述的测试用例是:离线 mock 会话包含 10 个已结束轮次 → 触发阈值 → 归档 20 条消息并释放 8 个轮次 → 第二次触发只追加新增消息 → 非第一步和低占用时不做任何操作。
适用场景与注意¶
适合需要在长会话中持续工作、又希望保留完整会话历史的 DSH 使用者:归档发生在磁盘,聊天记录原文不受影响,之后可以按需打开存档文件查看。
注意事项:
- 插件以当前 DSH 进程权限运行,具备读写存档目录和修改模型可见上下文的能力,安装前应检查源码与许可证(MIT)后再启用;
- 它只释放「已结束」的轮次,当前正在进行的轮次不会被归档;
- 触发条件是阈值,实际释放量由
keepRecentTurns、releaseMaxTurns、releaseTargetRatio共同约束; - 需要 DSH 版本
>= 0.2.0-rc.2。
结尾¶
dsh-Context-Drawer 的价值在于把「上下文满了怎么办」变成一次确定的落盘与释放,而不是让模型在长会话里逐渐丢失早期信息。目录页:https://www.skillhub.cn/plugins/yue7ye/dsh-Context-Drawer;源码:https://github.com/yue7ye/dsh-Context-Drawer。