最近我在学习用 DSH(DeepSeek Harness)制作智能体,把自己的实践沉淀成了一个开源仓库 PelyDeng/dsh-plugin-manager。这篇文章是对这个项目"到底做了什么"的一次自我复盘——它是什么、解决什么问题、和官方 DSH 是什么关系,以及对我学习智能体开发意味着什么。
一句话定位
基于 DeepSeek Harness 的 AI 应用开发与部署框架,让个人开发者和小团队开发自己的插件,并统一安装、更新和管理。
它不是一个"插件"本身,而是一个插件工程化框架:定义作者怎么接入、怎么打包、怎么交付,以及运行端怎么统一安装、配置和启停。典型的目标产物是知识库助手、报表助手、业务工具这类带独立页面的智能体应用。
解决的核心问题
官方 DSH 已经提供了 Cordis 插件运行、Bundle 组合、Agent、模型与会话等底层机制。但如果要开发多个自己的插件并交付给团队或客户,会缺一层工程约定。这个项目补的就是这一层,README 里概括为六项能力:
| 能力 | 解决的问题 |
|---|---|
| 独立仓库接入 | 作者维护自己的 pnpm 单包项目,通过声明接入,不用改管理器名单 |
| 内部插件扫描 | 保留 plugins/* 自动发现、选集与批量构建 |
| 通用构建与打包 | 按插件声明执行 build、必要 check 和 pack,输出清单与归档 |
| 发布物组合 | 把多个作者的交付目录组合成站点发布物,运行端无需作者源码 |
| 配置与受控启停 | 管理实例配置、安装、启动、停止和就绪探针 |
| 可选统一认证 | 复用账号、登录和应用访问授权,业务接口由作者显式接入 kit |
仓库结构
项目分为几个清晰的层次:
packages/plugin-kit(@dsh-plugin-manager/plugin-kit):身份、权限、HTTP、工具登记——插件作者真正依赖的开发套件;packages/plugin-manager(@dsh-plugin-manager/plugin-manager**):发现、打包、安装和受控启停——管理器 CLI 本体;plugins/dsh-auth:可选的账号、登录与插件授权;plugins/dsh-example:开发者答疑、流式对话、历史与可选认证的完整示例;integrations/docker与deploy/:官方宿主镜像的 Compose 集成,以及 Bash / PowerShell / Node 部署入口。
一个值得注意的设计:发布运行端不需要作者源码。作者在自己的仓库执行 dsh-plugin-manager pack 生成版本化交付物(清单 + 归档),运行端把这些交付目录组合成站点发布物即可部署。这把"开发"和"交付"解耦了。
与官方 DSH 的分工
README 里有一张表把责任划得很清楚,我认为这是理解这个项目的关键:
- 官方 DSH:负责 Cordis 插件运行、Bundle 组合、Agent、模型与会话;
- 本框架:负责作者接入约定、发布物组合、配置和交付管理,以及可选基础认证;
- 业务插件:负责工具、页面、业务参数、数据授权与业务验收。
也就是说,它沿用官方机制而不魔改——不需要修改 DSH 或管理器源码就能接入新插件。同时它也不越界:可信身份不等于业务数据许可,应用仍需自己检查用户能读哪些文档或报表。README 也明确声明这是社区独立维护的非官方项目。
对我学习智能体开发的意义
- 它是一个"从插件到应用"的完整参考路径。从最小独立 Bundle、复用统一登录的 kit 示例,到带流式对话和历史记录的完整问答应用,
examples/和plugins/dsh-example提供了从零到可交付的渐进式模板。 - 它把智能体应用当作工程对象来对待:声明、打包、版本化交付、就绪探针、受控启停——这些正是把 demo 变成可交付产品时最容易缺失的环节。
- 模型凭据管理有完整约定:私有
.local/env.conf与公开模板分离,网页只显示状态与不可逆指纹,密钥修改走受控重启。这在接入 DeepSeek/智谱等不同提供方时很实用。
查证说明
本文事实均来自仓库 README 原文(已直接抓取自 raw.githubusercontent.com/PelyDeng/dsh-plugin-manager/main/README.md,HTTP 200,全文读取成功),仓库主页 github.com/PelyDeng/dsh-plugin-manager 亦可正常访问。需要注意:GitHub 上存在多个同名 dsh-plugin-manager 仓库(分属其他作者,功能侧重各有不同,如图形化启停面板、插件市场等),本文分析的仅为 PelyDeng 名下的这一个,请勿混淆。更深入的细节(如 kit 的具体 API、部署演练)我尚未逐个抓取 doc/ 下的子文档,如需要可继续补充。