
系列文章说明:本文是 A2A 协议完整指南的第二部分,重点介绍流式操作、异步处理、扩展机制和任务生命周期管理。第一部分请查看 2025 Complete Guide: Agent2Agent (A2A) Protocol - The New Standard for AI Agent Collaboration
🎯 核心要点 (TL;DR)
- 流式处理:A2A 支持 Server-Sent Events (SSE) 实现实时数据流传输和增量结果处理
- 异步操作:通过推送通知机制支持长时间运行的任务,适合移动端和无服务器场景
- 扩展系统:灵活的扩展机制允许自定义协议行为,支持数据扩展、方法扩展和配置文件扩展
- 任务管理:完整的任务生命周期管理,支持任务跟踪、状态更新和工件管理
目录
流式操作与Server-Sent Events {#streaming-operations}
什么是流式处理?
A2A 协议的流式处理机制专门设计用于处理那些需要长时间运行、产生增量结果或需要实时反馈的 AI 任务。通过 Server-Sent Events (SSE) 技术,客户端可以实时接收任务进度更新和部分结果。
流式处理的核心特性
| 特性 | 描述 | 使用场景 |
|---|---|---|
| 实时更新 | 通过 SSE 推送任务状态变化 | 长文档生成、媒体流处理 |
| 增量结果 | 分块传输大型工件 | 大文件处理、实时分析 |
| 连接管理 | 支持断线重连和状态恢复 | 网络不稳定环境 |
| 事件类型 | 多种事件类型支持不同更新需求 | 状态更新、工件更新 |
流式处理工作流程
graph TD
A[客户端发起 message/stream 请求] --> B[服务器检查流式支持]
B --> C{支持流式处理?}
C -->|是| D[建立 SSE 连接]
C -->|否| E[返回错误响应]
D --> F[开始任务处理]
F --> G[发送状态更新事件]
G --> H[发送工件更新事件]
H --> I{任务完成?}
I -->|否| G
I -->|是| J[发送 final: true 事件]
J --> K[关闭 SSE 连接]
关键实现要点
1. 服务器能力声明
{
"capabilities": {
"streaming": true
}
}
2. 事件结构
A2A 流式处理支持三种主要事件类型:
- Task 事件:表示正在处理的任务状态单元
- TaskStatusUpdateEvent:传达任务生命周期状态变化
- TaskArtifactUpdateEvent:传递新生成或更新的工件
💡 专业提示 每个 SSE 事件的
data字段都包含一个完整的 JSON-RPC 2.0 响应对象,确保与标准协议的兼容性。
3. 断线重连机制
{
"method": "tasks/resubscribe",
"params": {
"taskId": "task-123"
}
}
适用场景
✅ 推荐使用流式处理的场景:
- 实时进度监控的长时间运行任务
- 大型结果的增量接收处理
- 需要即时反馈的交互式对话
- 要求低延迟更新的应用
异步操作与推送通知 {#async-operations}
推送通知机制概述
对于超长时间运行的任务(分钟、小时甚至天级别)或无法维持持久连接的客户端(如移动应用、无服务器函数),A2A 提供了基于 Webhook 的推送通知机制。
推送通知配置
PushNotificationConfig 结构
{
"url": "https://client.example.com/webhook",
"token": "client-generated-secret-token",
"authentication": {
"schemes": ["Bearer", "HMAC"],
"details": {
"issuer": "a2a-server.example.com",
"audience": "client-webhook"
}
}
}
配置方式对比
| 配置方式 | 时机 | 适用场景 |
|---|---|---|
| 请求内配置 | message/send 或 message/stream 时 | 一次性任务通知 |
| 独立配置 | 使用 tasks/pushNotificationConfig/set | 现有任务添加通知 |
推送通知工作流程
graph TD
A[客户端配置推送通知] --> B[服务器验证 Webhook URL]
B --> C[任务开始执行]
C --> D[任务状态发生重要变化]
D --> E[服务器向 Webhook 发送 POST 请求]
E --> F[客户端 Webhook 验证请求]
F --> G[客户端调用 tasks/get 获取完整状态]
G --> H[处理任务更新]
安全考虑
服务器端安全措施
⚠️ 重要安全提醒 服务器不应盲目信任客户端提供的 Webhook URL,需要实施以下安全措施:
-
URL 验证
- 维护可信域名白名单
- 实施所有权验证机制
- 使用网络出口控制
-
身份认证
- Bearer Token (OAuth 2.0)
- API Key 认证
- HMAC 签名验证
- 双向 TLS (mTLS)
客户端端安全措施
## 客户端 Webhook 安全检查清单
✅ 验证服务器身份(JWT 签名、HMAC 等)
✅ 检查 PushNotificationConfig.token
✅ 实施时间戳验证防止重放攻击
✅ 使用唯一 ID (nonce) 防止重复处理
✅ 安全的密钥管理和轮换
扩展机制详解 {#extensions}
扩展系统架构
A2A 的扩展系统允许在核心协议基础上添加自定义功能,而不破坏基础兼容性。扩展通过 URI 标识,支持版本管理和依赖关系。
扩展类型分类
| 扩展类型 | 描述 | 示例用途 |
|---|---|---|
| 数据扩展 | 仅在 AgentCard 中添加结构化信息 | GDPR 合规信息、服务条款 |
| 配置文件扩展 | 对核心协议添加结构和状态要求 | 医疗数据加密、FHIR 标准 |
| 方法扩展 | 添加全新的 RPC 方法 | 任务历史搜索、批量操作 |
扩展声明示例
{
"name": "Magic 8-ball",
"capabilities": {
"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",
"You might deny it, but we've seen the evidence of those cows."
]
}
}
]
}
}
扩展激活流程
graph TD
A[客户端请求扩展激活] --> B[添加 X-A2A-Extensions 头]
B --> C[服务器检查支持的扩展]
C --> D[验证扩展依赖关系]
D --> E[激活兼容扩展]
E --> F[返回 X-A2A-Extensions 响应头]
F --> G[执行扩展逻辑]
扩展开发最佳实践
版本管理策略
## 扩展版本管理规范
- 使用 URI 路径包含版本号:`/ext/my-extension/v1`
- 破坏性更改必须使用新 URI
- 服务器不应自动降级到不同版本
- 建议使用永久标识符服务(如 w3id.org)
打包和分发
# 示例:Python 服务器集成
from konami_code_extension import CheatCodeHandler
from a2a.server import A2AServer, DefaultRequestHandler
extension = CheatCodeHandler()
extension.add_cheat(
code="motherlode",
hint="When your sims need extra cash fast"
)
request_handler = DefaultRequestHandler(
agent_executor=MyAgentExecutor(extension),
task_store=InMemoryTaskStore(),
extensions=[extension]
)
任务生命周期管理 {#task-lifecycle}
任务状态机
A2A 协议中的任务遵循明确的生命周期状态机,支持复杂的工作流管理。
graph TD
A[创建任务] --> B[working]
B --> C{需要输入?}
C -->|是| D[input-required]
C -->|否| E{需要授权?}
E -->|是| F[auth-required]
E -->|否| G{任务完成?}
G -->|成功| H[completed]
G -->|失败| I[failed]
G -->|取消| J[canceled]
D --> K[接收输入] --> B
F --> L[完成授权] --> B
上下文和任务关系
contextId 的作用
- 逻辑组合:将多个任务和独立消息组织在一起
- 上下文管理:为 LLM 提供持续的对话上下文
- 协作支持:支持围绕共同目标的多任务协作
任务不可重启原则
💡 设计理念 一旦任务达到终止状态,就不能重新启动。这种设计带来以下好处:
- 任务不变性:客户端可以可靠地引用任务及其状态
- 清晰的工作单元:每个请求、细化或后续操作都成为独立的任务
- 简化实现:避免了重启现有任务的复杂性
任务细化和后续操作
并行后续任务示例
任务 1:预订到赫尔辛基的航班
(任务 1 完成后)
任务 2:基于任务 1,预订酒店
任务 3:基于任务 1,预订雪地摩托活动
(任务 2 完成后,任务 3 仍在进行中)
任务 4:基于任务 2,在酒店预订中添加水疗服务
工件引用机制
{
"message": {
"contextId": "ctx-conversation-abc",
"referenceTaskIds": ["task-boat-gen-123"],
"parts": [
{
"kind": "text",
"text": "Can you make the sailboat red?",
"metadata": {
"referenceArtifacts": [
{
"artifactId": "artifact-boat-v1-xyz",
"taskId": "task-boat-gen-123"
}
]
}
}
]
}
}
工件变更跟踪
| 策略 | 实现方式 | 优势 |
|---|---|---|
| 相同名称 | 细化任务保持原工件名称 | 便于客户端识别关联关系 |
| 新 ID | 每次变更生成新的 artifactId | 确保版本唯一性 |
| 客户端管理 | 由客户端维护工件版本链 | 灵活的版本控制策略 |
安全考虑 {#security}
推送通知安全架构
graph TD
A[A2A 服务器] --> B[验证 Webhook URL]
B --> C[身份认证到客户端]
C --> D[发送签名通知]
D --> E[客户端 Webhook]
E --> F[验证服务器身份]
F --> G[检查通知令牌]
G --> H[防重放攻击验证]
H --> I[处理通知]
JWT + JWKS 安全流程示例
服务器端实现
{
"iss": "a2a-server.example.com",
"aud": "client-webhook.example.com",
"iat": 1640995200,
"exp": 1640995500,
"jti": "unique-notification-id-123",
"taskId": "task-abc-456"
}
客户端验证步骤
- 从 Authorization 头提取 JWT
- 检查 JWT 头中的
kid(密钥 ID) - 从 A2A 服务器的 JWKS 端点获取公钥
- 验证 JWT 签名
- 验证声明(iss、aud、iat、exp、jti)
- 检查 PushNotificationConfig.token
最佳实践 {#best-practices}
流式处理最佳实践
✅ 推荐做法
- 实现客户端缓冲机制处理网络波动
- 使用指数退避策略进行重连
- 为大型工件实施分块传输
- 提供用户友好的进度指示器
异步操作最佳实践
## Webhook 实现检查清单
✅ 实施 URL 所有权验证
✅ 使用 HTTPS 和证书验证
✅ 实现请求签名验证
✅ 添加速率限制和防护机制
✅ 记录所有通知事件用于调试
✅ 实施优雅的错误处理和重试
扩展开发最佳实践
| 实践 | 描述 | 好处 |
|---|---|---|
| 最小化 required 扩展 | 仅对核心功能标记为必需 | 保持客户端兼容性 |
| 完整的输入验证 | 验证所有扩展相关数据 | 提高安全性和稳定性 |
| 清晰的文档 | 提供详细的规范文档 | 促进采用和正确实现 |
| 版本兼容性 | 谨慎处理破坏性更改 | 保护现有集成 |
常见问题解答 {#faq}
Q: 流式处理和推送通知应该如何选择?
A: 选择依据主要看任务特性和客户端能力:
- 流式处理:适合需要实时反馈、任务执行时间较短(分钟级)、客户端能维持连接的场景
- 推送通知:适合长时间运行任务(小时/天级)、移动端应用、无服务器函数等无法维持长连接的场景
Q: 扩展的依赖关系如何管理?
A: 扩展依赖关系在扩展规范中声明,客户端负责激活扩展及其所有必需依赖。如果客户端未请求必需依赖,服务器应该拒绝请求并返回适当错误。
Q: 任务失败后如何恢复?
A: 任务一旦达到终止状态就无法重启。需要恢复时,应该:
- 使用相同的 contextId 发起新请求
- 通过 referenceTaskIds 引用失败的任务
- 在新任务中处理错误恢复逻辑
Q: 如何确保推送通知的可靠性?
A: 推送通知可靠性策略包括:
- 实施重试机制和指数退避
- 使用消息队列确保传递
- 提供通知状态查询接口
- 实施客户端主动轮询作为备选方案
Q: 扩展版本升级时如何保持兼容性?
A: 版本升级策略:
- 非破坏性更改可以在同一 URI 下更新
- 破坏性更改必须使用新的 URI
- 服务器可以同时支持多个版本
- 提供迁移指南和过渡期支持
总结与下一步行动
A2A 协议的高级特性为 AI 代理间的复杂交互提供了强大的基础设施支持。通过流式处理、异步操作、扩展机制和完整的任务生命周期管理,开发者可以构建出更加灵活、可靠和可扩展的 AI 代理系统。
立即行动建议
- 评估现有系统:分析当前 AI 代理交互模式,识别可以受益于 A2A 高级特性的场景
- 原型开发:选择一个具体用例,实现流式处理或推送通知的原型
- 安全规划:制定推送通知的安全策略和 Webhook 实现方案
- 扩展设计:考虑业务特定需求,设计相应的扩展规范
相关资源
本文是 A2A 协议完整指南系列的第二部分,专注于协议的高级特性和实际应用。随着 A2A 协议的不断发展,我们将持续更新本指南以反映最新的功能和最佳实践。
🚀 快速入门案例
基础示例
- A2A Samples: Hello World Agent (May 28, 2025)
- 使用 A2A Python SDK 构建 Hello World 代理的完整指南
- 包含详细的环境设置和测试说明
货币转换代理
- Implementing CurrencyAgent with A2A Python SDK (May 21, 2025)
- 构建货币转换代理的分步指南
- 集成 OpenRouter AI 服务
🐍 Python 实现案例
GitHub 集成
- A2A Python Sample: Github Agent (June 16, 2025)
- 使用 a2a-python 创建和连接 GitHub 代理
- 实现代码仓库信息查询功能
旅行规划助手
- A2A Sample: Travel Planner OpenRouter (June 6, 2025)
- 集成 OpenRouter 的旅行规划代理实现
- 使用 Python a2a-sdk 构建
文件聊天工作流
- LlamaIndex File Chat Workflow with A2A Protocol (June 2, 2025)
- 使用 LlamaIndex Workflows 构建文件聊天代理
- 支持文件上传解析、多轮对话、实时流式传输
Python 教程系列
-
Google A2A Python SDK Tutorial (May 19, 2025)
- 使用 Python 构建 A2A 代理的综合指南
- 包含环境设置、代理实现、服务器部署
-
Python A2A Tutorial 20250513 (May 13, 2025)
- 学习使用 Python 构建和交互 A2A 代理
- 涵盖流式处理和多轮对话功能
-
Python A2A Tutorial with Source Code (May 4, 2025)
- 包含完整源代码的实践指南
- 集成本地 Ollama AI 模型和 Langchain
-
Python A2A Tutorial (May 2, 2025)
- 使用 google-a2a 库构建 Python A2A 服务器
- 集成 Ollama 和 LangChain
-
Python A2A: A Comprehensive Guide to Google's Agent2Agent Protocol (April 14, 2025)
- 掌握 Python A2A 协议构建可互操作的 AI 代理
- 从基础到复杂多代理工作流
-
Practical Guide to the Official A2A SDK Python (May 10, 2025)
- A2A SDK Python 开发深度教程
- 包含工作流程图和实用代码示例
🟨 JavaScript/TypeScript 案例
电影信息代理
- A2A JS Sample: Movie Agent (June 16, 2025)
- 使用 TMDB API 和 OpenRouter AI 集成
- Express.js 服务器实现
JavaScript SDK 教程
-
A2A JS SDK Complete Tutorial: Quick Start Guide (June 9, 2025)
- TypeScript 类型安全实现
- Express.js 服务器 SDK 和流式处理
-
A2A Protocol Development Guide(TypeScript) (April 11, 2025)
- 使用 TypeScript 掌握 A2A 协议
- 构建强大的代理通信系统
☕ Java 实现案例
- A2A Java Sample (June 5, 2025)
- Maven 多模块架构
- Spring Boot 服务器 SDK 实现
- AI 翻译服务示例
🔧 框架集成案例
ADK 集成
- Implementing A2A Agents with ADK: Complete Development Guide (July 15, 2025)
- 使用 Google ADK 框架实现 A2A 智能代理系统
- 涵盖完整开发流程
费用报销代理
- A2A ADK Expense Reimbursement Agent (July 10, 2025)
- 基于 Google ADK 和 A2A 协议的智能费用报销代理
- 自动生成表单补充信息
CrewAI 集成
- A2A + CrewAI + OpenRouter Chart Generation Agent Tutorial (June 25, 2025)
- 使用 OpenRouter、CrewAI 和 A2A 协议构建图表生成代理
- 端到端代理开发教程
LangGraph 集成
- Building an A2A Currency Agent with LangGraph (May 13, 2025)
- 使用 LangGraph 和 Google Gemini 模型构建货币代理
- 详细解释组件和数据流
🔗 协议集成案例
MCP 协议集成
-
A2A MCP AG2 Intelligent Agent Example (July 2, 2025)
- 使用 AG2 框架构建的 A2A 协议智能代理
- 集成 MCP 协议和 YouTube 字幕处理功能
-
A2A MCP Integration (June 4, 2025)
- A2A 和 MCP 集成的分步指南
- 使用 Python SDK 和 OpenRouter 构建 AI 代理
🛠️ 开发工具和 SDK
.NET SDK
- A2A .NET SDK Comprehensive Documentation (July 3, 2025)
- 实现 Google A2A Protocol v0.2.1 的 .NET 库
- 适用于 ASP.NET Core 应用程序
调试工具
-
A2A Inspector: A Deep Dive into Agent2Agent Communication Debugging (June 18, 2025)
- 基于 Web 的强大调试工具
- 实时检查代理卡片和 JSON-RPC 通信
-
Using A2A Protocol Validator to Verify Domain Support for A2A Protocol (June 3, 2025)
- 使用 A2A Protocol Validator 验证 A2A 协议
- 可视化 AgentCard 便于调试
📚 技术规范和最佳实践
协议规范
- A2A Protocol Specification (Python) (July 16, 2025)
- Python 实现规范的综合指南
- 涵盖代理卡片、消息传递、任务管理等核心功能
示例和方法
- A2A Sample Methods and JSON Responses (April 12, 2025)
- 展示 A2A 协议核心方法的详细指南
- 包含实用的 JSON 示例
协议理解
- Understanding A2A Protocol: A Comprehensive Guide (April 10, 2025)
- 理解 A2A 协议的综合指南
- 核心概念和 AI 代理互操作性优势
🌟 生态系统和资源
实现集合
- A2A Implementations (May 2, 2025)
- 探索各种 A2A 协议的开源实现
- 包括 Java、TypeScript、Go、Rust、Python 等
资源目录
- Awesome A2A Directory (April 19, 2025)
- 探索 Google A2A 协议的完整生态系统
- 包含官方文档、社区实现、示例项目和集成指南
📊 协议比较和分析
协议对比
-
A2A vs MCP vs ACP Protocol Comparison Analysis Report (July 5, 2025)
- A2A 和 ACP 协议的详细比较分析
- 跨平台互操作性 vs 本地边缘自主性
-
A2A vs MCP vs AG-UI (May 16, 2025)
- AG-UI、MCP 和 A2A 协议的深度分析
- 技术实现和应用场景探索
-
A2A vs MCP: The Protocol Revolution in AI Architecture (April 10, 2025)
- 理解 A2A 协议与 MCP 的综合指南
-
AI Protocols Analysis Report: A2A, MCP, and ACP (May 9, 2025)
- 深入分析 MCP、ACP 和 A2A 协议
- 核心功能、实现特征和安全特性
-
A2A MCP: Predicting the Winner in AI Protocol Evolution (June 10, 2025)
- A2A MCP 协议的综合比较分析
- 预测 A2A MCP 在互操作性、可扩展性方面的未来发展
Related Articles
Explore more content related to this topic
A2UI Introduction - Declarative UI Protocol for Agent-Driven Interfaces
Discover A2UI, the declarative UI protocol that enables AI agents to generate rich, interactive user interfaces. Learn how A2UI works, who it's for, how to use it, and see real-world examples from Google Opal, Gemini Enterprise, and Flutter GenUI SDK.
Agent Gateway Protocol (AGP): Practical Tutorial and Specification
Learn the Agent Gateway Protocol (AGP): what it is, problems it solves, core spec (capability announcements, intent payloads, routing and error codes), routing algorithm, and how to run a working simulation.
Integrating A2A Protocol - Intelligent Agent Communication Solution for BeeAI Framework
Using A2A protocol instead of ACP is a better choice for BeeAI, reducing protocol fragmentation and improving ecosystem integration.
A2A vs ACP Protocol Comparison Analysis Report
A2A (Agent2Agent Protocol) and ACP (Agent Communication Protocol) represent two mainstream technical approaches in AI multi-agent system communication: 'cross-platform interoperability' and 'local/edge autonomy' respectively. A2A, with its powerful cross-vendor interconnection capabilities and rich task collaboration mechanisms, has become the preferred choice for cloud-based and distributed multi-agent scenarios; while ACP, with its low-latency, local-first, cloud-independent characteristics, is suitable for privacy-sensitive, bandwidth-constrained, or edge computing environments. Both protocols have their own focus in protocol design, ecosystem construction, and standardization governance, and are expected to further converge in openness in the future. Developers are advised to choose the most suitable protocol stack based on actual business needs.
Building an A2A Currency Agent with LangGraph
This guide provides a detailed explanation of how to build an A2A-compliant agent using LangGraph and the Google Gemini model. We'll walk through the Currency Agent example from the A2A Python SDK, explaining each component, the flow of data, and how the A2A protocol facilitates agent interactions.