协议扩展

A2A 的扩展机制

A2A 提供了一个强、可互操作的基础协议。但在特定领域或高级用例中,往往需要更强的结构、更丰富的数据或新的交互模式。为此,A2A 设计了 扩展(Extensions):一种按需启用(opt-in)的机制,在不分裂核心标准的前提下叠加新能力。

扩展可以引入新的结构化数据、额外要求、可选 RPC 方法,或对任务状态机语义做增强。每个扩展由一个 URI 标识,并由独立的规范定义。

扩展的常见作用范围

  • 仅数据扩展:新增结构化元数据(例如合规属性),不改变交互流程。
  • Profile 扩展:对消息结构提出更严格约束(例如强制使用特定 schema 的 DataPart)。
  • 方法扩展(扩展技能):在核心方法之外新增 RPC 方法。
  • 状态机扩展:通过元数据细化/标注任务状态的子语义。

限制

为保持核心兼容性,扩展通常不应:

  • 修改核心对象 schema(把自定义字段放入 metadata)。
  • 往核心枚举里加新值(用 metadata 表达额外语义)。

声明扩展

智能体在 AgentCard 的 capabilities 中声明支持的扩展。例如:

{
  "name": "Magic 8-ball",
  "description": "An agent that can tell your future... maybe.",
  "version": "0.1.0",
  "url": "https://example.com/agents/eightball",
  "capabilities": {
    "streaming": true,
    "extensions": [
      {
        "uri": "https://example.com/ext/konami-code/v1",
        "description": "Provide cheat codes to unlock new fortunes",
        "required": false,
        "params": {
          "hints": ["When your sims need extra cash fast"]
        }
      }
    ]
  }
}

激活扩展

客户端通常在“每次请求”维度选择启用哪些扩展。常见做法是使用 HTTP Header 列出扩展 URI,并在请求体中携带扩展相关的 metadata。

示例请求:

POST /agents/eightball HTTP/1.1
Host: example.com
Content-Type: application/json
X-A2A-Extensions: https://example.com/ext/konami-code/v1

{
  "jsonrpc": "2.0",
  "method": "message/send",
  "id": "1",
  "params": {
    "message": {
      "kind": "message",
      "messageId": "1",
      "role": "user",
      "parts": [{ "kind": "text", "text": "Oh magic 8-ball, will it rain today?" }]
    },
    "metadata": {
      "https://example.com/ext/konami-code/v1/code": "motherlode"
    }
  }
}

示例响应(回显已激活扩展):

HTTP/1.1 200 OK
Content-Type: application/json
X-A2A-Extensions: https://example.com/ext/konami-code/v1

{
  "jsonrpc": "2.0",
  "id": "1",
  "result": {
    "kind": "message",
    "messageId": "2",
    "role": "agent",
    "parts": [{ "kind": "text", "text": "That's a bingo!" }]
  }
}

必选扩展(Required)

当 AgentCard 将扩展标记为 required: true 时,表示客户端必须遵循该扩展的约束,否则服务端应拒绝请求。仅数据扩展一般不建议标记为 required。

实现建议

  • 版本策略:URI 中包含版本号;破坏性变更使用新 URI。
  • 规范发布:尽量把扩展规范托管在扩展 URI 所指向的位置。
  • 安全:对扩展输入严格校验;扩展方法必须与核心方法一样接受认证/授权控制。