如何用AgentRun打造高效A2A多Agent协同管理平台?

摘要:当我们把一个复杂业务拆解成多个专职 Agent 时,随之而来的问题是:这些 Agent 怎么知道彼此的存在?怎么找到对方、理解对方的能力、发起调用? A2A(Agent-to-Agent)协议给出了标准答案。它由 Google 主导提出,通
当我们把一个复杂业务拆解成多个专职 Agent 时,随之而来的问题是:这些 Agent 怎么知道彼此的存在?怎么找到对方、理解对方的能力、发起调用? A2A(Agent-to-Agent)协议给出了标准答案。它由 Google 主导提出,通过 AgentCard 让每个智能体对外自描述能力与接入方式,通过服务发现让调用方动态感知可用 Agent 的全貌。然而,协议只定义了规范,生产落地还需要一套完整的管理体系——注册、隔离、权限控制、多环境管理,缺一不可。 AgentRun 在 A2A 协议之上构建了这套体系。本文从原理出发,以「希希咖啡厅」多 Agent 系统为例,完整演示如何在 AgentRun 中完成从工作空间搭建、发现端点配置,到用 Go SDK 拉取 AgentCard、与 Agent 完成一轮对话的全链路流程。 A2A 协议原理 理解 AgentRun 的多 Agent 管理之前,有必要先掌握 A2A 协议的核心机制。这部分不涉及 AgentRun 的具体实现,而是 A2A 协议本身的运作原理。 AgentCard:智能体的自我介绍 A2A 协议中,每个智能体都通过一份 AgentCard 对外声明自己的身份和能力。AgentCard 是一份标准 JSON 文档,描述了: 是谁:Agent 的名称、描述、版本、提供方 能做什么:技能列表(Skills),每个技能有 ID、名称、描述和示例问法 怎么访问:服务地址(URL)、支持的传输协议(JSON-RPC / gRPC) 有什么限制:认证方式(OAuth2、API Key 等)、是否支持流式响应 按照 A2A 标准,AgentCard 默认托管在 /.well-known/agent-card.json 路径下,客户端只需知道 Agent 的 Base URL,就能拿到这份自描述文档,进而决定如何与它通信。 一个典型的 AgentCard 结构如下: { "name": "coffee_agent", "description": "希希咖啡店智能服务,可以帮助点咖啡和查询订单", "url": "https://agent.example.com/agent", "version": "0.0.1", "capabilities": { "streaming": true, "pushNotifications": true, "stateTransitions": ["submitted", "working", "completed", "failed"] }, "skills": [ { "id": "coffee_agent-get_products", "name": "获取商品列表", "description": "获取当前可点的咖啡饮品列表", "examples": ["有什么咖啡推荐", "看看菜单"] }, { "id": "coffee_agent-create_order", "name": "创建订单", "description": "帮用户下单点咖啡", "examples": ["我要一杯拿铁", "下单两杯美式"] } ] } 服务发现:谁在这个网络里? 有了 AgentCard 规范,还缺一个关键问题的答案:我怎么知道有哪些 Agent 可以调用? A2A 协议本身没有定义中心化的注册表,实际项目中通常需要一个「发现层」来管理 Agent 的注册和查询。发现层的职责是:接受一个查询(如「给我这个环境里所有可用的 Agent」),返回每个 Agent 的 AgentCard URL,调用方再逐一拉取 AgentCard 完成能力感知。 通信机制:JSON-RPC 2.0 + Task 模型 A2A 协议的核心是 JSON-RPC 2.0 消息格式,配合 Task 任务模型来实现 Agent 间的通信。
阅读全文