前言¶
在 DeepSeek Harness 中切换会话时,有时会感到明显的等待。这通常是因为 Host 需要加载大量历史消息,以及页面在初始化时多次发起相同的只读请求。
dsh-fastswitch 针对这两个环节做了一次浏览器端的优化:把首次加载的历史消息窗口从 50 条调小到 20 条,并对只读 RPC 请求做去重与缓存。两个功能可以独立开关。
这是什么¶
dsh-fastswitch 是一个 DeepSeek Harness 客户端插件,由 guofug 维护,通过浏览器端的 window.fetch 包装和请求重写来实现性能提升。它不修改 DSH 本身或 Host 的行为,只影响本地请求。
核心功能¶
1. 可配置的首次加载窗口¶
当切换 Session 时,DSH 会请求 Host 返回该会话的初始快照。默认的窗口大小是 50 条消息。对于长对话,这会生成约 2 MB 的响应帧,造成等待。
dsh-fastswitch 在发送 session/follow 请求前,将 turnWindow.minMessages 从 50 修改为 20。Host 对 0 < minMessages <= maxMessages 的请求是支持的,因此这是合法的请求重写,而非补丁。
如果需要加载更早的消息(例如 200 条),可以手动将该值设为 200,插件不会覆盖它。
2. 只读 RPC 去重与缓存¶
页面初始化时,多个组件会在挂载时各自发起相同的只读请求,如 session/modelCatalog、credentials/describe、agentPresets/list、cotTranslation/limits 等,没有去重也没有缓存。
dsh-fastswitch 通过包装 window.fetch,将只读的 catalog 请求缓存 5 分钟,并将同一时间窗口内的并发请求合并为一次网络调用。
安装与启用¶
在插件市场中搜索 fastswitch,或使用以下命令安装:
dsh plugin --profile web add github:guofug/dsh-fastswitch
安装后重启一次(或等待 HMR 重新加载)即可生效。
典型用法¶
所有配置通过 localStorage 完成,没有配置文件。
默认配置:
| Key | 默认值 | 说明 |
|---|---|---|
dsh-fastswitch |
— | 设为 off 可关闭所有功能 |
dsh-fastswitch-window |
20 |
首次加载窗口大小,设为 0 则不修改 |
dsh-fastswitch-ttl |
300000 |
缓存过期时间(毫秒),设为 0 禁用缓存 |
dsh-fastswitch-merge |
800 |
并发请求合并的时间窗口(毫秒) |
示例:将窗口设为 10 条,同时关闭缓存:
localStorage.setItem('dsh-fastswitch-window', '10')
localStorage.setItem('dsh-fastswitch-ttl', '0')
检查是否生效¶
在浏览器控制台执行:
window.__dshFastswitch
返回对象示例:
// { installed: true,
// ws: { rewritten: 3, untouched: 40 },
// fetch: { calls: 51, hits: 10, dedup: 8, bypass: 33 } }
ws.rewritten:每次成功重写turnWindow.minMessages的次数fetch.calls:总请求次数fetch.hits:命中缓存的次数fetch.dedup:去重合并的次数fetch.bypass:未命中缓存且未被去重的请求次数
适用场景与注意¶
- 仅对 Web 客户端生效,SDK、ACP 等其他客户端不受影响。
- 不修改 DSH 或 Host 的文件,卸载后即可恢复默认行为。
- 插件不维护会话缓存,无法实现跨会话的即时切换,因此不适合需要“快速切回上一个会话”的场景。
- 缓存仅覆盖只读的 catalog 请求,不涉及写入、流式响应或认证接口。
生态背景¶
DeepSeek Harness 的插件化架构允许在不修改核心代码的情况下扩展能力。dsh-fastswitch 是社区维护的插件,独立于 DeepSeek 或幻方,其功能与行为由源码与文档保证。
链接¶
- 插件目录页:https://www.skillhub.cn/plugins/guofug/dsh-fastswitch
- GitHub:https://github.com/guofug/dsh-fastswitch