dsh-session-load-tuner:慢链路上的 DSH 会话加载调优

前言

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 小于该字节数的帧不压缩

生效时机简要归纳:

  1. 设置页修改会立即保存;窗口类参数在下次打开会话时生效(当前会话刷新页面亦可)。
  2. maxMessages / minMessages / minTurns / lazyLoad 在浏览器半边每次发帧或滚动前读取。
  3. wsDeflate / wsDeflateThreshold 只影响新建立的 WebSocket;改完后重启 dsh-web.service 最干净。
  4. 页面刚启动、设置文档尚未返回时,第一帧仍按原生窗口;之后打开会话使用配置值。
  5. 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜