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。

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

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

小夜