模型产出文本的三个语言通道——工具调用描述(所有工具调用卡片标题,含 PTC 类预设的 run_code)、思考与回复——各自可跟随网页界面语言、强制指定语言或关闭(默认仅描述通道跟随界面语言)。host 侧注入一条全局 runtime-context 提示指示,client 半上报界面语言,设置里的插件卡片负责切换。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-agent-lang
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:KannaKuron/dsh-agent-lang
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
Agent 语言控制 —— 让 DeepSeek Harness (DSH) 里模型的工具描述、思考、回复输出三个通道的语言各自可配:跟随界面语言、强制指定语言、或关闭,支持一键全部跟随/一键全关。默认只开工具描述通道(含 PTC 模式
run_code的description,即工具卡片标题)跟随界面语言,替代永远英文。
为什么需要它
DSH 里每一次工具调用的 description 参数都是必填的,而且原样显示在 UI 的调用卡片上(PTC 模式下它就是 run_code 卡片的标题)。但工具 schema 里对这个字段的说明全是英文措辞加英文示例("5-10 words … Examples: 'Count TODO markers…'"),所以模型默认永远写英文描述——界面是中文的用户,看每一步都在看英文。
本插件只改提示词侧:注册一条全局动态 runtime-context 指示,告诉模型当前 GUI 显示语言、并要求所有工具调用描述用该语言书写。不修改任何 preset、persona 或工具 schema(它们是部署资产,升级会覆盖)。
支持范围
| 模式 / preset | 支持 | 说明 |
|---|---|---|
standard(标准模式) |
✅ | |
ptc(PTC 模式,旧名 code) |
✅ | run_code 的 description 同样覆盖 |
cordis(创造模式) |
✅ | |
用户自建 preset(含 ptc-cordis、dsh-gitbash-shell 的 gitbash 变体等) |
✅ | 挂在主机面,对进程内所有未封闭提示的 preset 生效 |
| 智能体团队队员 / 普通子代理(v0.8.0) | ✅ 默认生效 | 队员与子代理的请求同样带上指示;设置里可切「仅主代理」。fork 出的队员会继承主代理已完成回合的历史快照(含已提交的指示),开关不重写历史 |
minimal(极简模式) |
❌(设计如此) | minimal 的 persona 是 complete: true 且压制 runtime context,提示词对一切后挂贡献者封闭——任何提示级插件都无法进入,需要产品侧改动 |
与 dsh 0.2.1 工具描述顺序指引的关系(互补,零冲突)
dsh 0.2.1 起,bash / pwsh 工具 schema 带着「Provide description before command in the arguments」指引,让 UI 在工具调用的准备阶段就渲染已到达的描述(run_code 在 alpha.3~alpha.4 曾同样把 description 排到最前,alpha.5 反转回 code 在前并删去对应指引句)。这与本插件正交且互补:
- 官方管「顺序」:引导模型先发 description,准备阶段的调用卡片就有标题可渲染;
- 本插件管「语言」:同一条 runtime-context 指示决定这些描述(含准备阶段标题)用什么语言书写。
官方 schema 里的英文示例措辞没有变,「界面中文、描述英文」的落差依旧由本插件的描述通道补齐。新工具(如 0.2.1 的 schedule_* 提醒工具)的调用描述同样自动受控:通道是全局的,按工具调用的 description 参数生效,与工具清单增减无关。已对 dsh 0.2.1-alpha.5 复核:systemPrompt.context 签名零变化;CONTEXT_ORDERS 新增 TEAM_IDENTITY: 125(0.2.1-alpha.3),本插件槽位已随之从 125 迁至 130(v0.12.0)。
工作原理
浏览器(GUI) DSH Host 进程
┌─────────────────────┐ 上报当前界面语言 ┌──────────────────────────────┐
│ locale 运行时 │ ─────────────────▶ │ settings ns「agent-lang」 │
│ (显式选择,或浏览器 │ (只写 uiLocale 字段) │ .uiLocale ← 浏览器上报 │
│ navigator 匹配) │ │ .mode/.forceLocale ← 设置卡片 │
└─────────────────────┘ │ settings ns「locale」(只读) │
│ .preference ← 设置里的显式选择 │
└──────────────┬───────────────┘
│ 每次请求组装时求值
┌──────────────▼───────────────┐
│ systemPrompt.context(全局) │
│ 「用 <语言> 写工具调用描述」 │
└──────────────────────────────┘
- 检测优先级(auto 模式):设置 → 通用 → 语言里的显式选择 > 浏览器上报的当前语言;英文也是正常目标语言(v0.3.0 起)——部分模型会在思考/输出里混杂多语言,显式英文指示同样能纠正;仅完全未检测到语言时不注入。
- 注入通道:
systemPrompt.context()—— 与沙箱/审批策略同一个每轮刷新的 runtime-context 快照,渲染在请求末尾,近因盖过工具 schema 里的英文指引;切换界面语言后下一轮请求即生效,无需重启。 - 设置卡片:设置 → 插件 里出现本插件的卡片(与宿主已服务的设置命名空间自动配对),可切换行为:跟随界面语言 / 强制指定语言(下拉候选或自填 BCP 47 标签,如
zh、ja)/ 关闭,并显示当前检测链。
安装
dsh plugin --profile web add dsh-agent-lang # npm 公开包
# 源码与 Release: https://github.com/KannaKuron/dsh-agent-lang
纯 JS、零构建、零安装依赖(schemastery 以 peer 声明,经 profile 共享解析),安装不触发构建脚本。装完重启 DSH,打开任意会话即可;设置 → 插件 里可找到「工具描述语言」卡片。
本地开发版安装
npm pack # 出 tarball
# 在 (dsh home)/profiles/web 里:
pnpm add <tarball 路径> # package.json 的 dsh.bundle.patch 声明会自动挂载
# 重启 DSH
验证
- 安装并重启 DSH,硬刷新一次页面(⌘/Ctrl+Shift+R,见「已知边界」第 1 条),打开 Web GUI(浏览器语言或设置选择为中文);
~/.dsh/settings.yaml出现agent-lang:段(uiLocale: zh,页面加载后);- 新建任意模式的会话,让模型跑几步工具调用——卡片描述应为中文;
- 设置 → 通用 → 语言 里切换语言,再发一条消息——下一轮请求描述即切换;
- 设置 → 插件 → 工具描述语言:切到「强制指定语言」,下拉选
ja(或自填标签),描述变日文;切「关闭」回到英文。
版本兼容
dsh 0.1.7-rc.2 与 rc.1 已在隔离实例上逐项复核通过(rc.2 的核对记录、逐面零 diff 依据与真机证据见 CHANGELOG v0.7.1,rc.1 见 v0.7.0);0.1.6-alpha.1 的核对记录见 CHANGELOG v0.4.3:
systemPrompt.context()契约未变:PromptContext仍是{ name, order, text },order 125(0.2.1-alpha.3 官方占号后已迁 130,见 v0.12.0)仍在官方 CONTEXT_ORDERS 之后;interpolate: false只作用于 sections,本插件不用。- 注入文本不存在
{{...}}插值风险:三条语言来源(强制标签 / 设置里的显式选择 / 浏览器上报)全部经 BCP47 校验后才进入文本。 - 设置面仍在 0.1.7 分界:0.1.7 起是「行
Config+configForms」,0.1.6 及以前是注册命名空间;设置卡两个座位照旧——settings.plugin.item(≤0.1.6 宿主;0.1.7 上无 owner,静默挂起)与plugins.bundle.config(按包名 key,0.1.6-alpha.2 起,0.1.7 上实际生效)。 - 插件清单声明了 dsh 0.1.7-rc.1 起强制执行的兼容 peer:
"@deepseek-ai/dsh": ">=0.1.0"(标为 optional,避免包管理器把只有预发布版本的@deepseek-ai/dsh拉进安装)。该声明让本插件真正被兼容门禁覆盖(此前没有任何这类 peer,等于永不被校验),同时不设上界:插件靠运行时探测跨版本自愈,未来 dsh 升级不会被自动停用。 - rc.2 追加(v0.7.1):rc.2 把统一设计令牌铺满客户端——圆角
--dsw-radius-*与焦点环--dsw-focus-ring-*(指针模态下官方不画环),本插件卡片已按「新令牌 + 旧字面量回退」跟进,≤rc.1 宿主渲染不变;同时修掉一个自首版起就存在的静默缺陷——chevron 探测的IconChevronDownOutline14在 0.1.7 里并不存在(官方家族是…OutlineRegular/…OutlineMedium),卡片因此一直显示文字「▾」,现在改为候选链探测。
已知边界
- 新装/更新后的首次启动需硬刷新一次(2026-08-31 真机实测):首次页面加载可能赶上客户端模块表重建(combo revision 变化),新装包被暂时排除——表现为设置卡片未出现,但上报痕迹已经落盘(0.1.6 及以前在
settings.yaml,0.1.7起在 profile 的cordis.patch.yml用户层:上报先于剔除发生)。硬刷新(⌘/Ctrl+Shift+R)即恢复;日常重启不复发。 - minimal 模式:提示词封闭(见上表),不受本插件影响。
- 无浏览器页面时(如纯 CLI 部署):只有「显式选择」一条检测链;从未在设置里选过语言则不注入。
- 多浏览器/远程页面:界面语言是全局单值,后打开的页面上报会覆盖前者;非 loopback 页面的设置选择可能进程本地化(DSH 行为)。
- 子代理 / workflow 的模型同样看到该指示(它们的描述也显示在 UI 里,语义一致)。
许可
MIT
链接
同类插件
Ebony-Vinyl/dsh-our-free-model★ 25179
为 dsh 接入免费模型车道(含 DeepSeek V4.1 Flash、Kimi K3 等),无需登录、注册或填写 API Key,并提供本地 OpenAI 兼容网关、降级路由与用量看板。
corrinehu/dsh-workbuddy-connect★ 1343
将 WorkBuddy 桌面 App 包含的模型自动接入 DeepSeek Harness,在 DSH 对话窗口里零配置使用。
V1ki/dsh-plugin-subscriptions★ 478
把 ChatGPT(Codex)、Claude、Grok 订阅当作 DeepSeek Harness 的 LLM 提供方:设置页登录、模型目录、用量展示,以及 image_generate、video_generate 与 x_search 工具。
Mars-Sea/dsh-commandcode-provider★ 407
非官方 Command Code 模型接入插件:注册 `commandcode` 路由,带实时模型目录与推理强度支持。
cv-superding/dsh-deepseek-web-login★ 286
新增 deepseek-web provider,把 chat.deepseek.com 网页端模型接入 DSH:浏览器登录抓取、PoW 请求签名、SSE 流式传输与基于提示词的工具调用。
FishBottle7/opencode2dsh★ 270
将 OpenCode Zen 免费模型接入 DeepSeek Harness,无需 API Key。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。