跳转到主要内容
agentscope-extensions-a2a 基于 A2A Java SDK 实现了 A2A 协议 1.0 版本,包含两个子模块:
  • agentscope-extensions-a2a-client:把一个远端 A2A Agent 包装成本地 Agent,可以直接 agent.call(...)。
  • agentscope-extensions-a2a-server:把本地 ReActAgent 暴露成 A2A Server。
两个模块完全独立,可以单用其一。 不支持 A2A 0.3:客户端无法调用 A2A 0.3 的 Agent;A2A 0.3 客户端的请求不带 A2A-Version 请求头,服务端会以版本错误拒绝。服务端暂不支持 ListTasks,因为还不认证调用方。

客户端:调用远端 A2A Agent

添加依赖

直接传入 AgentCard

流式获取回复

streamEvents 按事件流式返回一次调用:远端流式返回的文本和思考分别是 TextBlockDeltaEvent、ThinkingBlockDeltaEvent,最后的 AgentResultEvent 带着和 call() 相同的结果消息。工具调用和工具结果只在结果消息里。

会话

每个会话由 RuntimeContext 的用户 id 和会话 id 确定,各自在 AgentState 里保存历史,同一会话的调用按顺序执行;不带会话 id 的调用共用以 Agent 名字命名的默认会话。interrupt(RuntimeContext) 取消该会话正在进行的远端任务。

Middleware

A2aAgent 在两个位置执行 MiddlewareBase:onAgent 包住整次调用,onReasoning 包住和远端 Agent 的交互。onReasoning 的输入消息就是发给远端的消息,事件是远端流式返回的文本和思考。其他扩展点不适用于远端 Agent。

用 well-known 自动获取 AgentCard

A2aAgent 是 AgentBase 的子类,可以像普通 Agent 一样组合到 Pipeline、MsgHub、Subagent 中。

服务端:把 ReActAgent 暴露成 A2A Server

添加依赖

构建 server

AgentScopeA2aServer 本身不监听端口、不暴露 endpoint,只负责构建组件、组装请求处理链;具体监听由你的 Web 框架完成。这样可以无缝接入 Spring Boot、Quarkus、Vert.x 等。

请求的会话标识

服务端使用 SDK 解析后的 A2A contextId 填充传给 AgentRunner 的 AgentRequestOptions.sessionId。客户端可以直接使用标准协议字段,无需额外添加自定义 metadata。客户端未传 contextId 时,SDK 会自动生成一个。 为兼容已有客户端,非 null 且非空白的 message.metadata["sessionId"] 优先于该映射,即使它与 contextId 不同。这样,SDK 自动生成新的 context ID 时,已有会话键仍会保留。metadata 值为 null、空串或仅含空白时,回退到 contextId。协议消息本身的 contextId 不会被修改。 这项映射只填充 Runner 的请求参数,不会自动启用会话持久化。自定义 Runner 可以使用该标识配置运行上下文或状态存储。

可选组件

  • TaskStore / QueueManager:任务和事件队列存储,默认是内存实现,生产可换成持久化版本。
  • PushNotificationConfigStore / PushNotificationSender:推送通知。目前还不支持推送:AgentCard 声明不支持,消息里附带的推送配置会被忽略。
  • AgentRegistry:把 AgentCard 注册到外部注册中心(如 Nacos,见 Nacos)。

Spring Boot Starter

如果你使用 Spring Boot,建议直接引入 agentscope-spring-boot-starter-a2a-server,自动装配上述 server 和控制器,详见快速开始。 AgentCard 的内容可以在 agentscope.a2a.server.card 下配置,字段名与 A2A AgentCard 一致,例如声明认证方式:
OAuth 2.0 方案支持 authorization-code(可设 pkce-required)、client-credentials 和 device-code 三种流程。A2A 1.0 没有 implicit 和 password 流程,配置了会启动失败。 Map 的键含特殊字符时(例如 OAuth scope 名 read:user 或 URL),请用引号加方括号写成 "[read:user]": 读取用户信息。不加方括号时,:、/ 等字符会被去掉;security-schemes 的名称如果含 .,会被当作嵌套路径,该方案不会生效。 Starter 返回的 JSON 由 A2A SDK 生成,不受应用自身 Jackson 配置(如 spring.jackson.property-naming-strategy)影响。