编程 A2A Protocol 深度解析:让所有 AI Agent 说同一种语言——从 Agent Card 到任务生命周期、从跨框架协作到生产级部署的完整技术指南(2026)

2026-07-04 15:16:17 +0800 CST views 10

A2A Protocol 深度解析:让所有 AI Agent 说同一种语言——从 Agent Card 到任务生命周期、从跨框架协作到生产级部署的完整技术指南(2026)

作者注:2025 年 4 月,Google 在 Cloud Next 大会上发布了 A2A(Agent-to-Agent Protocol)——这是 AI Agent 发展史上的一个分水岭时刻。它解决的问题很简单,却极其深刻:让不同厂商、不同框架、不同部署环境构建的 AI Agent 能够相互发现、通信和协作。本文将深入 A2A 的技术内核,从 Agent Card 的 JSON Schema,到任务状态机的完整实现,再到生产级多 Agent 协作系统的架构设计,给你一份完整的工程指南。


目录

  1. 背景:AI Agent 的「巴别塔」困境
  2. A2A 协议核心设计哲学
  3. Agent Card:Agent 的「数字名片」深度解析
  4. 任务生命周期:从提交到完成的完整状态机
  5. 消息与工件:A2A 的通信原语
  6. 传输层设计:JSON-RPC over HTTP + SSE
  7. A2A vs MCP:互补而非竞争
  8. Python SDK 实战:构建一个完整的 A2A Agent
  9. TypeScript SDK 实战:前端 Agent 的无缝接入
  10. 多 Agent 协作架构设计
  11. 企业级安全:认证与授权
  12. Linux Foundation 托管后的生态演进
  13. 生产级部署最佳实践
  14. 真实案例:跨框架 Agent 协作系统
  15. 性能优化与可观测性
  16. 2026 年 A2A 生态全景图
  17. 总结与展望:A2A 如何重塑 AI 基础设施

1. 背景:AI Agent 的「巴别塔」困境

1.1 问题的本质

2024-2026 年,AI Agent 框架呈爆炸式增长。LangChain、LangGraph、CrewAI、AutoGen、Google ADK、 Anthropic Claude Code、ByteDance TRAE、OpenAI Swarm……每个框架都有自己的 Agent 定义方式、通信协议和工具调用规范。

这导致了一个严峻的现实:一个用 LangChain 构建的招聘 Agent,无法与用 CrewAI 构建的报销审批 Agent 直接协作——即使它们都在为企业解决真实的业务问题。

┌─────────────────────────────────────────────────────────────────┐
│                    企业 AI Agent 孤岛问题                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌──────────┐     ┌──────────┐     ┌──────────┐             │
│  │ HR Agent  │     │Sales Agent│     │Finance   │             │
│  │(Google ADK)│     │(LangChain)│     │Agent     │             │
│  └─────┬─────┘     └─────┬─────┘     └────┬─────┘             │
│        │                  │               │                       │
│        │   无法通信         │  无法通信      │                       │
│        │ ◄────────────────┼──────────────►│                       │
│        │                  │               │                       │
│  「我想做一个新员工入职流程,需要三个 Agent 协作」                     │
│  「答案是:你得写大量的胶水代码,处理三种不同的协议」                   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.2 现有方案的局限

在 A2A 之前,开发者尝试过几种方案,但都有明显缺陷:

方案 A:让所有 Agent 用同一个框架

  • 缺点:不现实。企业历史遗留系统、不同团队的技术选型、第三方 SaaS 的封闭实现,都不受你控制。

方案 B:用消息队列(Kafka/RabbitMQ)硬连

  • 缺点:需要暴露内部实现细节,破坏 Agent 的自主性,且消息格式没有标准。

方案 C:让一个「超级 Agent」调用其他 Agent 作为工具

  • 缺点:这是 Anthropic MCP 的思路,适合工具调用,但不适合对等协作(peer-to-peer collaboration)。

1.3 A2A 的破局

A2A 协议的核心洞察是:Agent 之间的协作,应该像微服务之间的调用一样标准化

正如 REST + OpenAPI 定义了微服务通信的标准,A2A 定义了 Agent 通信的标准:

┌──────────────────────────────────────────────────────────────────────┐
│                    A2A 的愿景:Agent 的「HTTP」                      │
├──────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  以前:每个框架有自己的 Agent 通信方式                                 │
│  现在:所有框架的 Agent 都实现 A2A 协议                              │
│                                                                      │
│  HR Agent (ADK) ──── A2A ────> Sales Agent (LangChain)            │
│        │                                │                            │
│        └──────────── A2A ──────────────┘                            │
│                                                                      │
│  关键特性:                                                           │
│  ✓ 不暴露内部实现(黑盒协作)                                         │
│  ✓ 支持长时任务(异步、流式更新)                                      │
│  ✓ 企业级安全(OAuth 2.0、OpenID Connect)                          │
│  ✓ 基于成熟标准(HTTP、JSON-RPC、SSE)                               │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘

2. A2A 协议核心设计哲学

2.1 五大设计原则

A2A 协议并非简单的「消息格式定义」,而是一套完整的技术哲学。理解这些原则,才能正确实现和使用 A2A。

原则 1:Agent 即 Agent(Agent as Agent),而非工具

这是 A2A 与 MCP 最本质的区别。

  • MCP(Model Context Protocol):把外部能力暴露为「工具」,LLM 通过 tools/call 主动调用。工具是无状态的、被动的。
  • A2A:把协作方视为「对等 Agent」,它可以自主推理、主动请求补充信息、异步执行长时任务。
# MCP 的思路:工具调用(同步、无状态)
result = client.call_tool(
    name="search_database",
    arguments={"query": "SELECT * FROM users"}
)
# 立即返回结果,工具无法主动与你沟通

# A2A 的思路:Agent 协作(异步、有状态)
task = client.send_task(
    agent="data-analyst-agent",
    message="分析上个季度的用户增长趋势"
)
# Agent 可能回复:
# "需要你补充一下:是否包含测试账号?"
# "正在处理,当前进度 30%"
# "完成,这是分析报告(包含图表文件)"

原则 2:基于标准构建(Build on Standards)

A2A 没有发明新的传输协议,而是基于互联网最成熟的标准:

  • HTTP/HTTPS:传输层
  • JSON-RPC 2.0:消息格式(为什么不用 REST?因为 RPC 更适合双向、异步的场景)
  • Server-Sent Events (SSE):长时任务的流式更新
  • OpenAPI / JSON Schema:Agent Card 的描述规范

这意味着:你可以直接用现有的 HTTP 服务器、负载均衡器、API 网关来部署 A2A Agent。不需要特殊的消息中间件。

原则 3:默认安全(Secure by Default)

企业环境中,Agent 可能处理薪资数据、客户信息、商业机密。A2A 从设计上支持:

  • 认证:OAuth 2.0、API Key、OpenID Connect
  • 授权:基于 Agent Card 中声明的 skills 进行细粒度权限控制
  • 审计:每个 Task 都有完整的状态变更历史

原则 4:支持长时任务(Long-Running Tasks)

AI Agent 执行的任务,可能耗时几秒(简单查询),也可能耗时几小时(深度研究、代码生成、多步推理)。

A2A 通过以下机制支持长时任务:

  1. 异步任务提交tasks/send 立即返回 taskId,不阻塞
  2. 流式进度更新tasks/sendSubscribe 通过 SSE 推送实时进度
  3. 任务轮询tasks/get 随时查询任务状态
  4. 断点续传:Task 状态持久化,Agent 重启后任务可恢复

原则 5:不透明协作(Collaborate without Exposure)

A2A 允许 Agent 之间协作,无需暴露内部实现细节

这对于企业场景至关重要:

  • Salesforce 不会把 CRM Agent 的提示词、工具调用链、内部知识库暴露给你
  • 但你可以通过 A2A 协议,向 Salesforce CRM Agent 委派「更新客户状态」的任务
┌─────────────────────────────────────────────────────────────────┐
│                  不透明协作的精妙之处                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  你的 Agent                 Salesforce CRM Agent                   │
│  ┌───────────┐             ┌───────────────────────────┐       │
│  │ 不知道:    │             │                            │       │
│  │ - 用啥模型  │  A2A      │ 不知道:                    │       │
│  │ - 提示词   │ ────────>  │ - 你的业务上下文           │       │
│  │ - 工具链   │  (只交换   │ - 其他 Agent 的存在        │       │
│  │ - 知识库   │   任务/结果) │                            │       │
│  └───────────┘             └───────────────────────────┘       │
│       │                               │                          │
│       │   只知道:                     │ 只知道:                   │
│       │   - Agent Card               │ - 收到的任务               │
│       │   - 任务状态                 │ - 需要返回的结果           │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

2.2 A2A 协议的核心抽象

A2A 定义了四个核心抽象,理解它们是掌握 A2A 的关键:

抽象作用类比
Agent CardAgent 的「数字名片」,描述能力和接入点微服务的 /actuator/info + OpenAPI 文档
Task一次协作的载体,有完整的生命周期HTTP 请求(但有更复杂的状态机)
MessageAgent 之间的对话单元邮件的正文
PartMessage 的基本组成(文本/文件/结构化数据)邮件的正文、附件、表单数据

3. Agent Card:Agent 的「数字名片」深度解析

3.1 Agent Card 是什么?

Agent Card 是一个标准的 JSON 文件,通常托管在 Agent 服务的 /.well-known/agent.json 路径下。

任何想要与这个 Agent 协作的客户端(或其他 Agent),首先获取它的 Agent Card,了解:

  1. 这个 Agent 叫什么?
  2. 它有什么能力(skills)?
  3. 怎么调用它(endpoint、认证方式)?
  4. 它支持流式处理吗?支持推送通知吗?

3.2 Agent Card 完整 JSON Schema

以下是一个生产级的 Agent Card 示例(包含全部关键字段):

{
  "agent_card_version": "a2a-0.3",
  "name": "senior-data-analyst-agent",
  "description": "资深数据分析 Agent,支持 SQL 查询、趋势分析、可视化报告生成。接受自然语言输入,自动选择数据源,输出包含图表的交互式报告。",
  "version": "2.1.0",
  "icon_url": "https://assets.example.com/agents/data-analyst.png",
  "homepage_url": "https://data-analyst.example.com",
  
  "capabilities": {
    "streaming": true,
    "push_notifications": true,
    "state_transition_history": true,
    "tasks_persistence": true,
    "multimodal": ["text", "file", "data"],
    "max_concurrent_tasks": 10
  },
  
  "skills": [
    {
      "id": "sql-query",
      "name": "SQL 查询执行",
      "description": "将自然语言转换为 SQL,在授权的数据库上执行,返回结构化结果。支持 MySQL、PostgreSQL、ClickHouse。",
      "tags": ["sql", "database", "query"],
      "input_modes": ["text"],
      "output_modes": ["text", "data", "file"],
      "examples": [
        "查询上个季度的月活用户数",
        "找出消费金额 top 10 的 VIP 客户"
      ]
    },
    {
      "id": "trend-analysis",
      "name": "趋势分析",
      "description": "对时间序列数据进行趋势拟合、异常检测、未来预测。支持线性回归、ARIMA、Prophet 等算法。",
      "tags": ["trend", "forecasting", "anomaly-detection"],
      "input_modes": ["text", "data"],
      "output_modes": ["text", "file"],
      "examples": [
        "分析过去一年的 GMV 增长趋势,预测下个季度"
      ]
    },
    {
      "id": "report-generation",
      "name": "分析报告生成",
      "description": "整合查询结果和分析结论,生成包含图表、洞察建议的 HTML/PDF 报告。",
      "tags": ["report", "visualization", "insights"],
      "input_modes": ["text", "data"],
      "output_modes": ["file"],
      "examples": [
        "生成 Q2 用户增长分析报告,包含趋势图和建议"
      ]
    }
  ],
  
  "endpoint": "https://data-analyst.example.com/a2a",
  "authentication": {
    "schemes": ["bearer", "api_key"],
    "instructions": "在 Authorization header 中携带 Bearer token,或在 X-API-Key header 中携带 API Key。"
  },
  
  "default_input_modes": ["text"],
  "default_output_modes": ["text", "file"],
  
  "provider": {
    "organization": "Example Corp Data Team",
    "url": "https://example.com"
  },
  
  "contact": {
    "name": "Data Platform Team",
    "email": "data-platform@example.com"
  },
  
  "license": "proprietary",
  "terms_of_service": "https://example.com/terms",
  "privacy_policy": "https://example.com/privacy"
}

3.3 Agent Card 字段逐项详解

agent_card_version

协议版本号。当前最新是 a2a-0.3。客户端应根据版本号决定是否支持某些新特性。

skills[]

这是 Agent Card 最核心的字段。每个 skill 描述 Agent 的一项具体能力。

关键设计决策skills 是语义描述,而非函数签名。这意味着:

# ❌ 错误的思路(太底层,暴露实现细节)
"skills": [{
  "name": "execute_sql",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {"type": "string"},
      "database": {"type": "string"}
    }
  }
}]

# ✅ 正确的思路(语义化,关注「能做什么」)
"skills": [{
  "id": "sql-query",
  "name": "SQL 查询执行",
  "description": "将自然语言转换为 SQL...",
  "examples": ["查询上个季度的月活用户数"]
}]

capabilities

声明 Agent 支持的协议特性:

  • streaming: true:支持 tasks/sendSubscribe,通过 SSE 推送进度
  • push_notifications: true:支持任务完成后主动推送通知(通过 webhook)
  • state_transition_history: truetasks/get 返回完整的状态变更历史

authentication

安全设计的精髓:Agent Card 公开声明支持的认证方式,但不包含密钥本身。这类似于 OAuth 2.0 的 Discovery Endpoint。

# 客户端发现认证方式
agent_card = requests.get("https://data-analyst.example.com/.well-known/agent.json").json()
auth_schemes = agent_card["authentication"]["schemes"]
# ["bearer", "api_key"]

# 根据本地配置的凭证,选择合适的认证方式
if "bearer" in auth_schemes:
    headers["Authorization"] = f"Bearer {load_token()}"
elif "api_key" in auth_schemes:
    headers["X-API-Key"] = load_api_key()

3.4 Agent Card 的发现机制

A2A 支持三种 Agent 发现方式:

方式 1:静态发现(Well-Known URL)

GET https://data-analyst.example.com/.well-known/agent.json

最适合:你知道 Agent 的域名,想直接使用。

方式 2:注册中心(Agent Registry)
企业可以搭建一个中心化的 Agent 注册中心(类似服务发现中的 Consul/Etcd)。

# 注册 Agent
POST /registry/register
{
  "agent_card_url": "https://data-analyst.example.com/.well-known/agent.json",
  "health_check_url": "https://data-analyst.example.com/health"
}

# 发现 Agent(按 skill tag 搜索)
GET /registry/discover?tag=sql&tag=database

方式 3:动态广播(mDNS / 企业服务网格)
在局域网或 Kubernetes 集群内,Agent 可以通过 mDNS 或 Service Mesh 的服务发现机制自动暴露。

# Kubernetes Service 定义中嵌入 Agent Card 注解
apiVersion: v1
kind: Service
metadata:
  name: data-analyst-agent
  annotations:
    a2a.io/agent-card-path: "/.well-known/agent.json"
    a2a.io/skills: "sql-query,trend-analysis,report-generation"

4. 任务生命周期:从提交到完成的完整状态机

4.1 Task 的数据结构

每个 A2A 任务用一个唯一的 taskId 标识,其完整结构如下:

{
  "taskId": "task_9f8a7b6c-3d2e-4f1a-9b0c-8e7d6f5a4b3c",
  "contextId": "conv_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
  "status": {
    "state": "working",
    "timestamp": "2026-07-04T10:15:30.123Z",
    "message": {
      "role": "agent",
      "parts": [{"type": "text", "text": "正在执行 SQL 查询,已扫描 3 张表..."}]
    }
  },
  "history": [
    {"state": "submitted", "timestamp": "2026-07-04T10:15:00.000Z"},
    {"state": "working", "timestamp": "2026-07-04T10:15:05.000Z"}
  ],
  "artifacts": [],
  "metadata": {
    "requester": "orchestrator-agent",
    "priority": "high",
    "timeout_seconds": 1800
  }
}

4.2 完整的状态机

A2A Task 的状态机设计,借鉴了 Kubernetes Pod 生命周期和 HTTP 状态码的设计哲学:

                    ┌─────────────┐
                    │  submitted  │  初始状态:任务已接收,但未开始处理
                    └──────┬──────┘
                           │
                     ┌─────▼──────┐
                     │  working    │  处理中:Agent 正在执行任务
                     └─────┬──────┘
                           │
          ┌────────────────┼────────────────┐
          │                │                │
    ┌─────▼─────┐  ┌─────▼─────┐  ┌─────▼─────┐
    │  input_required │  │completed  │  │  failed   │
    │  (需补充信息)  │  │  (成功)   │  │  (失败)   │
    └─────┬─────┘  └────────────┘  └──────┬────┘
          │                                  │
          │                          ┌───────▼───────┐
          │                          │  cancelled     │
          │                          │  (被取消)      │
          │                          └───────────────┘
    ┌─────▼─────┐
    │  (补充后  │
    │   回到    │
    │  working) │
    └───────────┘

状态详解

状态含义触发条件
submitted任务已提交,等待 Agent 接收客户端调用 tasks/send 成功后
workingAgent 正在处理任务Agent 开始执行,或收到补充信息后恢复执行
input_requiredAgent 需要更多信息才能继续Agent 发现任务描述不够明确,主动请求补充
completed任务成功完成,artifacts 可获取Agent 执行完毕,生成了完整结果
failed任务执行失败遇到不可恢复的错误(如数据库连接失败、LLM 调用失败)
cancelled任务被客户端取消客户端调用 tasks/cancel

4.3 input_required:A2A 最精妙的设计之一

传统 API 调用中,如果参数不完整,服务器直接返回 400 Bad Request。

A2A 的 input_required 状态允许 Agent 主动请求补充信息,这才是真正的「对话式协作」:

# === 场景:不完整的任务描述 ===

# 客户端发送任务
POST /a2a
{
  "method": "tasks/send",
  "params": {
    "taskId": "task_001",
    "message": {
      "role": "user",
      "parts": [{"type": "text", "text": "帮我分析一下用户数据"}]
    }
  }
}

# Agent 回复:需要补充信息
{
  "taskId": "task_001",
  "status": {
    "state": "input_required",
    "message": {
      "role": "agent",
      "parts": [{"type": "text", "text": "请问您想分析哪个时间范围的数据?以及关注哪些指标(如 DAU、留存率、转化率)?"}]
    }
  }
}

# 客户端补充信息(注意:这是同一个人机对话的延续)
POST /a2a
{
  "method": "tasks/send",
  "params": {
    "taskId": "task_001",  # 同一个 taskId
    "message": {
      "role": "user",
      "parts": [{"type": "text", "text": "分析 Q2 季度的 DAU 和 7 日留存率"}]


---

> **温馨提示**:本文篇幅较长,已截取核心部分。完整版本请访问程序员茄子官网查看。

推荐文章

Vue中如何使用API发送异步请求?
2024-11-19 10:04:27 +0800 CST
7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
Go 接口:从入门到精通
2024-11-18 07:10:00 +0800 CST
js常用通用函数
2024-11-17 05:57:52 +0800 CST
阿里云发送短信php
2025-06-16 20:36:07 +0800 CST
程序员茄子在线接单