ARCHITECTURE · 04

Profile、组合包与 Patch:DeepSeek Harness 的配置分层

直接答案

DeepSeek Harness 的启动配置由三层概念组成:profile(配置档案)是具名组装,列出要叠放的组合包并保存用户补丁;bundle(组合包)是配置项及挂载代码的分发格式;patch(补丁)按条目 id 整段替换配置。启动时各层按固定顺序叠加,后面的层覆盖前面的层。

Profile:一个具名的启动组装

官方事实

profile(配置档案)是 Harness home 中的一个具名组装,它做三件事:列出要叠放的组合包、存放树外插件、保存用户自己的 cordis.patch.ymlwebheadless 是随发行版交付的两个模板 profile。profile 在整体架构里的位置见架构总览

物理形态就是一个目录:$DSH_HOME/profiles/<name>/,里面有一个 package.json(其中 dsh.profile.bundles 是有序的组合包列表,树外插件列在 dependencies 里)和一个 cordis.patch.yml。Harness home 的解析规则:先取环境变量 $DSH_HOME,没有就用 ~/.dsh

一个常用结论:dsh web 就是 dsh --profile web 的别名(官方 CLI 文档表述)。

Bundle:组合包是配置的分发格式

官方事实

组合包(bundle)是"Cordis 配置项及其挂载代码"的分发格式。它的 manifest(清单元数据)里声明 "dsh": { "bundle": { "patch": "./cordis.patch.yml" } }——dsh.profile 字段列出一个 profile 的组合包,dsh.bundle 字段指向组合包自带的 patch 文件。

官方交付的三个关键组合包:

  • dsh-base:每个 profile 的第一层,包含模型适配器、工具、持久化、沙箱与审批策略、设置、凭据、遥测;
  • dsh-web-app:在 base 之上加浏览器应用;
  • dsh-headless:加一次性运行器,完全不带服务器。

一个细节:dsh-base 的 patch 按平台门控 shell 栈——bash-sandbox / tool-bash 在非 Windows 系统挂载,pwsh-sandbox / tool-pwsh 只在 win32 挂载。这就是为什么同一套配置在不同系统上工具集不同。

层叠顺序:后面的层覆盖前面的

官方事实

配置像叠床单一样一层层铺,顺序固定:

  1. 空的条目列表;
  2. 按 profile 列出的顺序应用各组合包;
  3. profile 自己的 cordis.patch.yml
  4. home 级的 cordis.patch.yml
  5. 命令行 --patch 传入的 overlay(覆盖层)。
示意图
01五层自下而上堆叠:空列表 → 组合包 → profile patch → home patch → --patch overlay;右侧向下箭头标注"后面的层覆盖前面的层",顶层 overlay 高亮。

后面的层覆盖前面的层。所以你在 home 级写的 patch 会影响所有 profile——这也意味着 profile 不是隔离沙箱,别把它当安全边界用。

Patch 语义:整段替换,不是深度合并

官方事实

这是最容易踩坑的地方,值得单独一节。patch 按条目 id 定位,然后替换该条目的整个 config(配置对象)——不做深度合并。意思是:你只想改一个字段,也必须把没改的字段原样重述一遍,否则它们会丢失。

示意图
02左右对照。左侧"你以为的":原 config 三个字段 + patch 一个字段 → 合并成四个字段(画叉标注"错");右侧"实际的":patch 整段替换,未重述的字段消失(画勾标注"对")。

其他规则:

  • 也可以用 insert 插入全新条目;
  • !!js 表达式在挂载时插值(规则出处见 Cordis 框架页第 4 节);
  • patch 指向不存在的 id,只在 stderr(错误输出)打印警告,不会报错中断;
  • 空文件或纯注释文件会直接抛错——想禁用某一层,正确写法是内容只写 []

验证与热更新

官方事实教程实测
  • dsh --profile web --dump-config 打印机器实际启动的配置树,任何条目都可以被自己的 patch 替换(官方事实)。
  • 教程里还用过 --dump-bundle-config,只打印组合包层、不含用户 patch——这条是教程实测口径(基线 0.1.1-rc.2),官方 CLI 文档只列了 --dump-config--dump-default-config
  • 用户 patch 热更新(官方事实):profile 启动后持续监听 profile 级和 home 级两份 cordis.patch.yml,变更后按层叠顺序重新组合;读取或解析失败时,用最后可用的配置树继续运行,不会让你跑到一半崩掉。热更新边界与插件系统页第 4 节互相对应。

别把三个概念搞混

教程实测DSHOPC 分析

本站教程已经厘清过三层容易混淆的概念:

  • profile:整套启动组合(哪些组合包、哪些插件、哪些补丁);
  • Agent 预设(preset):单个会话的能力组合(见插件系统页第 7 节,实操见《Agent 模式》);
  • 工作区(workspace):文件目录,就是你在哪个文件夹里干活。

改 profile 影响的是"这套环境启动时长什么样";改预设影响的是"这个会话里 Agent 会什么";改工作区影响的是"Agent 能看到哪些文件"。三者互不替代。

EVIDENCE

证据与来源

本页包含:官方事实 / 教程实测

#事实声明状态来源
1profile 定义、web / headless 模板官方事实
2物理形态 $DSH_HOME/profiles/<name>/dsh.profile.bundles、home 解析顺序官方事实
3dsh web--profile web 的别名官方事实CV1 已证实
4bundle 分发格式、dsh.profile / dsh.bundle 声明官方事实
5dsh-base / dsh-web-app / dsh-headless 三个组合包职责官方事实
6平台门控 shell 栈(bash 系非 Windows、pwsh 系仅 win32)官方事实
7五层叠放顺序,后者覆盖前者官方事实
8patch 整 config 替换不深度合并、insert、stderr 警告、空文件抛错用 []官方事实
9--dump-config 打印实际启动配置树官方事实
10--dump-bundle-config 只打印组合包层教程实测CV1 要求标注;基线 0.1.1-rc.2
  • 本站教程内容 src/content/tutorials/profile.ts:276
11用户 patch 热更新、失败保留最后可用树官方事实
12home 级 patch 作用于所有 profile、profile 不是隔离沙箱官方事实教程实测
13profile / Agent 预设 / 工作区三层概念区分教程实测本站已验证内容
  • 本站教程内容 src/content/tutorials/profile.ts:374-394
适用版本
DSH 0.1.1-rc.2(2026 年 8 月,开发者预览阶段)
发布
2026-08-26
更新
2026-08-26
最后核验
2026-08-26