前言¶
在 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。