language-plugin-dsh:對話語言可選,產物默認英文

前言

在 DSH 裏用中文和智能體溝通時,常見需求是:回覆用用戶熟悉的語言,而寫入倉庫的內容——代碼註釋、文檔、commit message、PR 正文——仍保持英文,便於協作與檢索。若只靠每次在對話裏重複說明,既占上下文,也容易在某一輪被模型忽略。下面介紹社區客戶端插件 language-plugin-dsh,它通過系統提示中的獨立策略軸和多層約束,把「聊什麼語言」和「寫什麼語言」分開管理。

這是什麼

language-plugin-dsh(npm 包名同名,版本 0.1.0)由 farchanjo(Fabricio Archanjo)維護,MIT 許可證,歸類爲 DSH 社區目錄中的客戶端插件。定位是:在終端與 Web 兩種 DSH 界面下,固定對話與產物的語言策略——默認對話跟隨用戶輸入(chat: inherit),產物 pinned 爲 en-US(標識符、註釋、文檔、提交與 PR 文案等),且不修改 DSH 核心、不 patch、不 fork,僅通過 Cordis 服務掛載。

目錄頁:https://www.skillhub.cn/plugins/farchanjo/language-plugin-dsh
源碼與說明:https://github.com/farchanjo/language-plugin-dsh

兩條獨立策略軸

策略寫在 system-prompt 的一個 section 裏,兩條軸互不混用:

軸 可選值 含義
chat inherit(默認)、auto、off、BCP-47 標籤 智能體回覆的正文語言
artifacts en-US(默認)、inherit、off、BCP-47 標籤 寫入文件或 forge 的內容語言
decide auto(默認)、stopwords、jev、off 守衛如何判斷文本語言

chat 默認 inherit(auto 爲其別名):回覆跟用戶用語一致。artifacts 默認 en-US:無論回覆用什麼語言,落盤的註釋、文檔、commit 等仍按英文策略約束。對話規則只掛在根 agent 上,子 agent 不繼承「面向用戶的口吻」;產物規則是全局的,子 agent 同樣拿到產物 section、尾部提醒與 write guard,並有獨立預算。

核心能力概覽

  • 插件化:純 Cordis 服務,零運行時網絡依賴(語言判定在部分模式下會可選調用外部模型,見下文)。
  • 命令 /lang:打開編號選擇器;在 composer 裏直接輸入一次語言選擇會被吞掉(不發給模型)。選擇器 120 秒過期,除列出的按鍵外任意消息會關閉選擇器並正常發送。
  • 離線 strict 模式:可選地在本機用停用詞啓發式檢測被忽略的 chat 語言,並引導一次糾正,不額外調用模型。
  • 分層執行:尾部 reminder 隨 runtime-context 快照每步更新;write guard 在 write/edit 執行前檢查註釋與文檔類正文;compaction 摘要與 session title 分別跟隨產物策略與 chat 語言。

插件聲明 commands.dsh/v1alpha1#Command 與 commands.invoke 權限,無需 grants 文件(無中介能力與持久化存儲由插件自身 config 承擔)。

安裝與啓用

官方 README 給出的步驟是先取得倉庫目錄,再按 profile 加入插件。安裝後需重啓 DSH;移除命令爲 dsh plugin --profile <p> remove language-plugin-dsh。

git clone https://github.com/farchanjo/language-plugin-dsh.git
dsh plugin --profile tui add ./language-plugin-dsh   # terminal UI
dsh plugin --profile web add ./language-plugin-dsh   # web UI

運行時要求 Node ^22.19 || >=24。插件依賴 @deepseek-ai/dsh-compaction-basic(package.json 中爲 0.2.1-rc.2),由 dsh plugin add 一併安裝。

安全說明:插件以當前 DSH 進程的權限運行。安裝前應在 GitHub 上閱讀源碼與 MIT 許可證,確認行爲符合你的環境與合規要求;社區目錄 skillhub.cn 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

典型用法

/lang 子命令

/lang                      # 打開選擇器(也可:/lang status)
/lang chat pt-BR           # 按標籤強制回覆語言
/lang chat inherit         # 跟隨用戶(默認;auto 爲別名)
/lang chat off             # 不注入 chat 規則
/lang artifacts en-US      # 產物保持英文(默認)
/lang artifacts inherit    # 產物跟隨 chat 軸
/lang artifacts off        # 不注入產物規則
/lang strict on            # 糾正被忽略的 chat 語言
/lang decide auto          # 守衛判定方式(auto、stopwords、jev、off)
/lang reset                # 恢復 inherit / en-US / off

選擇器列出 79 種語言(前 10 爲常用語,其餘按字母序),標籤名來自 Intl.DisplayNames,狀態行帶 BCP-47 tag。按鍵:1–79 設 chat 語言,0 爲 inherit,o 關閉 chat 規則,s 切換 strict,q 關閉。列表外語言可用 tag 設置,例如 /lang chat eo;tag 會規範化(如 pt-br → pt-BR)並用 Intl.getCanonicalLocales 校驗。

狀態持久化

運行時真相在 ~/.config/language-plugin-dsh/config.json(目錄權限 0700,文件 0600,原子寫入)。cordis.patch.yml 中的 row 配置僅用於全新安裝時的種子值。

語言判定(decide)

模式 行爲
auto 六種本地可離線檢測的語言走離線;其餘走判定模型
stopwords 始終離線
jev 始終模型,失敗時回退離線
off 不判定,守衛不生效

模型路徑使用 TypeSafe System One(noul + choice);密鑰來自環境變量 TYPESAFE_AI_FABRICIO_KEY 或 TYPESAFE_API_KEY,或 credential store。網絡失敗不會阻塞整輪對話;結果按內容哈希緩存,上游 prose 上限 4000 字符。

執行與限制

執行層大致如下:

層 掛載面 作用
Reminder system-prompt/assemble 策略寫入 runtime-context 尾部,每步替換
Write guard tools/pre-execute write/edit 前檢查註釋與文檔;語言不符則拒絕並提示重試
Summarizer 插件自掛 compaction 引擎 繼承 stock 步驟,僅摘要 directive 帶產物語言
Title llm/stream(purpose: 'session-title') 標題跟隨 chat 語言

write guard 只判「人類可讀 prose」:文檔正文與註釋行;標識符、字符串、數據文件與本地化資源等跳過;全文 prose 不足八個詞則不判。每 agent 每輪最多兩次拒絕與兩次糾正。

需要心裏有數的限制(均來自上游 README):

  • 策略是 prompt section,每步重新組裝,不是後處理器;模型仍可能無視。若在意一致性可開 strict。
  • 離線檢測覆蓋葡萄牙語、英語、西班牙語、法語、德語、意大利語六種;目標語言不在其中時,僅靠 stopwords 無法攔截 write,需 decide: jev 或 auto。
  • jev 會產生 token 成本,單次 write 前最多約 2.5 s 延遲。
  • 已有文件 wording 不會自動改寫;整庫轉語言需你明確下指令。
  • 僅一個引擎能 claim compaction;若 preset 或 backend-mode jev 已佔用,插件不會崩潰,但摘要語言可能退回宿主默認。

chat 規則中會 verbatim 列出代碼、命令、路徑、標識符、錯誤串、工具輸出等,避免「強制回覆語言」誤翻譯 payload;用戶在同一條消息裏明確要求另一種語言時,該輪以用戶爲準。

適用場景

適合經常在 DSH 裏用非英語對話、又希望倉庫側文檔與提交信息保持英文(或你自行指定的 BCP-47)的開發者。也適合需要 /lang 快速切換回復語言、同時用 write guard 降低「中文回覆卻寫出中文註釋進 repo」的概率的場景。

若你 heavily 依賴其他 compaction preset,或主要寫日語等非六種離線語言且不想配置 TypeSafe 密鑰,需要先理解 decide 與 guard 的邊界,再決定是否啓用 strict 與 jev。

結尾

language-plugin-dsh 把 DSH 對話語言與產物語言拆成兩條可配置軸,用 /lang、持久化 config 與 reminder / write guard / compaction / title 多層配合,在「一切皆插件」的 DSH 生態裏提供一種不 fork 核心的做法。進一步細節以 README 爲準:

  • 目錄:https://www.skillhub.cn/plugins/farchanjo/language-plugin-dsh
  • GitHub:https://github.com/farchanjo/language-plugin-dsh
羽毛球分组比赛记分
小程序二维码

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

小夜