8月13日,DeepSeek开源了一个叫Harness的项目。29小时GitHub破9万星,5天破15万,截至今天已超16.7万星、1.7万fork。这是GitHub史上涨星最快的项目之一。
但我更关心的不是星数,而是它的定位——它不想做下一个Codex,也不想做下一个Claude Code。它想做的,是Agent的运行时底座。
核心公式只有一句话:Model + Harness = Agent。
DeepSeek Harness是什么
DeepSeek Harness(简称dsh)是一个开源的Agent运行时框架,MIT协议,TypeScript编写,目前是v0.1开发者预览版(最新rc.8)。
安装只需要一行:
| |
它会在http://127.0.0.1:3080启动Web UI,配置好模型API Key就能直接用。
和Codex、Claude Code不同,Harness不是一个"编程助手"——它是一个Agent运行时。你把模型丢进去,加上需要的插件,就得到一个Agent。编程只是它能做的事情之一。
这个区分很重要:Codex和Claude Code是工具,Harness是平台。
“一切皆插件"架构拆解
Harness的底层是一个叫Cordis的插件框架,这个名字来自DeepSeek内部代号,其设计有配套论文《A Programming Paradigm for Spatiotemporal Composability》。
Cordis的核心理念极其简洁:
没有特权内核需要打补丁——你通过在其他插件旁边挂载一个插件来扩展dsh,注册是可逆的效果(effect),当插件卸载时会自动回滚。
具体来说,Cordis基于五个核心概念运转:
| 概念 | 含义 |
|---|---|
| 插件(Plugin) | 实现Service的对象,通过apply(ctx)挂载到上下文 |
| 上下文(Context) | 服务仓库,服务通过ctx.<key>注册(如ctx.tools、ctx.llm) |
| 依赖注入(inject) | 声明式依赖等待,无需手动编排启动顺序 |
| 事件系统 | 支持emit/waterfall/parallel/serial四种分发模式 |
| 可逆效果(effect) | 所有注册都是可逆的,卸载时自动回滚 |
在Harness中,所有Agent能力都是插件——模型适配器、工具注册、会话日志、沙箱、存储、Agent循环本身,全部是插件。看它的包结构就能理解这个粒度:
| |
每个包都是一个能力声明(Service Definition)+ 能力实现(Provider)+ 能力消费(Consumer)的三件套。换一个Provider,整个能力就变了——比如把本地文件系统Provider换成远程沙箱Provider,bash、PTY、LSP全部跟着迁移,无需改动任何消费端代码。
这就是"一切皆插件"的真正含义:不是"支持插件”,而是"只有插件"。
Profile:组合的艺术
理解了Cordis,就理解了Harness的运行方式。一个运行中的dsh实例,本质上是一棵在启动时从有序层组合而成的插件树。
这棵插件树通过Profile来描述:
| 概念 | 定义 |
|---|---|
| Profile | 命名的组合方案,列出要堆叠的bundles,保存在Harness home中 |
| Bundle | Cordis配置行和代码的分发格式,作为组合的一层 |
| Patch | 用户级覆盖层,通过cordis.patch.yml修改任何已有配置行 |
Harness内置了两个Profile模板:web(浏览器应用)和headless(无服务器一次性运行)。
组合顺序很明确:先按顺序叠加每个bundle的patch → Profile的cordis.patch.yml → home级cordis.patch.yml → --patch覆盖层。
你可以用以下命令查看你的机器实际启动的插件树:
| |
它输出的每一行配置都可以被你的patch替换。没有任何一行是不能改的。
对比:三种哲学,三条路
现在我们可以把当前主流的Agent编程工具放在一起比较了:
| 维度 | Codex (OpenAI) | Claude Code (Anthropic) | DeepSeek Harness |
|---|---|---|---|
| 架构 | 封闭单体 | 紧耦合扩展 | 全插件化 |
| 模型绑定 | 仅OpenAI | 仅Anthropic | 多模型(OpenAI、Anthropic、Google、DeepSeek等) |
| 扩展方式 | 配置有限 | Hooks/Commands | 完整插件系统 |
| 定位 | 编程工具 | 编程工具 | Agent运行时 |
| 沙箱 | 内置容器 | 内置权限控制 | Provider可选(E2B、本地、自定义) |
| 会话管理 | 云端托管 | 本地文件 | 可插拔存储Provider |
| 开源协议 | Apache 2.0 | 部分开源 | MIT |
三者的本质区别:Codex和Claude Code是"帮你写代码的工具",Harness是"让你搭建Agent的平台"。
Codex的优势在于OpenAI的模型质量和沙箱安全;Claude Code的优势在于Anthropic的代码理解和紧密集成。但它们的扩展性都有天花板——你无法把Codex的模型换成Claude,也无法给Claude Code加一个完全不同的工具系统。
Harness可以。因为模型是插件,工具是插件,沙箱是插件,甚至Agent循环本身都是插件。
Cordis事件系统:Agent的神经系统
Harness的事件系统是理解其架构的关键。它定义了三种事件域:
| 事件域 | 用途 | 特点 |
|---|---|---|
| Session事件 | 持久化事实,写入日志 | 可重放、可恢复 |
Agent事件(agent/*) | 拦截运行中的Agent | inbox、step、request、validation |
| Capability事件 | 挂载策略和适配器 | fs/*、tools/*、telemetry/* |
一次Agent执行的流程是这样的:
| |
关键设计原则:模型可见的必须可记录。 任何到达模型请求的内容都必须能从日志中重建——这是为什么新的模型可见输入需要新的session事件。这个runtime不变量保证了会话的可重放性和可fork性。
对开发者意味着什么
Harness对开发者的价值不在于"又多了一个编程工具",而在于它走了一条不同的路:
从"用模型"到"搭Agent"。
以前你想做一个Agent,需要从零搭建:模型接入、工具注册、会话管理、沙箱隔离、循环调度,每个都是独立工程。现在你只需要:选一个模型Provider插件 + 挂上需要的工具插件 + 配置Profile = Agent完成。
Harness内置的核心包覆盖了Agent开发的几乎所有基础设施:
| 能力 | 包 | 作用 |
|---|---|---|
| 会话管理 | core/session | 追加式事件日志 + 内存存储 |
| 提示词组装 | core/system-prompt | 模板化prompt sections + tool schemas |
| 工具注册 | core/tools | 作用域工具注册 + 守卫执行管线 |
| Agent循环 | core/agent-loop | 默认驱动实现 |
| 子Agent | packages/subagent | 委托、编排、协作 |
| 文件系统 | packages/fs | 能力声明 + 策略 |
| Shell执行 | packages/shell | bash能力 + local/pwsh providers |
| LSP | packages/lsp | 语言服务器能力 |
这意味着开发者可以专注于"我的Agent需要什么独特能力",而不是"怎么让Agent跑起来"。
实操建议
什么人适合现在关注Harness?
- Agent框架开发者:想理解下一代Agent架构的设计思路
- 插件/扩展系统设计者:Cordis的"可逆效果"模式值得学习
- 多模型用户:需要在不同模型间切换而不重写代码
现阶段的局限:
- 还是v0.1开发者预览版,官方明确说"会有破坏兼容性的变更"
- 文档还在完善中,架构文档质量不错但用户指南偏薄
- 生态虽然已有8600+个dsh-plugin标签仓库,但成熟度远不及Claude Code的Hooks生态
- Python SDK在开发中,目前TypeScript为主
建议: 如果你是Agent开发者或深度技术用户,现在就值得clone下来研究架构。如果你只是想找一个编程助手,现阶段Codex或Claude Code仍然是更成熟的选择。
Harness的价值不在于今天能用它做什么,而在于它对Agent基础设施该怎么搭,给出了自己的答案。
作者:varkm 数据来源:GitHub API实时查询(2026-08-20),DeepSeek Harness官方文档