前言¶
在 DSH 里调模型时,上下文窗口通常来自 Profile 或适配器目录里的全局默认值。同一窗口跑长对话和短任务都够用,但偶尔需要在当前会话里临时收窄窗口,让压缩策略、maxTokens 和 request/context 事件看到的是一致的上限,又不想改 defaultContextWindow 去影响所有会话。
下面介绍的 dsh-context-window-switch(维护者 rayadesune,分类:客户端)在模型选择弹窗内增加一行「上下文窗口」,选择仅对当前 sessionId 生效,新建会话自动回到默认值。它是社区插件 luyiheng1111/dsh-context-window-picker 的延续维护版(自 v0.2.0 起更名为本仓库 id),实现思路与 README 描述一致。插件目录页:https://www.skillhub.cn/plugins/rayadesune/dsh-context-window-switch;源码与说明:https://github.com/rayadesune/dsh-context-window-switch。
这是什么¶
一句话:在 DSH 模型选择弹窗里,与「模型」「推理等级」并列提供会话级 contextWindow 切换;不写配置文件、不污染 session log,只在宿主内存按会话记录覆盖值。
对标 README 中的参照:WorkBuddy 在模型详情里把「思考强度」和「上下文窗口」并列、会话级临时生效;本插件把同类能力放进 DSH 的模型弹窗面板内部。
核心功能¶
弹窗内的交互¶
- 打开输入框右侧的模型选择弹窗,或使用
/model。 - 在「模型」「推理等级」下方多出一行,例如 上下文窗口 256K ›;右侧数字为当前生效窗口。若本会话有覆盖,该数字以品牌色高亮。
- 点击展开档位:可选「默认(跟随模型)」以及不超过当前模型默认窗口的档位(如 128K / 256K / 512K 等;具体列表由模型默认值与配置共同决定)。
- 选择后立即写入当前会话;再发一条消息时,
request/context里的contextWindow即为新值。 - 新建会话不携带该选择,回到适配器目录中的默认窗口。
该行渲染在弹窗内部,点选档位不会触发「点外部关闭」,可反复切换。
宿主侧行为(不写 Profile)¶
- 包装
llm.prepareCall与llm.resolveModelInfo,使request/context、token 计量、压缩压力判断使用同一会话覆盖值;卸载插件时还原包装。 - 在覆盖生效期间,
Session#requestHeader会夹紧config.maxTokens,避免压缩策略用旧窗口的完成预留去对比更小窗口而报错。 - 客户端通过本机回环 JSON 与宿主通信:
GET .../api/state、POST .../api/set、GET .../api/health;请求校验 Host、拒绝跨站sec-fetch-site等(详见 README「安全说明」)。
与改 Profile 的区别¶
defaultContextWindow 改的是全局默认,影响所有会话。本插件只在内存里按 sessionId 覆盖,不改 llm-pi-ai.providers.*.models[].contextWindow 等配置。
已知限制(摘自 README)¶
- 候选档位只显示不超过模型基准窗口的值;不能通过插件放大到超过模型/Profile 能力。
- 覆盖只影响之后发出的请求;正在执行的 step 仍用启动时的窗口。
- 依赖
conversation.input.model.label槽位与弹窗 DOM 结构;官方若改面板布局,插件可能需要调整定位方式。 - 输入框上的模型按钮不再追加窗口后缀;窗口仅在弹窗内展示。
安装与启用¶
插件无构建步骤、无额外运行时依赖(React 由宿主提供)。当前 package.json 声明 0.2.0,要求 DSH 版本 >=0.2.1-rc.2 <0.3.0-0,许可 MIT。
若曾安装原版 dsh-context-window-picker,请先卸载再装本插件;两者插件 id 不同,同时安装会对 llm 服务产生双重包装。
README 给出的获取与安装方式如下。先把仓库放到本地目录,再在 DSH Plugins 页面用「Install from path / 本地 bundle」指向该目录,或在终端执行(路径替换为你的实际目录):
dsh plugin --profile desktop add /path/to/dsh-context-window-switch
安装后重启 DSH。默认使用 bundle patch 中的 presets、completionRatio 等,无需额外配置即可使用。
可选配置在 bundle patch 中修改(键与默认值见 README):
| 键 | 默认 | 说明 |
|---|---|---|
presets |
[131072, 262144, 524288, 1048576] |
候选窗口(仅显示不超过模型默认值的) |
completionRatio |
0.25 |
单次输出上限 ≤ 窗口 × 该比例 |
headroomTokens |
65536 |
与压缩策略 headroom 对齐 |
minimumWindow |
131072 |
最小可选窗口;更低的模型只显示「默认」 |
修改 index.js 需重启 DSH;只改 client.js 刷新页面即可。
典型用法¶
- 安装并重启 DSH 后,打开任意会话,进入模型弹窗,确认「推理等级」下方出现「上下文窗口」行。
- 需要在本会话用较小窗口时,展开档位并选择(例如 262144);该行数字即时更新,覆盖生效时高亮。
- 发送下一条消息,在开发者工具或日志中查看
request/context的contextWindow是否为新值;README 已验证示例:设为 262144 后,request/header.maxTokens会相对 256K 默认场景收紧。 - 诊断时可请求
GET /dsh-context-window-switch/api/health查看 patch 计数与当前配置。 - 结束临时限制:在档位中选择「默认」,或通过
POST .../api/set传null清除本会话覆盖(接口细节见 README)。
适用场景与注意¶
适合谁:需要在单会话内临时切换上下文窗口、又不想动 Profile 全局默认的 DSH 用户;习惯在模型弹窗里一并调模型、推理等级和窗口的人。
安全与信任:插件在当前 DSH 进程权限下运行,宿主半边会包装 llm 服务方法——DSH 尚无官方「按会话改上下文窗口」API,README 已说明这一点。安装前请自行阅读 仓库源码 与 LICENSE,确认可接受 MIT 条款及原作者 luyiheng1111、维护者 rayadesune 的署名说明。
DeepSeek Harness 生态强调「一切皆插件」;SkillHub 插件目录 是社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-context-window-switch 把会话级上下文窗口切换放进模型弹窗,与全局 Profile 默认值解耦,并通过宿主侧的 prepareCall / resolveModelInfo 包装保证计量与压缩一致。