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