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