dsh-settings-extras
在 dsh 桌面版 GUI 的「设置 → 通用设置」中增加两个官方设置页没有暴露的选项: 自动压缩阈值与默认思考等级。滑块改完即生效,无需重启,也无需手工改配置文件。
这是什么
dsh 的上下文自动压缩阈值写在每个 Agent 预设内联的
compaction-basic.config.thresholdRatio 里,默认思考等级则由 provider 级的
reasoning 与请求级的 reasoningEffort 共同决定。这两处都不在设置页上,
用户要么改不了,要么得逐份改预设。
本插件补上这一缺口:
- Host 半(
lib/index.js):把设置页里选定的两个值推送到所有生效位置, 并在每条模型请求上按该模型实际支持的档位做安全换档。 - Client 半(
lib/client.js):向「设置 → 通用设置」的settings.general.item插槽贡献两行滑块,读写走官方设置通道ctx.configForms.get('dsh-settings-extras')→remote.settings.mutate,由 Host 落盘到 profile 的配置文档。
界面文案内置中文与英文两套,样式只用 --dsw-* 主题 token,跟随 dsh 主题。
两个选项
自动压缩阈值
上下文占用达到窗口的这个比例时触发自动压缩。范围 20% ~ 95%,步进 5%, 默认 50%。
写入方式是整份重写预设 config:阈值所在的 compaction-basic 是预设
plugins 数组里的嵌套行,而补丁层只能按 id 寻址、且多个预设的嵌套行同名冲突,
所以无法就地打补丁。Host 按包名扫描所有 @deepseek-ai/dsh-agent-preset 行,
因此将来新增的预设会被自动纳入,无需改代码。
上下限不是随手取的:
- 上限 0.95:取 1.0 时触发点等于压力预算上限(
floor(min(W×ratio, W−reserved−headroom))), 容易在压缩之前先撞上 provider 的上下文上限。 - 下限 0.2:必须高于
retainRatio(compaction-basic要求retainRatio < thresholdRatio, 其默认值为 0.16),否则预设会在加载期直接拒绝。
阈值写进预设后对新建会话生效,已有会话不会回溯调整。
默认思考等级
未手动指定档位时使用。七档:off / minimal / low / medium / high /
xhigh / max,默认 high。生效分两处:
- 请求换档:在
agent/request的最终配置上,按该模型实际支持的档位集合重选一档 (取不低于目标的最小档;没有更高档则取该模型最高档;目标是off时不往上抬, 交给 provider 自己的默认)。因为 pi-ai 路由的「模型默认档」来自 provider 级reasoning,而它是 route 级,无法表达「按模型升高/降档」。 - 显示对齐:把各 provider 的
reasoning一并写成同一档位,让输入框旁的档位 显示不再落到 Default。
换档只作用于没有显式档位的请求:用户在输入框里手选过档位的会话保持其选择。
仓库结构
dsh-settings-extras/
├── package.json # bundle 元数据,声明 dsh.bundle.patch 与 dsh.client
├── cordis.patch.yml # 把本插件作为一条 Loader 行插入 profile
├── lib/
│ ├── index.js # Host 半:推送阈值 / 请求换档
│ └── client.js # Client 半:通用设置里的两行滑块
├── reconcile.log # 运行时诊断日志(已 gitignore,不入库)
├── .gitignore
└── README.md
依赖只有一项:@deepseek-ai/schemastery,声明在 peerDependencies 与
devDependencies 中,由运行中的 dsh 运行时闭包提供,插件仓库不携带 node_modules/。
安装与启用
本插件是 dsh bundle,由 dsh 桌面版按 package.json 中的 dsh 字段识别并加载:
dsh.bundle.patch指向cordis.patch.yml,由 Host 半作为一条 Loader 行注册。dsh.client声明platform: web,由 dsh 客户端模块系统把lib/client.js作为浏览器半侧送出(不会自动送,必须靠 patch 行占位)。
通过 dsh 插件管理器安装,或把本仓库地址作为 bundle 加进 profile。加载后两个滑块
出现在**「设置 → 通用设置」**页,按 order 30 / 31 排入该页条目列表。
patch 行的 id 就是设置命名空间。 它必须与
lib/client.js的CONFIG_NS完全一致(当前均为dsh-settings-extras);改名会让已有用户的配置变成孤儿。
cordis.patch.yml不声明config。 两个字段的默认值由lib/index.js的Configschema 给出,用户的改动落在 profile 自己的 patch 层上——升级本 bundle 不会覆盖用户已调好的值。
配置项
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
compactionThreshold |
number | 0.5 |
自动压缩触发比例,取值 0.2 ~ 0.95 |
defaultReasoningEffort |
string | high |
默认思考等级,取 LEVEL_ORDER 中的一档 |
两个字段都标了 volatile(),这是设置页可写入的前提。客户端滑块带有兜底值,
与 Host 侧 Config 的默认值保持一致。
实现取舍
- 触发用轮询而非事件。
settings/document-updated只在describe()检测到原始值 变化时发出,实测拖动滑块后并不总会推流。因此除监听该事件外,另有 1.5 秒一次的 轮询读取 volatile 值兜底——读引用不依赖任何事件,是确定性的触发;值未变时既不写入 也不产生副作用。 - 只在确实不同时才写。
configEditor.edit在next与inherited深等时会删除 该行的 config,盲目写入会抹掉用户自己固定的预设配置。所以每处写入前都先比对。 - 每轮只写一条,连续失败到上限即放弃。 避免以 1.5 秒周期反复打 Loader。
- 不 import 任何
@deepseek-ai/dsh-client-*包。 Client 半只require平台种子模块 (react/react/jsx-runtime),使 dsh 升级最多导致外观降级,而不会让插槽条目崩掉。
诊断日志
Host 半把「本轮推送了什么、哪一条写入失败」写进插件目录下的 reconcile.log,
只保留最近 120 行,用于外部观察推流是否发生。该文件已 gitignore。
许可证
MIT
No comments yet. Be the first to write one.