在工具输出进入模型前裁掉冗余 token,保留可恢复内容
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-plugin-db/dsh-context-diet该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0⚪ 扫描:无法判定尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。
- · 取源不可用(Error: github tarball HTTP 404 @ https:
- · api.github.com
- · repos
- · dsh-plugin-db
- · dsh-context-diet
- · tarball)
扫描于 2026/11/1(0 天前)
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
在工具输出进入请求前砍掉面向模型的 token。DeepSeek Harness 全局插件:无损归一化、带标注的重复折叠、可恢复的结构感知裁剪。
README
由 DeepSeek 最新模型翻译生成dsh-context-diet
一个全局 DeepSeek Harness 插件,在工具输出进入模型请求之前就把其中的 token 去掉——既不会删掉模型可能需要的内容,也不会改变模型能做的事。
tests/t0.py::case PASSED
tests/t1.py::case PASSED
…
[... 12235 of 12416 characters omitted by dsh-context-diet; 4 diagnostic lines
retained, middle elided ...]
______________________ test_charge_card_rejects_expired _______________________
src/payments/charge.py:118: in charge_card
E CardExpiredError: card expired 2024-01-31
FAILED tests/test_payments.py::test_charge_card_rejects_expired
[…] …899 tests collected…
(Trimmed 12235 characters. Full normalized result stored at:
/…/session-…
展开完整文档(README 剩余 1 节)
dsh-context-diet
一个全局 DeepSeek Harness 插件,在工具输出进入模型请求之前就把其中的 token 去掉——既不会删掉模型可能需要的内容,也不会改变模型能做的事。
tests/t0.py::case PASSED
tests/t1.py::case PASSED
…
[... 12235 of 12416 characters omitted by dsh-context-diet; 4 diagnostic lines
retained, middle elided ...]
______________________ test_charge_card_rejects_expired _______________________
src/payments/charge.py:118: in charge_card
E CardExpiredError: card expired 2024-01-31
FAILED tests/test_payments.py::test_charge_card_rejects_expired
[…] …899 tests collected…
(Trimmed 12235 characters. Full normalized result stored at:
/…/session-…/bash.txt. Use read with offset/limit, or grep this path.)
它解决的问题
工具结果一旦被记录,就会立刻成为对话的一部分,此后模型在会话的每一步都会重新读它。自带的 dsh-compaction-tool-result-pruner 只在压缩触发条件满足之后才做裁剪,而这么晚才改写结果,会让已经建立的提示词缓存前缀失效——所以晚裁剪既费钱,也省不下多少。
dsh-context-diet 运行在 tools/post-execute,这是注册表把结果固化成 tool/result 事件之前的最后一道瀑布。在这里改写,改动归属于产生它的那次调用:没有缓存前缀要失效,没有第二份副本要对账,也没有持久化编辑要重放。
它去掉什么
1. 无损归一化(默认开启)
把输出还原成终端实际会显示的样子。终端不会为转义序列画出任何字形,所以删掉它不会改变含义。
| 变换 | 示例 | 结果 |
| 转义序列 | \e[31merror\e[0m | error |
| OSC 超链接与标题 | \e]8;;http://x\a link | link |
| 回车覆盖 | 10%\r50%\r100% | 100% |
| 退格擦除 | ab\bc | ac |
| 行尾空白 | a \n | a\n |
| 空行填充 | a\n\n\n\n\nb | a\n\nb |
2. 带标注的压缩(默认开启)
连续至少 repeatThreshold(8)行字节完全相同、且总长至少 repeatMinRunChars(1000)个字符的一段,会被合并成一行,并写明确切的重复次数:
npm warn deprecated inflight@1.0.6: This module is not supported… [x400 identical lines omitted by dsh-context-diet]
只有当标注严格短于它替换掉的那段时,这段才会被折叠,所以这一趟处理绝不会让结果变大。次数被保留下来,因此这段内容可以从标注精确重建,不会有任何东西被悄悄丢掉——这也是这一趟不需要恢复文件的原因。
3. 可恢复、感知结构的裁剪(超过 32,000 个字符时默认开启)
仍然大于 maxInlineChars 的结果会被替换成:
1. 它的头部(headChars),
2. 一个省略标记,写明到底丢掉了多少,
3. 被省略的中间部分里,具有诊断意义的行 —— 错误、失败、异常、断言、栈帧、diff 片段与头部,以及 file:line:col 引用(significantChars),还有
4. 它的尾部(tailChars),
后面跟一条提示,指出一个 spill 文件,里面保存完整的规范化文本,并附上后端自己的检索指引。
盲目截头去尾会无条件丢弃中间部分。保留诊断行能让同样的预算信息量严格更高,而不是更低 —— 在一次 900 个测试的 pytest -v 运行上实测,CardExpiredError、charge.py:118、test_charge_card_rejects_expired 和 1 failed, 899 passed 每一项都能在这个插件下存活,而同样大小的截头去尾会丢掉它们。
为什么质量不受影响
- 没有任何内容在没有记录的情况下被丢弃。 每一次移除,要么是终端从不显示的控制字符,要么是被计数、标注,并原样写入 spill 文件的内容,提示会告诉模型怎么读这个文件。
- read 默认豁免。 文件内容输出按行寻址:重写空行或行尾空白会破坏模型可能回引给编辑器的内容。这与随附的 dsh-spill-policy 一致,它出于同样的原因豁免 read。
- 默认预算保守。 任何低于 32,000 字符 —— 约 8,000 token —— 的结果都完全不动,无损处理除外。
- 它无法改变能力。 它不注册任何工具,不移除任何工具,不修改任何提示词,也不修改任何模型或推理设置。工具 schema、系统提示词和工具目录与不运行它时逐字节相同,所以提示词缓存的行为和以前完全一样。
- 它从不发起模型调用,也从不增加请求。
- 它失败时放行。 任何意外的结构、缺失的服务或抛出的错误,都会原样返回传入的结果,并记录一条警告。verify.mjs 覆盖了每一条这样的路径。
实测效果
在一个合成但贴近真实的、以 bash 为主的语料上(900 个测试的 pytest -v、带 400 条重复弃用警告的 npm install、2,400 行的 cargo build、一个 curl 进度条,以及一个有 3,000 条结果的 find),使用随附默认值:
| 结果 | 之前 | 模型看到 | 移除 |
| pytest -v,埋没的失败 | 48,002 | 12,555 | 74% |
| npm install,400 条重复 | 33,711 | 236 | 99% |
| cargo build,埋没的错误 | 158,997 | 20,218 | 87% |
| curl 进度条 | 4,572 | 61 | 99% |
| 大目录树上的 find | 130,890 | 12,218 | 91% |
| 合计 | 376,172 | 45,288 | 88% |
其中无损层单独贡献了 15%;其余是带标注的压缩和可恢复的裁剪。字符数不是计费 token —— 这些数字仅供参考,/diet 会报告你所在会话的真实数字。
在运行中的 Harness 上验证
两遍处理都通过真实的 tools/post-execute 瀑布流做了实机演练运行中的 dsh web 配置档,使用真实的 dsh-spill-local 后端:
$ for i in $(seq 1 30); do echo "SAME LINE PADDING PADDING PADDING PADDING PADDING"; done
SAME LINE PADDING PADDING PADDING PADDING PADDING [x30 identical lines omitted by dsh-context-diet]
$ awk '… 570 lines with an error at line 285 …'
download asset 0000 of 0570 ================================================
…
[... 31890 of 43967 characters omitted by dsh-context-diet; 1 diagnostic lines retained, middle elided ...]
src/engine/pipeline.rs:204:7 - error TS2345: UNIQUE_BURIED_DIAGNOSTIC_MARKER
[...]
…
download asset 0569 of 0570 ================================================
(Trimmed 31890 characters. Full normalized result stored at:
/…/c1cbcd405966-bash.txt. Use read with offset/limit, or grep this path to search within it.)
43,967 字符的结果送到模型时只剩 12,077 字符(缩小 72%),head/tail 截断会丢掉的诊断行保留了下来,恢复文件也验证过,完整存有原始输出的全部 571 行。
安装
1. install the package into a profile
dsh plugin --profile web add link:/path/to/dsh-context-diet
2. 启用 bundle:Settings → Plugins → Installed → dsh-context-diet → on。
由智能体驱动插件管理器时,用 install_bundle 一步完成这两步。
bundle 会插入一行全局 Host,因此对配置档里的每个会话都生效——不是只对单个会话。它不需要凭据,也不需要其他插件;tools/post-execute 接缝属于 dsh-tools,spill 后端来自 dsh-spill-local,随附的 composition 两者都提供。没有 spill 后端时,插件仍会做规范化和压缩,只是拒绝裁剪,因为没有恢复文件就裁剪会丢信息。
配置
每个字段都可选;省略就沿用随附的默认值。要覆盖其中任何一项,写进配置档自己的 cordis.patch.yml,它会在 bundle 层之后应用,因此插件升级后依然有效:
- id: context-diet
name: 'dsh-context-diet'
config:
maxInlineChars: 64000 # 0 keeps only the lossless and annotated passes
exemptTools: ['read', 'read_image']
repeatThreshold: 12 # only collapse very long identical runs
| 字段 | 默认值 | 含义 |
| normalize | true | 无损处理的总开关 |
| stripAnsi | true | 去掉终端转义序列 |
| resolveCarriageReturns | true | 把 \r 覆盖归约到最终可见行 |
| trimTrailingWhitespace | true | 去掉行尾空格和制表符 |
| collapseBlankRuns | true | 限制连续空行的数量 |
| maxConsecutiveBlankLines | 1 | 保留几行空行 |
| collapseRepeatedLines | true | 给长串相同行加注释 |
| repeatThreshold | 8 | 可折叠的连续相同行最少几行 |
| repeatMinRunChars | 1000 | 可折叠片段的最小字符数 |
| maxInlineChars | 32000 | 超过这个大小就裁剪;0 表示不裁剪 |
| headChars | 8000 | 裁剪时保留的开头字符数 |
| tailChars | 4000 | 裁剪时保留的结尾字符数 |
| significantChars | 8000 | 保留诊断行的字符预算 |
| significantPattern | 内置 | 正则,用来挑选要保留的诊断行 |
| exemptTools | ['read'] | 插件永不改动的工具 |
| recoveryNoticePattern | 内置 | 识别已经指明恢复文件的结果 |
maxInlineChars 必须给省略标记和恢复提示留出空间:headChars + tailChars + significantChars + 700 不能超过它。违反这条规则的配置会在激活时被拒绝,并在消息里给出这道算式,而不是产出一个无法收敛的裁剪结果。
查看省下了多少
在会话里运行 /diet:
dsh-context-diet — 138,204 characters removed (51.2%) results inspected 93 characters in 270,163 characters out 131,959 removed, lossless 12,308 removed, annotated 4,120 removed, trimming 121,776 across 4 recoverable result(s) estimated tokens saved 34,551 (chars / 4)
/diet reset 清空当前会话的计数器。计数器只存在插件内存里:不会写入会话日志,所以 replay、fork、resume 都不受影响。
与随附插件的交互
- dsh-spill-policy(随附版本为 maxInlineTokens: 12500)以 prepend: true 注册,因此它是最外层的监听器,拥有最终决定权。本插件在它之后运行,最多产出 maxInlineChars 个字符——约 8,000 token,低于那个上限——所以 spill-policy 找不到还需要限制的内容。recoveryNoticePattern 检查还会让本插件对任何已经指明恢复文件的结果主动退让,这样两者重新配置后,也不会为同一个结果产出两个 spill 文件。
- dsh-compaction-tool-result-pruner 在压缩压力下仍会运行。它在这里要做的事严格变少,意味着字符压力更早得到缓解,摘要更晚触发——而摘要正是长会话里开销大的那部分。
- dsh-token-meter 测量请求表面;本插件让这个表面在 meter 看到它之前就变小。
- run_code / PTC 子分发日志(tools/ptc-dispatch-log)不做处理。随附组合里 PTC 展示是关闭的,多这一道接缝只会让维护面翻倍,眼下没有收益。
如何在 Harness 升级中保持可用
本插件尽量少依赖外部,出问题时宁可降级也不报错:
- 完全不 import Harness。 index.js 只 import ./normalize.js。没有对 dsh-tools、dsh-llm、dsh-token-meter 或 @deepseek-ai/schemastery 的 peer dependency,版本升级不会让它们失效,也没有构建
- 只保留稳定接缝。 tools/post-execute 瀑布流、可选的 spillStore 服务(契约:saveText(input) -> { locator, retrievalHint })、可选的 commands 服务,以及 ctx.logger。每一项都是已发布的 Service 或 Event 契约,并且都通过 ctx.get / ctx.inject 使用,因此它不存在只是正常状态,而不是激活失败。
- 配置走 Standard Schema 协议。 Config 实现 ~standard.validate,cordis 原生校验它,因此不会加载任何 schema 库。未知配置或非对象配置在 apply 内部永远不会抛错。
- 处处 fail-open。 处理器先 await next(),因此它绝不会吞掉其他插件的决定,而且它只替换渲染后的投影——注册表会把它合并到 result 之上,所以工具的结构化 value 不受影响。非 accept 的决定、没有文本块的结果、形状意外的结果,或任何抛出的错误,都原样返回它收到的内容。
- 没有持久状态,也没有新事件类型。 插件不写入任何会话事件,因此它碰过的会话会像其他会话一样重新打开、分叉和重放。
验证它
node verify.mjs
52 项检查覆盖文本转换、裁剪不变量、配置协议和插件接线——包括保持同一性的 no-op 路径、恢复文件路径,以及每一条 fail-open 路径(没有 spill 后端、spill 后端抛错、result 格式错误、未知会话所有者、缺少命令注册表)。脚本没有依赖,也不需要 Harness 配置档。
在 Harness 运行时编辑插件
Harness 进程会为每个插件说明符缓存一个模块代次,贯穿其整个生命周期。编辑 index.js、重新安装、移动包、禁用再启用 bundle,甚至修改包的 exports 映射,都会让已经加载的代次继续运行;只有进程从未导入过的说明符才会得到新代次(install_bundle 确实会实时加载全新包)。所以改动这个插件之后:
- 重启 Host(dsh web)来加载新代码,或者
- 用新的包名安装它,立即加载。
这是 DeepSeek Harness 的固有行为——「替换已安装的包需要重启才能加载新的 JavaScript 模块代次」——不是这个插件特有的问题。如果你安装了一个新插件,它看起来毫无反应,先检查这一点,再去调试插件。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
dsh-plugin-db/dsh-context-diet
在工具输出进入模型前裁掉冗余 token,保留可恢复内容
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,462已汉化DSH
73
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,848已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,246已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
DS Bot 是一个基于 DeepSeek Harness简称 dsh的 bot 插件,插件将 dsh 改造为 bot…
★ 4,717已汉化DSH
71.1
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,711已汉化DSH
71.1