DeepSeek Harness 组合包 Bundle 与运行配置 Profile:双 Manifest 架构详解
DeepSeek Harness 最核心的模块化编排能力,由两套独立 Manifest 清单驱动:Bundle 清单与Profile 清单。
绝大多数配置不生效、插件加载异常、环境切换错乱、自定义包无法启用的问题,根源都是混淆了这两套 Manifest 的职责边界。
一句话总览核心差异:
- Bundle(dsh.bundle):静态发行清单,定义「一个能力包包含哪些插件、配置、依赖」,用于封装分发。
- Profile(dsh.profile):运行组合清单,定义「当前进程堆叠哪些 Bundle、叠加哪些补丁」,用于环境组装。
Harness 所有官方预设环境(web / headless / sdk / minimal)、自定义私有环境、生产/测试隔离,全部基于这两套 Manifest 分层叠加实现。
一、核心概念:为什么需要两套 Manifest?
传统框架只有一层配置,存在致命问题:能力封装与运行环境强绑定,无法复用、无法分层、无法快速切换部署形态。
Harness 采用双层分离架构彻底解耦:
- 开发层(Bundle):开发者封装一组内聚能力,打包为可复用、可分发的组合包,固定插件集合与默认配置。
- 运行层(Profile):使用者自由堆叠多个 Bundle、叠加自定义补丁、挂载外置插件,动态组装出不同运行环境。
Bundle 负责「造零件」,Profile 负责「拼整机」,二者各司其职、互不越界,构成 Harness 灵活可编排的底层基石。
二、第一套 Manifest:Bundle 组合包清单(dsh.bundle)
1. 定位与本质
Bundle 是 可复用、可版本化、可分发的能力发行单元。
在 NPM 包的 package.json 中通过 dsh.bundle 字段声明,标记当前包为「组合包」,而非普通工具库。
核心特征:自包含、可独立运行、可被 Profile 堆叠继承。
2. Bundle 清单作用
- 批量声明当前包内置的插件列表、默认配置、依赖关系
- 对外暴露标准化能力集合,支持全局复用
- 被 Profile 统一引用堆叠,无需逐个手动注册插件
- 支持版本迭代、能力增量更新、批量升级
3. 典型 Bundle 结构示例
在自定义组合包的 package.json 中声明:
{ "name": "dsh-custom-dev-bundle", "dependencies": { "@deepseek-ai/dsh-shell": "^1.0.0", "@deepseek-ai/dsh-code-run": "^1.0.0" }, "dsh": { "bundle": { "plugins": [ "@deepseek-ai/dsh-shell", "@deepseek-ai/dsh-code-run" ] } } }
4. 关键规则:Bundle 与普通库包的区别
- 普通库包:只有 dependencies,无
dsh.bundle声明,仅用于代码导入,不会自动注册插件、不产生配置层 - Bundle 组合包:包含
dsh.bundle声明,可被 Profile 引用,自动批量加载插件、生成独立配置层
简单区分:要自动加载插件、批量组合能力,必须声明 bundle;仅工具函数依赖,无需 bundle。
三、第二套 Manifest:Profile 运行配置清单(dsh.profile)
1. 定位与本质
Profile 是 进程级运行时组合方案,是 Harness 启动的「入口配置」。
对应目录下的 dsh.profile 文件,是整个运行环境的顶层 Manifest,负责定义当前进程由哪些 Bundle 堆叠而成,并承载用户自定义补丁与外置插件。
2. Profile 目录完整结构(官方标准)
一个合法 Profile 环境包含三类核心文件:
dsh.profile:顶层运行清单,定义 Bundle 堆叠顺序、环境标识package.json:记录当前环境的外置插件、树外依赖cordis.patch.yml:用户自定义配置补丁,覆盖上层 Bundle 默认配置
3. Profile 清单核心能力
- 有序堆叠 Bundle:按声明顺序叠加多个组合包,后加载覆盖先加载
- 挂载外置插件:管理树外自定义插件、本地调试插件
- 配置补丁覆盖:通过 patch 文件局部修改 Bundle 默认配置,不改动原包源码
- 环境隔离:多 Profile 实现开发/测试/生产环境完全隔离
4. dsh.profile 示例
{ "bundles": [ "@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web", "dsh-custom-dev-bundle" ] }
内核将严格按照数组顺序逐层叠加 Bundle,后置 Bundle 配置优先级高于前置,实现能力覆盖与定制。
四、双 Manifest 完整协作链路(核心架构)
Harness 启动加载顺序严格固定,是解决配置不生效问题的关键:
- 读取当前激活的 Profile 清单(dsh.profile)
- 按顺序遍历清单内所有 Bundle
- 读取每个 Bundle 的 bundle 清单(dsh.bundle),批量加载插件与默认配置
- 叠加 Profile 目录的
cordis.patch.yml补丁,覆写配置 - 加载 Profile 外置树外插件
- 内核完成拓扑排序、依赖等待、插件激活
核心优先级规则:Patch 补丁 > 后置 Bundle > 前置 Bundle 默认配置
五、两套 Manifest 全方位对比表
| 对比维度 | Bundle Manifest(dsh.bundle) | Profile Manifest(dsh.profile) |
|---|---|---|
| 文件位置 | NPM 包 package.json 内部字段 | Profile 独立目录下 dsh.profile 文件 |
| 定位 | 静态能力封装、分发单元 | 动态运行环境、组合入口 |
| 核心职责 | 定义一组固定插件与默认配置 | 堆叠多 Bundle、叠加补丁、组装运行环境 |
| 复用性 | 可被多个 Profile 重复引用 | 当前环境独享,多环境可多配置 |
| 可修改性 | 版本固化,迭代需更新包版本 | 随时修改、热重载生效 |
| 加载顺序 | 被 Profile 按序加载 | 全局最先加载,驱动所有 Bundle |
| 适用场景 | 官方能力包、自定义通用能力组合 | 环境切换、配置定制、本地调试 |
六、官方预设 Bundle 与 Profile 模板
Harness 官方内置多套标准模板,全部基于双 Manifest 架构实现:
预设 Profile(运行环境模板)
- web:完整网页交互环境,含UI、会话、完整工具集
- headless:无界面后台运行环境,适合服务部署
- sdk / sdk-minimal:轻量化SDK环境,适配二次开发与嵌入场景
- acp:高级智能体编排环境
核心基础 Bundle(能力组合包)
- dsh-base:基础能力合集,模型适配、会话持久化、沙箱、安全校验核心底座
- dsh-toolset:命令行、文件、代码运行等工具合集
- dsh-web:网页UI、前端交互能力包
七、高频踩坑与官方解决方案
坑1:安装依赖后插件不生效
原因:仅安装 dependencies,未将包加入 Profile 的 bundles 列表,或包未声明 dsh.bundle
0 条笔记