当前位置: 首页 > news >正文

第二篇:Agent2Agent (A2A) 协议——A2A 架构、组件和通信动态

上一篇我们探讨了 Agent2Agent (A2A) 协议的诞生背景和核心理念,理解了它如何弥合 AI 代理间的互操作性鸿沟,以及它与模型上下文协议(MCP)的互补关系。现在,让我们深入 A2A 的内部,剖析其架构、关键组件和通信动态,揭示其如何构建协作式 AI 的结构化语言。


1. 代理卡(Agent Card):AI 的数字名片,用于发现

代理卡是 A2A 中的一个基本概念,充当 AI 代理的数字“名片”。它描述了代理向其他代理宣传其能力和技能的方式。当两个 AI 系统需要交互时,它们首先交换这些代理卡以了解彼此可用的服务。

代理卡是一个标准化的 JSON 元数据文件,通过一个众所周知的 HTTP GET 端点访问,通常是代理基本 URL 下的 /.well-known/agent.json。这提供了一个一致的位置来存储网络中的能力信息,类似于网站的 robots.txt 文件。代理卡包含代理身份、能力、支持的数据格式和身份验证需求的机器可读表示。关键字段包括代理的 namedescription;代理 A2A 服务的 url;代理的 versioncapabilities 标志(例如 streamingpushNotificationsstateTransitionHistory);authentication 要求和方案(例如 apiKeyOAuth 2.0);defaultInputModesdefaultOutputModes(例如 text);以及详细说明所提供特定功能的 skills 数组,包括 idnamedescriptioninputModesoutputModesexamples

这种元数据实现了动态发现,允许协调器或客户端代理查询代理卡以了解其功能和通信方法,从而减少了硬编码集成的需求。代理卡不仅仅用于发现;它明确包含了“身份验证要求和安全方案”。这意味着安全性本身就内置于发现机制中。攻击者发布“伪造的 /.well-known/agent.json”或“配置错误的终结点”可能导致“任务劫持、数据泄露和代理冒充”。这凸显了代理卡在 A2A 生态系统中作为关键信任锚点的作用。其完整性和正确配置对于防止“代理卡欺骗”等安全漏洞至关重要。因此,采用 A2A 的组织必须围绕代理注册、验证和持续监控代理卡完整性实施强大的治理,以防止恶意代理渗透其多代理系统。这使得部分安全负担从运行时检查转移到发现和注册阶段。


2. 任务、消息和部分(Part):协作的结构化语言

A2A 协议定义了通信的结构化层次,确保了跨不同代理交互的清晰性和互操作性。

任务:工作的基本单元。 在 A2A 中,“任务”是一个结构化对象,代表了由客户端向代理发布的工作原子单元或请求。任务具有明确定义的生命周期状态:submitted(已提交)、working(工作中)、input-required(需要输入)、completed(已完成)、failed(失败)或 canceled(已取消)。还存在一个 Unknown(未知)状态。每个任务都包含:一个唯一 ID(通常是 UUID)、一个可选的 sessionID 用于分组相关任务、一个包含当前状态和时间戳的 Status 对象、可选的 artifacts(生成的输出)、可选的对话 history 以及可选的 metadata。在此框架内,代理既可以充当客户端(发起任务),也可以充当服务器(处理任务)。

任务的明确定义及其“明确定义的生命周期”和唯一 ID 是与无状态 API 调用的显著区别。这种设计选择本质上支持**“长时间运行的任务”,并允许在单个可跟踪的上下文中进行“多轮对话”**。任务对象中包含 historyartifacts 进一步表明 A2A 旨在实现可审计性和复杂工作流管理,而不仅仅是简单的请求-响应。这种以任务为中心的方法意味着 A2A 不仅仅是一个通信层,更是一个工作流编排的促成者。它允许构建更具弹性且可追溯的多代理系统,这对于企业应用程序至关重要,因为在这些应用程序中,问责制和调试复杂分布式流程的能力是首要任务。这种设计有助于实现“智能工作流编排”和“统一治理”。

消息:对话中的一轮。消息”代表任务中的单轮通信。它包含一个 Role(“user”表示客户端代理,“agent”表示远程代理)和 Parts(实际内容),并带有可选的元数据。消息用于客户端和远程代理之间的对话式交换。

部分:基本内容单元。部分”是消息或工件中自包含的数据块,代表内容的基本单元。这个概念是 A2A 支持多模态通信的基础。协议定义了三种基本部分类型:TextPart(包含纯文本内容);FilePart(通过 file 对象表示二进制数据,可以是 base64 编码的字节或 URI);以及 DataPart(包含结构化 JSON 信息,适用于表单和结构化结果)。


3. 工件:在多模态世界中交付成果

工件”(Artifacts)是远程代理在任务执行过程中生成的不可变结果或输出。它们代表了代理工作的最终或中间可交付成果。

与消息类似,工件由一个或多个 Part 对象组成,允许输出是多模态的。这意味着代理不仅可以返回纯文本,还可以返回文件(例如,PDF 徽章、确认电子邮件、账户凭证)、图像、结构化数据(例如,JSON 摘要),甚至视频。工件可以包含可选的 namedescription 字段、指定格式的内容 parts 数组、用于排序的 index 值,以及用于流式传输场景的 appendlastChunk 标志。工件的示例包括生成的文档、结构化数据摘要、图像、报告、数据集、代码或设计文件。

A2A 协议强调“不可变结果”以及能够包含“多种不同类型内容的部分”,这表明 A2A 的设计不仅仅是为了基于文本的聊天。这种设计使得代理能够交付复杂的、丰富的输出,这些输出可以直接被其他代理或人工用户消费或进一步处理。例如,将“图表作为原始数据或图像”返回展示了这种灵活性。这直接支持了**“模态无关设计”**原则。因此,健壮的工件机制对于实现实际的、现实世界中的 AI 应用程序至关重要,因为在这些应用程序中,输出通常是多模态的,并且需要由各种下游系统或人工用户消费。它促进了代理之间更完整、更有用的交互,超越了简单的对话回合,实现了切实的、可操作的交付成果。


4. 通信流:从发现到完成(HTTP、JSON-RPC、SSE、Webhooks)

A2A 协议通过明确定义的通信流来协调代理交互,利用标准网络技术实现灵活性和可扩展性。

底层协议。 A2A 建立在标准网络协议之上:HTTP/HTTPS 作为主要的传输层,提供熟悉的请求-响应模型用于消息交换。生产系统必须使用 HTTPS 和现代 TLS 密码以确保安全。JSON-RPC 2.0 用于请求/响应消息,实现标准化方法调用。

典型交互生命周期:

  1. 能力发现: 客户端代理从其众所周知的端点 (/.well-known/agent.json) 获取远程代理的代理卡,以了解其能力、支持的格式和身份验证需求。
  1. 任务启动: 客户端代理生成唯一的任务 ID,并将初始消息(用户查询/指令)作为负载的一部分发送到远程代理的 A2A 端点,以启动任务执行。
  1. 任务处理和生命周期: 远程代理处理任务。它可以:
  • 通过工件立即响应结果。
  • 发送中间消息。
  • 请求更多信息(将状态设置为 input-required),从而实现多轮对话。
  • 任务通过状态(submittedworkingcompletedfailedcanceled)进行推进。
  1. 完成: 任务最终达到终止状态。客户端可以使用 tasks/get 获取所有工件。

任务管理通信方法:

  • tasks/send 启动或继续任务,期望单个响应(同步请求/响应)。适用于快速任务。
  • tasks/sendSubscribe 启动任务并提供流式更新。这建立了用于实时更新的持久连接。
  • Server-Sent Events (SSE): A2A 利用 SSE 进行流式连接,允许服务器通过开放的 HTTP 连接向客户端发送实时更新(例如进度、部分输出、文件)。
  • Webhooks(推送通知): 对于不适合保持开放连接的长时间运行任务,客户端可以通过 tasks/pushNotification/set 注册 webhook URL 以接收异步更新。远程代理在更新发生时向注册的 webhook URL 发送 HTTP POST 请求。
  • tasks/get 检索特定任务的当前状态。
  • tasks/cancel 请求取消正在进行的任务。

A2A 对同步 (tasks/send) 和异步/流式 (tasks/sendSubscribe、SSE、webhooks) 通信模式的支持是一项关键的设计选择。这种灵活性使得协议能够处理各种人工智能工作负载,从快速、即时查询(例如,获取天气更新)到需要持续更新或推送通知的复杂、长时间运行的流程(例如,生成报告、协调招聘流程)。这种适应性对于存在多样化操作需求的企业采用至关重要。这种混合方法确保 A2A 不是“一刀切”的解决方案,而是“因地制宜”的协议。它允许开发人员根据任务的性质优化延迟、资源利用和用户体验,使 A2A 成为在现实世界场景中协调各种 AI 代理行为的高度实用和多功能的解决方案。


组件

描述

关键属性/内容

在通信中的作用

代理卡 (Agent Card)

AI 代理的数字“名片”,宣传其能力和技能。

name, description, url, version, capabilities (streaming, pushNotifications), authentication schemes, skills (id, name, description, inputModes, outputModes, examples)

用于代理发现和理解如何与另一个代理交互。

任务 (Task)

工作或请求的基本、有状态单元,由客户端发送给代理。

id (UUID), sessionID (可选), Status (current state, timestamp), artifacts (可选), history (可选), metadata (可选)

封装整个交互过程,支持长时间运行任务和多轮对话,实现可追溯的工作流管理。

消息 (Message)

任务中的单轮通信。

Role ("user" 或 "agent"), Parts (实际内容), metadata (可选)

用于客户端和远程代理之间的对话式交换。

部分 (Part)

消息或工件中的基本内容单元,自包含。

TextPart (纯文本), FilePart (二进制数据,base64 或 URI), DataPart (结构化 JSON)

支持多模态通信,允许交换文本、文件和结构化数据。

工件 (Artifact)

远程代理在任务执行期间生成的不可变结果或输出。

name (可选), description (可选), parts (内容部分数组), index (排序), append (流式传输), lastChunk (流式传输)

交付任务的最终或中间成果,支持多模态输出。

该表格清晰地定义了 A2A 协议中的关键术语和结构化对象,这些对象与传统 API 概念不同。它为开发人员提供了快速参考,以掌握 A2A 通信的构建块,并理解这些组件如何协同工作以形成整体通信流,从而强化了“协作的结构化语言”。


相关文章:

  • C++基础学习:深入理解类中的构造函数、析构函数、this指针与new关键字
  • java复习 07
  • Rust 学习笔记:通过 Send 和 Sync trait 实现可扩展并发性
  • C++11列表初始化:从入门到精通
  • 电脑扩展屏幕工具
  • dbeaver 查询clickhouse,数据库时间差了8小时
  • echarts 数据大屏(无UI设计 极简洁版)
  • 条件概率:AI大模型概率统计的基石
  • (二)TensorRT-LLM | 模型导出(v0.20.0rc3)
  • 二叉树进阶:经典算法题详解
  • 6月10日day50打卡
  • 可视化图解算法50:最小的K个数
  • SpringBoot集成Tess4j :低成本解锁OCR 图片识别能力
  • 鹰盾视频的AI行为检测是怎样的风控?
  • [极客时间]LangChain 实战课 ----- 01|LangChain系统安装和快速入门(2)
  • 第四章 软件需求工程
  • 论文略读: CUT YOUR LOSSES IN LARGE-VOCABULARY LANGUAGE MODELS
  • 如何通过DNS解析实现负载均衡?有哪些优势?
  • 期权卖方是谁?
  • Linux动态库与静态库详解:从入门到精通
  • 成都建设网站首页/seo门户 site
  • 怎样看一个网站是哪个公司做的/郑州seo学校
  • 澳门/重庆seo优
  • 考虑了软件开发过程中的风险/鹤壁seo推广
  • 哈尔滨悦创网络科技网站开发/最有效的推广方式
  • 网上开店平台有哪些/深圳高端seo外包公司