简介:本文从架构视角拆解一种“一切皆插件”的Agent框架设计思路:Agent由模型与执行外壳两层构成,工具、规划、调度、沙箱、存储乃至循环本身均可替换。读者将理解插件化分层的设计动机、插件接口与注册机制、自定义插件的实现路径,以及当前阶段在实验与生产之间的取舍判断。
讨论 Agent 时,业界常把它等同于某个具体的智能编程工具或对话产品。但更抽象地看,Agent 可以被写成一个极简公式:
Agent = Model + Harness
多数成熟的智能编程工具,是把这两层高度耦合后打包成完整产品:模型、工具链、交互方式由同一厂商一并设计,替换其一会牵动全局。这种紧耦合带来了开箱即用的体验,但也意味着架构上的可替换性被牺牲。
另一条路径则是把 Model 从中心位置“请下来”,降级为一个可替换组件:模型可换、工具可换、会话可换、沙箱可换,理论上连 Agent Loop 本身都可换。这正是插件化 Harness 的核心主张,也是本文要展开的设计思路。
需要强调的是,这类框架的目标并非“再做一个更强的编码助手”,而是回答更底层的问题:一个 Agent 究竟应该由哪些部件组成?这些部件能否被拆开、替换、重新组合? 编码只是它验证架构的一个场景,而非终点。
插件化架构的第一原则是依赖倒置:核心不依赖任何具体部件,所有部件依赖核心定义的契约。可以抽象为三层:
| 层级 | 职责 | 可替换性 |
|---|---|---|
| 内核层 | 生命周期管理、插件注册与发现、事件分发、上下文传递 | 稳定,不随业务变化 |
| 契约层 | 工具接口、存储接口、沙箱接口、循环接口等抽象定义 | 稳定,是扩展的边界 |
| 实现层 | 具体工具、具体存储后端、具体沙箱方案、具体模型适配器 | 完全可替换 |
内核只认契约,不认实现。任何实现只要满足契约即可挂载,这正是“一切皆插件”的工程含义。
按职责划分,一个插件化 Harness 通常包含以下几类扩展点:
把这八类拆开后会发现:没有任何一类是“不可替代的中心”。模型不再是框架的锚点,而只是八类插件之一。
一个最小可用的工具插件契约通常长这样(示意性伪代码,非任何具体产品的接口):
class ToolPlugin:name: strdescription: strparameters: dict # JSON Schema 描述入参def validate(self, args: dict) -> None:"""参数校验,失败抛出具名错误"""def execute(self, args: dict, ctx: "Context") -> "ToolResult":"""真正执行,ctx 提供沙箱、存储、日志等能力"""
关键在于 ctx:插件不直接持有全局资源,而是通过上下文对象获取沙箱与存储能力。这使得同一插件可在不同宿主环境中复用,也便于在测试中用桩替换依赖。
注册机制一般有两种:
# 方式一:声明式注册registry.register("tool", "file_read", FileReadTool)# 方式二:装饰器注册@register_tool(name="file_read")class FileReadTool(ToolPlugin):...
无论哪种,内核在启动时只做一件事:扫描、校验、装载。装载失败应快速失败并给出明确诊断,避免运行期才暴露契约不匹配。
写插件的流程可以归纳为五步:
以存储插件为例,常见坑位有三:
class ObjectStorageStore(StorePlugin):def put(self, key: str, value: bytes, meta: dict) -> str:version = self._next_version(key)self._write(f"{key}@{version}", value, meta)return versiondef get(self, key: str, version: str | None = None) -> bytes:v = version or self._latest(key)return self._read(f"{key}@{v}")
插件化 Harness 的价值不在于“又一个编码助手”,而在于把 Agent 从紧耦合的产品形态还原为一组可拆解、可替换、可重组的部件。它回答的是架构层的问题:Agent 由什么组成,边界在哪里,如何演进。
对开发者而言,值得安装、值得阅读其架构、值得动手写一个插件——这能显著加深对 Agent 系统组成的理解。但从工程审慎的角度,当前阶段更适合作为研究与试验平台,不建议直接承载生产流量。待契约稳定、可观测性与权限体系完善后,再考虑以灰度方式接入真实业务,是更稳妥的路径。
“一切皆插件”不是一句口号,而是一种把复杂性交给边界、把灵活性留给组合的设计哲学。理解这一点,比选择任何一个具体框架都更重要。