前言¶
在 DeepSeek Harness(DSH)Web 界面里,模型的思考过程默认折叠成一行预览。展开后,DSH 内置的 cot-translation 相关能力可以处理思考正文,但 README 明确说明:折叠状态下的预览仍保留英文原文。日常浏览对话列表时,看到的往往是这一行,而不是展开后的长文。
社区插件 dsh-thinking-zh(维护者 waterc07,目录分类为联网工具)专门补这一行:在折叠状态下把英文思考预览自动换成中文,不改变展开后的其它行为。下面介绍它的定位、原理、安装与配置方式。
这是什么¶
dsh-thinking-zh 是给 DSH 桌面 Web 界面用的插件(版本 0.1.0,MIT 许可证)。它只做一件事:对话里 折叠状态的英文思考预览 自动显示为中文。
与内置 @deepseek-ai/dsh-experimental-cot-translation-bundle 的分工如下:
| 位置 | 由谁负责 |
|---|---|
| 折叠思考行的一行预览 | 本插件(自动应用) |
| 展开后的思考正文 | DSH 内置 cot-translation(手动切换原文/译文) |
本插件用 :not([data-expanded]) 只处理折叠行;展开后让位给内置插件,两者可同时启用。未安装内置翻译插件时,本插件仍可独立工作,展开正文仍为英文。
被替换的文本保留 title 与 data-dsh-thinking-zh-original,悬停可见英文原句。
核心功能¶
宿主半与浏览器半¶
DSH 桌面端在随机 loopback 端口提供 Web 界面;浏览器直连第三方翻译会遇到 CORS 等问题。插件因此拆成两半:
- 宿主半(
src/index.js,Node/ESM):在 DSH Web 同源注册路由,代理翻译请求,负责去重、批量、缓存、超时与限流。 - 浏览器半(
src/client.js):用MutationObserver观察对话流,每帧合并扫描;定位[data-variant="think"][data-preview]:not([data-expanded])行内预览文本;待字符串 400ms 内不再变化 后,每批最多 8 段 POST 到宿主半;只改文本节点内容,不碰innerHTML与 React 状态。
按字符串做稳定性计时,避免正文流式输出时页面级防抖被不断重置。预览出现时会预取翻译,把网络耗时叠进 400ms 窗口。
翻译后端与降级¶
| provider | 说明 |
|---|---|
bing(默认) |
POST https://edge.microsoft.com/translate/translatetext?to=zh-Hans&isEnterpriseClient=false,免费、无需 key |
google |
代码保留,可通过 /set 切换;匿名调用易被 429,非默认 |
超时 10 秒;单段失败返回 { "text": null, "error": "..." },页面保留英文,不自动换 provider。
缓存与目标语言¶
- 内存 LRU(Map)+ 磁盘
$DSH_HOME/dsh-thinking-zh/cache.json;键为sha256(provider + targetLanguage + 原文),磁盘不存英文原句;最多 5000 条,写盘防抖 2 秒。 - 浏览器侧另有上限 400 条的内存映射,React 重渲染后可零网络写回中文。
- 默认目标语言
zh-Hans;zh/zh-cn等会归一化为zh-Hans,zh-tw/zh-hk等为zh-Hant。
安全边界¶
四个 HTTP 路由仅接受本机 loopback 来源;Host 须为 localhost 或真实 127.x,拒绝 nip.io 类 rebinding;带 Origin 时须与 Host 同源;请求体上限 256KB,单次最多 8 段、每段最多 4000 字符。
安装与启用¶
前置条件:Windows 上的 DSH 桌面版(Web 界面可用);插件零 npm 运行时依赖。构建与测试需 Node.js ≥ 20,也可用 DSH 自带 Node。
- 将仓库放到
$DSH_HOME/plugins($DSH_HOME默认为$env:USERPROFILE\.dsh):
$dshHome = if ($env:DSH_HOME) { $env:DSH_HOME } else { Join-Path $env:USERPROFILE ".dsh" }
$plugin = Join-Path $dshHome "plugins\dsh-thinking-zh"
git clone https://github.com/waterc07/dsh-thinking-zh.git $plugin
- 运行安装脚本(幂等):
$node = "node" # PATH 里没有 Node 时,改成 DSH 安装目录下的 resources\runtime\bin\node.cmd
& $node (Join-Path $plugin "scripts\install.mjs") --profile desktop --dry-run
& $node (Join-Path $plugin "scripts\install.mjs") --profile desktop
安装脚本会写入 profile 的 package.json 依赖、dsh.profile.bundles,并创建 node_modules\dsh-thinking-zh junction。install.mjs 使用 Windows mklink /J,仅支持 Windows;其它平台需手动把插件路径加入 profile 依赖与 bundles。
- 重启 DSH。档案只在启动时读取。
卸载:
$node = "node"
& $node (Join-Path $plugin "scripts\install.mjs") --profile desktop --uninstall
# 然后重启 DSH
典型用法¶
默认开箱即用,无独立 UI。配置通过当前 DSH Web 端口的同源 HTTP 路由完成(桌面端端口见地址栏,或用 dsh web --port 指定时即该端口)。
查看状态:
$port = 5599 # 换成你的 DSH Web 端口
Invoke-RestMethod "http://127.0.0.1:$port/api/dsh-thinking-zh/state"
修改配置(持久化在 $DSH_HOME/dsh-thinking-zh/state.json;浏览器半约每 20 秒轮询,改后最长约 20 秒生效):
$body = @{ enabled = $true; targetLanguage = "zh-Hans"; provider = "bing" } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri "http://127.0.0.1:$port/api/dsh-thinking-zh/set" `
-ContentType "application/json" -Body $body
可写字段:enabled(false 时停止并恢复英文预览)、targetLanguage、provider(bing | google)。
浏览器 Console 调试:
window.__dshThinkingZh.status()
window.__dshThinkingZh.rows()
window.__dshThinkingZh.events()
await window.__dshThinkingZh.diag('manual')
主要路由:GET /api/dsh-thinking-zh/state、POST /api/dsh-thinking-zh/translate、POST /api/dsh-thinking-zh/set、POST /api/dsh-thinking-zh/diag(详见仓库 README)。
适用场景与注意¶
适合在 Windows DSH 桌面版上长期用中文界面浏览对话、又不想每次展开思考块才看懂预览的用户。与内置 cot-translation 搭配时,折叠行中文、展开正文仍可按内置方式切换。
使用前请注意:
- 插件以当前 DSH 进程权限运行,翻译请求经宿主半转发到 Bing/Google 匿名端点;安装前应自行审阅 源码 与 MIT 许可证。
- 联网工具分类反映其依赖外部翻译服务;上游故障或限流时单段会降级为英文,不会拖垮整页。
- 社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态本身是「一切皆插件」思路,本插件是社区贡献之一。
结尾¶
dsh-thinking-zh 用宿主同源代理加浏览器 DOM 就地替换,专门解决「折叠思考预览仍是英文」这一缺口,并与内置展开后翻译互不抢 DOM。需要细节、截图与测试报告时,见 GitHub 仓库 waterc07/dsh-thinking-zh 与目录页 https://www.skillhub.cn/plugins/waterc07/dsh-thinking-zh。