安装
在 DeepSeek Harness 里通过 dsh-market 安装
dsh plugin --profile web add dshmarket
或使用命令行
dsh plugin --profile web add github:zpis666/dsh-context-budget
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络。请先审阅源码,并尽量锁定 commit(github:owner/repo#sha)。
README
English | 中文
在 DSH Web 的 设置 → 模型 页面,为每个 pi-ai 提供方路由加一组「上下文窗口 / 压缩阈值 / 保留预算」输入框。填一次,窗口和压缩时机就按你写的绝对 token 数生效,不需要重启。
它解决什么
接入第三方网关时,路由常常是手工声明的(自己写 api + baseURL + models)。这类路由的模型 id 往往匹配不到 pi-ai 内置目录——例如 my-gateway 下的 grok-4.6 与目录里的 x-ai/grok-4.6 并不是同一条路由——于是适配器的容量解析走到最后一级回退 defaultContextWindow,也就是 262144。而压缩后端只接受一个比例 thresholdRatio,无法直接表达「到 600k 就压缩」。
本插件把这两件事变成两个输入框:
| 字段 | 写入位置 | 效果 |
|---|---|---|
| 上下文窗口 | llm-pi-ai 设置的 providers.<路由>.defaultContextWindow |
该路由下未被自身条目和内置目录描述的模型,容量立即变为你填的值 |
| 压缩阈值 | profile 的 cordis.patch.yml 中 compaction-basic 的 modelPolicies[].thresholdRatio |
后端计算 floor(上下文窗口 × 比例),即你要的绝对阈值 |
| 保留预算(可选) | 同上,modelPolicies[].retainTokens |
压缩时逐字保留的近期上下文;留空沿用后端默认 16% 比例 |
| 思考强度 | llm-pi-ai 设置的 providers.<路由>.models[].reasoningEfforts |
输入框右下角的选择器按厂商识别等级,选中的等级随请求发给模型 |
压缩阈值按 阈值 / 窗口 换算成比例写入,所以之后你再改窗口,阈值比例会按新窗口重新换算——改窗口后请重新点一次「应用」,让比例跟着更新。
思考强度(输入框右下角)
手工声明的路由没有目录条目,适配器因此把它的模型当作非推理模型——模型选择器里只会显示「当前模型未提供推理等级」。本插件把强度调节放在输入框右下角,紧挨模型选择器,不占用配置卡片:
- 读取当前会话的模型,先看目录里该模型是否已经声明过等级,有就直接用;
- 没有声明时,按模型 id 识别厂商,取该厂商的等级档案;
- 选择某个等级时,若该模型尚未声明,插件先把档案写进
models[i].reasoningEfforts,再切换会话强度——否则适配器会因「模型不支持该等级」拒绝这次选择。
内置厂商档案,按模型 id 匹配、第一个命中的生效:
| 厂商 | 匹配 | 等级 |
|---|---|---|
| xAI | grok |
off low high max |
| OpenAI | gpt / chatgpt / o1…o9 |
minimal low medium high |
| Anthropic | claude |
low medium high |
| DeepSeek | deepseek |
off high |
gemini / gemma |
minimal low medium high |
|
| Qwen | qwen |
off low medium high |
| Z.ai | glm / z-ai |
off high |
| Moonshot | kimi / moonshot |
off high |
| MiniMax | minimax |
off low medium high |
发出去的 wire 值就是等级名本身(openai-completions 发 reasoning_effort,openai-responses 发 reasoning.effort)。网关用别的拼写时,改 settings.yaml 里对应模型 reasoningEfforts 的右侧值即可,选择器里显示的名字不受影响。
选中的等级会被持久记录在会话日志的 request/header 中,并随请求发给模型。
为什么不用替换压缩引擎
compaction-basic 的阈值公式是 thresholdTokens = floor(contextWindow × thresholdRatio),而 contextWindow 在每一次 agent/pre-step 都会通过 llm.resolveModelInfo() 重新解析。因此只写比例就够了:官方引擎的持久事务、回放复用与溢出恢复全部保留,本插件只提供它本来就接受的两个数字。
安装
dsh plugin --profile web add dsh-context-budget
重启一次 dsh web,然后打开 设置 → 模型,展开任意 pi-ai 提供方的编辑卡片,「上下文预算」区就在卡片内。
写入成功后 profile 的 patch 监视器(patchReload: live)会在约 1 秒内重新组合,无需再次重启。
字段校验
写入前会在宿主端校验,不合法直接拒绝并给出原因:
- 上下文窗口、压缩阈值必须是正整数;
- 压缩阈值必须小于上下文窗口;
- 换算后的比例必须落在
(0, 1),且大于compaction-basic的默认保留比例0.16——否则后端会在加载时拒绝该配置; - 若填写了保留预算,它必须小于压缩阈值;
- 路由下必须能枚举到至少一个模型 id(
modelPolicies需要精确的provider/model对)。
安全写入
cordis.patch.yml 是你自己的配置层,插件只碰自己写的那一段:
- 写入的是一个带标记的受管块,其余行(含注释和别人的补丁行)原样保留;
- 写入前先备份到
cordis.patch.yml.contextbudget.bak; - 写入后重新解析并核对每一条
provider/model是否落盘,失败立即回滚原文; - 如果文件里已经存在手工编写的
- id: compaction-basic行,插件会拒绝写入并告诉你行号,而不是覆盖你的配置。
已知边界
- 只对
llm-pi-ai路由生效;llm-deepseek的模型目录编辑在官方页面里已经能改contextWindow。 defaultContextWindow是回退值,不会覆盖模型条目里已经显式写过的contextWindow,也不会覆盖内置目录已描述的模型。对纯目录路由(models省略)请改用逐模型填写。- 窗口值必须与网关真实能力一致。填得比网关大,请求会以
CONTEXT_WINDOW_EXCEEDED失败,然后靠溢出恢复多花一次摘要请求。 - 输出上限
maxTokens不在本插件的字段里,默认 32768;窗口设 1M 时实际可用输入约 968k。 - 压缩本身要额外发起一次摘要请求,阈值调得越低,摘要越频繁。
卸载与回滚
dsh plugin --profile web remove dsh-context-budget
卸载只会移除插件本身。它写下的两处内容需要你自行决定:
llm-pi-ai设置里的defaultContextWindow—— 想恢复 262144 就删掉该字段;cordis.patch.yml里# dsh-context-budget managed block标记的那一段 —— 整段删掉即可,其余内容不受影响。
每次写入前都会留一份 cordis.patch.yml.contextbudget.bak,可直接用来比对或还原。
开发
node --check lib/index.js
node --check client.js
node test/pure.test.mjs # 校验规则 + 受管块写入/回滚
node test/integration.test.mjs # apply() 注册与 patch 路径解析
node test/apply.test.mjs # 完整写入流程(mock 上下文)
node test/client.test.mjs # 客户端插槽注册与卡片渲染
两组测试都不需要运行中的 Harness。
许可
MIT
评论
评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。