🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

压缩阈值直设 theTd/dsh-compaction-thresholds

DeepSeek 客户端
theTd6 天前有提交已提供中文文档扫描:未发现敏感能力兼容 / 相关生态

按模型直接填 token 数设定自动压缩触发点

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/theTd/dsh-compaction-thresholds.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 6 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/10/31(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

按模型设置 DeepSeek Harness pi-ai 服务商的自动压缩触发阈值(单位 token),在「设置 > 模型」里编辑

README

由 DeepSeek 最新模型翻译生成
dsh-compaction-thresholds English · 中文 按模型设置 自动压缩触发点(单位 token),适用于 DeepSeek Harness 的 pi-ai 服务商。在 Settings → Models 里编辑,不用改 YAML。 dsh-compaction-basic 只接受上下文窗口的比例,实际生效的阈值是 floor(min(W × ratio, W − O − headroomTokens))。你以为调好的比例,可能被悄悄压住;比例固定,每个模型上的 token 预算又各不相同。这个插件让你直接填真正关心的 token 数,由它换算成精确比例,再写进每个 agent-preset 行,作为 modelPolicies。
展开完整文档(README 剩余 1 节)
dsh-compaction-thresholds

English · 中文

按模型设置 自动压缩触发点(单位 token),适用于 DeepSeek Harness 的 pi-ai 服务商。在 Settings → Models 里编辑,不用改 YAML。

dsh-compaction-basic 只接受上下文窗口的比例,实际生效的阈值是 floor(min(W × ratio, W − O − headroomTokens))。你以为调好的比例,可能被悄悄压住;比例固定,每个模型上的 token 预算又各不相同。这个插件让你直接填真正关心的 token 数,由它换算成精确比例,再写进每个 agent-preset 行,作为 modelPolicies。

Settings → Models → <provider> card → Compaction trigger / 自动压缩触发点 [ 320000 ] tokens [Save] [Clear] │ │ browser writes THIS plugin's volatile namespace (settings.mutate) ▼
compaction-thresholds { models: [...], managed: [...], report: {...} }
│
│ host reconciles every 1500 ms, then projects with ctx.configEditor.edit()
▼
preset-* row → plugins[compaction] → config[compaction-basic].config.modelPolicies
{ provider: "clay", model: "deepseek-flash", thresholdRatio: 0.305176… } │ │ the outcome is published back into the same namespace as report ▼ card shows "Synced 4/4 · 12:34" or "Not synced 1/4: preset-standard (…)"

为什么要绕两道

agent-preset 行属于 Loader 行,不是 settings 条目:dsh-agent-preset 的 Config 没有声明 .volatile() 字段,所以 settings.describe() 会略过它们,settings.mutate() 也会拒绝它们。浏览器只能写 volatile 命名空间,于是这个插件自己占一个(compaction-thresholds,用它自己的行 id),把改 preset 的动作放到 host 上做。没有新增 Remote/RPC 接口——dsh-api-remotes 在构建时就定死了命名空间集合。

有一点后果值得知道:命名空间是唯一事实来源,preset 行只是投影。 面板显示的是这张表,不是从 preset 读回来的值;它能如实展示的是 host 的投影报告(synced / failed / notes),由 report 携带。

三个 volatile 字段

| 字段 | 归属 | 含义 |
| models | 用户(设置页) | 表格:{provider, model, compactAtTokens, retainTokens?} |
| managed | host | 这个插件写过的 key,只用来清理它自己的策略 |
| report | host | 上次投影的 {at, synced[], failed[{preset,message}], notes[]};at 只在结果变化时更新,所以空闲部署永远不会重写文件 |

host 写什么

thresholdRatio 是 compactAtTokens / contextWindow,微调为 (tokens + 0.5) / contextWindow,让 floor(W * ratio) 精确还原你填的 token 数。retainRatio(只在设了 retainTokens 时写入)是 retainTokens / (W - O),其中 O 是路由到的输出预留量(info.defaultMaxTokens)。后端其余每个 key 配置会保留,包括已有的 thresholdRatio;这张表之外的模型策略不动,插件从未写过的条目也绝不删除。

写入前,先用 dsh-compaction-basic 自己的规则校验配置:0 < ratio <= 1、retainRatio < thresholdRatio、retainTokens < thresholdTokens,压力余量非负。目标值超过后端容量上限(W - O - headroomTokens,默认余量 65536)时仍会写入,但会被截断——后端取 min(W * ratio, W - O - headroom)——宿主会报告一条提示,写明截断后的值。完全无法表达的目标(tokens > W,或保留目标违反比例顺序)会被拒绝,在提示中点名,该行保持原样。

空闲轮询不会产生无谓改动:宿主对算出的 modelPolicies 与该行当前值做深比较,没有差异就跳过 configEditor.edit()。

服务商决策刻意不缓存:固定表里一旦改了 models[].contextWindow,就必须重新推导比例,否则 token 目标会漂移。

为什么用 reconcile 循环,而不用 loader/volatile-update 事件

设置写入会在自己的 HMR 事务内提交 volatile 字段,而 dsh-hmr 用 AsyncLocalStorage 标志防止重入(if (this.executing.getStore()) reject("HMR transactions cannot be nested"))。任何从 loader/volatile-update 监听器里调度的任务都会继承这个 store,因此从那里发起的 configEditor.edit() 无论等多久都会被拒绝——这里实测过:两轮运行、六次重试,共 56 次拒绝。所以宿主改为在激活期间(干净的异步上下文)启动定时器,每 1500 ms 对账一次;表变更后,一个 tick 加上逐行写入时间就能到达预设行(每个预设行一次 configEditor.edit(),大配置档上每次约 0.5–9 s)。

安装

// <profile>/package.json (e.g. ~/.dsh/profiles/web/package.json)
"dependencies": { "dsh-compaction-thresholds": "link:/absolute/path/to/dsh-compaction-thresholds" },
"dsh": { "profile": { "bundles": [ /* …, / "dsh-compaction-thresholds" ] } }

然后在该配置档目录执行 pnpm install,重启 dsh web(新的 bundle 层需要重启;之后改表即时生效)。bundle 的 cordis.patch.yml 会插入 compaction-thresholds 行。

@deepseek-ai/cordis 和 @deepseek-ai/schemastery 刻意设为 peer 依赖:用 link: 安装的插件是 DSH 的「linked root」,只有当发起请求的包在 package.json 的 peerDependencies 里声明了该名字时,启动器的解析器才会把来自 linked root 的裸包请求走安装图(dsh-app-boot/lib/index.js 的 routeLinked + readPeerNames)。

已在 DSH 0.2.1-alpha.5 上测试。

升级

用 link: 安装的插件,宿主代码不会热重载:改动 lib/index.js 之后(或拉取新版本后)重启一次 dsh web,然后刷新页面。从 0.1.0 升级到 0.2.0 其余部分兼容:首次对账时,该行会补上 managed/report 字段。

状态行的时间戳(at)记录的是结果最后一次变化的时间,不是最后一次接受保存的时间。所以,如果一次保存落在已经同步的结果上,时间戳保持原值。

卸载

移除依赖和 bundle 条目,执行 pnpm install,删除包目录,再从配置档补丁里删掉 compaction-thresholds 行。预设会保留各自的 modelPolicies;先在面板里清空每一行(清空会顺带剪掉它们),或者手动删除。

测试

node --test test/

覆盖 token↔比例的精确复现、投影与同级保留(含 !!js 标记)、churn 守卫、剪枝归属、拒绝路径和结构比较器。lib/policy.js 刻意做成零依赖,所以测试不需要模块图。

已知限制

- 预设保留各自的 revision:改动后的触发点只对新会话生效。
- retainTokens 还没有 UI 控件;行里存在该字段时会原样保留。
- 写入失败的预设会在每个 tick 重试,直到成功;表格里保留请求的值。
- 只覆盖 @deepseek-ai/dsh-llm-pi-ai 服务商。dsh-llm-deepseek 路由有自己的目录,暂未扩展。

文件

| 文件 | 作用 |
| lib/index.js | 宿主侧:Config(三个 volatile 字段)、激活流程 + 1500 ms 对账循环、逐行 configEditor.edit() 投影、剪枝、报告发布 |
| lib/policy.js | 纯逻辑:比例换算、plan/patch、校验、结构比较 |
| lib/client.js | 浏览器侧:ModuleLoader bundle,注册到 settings.models.provider-card 的键位座位,键为 llm-pi-ai,双语文案,保存/清除,投影报告 |
| cordis.patch.yml | 插入 compaction-thresholds 的 Loader 行 |
| test/policy.test.mjs | node --test 测试套件 |
| package.json | dsh.bundle.patch + dsh.client(platform: web)+ engines.dsh |

许可证

MIT — 见 LICENSE。

↑ 回到顶部 · English

给 DeepSeek Harness 的 pi-ai 服务商用的按模型设置自动压缩触发点(单位 token)插件,在设置 → 模型里改,不用碰 YAML。

dsh-compaction-basic 只接受「窗口比例」,实际阈值是
floor(min(W × ratio, W − O − headroomTokens))——你以为是调过的比例可能被上限压住,而且同一个
比例在不同模型上代表完全不同的 token 数。这个插件让你直接填真正关心的那个 token 数,由它换算成精确比例,并写进每个智能体预设行的 modelPolicies。

设置 → 模型 → 某个服务商的卡片 → 自动压缩触发点 / Compaction trigger [ 320000 ] tokens [保存] [清除] │ │ 浏览器写本插件自己的 volatile 命名空间(settings.mutate) ▼
compaction-thresholds { models: [...], managed: [...], report: {...} }
│
│ 宿主每 1500ms 对账一次,再用 ctx.configEditor.edit() 投影 ▼ preset- 行 → plugins[compaction] → config[compaction-basic].config.modelPolicies { provider: "clay", model: "deepseek-flash", thresholdRatio: 0.305176… } │ │ 结果以 report 字段回写到同一个命名空间 ▼ 面板显示「已同步 4/4 · 12:34」或「未同步 1/4:preset-standard(…)」

为什么要两跳

agent preset 行是 Loader 行、不是 settings 条目:dsh-agent-preset 的 Config 没有
.volatile() 字段,所以 settings.describe() 不会列出它们、settings.mutate() 也会拒绝。
浏览器只能写 volatile 命名空间,因此本插件自己拥有一个(compaction-thresholds,就是它自己的行 id),由宿主去改 preset。没有新增任何 Remote/RPC——dsh-api-remotes 在构建期就固定了那套命名空间。

必须接受的一个后果:命名空间是权威值,preset 行只是投影。 面板显示的是表,不是 preset 的读回值;它能诚实显示的是宿主回报的投影结果(synced / failed / notes),放在 report 里。

三个 volatile 字段

| 字段 | 归属 | 含义 |
| models | 用户(设置页) | 表:{provider, model, compactAtTokens, retainTokens?} |
| managed | 宿主 | 本插件写过的 key,用于只 prune 自己的 policy |
| report | 宿主 | 上次投影的 {at, synced[], failed[{preset,message}], notes[]};at 只在结果变化时前移,空闲时永不重写文件 |

宿主写了什么

thresholdRatio = compactAtTokens / contextWindow,并微调成 (tokens + 0.5) / contextWindow,保证 floor(W × ratio) 精确还原你填的 token 数。retainRatio(仅当设置了 retainTokens)是 retainTokens / (W − O),O 是该路由的预留输出(info.defaultMaxTokens)。后端配置里的其它键——包括已有的 thresholdRatio——一律保留;不在表里的模型的 policy 不动;不是本插件写的条目永不删除。

写入前会用 dsh-compaction-basic 自己的规则校验:0 < ratio <= 1、 retainRatio < thresholdRatio、retainTokens < thresholdTokens、压力余量非负。超过后端容量上限(W − O − headroomTokens,headroom 默认 65536)的目标会被写入但截断——后端取
min(W × ratio, W − O − headroom)——宿主会报告一条 note 说明被截到了多少。完全无法表达的目标
(tokens > W、或保留目标违反比例顺序)会被拒绝,写进 note,行保持原样。

空闲 tick 无写入:宿主把算出的 modelPolicies 与当前值做 deep-equal,一致就跳过
configEditor.edit()。

provider 决策故意不缓存:表不变而某个模型的 contextWindow 被改时,必须重新折算比例,否则 token 目标会漂。

为什么用轮询而不是 loader/volatile-update 事件

settings 保存是在它自己的 HMR 事务内部提交 volatile 字段的,而 dsh-hmr 用 AsyncLocalStorage 挡重入(if (this.executing.getStore()) reject("HMR transactions cannot be nested"))。从那个事件里派生的任何回调都继承了 store,所以由它发起的
configEditor.edit() 等多久都会被拒绝——实测:6 次重试 × 两轮 = 56 次拒绝。因此宿主改成在
激活时武装的 1500ms 对账循环(干净的 async 上下文);表变化后一个 tick 内读到,再加上逐行写入时间(每个 preset 行一次 configEditor.edit(),大 profile 上约 0.5–9 秒)。

安装

// <profile>/package.json(例如 ~/.dsh/profiles/web/package.json)
"dependencies": { "dsh-compaction-thresholds": "link:/指向/dsh-compaction-thresholds/的绝对路径" },
"dsh": { "profile": { "bundles": [ /* …, */ "dsh-compaction-thresholds" ] } }

然后在该 profile 目录执行 pnpm install,重启 dsh web(新增 bundle 层需要启动一次;之后改表实时生效)。bundle 的 cordis.patch.yml 会插入 compaction-thresholds 行。

@deepseek-ai/cordis 与 @deepseek-ai/schemastery 是peer 依赖,这是有意的:以 link: 安装的插件是一个"linked root",启动器的解析器只有在请求包的 package.json 把该名字列进 peerDependencies 时,才会把这个裸包请求路由到安装树(dsh-app-boot/lib/index.js 的 routeLinked + readPeerNames)。

已在 DSH 0.2.1-alpha.5 上验证。

升级

link: 安装的插件宿主代码不会热重载:改过 lib/index.js(或拉了新版本)之后要重启一次 dsh web,再刷新页面。0.1.0 → 0.2.0 其余兼容:行会在第一次对账时补上 managed / report 字段。

状态行的时间戳(at)是"结果最后一次变化"的时间,不是"最后一次保存成功"的时间;所以一次保存如果落在已经同步的结果上,时间戳保持不变。

卸载

删掉依赖和 bundle 条目 → pnpm install → 删除插件目录 → 再从配置档补丁里删掉 compaction-thresholds 行。preset 里的 modelPolicies 会留着:可以先在面板里逐行清除(会 prune 掉),或者手工删。

测试

node --test test/

覆盖:token↔比例精确还原、投影与兄弟键保留(含 !!js 标记)、churn guard、prune 归属、拒绝路径、结构化比较。lib/policy.js 故意做成零依赖,测试因此不需要模块图。

已知限制

- preset 保留自己的代数:改了触发点只对新会话生效。
- retainTokens 暂无 UI 控件;行里已有该字段时会被保留。
- 某个 preset 写失败会每 tick 重试直到成功;表里仍保留你输入的值。
- 只覆盖 @deepseek-ai/dsh-llm-pi-ai 的 provider;dsh-llm-deepseek 是另一套目录,暂未扩展。

文件

| 文件 | 作用 |
| lib/index.js | 宿主半侧:Config(三个 volatile 字段)、激活 pass + 1500ms 对账循环、逐行 configEditor.edit() 投影、prune、发布 report |
| lib/policy.js | 纯逻辑:比例数学、plan/patch、校验、结构化比较 |
| lib/client.js | 浏览器半侧:ModuleLoader bundle,注册进 settings.models.provider-card 的 keyed 座位(key llm-pi-ai),中英文案、保存/清除、投影结果展示 |
| cordis.patch.yml | 插入 compaction-thresholds Loader 行 |
| test/policy.test.mjs | node --test 用例 |
| package.json | dsh.bundle.patch + dsh.client(platform: web)+ engines.dsh |

许可

MIT,见 LICENSE。
预览分享卡片长什么样 ↓theTd/dsh-compaction-thresholds
分享 · DeepSeek Harness Hub
theTd/dsh-compaction-thresholds

按模型直接填 token 数设定自动压缩触发点

回到顶部