前言¶
和通用 agent 协作时,最常见的别扭是:它不知道你现在想干什么。你想先把方案聊清楚,它已经开始改文件;你让它挑毛病,它反过来夸方案写得不错;方案定了,它还在反复追问“要不要再确认一下”。本质上是同一个模型在三种角色之间来回横跳,只能靠在提示词里反复叮嘱。
dsh-three-modes(维护者 sunlei1214,分类:工作流)把“现在该扮演谁”变成输入框下方一个显式的、可切换的状态。切换的瞬间,系统提示词、工具权限、采样温度三样东西一起换掉,不新建会话、不丢上下文。
这是什么¶
DeepSeek Harness(DSH)插件,挂在 conversation 输入框下方,提供三个模式按钮和一个总开关:
[ 讨论 | 对抗 | 任务 ] | ( ●)
三种模式的规则如下(工具权限是“物理”层面的禁用,不是口头约定):
| 模式 | 模型被要求做的事 | 工具 | 温度 |
|---|---|---|---|
| 讨论 | 当架构师,梳理需求、完善方案,多提问,不急着出代码 | 全部禁用 | 0.7 |
| 对抗 | 当最严苛的红队审查员,专找逻辑漏洞、边界条件、性能瓶颈、安全风险 | 全部禁用 | 0.2 |
| 任务 | 停止讨论,按最终方案直接调工具干活 | 全部放开 | 继承当前值 |
讨论和对抗模式下,模型物理上改不了文件、跑不了命令——工具清单不在它的可用集合里。
安装与启用¶
先克隆仓库:
git clone https://github.com/sunlei1214/dsh-three-modes.git
插件以 profile bundle 的方式挂载。以 desktop profile 为例:
dsh plugin --profile desktop add "file:D:/path/to/dsh-three-modes"
然后在 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 里追加包名:
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-three-modes"
]
}
}
}
重启 DSH,输入框下方就会多出那三个按钮。
有一点要特别注意:插件目录必须是 profile 的 node_modules 下的真实目录拷贝,不能是符号链接或 junction。DSH 解析客户端 bundle 时会校验模块 URL 最近的 package.json 名字,junction 会让它解析到别处,从而静默跳过插件。
典型用法¶
点按钮¶
三个按钮就是三种模式,当前模式高亮。点击即刻切换,无需确认。当前使用中的模式被折叠进系统提示词的 section 中(systemPrompt.section,order: 520),排在计划策略之后、工具说明之前。
总开关¶
控件最右边的小开关控制整个插件:
- 打开:三种模式正常生效,恢复到上次选中的模式。
- 关闭:插件完全静默,系统提示词不再注入任何模式文字,工具限制全部解除,温度覆盖停用,效果等同于没装这个插件。
关闭时三个模式按钮会变灰、不可点击,但仍显示在那里。开关状态也是持久的,存在会话里。开关只管“插件是否出声”,不清除选中的模式——关掉再打开,回到的还是原来那个模式。
斜杠命令¶
/mode 查看当前模式
/mode discussion 切到讨论模式
/mode adversarial 切到对抗模式
/mode task 切到任务模式
/mode off 关闭插件(等同点那个开关)
/mode on 重新打开
命令和按钮读写同一份状态,混着用没问题。/mode off 是公开命令,UI 上没有额外按钮,但命令本身能用,也便于脚本化。
状态是持久的¶
模式和开关状态都存在会话事件流里(/mode 命令的 command/run + command/done),折叠出当前值。因此刷新页面、重开客户端、会话被恢复或分叉,状态都跟着走;历史记录里也能查到什么时候切的模式、什么时候关的插件。
配置¶
插件暴露的 Config 接口如下:
interface Config {
/** 新会话的初始模式,默认 'task' */
defaultMode: 'discussion' | 'adversarial' | 'task'
/** 新会话的开关初始状态,默认 true */
defaultEnabled: boolean
/** 讨论模式提示词 */
discussionPrompt: string
/** 对抗模式提示词 */
adversarialPrompt: string
/** 任务模式提示词 */
taskPrompt: string
/** 讨论/对抗模式下额外禁用的工具名 */
mutatingTools: string[]
/** 讨论模式温度 */
discussionTemperature: number
/** 对抗模式温度 */
adversarialTemperature: number
/** 是否覆盖温度。关掉就完全不动模型参数 */
overrideTemperature: boolean
}
写进 profile 的 cordis.yml:
plugins:
three-modes:
defaultMode: discussion
discussionTemperature: 0.7
adversarialTemperature: 0.2
关于 mutatingTools:三种模式要“只读”,就需要一份禁用清单。清单会先和 ctx.tools.view(agent).restrictableNames 取交集——tools.restrict() 遇到不认识的工具名会直接抛错,而不同版本、不同 profile 装载的工具集并不一样。默认清单覆盖 write、edit、bash、terminal_open 等会改东西的工具;skill、read、grep、glob、web_search、web_fetch 等只读工具不受影响,讨论和对抗模式下依然可以翻代码、查文档。
实现要点¶
如果你打算改它,这几个地方值得先知道。
工具限制用的是 restrict 而不是 guard:agent.ctx.tools.restrict({ deny }) 返回一个 disposer,切到任务模式时调用它,权限原样回来。这个限制是单调的,叠加在 scope 已有层级之上,松不掉别人设的限制。tools.guard 只作运行时兜底,拒绝时给模型一句中文解释。
温度覆盖走 agent/request 中间件,并且只在模式真的不同时才改 temperature。每次改这个值都会触发 request/header reason: "change",进而打断 prompt cache,所以任务模式下把继承来的值原样透传,一个字节不动。
客户端控件注入的是 conversation.input.left 插槽——input.right 在模型选择器后面,而 input.permission 是单例、已被权限审查占用。这个插件的控件正好落在权限审查和模型选择之间。点击时采用乐观选中(本地刚点的 → 投影里待确认的 → 投影确认的),点下去不闪。关闭态用 aria-disabled 加拦截自己判断,而不是原生 disabled,以免读屏器整块跳过。图标是内联线性 SVG,不是 emoji:💬⚔️🚀 在不同系统上字形、颜色、描边不一致,和 DSH 全线性图标体系冲突。样式用 DSH 的 CSS 变量(--dsw-alias-label-primary、--dsw-alias-interactive-bg-active 等),尺寸对齐官方 chip:高 28px、字号 13px。
本地开发时跑这几条命令:
node --check lib/index.js # 宿主侧语法
node --check lib/client.cjs # 客户端语法
node --test test/*.test.mjs # 状态折叠单测 + 宿主侧集成
node test/client.smoke.mjs # 客户端渲染冒烟(vm + stub React/DOM)
仓库结构里,lib/modes.js 没有任何 import,是宿主、客户端、测试三方共享的单一事实来源,改模式定义从这里改。
适用场景与注意¶
适合这类人:在同一个会话里先聊方案、再挑刺、最后落地,频繁切换角色的智能体开发者。它解决的是角色状态问题,不改变模型本身,也不替你写方案。
已知边界要心里有数:
- 只影响当前会话,不同会话可以处在不同模式,互不干扰。
- 讨论/对抗模式下的权限回滚依赖 disposer 和 scope 生命期,不靠插件手动收尾。
defaultMode/defaultEnabled只对新会话生效,已有会话以事件流为准。- 温度覆盖关闭后,插件对模型参数完全透明,不写任何请求头。
安全方面:插件以当前 dsh 进程的权限运行,安装前建议先读一遍 lib/index.js、lib/client.cjs 和许可证(MIT)。本插件来自社区目录 skillhub.cn,与 DeepSeek / 幻方无官方从属关系,不是官方应用商店上架的包。
收尾¶
dsh-three-modes 的价值不在于新增了什么能力,而是把“当前该扮演谁”从提示词里的反复叮嘱,变成一个可切换、可持久、可撤销的显式状态。三种模式的切换只影响当前会话,关掉总开关就回到没装的状态。
- 目录页:https://www.skillhub.cn/plugins/sunlei1214/dsh-three-modes
- GitHub:https://github.com/sunlei1214/dsh-three-modes