- 本文基于以下版本:
- DSH 目前处于开发者预览阶段,官方明确表示“未来将出现破坏兼容性的变更”3。它的安全说明也写明:本软件尚未接受安全审计,不得视为安全或可用于生产环境的软件4。
- 笔者实测发现,npm 上的 rc 包可能落后于仓库源码,详见 5.3 DSH 核心机制与插件开发 中的“踩坑记录”。资料截至 2026-10-09,请以 GitHub 仓库 和 官方文档站 为准。
- DSH 是 DeepSeek AI 开发的开源 agent harness,架构核心是“一切皆插件”。它构建在 Cordis 之上,Cordis 的设计思想发表在论文 A Programming Paradigm for Spatiotemporal Composability 中3。
- 产品的每一部分都是插件:模型适配器、工具注册表、会话日志,连 agent loop 本身也是插件,所以每一部分都可以通过配置替换。没有需要打补丁的特权内核5。
- 它的形态是核心很轻,发行版很重:Cordis 核心约 2,700 行,agent-loop 插件约 2,400 行;但完整发行版有三百多个 workspace 包、约 43 万行 TypeScript。这些行数是笔者自己统计的。
- 它与外部生态有很多互通:可以复用 pi-ai 适配器;可以运行 Claude Code 或 Codex 的 hooks 配置;可以把子任务委派给 Claude Code 或 Codex;同时支持 MCP 和 ACP6。
1. 基本信息#
| 项 | 内容 | 出处 |
|---|---|---|
| 开发者 | DeepSeek AI | 3 |
| 许可证 | MIT | 37 |
| GitHub 仓库创建时间 | 2026-08-13 | 7 |
| npm 包首次发布 | 2026-08-10 | 1 |
| Star 数 | 约 24.6 万(2026-10-09) | 7 |
| 语言 | TypeScript(Node.js);另有 Python SDK | 32 |
| 架构基础 | 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. 快速体验#
# 方式一:通过 npm 直接运行,需要已安装 Node.jsnpx @deepseek-ai/dsh web# 默认在 http://127.0.0.1:3080 启动 Web UI;在本机运行时会自动打开浏览器
# 方式二:从源码运行git clone https://github.com/deepseek-ai/deepseek-harness.gitcd deepseek-harnesspnpm install && pnpm run buildpnpm dsh web以上取自 README3。仓库里还有一个 Electron 桌面应用(apps/desktop),它会把与之精确匹配的 dsh 运行时一起打包进去5。
3. 架构总览#
3.1 Profile 与组合包:运行中的 dsh 是一棵插件树#
一个运行中的 dsh 是一棵插件树,由启动时按顺序叠加的若干层组合而成5:
一条 patch 可以按 id 找到某个条目并替换它的整个 config,也可以插入新的条目5。
| Profile(随发行版提供的模板) | 组成 | 用途 |
|---|---|---|
web | dsh-base + dsh-web-app | 浏览器界面 |
headless | dsh-base + dsh-headless | 不带服务器的一次性运行器 |
sdk | dsh-base + dsh-sdk-app | 通过 stdio JSON-RPC 对外提供 SDK 服务 |
sdk-minimal | 独立的 dsh-sdk-minimal,不使用 dsh-base | 极简的 SDK 配置:一个 DeepSeek 适配器加一个持久化 shell |
acp | dsh-base + dsh-acp-app | 仅用于自动化的 ACP(Agent Client Protocol)服务器 |
以上取自架构文档5。dsh-base 是这些 profile 共享的第一层,包含模型适配器、工具、持久化、沙箱与审批策略、设置、凭据、遥测5。
3.2 核心包#
| 包 | 职责 | ctx 上的服务名 |
|---|---|---|
core/session | 只追加的 SessionEvent 日志,以及内存存储 | ctx.sessions |
core/system-prompt | 组装提示词片段和工具 schema | ctx.systemPrompt |
core/tools | 按作用域划分的工具注册表,以及带把关的执行流水线 | ctx.tools |
core/agent | Agent 接口、活跃 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 | 排序 | 主要组成(节选) |
|---|---|---|
standard | 1 | persona、AGENTS.md / CLAUDE.md 指令加载、时间上下文、bash 或 pwsh、文件读写、文件搜索、后台任务、定时任务、skills、目标(goal)、plan mode 等 |
ptc | 2 | 面向 PTC(Programmatic Tool Calling,用代码调用工具)的组合 |
minimal | 3 | 极简 persona,加一个持久化的 bash 或 pwsh 终端 |
一个 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: false4. 模型#
- 官方的 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 的 hooks | dsh-hooks-claude-code | 在 DSH 的拦截点上运行 Claude Code 的 hooks.json 或 settings 中的 hook 配置 |
| 运行 Codex 的 hooks | dsh-hooks-codex | 运行 Codex 的 hooks.json 配置 |
| 委派给 Claude Code | dsh-subagent-claude-code | 通过官方 Agent SDK,一次性地把子任务交给 Claude Code |
| 委派给 Codex | dsh-subagent-codex | 通过官方的 app-server 协议,一次性地把子任务交给 Codex |
| MCP | dsh-mcp-client | 连接 MCP 服务器,把它们的工具注册到 ctx.tools 上 |
| ACP | dsh-acp | 供自动化使用的 Agent Client Protocol 服务器 |
| pi-ai | dsh-llm-pi-ai | 复用 pi-ai 的多厂商能力 |
以上取自各包 package.json 的 description 字段6。
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。
根据官方 README12:
- 协议层还不支持中途取消一轮对话,放弃一轮只能关闭整个运行时;
run()返回的finalResponse是“这段时间里最后提交的 assistant 文本”,不一定在因果上属于你发的这条提示,因为 steering、注入的上下文都可能参与其中。
- Python 示例:已用 pyright 对照 PyPI 上的
deepseek-harness-sdk0.1.5rc1 做过类型检查。安装时会连同平台专属的运行时包deepseek-harness-runtime-bin一起装上。 - TS 示例:“写法二”已对照 npm 上的
@deepseek-ai/dsh-sdk-client0.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.1 从 LLM API 到 Agent Harness 的分层
- 5.2 Cordis 与一切皆插件 · 5.3 DSH 核心机制与插件开发
- 对照:4.1 pi 全景与设计哲学 · 3.3 Claude Agent SDK
参考资料#
注释与出处#
-
npm registry,
@deepseek-ai/dsh(latest 为 0.2.0-rc.2;包创建于 2026-08-10),https://www.npmjs.com/package/@deepseek-ai/dsh ↩ ↩2 -
PyPI,
deepseek-harness-sdk(0.1.5rc1,上传于 2026-09-10,要求 Python ≥ 3.10),https://pypi.org/project/deepseek-harness-sdk/ ↩ ↩2 -
deepseek-ai/deepseek-harness,
README.zh.md(commit5badb15),https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/README.zh.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 -
deepseek-ai/deepseek-harness,
SAFETY.zh.md,https://github.com/deepseek-ai/deepseek-harness/blob/5badb15009ae1756c3afe0ae0cef1faafc290ccc/SAFETY.zh.md ↩ ↩2 ↩3 -
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 -
deepseek-ai/deepseek-harness,
packages/下各包package.json的 description 字段(hooks、subagent、mcp、acp、llm 等),https://github.com/deepseek-ai/deepseek-harness/tree/5badb15009ae1756c3afe0ae0cef1faafc290ccc/packages ↩ ↩2 -
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 -
Shi, Zhang, Cui,A Programming Paradigm for Spatiotemporal Composability,arXiv:2608.25512(2026-08-26),https://arxiv.org/abs/2608.25512 ↩
-
developersdigest.tech,DeepSeek Harness (dsh) first look(第三方评测,2026-08),https://www.developersdigest.tech/blog/deepseek-harness-dsh-first-look ↩ ↩2
-
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 -
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 -
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 -
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 ↩ -
pi.dev 包目录,pi2dsh,https://pi.dev/packages/pi2dsh ↩
-
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 -
npm 包
@deepseek-ai/dsh-sdk-client0.0.1-rc.1 自带的README.md(“DeepSeekHarness” 一节),https://www.npmjs.com/package/@deepseek-ai/dsh-sdk-client ↩