返回专栏
Agent SDK/05 · DSH/5.1

DeepSeek Harness 全景

DSH 是 DeepSeek AI 开发的开源 agent harness,架构核心是“一切皆插件”。

预计阅读
16分钟
全文字数
3,060字
资料截至
2026-10-09
Agent SDK · DSH5.1
版本与时效声明
  • 本文基于以下版本:
    • npm 包 @deepseek-ai/dsh 0.2.0-rc.2,2026-10-03 发布,是 latest 标签对应的版本;另外还发布了 0.2.1-alpha.11。
    • 仓库 deepseek-ai/deepseek-harness 的 commit 5badb15(2026-10-03)。
    • PyPI 包 deepseek-harness-sdk 0.1.5rc12。
  • DSH 目前处于开发者预览阶段,官方明确表示“未来将出现破坏兼容性的变更”3。它的安全说明也写明:本软件尚未接受安全审计,不得视为安全或可用于生产环境的软件4。
  • 笔者实测发现,npm 上的 rc 包可能落后于仓库源码,详见 5.3 DSH 核心机制与插件开发 中的“踩坑记录”。资料截至 2026-10-09,请以 GitHub 仓库 和 官方文档站 为准。
本文要点
  1. DSH 是 DeepSeek AI 开发的开源 agent harness,架构核心是“一切皆插件”。它构建在 Cordis 之上,Cordis 的设计思想发表在论文 A Programming Paradigm for Spatiotemporal Composability 中3。
  2. 产品的每一部分都是插件:模型适配器、工具注册表、会话日志,连 agent loop 本身也是插件,所以每一部分都可以通过配置替换。没有需要打补丁的特权内核5。
  3. 它的形态是核心很轻,发行版很重:Cordis 核心约 2,700 行,agent-loop 插件约 2,400 行;但完整发行版有三百多个 workspace 包、约 43 万行 TypeScript。这些行数是笔者自己统计的。
  4. 它与外部生态有很多互通:可以复用 pi-ai 适配器;可以运行 Claude Code 或 Codex 的 hooks 配置;可以把子任务委派给 Claude Code 或 Codex;同时支持 MCP 和 ACP6。

1. 基本信息#

项内容出处
开发者DeepSeek AI3
许可证MIT37
GitHub 仓库创建时间2026-08-137
npm 包首次发布2026-08-101
Star 数约 24.6 万(2026-10-09)7
语言TypeScript(Node.js);另有 Python SDK32
架构基础Cordis,论文为 arXiv:2608.25512(2026-08-26)38
当前状态开发者预览,未来会有破坏性变更3
官方中文资料README、架构、术语表、教程、cookbook 均有 .zh.md 中文版仓库 docs/
关于第三方评测

developersdigest.tech 在发布初期写过一篇 first look9,其中几条观察:

  • 许可证在 RC 阶段从 BSD-3-Clause 改成了 MIT;
  • 代码以一次 squash 提交的形式进入仓库;
  • BENCHMARK.md 只有寥寥几行,没有给出评测数据。

这些是第三方在 2026-08 的观察,部分情况可能已经变化。笔者核对了当前仓库:BENCHMARK.md 仍然只有一段指向 Python SDK 文档的说明。


2. 快速体验#

Terminal window
# 方式一:通过 npm 直接运行,需要已安装 Node.js
npx @deepseek-ai/dsh web
# 默认在 http://127.0.0.1:3080 启动 Web UI;在本机运行时会自动打开浏览器
# 方式二:从源码运行
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install && pnpm run build
pnpm dsh web

以上取自 README3。仓库里还有一个 Electron 桌面应用(apps/desktop),它会把与之精确匹配的 dsh 运行时一起打包进去5。

运行前先看安全说明

DSH 可以执行模型生成的代码和命令、加载第三方插件,并访问对它开放的网络、进程、凭据和文件4。官方建议:

  • 只授予最小权限;
  • 优先在一次性的虚拟机、容器或专用环境中运行;
  • 备份它能访问的文件;
  • 在允许执行之前,先检查插件、配置和将要执行的命令4。

3. 架构总览#

dsh-plugin-tree.svg

3.1 Profile 与组合包:运行中的 dsh 是一棵插件树#

一个运行中的 dsh 是一棵插件树,由启动时按顺序叠加的若干层组合而成5:

空的条目列表

① profile 列出的各个组合包(bundle)

按顺序应用各自的 patch

② profile 自己的 cordis.patch.yml

③ Harness home 级别的 cordis.patch.yml

④ 命令行上的 --patch overlay

最终的插件树

(可以用 dsh --profile web --dump-config 查看)

空的条目列表

① profile 列出的各个组合包(bundle)

按顺序应用各自的 patch

② profile 自己的 cordis.patch.yml

③ Harness home 级别的 cordis.patch.yml

④ 命令行上的 --patch overlay

最终的插件树

(可以用 dsh --profile web --dump-config 查看)

一条 patch 可以按 id 找到某个条目并替换它的整个 config,也可以插入新的条目5。

Profile(随发行版提供的模板)组成用途
webdsh-base + dsh-web-app浏览器界面
headlessdsh-base + dsh-headless不带服务器的一次性运行器
sdkdsh-base + dsh-sdk-app通过 stdio JSON-RPC 对外提供 SDK 服务
sdk-minimal独立的 dsh-sdk-minimal,不使用 dsh-base极简的 SDK 配置:一个 DeepSeek 适配器加一个持久化 shell
acpdsh-base + dsh-acp-app仅用于自动化的 ACP(Agent Client Protocol)服务器

以上取自架构文档5。dsh-base 是这些 profile 共享的第一层,包含模型适配器、工具、持久化、沙箱与审批策略、设置、凭据、遥测5。

3.2 核心包#

包职责ctx 上的服务名
core/session只追加的 SessionEvent 日志,以及内存存储ctx.sessions
core/system-prompt组装提示词片段和工具 schemactx.systemPrompt
core/tools按作用域划分的工具注册表,以及带把关的执行流水线ctx.tools
core/agentAgent 接口、活跃 agent 注册表、agent/* 事件ctx.agents
core/agent-loop实现上述接口的默认驱动器ctx.agentLoop
llm/llm消息与流式词汇表,以及适配器的接入点ctx.llm

以上取自架构文档5。

3.3 Agent 预设(Preset)#

dsh-web-app 组合包随附了三个 agent preset,分别定义在 presets/*.patch.yml 中10:

Preset排序主要组成(节选)
standard1persona、AGENTS.md / CLAUDE.md 指令加载、时间上下文、bash 或 pwsh、文件读写、文件搜索、后台任务、定时任务、skills、目标(goal)、plan mode 等
ptc2面向 PTC(Programmatic Tool Calling,用代码调用工具)的组合
minimal3极简 persona,加一个持久化的 bash 或 pwsh 终端
看看 preset 文件,最能体会“一切皆插件”

一个 preset 本质上就是一段 YAML:列出这个 agent 需要哪些插件、每个插件怎么配置。plan mode、skills、bash 工具全都是可以替换、可以删除的插件条目。下面是 minimal preset 的开头部分10:

- insert:
- id: preset-minimal
name: '@deepseek-ai/dsh-agent-preset'
config:
id: minimal
order: 3
plugins:
- id: persona
name: '@deepseek-ai/dsh-persona'
config:
prefix: You are a helpful software engineer assistant.
complete: true
includeRuntimeContext: false

4. 模型#

  • 官方的 DeepSeek 适配器 dsh-llm-deepseek 通过 provider: deepseek-official 选择路由,模型 id 会原样传给 API,所以 DeepSeek 推出新模型时不需要重新注册11。
  • 不显式配置模型列表时,默认的模型目录里有两个条目,上下文窗口都是 1,000,000 token11:
    • 支持文本和图像的 deepseek-flash;
    • 只支持文本的 deepseek-v4-pro。
  • SDK 示例里用的是 model: 'deepseek-v4-flash',推理强度可以设为 max 等档位12。
  • 多厂商:dsh-llm-pi-ai 适配器借助 pi-ai,把请求路由到多个 pi-ai 提供方、兼容 OpenAI 的网关或自托管服务器。它的 package 描述称自己是官方 DeepSeek 适配器的设计验证孪生13。

5. 与外部生态的互通#

方向包说明
运行 Claude Code 的 hooksdsh-hooks-claude-code在 DSH 的拦截点上运行 Claude Code 的 hooks.json 或 settings 中的 hook 配置
运行 Codex 的 hooksdsh-hooks-codex运行 Codex 的 hooks.json 配置
委派给 Claude Codedsh-subagent-claude-code通过官方 Agent SDK,一次性地把子任务交给 Claude Code
委派给 Codexdsh-subagent-codex通过官方的 app-server 协议,一次性地把子任务交给 Codex
MCPdsh-mcp-client连接 MCP 服务器,把它们的工具注册到 ctx.tools 上
ACPdsh-acp供自动化使用的 Agent Client Protocol 服务器
pi-aidsh-llm-pi-ai复用 pi-ai 的多厂商能力

以上取自各包 package.json 的 description 字段6。

pi2dsh:社区做的桥接

pi.dev 的包目录里有一个 pi2dsh,它可以把未经修改的 pi 扩展作为 DSH 原生插件运行,并把 pi 的 MCP 配置转换成 DSH 的格式。注意它是社区项目,作者是 weijf14,2026-09-22 发布 0.25.2,不是 Earendil 或 DeepSeek 官方出品。页面自称前 50 个 pi 包中已验证 47 个可用14。


6. 两个 SDK:用代码驱动 DSH#

两个 SDK 都会以子进程方式启动一个完整的 DSH 运行时,再通过 stdio JSON-RPC 驱动它。两者共用同一个运行时和同一套协议1215。

写法一:仓库源码(commit 5badb15)中 README 的写法。 只需给出 profile,客户端会自动找到同版本的 @deepseek-ai/dsh 可执行文件12:

// 片段(no-check):这是仓库源码 README 的写法,npm 上的 0.0.1-rc.1 还不支持 profile 选项
import { DeepSeekHarness } from "@deepseek-ai/dsh-sdk-client";
await using harness = new DeepSeekHarness({
profile: "sdk",
provider: "deepseek-official",
model: "deepseek-v4-flash",
maxTokens: 49_152,
});
const result = await harness.run("检查这个仓库,修复失败的测试。");
console.log(result.finalResponse);

写法二:npm 上 @deepseek-ai/dsh-sdk-client 0.0.1-rc.1 的写法。 需要用 launch 显式指定运行时子进程怎么启动。下面的代码取自该版本 npm 包自带的 README16,已对照这个版本做过类型检查:

import { DeepSeekHarness } from "@deepseek-ai/dsh-sdk-client";
// 子进程在第一次使用时才启动;close() 或 await using 会回收它
await using harness = new DeepSeekHarness({
launch: { command: "node", args: ["lib/bin.js", "cordis.yml"] }, // 运行时可执行文件,以及要加载的插件配置
provider: "deepseek-official",
model: "deepseek-v4-flash",
maxTokens: 49_152,
});
const result = await harness.run("say hi");
console.log(result.finalResponse); // 这段时间内根会话最后提交的 assistant 文本
console.log(result.events.length, "个事件");
版本差异提醒

同一个 SDK,仓库最新源码和 npm 已发布版本的接口不一样。动手之前,先确认你装的是哪个版本,再看对应版本自带的 README。笔者在 5.3 的踩坑记录里还整理了其他几处差异。

from pathlib import Path
from deepseek_harness import DeepSeekHarness
workspace = Path("/absolute/path/to/disposable-workspace").resolve()
dsh_home = Path("/absolute/path/to/example-dsh-home").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",
) as harness:
result = harness.run("Inspect the repository and fix the failing tests.", session_id="example-001")
print(result.final_response)

这是官方 Python SDK 指南中的示例15。Python 的运行时 wheel 里已经打包了 dsh CLI,所以普通的 SDK 运行不需要系统里装有 Node.js155。

SDK 的已知限制

根据官方 README12:

  • 协议层还不支持中途取消一轮对话,放弃一轮只能关闭整个运行时;
  • run() 返回的 finalResponse 是“这段时间里最后提交的 assistant 文本”,不一定在因果上属于你发的这条提示,因为 steering、注入的上下文都可能参与其中。
校验情况
  • Python 示例:已用 pyright 对照 PyPI 上的 deepseek-harness-sdk 0.1.5rc1 做过类型检查。安装时会连同平台专属的运行时包 deepseek-harness-runtime-bin 一起装上。
  • TS 示例:“写法二”已对照 npm 上的 @deepseek-ai/dsh-sdk-client 0.0.1-rc.1 做过类型检查。
  • 两者都需要 DeepSeek 的 API Key,所以都没有实际运行。

7. “轻量”的两面#

笔者用 find 加 wc -l 粗略统计了 src/ 下非测试的 .ts 和 .tsx 文件:

部分代码行数
Cordis 核心(vendor/cordis/src)约 2,700 行
core/agent-loop约 2,400 行
core/agent约 1,700 行
core/session约 3,200 行
core/tools约 5,600 行
sandbox/sandbox(接口)约 500 行
整个发行版(packages/ 加 apps/)约 43 万行;package.json 有三百多个

第三方评测在发布之初给出的数字是约 45.3 万行、约 219 个 workspace 包9。

笔者理解:

  • 如果把“轻量”理解成“代码少”,DSH 并不轻量。
  • 但如果理解成“核心小、每样东西都能拔掉、能替换”,它可以说是最彻底的轻量设计:一个最小可用的 agent 只需要 sdk-minimal 这一个组合包。
  • 这与 pi 的取向一致:核心不做,交给插件或扩展去做。区别在于,pi 用的是“扩展 API”,DSH 用的是“依赖注入加可逆副作用的组合框架”。

小结#

  • DSH 的关键词:一切皆插件(Cordis)、profile 和 bundle 层层叠加、session log 是唯一事实来源、fail-closed 沙箱、广泛互通。
  • 它目前仍是开发者预览版,适合学习架构、做实验、开发插件;不适合直接用于生产。
  • 继续阅读:5.2 Cordis 与一切皆插件 讲框架原理;5.3 DSH 核心机制与插件开发 讲事件日志、工具流水线、沙箱,以及动手写插件。

相关笔记#

参考资料#

注释与出处#

  1. npm registry,@deepseek-ai/dsh(latest 为 0.2.0-rc.2;包创建于 2026-08-10),https://www.npmjs.com/package/@deepseek-ai/dsh ↩ ↩2

  2. PyPI,deepseek-harness-sdk(0.1.5rc1,上传于 2026-09-10,要求 Python ≥ 3.10),https://pypi.org/project/deepseek-harness-sdk/ ↩ ↩2

  3. deepseek-ai/deepseek-harness,README.zh.md(commit 5badb15),https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/README.zh.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  4. deepseek-ai/deepseek-harness,SAFETY.zh.md,https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/SAFETY.zh.md ↩ ↩2 ↩3

  5. deepseek-ai/deepseek-harness,docs/architecture.zh.md,https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/docs/architecture.zh.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  6. deepseek-ai/deepseek-harness,packages/ 下各包 package.json 的 description 字段(hooks、subagent、mcp、acp、llm 等),https://github.com/deepseek-ai/deepseek-harness/tree/5badb15009ae1756c3afe0ae0cef1faafc290ccc/packages ↩ ↩2

  7. GitHub REST API,GET /repos/deepseek-ai/deepseek-harness(2026-10-09 查询:created_at 为 2026-08-13T11:56:32Z,stargazers_count 为 245786,license 为 MIT) ↩ ↩2 ↩3

  8. Shi, Zhang, Cui,A Programming Paradigm for Spatiotemporal Composability,arXiv:2608.25512(2026-08-26),https://arxiv.org/abs/2608.25512 ↩

  9. developersdigest.tech,DeepSeek Harness (dsh) first look(第三方评测,2026-08),https://www.developersdigest.tech/blog/deepseek-harness-dsh-first-look ↩ ↩2

  10. deepseek-ai/deepseek-harness,packages/bundle/web-app/presets/(standard、ptc、minimal 三个 patch 文件),https://github.com/deepseek-ai/deepseek-harness/tree/5badb15009ae1756c3afe0ae0cef1faafc290ccc/packages/bundle/web-app/presets ↩ ↩2

  11. deepseek-ai/deepseek-harness,packages/llm/llm-deepseek/README.zh.md,https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/packages/llm/llm-deepseek/README.zh.md ↩ ↩2

  12. deepseek-ai/deepseek-harness,packages/sdk/client/README.zh.md,https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/packages/sdk/client/README.zh.md ↩ ↩2 ↩3 ↩4

  13. deepseek-ai/deepseek-harness,packages/llm/llm-pi-ai/(package.json 的 description 与 README.zh.md),https://github.com/deepseek-ai/deepseek-harness/tree/5badb15009ae1756c3afe0ae0cef1faafc290ccc/packages/llm/llm-pi-ai ↩

  14. pi.dev 包目录,pi2dsh,https://pi.dev/packages/pi2dsh ↩

  15. deepseek-ai/deepseek-harness,docs/user/guide/python-sdk.zh.md,https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/docs/user/guide/python-sdk.zh.md ↩ ↩2 ↩3

  16. npm 包 @deepseek-ai/dsh-sdk-client 0.0.1-rc.1 自带的 README.md(“DeepSeekHarness” 一节),https://www.npmjs.com/package/@deepseek-ai/dsh-sdk-client ↩

输入关键词开始搜索。多个关键词用空格分隔。