在这里插入图片描述

前面研究 Claude Code、Codex 时,我们逐渐形成了一套比较稳定的 Agent Harness 认知:

User Goal
    ↓
Harness
    ↓
Instruction
    ↓
Skill / Agent / Tool
    ↓
Policy
    ↓
Sandbox
    ↓
Execution

在这套模型里,通常存在一个相对稳定的:

Harness Core

然后再围绕 Core 挂载:

Skill
Plugin
MCP
Hook
Custom Agent

也就是说,我们习惯的扩展模型大致是:

                 Harness Core
                      │
          ┌───────────┼───────────┐
          ↓           ↓           ↓
        Skill       Plugin       Tool
          │           │           │
          └───────────┼───────────┘
                      ↓
                   Runtime

但 DeepSeek 最近开源的 DeepSeek Harness,在架构上选择了一条明显不同的路线。

官方给这个项目的核心定位非常直接:

Everything is a Plugin

DeepSeek Harness,简称:

dsh

是 DeepSeek AI 官方开源的 Agent Harness,目前仍处于 Developer Preview 阶段,官方明确提示其接口和架构仍然会快速演进,并可能发生兼容性破坏。项目底层由 Cordis 驱动。

真正值得研究的地方并不是:

DeepSeek Harness 支持 Plugin

而是:

DeepSeek Harness 本身,就是通过 Plugin 组合出来的。

官方架构文档明确把 Model Adapter、Tool Registry、Session Log、Agent Loop 都纳入 Plugin 体系,并说明运行中的 dsh 是启动阶段通过多层配置组合出来的一棵 Plugin Tree。

所以理解 DeepSeek Harness 时,需要先把传统的:

Harness Core
    ↓
Load Plugin

换成另一种思路:

Plugin
+
Plugin
+
Plugin
+
Composition
    ↓
Plugin Tree
    ↓
Agent Runtime

这也是我们这一篇首先要建立的架构地图。


一、先认识 DeepSeek Harness:它到底不一样在哪里

1. DeepSeek Harness 是什么

从使用方式来看,dsh 仍然是一个典型的 Agent Harness。

官方目前可以直接通过:

npx @deepseek-ai/dsh web

启动 Web UI,默认监听:

http://127.0.0.1:3080

也可以从源码运行:

git clone https://github.com/deepseek-ai/deepseek-harness.git

cd deepseek-harness

pnpm install

pnpm run build

pnpm dsh web

这些都是当前官方 README 给出的运行入口。

如果只从产品形态来看,它很容易让人联想到:

Claude Code

Codex

OpenCode

这些 Coding Harness。

因为它们最终都需要完成类似的事情:

User
    ↓
LLM
    ↓
Agent Loop
    ↓
Tool
    ↓
Filesystem / Shell / Web
    ↓
Observation
    ↓
Next Loop

但 DeepSeek Harness 真正特别的地方,不在这条 Agent Loop 本身,而在于:

这条 Loop 是怎么被构造出来的。

2. 传统 Harness:Core 先存在

在很多 Harness 中,我们可以用一个比较直观的模型理解:

Harness Core
│
├── Session Manager
├── Agent Loop
├── Tool Registry
├── Context Manager
├── Permission
└── Runtime

然后 Core 再提供:

Extension Point

让外部能力加入:

Plugin
Skill
Hook
Tool
Agent

于是:

Core
    ↓
Extension API
    ↓
Plugin

这是一种典型的:

Core + Extension

架构。


3. DeepSeek Harness:Runtime 本身也是 Composition

DeepSeek Harness 官方架构文档则强调:Cordis 下面的插件可以向共享 Context 贡献 Service、Typed Event 和可逆的 Effect;包括 Model Adapter、Tool Registry、Session Log、Agent Loop 在内的产品组件本身都是 Plugin。

所以可以把它抽象成:

                    Cordis
                       │
       ┌───────────────┼───────────────┐
       ↓               ↓               ↓
   LLM Plugin      Tool Plugin    Session Plugin
       │               │               │
       └───────────────┼───────────────┘
                       ↓
                Agent Loop Plugin
                       ↓
                    Runtime

这里最值得注意的是:

Agent Loop

自己也不是绝对固定的 Core。

官方在 package 设计里专门将:

core/agent

和:

core/agent-loop

拆开,前者提供 Agent 接口与 Registry,后者提供默认 Driver;官方 package 说明也明确指出 dsh-agent-loop 是可替换的。

因此 DeepSeek Harness 更接近:

Plugin
    ↓
Composition
    ↓
Runtime

而不是:

Runtime
    ↓
Plugin

这就是理解整个项目的第一把钥匙。


二、从源码目录建立 DeepSeek Harness 的静态地图

理解一个 Harness,第一步仍然应该从磁盘结构开始。

因为目录结构往往能够回答几个非常基础的问题:

Core 在哪里?

Capability 在哪里?

Runtime 在哪里?

Plugin 在哪里?

配置与分发在哪里?

1. 先看整个 Monorepo

目前 DeepSeek Harness 官方仓库根目录主要包括:

deepseek-harness/
│
├── .agents/
├── .claude/
├── .github/
│
├── apps/
├── assets/
├── docs/
├── examples/
│
├── native/
├── packages/
├── patches/
├── python/
├── scripts/
├── vendor/
├── website/
│
├── AGENTS.md
├── CLAUDE.md
├── package.json
├── pnpm-workspace.yaml
└── ...

这是一个明显的 Monorepo,官方仓库当前确实以 apps/packages/native/python/vendor/ 等目录组织代码。

如果从 Harness 架构而不是普通源码阅读的角度看,可以先压缩成:

deepseek-harness/
│
├── apps/
│      → Product Entry
│
├── packages/
│      → Harness Components
│
├── vendor/
│      → Underlying Framework / Vendored Dependencies
│
├── native/
│      → Native Runtime Capability
│
├── python/
│      → Python-side Capability
│
└── docs/
       → Architecture / Development Contract

第一篇不需要把每个目录都展开。

真正应该重点关注的是:

packages/

因为大部分 Harness 能力都在这里。


2. packages 并不是一个简单的 Tool 集合

当前官方 packages/README.md 已经列出了非常多的 package group,例如:

core
api
llm
subprocess
shell
terminal
sandbox
fs
lsp
skill
context
subagent
jobs
workflow
web
bundle
extensions
hooks
session
settings
credentials
workspace
interaction
boot
host
client
...

官方给每个 group 都定义了明确角色,例如:

core
    → Product API spine

llm
    → LLM capability family

shell
    → Bash capability family

fs
    → Filesystem capability family

skill
    → Skill capability family

subagent
    → Subagent capability family

workflow
    → Workflow seam

sandbox
    → Process confinement

bundle
    → Profile patch layers

这些角色都可以在当前 package 索引里直接确认。

不过,如果直接把几十个 package 平铺给读者,其实很难建立整体认知。

所以为了理解架构,我们可以做一次工程化重新归类

注意:下面这个分类不是 DeepSeek 官方真实目录层级,而是本文为了理解 Harness 使用的架构抽象。


3. 可以把 packages 重新理解成五层

第一层:Runtime Core

Runtime Core
│
├── core
├── llm
├── session
├── context
├── settings
└── interaction

主要解决:

Agent
Session
Prompt
Tool Registry
LLM
Context
Human Interaction

其中官方核心架构目前明确列出了:

ctx.sessions
ctx.systemPrompt
ctx.tools
ctx.agents
ctx.agentLoop
ctx.llm

这些 Context Service。


第二层:Execution Capability

Execution Capability
│
├── fs
├── subprocess
├── shell
├── terminal
├── lsp
├── web
├── code-runtime
└── sandbox

这一层解决:

Agent 到底可以操作什么。

例如:

Filesystem

Process

Shell

PTY

Language Server

Web

Code Execution

第三层:Agent Capability

Agent Capability
│
├── skill
├── subagent
├── workflow
├── jobs
├── plan
├── goal
└── preset

这一层开始进入:

Agent 如何组织工作。

例如:

Skill
Delegation
Workflow
Background Job
Plan
Goal
Agent Preset

第四层:Runtime Infrastructure

Runtime Infrastructure
│
├── credentials
├── storage
├── workspace
├── hooks
├── extensions
└── telemetry related components

主要解决:

Credential
Storage
Workspace
Lifecycle Extension
Runtime Modification
Observability

第五层:Composition / Product Surface

Composition
│
├── bundle
├── boot
├── host
├── client
├── api
└── sdk

主要解决:

这些能力最终怎么被组合成一个可以运行的产品。

于是原本看起来非常复杂的几十个 packages,就可以先收敛成:

DeepSeek Harness
│
├── Runtime Core
│
├── Execution Capability
│
├── Agent Capability
│
├── Runtime Infrastructure
│
└── Composition

从这里开始,整个项目就清楚很多了。


4. 先画出第一张静态架构图

如果暂时不考虑实现细节,可以得到:

                    DeepSeek Harness
                           │
         ┌─────────────────┼─────────────────┐
         ↓                 ↓                 ↓
    Runtime Core       Capability       Infrastructure
         │                 │                 │
         ├────────────┬────┴───────┬─────────┤
         ↓            ↓            ↓         ↓
       Agent         Tool        Session    Sandbox
         │            │            │
         └────────────┼────────────┘
                      ↓
                  Composition
                      ↓
                    Cordis

但是这里马上出现一个问题:

这些模块到底是怎么连在一起的?

答案就在:

Cordis

三、Cordis:为什么 DeepSeek Harness 能做到 Everything is a Plugin

DeepSeek Harness 官方将 Cordis 定义为 dsh 底下的 Framework。

插件通过共享 Context 提供:

Service
Typed Event
Reversible Effect

同时,插件卸载时,对应注册可以反向撤销。

所以第一篇里,可以先把 Cordis 理解成:

Cordis
=
Plugin Runtime
+
Service Composition
+
Event Extension
+
Lifecycle Management

注意,这仍然是为了理解系统而做的工程抽象。


1. Context:所有 Plugin 的公共运行空间

Cordis 中一个非常核心的概念是:

Context

Plugin 并不是互相直接硬编码调用。

它们更多是围绕共享 Context 注册或消费能力。

例如官方架构文档列出的:

ctx.sessions

ctx.systemPrompt

ctx.tools

ctx.agents

ctx.agentLoop

ctx.llm

这些都属于 Runtime 中可以被其他 Plugin 使用的 Service。

可以把它抽象成:

                     Context
                        │
          ┌─────────────┼─────────────┐
          ↓             ↓             ↓
       Service        Event         Effect
          │             │             │
          ↓             ↓             ↓
      Capability    Extension     Lifecycle

如果熟悉 Spring,可以把其中:

Service

暂时类比成:

Bean / Service Registry

但它并不只是一个普通 DI Container,因为 Cordis 还把:

Event
Effect
Plugin Lifecycle

统一纳入了运行模型。


2. Service:Plugin 如何向 Runtime 提供能力

例如:

LLM Plugin
    ↓
ctx.llm

或者:

Tool Plugin
    ↓
ctx.tools

再比如:

Session Plugin
    ↓
ctx.sessions

从工程上可以抽象成:

Plugin
    ↓
Provide Service
    ↓
Context
    ↓
Other Plugins Consume

于是各个 Runtime 部件不需要直接依赖某个固定实现。

这也为后面的:

Provider Replacement

提供了基础。


3. Event:Runtime 行为本身就是扩展点

Cordis 的第二个重要机制是:

Event

DeepSeek Harness 官方架构文档明确把 Event 称为扩展点,并把事件大致分成:

Session Events

Agent Events

Capability Events

例如:

agent/*

tools/*

fs/*

这些事件允许 Plugin 在不直接修改 Agent Loop 的情况下介入 Runtime。

例如官方当前的 Tool Pipeline 包含:

tool/call
    ↓
tools/pre-execute
    ↓
tools/execute
    ↓
tools/post-execute
    ↓
tool/result

如果放到我们之前研究 Codex Hook 的语言里,就非常容易理解:

PreToolUse

Tool Execution

PostToolUse

但 DeepSeek Harness 做得更彻底:

Event

不是额外附加在 Harness 外围的一套 Hook 系统,而是 Runtime 自身的扩展机制。


4. Effect:Plugin 生命周期为什么可以撤销

Cordis 还有一个非常值得注意的概念:

Effect

官方架构强调,Plugin 的注册本身可以被视为可逆 Effect,Plugin 卸载时对应注册会被撤销。

所以可以抽象成:

Plugin Load
    ↓
Register Service
    ↓
Register Event
    ↓
Create Effects
    ↓
Runtime Running

当 Plugin 被卸载:

Plugin Unload
    ↓
Dispose Effects
    ↓
Remove Events
    ↓
Remove Services

于是 Plugin 不再只是:

startup hook

而拥有真正意义上的:

Lifecycle

这也是动态 Plugin Runtime 必须具备的基础。


5. Everything is a Plugin 到底到了什么程度

现在再回来理解官方的:

Everything is a Plugin

就会清楚很多。

官方直接列出的例子包括:

Model Adapter

Tool Registry

Session Log

Agent Loop

这些都是 Plugin,并且都可以通过配置替换。

也就是说:

Agent Loop

并不是所谓:

不可替换的 Harness Kernel

官方文档甚至明确表达了一个非常重要的原则:扩展 dsh 不应该依赖修改某个特殊的特权核心,而是把新的 Plugin 挂到现有 Plugin 旁边。

于是:

Everything is a Plugin

真正表达的是:

Harness Runtime 的组成部件原则上都通过统一 Plugin 机制参与组合,而不是由一个巨大、不可替换的 Core 对外暴露少量扩展点。

这和传统 Plugin System 的区别非常大。


四、Capability:Tool、Skill、Subagent 为什么可以统一起来

理解完 Cordis,还不能直接进入 Bundle 和 Profile。

中间还有一个非常重要的概念:

Capability Seam

这是 DeepSeek Harness 设计中非常值得关注的一层。

官方将一个 Seam 定义为一个可替换的 Capability,并且拆成三个角色:

Service Definition

Service Provider

Consumer

这实际上回答了一个非常重要的问题:

Tool 到底是不是 Capability?

DeepSeek Harness 给出的答案更接近:

不是。

1. Capability 不是一个 Tool 函数

传统 Agent Framework 很容易把:

read_file()

write_file()

bash()

web_search()

直接称为:

Capability

但实际上 Tool 往往只是模型看到的接口。

真正完成工作的可能是另一个底层实现。

DeepSeek Harness 将它进一步拆成:

Service Definition
        ↓
Service Provider
        ↓
Consumer

例如 Filesystem 可以抽象为:

Filesystem Interface
        ↓
Filesystem Provider
        ↓
read_file / write_file

其中:

Service Definition

定义:

能力是什么
Provider

定义:

能力在哪里执行

而:

Consumer

决定:

谁来使用这个能力

Consumer 很多时候才是:

Model-facing Tool

官方文档明确说明,Consumer 通常可以是面向模型的 Tool,但 Tool 本身并不等同于整个 Capability Seam。


2. 用 Filesystem 举一个简单例子

为了理解这个设计,我们可以做一个 Java 风格工程抽象:

interface FileSystem {

    String read(String path);

    void write(String path, String content);

}

这是:

Service Definition

然后可以有:

LocalFileSystemProvider

SandboxFileSystemProvider

RemoteFileSystemProvider

这些是:

Service Provider

最后:

read_file

write_file

search_file

是模型看到的:

Consumer / Tool

于是形成:

                Capability
                    │
          Service Definition
                    │
          ┌─────────┼─────────┐
          ↓         ↓         ↓
       Local     Sandbox    Remote
      Provider   Provider   Provider
          │
          └─────────┼─────────┘
                    ↓
                 Consumer
                    ↓
                   Tool

这里的 Java Interface 只是为了理解架构,并不是 DeepSeek Harness 的真实内部类。


3. Provider 为什么比 Tool 更值得关注

这种拆分最有价值的地方在于:

Tool 可以不变

但:

Execution Backend 可以变化。

例如 Agent 仍然调用:

bash

但底层可以从:

Local Machine

切换为:

Remote Sandbox

官方架构文档专门以 Filesystem 和 Subprocess 为例说明:它们共享执行世界,因此当 Provider 被指向远程 Sandbox 时,Bash、PTY、LSP 可以一起迁移,而不需要每个 Tool 分别复制一套远程实现。

这个设计非常关键。

因为真正的企业 Harness 往往不是:

Tool 要不要换

而是:

Tool 在哪里执行。

例如:

Developer Laptop

Docker Sandbox

Remote VM

Kubernetes Pod

Secure Execution Environment

都可能提供同一个:

bash

能力。


4. Skill、Subagent、Workflow 也被放进 Capability Family

当前官方 package 索引里明确存在:

skill/
subagent/
workflow/

并分别描述为:

Skill capability family

Subagent capability family

Workflow seam

其中 Skill 包含 Provider Registry、本地 Provider 和面向模型的 Catalog/Loader;Subagent 包含 Provider Registry Contract 和 Delegation Tool;Workflow 则包含 Seam、Worker Engine 与面向模型的 Workflow Tool。

因此可以把它们统一理解成:

                    Capability
                         │
       ┌─────────────────┼─────────────────┐
       ↓                 ↓                 ↓
   Filesystem          Skill            Subagent
       │                 │                 │
       ├─────────────────┼─────────────────┤
       ↓                 ↓                 ↓
     Shell            Workflow            Web

这和我们此前习惯的:

Tool
Skill
Agent
Workflow

各自拥有完全独立扩展体系的做法不太一样。

DeepSeek Harness 更倾向于先问:

这个能力的接口是什么?

谁提供它?

谁消费它?

然后再决定它最终表现成:

Tool

Agent

Workflow

UI

中的哪一种形式。


五、Plugin、Bundle、Profile:一个 Harness Runtime 是怎样“拼”出来的

到这里,我们已经知道:

Plugin

可以提供 Service、Event 和 Effect,

也知道:

Capability

可以由 Definition、Provider 和 Consumer 组成。

但还有一个更关键的问题:

dsh 启动时到底加载哪些 Plugin?

答案并不是一个固定写死的列表。

而是:

Profile
+
Bundle
+
Patch

共同完成 Runtime Composition。


1. Plugin:Runtime 最基本的组成单元

首先是:

Plugin

从我们目前看到的架构,可以把它理解为:

Runtime Component

例如:

LLM Adapter Plugin

Tool Plugin

Session Plugin

Agent Loop Plugin

Sandbox Plugin

Plugin 进入 Cordis Context 后,可以:

Provide Service

Listen Event

Create Effect

最终成为 Runtime 的组成部分。


2. Bundle:一组 Plugin 的组合与分发

如果只有 Plugin,会出现另一个问题:

一个完整 Harness 可能需要几十个 Plugin。

每次启动时逐个配置:

Plugin A
Plugin B
Plugin C
Plugin D
...

显然不可维护。

因此 DeepSeek Harness 又增加了:

Bundle

官方当前定义的 Bundle 是一个 npm package,它通过 package manifest 中的 dsh.bundle 指向一个 cordis.patch.yml,从而成为 Profile 可以加载的一层 Patch。

可以把它理解成:

Bundle
=
Plugin Composition Package

结构大致可以抽象成:

my-bundle/
│
├── package.json
│       │
│       └── dsh.bundle
│
├── cordis.patch.yml
│
└── optional runtime glue

Bundle 最核心的内容并不是一个巨大 Runtime 类,

而是:

哪些 Plugin Row 应该被挂载。

3. 官方当前有三个关键 Bundle

目前官方 Bundle 目录明确列出了:

base

web-app

headless

其中:

base

是所有 Profile 先加载的共享核心层;

web-app

增加浏览器侧运行面;

headless

增加无 Host / Web Layer 的一次性任务运行方式。

官方 dsh-base 当前包含的基础 Runtime 组合涉及:

Model Adapters

Default Model Selection

Tools

Persistence

Policy

Settings / Credentials

Telemetry

Subagent Providers

等能力,并作为每个 Profile Bundle Stack 的第一层。

所以:

dsh-base

可以粗略理解为:

Default Runtime Foundation

但仍然要注意:

它不是一个不可修改的 Core Binary。

它本质仍然是:

一层 Runtime Composition。

4. Profile:决定“我要启动哪一种 dsh”

在 Bundle 之上,还有:

Profile

官方定义 Profile 是一个存在于 Harness Home 中的命名组合,它记录:

要堆叠哪些 Bundles

安装哪些额外 Plugin

用户自己的 cordis.patch.yml

当前官方提供:

web

headless

两个模板。

所以:

web

可以先抽象理解为:

Profile: web
│
├── dsh-base
├── dsh-web-app
└── user patch

而:

headless

则大致是:

Profile: headless
│
├── dsh-base
├── dsh-headless
└── user patch

于是三者的关系就清楚了:

Plugin
    → Runtime Component

Bundle
    → Plugin Composition Package

Profile
    → Named Runtime Composition

5. Patch:为什么 Runtime 可以层层覆盖

这里最关键的配置文件是:

cordis.patch.yml

官方架构目前给出了明确的层叠顺序:

Empty Entry List
        ↓
Profile 中声明的 Bundles
        ↓
Profile cordis.patch.yml
        ↓
Home cordis.patch.yml
        ↓
--patch CLI Overlay

所以真正启动出来的 Runtime 并不是某一份固定配置,而是:

Bundle A
+
Bundle B
+
Profile Patch
+
Home Patch
+
CLI Patch
=
Effective Plugin Tree

这个机制和我们前面分析 Codex 时的:

Effective Config

有一点很像。

但它更进一步。

Codex 更多是在计算:

最终哪个配置值生效。

DeepSeek Harness 这里实际上是在计算:

最终有哪些 Plugin Row 存在,
以及它们共同构成怎样的 Runtime Topology。

所以可以把它称为:

Effective Runtime

或者更精确一点:

Effective Plugin Tree

官方也提供了:

dsh --profile web --dump-config

来查看当前环境真正会启动的组合树。


6. 所以 dsh 的启动过程是什么

到这里就可以把启动过程串起来。

传统 Harness 很容易理解成:

Harness Start
    ↓
Initialize Core
    ↓
Load Config
    ↓
Discover Plugins
    ↓
Register Plugins
    ↓
Start Runtime

DeepSeek Harness 更接近:

dsh Start
    ↓
Select Profile
    ↓
Resolve Bundle Stack
    ↓
Apply Patch Layers
    ↓
Build Plugin Tree
    ↓
Mount Plugins
    ↓
Register Services
    ↓
Register Events
    ↓
Create Effects
    ↓
Construct Runtime
    ↓
Start Agent Loop

官方明确描述运行中的 dsh 是在启动阶段,从有序 Layers 组合出来的 Plugin Tree。

所以这里真正重要的一句话是:

Runtime 并不是先存在然后再加载 Plugin;Runtime 本身就是 Plugin Composition 的结果。


7. 再看 Agent Loop,就容易理解了

官方当前把一次执行区分成:

Turn

Step

其中一个 Step 是:

一次模型请求
+
该请求产生的 Tool Calls

一个 Turn 则可以包含零到多个 Step。

核心链路可以简化成:

turn/start
    ↓
claim input
    ↓
assemble prompt + tools
    ↓
agent/pre-step
    ↓
step/start
    ↓
derive model history
    ↓
agent/request
    ↓
llm/stream
    ↓
assistant/message
    ↓
tool/call
    ↓
tools/pre-execute
    ↓
tools/execute
    ↓
tools/post-execute
    ↓
tool/result
    ↓
step/end
    ↓
Next Step?
    ↓
turn/end

为什么这条链可以高度扩展?

因为:

Agent Loop

不是把所有逻辑硬编码进去。

大量行为通过:

Service
+
Event

参与 Runtime。

例如:

agent/pre-step

可以介入模型即将看到的输入;

tools/pre-execute

可以介入 Tool 执行之前;

tools/post-execute

可以处理执行后的结果。

这就是:

Composable Runtime

真正进入运行阶段后的样子。


六、重新理解 DeepSeek Harness:从 Plugin System 到 Composable Runtime

把前面的结构连起来之后,就可以看出 DeepSeek Harness 真正值得研究的地方了。

它不仅仅是在做:

一个新的 Coding Agent

而是在探索:

Agent Harness 本身应该怎样被构造。

1. 它和传统 Harness 最大的区别是什么

如果用最简化的方式表达:

传统 Harness 更接近:

              Harness Core
                   │
          ┌────────┼────────┐
          ↓        ↓        ↓
       Skill     Tool     Plugin

DeepSeek Harness 更接近:

               Profile
                  │
               Bundles
                  │
                Patch
                  │
                  ↓
              Plugin Tree
                  │
          ┌───────┼────────┐
          ↓       ↓        ↓
        LLM      Tool    Session
          │       │        │
          └───────┼────────┘
                  ↓
              Agent Loop
                  ↓
                Runtime

这两种架构关注的问题并不完全一样。

第一种问:

Harness 有哪些 Extension Point?

第二种则进一步问:

Harness 本身能不能就是一种 Composition?

2. Plugin System 和 Composable Runtime 不是一回事

很多系统都有:

Plugin System

但通常意味着:

Core
+
Optional Extensions

DeepSeek Harness 更值得注意的是:

Core-like Components

本身也进入 Plugin Composition。

于是:

Plugin

不再只是:

给 Runtime 增加一个功能

还可能:

参与定义 Runtime 本身。

所以我更愿意把 DeepSeek Harness 当前的架构称为:

Composable Agent Runtime

而不只是:

Plugin-based Agent

这是本文基于官方架构做出的工程抽象,不是 DeepSeek 官方给出的正式架构名称。


3. 这会改变我们对 Marketplace 的理解

我们之前研究 Claude Code、Codex 时,逐渐形成了一个 Marketplace 模型:

Marketplace
    ↓
Plugin Package
    ↓
Install
    ↓
Capability Registry
    ↓
Harness Runtime

也就是说:

Marketplace

主要负责分发:

Capability

例如:

Skill

Tool

Agent

MCP

Hook

但是到了 DeepSeek Harness,这个模型可能需要再增加一层:

Marketplace
    ↓
Plugin / Bundle
    ↓
Profile
    ↓
Runtime Composition
    ↓
Plugin Tree
    ↓
Capability
    ↓
Agent Runtime

这意味着 Marketplace 未来分发的不一定只是:

一个能力

还可能是:

一套 Runtime 组合方案。

例如可以设想:

Java Coding Profile

Security Review Profile

Research Profile

Data Analysis Profile

每个 Profile 都可能组合不同的:

Model Adapter
Tool Set
Skill
Subagent
Workflow
Sandbox
Policy
Agent Loop

所以:

Marketplace 中的商品,可能从 Capability Package 进一步演进成 Runtime Blueprint。

这是 DeepSeek Harness 对我们整个 Harness Marketplace 系列非常重要的一个启发。


4. 对自研 Harness 的启发:Registry 之外还需要 Composer

我们此前设计企业 Agent Harness 时,很容易想到:

PluginRegistry

CapabilityRegistry

SkillRegistry

AgentRegistry

ToolRegistry

PolicyRegistry

这些组件解决的是:

系统里有哪些能力。

但是 DeepSeek Harness 提醒了我们另外一个问题:

这些能力如何组成不同类型的 Runtime?

于是可能还需要:

BundleRegistry

RuntimeProfile

RuntimeComposer

形成:

                    Marketplace
                         │
                         ↓
                   PluginRegistry
                         │
                         ↓
                   BundleRegistry
                         │
                         ↓
                  RuntimeProfile
                         │
                         ↓
                  RuntimeComposer
                         │
                         ↓
                  Effective Runtime
                         │
                         ↓
               CapabilityRegistry
                         │
                         ↓
                    Agent Loop

例如可以做一个工程抽象:

record RuntimeProfile(
    String name,
    List<String> bundles,
    List<String> plugins,
    String policyProfile
) {}

再通过:

RuntimeProfile
    ↓
BundleResolver
    ↓
PluginResolver
    ↓
RuntimeComposer
    ↓
Effective Runtime

构建不同的 Agent 环境。

这不是 DeepSeek Harness 的真实 Java 实现,而是我们从它的架构模式推导出的自研 Harness 设计。


5. 不同 Agent 甚至可以拥有不同 Runtime

例如:

Developer Agent

可以组合:

Filesystem Write
Shell
LSP
Git
Skill
Subagent

而:

Reviewer Agent

可以组合:

Filesystem Read
Search
LSP
No Shell Write
No Network

Production Agent 则可能使用:

Remote Sandbox

Strict Permission

Audited Tool Gateway

Restricted Network

这已经不是简单:

Tool Permission

问题。

而是:

Runtime Composition

问题。


6. Everything is a Plugin 也会带来新的治理难题

当然,这种高度插件化设计并不是只有好处。

越多东西可以替换,就意味着越多东西需要治理。

例如:

谁可以安装 Plugin?

谁可以发布 Bundle?

谁可以修改 Profile?

Plugin 可以注册哪些 Service?

一个 Plugin 能否替换 Agent Loop?

谁可以提供 Sandbox Provider?

谁可以提供 Credential Provider?

不同 Plugin 出现 Service 冲突怎么办?

甚至更危险的问题是:

如果安全组件自己也是 Plugin,
谁来保证这个 Plugin 不被替换?

所以企业环境最终一定需要建立:

Plugin Trust

Bundle Trust

Profile Policy

Provider Allowlist

Signature

Version Pin

Capability Diff

Permission Review

Audit

换句话说:

Everything is a Plugin

最终很自然会推导出:

Everything needs Governance

这也会成为 DeepSeek Harness 系列后面权限、Sandbox 和企业 Marketplace 篇的重要问题。


7. 最后把整个 DeepSeek Harness 收敛成一张图

经过这一篇,我们可以先形成下面这张统一架构图:

                         Marketplace
                              │
                              ↓
                       Plugin / Bundle
                              │
                              ↓
                           Profile
                              │
                         Patch Layers
                              │
                              ↓
                        Plugin Tree
                              │
                              ↓
                       Cordis Context
                              │
           ┌──────────────────┼──────────────────┐
           ↓                  ↓                  ↓
        Service             Event              Effect
           │                  │                  │
           ↓                  ↓                  ↓
      Capability          Extension          Lifecycle
           │
           ↓
     Capability Seam
           │
    ┌──────┼──────┬────────┬───────────┐
    ↓      ↓      ↓        ↓           ↓
   FS    Shell   Skill   Subagent   Workflow
    │
    ↓
 Provider
    │
    ↓
Consumer / Tool
    │
    ↓
 Agent / Agent Loop
    │
    ↓
 Session / Observation
    │
    ↓
 Next Step

如果继续压缩,可以得到 DeepSeek Harness 当前最核心的一条链:

Profile
    ↓
Bundle Stack
    ↓
Patch Layers
    ↓
Plugin Tree
    ↓
Cordis Context
    ↓
Services / Events / Effects
    ↓
Capability Seams
    ↓
Agent Runtime
    ↓
Agent Loop

结语:DeepSeek 开源的可能不只是另一个 Coding Agent

如果只从产品使用角度看:

DeepSeek Harness

当然可以被理解为:

一个新的 AI Coding Harness。

但从 Agent Engineering 的角度,它更值得研究的问题其实是:

一个 Agent Harness 到底应该拥有多大的固定 Core?

Claude Code、Codex 让我们重点看到的是:

如何给 Harness 增加能力。

DeepSeek Harness 则把问题进一步推进到:

Harness 本身能不能也是一种可组合对象?

于是:

Model

Tool

Skill

Subagent

Workflow

Session

Agent Loop

Sandbox

不再只是:

Harness 内部的固定组件

而越来越像:

Runtime Composition 中可以选择、提供、替换的服务。

这也是:

Everything is a Plugin

真正值得关注的地方。

它并不只是一个 Plugin API。

它背后真正体现的是一种:

Composable Agent Runtime

架构。

而要真正理解这套架构,下一步就必须继续往下进入它的底层:

DeepSeek Harness:深入 Cordis,Everything is a Plugin 到底是怎么实现的

下一篇我们将重点拆解:

Context
    ↓
Service
    ↓
Plugin
    ↓
Effect
    ↓
Event
    ↓
Inject
    ↓
Isolate
    ↓
Plugin Lifecycle
    ↓
Plugin Tree

真正从源码和运行机制层面回答:

一个 Plugin 是如何进入 Cordis 的?

Service 是如何注册和发现的?

Plugin 为什么能够卸载?

Event 为什么能够改写 Runtime?

Plugin 之间如何形成依赖?

最终又是怎样一步步组成 Agent Harness 的?

到了那里,DeepSeek Harness 的:

Everything is a Plugin

才算真正被拆开。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐