目录
[1. 定义](#1. 定义)
[2. 背景与问题](#2. 背景与问题)
[2.1 它要解决的根问题](#2.1 它要解决的根问题)
[2.2 为什么现在出现](#2.2 为什么现在出现)
[3. 核心原理](#3. 核心原理)
[3.1 核心](#3.1 核心)
[3.2 插件](#3.2 插件)
[3.3 核心 + 插件 → dsh 怎么转起来](#3.3 核心 + 插件 → dsh 怎么转起来)
[4. 整体架构](#4. 整体架构)
[5. 价值与定位](#5. 价值与定位)
[6. 总结](#6. 总结)
仓库:https://github.com/deepseek-ai/deepseek-harness
主页:https://deepseek.com/harness
文档:https://deepseek-harness.github.io/deepseek-harness/guide/quickstart
口号 :" Everything is a Plugin"
1. 定义
DeepSeek Harness(dsh)是 DeepSeek 出品的 开源 智能体 外壳(agent harness)
全部能力(模型、工具、技能、会话、沙箱、存储、循环、调度、UI)都按 Cordis 插件装配、可插可换;Cordis 内核只管加载/卸载/依赖、不承载任何具体能力,因此无需改源码即可在配置层选、换或扩展任一能力
它对标 Claude Code / opencode / Cursor / Aider,但走 把外壳做成插件平台 而非 写一个 Agent 程序 的路线
2. 背景与问题
2.1 它要解决的根问题
裸 LLM 没有手眼------不能碰文件、跑代码、上网、记跨轮上下文
要让它干活,需一层宿主替它:给工具、跑循环、做可视化、守安全边界,这层叫 harness
过去各 Agent(IDE 内置的、CLI 形态的)大多为单体或半扩展架构:能力耦合在主程序里,能加插件但未到 配置层可换任一能力 的程度,难复用、难企业定制
dsh 用 一切皆插件 把 harness 变成可组合运行时

2.2 为什么现在出现
-
Cordis 范式 成熟 :Cordis(
github.com/cordiverse/cordis)提出 时空可组合性范式,天生适合 一切皆插件 + 作用域隔离 的 Agent 形态,DeepSeek 直接把它当内核 -
生态闭环需要 :DeepSeek 有 V4/R1 等强模型,缺一个 能
npx一行起跑的官方外壳 把模型势能转化为开发者日活 -
多端同源需求:同一套能力要喂给终端开发者(TUI)、普通用户/演示(Web)、数据/AI 脚本(Python),逼出 host/client 彻底解耦
-
行业缺一个开源插件平台型 Agent:Claude Code 闭源、opencode/Aider 偏单体

3. 核心原理
dsh 的原理 = 核心 + 插件
核心是不干活的底座(容器与契约),插件是干活的业务能力;两者组合成一棵插件树,跑出 Agent 循环,全程记进会话日志
3.1 核心
核心 = Cordis 运行时 + ctx 契约面 + 事件词汇 + 会话日志不变量
-
Cordis 运行时 (
vendor/cordis/):只管插件的加载/卸载/依赖与可逆副作用,自己不干活------像主板,提供插槽与规则,干活的是插上去的卡 -
ctx 契约面 :一组固定公开的服务槽(
ctx.llm/ctx.tools/ctx.sessions/ctx.agents/ctx.agentLoop...),插件把服务挂到指定槽、用时按 key 取,不互 import 代码------换槽上的 provider 不影响别人,这就是 可插可换 的落点 -
事件词汇 :一套约定的事件频道名(
session/event、agent/*、tools/*、llm/*...),插件靠 emit/监听通信、不直接互调------想给工具调用加审批,就监听tools/*在调用前拦 -
会话日志不变量 :铁律 模型可见即已记录 ------会话日志只追加,凡抵达模型请求的输入(系统提示词/思维链/工具调用结果/子 Agent/上下文注入)都能从日志重建;新增模型可见输入须扩展
SessionEventMap,回放/分叉/审计都从这一份来 -
无特权内核:扩展 = 往别的插件旁边挂、注册随卸载撤销,连 Agent loop 都是可换的 默认驱动器
3.2 插件
模型、工具、技能、会话、沙箱、存储、循环、调度、UI------所有 Agent 能力都是插件
插件往核心上做两件事:
-
填 provider :把某能力的实现挂到对应 ctx 槽(模型适配器挂
ctx.llm、文件系统挂ctx.fs、沙箱挂ctx.sandbox...) -
挂监听:订阅事件频道,加策略/拦截(审批、限流、记录)
能力以 seam (三角色)组织:定义接口 / 提供方实现 / 消费方使用(通常是面向模型的工具);换一个 provider 改全局------把 fs+进程 provider 指向远程沙箱,Bash/PTY/LSP 一并搬走
3.3 核心 + 插件 → dsh 怎么转起来
-
装配成插件树 :Profile + Bundle + Patch 在配置层叠加(
dsh --profile web --dump-config可看);dsh-base 是开箱默认层、本身也是插件可 patch 替换 -
跑出 Agent 循环(turn/step):领输入 → 装配提示词(系统提示 + 工具 schema + 历史)→ 调模型流式 → 模型发工具调用 → 执行工具(带审批/沙箱)→ 结果回灌会话 → 不欠工作就结束轮次,循环本身也是可换的 默认驱动器
-
全程记进会话日志:模型看到的都落日志,回放/分叉/审计共享同一份。
4. 整体架构

dsh 自上而下 5 层
-
L1 交互入口层:TUI / Web UI / Python SDK / ACP 编辑器------进入 dsh 的入口
-
L2 客户端表现层:把事件流渲染成界面,经通信契约连宿主
-
L3 宿主运行时层:Agent 循环、提示词装配、工具调度、会话日志(模型上下文唯一事实源)
-
L4 能力插件层(一切皆插件):模型/工具/技能/沙箱/存储/循环/调度/UI 全是可插可换插件
-
L5 插件内核层 Cordis:只管加载/卸载/依赖,不干活
-
类型自动生成:TS 类型→工具参数定义+各端清单,CI 校验不漂移
-
安全 沙箱:Landlock + sandbox + E2B 多级隔离,包裹工具执行
串联 :L1 进 → L2 渲染 → 契约到 L3 跑循环 → 调 L4 插件 → 挂 L5 Cordis;类型自动生成 保定义一致、安全 沙箱一保执行隔离
5. 价值与定位
技术价值:把 harness 从 定制代码 升级为 可组合运行时 ;typert 从 Zod 自动扇出(模型 JSON Schema + 跨端 catalog + RPC 描述符)+ CI gate 锁不漂移(仍手写 Zod,差在扇出+锁漂移,单工具是 overkill);host/client + ACP/MCP 给出 Agent 复用范本
目标用户:开发者(TUI)、普通/演示(Web)、Python/AI 工程师、插件作者、FDE、定制 Agent 的企业
差异化定位
|------|---------------------|-------------|------------|
| 维度 | dsh | Claude Code | Codex |
| 形态 | 平台/外壳(开箱跑) | 闭源 Agent | CLI Agent |
| 语言 | TypeScript | --- | Rust |
| 内核 | Cordis 一切皆插件 | 单体+MCP | 单体+MCP |
| 多端 | TUI+Web+Python | TUI+IDE | TUI |
| 可组合 | 配置层换任一项 | 弱 | 插件(MCP) |
| 工具契约 | Zod 自动扇出 + CI gate | 手写 | 手写 |
| 协议 | ACP+MCP | MCP | MCP |
| 沙箱 | Landlock+E2B+worker | 弱 | 内置沙箱 |
| 许可 | MIT | 闭源 | Apache-2.0 |
6. 总结
**dsh 的本质:**一个插件平台------核心(Cordis)只管装载、不干活,所有能力(模型/工具/沙箱/会话/循环/UI...)都是可插可换的插件,配置层就能选、换、扩展任一项
它真正的不同不在功能多,而在范式:别的 Agent 是一个程序,dsh 是一个可组合运行时------换模型、换沙箱、加工具都不改源码,全在配置层完成
这套"核心 + 插件 + 类型契约"的设计,把 Agent 外壳做成了能被复用、被扩展、被企业定制的工程底座
