一文秒懂A2A协议

53 阅读5分钟

A2A协议的核心原理可以概括为:通过标准化的“身份名片”让智能体互相认识,通过统一的“消息格式”让智能体互相沟通,通过结构化的“任务流程”让智能体协作完成目标。本质上是给智能体制定了一套“社交规则”,就像人类用名片介绍自己、用语言沟通、用流程协作一样。

核心原理拆解

  1. 智能体身份与能力标准化(Agent Card)
    每个智能体必须公开一个“身份名片”(JSON格式),明确告诉别人:我是谁、我能做什么、怎么联系我、需要什么权限。这是互操作的基础——就像人类合作前先交换名片了解对方能力。

  2. 消息格式标准化
    所有智能体之间的通信内容(请求、响应、状态更新)必须遵循统一格式,包含“任务ID、发送者、接收者、内容类型、数据”等关键字段。确保即使是不同团队开发的智能体,也能看懂对方的“话”。

  3. 任务生命周期标准化
    任何协作都被抽象为“任务”,从创建到完成有明确的状态(待处理、处理中、需输入、完成、失败等),并支持实时状态同步。就像项目管理中的任务流,所有人都能跟踪进度。

伪代码示例(核心流程)

下面用一个具体场景演示:旅行规划智能体(TravelAgent)调用航班查询智能体(FlightAgent)查询从北京到上海的航班

1. 首先:FlightAgent 发布自己的“身份名片”(Agent Card)

每个智能体在固定地址(如 /.well-known/agent.json)公开自己的能力,供其他智能体发现:

// FlightAgent 的 Agent Card(公开可访问)
{
  "agent_id": "flight-agent-123",  // 唯一身份ID
  "name": "航班查询智能体",
  "capabilities": [  // 支持的任务类型
    {
      "task_type": "flight_search",  // 任务类型:航班查询
      "input_schema": {  // 输入参数格式
        "from_city": "string",  // 出发城市
        "to_city": "string",    // 到达城市
        "date": "string"        // 日期(YYYY-MM-DD)
      },
      "output_schema": {  // 输出格式
        "flights": [
          { "flight_no": "string", "departure": "string", "arrival": "string", "price": "number" }
        ]
      }
    }
  ],
  "endpoint": "https://flight-agent.example.com/a2a",  // 通信接口地址
  "auth": { "type": "none" }  // 暂时无需认证
}

2. TravelAgent 发现并调用 FlightAgent

TravelAgent 首先获取 FlightAgent 的“名片”,确认其能处理“航班查询”任务,然后发送任务请求:

# 旅行规划智能体(TravelAgent)的代码逻辑
class TravelAgent:
    def __init__(self):
        self.agent_id = "travel-agent-456"
    
    def find_flight_agent(self):
        # 步骤1:获取 FlightAgent 的身份名片(实际中可能通过服务发现机制)
        flight_agent_card = requests.get("https://flight-agent.example.com/.well-known/agent.json").json()
        # 检查是否支持航班查询任务
        if "flight_search" in [cap["task_type"] for cap in flight_agent_card["capabilities"]]:
            return flight_agent_card
        else:
            raise Exception("该智能体不支持航班查询")
    
    def request_flight_search(self, flight_agent_card):
        # 步骤2:构造A2A标准格式的任务请求
        task_request = {
            "task_id": "task-789",  # 唯一任务ID(用于跟踪)
            "sender": self.agent_id,  # 发送者ID
            "receiver": flight_agent_card["agent_id"],  # 接收者ID
            "task_type": "flight_search",  # 任务类型(对应FlightAgent的能力)
            "input_data": {  # 符合input_schema的参数
                "from_city": "北京",
                "to_city": "上海",
                "date": "2025-11-01"
            },
            "timestamp": "2025-10-28T10:00:00Z"
        }
        
        # 步骤3:发送请求到FlightAgent的接口
        response = requests.post(
            url=flight_agent_card["endpoint"],
            json=task_request
        )
        return response.json()

3. FlightAgent 处理任务并响应

FlightAgent 收到请求后,按标准格式解析并处理,返回结果:

# 航班查询智能体(FlightAgent)的代码逻辑
class FlightAgent:
    def __init__(self):
        self.agent_id = "flight-agent-123"
        self.endpoint = "https://flight-agent.example.com/a2a"
    
    def handle_request(self, request):
        # 步骤1:验证请求格式(是否符合A2A标准)
        if not self._validate_request(request):
            return self._create_response(
                task_id=request["task_id"],
                status="failed",
                error="请求格式错误"
            )
        
        # 步骤2:处理航班查询任务
        if request["task_type"] == "flight_search":
            input_data = request["input_data"]
            # 模拟查询数据库获取航班信息
            flights = self._search_flights(
                from_city=input_data["from_city"],
                to_city=input_data["to_city"],
                date=input_data["date"]
            )
            
            # 步骤3:返回标准格式的响应
            return self._create_response(
                task_id=request["task_id"],
                status="completed",  # 任务状态:已完成
                output_data={"flights": flights}  # 符合output_schema的结果
            )
    
    def _create_response(self, task_id, status, output_data=None, error=None):
        # 构造A2A标准响应格式
        return {
            "task_id": task_id,
            "sender": self.agent_id,
            "receiver": request["sender"],
            "status": status,  # 任务状态:pending/completed/failed/needs_input
            "output_data": output_data,
            "error": error,
            "timestamp": "2025-10-28T10:01:00Z"
        }
    
    def _search_flights(self, from_city, to_city, date):
        # 模拟数据库查询
        return [
            {"flight_no": "CA185", "departure": "08:00", "arrival": "10:20", "price": 580},
            {"flight_no": "MU513", "departure": "14:30", "arrival": "16:45", "price": 650}
        ]

4. 任务状态跟踪(可选,复杂任务用)

如果任务需要长时间处理(比如需要人工审核),FlightAgent 可以通过 SSE(服务器发送事件)实时推送状态:

# FlightAgent 推送任务状态更新(用于长任务)
def send_status_update(task_id, new_status):
    # SSE格式:向订阅者推送状态
    sse_data = {
        "task_id": task_id,
        "status": new_status,  # 例如:"processing"(处理中)、"needs_input"(需补充信息)
        "message": "正在查询航班数据..."
    }
    # 通过WebSocket或SSE接口推送给订阅者(如TravelAgent)
    sse_server.send_event(task_id, sse_data)

原理总结

A2A协议的核心就是通过标准化的元数据(Agent Card) 解决“智能体互相认识”的问题,通过标准化的消息格式解决“智能体互相理解”的问题,通过标准化的任务生命周期解决“协作流程一致”的问题。

就像人类协作时:

  • 先看名片(Agent Card)知道对方能做什么;
  • 用共同语言(标准消息格式)沟通;
  • 按约定流程(任务状态)推进工作。

这样一来,无论智能体是用Python、Java开发,还是来自Google、阿里,都能“无缝对话”。