VSCode的top 100扩展中,87个包含可执行代码,但卸载时几乎都需要重启整个extension host。只有7个声明了依赖关系。

这意味着当前最流行的插件系统,在"动态卸载"和"依赖管理"两个方向上基本是放弃状态。装插件容易,卸插件靠重启。

2026年8月13日,DeepSeek开源了Agent运行时框架Harness(dsh),同步发布一篇88页的技术论文。论文不讲模型能力,不讲产品功能,只解决一个问题:当一个系统的所有组件都是插件,且插件可以在运行时被动态加载、替换、卸载,怎么保证每一次操作都能安全撤回。

这不是抽象的学术问题。如果未来Agent要能在运行中修改自己的组件——换一个工具、加载一个新能力、替换一段推理逻辑——那么"修改后能不能完整恢复"就是工程上的一票否决项。

一、插件卸载:一个被回避了二十年的工程难题

1.1 副作用残留

插件不是孤立存在的。一个插件被加载后,它通常做了三件事:

  • 注册了事件监听器
  • 分配了系统资源(内存、连接池、定时器)
  • 修改了全局状态或上下文

当你卸载这个插件时,这三件事的"痕迹"并不会自动消失。监听器还在监听,定时器还在跑,全局状态还是被改过的值。

主流解法是让开发者手动写清理逻辑——类似C++的析构函数或React的useEffect cleanup。但这依赖开发者的自觉和记忆力。一个复杂系统有几十上百个插件,每个插件都靠人肉写dispose,遗漏是必然的。

1.2 依赖断裂

更棘手的是依赖关系。插件B依赖插件A提供的服务。A被卸载后,B还在运行,但它调用的服务已经不存在了。

轻则空指针异常,重则整个系统状态不一致。现有工程实践对此的回答通常是:不允许运行时卸载,或者卸载后重启整个进程。

1.3 Agent场景的特殊性

这个问题在Agent场景下被放大了。

传统软件的插件由人类开发者编写和管理,变更频率低。但Agent框架的设计目标是让Agent自身具备动态加载和替换组件的能力——一个AI Agent在执行任务过程中,可能需要临时加载一个新工具、替换一个推理策略、甚至修改自己的执行循环。

如果每次修改都不可逆,或者修改后的状态无法恢复,系统就会在反复试错中积累"垃圾状态",最终崩溃。论文称之为"屎山上叠屎山"。

自演化Agent的前提不是"能改",而是"改了能撤"。

二、DeepSeek Harness的架构选择:没有特权内核

2.1 一切皆插件

DeepSeek Harness(dsh)的核心设计原则是"Everything is a Plugin"。这不是说外围能力可以插件化——很多框架都做到了——而是说连最核心的组件都是插件:

  • 模型适配器是插件(DeepSeek官方模型只是众多选项之一)
  • 工具注册表是插件
  • 会话日志是插件(append-only事件流,Resume/Fork/Replay共享同一事件流)
  • 沙箱策略是插件(默认workspace-write,失败关闭)
  • 审批策略是插件(决定哪些操作需要人工确认)
  • Agent Loop本身也是插件(可以被整体替换)
  • UI也是插件(默认Web UI,可换成CLI/TUI)

没有"核心Harness + 外挂插件"的分层。Harness自己就是由插件拼出来的。

2.2 Cordis微内核

支撑这套架构的是一个叫Cordis的插件微内核,核心源码只有9个文件。Cordis的作者是Koishi框架的创建者——Koishi是一个高度插件化的聊天机器人框架,社区生态中已有超过4000个插件在运行时验证过这套架构。

Cordis解决的不是"怎么装插件",而是"怎么卸插件"——以及卸载之后,怎么保证系统状态干净。

一个标准部署包含133个插件,每个都能独立启停。这意味着在任何时刻,系统状态都是133个插件副作用的叠加。要安全地卸载其中任何一个,需要知道它到底做了什么。

三、两个正交维度:时间可组合性与空间可组合性

论文将插件卸载问题拆解为两个正交维度,并给出了各自的解法。

3.1 时间可组合性:可逆副作用

问题:插件被移除时,它做过的所有事情必须被完全回滚。

解法:Cordis要求所有对Context的修改都通过ctx.effect进行。每次修改,组件必须同时留下一个对应的inverse(逆操作)。

比如:

  • 注册监听器时,同时留下注销方法
  • 启动定时器时,同时留下关闭方法
  • 修改全局状态时,同时记录旧值

Runtime把这些inverse按顺序记录。当组件被卸载时,系统按相反顺序逐一执行。

这类似于RAII或useEffect cleanup,但被提升为运行时强制机制,而不是靠开发者自觉。你不写inverse,框架就不让你注册effect。

3.2 空间可组合性:响应式协效应

问题:插件之间的依赖关系必须被结构化声明和动态解析。

解法:组件提前声明"我依赖什么"。当Context发生变化时,Runtime重新检查依赖是否还成立,并将变化分为三种状态:

  • activating:原本缺失的依赖出现了,组件可以激活
  • deactivating:依赖消失了,组件进入停用
  • neutral:变化与该组件无关,保持不变

比如一个会话日志插件依赖数据库服务。数据库出现时,插件启动;数据库被卸载后,Cordis检测到依赖失效,让插件自动退出——而不是继续访问一个不存在的服务。

开发者不需要轮询依赖是否可用,也不需要处理"依赖突然消失"的边界情况。Runtime在notify()和refresh()两个方法中完成了全部协调。

3.3 汇合性:不同路径,相同终态

论文给出了一个关键性质——Confluence(汇合性):

假设系统最终需要A、B、C三个组件。它可以一开始就加载A、B、C;也可以先装A,再装D,后来卸掉D,替换B,最后得到A、B、C。

只要可组合条件成立,两条完全不同的运行路径,最终得到的系统状态是等价的。

这意味着Agent可以不断试错——加载新组件、卸载旧组件、替换策略——但试错历史不会永久污染Runtime。每一次"折腾"之后,系统都能回归到一个确定的纯净终态。

这是自演化Agent的工程基础:进化不需要从零开始,但每一步进化都必须可回溯。

四、从架构到实践:四种预设模式

DSH内置了四种预设模式,每种加载不同的插件集合:

标准模式:日常开发,文件编辑、Shell、检索、Skills、计划、子代理全开。适合大多数Agent任务。

PTC模式(Program-The-Computer):通过Code Mode SDK让模型生成TypeScript代码编排多轮工具调用。关键设计是中间数据留在运行环境中,只有最终结果进入上下文,大幅降低Token消耗。适合复杂多步任务。

极简模式:仅保留持久bash和str_replace_editor两个工具。适合基准测试,剥离多余能力后评估模型裸能力。

创造模式:在标准能力外开放运行时检查与插件实验能力,让Agent反向帮你设计和创建新preset。用Agent造Agent。

换模式等于换一份插件清单。这不是配置参数层面的切换,而是整个Runtime组件组合的重组。因为Cordis的可逆副作用保证了这种重组的安全性——卸载旧插件集的副作用会被完整回滚,加载新插件集从干净状态开始。

五、争议与边界

5.1 组件细化的O(n²)膨胀

论文自己承认了一个风险:当组件进一步细化、彼此之间存在大量交互时,为了保持组件独立性而额外引入的integration component,可能呈O(n²)级增长。

插件粒度越细,单插件越简单,但插件间的协调成本越高。这不是Cordis独有的问题——所有微内核架构都面临这个权衡。区别在于Cordis用形式化证明保证了"不会因为协调而出错",但"协调本身的性能开销"是证明不了的。

5.2 学习曲线

Cordis的核心概念——效应、协效应、时空可组合性——对不熟悉OSGi、React useEffect的开发者来说有学习曲线。88页论文的学术密度不低。

但如果目标真的是自演化Agent——让AI自己修改自己的组件——那么这种形式化保证就不是过度设计,而是必需品。一个会自我修改的系统,如果不能用数学证明"每次修改都是安全的",就是定时炸弹。

5.3 早期阶段

DSH目前是v0.1 Developer Preview。团队负责人坦承"还很不完善"。如果用Claude Code的产品完成度来衡量,DSH还有明显差距。但它的定位不是产品,而是底座——官方提供的Coding Agent只是一套预置preset,开发者可以拆开重组。

六、对Agent架构设计的工程启示

启示一:Agent框架的核心难题是状态管理,不是模型调用

大部分Agent框架把精力放在"怎么让模型调用工具"上。但实际工程中,真正出问题的是状态管理——上下文怎么传、副作用怎么管、组件怎么换。

DSH把这个问题摆到了架构层面用运行时机制解决,而不是靠开发者纪律。这个思路值得所有Agent框架借鉴。

启示二:自演化的前提是可回滚

"Agent修改自己"听起来很科幻,但工程上只分解为两个问题:修改后的状态能不能恢复?依赖关系能不能自动调整?

Cordis用可逆副作用解决前者,用响应式协效应解决后者。两个解法都不依赖AI的"智能",而是依赖运行时的机制保证。这意味着即使Agent做出了错误的自我修改,系统也能安全回退。

启示三:插件化不是万能药

"一切皆插件"的代价是组件间的协调成本。在简单场景下,单体架构的效率远高于插件化架构。插件化只在需要动态扩展、运行时重组、多团队协作的场景下才有价值。

对企业来说,如果你的Agent应用场景固定、工具集稳定、不需要运行时动态调整,那么一套硬编码的Agent框架可能比插件化的DSH更实用。插件化是手段,不是目的。

收尾:Agent的"操作系统"时刻

88页论文的核心贡献不是发明了新概念——可逆副作用和响应式依赖管理在软件工程中都有先例。它的贡献在于把这些机制统一为一个形式化框架,并用数学证明了五个关键性质:保持性、时间可组合性、空间可组合性、进展性、汇合性。

这些证明指向一个具体目标:让Agent在运行中修改自己的组件,且每次修改都能安全撤回。

当AI Agent从"执行固定流程"走向"动态调整自身架构",运行时的可组合性就不再是锦上添花,而是地基。

这个地基打好了,自演化Agent才有工程上的可能性。打不好,每一步"进化"都是在屎山上加层。

DeepSeek选了一条难路:不是做一个更好的Agent产品,而是做一个Agent能安全修改自己的运行时底座。这条路能不能走通,取决于Cordis的形式化保证在真实大规模插件生态中是否成立。

但方向是对的。Agent的竞争正在从"谁的模型更强"转向"谁的运行时更可靠"。88页论文证明的不是一个产品功能,而是一个工程底线。

Logo

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

更多推荐