DeepSeek Harness Python SDK 怎么改配置?profile patch 与 editor 补丁
DeepSeek Harness Python SDK 的配置不是一个文件,而是四层叠加:profile 决定基础树,profile 持久 patch 与 home patch 负责长期改动,构造时传入的 patches 元组只管这一次启动。 很多人改完配置“下次又没了”,就是把临时 patch 当成了持久配置。这篇按“层从哪来 → 写哪一层 → 怎么加回工具”讲清。
DeepSeek Harness:四层配置分别管什么
最终配置由 profile、profile 持久 patch、home patch 与 patches 元组依次叠加,后面的层覆盖前面的层。 对应到文件:(来源)
| 层 | 位置 | 作用范围 |
|---|---|---|
| profile | $DSH_HOME/profiles/sdk-minimal/ | 决定基础组合与 server 配置 |
| profile 持久 patch | profiles/sdk-minimal/cordis.patch.yml | 只影响这个 profile,重启仍在 |
| home patch | $DSH_HOME/cordis.patch.yml | 影响该 home 下所有 profile |
| 构造时 patches | DeepSeekHarness(patches=(...)) | 只影响本次进程 |
一个容易忽略的点:patch 会替换目标行的整个 config,不是深度合并。改一个字段时,要把同一行其他字段一起写全,否则会被覆盖掉。
from pathlib import Path
from deepseek_harness import DeepSeekHarness
workspace = Path("/srv/work/demo").resolve()
dsh_home = Path("/srv/dsh-home/demo").resolve()
with DeepSeekHarness(
provider="deepseek-official",
model="deepseek-v4-flash",
max_tokens=49_152,
cwd=str(workspace),
dsh_home=str(dsh_home),
profile="sdk-minimal",
patches=("/srv/dsh-home/demo/patches/editor.patch.yml",),
) as harness:
result = harness.run("Inspect the repository.", session_id="demo-001")
DeepSeek Harness:持久配置怎么写
要跨次启动保留,就把 patch 写进 $DSH_HOME/profiles/sdk-minimal/cordis.patch.yml。 步骤:(来源)
- 先初始化 profile — 执行
dsh --profile sdk-minimal --dump-default-config >/dev/null。预期:profile 目录与默认组合生成完毕。 - 编辑 cordis.patch.yml — 只写要增改的行,不要复制整棵树。预期:文件能被 YAML 解析。
- 用 dump 核对 —
dsh --profile sdk-minimal --dump-config。预期:输出里能看到你改的字段与来源文件。 - 再跑 SDK — 重新构造
DeepSeekHarness。预期:新配置生效,且不依赖本次传入的 patches。
如果第 3 步没看到改动,先检查 DSH_HOME 是不是你以为的那个目录。SDK 只读显式传入的 home,不会静默读取 ~/.dsh。
DeepSeek Harness:单次启动怎么传 patch
只影响一次的改动,用 patches 元组传入,不要污染持久文件。 适合三类场景:(来源)
- 临时提高超时 — 为一次长任务加一个超时 patch。预期:任务结束、进程退出后配置自动回到默认。
- 临时挂工具 — 只在某次调试中启用
str_replace_editor。预期:其他任务看不到这个工具。 - A/B 对比 — 同一 home 用两份不同 patch 跑两次。预期:两次结果可对比,且不互相污染。
传参时用绝对路径,顺序就是叠加顺序。后面的 patch 覆盖前面的同目标行。
DeepSeek Harness:启用 str_replace_editor 的完整写法
sdk-minimal 默认不挂载 str_replace_editor,要用一个 editor.patch.yml 把它插回去。 官方示例:(来源)
- insert:
- id: tool-str-replace-editor
name: '@deepseek-ai/dsh-tool-str-replace-editor'
两种启用方式:
- 按次启用 — 保存为
/srv/dsh-home/demo/patches/editor.patch.yml,构造时传patches=("/srv/dsh-home/demo/patches/editor.patch.yml",)。预期:下次运行时模型工具列表多出str_replace_editor。 - 持久启用 — 把同一段
insert合并进profiles/sdk-minimal/cordis.patch.yml。预期:之后每次启动都带这个工具。 - 标准 sdk profile 也能用 — 同一个 patch 对
sdkprofile 同样适用。预期:换成profile="sdk"后工具仍出现。
注意:本地文件系统后端以运行时工作目录解析相对路径,不会把访问限制在该目录内。启用编辑器后,权限边界要靠沙箱或一次性 checkout 控制。
DeepSeek Harness:patch 替换整个 config 的对照
官方规则是“patch 替换目标行的整个 config”,不是逐字段深合并。 原行有 apiKeyEnv、api、baseURL 三个字段时,patch 只写 api 会把另外两个字段一起删掉。正确做法是把原行完整抄下来再改;改完用 --dump-config 核对。(来源)
DeepSeek Harness:三种改配置方式的取舍
持久 patch、home patch、构造时 patches 各自解决不同问题,不要用一种方式包打天下。 对比如下:(来源)
- profile 持久 patch — 适合“这个 SDK 应用长期就要这样”。代价:换 home 就丢失,需要重新写。
- home patch — 适合“这台机器上所有 SDK profile 都要带”。代价:影响面大,调试时容易误伤其他任务。
- 构造时 patches — 适合“只这一次”。代价:每次调用都要记得传,漏传就回到默认。
一个实用规则:先在构造时 patches 里验证,确认稳定后再搬进 profile 持久 patch。这样不会把实验配置写进长期环境。
DeepSeek Harness 常见问题
Q:改了 cordis.patch.yml 需要重启 SDK 吗?
需要重新构造 DeepSeekHarness。持久 patch 在启动时读取;进程内的 harness 不会因为文件变化自动重载。
Q:patch 里只写一个字段,为什么其他字段没了?
因为 patch 替换目标行的整个 config,不是逐字段合并。改之前先把原行完整抄下来,再改其中一项。
Q:profile 能不能指向自己新建的目录?
可以,但该 profile 必须包含 @deepseek-ai/dsh-sdk-app 或另一个 JSON-RPC server 配置项。缺 server 配置会在启动时失败,不会回退。
一句话收束: SDK 配置的关键不是“写哪个文件”,而是先分清这层改动要活多久;一次性的进 patches,长期的进 cordis.patch.yml。
常见问题
DeepSeek Harness 里,由 profile、profile 持久 patch、home patch 与构造时传入的 patches 元组共同组成。profile 决定基础组合,持久 patch 写 cordis.patch.yml,home patch 影响该 home 下所有 profile,patches 元组只作用于本次启动。
DeepSeek Harness 里,把改动写进 $DSH_HOME/profiles/sdk-minimal/cordis.patch.yml。SDK 每个 home 都有自己的 profile 目录;写进这个文件的是持久配置,写进构造参数 patches 的只影响本次进程。
DeepSeek Harness 里,sdk-minimal 的默认 Cordis tree 不挂载它。要启用就写一个 editor.patch.yml,用 insert 加入 @deepseek-ai/dsh-tool-str-replace-editor,再通过 patches 参数传入,或把这段写进 cordis.patch.yml 持久化。
DeepSeek Harness 要求 profile 里包含 @deepseek-ai/dsh-sdk-app 或另一个 JSON-RPC server 配置项。缺失 server 配置、插件无法解析或 patch 非法都会在启动时失败,不会回退到其他组合。
DeepSeek Harness 里,可以,但要用不同的 session id。独立工作用新 session;只有要继续同一段持久对话和会话资源时,才同时复用 harness、home 与 session id。配置层是 home 级的,不要指望用 session 隔离配置。
相关术语
- sdk-minimal
- sdk-minimal 是 DeepSeek Harness Python SDK 随附的极简 profile,在空根上插入完整配置树且不含 dsh-base,只包含 SDK 协议、DeepSeek 适配器、本地执行与持久化。— DeepSeek Harness 官方文档 - Python SDK 入门
- cordis.patch.yml
- cordis.patch.yml 是 DeepSeek Harness profile 的持久配置补丁文件,位于 $DSH_HOME/profiles/<name>/ 下,用 insert 等操作在既有配置树上增改条目。— DeepSeek Harness 官方文档 - Python SDK 入门
- patches 元组
- patches 是构造 DeepSeekHarness 时可传入的有序 patch 文件路径元组,只作用于本次启动;它与 profile 持久 patch、home patch 一起决定最终配置。— DeepSeek Harness 官方文档 - Python SDK 入门
- str_replace_editor
- str_replace_editor 是 DeepSeek Harness 随附运行时里的文本编辑工具,但 sdk-minimal 默认不挂载;需要写 editor.patch.yml 显式插入 tool-str-replace-editor 才能使用。— DeepSeek Harness 官方文档 - Python SDK 入门
来源
- DeepSeek Harness 官方文档 - Python SDK 入门· deepseek-ai
- DeepSeek Harness 官方参考 - dsh CLI 行为· deepseek-ai