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

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

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

小夜