dsh-three-modes:在同一個會話裏切換討論、對抗、任務三種工作模式

前言

和通用 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜