从 "Agent = Model + Harness" 到 "Everything is a Plugin",DeepSeek Harness 到底在做什么?
前言
最近 DeepSeek 开源了 DeepSeek Harness(简称 DSH),一个基于 Cordis 插件框架的 Agent 运行时。花了一整天时间翻完官方文档和社区资料后,我发现它不只是又一个 "AI 编程助手"------它的设计哲学和架构选择,可能会影响下一代 Agent 框架的演进方向。
这篇文章是我看完文档后的个人总结,帮你快速抓住 DSH 的核心设计。
一、DSH 不是 IDE 插件,而是 Agent 的 "操作系统"
首先要纠正一个常见误解:DSH 不是像 Copilot 或 Claude Code 那样的 IDE 扩展,它是一个独立的 Agent 运行时进程。
官方给了一个很简洁的公式:
Agent = Model + Harness
模型(如 DeepSeek-V4)是 Agent 的"灵魂",负责思考和决策;而 Harness 是 Agent 的"身体",赋予它理解环境、使用工具、持续工作的能力。DSH 就是这个 Harness。
它和 IDE 助手的本质区别在于:IDE 助手围着当前编辑器窗口转,而 DSH 有自己的配置、会话、插件体系和权限边界,是一个完整独立的进程。
二、"一切皆插件" 不是口号,是架构底线
DSH 最核心的设计选择是 "Everything is a Plugin" 。这句话在官方文档里反复出现,而且不是营销话术------它是真的把 所有 能力都插件化了:
- 模型适配器(LLM 后端)
- 工具(文件编辑、Shell、搜索)
- Skills(可复用的任务方法)
- 会话管理(对话与状态)
- 沙箱(隔离执行环境)
- 存储/文件系统
- Agent 循环与调度(控制流本身)
- UI(甚至界面也是插件)
底层基于 Cordis 元框架(由 Koishi 作者 Shigma 开发),Cordis 只负责三件事:插件加载/卸载、依赖管理、事件总线。Agent 的所有具体能力完全存在于插件之中。
这意味着:你可以在不修改 DSH 源码的情况下,替换任意一个组件。想换模型?装个新插件。想换沙箱?装个新插件。甚至想换掉 Agent 循环本身?也可以。
三、三层组装机制:Profile + Bundle + Patch
DSH 启动时不是"加载一个配置文件"那么简单,它按顺序叠加多层配置,最终在内存里拼出一棵完整的插件树:
css
空条目列表
→ Profile 列出的每个 Bundle(按序)
→ Profile 的 cordis.patch.yml
→ Home 级的 cordis.patch.yml
→ 任意 --patch overlay
三个核心概念:
| 概念 | 作用 |
|---|---|
| Profile | 本地保存的"装配档",列出要加载哪些组合包 |
| Bundle | 组合包,把一组插件和配置打包分发 |
| Patch | 补丁,按名字定位并替换某个插件的配置 |
dsh-base 是每个 Profile 的必装第一层,提供模型适配器、工具、持久化、安全策略等基础能力。后续的组合包和用户补丁按名字覆盖它。
调试配置时有个实用命令:
bash
dsh --profile web --dump-config
可以导出当前实际启动的完整插件装配表,排查"加了配置没生效"的问题。
四、四种内置模式,本质上是四套插件组合
DSH 提供了四种开箱即用的 Preset,针对不同的任务类型优化了工具集和上下文配置:
| 模式 | 适用场景 | 核心特点 |
|---|---|---|
| Standard | 日常编码、代码重构 | 最全面:文件编辑、Shell、搜索、Skills、子 Agent、工作流 |
| PTC(Code Mode) | 批量文件改写、高吞吐操作 | 模型生成一段 TypeScript 程序编排多步工具调用,无多轮 Round-trip |
| Minimal | 基准测试、极简 Bug 修复 | 仅保留 bash + str_replace_editor,排除冗余干扰 |
| Forge(Creator) | 自定义 Preset、插件调试 | 可检查/组合运行时插件,最接近"自我演进"实验 |
关键洞察 :这四种模式不是"四种不同的程序",而是同一套插件树的不同组合方式。Standard 模式加载了全套工具插件,Minimal 模式只加载两个,PTC 模式额外加载了 Code Mode SDK 插件。
这意味着你可以基于这些模板,创建自己的 Preset,组合出适合你团队的 Agent 行为。
五、PTC 模式:让 AI 写代码来调用 AI
PTC(Programmable Tool Composition)模式是 DSH 最具特色的设计之一。
传统模式下,模型每步决策都要经历 "思考 → 调用工具 → 等待结果 → 再思考" 的 Round-trip,Token 消耗高、延迟大。
PTC 模式的做法是:让模型一次性生成一段 TypeScript 程序,这段程序内部编排多步工具调用,然后在一个沙箱里执行。
typescript
// 模型生成的 PTC 程序示意
const files = await tools.list_files({ path: "./src" });
for (const file of files) {
const content = await tools.read_file({ path: file });
if (content.includes("TODO")) {
await tools.edit_file({
path: file,
old_string: "TODO",
new_string: "DONE"
});
}
}
优势很明显:
- Token 消耗大幅降低(无多轮往返)
- 复杂逻辑可以写循环、条件判断
- 执行原子性更好(一段程序要么全成功,要么回滚)
实测中,批量文件改写场景下 PTC 模式的性能提升可达 40% 以上。
六、Trajectory:让 Agent 的"黑盒"变透明
DSH 有一个我非常欣赏的设计:每一次运行都有迹可循(Trajectory)。
模型看到的一切------系统提示词、思维链、工具调用、子 Agent 调度、上下文注入------全部写入仅追加的会话日志。你可以在 Trajectory 视图中:
- 按来源查看每一步的详细信息
- 恢复到某个历史状态
- 分叉出一个新会话继续探索
- 检索 和回放完整执行过程
这对调试 Agent 行为极其有价值。当 Agent 做了你意想不到的操作时,你不需要猜它"当时在想什么",直接看 Trajectory 就能还原完整决策链。
七、插件开发:从使用者到贡献者的门槛很低
DSH 的插件开发非常简洁。一个最小插件只需要:
typescript
// src/index.ts
import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
export const name = 'hello-dsh'
export const inject = ['tools'] // 声明依赖
export function apply(ctx: Context) {
ctx.tools.register(defineTool({
name: 'greet',
description: '向用户打招呼',
parameters: {
name: { type: 'string', required: true }
},
async execute(args) {
return { message: `Hello, ${args.name}!` }
}
}))
}
几个关键约定:
- 用
export const name和export function apply作为入口,不要用export default - 用
inject声明依赖的服务,框架会自动处理加载顺序 - 所有注册都用
ctx.effect()包装,保证插件卸载时自动清理 - 插件可以小到一个文件,也可以复杂到包含 Host 端 + Client 端 + RPC 通信
安装也简单:
bash
dsh plugin --profile web add ./my-plugin
社区已经涌现出数百个插件,从文档转换、PDF 解析、Office 文档生成到皮肤主题、桌宠,生态正在快速生长。
我的个人看法
看完文档后,DSH 给我最大的冲击不是某个具体功能,而是它的架构彻底性。
市面上大多数 Agent 框架(包括 Claude Code、Codex)都有一个"核心内核 + 外围扩展"的结构------你可以扩展工具、扩展技能,但核心循环和模型调用逻辑是封死的。DSH 则把最后一层特权也拆掉了:Agent 循环本身也是插件,UI 也是插件,甚至遥测也是插件。
这种设计在当下看起来有点"过度工程"------毕竟 DSH 还处于 Developer Preview,接口随时可能变。但长远来看,它回答了一个关键问题:当 AI Agent 成为基础设施时,它的运行时应该长什么样?
DSH 的答案是:它应该像操作系统一样,内核只负责调度,所有能力都是可插拔的模块。
如果你现在就想上手,最简单的路径是:
bash
# 1. 安装 Node.js
# 2. 一行命令启动 Web UI
npx @deepseek-ai/dsh web
# 3. 装个插件试试
dsh plugin --profile web add "github:dsh-external/dsh-session-search#main"
然后打开 http://127.0.0.1:3080,选一个 Preset,开始你的第一次 Agent 会话。
以上就是我看完 DSH 文档后的完整总结。如果你也在用 DSH,欢迎在评论区交流使用体验和踩坑记录 👇