用 dsh-clawrouter 給 DeepSeek Harness 加一道危險命令審查閘門

前言

DeepSeek Harness(dsh)把智能體的工具執行權交給當前進程。權限開得松,開發會快很多;開得太鬆,一次誤判就會落到真實文件系統上。社區討論裏反覆出現的就是這個矛盾:有人問有沒有類似 Codex / Claude Code 的「替我審批」審查模式,覺得 Full Access 太讓人擔心(討論 #421);也有人在 Full Access 下測插件時,把整個家目錄刪掉了大半(討論 #461)。

一邊是每條命令都自己點批准,一邊是全部放行後祈禱模型別寫錯路徑。BlockRunAI 做的 dsh-clawrouter 走第三條路:日常讀寫、構建不打擾;命中風險規則的工具調用,先交給一個更強的模型看一眼,再由工具執行器強制放行、拒絕,或把決定交回給你。

本文按社區插件目錄頁、GitHub 倉庫 README / CHANGELOG、package.json 和許可證原文覈對後整理。DeepSeek Harness 官方倉庫的核心理念是「一切皆插件」;deepseek-harness-plugin.com 是獨立的社區目錄,與 DeepSeek / 幻方沒有官方從屬關係,不要把它當成官方應用商店。

這是什麼

dsh-clawrouter 是一個 DeepSeek Harness 插件,由 BlockRunAI 維護,許可證爲 MIT,主要語言是 TypeScript。npm 包名同樣是 dsh-clawrouter,當前倉庫 package.json 版本爲 0.10.1。社區目錄把它歸在「界面增強」,GitHub 星標爲 9(以目錄頁與倉庫頁面當前顯示爲準)。

它做兩件相關的事:

  1. 審查閘門(blockrun-review:智能體提出危險工具調用時,先讓另一個更強的模型讀這次調用,給出 safe / dangerous / uncertain,由真實的工具執行器執行裁決,而不是靠提示詞勸阻。
  2. BlockRun 模型路由(blockrun-llm:註冊名爲 blockrun 的 provider。認證方式是錢包簽名,不是 API Key;請求通過 x402 用 Base 鏈上的 USDC 按次結算。倉庫 README 寫明這條路由暴露 67 個模型(數量由 npm run sync:models 從即時 catalog 回寫,CHANGELOG 也記錄過「寫 70、實際 67」的更正)。

默認不會改你的主循環模型。dsh-base 仍然走 deepseek-official;這條路由只在你顯式指定、或審查閘門需要調用審查模型時使用。倉庫自己的說法是:DeepSeek 繼續跑主循環,插件補的是它覆蓋不到的能力——更強的審查模型,以及視覺等多廠商模型。

核心功能

1. 審查閘門:只收緊,不放寬

閘門默認是關的(enabled: false)。打開之後,命中風險規則的調用會先送給審查模型(默認 anthropic/claude-opus-5):

結論 接下來發生什麼
safe 原樣進入你已有的沙箱、權限和審批鏈
dangerous 拒絕,並給出智能體可以據此調整的理由
uncertain 交給你,彈出正常的審批提示

審查通過並不等於直接執行。README 寫得很清楚:它只會收緊策略,不會放寬;升級給人處理時也一樣——如果更嚴格的權限規則本來就會拒絕這次調用,你拿到的是那個拒絕,而不是一個審批彈窗。它站在權限系統前面,並不替代權限系統。

審查模型不可達時,默認 onReviewerFailure: ask(交給你),也可以改成 deny 給無人值守任務用。倉庫強調兩點:失效時絕不默默放行;也不會因爲一次網絡抖動就把整個會話卡死。

哪些調用會進閘門。 規則刻意做窄。讀取、編輯、構建默認不審。內置規則盯的是遞歸刪除、裸寫磁盤、fork 炸彈、curl … | sh、強制推送與 hard resetchmod 777sudo,以及碰 ~/.ssh~/.aws/etc/passwd 的操作;另外還包括不叫 rm 但同樣在刪東西的命令,例如 git clean -fdxfind … -deletegit checkout -- .terraform destroy,以及 npm publish

提到一條危險命令不等於執行它:grep -rn "rm -rf" docs/ 不會被攔。把危險命令寫進 Makefile、清理腳本或 README 也不算執行。文件正文類參數(contentnew_stringdiff 等)默認當數據看;真正去執行那份文件,是另一次工具調用,閘門仍會讀。CHANGELOG 0.10.0 補了一類更安靜的風險:寫入 .git/hooks/pre-commit、CI workflow、shell 啓動文件、npm postinstall 等「現在寫、以後跑」的文件。

規則可以自己加。例如禁止往生產環境部署:

    extraRules:
      - name: no-prod-deploy
        pattern: "deploy\\s+--env[= ]prod"

一直開着要花多少。 下面這組數字來自倉庫 README 自己的測試語料,不是第三方評測:日常操作 0/59 觸發(含只是提到危險命令的情況);39 條危險命令未漏報;git hook / CI / postinstall 等「以後才執行」的文件 10/10;審查模型默認只看到被標記的那一次調用(約 356 token),不是整段會話。命中時,README 在 claude-opus-5reviewerMaxTokens=512 下測得約 \(0.0057**、延遲約 3 秒。0.10.0 之前審查請求會繼承 Opus 自報的 128,000 輸出上限,單次曾到 **\)0.28–0.33;CHANGELOG 0.10.1 把這件事修掉了,並加了 reviewerMaxTokens

這些數字有測試守着,但也只對當前規則和語料成立。匹配器沒標出來的命令,審查模型根本看不到——倉庫自己把「召回率」寫成了所有聲明的上限。

2. /gate:先確認網是開着的

閘門可以在「看起來一切正常」的情況下是關的:默認 enabled: false;profile 的 patch 會整塊替換某一行的 config 而不是合併鍵;/review 無論閘門開關都會註冊。所以 /review 能用,只說明插件加載了,完全不說明工具調用有沒有被審查。

/gate         # 閘門是否 armed,以及當前配置
/gate drill   # 把一條危險命令送進匹配器和真實審查模型,不會送給任何工具

/gate drill 使用的示例命令是 rm -rf / --no-preserve-root。它分兩段彙報:規則不再匹配是策略問題,審查模型連不上是錢包或模型問題。運行時這兩種都會塌成「交給你」,和「閘門正常工作」看起來一樣。drill 的代價是一次審查調用。

3. /review/spend

/review <粘貼 diff、方案,或智能體給出的結論>
/spend

/review 用同一個強模型審你指定的內容。README 指向過 討論 #475:智能體讀到了關鍵證據,卻先下了錯誤結論。

/spend 列出本進程啓動以來這條路由的花費:總額、分模型,以及 token 成本與固定費用。需要記住的計費方式是:按請求報價結算——輸入規模加上請求裏的 max_tokens,不論模型實際吐出多少。小請求有約 **\(0.002** 的下限(\)0.001 最低支付額 + $0.001 手續費)。README 還寫明:插件本身不寫會話花費事件,也不寫 ~/.blockrun/cost_log.jsonl;錢包餘額纔是權威。讀 402 報價本身不花錢。

4. 一個錢包,67 個模型

blockrun-llm 註冊 blockrun 路由。沒有按廠商逐個申請 API Key 的流程:本地錢包簽名即認證,USDC 走 x402。這對審查模型尤其有用,因爲默認審查模型是 Anthropic 的 Opus,不在 DeepSeek 官方路由裏。

裝上這條路由不會把默認對話模型改成 BlockRun。需要時再顯式指定。倉庫也提供 auxiliaryModel,隻影響 Harness 自己標記的維護調用(compaction、會話標題),對話請求不會被改道。README 給的例子是把壓縮總結挪到便宜模型:

- id: blockrun-llm
  config:
    auxiliaryModel: deepseek/deepseek-chat

一次約 10 萬 token 的 compaction,README 按即時 402 報價寫的是:Claude Opus 5 大約 $0.90,DeepSeek V4 Flash 大約 $0.026。這是倉庫自己的測量,用來解釋爲什麼維護調用值得單獨指定模型。

智能路由 blockrun/auto 尚未接入。原因寫在 README:虛擬模型必須報告一個上下文窗口,Harness 用它決定何時壓縮;報太大或太小都會出問題。在此之前請直接指定模型 id。

5. 視覺:白名單,不盲信網關標籤

DeepSeek 官方路由沒有視覺模型。0.10.0 起,這條路由可以把消息裏的圖片序列化成 OpenAI content parts。配置項是 visionModels,默認是倉庫實測能看圖的四個模型;README 示例爲:

- id: blockrun-llm
  config:
    visionModels: [google/gemini-3.5-flash]

網關 catalog 裏帶 vision 標籤的條目有 35 個。倉庫對其中 10 個發了同一張內聯 PNG:Google 的三個 Gemini 以及 moonshot/kimi-k3 答對;OpenAI 若干模型是收了錢之後 HTTP 400;xai/grok-4.5 是收了錢之後 503;Anthropic 的 Sonnet / Opus 則返回 HTTP 200,把上游 400 當成助手文本流回來。所以插件要求兩個信號同時成立:網關打了 vision 標籤,並且模型出現在 visionModels 裏。

同一份 README 末尾的「已知限制」仍寫着「圖片會被明確拒絕……視覺能力在計劃中」。這與 0.10.0 的 CHANGELOG、以及同文檔「視覺」一節矛盾。本文以 CHANGELOG 與視覺專節爲準;如果你讀到舊條目,按更新的那兩處理解。

安裝與啓用

社區目錄頁給出的安裝命令是:

dsh plugin add github:BlockRunAI/dsh-clawrouter

需要可復現安裝時,按目錄頁說明固定 commit 哈希:

dsh plugin add github:BlockRunAI/dsh-clawrouter#<commit>

倉庫 README 的快速開始則寫的是按 profile 安裝 npm 包名(示例 profile 爲 web):

dsh plugin --profile web add dsh-clawrouter
export BASE_CHAIN_WALLET_KEY=0x...   # 也可以存進 credentials 服務

兩條都能裝到當前配置裏。目錄頁這條是社區目錄的原文;README 這條帶了 --profile。按你實際使用的 profile 選擇即可。

安裝時打印六條 ✕ missing peer,倉庫說這是預期現象。 這些包由 harness 在運行時提供,第一方 bundle 也用同樣的 peer 聲明;如果改成直接依賴,profile 裏會出現第二份 cordis。倉庫在乾淨環境測過:profile 能組裝,dsh --profile web --dump-config 能列出 blockrun-llmblockrun-review 兩行。

錢包不是 API Key:

  • 已經用過 BlockRun 其他工具:SDK 常見路徑是 ~/.blockrun/.session,ClawRouter 常見路徑是 ~/.openclaw/blockrun/wallet.key。存在哪個就導出哪個,例如 export BASE_CHAIN_WALLET_KEY=$(cat ~/.blockrun/.session)
  • 還沒有錢包:npx -y @blockrun/clawrouter 會生成一個並打印地址。記下地址後停掉進程,往該地址轉入 Base 鏈上的 USDC,再導出私鑰。

插件不會自己去讀這兩個文件,只讀你在配置裏聲明的憑據引用(默認環境變量名 BASE_CHAIN_WALLET_KEY)。密鑰不要寫進 cordis.patch.yml

README 的數量級是:Base 鏈上 5 美元 USDC,按 $0.002 下限大約夠 2500 次閘門審查,但只夠大約 5 次帶 10 萬 token 上下文的 Opus 調用。按你實際怎麼用這條路由來充值,而不是按下限估算。

閘門默認關閉。要啓用,在對應 profile 的 cordis.patch.yml 裏打開。patch 會整塊替換該行 config,覆蓋時把需要的鍵一起寫上:

- id: blockrun-review
  config:
    enabled: true
    reviewerProvider: blockrun
    reviewerModel: anthropic/claude-opus-5

package.json 聲明的 Node 引擎是 ^22.19 || >=24。CHANGELOG 還提到:在精簡 Node 鏡像裏安裝 dsh 時,node-pty 可能需要本機有 python3makeg++,否則會在編譯階段失敗;這是 harness 依賴的問題,報錯文案不一定點名本插件。

典型用法

下面幾步都來自倉庫文檔,可以按原樣做。

1. 裝上之後先看閘門狀態,不要假設已經在攔命令。

/gate

若顯示未啓用,按上一節把 enabled: true 寫進 profile。然後再跑一次:

/gate drill

確認風險匹配器和審查模型都能工作。這一步會花一次審查調用,但不會執行那條刪除命令。

2. 主循環繼續用 DeepSeek,審查走更強模型。

不要把緩存命中的日常對話改道到這條路由上。README 的對比是:一次緩存命中的智能體輪次,直連 DeepSeek 大約 $0.000056;走 BlockRun、約 22K 輸入時大約 $0.007。審查模型保持和智能體不同且更強,這是閘門的設計前提。reviewerModel 寫錯時,被標記的命令會升級或被拒絕,失敗信息裏會帶「BlockRun does not serve model … Did you mean …?」,看起來會像閘門在謹慎工作,所以更要用 /gate 確認配置。

3. 需要時再讓強模型看一段 diff 或結論。

/review 請指出這段改動裏有沒有破壞性副作用

這和自動閘門是兩套入口:一個攔工具調用,一個審你貼進去的文本。

4. 看花費以錢包爲準。

/spend

/spend 看不見「已經付款但隨後失敗」的請求。大 max_tokens 即使回覆很短也會按報價計費。

適用場景與注意事項

比較適合這些情況:

  • 希望 Full Access 少點手點批准,又不想完全裸奔
  • 需要 Claude / GPT / Gemini / Grok 這類 DeepSeek 官方路由沒有的模型,尤其是當審查模型
  • 需要給智能體看圖,並且接受白名單而不是網關標籤
  • 能接受用 Base 鏈 USDC 按次付費,而不是再申請一套廠商 API Key

使用前先看這幾條邊界:

  • 插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。目錄頁和本文都建議:安裝前檢查源代碼倉庫和許可證;需要可復現安裝時固定 commit。
  • 這不是操作系統沙箱,也不能覆蓋所有工具形態。閘門只處理匹配到的調用;匹配器漏掉的,審查模型不會看到。
  • 免費 NVIDIA 模型被倉庫明確寫成「冒煙測試,不是主力」。它們可能把提示詞用於服務改進,不要拿私有代碼去跑,更不要當審查模型。
  • 審查模型只看到被標記的那一次工具調用,看不到整個倉庫。
  • 中斷請求會立刻停止向會話投遞,但底層 HTTP 請求目前還取消不了,要等 @blockrun/llm 支持 AbortSignal
  • 上一輪的 reasoning_content 不會回傳,以免某個廠商要求的字段被另一家拒絕;推理模型做多步工具調用時,效果可能略降。
  • 不要把本插件和同組織的獨立產品 ClawRouter 混爲一談。ClawRouter 是另一套本地代理 / 路由,模型數量在不同文檔裏也不相同;本文只採用 dsh-clawrouter 倉庫當前寫明的 67。

結尾

dsh-clawrouter 要解決的不是把 DeepSeek 換掉,而是給危險工具調用加一道由執行器強制的審查,並用同一條錢包路由補上審查模型和視覺等多廠商能力。閘門默認關閉、失效不放行、日常操作儘量不打擾——這些設計都寫在倉庫自己的測試和文檔裏,而不是宣傳口徑。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-clawrouter/

GitHub:https://github.com/BlockRunAI/dsh-clawrouter

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

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

小夜