首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从架构看 DeepSeek Harness rc.8:一个"一切皆插件"的 Agent 运行时

从架构看 DeepSeek Harness rc.8:一个"一切皆插件"的 Agent 运行时

原创
作者头像
Archive
发布2026-08-21 12:05:46
发布2026-08-21 12:05:46
380
举报
文章被收录于专栏:随笔随笔

摘要:DeepSeek Harness(dsh)是 DeepSeek AI 开源的 Agent 运行时框架,其核心理念是"Everything is a Plugin"。本文不讨论模型能力,只从架构层面拆解它在 v0.1.0-rc.8 版本中的设计:以 Cordis 微内核为基础的插件体系,以及 Context / Service / inject 三者构成的依赖调度机制,最后落到 rc.8 在子代理、存储、终端三个方向上的实际改动。


一、先厘清一个定位:Harness 不是模型,也不只是"壳"

很多人第一次看到 Harness 会把它和模型本体混淆。实际上,它的职责在模型之外:把模型调用、工具注册、会话记录、沙箱、终端交互、存储这些环节组织起来,交给一个统一的运行时去调度。

官方对它的定义很直接——"an open-source agent harness",并且强调当前处于 developer preview 阶段,会有破坏兼容性的改动。rc.8 的 SQLite 存储格式不向下兼容,就是这句话的落地。

理解这层定位,是理解后续架构的前提:Harness 解决的不是"智能从哪来",而是"智能如何被编排"。

二、架构的根:Cordis 与"时空可组合性"

Harness 的插件体系建立在 Cordis 之上。Cordis 的设计思想在论文《A Programming Paradigm for Spatiotemporal Composability》里有形式化描述,落到工程上可以概括为三个约束:

约束

含义

工程体现

可逆副作用

插件卸载时,注册的监听器、服务、命令全部自动回滚

热卸载后无状态残留

无特权核心

没有需要"打补丁"的核心代码,核心组件也是普通插件

agentLoop 主循环同样是插件

分层组合

运行时是启动时叠加多层配置形成的插件树

Profile → patch → --patch 逐层覆盖

其中"可逆副作用"是最关键的一点。传统插件框架卸载插件时,往往需要开发者手动清理自己注册的 listenertimer,漏一个就是内存泄漏或幽灵回调。Cordis 把这类注册动作统一包装成可撤销的操作,卸载时由框架自动回滚。

这带来的直接收益是:热替换是安全的。换掉一个模型适配器、替换一个工具,不需要重启整个进程。

三、三个核心抽象:Context、Service、inject

理解了 Cordis 的约束,再看 Harness 内部是怎么组织代码的。它有三个反复出现的概念:

Context(上下文):所有插件共享的同一个实例,承担服务注册、事件发布/订阅、副作用绑定的职责。可以理解成一条共享的服务总线。

Service(服务):插件向外暴露能力的出口。插件继承 Service 类,把具名服务挂到 ctx 上(例如 ctx.tools),其他插件按 key 消费。调用方不关心实现方是谁,只关心有没有这个 key。

inject(注入):插件声明自己依赖哪些服务,例如 inject: ['tools'],表示"等 ctx.tools 就绪后我才启动"。

三者组合起来,形成一张依赖图。Cordis 根据这张图自动调度加载和卸载顺序;当某个服务被热替换时,依赖它的插件会自动重载。这就是为什么换一个 LLM 提供商不用重启——它本质上是 provider 级别的热切换。

四、工程载体:Bundle、Profile、Seam

有了运行时的抽象,还需要分发和配置的载体。Harness 用三个概念来组织:

  • Bundle(组件包):分发单元,打包配置行和对应的代码逻辑。例如 dsh-base 提供模型、工具、沙箱、凭证等基础设施,dsh-web-app 提供浏览器 UI。
  • Profile(配置档案):用户级"工作模式",声明用哪些 Bundle、启用哪些插件,并持有 cordis.patch.yml 个性化配置。webheadless 是官方内置模板。
  • Seam(能力接缝):标准化的能力接口契约。不同插件只要实现同一个 Seam,就能无缝互换——比如任意沙箱插件实现了 Sandbox 接口,就能接入系统。

Seam 是这套架构里最值得注意的设计。它把"能力"和"实现"彻底分开,让第三方插件可以以零侵入的方式替换系统能力,而不需要修改 Harness 源码。

五、rc.8 在架构上的三处实际改动

理论落到版本上,rc.8 有三处改动最能体现这套架构的意图:

1. 子代理解耦成 Profile Bundle

Claude Code 和 Codex 不再内置于主二进制,而是重构为可独立安装的 Profile Bundle,作为插件式子代理被动态加载。Codex 进一步支持非交互权限模式和多个命名实例。

从架构上看,这是"无特权核心"的延伸:连"子代理"这种看起来像是核心能力的东西,也被降级成了可插拔组件。

2. 存储后端的模块化替换

SQLite 后端完成了读写性能和体积优化,代价是数据格式不向下兼容。但关键在于,存储本身是一个可替换的插件,未来切换到 PostgreSQL 或内存数据库不需要改动上层逻辑。这验证了 Seam 设计在实际演进中的价值。

3. 终端与多模态的插件化

Windows PTY 引入持久化 PowerShell 会话,并在 Minimal 预设默认开启;对于不具备视觉能力的纯文本模型,Harness 会降级调用 OCR、颜色统计等工具插件,把图像转成结构化文本再交给模型。两者都是"能力按需装配"的体现。

六、结语

DeepSeek Harness 的架构价值,不在于它提供了多少现成功能,而在于它把 Agent 运行时的每个环节都做成了生命周期可控、可替换、可回滚的插件单元。rc.8 的改动方向——子代理插件化、存储可替换、能力按需装配——都是在往这个目标收敛。

对于关注 Agent 基础设施的开发者,值得看的不是它今天能跑什么,而是它把"编排层"本身做成了开放变量这件事。

参考资料:DeepSeek Harness GitHub 仓库(deepseek-ai/deepseek-harness)、Cordis 论文《A Programming Paradigm for Spatiotemporal Composability》、rc.8 官方发布说明。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、先厘清一个定位:Harness 不是模型,也不只是"壳"
  • 二、架构的根:Cordis 与"时空可组合性"
  • 三、三个核心抽象:Context、Service、inject
  • 四、工程载体:Bundle、Profile、Seam
  • 五、rc.8 在架构上的三处实际改动
  • 六、结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档