Spring AI 智能体 7 : 协议无关型智能体编排

Subagent Framework(子智能体框架)提供了一套协议无关抽象层,用于将各类智能体通信协议与 TaskTool 集成。开发者可以通过统一接口,编排来自不同后端的异构智能体:本地基于大模型的子智能体、遵循A2A协议的远程智能体,或是自定义实现的智能体。

服务提供者接口(SPI)全部定义在 spring‑ai‑agent‑utils‑common 模块中。这样不同子智能体实现可以放在独立模块开发,模块之间不存在互相依赖。

设计理念

本框架遵循一条核心原则:将智能体发现与智能体执行解耦。 通过该分离设计,可以实现:

  • 多协议支持:Claude Markdown、A2A、MCP、自定义HTTP API
  • 本地与远程混合:本地LLM子智能体可以和远程专用智能体协同工作
  • 协议专属元数据:每种协议可定义自身独有的配置格式
  • 可插拔执行层:无需修改智能体定义,即可替换底层传输层

架构

TaskTool 架构如下:

核心抽象接口

所有SPI接口都位于包 org.springaicommunity.agent.common.task.subagentspring‑ai‑agent‑utils‑common 模块)。

SubagentReference 子智能体引用

指向智能体定义资源的轻量指针。

代码示例

SubagentResolver 子智能体解析器

策略接口,负责将引用解析为完整智能体定义。

SubagentDefinition 子智能体定义

完整的智能体元数据与配置信息。

SubagentExecutor 子智能体执行器

使用对应协议通信,执行具体任务。

SubagentType 子智能体类型

将解析器与执行器绑定为一组,用于向 TaskTool.builder().subagentTypes(...) 注册。

TaskCall 任务调用

描述待执行任务的数据记录,TaskTool 和 SubagentExecutor 均使用该对象。

内置实现:Claude子智能体

默认实现遵循 Claude Code 的 Markdown + YAML 前置元数据格式。

智能体定义文件格式

文件格式如下:

Claude相关组件

类名 功能说明
ClaudeSubagentDefinition 解析YAML前置元数据(model、tools、skills等字段)
ClaudeSubagentResolver 从类路径或者文件系统加载Markdown子智能体文件
ClaudeSubagentExecutor 基于Spring AI ChatClient执行,完成工具过滤、预加载技能
ClaudeSubagentReferences 工厂方法,扫描发现智能体配置文件
ClaudeSubagentType 便捷构建器,生成带有默认工具集的SubagentType

注册示例代码

A2A协议子智能体

A2A(Agent‑to‑Agent)协议的实现位于独立模块 spring‑ai‑agent‑utils‑a2a,完整文档参考该模块README。

A2A组件

类名 功能说明
A2ASubagentDefinition 封装A2A的AgentCard元数据,kind类型为"A2A"
A2ASubagentResolver /.well‑known/agent‑card.json拉取智能体卡片
A2ASubagentExecutor 使用JSON‑RPC传输发送消息,从返回工件中提取文本结果

注册示例

实现自定义协议

新增一套协议,需要实现3个接口,组装成SubagentType完成注册。

1. 实现 SubagentDefinition

封装协议专属元数据

2. 实现 SubagentResolver

按照协议规则发现智能体资源

3. 实现 SubagentExecutor

通过协议传输完成任务调用

4. 在TaskTool注册

其他协议实现思路

这套抽象可以适配各类智能体通信模式。

MCP(模型上下文协议)

自定义HTTP API

gRPC智能体

完整注册执行流程

完整执行流程如下图:

模块包结构

参考模块包结构如下:

相关文档

参考资料