dsh-why-reject-me:在 DSH 權限審批裏把拒絕原因交給模型

前言

DeepSeek Harness(DSH)在 Agent 請求越權執行時會彈出權限審批,原生界面只有「允許一次」和「拒絕」。模型收到的是工具被拒絕的結果,並不知道你是擔心路徑不對、命令太危險,還是這次只是在測流程。若希望模型據此改方案、先解釋計劃再申請權限,或明確說明「這次拒絕是故意的」,就需要把原因寫進模型能讀到的 channel,而不是另起一條用戶消息。dsh-why-reject-me 是社區維護的 Host 插件,在審批面板上增加可選的「拒絕原因」輸入框,並在你點拒絕且原因非空時,把原因追加到該次工具的 tool result 裏,模型在同一輪對話中即可讀到。

這是什麼

dsh-why-reject-me 由 Jorgen233 維護,在 SkillHub 等目錄中歸類爲 admin-security。它以 npm 包名 dsh-why-reject-me 發佈(當前資料中的版本爲 v0.3.3),源碼倉庫爲 Jorgen233/dsh-why-reject-me。插件不修改 DSH 自帶包,只在 Desktop 內嵌的審批界面運行;dsh-TUI 不使用該面板。留空原因再拒絕時,行爲與原生 DSH 完全一致。

核心功能

下面介紹插件在審批鏈路上的具體能力,均可在 README 與安裝後手測中核對。

拒絕原因進入 tool result

在「拒絕原因(可選)」中填寫內容並點「拒絕」(或 Ctrl/⌘ + Enter)後,模型看到的 tool result 末尾會多出一段前綴加原因。中文界面前綴爲 【審批請求已拒絕】原因:,英文爲 [Approval request rejected] Reason:。例如:

【審批請求已拒絕】原因:先不要動系統目錄,把 diff 發給我看。

原因只在拒絕時發送;點「允許一次」不會發送輸入框裏的內容。不輸入原因直接拒絕,不會附加任何額外文本。

不新增用戶消息

原因通過 Host 的 tools/post-execute 監聽器追加到被拒絕工具的 result content,屬於普通工具結果,不是 user/message,也不會單獨再起一輪對話。

草稿與失敗重試

未發送的草稿按「Session + Tool call」在頁面內存中保留約 30 分鐘,切換會話再回來一般不會丟字;刷新 Desktop 頁面會丟失草稿。若原因提交失敗,審批不會自動結束,面板會顯示錯誤並允許重試。

快捷鍵

按鍵 行爲
Enter(焦點不在輸入框或按鈕上) 允許一次
Ctrl/⌘ + Enter 拒絕並附上原因
Esc(焦點在輸入框且有內容) 讓輸入框失焦
Esc(輸入框爲空) 直接拒絕

輸入法組合輸入期間按 Enter 不會觸發審批動作。

安裝與啓用

插件以 Host 身份在 DSH 進程內運行,安裝會修改當前 profile,影響該 profile 下的所有會話。安裝前建議查看倉庫源碼與 MIT 許可證,只從 npm 上的 dsh-why-reject-me、本倉庫或你信任的副本安裝。

前置條件包括:DSH Desktop(資料中在 0.2.1-rc.5 上完成真實審批驗證;0.2.1-rc.2 與 0.2.1-rc.5 均做過驗證)。從 npm 安裝不需要 Git;從 GitHub 安裝需要本機有 Git 且能訪問 GitHub。Host 半在啓動時加載,安裝或更新後需按提示重啓 DSH Desktop,僅刷新頁面可能不夠。

方式一:從 npm 安裝(推薦)

在 DSH Desktop 中:

  1. 打開左側 Plugins(插件) 頁面。
  2. 點 Add plugin(添加插件) → Install a third-party plugin(安裝第三方插件)。
  3. 輸入包名並安裝:
dsh-why-reject-me
  1. 若出現 Enable now(立即啓用) 則啓用;在 Installed plugins 中確認開關已打開。
  2. 重啓 DSH Desktop。

在啓用了 plugin_manager 的會話(默認 Creator 模式)中,也可讓 Agent 執行:

請在我的 DSH profile 中安裝這個插件:
plugin_manager action=install_bundle target=dsh-why-reject-me

安裝完成後確認 bundle 已啓用,並告訴我是否需要重啓 DSH Desktop。

方式二:從 GitHub 安裝

在 Plugins → Add plugin 中填寫:

git+https://github.com/Jorgen233/dsh-why-reject-me.git

Agent 等價寫法:

plugin_manager action=install_bundle target=git+https://github.com/Jorgen233/dsh-why-reject-me.git

安裝、啓用與重啓步驟同方式一。

確認安裝

  • Plugins 列表中可見 dsh-why-reject-me 且爲開啓狀態;
  • 將會話權限切到會觸發審批的模式(例如 danger-full-access 下運行需審批的操作),審批面板應出現「拒絕原因(可選)」;
  • 輸入原因並拒絕後,展開對應工具結果卡片,應能看到原因文本。

更新 npm 版時可先移除再安裝:

plugin_manager action=remove_bundle target=dsh-why-reject-me
plugin_manager action=install_bundle target=dsh-why-reject-me

更新 Host 半後同樣需要重啓 DSH Desktop。

典型用法

經過上面的安裝與重啓,可按下面步驟在真實審批裏使用。

  1. Agent 請求越權執行,審批面板出現。
  2. 在「拒絕原因(可選)」中填寫說明,也可留空。
  3. 點「拒絕」,或按 Ctrl/⌘ + Enter。
  4. 原因先 POST 到 Host 的 /api/dsh-why-reject-me/reason 並暫存,隨後審批以 rejected 結束;Host 在生成 tool result 時把原因追加到 content 末尾。
  5. 模型在同一 tool result 中讀到原因並繼續推理。

常見動機包括:不想放行某操作但希望模型換做法;測試權限流程時需要說明「故意拒絕」;要求模型先解釋計劃或給出 diff 再決定是否放行。

適用場景與注意

適合誰: 經常在 Desktop 里人工審批 Agent 工具調用、且希望拒絕附帶可執行反饋的 DSH 用戶。

工作原理概要: 客戶端在 conversation.composer 鏈上接管審批面板(priority: 0),僅在待處理交互爲審批且非子代理會話時生效;Host 在內存中按 Session + Tool call 暫存原因,5 分鐘內未匹配到拒絕結果則丟棄;原因上限 2000 字。

務必知曉的限制:

  • 原因會作爲 tool/result 的一部分進入會話記錄,並隨上下文發送給模型提供商;展開被拒絕工具的結果卡片時也能看到這段文本。
  • 子代理會話不適用:子代理上下文中插件不會接管審批,沒有原因輸入框,拒絕文案仍爲運行時原文。
  • 只處理權限審批,不處理 ask_user_question 或其他確認框。
  • 原因附加後模型會讀到,但不保證一定照做。
  • 若同時安裝多個搶佔 conversation.composer 的審批類插件,可能只有其中一個生效。

卸載時在 Plugins 頁面關閉或卸載 dsh-why-reject-me 並重啓 Desktop;已寫入會話記錄的原因不會被刪除。也可用:

plugin_manager action=set_bundle target=dsh-why-reject-me enabled=false

或 plugin_manager action=remove_bundle target=dsh-why-reject-me。

結尾

dsh-why-reject-me 在不大改 DSH 審批模型的前提下,把「爲什麼拒絕」寫進 tool result,方便模型在同一輪裏調整行爲;留空拒絕則保持原生體驗。DSH 生態強調「一切皆插件」,社區目錄(如 SkillHub)爲獨立站點,與 DeepSeek / 幻方無官方從屬關係;本插件爲第三方社區組件,非 DSH 官方內置。

羽毛球分组比赛记分
小程序二维码

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

小夜