跳到正文
dsh-market 浏览插件 GitHub EN

zpis666/dsh-context-budget

在模型设置页为每个 pi-ai 路由新增上下文窗口与压缩阈值字段,并在输入框右下角按厂商提供思考强度选择器,写入 llm-pi-ai 容量、reasoningEfforts 与 compaction-basic 补丁行。

Star 数 ★ 0 分类 模型与账号接入 收录于 2026-09-13

安装

在 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
Google 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

内容来自项目 README(GitHub)↗

评论

评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。