DeepSeek Harness 值得安装的5类插件
了解 DeepSeek Harness 在 VPS 上值得安装的 5 类插件:限制支出、控制工具权限、扫描提示注入与密钥、持久化记忆,以及谨慎开放局域网访问。
值得安装哪些 DeepSeek Harness 插件
DeepSeek Harness 插件是第三方代码。它们会在您的 agent 内运行,并使用 agent 在您付费购买的机器上的权限。社区列表包含 20 多个类别和超过 1000 个条目。在租用的虚拟专用服务器(VPS)上,您需要 5 类插件:dsh-budget 用于限制支出,dsh-permission-rules 用于控制工具访问,dsh-defend 用于扫描注入和密钥,dsh-memory 用于保存跨会话仍然有效的事实,dsh-web-lan-access 则只能在您确定身份验证方式后使用。
该 harness 是 dsh,即 DeepSeek 的开源 agent harness,设计目标是让所有功能都通过插件实现。其 README 将它称为开发者预览版,并发出警告:THERE WILL BE COMPATIBILITY-BREAKING CHANGES。这一点决定了下面的所有选择。固定已安装插件的版本,并预期升级可能导致插件失效。插件数量应保持足够少,以便您能够实际阅读全部代码。如果 harness 尚未运行,请先阅读 在 VPS 上安装 DeepSeek Harness,然后再返回这里。
dsh 如何安装插件,以及配置文件的存放位置
dsh由 Cordis 插件组装而成,因此运行中的实例是一棵插件树,而不是单个程序。配置 profile 是这些插件的命名组合。两个模板是 web 和 headless。$DSH_HOME默认为 ~/.dsh,配置 profile 位于 $DSH_HOME/profiles/<name>/,其中包含独立的 package.json、dsh.profile清单和 cordis.patch.yml。
dsh plugin --profile web list
dsh plugin --profile web add dsh-budget
dsh plugin --profile web remove dsh-budget支持4种源形式:不带限定范围的 npm 包名、类似 @towzai/dsh-memory 的限定范围名称、类似 github:PerryLink/dsh-budget#main 的 GitHub 引用,以及带有 link: 或 ./ 的本地路径。优先使用 GitHub 形式,因为可以将 #main 替换为提交,并在下个月获取完全相同的代码。
dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"各层按固定顺序应用:先按 profile 中列出的顺序应用每个 bundle,然后应用 profile 的 cordis.patch.yml,再应用用户主目录级别的 cordis.patch.yml,最后应用任何 --patch 覆盖层。顺序很重要,因为后应用的层可以重新配置或移除先前层设置的内容。因此,如果插件看似已安装但没有任何作用,请打开 profile 的 cordis.patch.yml,检查两点:其中是否存在该插件的插入块,以及后续层是否禁用了该插件。
截至 2026年8月17日,npm 包 @deepseek-ai/dsh 的版本为 0.1.0-rc.7,而下面的每个插件都声明兼容 0.1.0-rc.5 到 0.1.0-rc.6。这种差异在该生态系统中很正常,也是插件停止加载的常见原因:运行框架的更新速度快于周边插件。有计划地升级运行框架,然后逐个测试插件。
信任插件前先阅读代码
dsh 插件不会与宿主程序隔离。它会与宿主程序在同一个 Cordis 树中、同一个进程内,以同一个操作系统用户身份加载,并访问同一组模型凭据和同一个工作树。安装插件更接近于使用 sudo 运行他人的脚本,而不是添加浏览器扩展。这与 Claude Code 插件引发的信任问题 相同,答案也相同:阅读代码,否则不要安装。
请按以下顺序检查四项内容:
- 它接入了哪些扩展点。
tools/pre-execute表示它可以看到每次工具调用并阻止调用。agent/pre-step表示它可以看到您的消息。webServer.tapIndex表示它可以重写提供给浏览器的页面。未接入这些扩展点的插件能做的事情很少;接入全部扩展点的插件就是您的安全边界。 - 它是否访问网络。 在源代码中搜索
fetch、http以及任何硬编码的主机名。会将数据发送到外部服务器的计费插件,可能会把您的使用模式发送到其他位置。 - 它是否读取凭据。 任何访问
credentials.*或提供商密钥的代码,都必须在 README 中说明明确原因。 - 许可证和最近一次提交日期。 在每周都发生变化的生态系统中,一个没有许可证且数月未更新的插件会带来风险。
然后按提交安装,而不是按分支安装,并阅读安装程序写入 cordis.patch.yml 的插入块。该块会列出插件 ID 及其注册的配置,是对您刚添加内容最简短、最准确的说明。在宿主程序允许的情况下,应让提供商密钥远离插件的访问范围,参考 避免让 AI 代理接触机密信息。
dsh-budget:如何阻止 agent 整夜消耗资源?
VPS 上的 agent 无人值守运行。这正是将它部署到 VPS 的目的,也是风险所在。dsh-budget 按模型、会话和天数统计 token 数量及预估成本,并根据这些总量强制执行上限。
dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"默认值较高:每个会话 10 USD、每天 50 USD、每月 500 USD。这些额度适合有预算的团队。在个人服务器上,这些额度高到足以让失控循环在触发上限前就运行很久,因此应在第一天就调低。
The data behind this chart
[
{
"label": "Per session",
"plugin_default_usd": 10,
"suggested_start_usd": 2
},
{
"label": "Per day",
"plugin_default_usd": 50,
"suggested_start_usd": 5
},
{
"label": "Per month",
"plugin_default_usd": 500,
"suggested_start_usd": 40
}
]建议值只是单个操作员在一台服务器上的起始值,不是公开标准。根据实际使用一个月后的数据再提高。每月上限设为 40 USD,会话上限设为 2,可以尽早明确失败。你在熟悉工具的资源消耗时,这正是需要的行为。
- id: budget
config:
budgets:
session: 2
daily: 5
monthly: 40
warnRatio: 0.8
overLimit: block会改变机器行为的设置是 overLimit。默认值为 alert,它只打印警告并继续消耗,因此该插件开箱即用时只是一个仪表板。将其设置为 block 后,达到上限时 harness 会拒绝进一步的模型调用。这样,夜间任务会停止,而不是持续计费到早上。degrade 是第三种模式:它会从 degradation 映射中选择更便宜的模型替换当前模型。当任务必须完成但不需要使用最佳模型时,应使用此模式。warnRatio 的默认值为 0.8,因此达到上限的 80 percent 时你就会收到通知。
需要明确两点限制。成本根据你提供的价格计算:prices 默认为空,defaultPrice 则使用每 million input tokens 1.0 USD、每 million output tokens 3.0 USD 的后备价格。请为所用模型填入实际价格,否则仪表板显示的只是伪装成测量结果的估算值。其次,插件会根据会话事件流,在运行中的进程内聚合数据,因此 harness 重启后总量会重置。崩溃循环或会重启 dsh 的 supervisor 都会重置每日上限。将 dsh-budget 视为限制自身任务的安全护栏,并在 provider 账户上设置 spend limit,将其作为实际上限。这也是 控制 VPS 上的 AI agent 成本 中更重要的一点。
日常使用 /budget 查看概览,使用 /budget models 查看按模型划分的明细,使用 /budget unblock <scope> 在决定继续运行后解除阻止。
dsh-permission-rules:哪些工具调用绝不能执行?
dsh-permission-rules 会在 tools/pre-execute 阶段应用声明式规则,因此规则会在工具执行前进行评估。共有 3 种操作。allow 放行调用,deny 阻止调用并返回模型可读取的原因,ask 将调用转交给官方审批接口。
dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#b30b4fb"规则位于相对于会话工作目录的 .dsh/rules.yaml 中;还可以使用全局 fallbackPath,以及可选的 searchUp,逐级向上遍历到文件系统根目录。匹配条件包括工具名称 glob、参数键和值 glob、相对于工作区的路径 glob、main 或 subagent 等代理选择器,以及网络目标。
rules:
- match: { tools: [bash], params: { command: "rm -rf*" } }
action: deny
reason: "No recursive deletes"
- match: { tools: [edit, write], paths: ["**/.env*", "**/secrets/**"] }
action: ask
reason: "Secret files need confirmation"
- match: { tools: ["mcp__*"] }
action: ask
reason: "MCP tools need confirmation"规则采用首次匹配优先,因此顶部附近的宽泛 allow 会静默取消其下所有更具体的规则。请先编写拒绝规则,最后编写放行规则。工具名称 glob 覆盖 mcp__*。这样可以限制来自模型上下文协议(MCP)服务器而非运行框架本身的工具;当您运行 VPS 上的 MCP 服务器时,这一点尤其重要。
需要提前规划一种行为:ask 需要有人应答。在 headless 配置中,可能没有人持续监控,因此 ask 规则可能会让运行一直等待,直到有人出现。对于绝不会批准的操作,请使用 deny;对于您会亲自监控的配置,请保留 ask。如果希望审批在无人值守时正常工作,就需要实际可用的应答路径。相关内容请参阅通过审批限制 AI 代理操作。
dsh-defend:如何应对提示注入和泄露的机密?
dsh-defend 会在三个位置进行扫描:agent/pre-step 上的入站消息、tools/pre-execute 上的工具参数(包括破坏性删除防护),以及 tools/post-execute 上的工具结果。最后一项尤其重要,因为模型据此执行操作前,可以先检查从网页获取的内容。
dsh plugin --profile web add "github:PerryLink/dsh-defend#7ba3427"默认设置偏向谨慎,而不是严格拦截:detection.injectionAction、detection.jailbreakAction 和 detection.secretAction 均为 ask,而 detection.secretBlockCritical 为 true,因此无论其他设置如何,关键机密都会被阻止。在无人值守的服务器上,应将需要处理的操作改为 block,因为在没有人确认时,ask 不能算作决策。
审计设计值得肯定。defend/detection 事件会记录规则 ID、族、类别、严重性、决策和扫描事实,但不会记录匹配到的文本;机密只按类型记录。因此,启用审计日志不会生成一份你原本试图保护的凭据副本。
需要明确这项功能的作用范围。检测基于规则,README 也明确说明,新颖的措辞和多步骤攻击可能绕过检测。它可以降低明显攻击的发生率,但不能让代理安全地处理不受信任的内容。因此,仍应保留底层的权限规则。
dsh-memory:代理明天记得什么?
有两个不同的插件都叫作 dsh-memory,在输入安装命令前应先确认这一点。请明确指定源进行安装,以确保安装的是你阅读过的那个插件。
对于小型服务器,我会选择 SQLite 构建版本。它注册为 memory,在 $DSH_HOME/memory/memory.db 中保存一个供各配置共享的文件,并提供 memory_write、memory_search 和 memory_forget。搜索基于已存储文本和标签中的关键字。不需要 embedding 服务、API 密钥或额外进程。
dsh plugin --profile web add "github:ben7am1n/dsh-memory#def7c6a"需要修改的配置很少:path 指定数据库文件,promptRecentCount(默认值为 10)指定注入的未固定记忆数量,promptMaxChars(默认值为 2000)指定渲染预算。它依赖 node:sqlite;Node 22 和 24 仍将其标记为实验性功能,因此升级 Node 后应进行测试,不能想当然地认为它会正常工作。
下面说明记忆功能实际会如何影响服务器:每轮请求都会将注入的记忆放入系统提示中。2000 个字符的预算意味着每次请求都会永久增加几百个输入 token。这会直接增加费用,因此应先在服务器上部署 dsh-budget,再部署 dsh-memory。应将 promptMaxChars 设置得较小,并使用 memory_forget 清理记忆,而不是任其不断增大。
另一种构建版本将记忆存储在 YAML 文件中,并使用 embedding 搜索自动注入提示,安装命令为 dsh plugin --profile web add github:towzai/dsh-memory。它需要本地 ollama 实例和 embedding 模型,默认使用 qwen3-embedding:0.6b,也可通过 DSH_MEMORY_EMBED_MODEL 覆盖。语义召回效果优于关键字召回。但这也意味着服务器上要额外运行一个服务,并常驻一组模型权重。对于小型套餐,这些内存会减少可用于实际工作负载的资源。只有在内存充足时才应选择它。代理的本地记忆介绍了召回质量与常驻资源成本之间的一般权衡。
dsh-web-lan-access:Web UI 是否应监听 loopback 之外的地址?
npx @deepseek-ai/dsh web 在 127.0.0.1:3080 上提供界面。浏览器只会在安全上下文中公开 crypto.randomUUID(),因此从另一台机器通过普通 HTTP 加载同一页面会失败。dsh-web-lan-access 会通过 hook webServer.tapIndex 注入一个小型 polyfill,并将服务器绑定地址切换为 0.0.0.0。
安装前先阅读其自身的警告。绑定到 0.0.0.0 后,同一局域网(LAN)中的任何人都可以在无需身份验证的情况下访问该 agent;如果服务器具有公网 IP 地址,则整个互联网都可以访问。少数敏感方法(settings.*、credentials.*、llm.discoverModels)仍固定绑定到 loopback,并对远程来源返回 403,从而限制损害范围。但这并不能阻止攻击,因为工具调用接口仍对任何发现该端口的人开放。
大多数情况下,根本不需要此插件。改用 SSH 转发端口。
ssh -N -L 3080:127.0.0.1:3080 you@your-server然后在本地浏览器中打开 http://127.0.0.1:3080。该 harness 仍只监听 loopback,因此不会暴露任何服务;由于浏览器将 127.0.0.1 视为安全来源,crypto.randomUUID() 可用,也不需要 polyfill。只需一条命令,无需插件,也不会增加新的攻击面。
只有在端口转发无法满足需求时才安装此插件,例如同一网络中的手机必须访问该 UI。如果确实需要使用,请将其绑定到专用网络接口后方,保留一条仅允许该接口的防火墙规则,并在 web-runtime 条目的 trustedHosts 下列出要使用的名称。对于真正的多用户访问,可使用 dsh-passwords。它提供子用户权限、每个子用户的每小时令牌配额和每日时间配额、通过 Let's Encrypt 自动申请 TLS(传输层安全)证书,以及加密审计日志。应将其视为一个平台,而不是插件:它需要使用 80 和 443 端口,自带安装程序,而且文档中的快速安装方式会将网络上的 shell 脚本直接通过管道传给 bash。建议先执行 npm install -g dsh-passwords,再执行 dsh-passwords install,这样代码会保存在磁盘上,便于运行前检查。
如何彻底移除插件
卸载分为两步,很多人会跳过第二步。
dsh plugin --profile web remove dsh-budget
dsh plugin --profile web listlist 中不应再显示该插件。然后打开 $DSH_HOME/profiles/web/cordis.patch.yml,删除所有仍引用该插件名称的插入块,因为该条目负责将插件加载到树中。重启 harness,使其重新构建树;已加载的插件在重启前会继续运行。最后请记住,数据的生命周期可能长于代码。卸载后 $DSH_HOME/memory/memory.db 和 .dsh/rules.yaml 仍会保留。如果目的是删除数据,请手动删除它们。
我阅读的内容和时间
这里的每个引用都是提交,而不是分支,因为到您阅读本文时,main 中的代码会有所不同。我在 17 August 2026 阅读了全部内容,当天 npm 上的 harness 本身处于 0.1.0-rc.7。
此列表所依据的确切提交
- 社区插件列表,提交为
f2918fb,日期为 17 August 2026。此处特意只链接一次。它是一个目录,而目录不是推荐。 - dsh-budget,提交为
461d478,日期为 17 August 2026。采用 Apache 2.0 许可证。声明 dsh0.1.0-rc.6,要求 Node 22.19 或 24 及更高版本。 - dsh-permission-rules,提交为
b30b4fb,日期为 17 August 2026。采用 Apache 2.0 许可证。声明 dsh0.1.0-rc.5至0.1.0-rc.6。 - dsh-defend,提交为
7ba3427,日期为 17 August 2026。采用 Apache 2.0 许可证。声明 dsh0.1.0-rc.6。 - dsh-memory,提交为
def7c6a,日期为 13 August 2026。采用 MIT 许可证。使用 SQLite 构建。 - dsh-web-lan-access,提交为
e27e909,日期为 16 August 2026。采用 MIT 许可证。
复制命令前,请重新检查这些固定提交。在开发者预览生态中,带日期的版本号才有实际意义。
FAQ
我应该先在 VPS 上安装哪些 DeepSeek Harness 插件?
先安装 dsh-budget 和 dsh-permission-rules。设置 overLimit: block 后,无人值守运行不会整夜持续消耗;设置 .dsh/rules.yaml 后,工具不会执行您本来不会批准的调用。代理开始读取公网内容后,再添加 dsh-defend;如果您发现自己每次会话都在粘贴相同上下文,再添加 dsh-memory。跳过主题和状态标记:它们会在代理权限下运行额外代码,却不会改变计算机的实际行为。
dsh 插件是否与 harness 隔离?
不是。插件会与 harness 一起加载到同一个 Cordis 树中,在同一进程内运行,并使用同一个操作系统用户、同一组模型凭据和同一个工作树。接入 tools/pre-execute 的插件可以查看并阻止每个工具调用;接入 agent/pre-step 的插件可以查看您的消息。因此,请阅读源代码,检查许可证和最近一次提交日期,并按提交安装,而不是按分支安装,以免代码在您使用期间发生变化。
dsh-budget 会真正停止代理,还是只向我发出警告?
这取决于 overLimit。默认值是 alert:它会在达到 warnRatio 时发出警告,但继续消耗。达到上限后,block 会拒绝后续模型调用;您选择继续后,/budget unblock <scope> 会解除限制。degrade 会根据 degradation 映射切换到更低成本的模型。需要注意一个限制:总量由运行中的进程根据会话事件流汇总,因此重启 harness 会重置这些总量,重启循环也会绕过每日上限。请在服务提供商账户中设置消费上限,将其作为真正的最高限制。
如何彻底移除 dsh 插件?
运行 dsh plugin --profile web remove <package-name>,使用 dsh plugin --profile web list 确认,然后打开 $DSH_HOME/profiles/web/cordis.patch.yml,删除该插件遗留的插入块,因为正是该条目负责加载插件。重启 harness,以便重新构建插件树。插件写入磁盘的数据仍会保留:卸载后 $DSH_HOME/memory/memory.db 和 .dsh/rules.yaml 都不会自动删除,除非您手动删除它们。
通过网络公开 dsh Web UI 是否安全?
不能直接公开。dsh web 监听 127.0.0.1:3080,而 dsh-web-lan-access 会将绑定地址改为 0.0.0.0。其 README 明确说明,这会让同一网络中的任何人无需身份验证即可访问代理;如果使用公网 IP 地址,则意味着整个互联网都可以访问。少数方法(settings.*、credentials.*、llm.discoverModels)仍固定绑定到 loopback,并对远程来源返回 403。这样可以减少影响,但无法消除风险。请使用 SSH 端口转发、ssh -N -L 3080:127.0.0.1:3080 you@your-server,或将该端口绑定到私有网络接口并配置防火墙规则;在允许任何外部访问之前,还应添加真正的身份验证。