前言¶
DeepSeek Harness(DSH)采用插件化架构,这为扩展功能提供了便利。但在实际使用中,随着对话轮次的增加,历史记录中冗长的工具输出、大型代码块或 XML 结构会迅速占用上下文窗口,导致 Token 消耗过高。
dsh-shake 是一个第三方 Host 插件,用于手动减少上下文使用。它通过将旧工具输出和大型代码/XML 块替换为短占位符来释放空间,并支持通过 shake_read 工具在需要时恢复原始文本。
核心功能¶
该插件主要提供以下能力:
* 占位符替换:自动识别并替换符合条件的历史文本为短占位符。
* 上下文保护:默认保护最近 4000 tokens 的历史记录,防止过早清理关键上下文。
* 内容恢复:通过 shake_read 工具读取被替换的原始文本片段。
* 灵活配置:可自定义清理阈值(如代码块最小长度)。
安装与启用¶
在安装前,请确保环境已初始化 DSH Web Profile。
- 确认 DSH 版本:
dsh --version
- 安装插件:
dsh plugin --profile web add dsh-shake@latest --ignore-scripts
- 检查配置输出,确认包含
dsh-shake。 - 重启 Web 服务使配置生效:
dsh web
使用方法¶
插件的使用分为“调度清理”和“恢复文本”两个步骤。
调度清理¶
- 等待当前会话处于空闲状态。
- 在 Web 界面的消息输入框发送:
/shake
- 系统确认后,清理请求已保存。此时不会立即调用模型,也不会立即减少上下文。
- 发送下一条正常消息。DSH 会在发送给模型请求之前,执行清理操作并替换 eligible 文本。
取消清理¶
如果需要取消当前待处理的清理请求:
/shake cancel
注意:取消只能针对未执行的请求,已执行的替换无法撤销。
清理范围¶
插件默认从最新的历史记录向前回溯,保护最近 4000 tokens。超过此边界的消息会被完整保留。
在此边界内,只有满足以下条件的内容才会被替换:
- 工具结果:单个结果的总文本量需达到 1000 tokens 以上。
- 助手回复:单个 fenced 代码块或 XML 块需达到 400 tokens 以上。
以下内容不会被清理:
* 用户、系统及开发者消息。
* 错误工具结果。
* 包含图片、思考(thinking)或非文本块的消息。
* 普通长段落文本。
配置参数¶
默认配置已能满足大部分需求。如需调整,在对应 Profile 的 cordis.patch.yml 中添加配置覆盖(不要添加第二个插件实例):
- id: dsh-shake
config:
protectedTokens: 4000 # 保护的最近历史 token 数
toolTextMinTokens: 1000 # 工具结果清理的最小 token 数
assistantBlockMinTokens: 400 # 代码块清理的最小 token 数
readDefaultLimit: 2048 # shake_read 默认读取页大小(Unicode code points)
readMaxLimit: 4096 # shake_read 最大读取页大小
重启 DSH 后配置生效。
读取原始文本¶
被替换的文本会保留一个包含 ref 的占位符。模型可以通过调用 shake_read 工具来获取原始内容。
工具参数:
* ref: 从占位符中复制的完整引用字符串。
* offset: 当前页的起始偏移量,从 0 开始。
* limit: 每页读取的字符数,最大不超过配置的 readMaxLimit。
响应字段:
* text: 当前页的文本内容。
* offset: 当前偏移量。
* totalLength: 片段总长度。
* nextOffset: 下一页的起始偏移量。
* done: 布尔值,表示是否读取完成。
注意:
* shake_read 只能读取实际被移除的片段。
* 偏移量和长度以 Unicode code points 计数,而非字节或 UTF-16 长度。
* 文件路径等非 ref 格式参数不被接受。
注意事项¶
- 第三方插件:dsh-shake 由社区维护,非 DeepSeek 官方产品。
- 无摘要生成:插件不生成摘要,也不删除原始日志,仅做占位符替换。
- 执行时机:
/shake仅调度清理,实际替换发生在下一个模型请求前。 - 权限限制:插件以当前 DSH 进程权限运行,建议安装前检查源码与许可证。
总结¶
dsh-shake 提供了一种灵活、可控的方式来管理长对话的上下文大小。对于需要保留特定长代码片段或工具日志,但又希望压缩历史记录的开发者来说,这是一个实用的工具。更多细节可参考 GitHub 仓库。