前言¶
在 DeepSeek Harness(DSH)里,模型的「思考过程 / Thinking」和最终回答来自同一次生成步骤,API 上没有单独的「思考语言」字段。常见做法是全程用中文提问,希望推理也跟着中文走;一旦对话里混入英文系统说明、工具输出或代码报错,推理语言很容易漂回英文。
下面介绍 maintainer lance808 维护的 bundle 插件 dsh-think-zh(社区目录分类:模型推理)。它在系统提示词中注入一段高优先级语言规则,要求 Agent 在作答前用指定语言(默认简体中文)做内部推理,并可在 Harness Web 的插件页对整个 profile 一键开关。插件零依赖、零构建,MIT 许可,当前 GitHub 星标为 0。
这是什么¶
dsh-think-zh 是 DSH 宿主插件:通过 ctx.systemPrompt.section() 向系统提示词贡献名为 agent:reasoning-language 的 section(bundle 行 id 仍为 think-in-chinese,与改名前的身份一致,避免已安装配置变成未加载死行)。
推理内容不是独立请求,能影响它的杠杆只有该步骤开始时模型看到的提示词。本插件不读取、不改写落盘的 reasoning 块,只影响生成时的提示词;属于提示词层面的引导,不是硬约束。
核心功能¶
- 默认只约束推理:
target: think时,最终回复语言仍跟随用户;推理通道固定为配置的语言。 - 可选约束回答:
target: all时,推理与回答都使用配置语言(用户明确要求换语言除外)。 - 原文保留:
verbatim: true(默认)时,指令要求代码、命令、路径、URL、标识符、工具参数等保持原文,避免把报错和代码一并翻译进思考。 - 完全自定义文案:
instruction非空时替换按上述字段生成的内置指令。 - 真关闭:
enabled: false或插件页关闭后,不注册 section(不是注册空文本)。 - 作用域:行挂在 Host 平面,对该 profile 下所有 Agent(含子代理、workflow、fork)生效;不支持按会话单独开关。
section 使用显式 order: 480,排在人设之后、plan 策略与工具引导之前,避免语言规则被埋在数千 token 的工具文档后面而失去效果。
安装与启用¶
插件以当前 DSH 进程权限加载本地 bundle;安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。
方式一:Harness Web¶
在 Harness Web 的 插件(Plugins) 页面安装该 bundle,用页面开关启用或关闭。改动对整个 profile 的所有会话生效,重启后仍保留。
方式二:plugin_manager¶
具备 plugin_manager 工具权限的会话,对插件目录(或克隆后的目录)执行:
plugin_manager({ action: "install_bundle", target: "<本目录或克隆后的绝对路径>" })
从 GitHub 获取源码后,README 给出的安装方式为克隆仓库,再对克隆路径执行同一条 install_bundle(资料原文如此,无 dsh plugin add github:… 类命令)。
安装完成后可在插件页切换 think-in-chinese 这一行;卸载示例:
plugin_manager({ action: "remove_bundle", target: "dsh-think-zh" })
命令行确认是否加载:执行 plugin_manager({ action: "list_bundles" }),应看到 rows[0].rowId = think-in-chinese 且带有 entryId;有 rowId 无 entryId 通常表示模块未激活(例如导入失败)。
注意:本地修改 bundle 的 index.js 后,卸载重装或插件页禁用再启用不会加载新代码(ESM 按文件 URL 缓存模块),需重启 Harness 进程才会生效。
配置¶
用户层配置写在 cordis.patch.yml(用户 patch 优先级更高,升级不丢)。包内默认行示例:
- id: think-in-chinese
config:
language: 简体中文 # 思考所用语言
target: think # think(只约束思考)| all(思考与回答都用该语言)
verbatim: true # 是否加入"代码/命令/路径保持原文"的约束
enabled: true # 关闭后完全不注册 section
instruction: '' # 非空时完全替换内置指令文本
| 字段 | 默认值 | 含义 |
|---|---|---|
language |
简体中文 |
思考语言名称,可为 繁體中文、English、日本語 等 |
target |
think |
think 仅推理;all 推理与回答 |
verbatim |
true |
是否加入原文保留约束 |
enabled |
true |
关闭时不注册 section |
instruction |
'' |
自定义指令全文,非空则取代自动生成文本 |
字段校验在 profile 加载时进行:target 仅 think / all,enabled 与 verbatim 须为布尔值,未知字段会报 unknown field 并给出路径,不会静默忽略。
典型用法与生效确认¶
肉眼确认¶
观察回复上方的「思考过程 / Thinking」折叠区,内容应为中文(或你配置的 language)。
用会话日志量化¶
推理块以 reasoning 类型写入压缩会话日志。README 给出解压与统计中文字符占比的示例:
# 日志是 zstd 压缩的 JSONL
zstd -d -c "$DSH_HOME/sessions/<workspace>/<session-id>/session.v4.jsonl.zstd" > session.jsonl
// 统计每个 reasoning 块的中文字符比
const events = readFileSync('session.jsonl', 'utf8').split('\n').filter(Boolean).map(JSON.parse)
for (const e of events) {
if (e.type !== 'assistant/message') continue
for (const b of e.data?.message?.content ?? []) {
if (b.type !== 'reasoning') continue
const cjk = (b.text.match(/[\u4e00-\u9fff]/g) ?? []).length
const latin = (b.text.match(/[A-Za-z]/g) ?? []).length
console.log(e.seq, (cjk / (cjk + latin || 1)).toFixed(3), b.text.slice(0, 40))
}
}
作者在单会话抽样中报告:30 个非空推理块里 25 个中文占比达标(约 83%);长分析块(≥400 字符)全部为中文,紧跟工具调用后的短决策块仍可能漂回英文(诱因多为英文工具输出)。这是已知边界,不是改一两句文案就能完全消除的。
调整行为¶
- 只希望思考中文、回答跟用户语言:保持默认
target: think。 - 希望回答也固定中文:设
target: all。 - 工具返回英文后仍想强化语言:可设自定义
instruction,针对「工具返回后先用目标语言复述」等场景(需自行撰写全文)。
适用场景与注意¶
适合:在 DSH 中长期使用支持 reasoning 通道的模型,希望推理过程稳定使用中文(或其他配置语言),又需要代码、路径、命令在思考里保持原文的场景。
注意:
- 插件运行在 DSH 宿主进程内,安装前请审查源码与许可;社区目录 SkillHub 插件页 与 GitHub 无 DeepSeek / 幻方官方应用商店关系,DSH 生态本身是「一切皆插件」的扩展模型。
- 约束是提示词引导,个别步骤仍可能用其他语言推理。
- 若只对某类 Agent 生效,应把配置行放到对应 agent preset,而不是依赖 Host 平面全局开关。
- 包版本 0.1.0,要求 Node ≥ 18;本地可运行
node test.js做零依赖断言(schema、默认文案、注册与卸载语义等)。
结尾¶
dsh-think-zh 用一条常驻、排序靠前的系统提示词 section,把「内部推理用什么语言」从碰运气的上下文漂移,变成可配置、可开关的 profile 级策略。需要了解详情、提交 issue 或查看英文 README,请访问 GitHub:lance808/dsh-think-zh;在社区浏览同类插件可打开 SkillHub 目录页。