DeepSeek Harness(简称 DSH)采用"一切皆插件"的架构设计,模型、工具、界面、沙箱等所有能力都由插件组合而成,用户无需修改源码即可按需扩展。本教程将介绍 DSH 插件的基本概念、命令行与手动两种安装方式、插件市场的使用方法,并推荐三款经过社区验证的常用插件(dsh-better-sidebardsh-theme-plugindshmarket),帮助你快速构建适合自己的 Agent 工作台。

前置教程

如想快速开始学习本教程,你可能需要先完成以下前置教程:

1. DSH 插件概念介绍

1.1 什么是 DSH 插件

DeepSeek Harness 的设计哲学是"一切皆插件"(everything is a plugin):模型接入、工具调用、会话持久化、沙箱隔离、任务循环、调度、Web 界面等所有能力,全部由一个个可独立加载、替换和卸载的插件组合而成。插件系统基于 Cordis 插件框架实现,支持插件的依赖管理、加载与卸载,以及配置的逐层覆盖。

从工程角度看,一个 DSH 插件就是一个npm 包(也可以来自 Git 仓库或本地目录),它在内部实现为一个 Cordis 插件,并通过 package.json 中的 dsh 字段声明自身的能力。插件可以做到以下几类事情:

能力 说明 示例
注入工具 向 Agent 暴露新的工具(tool),如搜索、读图、SSH 操作 各类工具插件,如搜索、读图等
注册界面 在 Web UI 中新增设置页、侧边栏、面板等组件 dsh-better-sidebar 提供右侧工作台、dsh-theme-plugin 提供主题
提供服务 注册可供其他插件调用的服务(service) dshmarket 的插件市场服务
叠加配置 通过补丁(patch)修改组合后的配置树 各类组合包(bundle)

模型与插件的关系可以这样理解:插件之于 DSH,相当于应用商店的应用之于手机系统。系统本身只提供最小内核,其余功能都由用户自由安装、组合、替换。

1.2 Profile:插件的组合单元

DSH 以 profile 为单位组织插件。一个 profile 就是一份可独立启动的插件组合配置,存放在 $DSH_HOME/profiles/<名称>/ 目录下(Windows 下 $DSH_HOME 默认为 C:\Users\<用户名>\.dsh)。

dsh web 实际启动的是 web profile,dsh --profile headless "任务" 启动的是 headless profile。webheadless profile 在首次使用时由 dsh 自动初始化;其他自定义 profile 则通过 dsh plugin 命令创建。

一个 profile 目录包含以下关键文件:

文件 作用
package.json 记录插件依赖,以及 dsh.profile.bundles 组合包清单(按顺序排列)
cordis.yml 配置树根,保持为空,不要手动编辑
cordis.patch.yml 用户自己的配置补丁层,手动挂载插件的入口
pnpm-workspace.yaml pnpm workspace 配置,含依赖链接方式、构建脚本放行等
node_modules pnpm 安装的插件实际存放位置

1.3 组合包(Bundle)与配置树叠加

DSH 的配置采用"空根 + 逐层叠加"的方式组合。每个 profile 的 dsh.profile.bundles 列表按顺序列出组合包(bundle)。组合包是声明了 dsh.bundle.patch 字段的依赖包,安装后会自动加入该列表,它的补丁文件会成为配置树的一层。

配置树的叠加顺序为:空根 → 各组合包的补丁(按 bundles 列表顺序)→ profile 自身的 cordis.patch.yml → 主目录级 $DSH_HOME/cordis.patch.yml--patch 参数指定的覆盖层,后一层覆盖前一层。

DSH 官方提供三个内置组合包:@deepseek-ai/dsh-base(共享核心,每个 profile 的第一层补丁)、@deepseek-ai/dsh-web-app(Web 界面层)、@deepseek-ai/dsh-headless(命令行模式层)。内置组合包先从 dsh 安装目录解析,再回退到 profile 自身的 node_modules 中解析;第三方插件则安装在 profile 的 node_modules 里。

graph LR A[空配置根] --> B[组合包补丁层
dsh.profile.bundles 按序] B --> C[profile 补丁层
cordis.patch.yml] C --> D[用户全局补丁层
$DSH_HOME/cordis.patch.yml] D --> E[--patch 覆盖层] E --> F[最终配置树
决定启动的插件与参数] style A fill:#fdebd0,stroke:#b7950b,stroke-width:2px style B fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style C fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style D fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style E fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style F fill:#ffecd6,stroke:#e67e22,stroke-width:2px

1.4 插件的构成与分类

一个完整的 DSH 插件通常由两部分组成:host 端(运行在 Node.js 服务端的逻辑,如工具、服务、配置)和可选的 client 端(运行在浏览器的界面代码,通过 dsh.client 字段声明,由 Web UI 动态加载)。只改动界面的插件(如主题)可以只包含 client 端。

按照功能,本教程重点介绍的三款插件可以分为以下两类:

类别 作用 代表插件
界面增强 侧边栏、主题等 UI 扩展 dsh-better-sidebardsh-theme-plugin
插件市场 浏览、搜索、安装社区插件 dshmarket

判断一个 npm 包是否是 DSH 插件,可以查看它的 package.json 中是否声明了 dsh 字段(如 dsh.bundle.patchdsh.client)。声明了 dsh.bundle.patch 的包会成为 profile 的配置层;仅作为普通依赖安装的包不会进入配置树,只会收到一条提示信息。

1.5 插件的工作原理

dsh plugin 命令是插件的管理入口,它本身不做安装工作,而是把剩余参数转发给 pnpm,在 profile 目录中执行。安装成功后,dsh 会重新读取 profile 的 package.json,凡是解析到声明了 dsh.bundle.patch 的依赖,就自动追加到 dsh.profile.bundles 列表(这个过程称为"自动挂载"),并删除已卸载或不再声明补丁的条目。

graph LR A[执行命令
dsh plugin --profile web add 包名] --> B[pnpm 在 profile 目录安装] B --> C[依赖写入 package.json
并安装到 node_modules] C --> D[校验是否声明 dsh.bundle] D -->|是| E[自动加入 bundles 列表] D -->|否| F[仅作普通依赖
给出提示] E --> G[重启 dsh web] G --> H[按序叠加补丁层
插件生效] style A fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style B fill:#ffecd6,stroke:#e67e22,stroke-width:2px style C fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style D fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style E fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style F fill:#fadbd8,stroke:#c0392b,stroke-width:2px style G fill:#fdebd0,stroke:#b7950b,stroke-width:2px style H fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px

2. DSH 插件安装方式

2.1 环境准备

安装插件前,请确认以下环境就绪:

环境 要求 说明
dsh 已安装并运行过 使用 dsh --version 验证
pnpm 建议 10 及以上 dsh plugin 命令依赖 pnpm,缺失时会提示安装
git 安装 Git 源插件时需要 github:owner/repo 安装时使用
Node.js 20 及以上 DSH 运行基础
dsh --version
pnpm --version
git --version

如果你的 dsh 未加入 PATH(例如使用 npx 方式启动),可以把所有命令替换为 npx @deepseek-ai/dsh plugin --profile web add 包名 的形式。

2.2 命令行安装(推荐)

安装插件最常用的方式是 dsh plugin 命令。命令格式为:

dsh plugin --profile <profile名称> <pnpm参数>

以向 web profile 安装主题插件 dsh-theme-plugin(中国传统色主题包)为例:

dsh plugin --profile web add dsh-theme-plugin

命令执行过程如下:

  1. 如果 profile 目录不存在,dsh 会先按模板初始化该 profile
  2. add dsh-theme-plugin 转发给 pnpm,在 profile 目录中安装依赖
  3. 安装成功后自动把 dsh-theme-plugin 加入 dsh.profile.bundles 列表
  4. 重启 dsh web,打开浏览器刷新页面,插件生效

安装过程中可能会看到 WARN Issues with peer dependencies found 的提示,例如 missing peer @deepseek-ai/cordis(功能多的大插件可能一次列出十几个 missing peer)。这是 pnpm 的 peer 依赖警告,不是安装失败,命令末尾出现 Done 并列出依赖即表示成功。@deepseek-ai/cordis 等官方包是 DSH 的插件框架与宿主能力,运行时由官方组合包 @deepseek-ai/dsh-base 提供;profile 的 pnpm-workspace.yaml 设置了 autoInstallPeers: false,pnpm 不会自动补齐这些 peer,仅输出警告。请勿手动执行 dsh plugin --profile web add @deepseek-ai/cordis,以普通依赖方式安装框架会生成第二份拷贝,可能干扰官方插件的加载。

dsh plugin 支持所有 pnpm 子命令,常用参数如下:

命令 作用
dsh plugin --profile web add <包名> 安装插件到指定 profile
dsh plugin --profile web add <包名>@latest 安装并升级到最新版本
dsh plugin --profile web remove <包名> 卸载插件
dsh plugin --profile web update <包名> 在已声明版本范围内更新插件
dsh plugin --profile web list 列出已安装的插件依赖

部分插件的文档建议在命令末尾追加 -w--workspace-root),这是针对 pnpm 9 对 workspace 根目录的限制;pnpm 10 及以后通常不需要。如果安装时报 ERR_PNPM_ADDING_TO_ROOT,在命令末尾加上 -w 即可。

2.3 支持的安装来源

dsh plugin add 的安装来源与 pnpm 保持一致,包括:

来源 写法示例 说明
npm registry dsh plugin --profile web add dshmarket 最常用,从 npm 源拉取
GitHub 仓库 dsh plugin --profile web add github:owner/repo 直接安装 GitHub 仓库
Git URL dsh plugin --profile web add git+https://github.com/owner/repo.git 任意 Git 地址
本地目录 dsh plugin --profile web add . 在插件源码目录中执行,安装本地开发中的插件
tarball dsh plugin --profile web add ./plugin.tgz 安装打包文件

需要特别注意两点:

  • Git 源插件的构建脚本:Git 仓库通常需要在安装时执行 prepare 脚本构建,而 pnpm 10 起默认阻止构建脚本,命令失败时会提示把对应的 key 添加到 profile 目录下的 pnpm-workspace.yamlallowBuilds 中,添加后重新执行安装命令。
  • 镜像源同步滞后:国内 npm 镜像(如 npmmirror)对 dist-tag 的同步存在滞后,@latest 可能解析到旧版本。遇到"装下来版本不对"的情况,可以显式指定版本号(如 add 包名@0.3.8),或临时指定官方源:dsh plugin --profile web add 包名 --registry=https://registry.npmjs.org

2.4 更新与卸载插件

更新插件pnpm add 不会修改已声明的版本范围,例如 profile 中声明了 ^0.1.2,执行 add 包名 不会升级。跨大版本升级必须显式指定最新版:

dsh plugin --profile web add 包名@latest

或使用 pnpm 的 update 语义配合 --latest

dsh plugin --profile web update 包名 --latest

卸载插件

dsh plugin --profile web remove 包名

卸载后 dsh 会自动把该包从 dsh.profile.bundles 中移除。更新或卸载后重启 dsh web 使改动生效。

2.5 手动挂载(高级)

多数插件通过 dsh plugin add 安装后会自动挂载,无需手动操作。只有在以下场景才需要手动编辑配置文件:

  • 插件包没有声明 dsh.bundle.patch,需要手动把它挂进配置树
  • 想调整插件在配置树中的顺序或精确控制加载条目

手动挂载的方法是编辑 profile 目录下的 cordis.patch.yml,追加一条 insert 记录:

- insert:
    - id: theme-plugin
      name: 'dsh-theme-plugin'

也可以直接编辑 package.json 中的 dsh.profile.bundles 列表,把包名加入组合包清单:

{
  "name": "dsh-profile-web",
  "private": true,
  "dependencies": {},
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-theme-plugin"
      ]
    }
  }
}

手动挂载与 dsh plugin add 自动挂载是两种互斥的方式,不要同时使用:同一插件如果被重复插入,启动时会因 duplicate loader entry id 报错而无法启动。使用 dsh plugin add 安装的插件,无需再手动添加 insert 记录。

2.6 验证插件安装

安装并重启后,可以通过两种方式确认插件已生效:

方式一:检查配置树。不启动 Web 界面即可查看组合后的完整配置树:

dsh --profile web --dump-config

方式二:查看 Web UI。打开 http://127.0.0.1:3080,进入 设置 → 插件,会看到每个注册了配置命名空间的插件以卡片形式列出,可以直接在界面上修改其配置项并保存。

3. 插件市场

3.1 插件生态与数据源

DSH 的插件生态主要分布在三个地方:

数据源 说明
npm registry dsh- 前缀命名的 npm 包,是插件发布与安装的主渠道
GitHub topic: dsh-plugin 社区插件仓库的聚合标签,已有数百个仓库
awesome-dsh-plugin 社区维护的精选插件列表(awesome 目录),是多家插件市场的数据源

在此基础上,社区开发了插件市场插件,安装后可以在 Web 界面里浏览、搜索、一键安装插件,无需手敲命令行。下面介绍目前最流行的选择 dshmarket

3.2 dshmarket:社区可视化插件市场

dshmarket(npm 包名 dshmarket)是目前最流行的 DSH 插件市场,数据源为社区精选列表 awesome-dsh-plugin,收录 300 多个插件并持续增长。安装命令:

dsh plugin --profile web add dshmarket

重启 dsh web 后,打开 设置 → Plugin Market 即可使用。主要功能包括:

功能 说明
浏览与搜索 按分类筛选、按 Star 数或更新时间排序,界面语言跟随 UI
主题商店 独立标签页浏览社区主题,一键安装、即时切换
一键安装 确认来源后实时显示安装进度,多数插件刷新页面即可生效
更新管理 逐插件检查更新、一键更新全部
卸载 两步确认卸载,本次会话安装的插件可实时移除
安全约束 仅允许安装精选注册表中的来源,构建脚本默认保持阻止

dshmarket 只做"市场"本身,插件目录来自社区精选列表仓库 awesome-dsh-plugin/awesome-dsh-plugin。想让自己开发的插件被收录,需要向该仓库提交 PR。

4. 推荐插件

以下插件均来自 npm 社区,配合第 3 章的 dshmarket 使用。安装命令统一为 dsh plugin --profile web add <包名>,装完重启 dsh web 生效。

4.1 界面与工作台增强

插件 功能 安装命令
dsh-better-sidebar VSCode 风格右侧栏与底部面板双工作台:文件资源管理器、编辑器与多格式预览、内嵌浏览器、真实终端、Git 面板、后台任务页,并提供服务化接口供其他插件注册标签页 dsh plugin --profile web add dsh-better-sidebar
dsh-theme-plugin 中国传统色主题包,一键切换界面主题 dsh plugin --profile web add dsh-theme-plugin

4.2 推荐安装组合

对于大多数用户,推荐按以下顺序组合安装,兼顾市场发现与日常体验:

# 第一步:装可视化插件市场,日常浏览、搜索、安装插件
dsh plugin --profile web add dshmarket

# 第二步:安装界面增强插件
dsh plugin --profile web add dsh-better-sidebar
dsh plugin --profile web add dsh-theme-plugin

安装完成后重启 dsh web,刷新浏览器页面,即可在设置中看到 "Plugin Market" 新入口,以及侧边栏与主题等界面变化。

插件均为第三方代码,安装前建议先查看其 GitHub 仓库与 README,了解它解决的问题、维护活跃度与安全说明。dshmarket 只接受精选注册表中的来源,能显著降低安装风险。

5. 总结

5.1 核心内容回顾

  • DSH 采用"一切皆插件"架构,插件是一个 npm 包,基于 Cordis 框架,可注入工具、注册界面、提供服务、叠加配置
  • profile 是插件的组合单元,配置树按"组合包补丁 → profile 补丁 → 全局补丁 → --patch 覆盖层"的顺序叠加
  • 安装插件的主命令是 dsh plugin --profile web add <包名>,底层转发给 pnpm 在 profile 目录执行,安装后自动挂载到 dsh.profile.bundles
  • 支持 npm registry、GitHub 仓库、Git URL、本地目录、tarball 等多种安装来源,Git 源插件需注意 allowBuilds 放行
  • 插件市场:dshmarket(社区可视化插件市场),安装后可在 Web 界面浏览、搜索、一键安装插件
  • 推荐插件:dsh-better-sidebar(右侧栏与底部面板双工作台)与 dsh-theme-plugin(中国传统色主题),配合 dshmarket 浏览与安装

5.2 常见问题与解答

问:安装插件后 Web 界面没有变化?

答:多数插件需要重启 dsh web 进程并刷新浏览器页面(涉及 client 端新代码时尤其如此)。若仍未生效,执行 dsh --profile web --dump-config 检查插件是否进入配置树,并查看启动日志中的报错。

问:安装时报 ERR_PNPM_ADDING_TO_ROOT 怎么办?

答:这是 pnpm 9 对 workspace 根目录的限制,在命令末尾追加 -w--workspace-root)即可;pnpm 10 及以后一般不需要。

问:安装时提示一堆 missing peer 依赖警告?

答:这是 pnpm 的 peer 依赖提示,不是安装失败,命令末尾的 Done 与依赖列表说明插件已安装成功。装 dsh-better-sidebar 这类大插件时可能一次列出十几个 missing peer(@deepseek-ai/cordis@deepseek-ai/dsh-client-runtimereactreact-dom 等),它们都由 DSH 宿主运行时提供:官方组合包把对应包安装在共享 node_modules 中,版本与插件声明一致(如 react@18.3.1 满足 ^18.2.0)。profile 的 pnpm-workspace.yaml 设置了 autoInstallPeers: false,pnpm 静态检查看不到宿主提供的依赖,因此只警告不补齐。个别如 xterm 的 deprecated 提示也只是上游改名(xterm@xterm/xterm),旧包仍可用。请不要手动安装 @deepseek-ai/cordis 等官方包:以普通依赖方式安装会生成第二份拷贝,可能干扰官方插件的加载。

问:安装后设置页报 settings-not-exposed 错误?

答:DSH 的主机 API 网关只放行白名单内的配置命名空间,部分插件首次启动时会自行补丁该白名单,但当前进程仍按旧名单响应。重启 dsh web 一次即可;若错误持续,检查启动日志中 [settings-expose] 开头的提示。

问:装了插件后 dsh web 启动失败怎么办?

答:先定位问题层:删除 profile 目录 cordis.patch.yml 中对应插件的 insert 记录,或用 dsh --profile web --patch <空补丁文件> 临时绕开用户层排查,再结合启动日志定位冲突来源。

问:插件安全吗?

答:插件是第三方代码,运行在本地并拥有工作区访问权限,应安装来源可信、维护活跃的插件。dshmarket 提供了来源白名单、构建脚本默认阻止等防护,安装后仍建议关注其 GitHub 仓库的 Issue 与安全说明。

问:dsh plugin 与直接执行 pnpm add 有什么区别?

答:dsh plugin 会在 pnpm 执行成功后自动把声明了 dsh.bundle 的依赖挂载进 dsh.profile.bundles 配置层;直接运行 pnpm add 只写入依赖,不会自动挂载,需要手动编辑配置。日常使用请优先用 dsh plugin