前言¶
和通用 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