ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">人工智能技术日益发展的今天,Agent 之间的自动通信与协作正变得越来越重要。今天我们来实战一下,使用 Python 实现一个简单的A2A(Agent-to-Agent)交互示例。 ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">✅ 前提条件ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">在开始之前,请确保你的开发环境中已安装以下工具:ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;" class="list-paddingleft-1">Python 3.10 或更高版本Git(用于克隆项目仓库) ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">🧰 环境配置步骤ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">第一步:克隆项目仓库ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">访问 GitHub 并克隆官方提供的 A2A 示例仓库:gitclonehttps://github.com/google-a2a/a2a-samples.git -b main --depth 1 cda2a-samples
ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">注意:该项目是 Google A2A 的官方示例代码库,我们只拉取最新主分支的简化版本。 ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">第二步:创建并激活虚拟环境ingFang SC", miui, "Hiragino Sans GB", "Microsoft Yahei", sans-serif, "Source Han Serif";font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.064px;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">Windows 用户:python -m venv .venv .venv\Scripts\activate
macOS / Linux 用户:python -m venv .venv source.venv/bin/activate
第三步:安装依赖进入项目目录后,安装所需的 Python 包以及 A2A SDK: bash深色版本pipinstall-rsamples/python/requirements.txt 第四步:验证安装是否成功你可以运行以下命令再次确认依赖是否安装完整: bash深色版本pipinstall-rsamples/python/requirements.txt 如果看到类似输出: 深色版本A2ASDKimportedsuccessfully 恭喜!你的开发环境已经准备就绪!
🚀 启动服务端从项目根目录启动服务端: bash深色版本pythonsamples/python/agents/helloworld/__main__.py 服务启动后,你会看到如下日志信息: INFO: Started server process [xxxxx] INFO: Waitingforapplication startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:9999 (Press CTRL+C to quit)
此时,服务已成功运行在http://localhost:9999上。
💬 客户端交互测试打开一个新的终端窗口,保持虚拟环境激活状态,运行客户端脚本: bash深色版本pythonsamples/python/agents/helloworld/test_client.py
🔍 客户端代码解析让我们看看客户端是如何实现与服务端通信的。 1️⃣ 初始化 Agent Card 解析器base_url ='http://localhost:9999'
asyncwithhttpx.AsyncClient()ashttpx_client: resolver = A2ACardResolver( httpx_client=httpx_client, base_url=base_url, # agent_card_path 使用默认值,extended_agent_card_path 也使用默认值 )
这段代码初始化了一个异步 HTTP 客户端,并通过A2ACardResolver获取目标 Agent 的能力描述(Card),为后续交互做准备。
2️⃣ 发送非流式消息请求client = A2AClient(httpx_client=httpx_client, agent_card=final_agent_card_to_use)
logger.info('A2AClient initialized.')
send_message_payload:dict[str,Any] = { 'message': { 'role':'user', 'parts': [ {'kind':'text','text':'how much is 10 USD in INR?'} ], 'messageId': uuid4().hex, }, }
request = SendMessageRequest(id=str(uuid4()), params=MessageSendParams(**send_message_payload))
response =awaitclient.send_message(request) print(response.model_dump(mode='json', exclude_none=True))
上述代码构建了一个包含用户问题的 JSON 请求,并通过A2AClient发送给服务端 Agent。
3️⃣ 预期响应结果运行完成后,你应该会看到类似如下的响应: { "jsonrpc":"2.0", "id":"xxxxxxxx", "result": { "type":"message", "role":"agent", "parts": [ {"type":"text","text":"Hello World"} ], "messageId":"yyyyyyyy" } }
这表明一次完整的 A2A 非流式交互已经成功完成!
📌 小结今天我们完成了以下任务: - 编写并执行了客户端代码,实现了 Agent 间的非流式通信
虽然目前只是一个基础示例,但它为我们理解 A2A 架构提供了良好的起点。 |