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,然后再返回此处。如果您仍不清楚这些插件所接入的部分,即 agent 循环、工具和记忆,请先 学习基础知识,因为了解各层的职责后,您会更容易判断下面的每项选择。
dsh 如何安装插件,以及配置文件的存放位置
dsh 由 Cordis 插件组装而成,因此运行中的实例是一棵插件树,而不是单个程序。配置文件是这些插件的命名组合。两个模板分别是 web 和 headless。$DSH_HOME 默认为 ~/.dsh,配置文件位于 $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"各层按固定顺序应用:先按配置文件中列出的顺序应用每个 bundle,然后是配置文件的 cordis.patch.yml,接着是主目录级别的 cordis.patch.yml,最后是任何 --patch 覆盖层。顺序很重要,因为后面的层可以重新配置或删除前面层设置的内容。因此,如果某个插件看似已安装却没有任何作用,请打开配置文件的 cordis.patch.yml 并检查两点:其中是否存在该插件的插入块,以及后面的层是否禁用了它。
截至 17 August 2026,npm 包 @deepseek-ai/dsh 的版本为 0.1.0-rc.7,而下面列出的每个插件都声明兼容 0.1.0-rc.5 到 0.1.0-rc.6。在这个生态中,这种差距很常见,也是插件停止加载的通常原因:运行框架的更新速度快于周围的插件。请有计划地升级运行框架,然后一次测试一个插件。
信任插件前先阅读代码
dsh 插件不会与运行框架隔离。它会在同一个进程中加载到同一棵 Cordis 树中,使用同一个操作系统用户,并访问相同的模型凭据和工作树。安装插件更接近于使用 sudo 运行他人的脚本,而不是添加浏览器扩展。这与 Claude Code 插件引发的信任问题相同,答案也相同:阅读代码,否则不要安装。
请按以下顺序检查 4 项内容:
- 它接入了哪些扩展点。
tools/pre-execute表示它可以看到每次工具调用,并能够阻止调用。agent/pre-step表示它可以看到您的消息。webServer.tapIndex表示它可以重写提供给浏览器的页面。未接入这些扩展点的插件能做的事情很少;接入全部扩展点的插件就是您的安全边界。 - 它是否与网络通信。 在源代码中搜索
fetch、http以及所有硬编码的主机名。会将数据发送回开发者服务器的费用计量器,会把您的使用模式发送到某个位置。 - 它是否读取凭据。 任何访问
credentials.*或提供商密钥的代码,都应在 README 中说明明确原因。 - 许可证和最近一次提交日期。 在每周都发生变化的生态系统中,一个没有许可证且数月未更新的插件会带来风险。
然后按提交安装,而不是按分支安装,并阅读安装程序写入 cordis.patch.yml 的插入块。该代码块会列出插件 ID 及其注册的配置,这是对您刚添加内容最简短且准确的说明。在运行框架允许的情况下,应使提供商密钥无法被插件访问,方法类似于 避免让 AI 代理接触机密。
dsh-budget:如何阻止 agent 整夜消耗预算?
VPS 上的 agent 无人值守运行。将它部署在那里正是为了这一点,但这也带来了风险。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 个输入 token 1.0 USD、每 million 个输出 token 3.0 USD。请为所用模型填入实际价格,否则仪表板上的结果只是伪装成测量值的估算。其次,插件会从会话事件流中在运行中的进程内汇总数据,因此 harness 重启后总量会重置。崩溃循环或会重启 dsh 的 supervisor 都会重置每日上限。将 dsh-budget 视为限制自身任务的防护措施,并在 provider account 上设置 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 key 或额外进程。
dsh plugin --profile web add "github:ben7am1n/dsh-memory#def7c6a"需要修改的配置很少:path 指定数据库文件,promptRecentCount(默认值为 10)指定注入的未固定记忆数量,promptMaxChars(默认值为 2000)指定渲染预算。它依赖 node:sqlite,而 Node 22 和 24 仍将其标记为实验性功能。因此,升级 Node 前应先测试,不能想当然地直接升级。
下面说明记忆功能实际会如何影响服务器:每轮请求都会将注入的记忆放入 system prompt。2000 个字符的预算意味着每个请求都会永久增加几百个输入 token。这会直接增加账单,因此应先在服务器上部署 dsh-budget,再部署 dsh-memory。将 promptMaxChars 控制在较小范围内,并使用 memory_forget 定期清理,不要任由文件持续增长。
另一种构建会将记忆存储在 YAML 文件中,并通过 embedding 搜索自动注入 prompt,安装命令为 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 通过挂载 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。它提供子用户权限、每个子用户的每小时 token 配额和每日时间配额、通过 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,或将该端口绑定到私有网络接口并配合防火墙规则;在允许外部访问前,还应添加真正的身份验证。