language-plugin-dsh: Conversation language optional, output defaults to English

前言

在 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye