前言¶
DeepSeek Harness(DSH)在 Web 里打开一个长会话时,客户端会通过 WebSocket 拉历史:原生客户端里 HISTORY_PAGE_OPTIONS 固定为 maxMessages: 500,再配合 turnWindow 的至少消息数与轮次。服务端组装一页往往只要几十到几百毫秒,但若浏览器经 Cloudflare、Cloudflare Access 等链路访问远地实例,一次「载入历史」仍可能带来数百 KB 到近 2 MB 量级的未压缩 JSON,瓶颈常在传输而非服务端 CPU。
dsh-session-load-tuner 是社区维护的 DSH 客户端向插件(维护者 Richard2091,当前 package 版本 0.5.0),在不修改 dsh 自身文件的前提下,调整「何时加载、加载多少」以及 WebSocket 是否启用 permessage-deflate。总开关是插件本身的启停,而不是设置页里的单独「启用」项。
这是什么¶
插件全名对应仓库 Richard2091/dsh-session-load-tuner,在 SkillHub 目录中归类为客户端。它只覆盖边界内的问题:浏览器侧如何把会话数据取回来、单次传多大;服务端 journal 投影、机器内存、是否直连源站等部署决策不在包内处理。
实现拆成两半:lib/index.js 负责宿主侧(配置与 WebSocket 压缩钩子),lib/client.js 作为 Module Loader 包改写浏览器发出的会话相关请求。
核心功能(v0.5 已实现)¶
设置页与配置持久化¶
在 DSH Web GUI 中打开「设置 → 会话加载」,可改六个参数并「恢复默认」;写回 profile 配置,无需手改 yml。页面没有独立「启用」开关:停用插件即回到原生行为——在「设置 → 插件」里停用,或在 cordis.patch.yml 对应条目加 disabled: true,浏览器半边不再加载插件逻辑。
首屏条数与轮次对齐¶
插件把进入会话的 session/follow 与向上翻页时的 session/page 请求参数,从原生硬编码改为可配置的上限条数、至少消息数、至少轮次。服务端分页计数只统计 user/message 与符合条件的 assistant/message;工具调用、step、卡片等不计入「条」,因此「条」与「轮」不是同一概念,配置需按 README 中的口径理解。
懒加载¶
开启 lazyLoad(默认 true)时,滚动到距聊天顶部约 800px 会自动触发一次「加载更早」,等价于自动点「加载更早 / Load earlier」按钮;关闭后仅手动点击才加载。该路径依赖聊天界面 DOM 结构,dsh 大版本升级后可能需要跟进。
WebSocket 压缩¶
网关侧 WebSocketServer 默认不对 /api/remote.mux 开启 permessage-deflate。插件在 WebSocketServer.prototype.handleUpgrade 上挂薄包装,按配置在每次 upgrade 前设置 perMessageDeflate 及帧大小阈值,不 patch 厂商 ws 源码。若中间链路(例如 Cloudflare)未透传扩展协商,连接仍可用,只是无压缩收益。
规划中的能力(资料标注为未做)¶
README 路线表中列出的异步分批补齐、懒加载预取细化、跳转页窗口统一、附件图片懒加载等,当前 v0.5 仍以已做项为准;安装与调参时不要假设这些项已可用。
安装与启用¶
官方安装方式来自仓库 README,不是 dsh plugin add 一类命令:
sh install.sh # 备份 + 复制 + 软链 + 写 patch
systemctl restart dsh-web.service # 重启会打断当前会话,需自行择时执行
脚本会备份到 ~/.dsh-backup-<时间戳>/,并改动三处:插件目录 ~/.dsh/profiles/web/plugins/dsh-session-load-tuner/、指向包的软链 ~/.dsh/profiles/web/node_modules/dsh-session-load-tuner、以及 cordis.patch.yml 末尾带标记的 insert 条目。之后在 profile 里执行 pnpm install 可能清掉软链,需重跑 install.sh;patch 写入是幂等的。
卸载:
sh uninstall.sh
systemctl restart dsh-web.service
插件以当前 dsh 进程权限运行;安装前应阅读仓库源码与 MIT 许可证,确认符合你的安全与合规要求。
参数说明¶
两个入口等价:设置 → 会话加载(推荐),或编辑 ~/.dsh/profiles/web/cordis.patch.yml 里 session-load-tuner 条目(改 yml 后需重启服务)。
| 字段 | 默认 | 说明 |
|---|---|---|
maxMessages |
120 |
首屏条数上限(20–500;原生 500) |
minMessages |
50 |
至少消息数(1–500,且 ≤ maxMessages) |
minTurns |
2 |
至少轮次(1–50) |
lazyLoad |
true |
接近顶部时自动加载更早一页 |
wsDeflate |
false |
WebSocket permessage-deflate |
wsDeflateThreshold |
1024 |
小于该字节数的帧不压缩 |
生效时机简要归纳:
- 设置页修改会立即保存;窗口类参数在下次打开会话时生效(当前会话刷新页面亦可)。
maxMessages/minMessages/minTurns/lazyLoad在浏览器半边每次发帧或滚动前读取。wsDeflate/wsDeflateThreshold只影响新建立的 WebSocket;改完后重启dsh-web.service最干净。- 页面刚启动、设置文档尚未返回时,第一帧仍按原生窗口;之后打开会话使用配置值。
- schemastery 严格校验取值;例如
maxMessages: 999会导致条目加载失败。
典型用法与验证¶
慢链路或高延迟 Web GUI 访问场景下,可先把 maxMessages 从原生 500 降到 README 默认 120,观察首屏打开时间;若常向上翻看历史,保持 lazyLoad: true;在确认链路支持扩展协商后,再尝试 wsDeflate: true 并配合 wsDeflateThreshold。
验证客户端 bundle 是否被宿主注册:
curl -s -o /dev/null -w '%{http_code}\n' -H 'Host: 127.0.0.1:3080' \
http://127.0.0.1:3080/plugins/dsh-session-load-tuner/client.js
期望 HTTP 200。浏览器 DevTools 中:打开会话后查看 WebSocket open 帧,maxMessages 应为配置值(如 120)而非 500;若开启压缩,握手响应头应出现 Sec-WebSocket-Extensions: permessage-deflate。
适用场景与注意¶
适合:浏览器经 CDN / Zero Trust 访问远端 DSH、首屏历史 payload 过大、希望用设置页集中调窗口与压缩而不改 dsh 源码的用户。
注意:
- 懒加载与按钮文案绑定,依赖 UI 结构;宿主侧的窗口改写与压缩钩子不依赖 DOM,升级 dsh 时风险更低。
- 社区目录 SkillHub 插件页 与 GitHub 仓库为独立生态信息源,与 DeepSeek / 幻方无官方从属关系;星标与版本以仓库为准。
- Node 引擎要求见
package.json:^22.19.0 || >=24.0.0。
结尾¶
dsh-session-load-tuner 把会话首屏窗口、向上翻页参数、滚动触发的懒加载以及可选的 WebSocket 压缩收进一份 profile 配置,用插件方式接入 DSH Web,避免直接改 dsh 树并在升级时被覆盖。需要细节、路线表与开发测试命令时,以 README 为准。
- 目录页:https://www.skillhub.cn/plugins/Richard2091/dsh-session-load-tuner
- GitHub:https://github.com/Richard2091/dsh-session-load-tuner