前言¶
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(以目录页与仓库页面当前显示为准)。
它做两件相关的事:
- 审查闸门(
blockrun-review):智能体提出危险工具调用时,先让另一个更强的模型读这次调用,给出 safe / dangerous / uncertain,由真实的工具执行器执行裁决,而不是靠提示词劝阻。 - 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 reset、chmod 777、sudo,以及碰 ~/.ssh、~/.aws、/etc/passwd 的操作;另外还包括不叫 rm 但同样在删东西的命令,例如 git clean -fdx、find … -delete、git checkout -- .、terraform destroy,以及 npm publish。
提到一条危险命令不等于执行它:grep -rn "rm -rf" docs/ 不会被拦。把危险命令写进 Makefile、清理脚本或 README 也不算执行。文件正文类参数(content、new_string、diff 等)默认当数据看;真正去执行那份文件,是另一次工具调用,闸门仍会读。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-5、reviewerMaxTokens=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-llm 和 blockrun-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 可能需要本机有 python3、make 和 g++,否则会在编译阶段失败;这是 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