dsh-thinking-zh:折叠思考预览自动译成中文

前言

在 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 等问题。插件因此拆成两半:

  1. 宿主半(src/index.js,Node/ESM):在 DSH Web 同源注册路由,代理翻译请求,负责去重、批量、缓存、超时与限流。
  2. 浏览器半(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。

  1. 将仓库放到 $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
  1. 运行安装脚本(幂等):
$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。

  1. 重启 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。

羽毛球分组比赛记分
小程序二维码

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

小夜