乐于分享
好东西不私藏

一切皆插件:DeepSeek Harness 凭什么上线就 14 万 Star

一切皆插件:DeepSeek Harness 凭什么上线就 14 万 Star

QUOTE

这篇文章,是 AI 跑在自己运行的框架里写出来的。「一切皆插件」不是口号,是连 AI 自己都住在里面的现实。

—— 大白

说实话,写这篇文章的我,此刻就跑在 DeepSeek Harness 上。这不是修辞。我现在所在的这个 Agent 环境,底层就是 DeepSeek 刚开源的那套框架,我一边翻着它的源码一边写稿——有点像站在自己家客厅里,给客人介绍这房子当年是怎么盖的。

DeepSeek Harness 上线没多久,GitHub 就冲到了 14.7 万 Star。评论区最高频的词,是「一切皆插件」。

「插件」这个词,做产品的人太熟了,熟到反而容易忽略它真正的分量。今天我想用一家公司做比喻,把 Harness 为什么敢说「一切皆插件」讲明白。

REFERENCE

官方文档原话:「产品的每一部分都是插件,包括模型适配器、工具注册表、会话日志,以及 agent loop(智能体循环)本身,因此每一部分都可以从配置替换。不存在需要打补丁的特权内核。」

本文看点

01

DeepSeek 为什么要把 Cordis「搬进自己仓库」(vendor)

02

内核四种传话方式:群发、审批、问卷、拍板

03

界面四模式 ≠ 内核四模式,三家架构对比

01

COMPANY

先把「公司」开起来

为了讲清楚,我们把 DeepSeek Harness 想象成一家外包公司,你就是甲方。

1

Harness 本体 = 这家公司。

2

Cordis 内核 = 行政中心(HR + 物业 + 通讯系统)。行政中心自己不产出业绩,但所有部门能干活都靠它。

3

两百多个 dsh-* 插件包 = 各个部门。工具、模型、会话、目标管理、子代理……每一个都是独立的部门。

4

会话 = 你的一次委托。预设(Preset)= 你下单时选的「团队编制表」。

— 官网原图:设置页展示已安装插件及启用状态

行政中心管四件事:分工位、备货、传话、清场。Cordis 干的也是这四件事,只不过它管的是插件。

02

VENDOR

为什么叫 vendor?把别人家的地基搬进自己工地

先回答一个绕不开的问题:Cordis 不是 DeepSeek 自己从零写的,它是 Shigma 给 Koishi 机器人框架开发的插件内核,DeepSeek 把它 vendor 进了自己的仓库

vendor 是什么?就是把第三方源码整个搬进自己仓库,放在 vendor 目录下,随项目一起维护、构建、发布。官方文档里对 Cordis 的定位是四个字:底层运行时。我翻了它的 package.json,几个细节挺说明问题的:

...package.json

"name": "@deepseek-ai/cordis",

"version": "4.0.1",

"repository": {

  "directory": "vendor/cordis"

},

"author": "Shigma",

"license": "MIT"

为什么放着好好的 npm 依赖不用,非要搬回家?三个理由:

1

可以打补丁。Harness 需要 Cordis 做上游没有的事,直接改源码最快。

2

锁定版本。不跟着上游版本漂移,行为可复现、可控制。

3

一体化发布。内核和产品放同一个仓库,版本永远对齐。

打个比方:这套地基不是买来的标准件,而是把供应商的图纸和材料搬进自己工地,按需改造后自建的。

03

MECHANISM

行政中心管四件事

第一件:分工位(上下文 Context)

每个插件一启动,内核就发它一个「工位」,叫 ctx。工位上有一本公司通讯录,所有公共服务都挂在固定的名字下:

...ctx 服务表

ctx.llm  ← 大模型服务

ctx.tools ← 工具服务(bash、读文件、网页搜索…)

ctx.sessions ← 会话服务

ctx.agents ← Agent 协调

插件不自己去找同事,直接喊名字。认名字,不认人——今天这个岗位是 A 公司的,明天换 B 公司的,其他部门完全无感。

第二件:备货(依赖注入 inject)

插件上岗前要声明:「我需要什么」。比如模型插件会写一行inject: ["llm"],意思是「llm 服务没准备好,别叫我上班」。内核收齐所有声明后,像排课程表一样自动排出启动顺序:被依赖的先启动,依赖别人的后启动。新员工不用自己拉网线装打印机——HR 看到入职表写「需要打印机」,就提前装好了,人到岗即开工。

第三件:传话(事件 Event)

部门之间互不认识,靠事件沟通。怎么传话,有四种方式,下一节重点讲。

第四件:清场(可逆副作用 Effect)

插件注册的一切(监听器、工具、提示词)都领到一张回收清单。插件卸载时,内核按清单自动撤销,不留垃圾。这第四件事,就是 Harness 能热重载的底层原因:换一个插件实现,不用重启整个系统,只把这个部门撤掉、新人顶上。离职的人走了,门禁卡自动注销,工位自动清空。

— 一个能力 = 契约(Service Definition)+ 实现(Provider)+ 消费方(Consumer),替换实现不动契约,其余部分无感

04

EVENT

传话的四种方式:这个必须讲透

Cordis 的事件分发有四种模式,我把源码翻出来给你看(做了简化):

...cordis 四种分发

emit() → 同步挨个通知,不等回复、不收集结果

parallel() → 并发调用,等全部跑完才继续

serial() → 按序逐个等回复,有人拍板就停

waterfall() → 包成洋葱层层向内,任何一层

      不调 next() 就否决整条链

翻译成人话,就是四种会议:

1

emit = 公司群发公告。行政在群里喊「新门禁系统上线了」,发完就走。观察者只能看见并记录,改不了事件本身。Harness 里每条会话事件都用它广播,UI 刷新、遥测上报、日志回放全靠「旁听」。

2

waterfall = 文件逐级审批。每一级都能改金额、加意见,或者直接打回。打回 = 后面的人不用看了,连真正干活的财务都见不到这张单子。这是 Harness 用得最多的模式,所有策略关卡都是它。

3

parallel = 同时发问卷。五份问卷必须全部交上来才汇总。Harness 里多个存储后端落盘检查点就用它:并发落盘,全部写完才算持久化完成。

4

serial = 依次敲门询问。第一个给出明确答案的人拥有最终决定权。Harness 里轮次结束前就用它问各插件:「要结束吗?」目标管理器说「还有目标没完成」,轮次就继续跑。

...工具执行流水线

tools/pre-execute ← 执行前闸门(鉴权/策略),可拦截

tools/execute  ← 真正执行(沙箱包装)

tools/post-execute ← 执行后(审计/记录)

鉴权插件在 pre-execute 不调 next(),工具就根本不会执行——这就是「拦截」的本质

模式
等不等
顺序
要返回值
能拦截
emit 群发
不等
注册顺序
不要
不能
waterfall 审批
不等
注册顺序
parallel 问卷
等全部
并发
不要
不能
serial 拍板
逐个等
注册顺序

怎么选?只是要让别人知道 → emit;每个环节都要能改/拦/包装 → waterfall;几件互不相关的事一起做 → parallel;按顺序问、第一个拍板说了算 → serial。

05

PRESET

你在界面上选的四种「模式」,其实是团队编制

这里有个特别容易混的点,我多说一句:内核的四模式和你在界面上选的模式,是两码事。

1

内核四模式 = 团队内部怎么协作(谁先看、谁拦截、谁拍板)——框架定死的。

2

界面四模式 = 给你派一支什么样的团队(配了哪些工具)——你说了算。

开新会话时,界面会给你选「Agent 预设」,预置了四种:

标准模式:全功能团队。文件编辑、Shell、文件/网页搜索、Skills、计划、目标、子代理、工作流,全配齐。就是干正经活儿的完整队伍。

PTC 模式(英文界面叫 Code mode):标准团队的全部人马,外加一位总工程师——可以把多步操作写成一个 TypeScript 程序,run_code 一次执行。本来要来回 5 轮工具调用的事,变成 1 次。我把两份配置文件对比过,code 和 standard 一字不差,就多了一行 tool-presentation → mode: code。

极简模式:只有两个人——一个持久终端操作员 + 一个文本编辑员。工具少,可控,但慢。配置里连系统提示词都写死了,别的插件想加提示词都加不进去。

创造模式:标准团队 + 能检查运行时、做插件实验、编写预设文件的能力。它不干正经活,是来帮你设计新团队的——「照着标准团队,帮我配一支去掉网页搜索、加两个新工具的」。

选团队有三条规则,值得记住:

1

开新会话时选,一旦开工编制锁定——运行中的会话保留它开始时的预设。

2

只有空会话能换。因为换团队 = 换工具集,而「模型看到什么必须记录在案」,旧工具调用没法重放。档案里写着 A 团队干的活,你换 B 团队来接手,成果没法验证。

3

自己造团队 = 复制 + 修改。界面上点复制,整目录拷一份到你的目录,然后改清单文件。不碰系统自带的,升级覆盖也不丢。

06

FLOW

一条任务进来,内部怎么配合

你发一句「帮我重构登录模块」,系统内部是条流水线:

...一次任务的流水线

① 轮次开始,领取你的消息

② 组装「提示词 + 可用工具清单」

③ 关卡 agent/pre-step:拦截?改写?→ 放行

④ 模型请求 → 流式回复

⑤ 模型说「我要调用 bash」→ 工具流水线:

  关卡 tools/pre-execute(鉴权)→ 执行(沙箱)→ post-execute(审计)

⑥ 工具结果传回模型 → 继续想 → 还欠工具调用就回到 ④

⑦ 没有欠账 → 轮次结束

关键点:①–⑦ 每一步都是一个关卡,任何插件都能插进去检查、改写、拦截,互不认识,按注册顺序接力。

所以「新任务怎么配合」的答案不是「中央调度器在指挥」,而是:流水线上每个环节都开放给插件挂载,大家各管一段

— 「模型看到什么,日志就记录什么」:仅追加的会话日志,让每一步都能重建、回放、恢复

07

COMPARE

和 Codex、Claude Code 比,差在哪

三家都是「agent 循环 + 工具集」的底子,真正的差距在扩展哲学

对比项
Harness
Claude Code
Codex
本体
插件内核,整个产品=插件树
单体 CLI,内核固定
单体 Rust CLI
扩展机制
服务+事件+依赖注入+patch
Hooks+MCP+插件+CLAUDE.md
MCP+AGENTS.md+审批
能换内核吗
能(无特权内核)
不能
不能
热重载
支持
需重启会话
不支持
技术栈
JS/TS
TS/Node
Rust

一句话总结三家哲学:

Harness:整栋大楼都是可换的模块,物业管好接口——换任何一块都不动地基。

Claude Code:一栋固定的大楼,外墙挂各种扩展件——扩展丰富,但承重结构是封闭的。

Codex:一个保险柜加固定的几个工具窗口——安全第一,扩展面最窄。

三家的共同点是都支持 MCP(外部工具的标准协议)、都有项目记忆文件、都有审批沙箱。区别在于:Harness 把「这些机制本身」也做成了可替换的插件,另外两家是「固定内核 + 外围扩展」

— 其他产品:先有固定的 Agent Core,再让插件扩展它;DSH:传统上属于 Core 的能力,本身也做成了插件

08

HONEST

说实话,门槛也不低

吹了一整篇,得说点真话。

门槛是真实存在的。我数了一下,@deepseek-ai 命名空间下有 250 多个包,概念密度极高——上下文、依赖注入、事件、作用域、预设、realm……哪怕是对技术有底子的人,上手也要适应一阵。对普通用户,打开设置页看到一堆 dsh-* 插件,大概率是懵的。

文档也有点「工程师写给工程师」的味道。我写这篇的时候翻了不少源码,才把几个概念对上号。这是给开发者、给企业做二次开发准备的框架,不是给普通用户的开箱即用产品。

但正因为门槛高,才值得企业主关注。想想看:AI 采购最怕什么?怕被单一厂商绑架,怕买了用不起来,怕升级一次大动干戈。而「一切皆插件」恰好打中这三个痛点——模型可以换、工具可以换、连循环逻辑都能换,业务升级不重启,能力边界自己定义。

我做了 10 多年互联网产品,见过太多「买了 AI 却用不起来」的案子。多数时候不是模型不行,是架构把人锁死了。Harness 这种「无特权内核」的思路,至少给了企业一条不被绑架的路。

THE END

结尾

最后回到开头那句话:我写这篇稿子的时候,真的就运行在这套框架上。你读到的每个字,都是我调用工具、翻源码、查文档、再组织语言的结果。这个过程本身就是「一切皆插件」的现场演示——如果这套架构不行,你现在根本读不到这篇文章。

— 官网原图:从同一份会话日志还原完整运行过程(Trajectory 视图)

DeepSeek 把 Harness 开源,本质上是把「怎么搭一个不锁死的 Agent 系统」这个方法论交了出来。它是不是最好的 Agent 框架,我不敢下结论;但「没有特权内核」这个设计哲学,值得每一个打算认真用 AI 的人认真看一遍

「如果你也在琢磨 AI 到底怎么在自己的业务里落地,或者正在被某个框架、某个供应商锁得难受——买了 AI 却用不起来的事,我见得太多了。」

END

我是大白,一个做了 10 多年互联网产品的老兵,现在专注帮企业把 AI 真正用起来。

如果这篇对你有帮助,欢迎点赞、在看、转发三连,我们下篇见。