前言¶
在 DeepSeek Harness(DSH)里希望模型全程用简体中文做内部推理(thinking / reasoning)并回复用户,常见做法是在 AGENTS.md 里写「请用中文思考」。这条路径会随会话变长而失效:AGENTS.md 经 agent-instructions 以 user 角色注入,只在文件被读/写/编辑时刷新;注入内容进入对话历史,会被 compaction 压缩遮蔽;模型推理语言还容易被最近一条英文工具输出拉回英文。README 中的实测数据是:注入后前两块推理的中文字符占比约 64.8% / 64.5%,同一会话跑到第 89 块时完全回退英文,长会话整体只剩 5%–25%。
下面介绍社区插件 dsh-zh-thinking(维护者 programerror233,分类:模型推理)。它通过向系统提示注册常驻 section,让规则在每一步 assemble() + renderPrompt() 时都在模型眼前,不进入历史、不被压缩丢弃,并对所有会话、工作区与子代理生效。
这是什么¶
dsh-zh-thinking 是发布在 npm 的包(当前版本 0.1.0,MIT 许可),面向 DSH 用户:强制 Harness 中的模型用简体中文书写内部推理与面向用户的最终回复。安装后热加载立即生效,正在运行的会话无需重启。
插件页:SkillHub 目录
源码与说明:GitHub programerror233/dsh-zh-thinking
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
原理简述¶
DSH 的 dsh-agent-loop 每一步都会重新组装并渲染 prompt;SystemPromptProjection.project 在文本不变时可零提交。写进 system prompt 的规则因此:
- 每一步都生效,不是「提醒一次然后衰减」;
- 不进入对话历史;
- 不会被 compaction 压缩(压缩只处理 surface 节点 0 之后的节点)。
插件使用独立 section 名 zh:reasoning-language,避免被各 agent preset 里已有的 persona 相关 section 遮蔽,从而对全局所有 agent(含子代理)生效。order: 1 使其紧跟人格前缀(order: 0)之后、排在工具说明之前,属于身份级指令。
安装与启用¶
官方推荐通过 DSH 的 plugin 命令安装(命令来自 README,请替换为你的 profile 名):
dsh plugin --profile <你的 profile 名> add dsh-zh-thinking
例如 profile 名为 desktop:
dsh plugin --profile desktop add dsh-zh-thinking
安装后 dsh 会把它列入 profile 的 dsh.profile.bundles,bundle 补丁层自动挂载。
注意: 插件以当前 dsh 进程权限运行;安装前建议在 GitHub 上查看源码与 LICENSE(MIT),确认符合你的安全与合规要求。
手动安装(不走 npm)¶
README 说明可将仓库放到本地,在 profile 的 cordis.patch.yml 末尾追加(路径需改为你的绝对路径;Windows 请用 file:/// 形式,裸盘符路径会报 ERR_UNSUPPORTED_ESM_URL_SCHEME):
- insert:
- id: zh-thinking
name: file:///绝对路径/dsh-zh-thinking/lib/index.js
npm 安装与上述手动 insert 不能同时存在(同一 section 名会触发 prompt section "zh:reasoning-language" is already registered)。迁移时需先删掉手动那段,再执行 dsh plugin ... add dsh-zh-thinking。
配置(可选)¶
可在 profile 的 cordis.patch.yml 里覆盖插件项:
- id: zh-thinking
name: dsh-zh-thinking
config:
sectionName: zh:reasoning-language # section 名,改它没有实际必要
order: 1 # 越小越靠前;0 是 persona-prefix
text: |- # 完全自定义提示正文
你的语言要求正文。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sectionName |
string |
"zh:reasoning-language" |
须为新名字,避免被 preset 同名 section 覆盖。 |
order |
number |
1 |
0 为 deployment:persona-prefix,10200 为 deployment:persona-suffix。 |
text |
string |
见 README | 勿包含 {{,否则会被当成提示变量引用而抛错;插件会回落内置文本并打印警告。 |
默认正文要点:内部推理与最终回复均用简体中文,优先于示例语言与英文任务描述/工具输出;代码标识符、路径、API 名等可保留 ASCII,但需用中文说明包围;若发现用英文思考,应先用中文重写再继续。
典型用法与验证¶
安装后无需额外操作即可全局生效。若要确认 section 已注入,可在任意会话启动后查看日志里的 system/message 事件(可用 dsh 的 inspect 能力或直接读会话 JSONL),正文中应出现 # 语言要求(最高优先级) 等默认或自定义文本。
README 记载的实测(Windows 上原始版本):本会话 system/message 长度从不含语言要求的 8016 变为 8297,语言要求位于第 116 字符处;注入后连续 12 块推理的中文字符占比均值 46.2%,注入前同一会话 239 块均值 3.6%。新派子代理的 system/message 同样包含该规则,子代理推理块占比示例为 28.8% / 50.9% / 56.5% / 81.8%,最终回复为纯中文。
成本与兼容性¶
常驻规则约 300 token,每一步命中 prompt 缓存。README 按中文约 0.7 token/字估算:235 步会话约 7 万 cacheRead token,占该会话总 cacheRead 的 0.62%。对比每步追加 60 字提醒消息,累计约 9870 token 且会被 compaction 丢弃,更贵也更不可靠。
- 零
import,不依赖 profilenode_modules解析矩阵; - 仅依赖公开 API
ctx.systemPrompt.section()(dsh-system-prompt); - 要求 Node >= 20(见 package.json)。
适用场景与已知边界¶
适合: 长期在 DSH 中开发、希望 thinking 与用户回复稳定使用简体中文,且不愿依赖会衰减的 AGENTS.md 提示的团队或个人。
边界(README 原文):
- 同一 section 名只能注册一次;与其他注册
zh:reasoning-language的插件冲突时需改config.sectionName或只保留一个。 - 只影响此后新产生的推理,历史英文 reasoning 不会改写。
- 不能强制 100% 中文字符占比(路径、命令、API 名等按设计保留 ASCII)。
- 模型仍可能偶尔夹杂英文短语;规则是概率性约束,不是硬编码。
卸载¶
dsh plugin --profile <你的 profile 名> remove dsh-zh-thinking
结尾¶
dsh-zh-thinking 把「用简体中文思考与作答」从易衰减的历史消息,改成每步都存在的 system prompt section,覆盖主会话与子代理,并支持可选自定义正文。需要安装命令、手动补丁与配置字段时,以 GitHub README 为准;目录索引见 SkillHub。