dsh-harness-zh:把 DSH 拼進請求的英文提示詞譯成簡體中文

前言

DSH 的界面本身已經支持中文。locale 偏好能切界面,各插件自帶的 locale/zh.json 也能覆蓋一部分文案。真正沒有中文、而且界面看不見的,是拼進請求裏的英文原文:系統提示詞的各個段落、運行時上下文(工作目錄 / 沙箱策略 / 審批策略)、每個工具的描述和參數說明,以及 Cordis API 目錄。

這類文字的作用對象是模型,不是人。你在界面上看到中文界面,請求裏發的可能仍是英文,模型據此生成的推理自然跟着英文走。dsh-harness-zh 就是爲了補這個缺口:它在請求離開 Harness 之前把這些字符串替換爲簡體中文,界面語言不受影響。插件由 Giauzihau 維護,版本 0.2.7,適配 DSH 0.2.1-rc.5,按 MIT 發佈。

這是什麼

一句話定位:一個 DSH 插件,把面向模型的英文提示詞翻譯成簡體中文。

它翻譯的是固定文案,走詞典查表,不調用任何機器翻譯,因此同一段文字永遠得到同一個譯法,也不會因爲偶發錯誤污染一輪對話。插件只 import Node 內置模塊(node:fs / node:path / node:os / node:url),因爲配置檔的 node_modules 裏解析不到 @deepseek-ai/*。

核心功能

覆蓋範圍分四層,都由詞典驅動:

  1. 系統提示詞段落(sections)—— DSH 裝配出的各段系統提示詞。
  2. 運行時上下文(contexts)—— 工作目錄、沙箱策略、審批策略等。
  3. 工具描述(tools)—— 每個工具的名字外描述。
  4. 工具參數描述(parameters)—— 文本量最大的一項。

另外還有 messages(運行時上下文快照頭、技能清單提醒)、cordis-api.json(Cordis API 目錄,813 條)、mcp.json(MCP 資源服務器小節)和 runtime.json(沙箱策略措辭、審批禁用說明等)。

詞典放在 dict/,共 8 個文件、988 條詞條 + 11 條模板。查表順序是:精確匹配 → 空白歸一化匹配 → 模板匹配({{name}} 捕獲變量)。未命中就保持原樣,絕不猜測、絕不機翻。

一個關鍵的行爲邊界:會話層只翻譯 message.source.kind 屬於 harness 自己的四類消息(runtime-context、skill-catalog、user-approval、working-directory)。用戶或助手寫的正文一律原樣保留,詞典再大也改不到人打的字。

安裝與啓用

直接從 GitHub 安裝,不需要構建步驟(lib/ 是純 ESM,dict/ 是 JSON):

dsh plugin --profile web add github:Giauzihau/dsh-harness-zh

把 web 換成你實際在用的配置檔(瀏覽器 GUI 用 web,Electron 桌面端用 desktop)。dsh 是隨應用附帶的 CLI;在 Windows 上如果沒把它加進 PATH,完整路徑是 & "E:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd"。

需要可復現的版本時,裝到指定 tag 或 commit:

dsh plugin --profile web add github:Giauzihau/dsh-harness-zh#v0.2.7

本地開發也可以直接指向倉庫目錄:

dsh plugin --profile web add file:E:\path\to\dsh-harness-zh

裝完重啓 Harness(Web GUI 刷新頁面不夠,宿主進程要重啓),插件會隨 dsh.profile.bundles 自動激活。更新到默認分支最新版、或卸載:

dsh plugin --profile web add github:Giauzihau/dsh-harness-zh
dsh plugin --profile web remove dsh-harness-zh

兩點說明:

  • 包裏是可直接運行的 JavaScript,沒有構建步驟、也沒有 prepare 腳本,所以 pnpm 不會要求你批准構建。
  • 首次安裝要拉取倉庫 tarball,網絡慢時可能要一兩分鐘。

開發驗證用內置測試即可,插件自帶 26 個測試:

node --test

配置

配置寫在配置檔的 cordis.patch.yml 裏,按插件 id 覆蓋:

- id: harness-zh
  config:
    sections: true         # 系統提示詞段落
    contexts: true         # 運行時上下文(工作目錄、沙箱、審批策略)
    tools: true            # 工具描述
    parameters: true       # 工具參數描述(文本量最大的一項)
    messages: true         # 運行時上下文快照頭、技能清單提醒
    thinking: false        # 要求模型用中文推理(true / zh / en / 自定義句子)
    extraDictionaries: []  # 額外詞典目錄,覆蓋/補充內置詞典
    dumpMisses: false      # 把未命中的原文寫到 ~/.dsh/harness-zh-misses.json
    verbose: false         # 在 stderr 打印每次裝配的命中統計

enabled: false 可以整體關閉而不卸載。

默認只有 thinking 是關的,因爲它是行爲約束而不是文本替換,可能輕微影響推理質量。verbose: true 適合排查裝配階段哪些文字沒命中;dumpMisses: true 能把未命中的原文落成文件,方便你據此補詞典。

thinking:思維鏈語言

界面上「思考」面板裏的內容是模型自己生成的推理 token,不是插件能查表的固定文案。詞典再全也翻不了任意自然語言,唯一可行的辦法是在系統提示詞裏要求它:

- id: harness-zh
  config:
    thinking: zh   # 等價於 true;'en' 表示要求用英文;其他字符串按原文注入

開啓後插件會把同一句話註冊兩次:一節系統提示詞(緊跟 persona 前綴、在工具策略之前),外加一條運行時上下文(order: 900,渲染在每步快照的末尾)。後者每步都會重新渲染、位置又在末尾,實測比只寫系統提示詞更容易生效。0.2.7 起正文還帶一箇中文正例和一個反例,給模型一個可模仿的句式。

這裏有一個必須提前知道的邊界:換模型比加強措辭更有效。 實測結論(0.2.7,2026-10-31)是分 provider 的:

  • DeepSeek 賬號(官方 deepseek-account provider,例如 deepseek-flash):全部功能正常,開啓 thinking: zh 後「思考」面板會跟着變中文。
  • 其他中轉 / 聚合 provider(把模型轉發到第三方網關的通道,例如 autodl 這類):提示詞翻譯照常生效,但可能出現思考過程未翻譯,「思考」面板裏的推理仍是英文。

原因是思考文本是模型或中轉通道自己生成的,插件只能通過提示詞要求它改用中文,改不了已經生成的推理 token;部分中轉通道對系統提示詞裏的語言要求不敏感。指令也不保證 100% 生效——它能改變模型行爲,不能重寫已經生成的思維鏈。

此外它隻影響「思考」面板,不改變答覆語言;答覆語言仍由你的措辭和模型自身判斷決定。

追加自己的詞典

第三方插件(acp_*、hindsight_*、mcp_connector_*、modlens_* 等)的文字不在範圍內,它們隨各自插件版本變化,硬編碼進本插件只會隨對方升級而腐爛。需要時用 extraDictionaries 單獨提供:

{
  "my-plugin:tool:foo": { "kind": "tool", "en": "Original English text.", "zh": "中文譯文。" }
}

extraDictionaries 指向的目錄裏放 *.json,格式與內置詞典相同。嵌套寫法({ "<包名>": { "<鍵>": { "en": …, "zh": … } } })也能讀取,方便直接沿用社區詞典。

工作原理:三步,因爲同一段文字會被渲染多次

  1. system-prompt/assemble(waterfall) —— 在裝配結果交給模型之前翻譯 sections、contexts、tools[].description 和參數 schema 裏的 description。
  2. SystemPrompt#refreshContext(原型補丁) —— agent-loop.step() 在發請求前會把每個上下文重新從註冊的 provider 解析一遍,這會把第 1 步翻好的英文還原。補丁打在原型上而非實例上。
  3. Session#append(原型補丁) —— 運行時上下文快照和技能清單是循環在裝配之後自己 append 的,而真正發給適配器的請求已被深凍結(嘗試原地改寫會拋 Cannot assign to read only property 'text')。因此在寫入會話這一層翻譯:消息對象凍結,插件追加一份翻譯後的副本,id 與 source 保持不變。

三步都包在 try/catch 裏,任何一步翻譯失敗都降級爲原文,不會讓一輪對話失敗。

適用場景與注意事項

適合下面這些情況:

  • 你對 DSH 界面已經是中文,但希望模型拿到的系統提示詞、工具描述、參數說明也是中文。
  • 你用 DeepSeek 官方賬號(deepseek-account provider),想順帶讓模型用中文推理。
  • 你要排查第三方插件或 MCP 服務器帶來的英文文本,需要 dumpMisses 幫定位。

需要提前知道的幾點:

  • 插件以當前 dsh 進程的權限運行。安裝前請檢查源碼與許可證(MIT,派生譯文署名見倉庫 NOTICE)。
  • 第三方中轉 / 聚合 provider 下思考過程可能仍是英文,這是模型通道本身的行爲差異,不是翻譯沒生效。
  • 技能清單裏每個技能自己的描述來自對應技能包,仍是英文;本插件只翻譯那顆提醒的框架句。
  • 頁面上直接帶給模型的第三方 MCP 工具文本不在詞典內。
  • 若 Harness 後續改了 refreshContext / Session#append / system-prompt/assemble 的形狀,插件會靜默退化爲只翻譯裝配階段(界面照常可用),verbose: true 能看到退化點。

結尾

dsh-harness-zh 做的事情很窄:把 DSH 拼進請求、但界面看不見的那部分英文固定文案,換成簡體中文。它不碰人打的字,不做機器翻譯,翻譯失敗就降級爲原文。對在意模型側提示詞語言一致性的 DSH 使用者來說,這是個小而明確的補充。

目錄頁:https://www.skillhub.cn/plugins/Giauzihau/dsh-harness-zh
GitHub:https://github.com/Giauzihau/dsh-harness-zh

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

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

小夜