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

Strands Agents A2A 协议实战:让多个 AI Agent 互相对话

Strands Agents A2A 协议实战:让多个 AI Agent 互相对话

最近在搞一个业务场景——订单处理 Agent 需要调用库存查询 Agent 的能力,库存不够时还要找采购 Agent 下补货单。

三个 Agent 各有各的职责,问题是怎么让它们互相"交流"。

翻了一下 Strands Agents SDK 的最新版本,发现它刚加了 A2A(Agent-to-Agent)协议支持,专门解决多 Agent 通信的问题。Agent 之间不用共享内存或数据库,而是通过标准 HTTP 协议互相发消息。

A2A 协议是什么

A2A 是一个开放协议(由 Google 发起,AWS 跟进支持),定义了 Agent 之间的通信标准:

  • 每个 Agent 暴露一个 AgentCard(类似 API 文档)
  • Agent 之间通过 HTTP JSON 消息通信
  • 支持同步请求-响应和异步任务
  • 有标准的能力发现机制

类比一下:MCP 是"Agent 调工具",A2A 是"Agent 调 Agent"。

搭建第一个 A2A Agent

安装 Strands SDK(需要 0.3.0+):

pip install strands-agents strands-agents-tools

先写一个库存查询 Agent,让它暴露 A2A 接口:

from strands import Agent
from strands.tools import tool
from strands.a2a import A2AServer@tool
def check_inventory(product_id: str) -> dict:"""查询产品库存数量"""# 实际场景连 DynamoDBinventory_db = {"SKU-001": {"name": "机械键盘", "stock": 42, "warehouse": "华东"},"SKU-002": {"name": "无线鼠标", "stock": 0, "warehouse": "华东"},"SKU-003": {"name": "显示器支架", "stock": 15, "warehouse": "华南"},}item = inventory_db.get(product_id)if not item:return {"error": f"产品 {product_id} 不存在"}return item@tool
def batch_check(product_ids: list) -> list:"""批量查询多个产品库存"""results = []for pid in product_ids:results.append({"product_id": pid, **check_inventory(pid)})return results# 创建库存 Agent
inventory_agent = Agent(model="us.anthropic.claude-sonnet-4-20250514-v1:0",system_prompt="""你是库存查询助手。- 收到产品ID时查询库存- 返回库存数量、仓库位置- 库存为0时标记"缺货"""",tools=[check_inventory, batch_check]
)# 启动 A2A Server
server = A2AServer(agent=inventory_agent,name="inventory-agent",description="查询产品库存数量和仓库位置",port=8001
)
server.run()

订单 Agent 调用库存 Agent

另一个服务里,订单 Agent 通过 A2A 协议调用库存 Agent:

from strands import Agent
from strands.a2a import A2AClient
from strands.tools import tool# 连接库存 Agent
inventory_client = A2AClient(agent_card_url="http://inventory-agent:8001/.well-known/agent.json"
)@tool
def query_inventory(product_id: str) -> dict:"""通过 A2A 协议调用库存 Agent 查询库存"""response = inventory_client.send_message(message=f"查询产品 {product_id} 的库存")return response.result@tool
def create_order(product_id: str, quantity: int, customer_id: str) -> dict:"""创建订单"""# 先检查库存stock_info = query_inventory(product_id)if stock_info.get("stock", 0) < quantity:return {"status": "failed","reason": f"库存不足,当前库存: {stock_info.get('stock', 0)}"}return {"status": "success","order_id": f"ORD-{customer_id}-{product_id}","product_id": product_id,"quantity": quantity,"warehouse": stock_info.get("warehouse")}order_agent = Agent(model="us.anthropic.claude-sonnet-4-20250514-v1:0",system_prompt="你是订单处理助手。收到下单请求时先查库存再创建订单。",tools=[query_inventory, create_order]
)# 这个 Agent 也可以暴露 A2A 接口
order_server = A2AServer(agent=order_agent,name="order-agent",description="处理订单创建、查询库存、生成物流单",port=8002
)
order_server.run()

部署到 ECS

三个 Agent 部署为 ECS 服务,互相通过 Service Discovery 发现:

# docker-compose.yml(本地开发用)
version: "3.8"
services:inventory-agent:build: ./inventory-agentports:- "8001:8001"environment:- AWS_REGION=us-east-1- BEDROCK_MODEL_ID=us.anthropic.claude-sonnet-4-20250514-v1:0order-agent:build: ./order-agentports:- "8002:8002"environment:- AWS_REGION=us-east-1- INVENTORY_AGENT_URL=http://inventory-agent:8001- BEDROCK_MODEL_ID=us.anthropic.claude-sonnet-4-20250514-v1:0procurement-agent:build: ./procurement-agentports:- "8003:8003"environment:- AWS_REGION=us-east-1- INVENTORY_AGENT_URL=http://inventory-agent:8001- ORDER_AGENT_URL=http://order-agent:8002- BEDROCK_MODEL_ID=us.anthropic.claude-sonnet-4-20250514-v1:0

生产环境用 ECS Service Connect 或 Cloud Map 做服务发现:

# 创建 namespace
aws servicediscovery create-private-dns-namespace \--name agents.local \--vpc vpc-0123456789abcdef0# 注册服务
aws servicediscovery create-service \--name inventory-agent \--namespace-id ns-xxx \--dns-config "NamespaceId=ns-xxx,DnsRecords=[{Type=A,TTL=30}]"

AgentCard 自动发现

A2A 协议的核心是 AgentCard——每个 Agent 在 /.well-known/agent.json 暴露自己的能力描述:

{"name": "inventory-agent","description": "查询产品库存数量和仓库位置","url": "http://inventory-agent:8001","version": "1.0.0","capabilities": {"streaming": true,"pushNotifications": false},"skills": [{"id": "check-inventory","name": "查询单个产品库存","description": "输入产品ID,返回库存数量和仓库位置"},{"id": "batch-check","name": "批量库存查询","description": "同时查询多个产品的库存状态"}]
}

其他 Agent 只需要知道 AgentCard URL,就能自动发现对方的能力并调用。

踩坑记录

  1. 超时设置:Agent 调 Agent 比调普通 API 慢(因为中间有 LLM 推理),默认 30s 超时可能不够。建议设到 120s。

  2. 重试策略:LLM 推理偶尔会失败(throttling、模型过载),A2A 调用要加指数退避重试。

  3. 消息大小:如果 Agent 返回的结果很大(比如批量查询 1000 个 SKU),可能超出下游 Agent 的 context window。建议分页。

  4. 认证:A2A 默认不带认证。生产环境要加 IAM Auth 或 mutual TLS:

server = A2AServer(agent=inventory_agent,name="inventory-agent",port=8001,auth_handler=iam_auth_handler  # 自定义 IAM 认证
)
  1. 可观测性:A2A 调用链不会自动上报 X-Ray。需要手动在 A2AClient 里注入 trace header。

参考链接

  • Strands Agents SDK:https://github.com/strands-agents/sdk-python
  • A2A 协议规范:https://github.com/google/a2a-protocol
  • Strands 文档:https://docs.strands.aws/
  • Amazon Bedrock 模型列表:https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html
http://www.rkmt.cn/news/1509263.html

相关文章:

  • 从Console.WriteLine到你的代码:深入理解C# params关键字的‘前世今生’与设计哲学
  • FLV 如何转换成MP3,一招搞定
  • 1039市场采购和买单出口有什么区别?哪个更合规?| 性质与合规全面对比 - 欢欢在创业
  • Claude Code 主创放弃写 Prompt 了:他改写循环。Prompt Engineer 这个岗位还活得下去吗?
  • 别让栅极电阻毁了你的MOS管!手把手教你选对Rg值(附计算实例)
  • 【毕业设计】基于 SpringBoot 与 Android 的个人健康管理系统设计与实现基于springboot+Android的健康管理应用的设计与实现(源码+文档+远程调试,全bao定制等)
  • 【海斗小助手】0.9.1 版本更新公告:同步官方 26.12 最新版本变动
  • 【Springboot毕设全套源码+文档】基于spring boot的图书交易平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 为什么Sunshine能帮你实现零延迟游戏串流:3个实战秘诀
  • WPF 自定义容器控件的布局
  • 给嵌入式工程师的CSI-2协议实战拆解:从PHY层到Packet,手把手分析图像数据流
  • 百度网盘直链解析终极指南:告别龟速下载,重获下载自由
  • Vivado资源报告怎么看?从Utilization报告里揪出LUTRAM浪费和DSP使用不足的‘元凶’
  • 太原市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 铜川市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 2026年口碑好的综合高中哪家可靠?权威解析
  • 2026亚太EMBA排名前三榜单解析|五大顶尖亚太EMBA项目盘点
  • 2026年6月在线ORP仪主要品牌排行榜:国产技术突围与场景化选型全解析 - 仪表品牌榜
  • 同是化纤混丝假发,铂贝卡凭什么跳出 “头顶蒸笼” 困境?实测拆解硬核优势
  • 从收音机到手机:聊聊BJT这个“老古董”为什么还在现代电路里不可或缺
  • TX3 Mini电视盒Armbian部署完全手册:从废弃设备到高效Linux服务器的华丽转身
  • 深耕中医茶疗养生与现代应用,娄天裕受聘:卫健委第一健康报道“健康宣传大使”
  • INSAR相位解缠MATLAB工具包:枝切法+质量引导+洪水填充一站式实现
  • CT图像重建速度翻倍?深入聊聊OS-SART算法中的‘有序子集’到底怎么玩
  • 三沙市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 鸿蒙原生应用实战(五):编译构建与性能优化 —— 从开发到上架
  • 3分钟掌握手机号定位技术:免费开源工具让地理位置查询变得简单
  • 告别舞台灯光盲区:用STM32F0单片机手把手实现DMX512信号解码(附完整代码)
  • 三亚市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 百度网盘直链解析技术深度解析:绕过限速实现高速下载的技术实现