03把任务交给远程助手 · 第 9 章
总进度 9 / 15

08|把资料任务交出去,再把结果接回来

读到能力卡以后,工作台还没有得到任何资料。这一节真正发送一次 A2A 消息,观察远程状态更新,最后把协议中的交付物转成本地写作能使用的 sources 和 text 。

2026-09-28约 8 分钟47 行代码难度 ★★★

如果想获取全套课程资料,请关注微信公众号 「AI面包君」,回复 「课程资料」 即可领取。

读到能力卡以后,工作台还没有得到任何资料。这一节真正发送一次 A2A 消息,观察远程状态更新,最后把协议中的交付物转成本地写作能使用的 sources 和 text。

确保资料服务仍在 8767 端口运行。我们先在终端发一条小请求,再回到网页执行完整任务,避免一开始就把远程通信和整套调度混在一起排查。

先沿时序图走一遍

这一节的难点不是“把请求发出去”,而是分清一轮通信中的几种返回:任务刚建立时给你的编号、执行期间不断到来的事件,以及最后能够交给下一位角色的产物。

课程中的 A2A 跨服务委派时序:发现、发请求、工具调用、事件与最终查询

图中三条竖线代表三个参与者,时间从上往下走。只有跨越竖线的箭头才表示交接。资料助手内部怎样推理没有画进来,因为客户端不需要依赖那个细节。

注意第 3、6、8 步的区别。第 3 步告诉你“这件事有了编号”;第 6 步告诉你“现在做到哪里”;第 8 步才让你核对最终状态并取出成果。在快递查询里,揽件、运输中、签收不是同一件事,A2A 的这些信号也不能混在一起判断。

操作名、SDK 方法与请求类型各是哪一层

你想做什么A2A 1.0 操作本课程 Python 写法
提交一轮消息SendMessage / SendStreamingMessageclient.send_message(request);客户端开启 streaming
读取某项任务GetTaskclient.get_task(GetTaskRequest(id=remote_id))
请求取消任务CancelTaskclient.cancel_task(CancelTaskRequest(id=remote_id))

表里第一列是人的目的,第二列是协议操作,第三列是这个版本 SDK 给程序员的入口。不要把 Python 的小写方法名直接当作所有绑定上的网络操作名,也不要拿旧版 message/send 路径拼进当前请求。

流式不是“每来一个字就是一个独立任务”。同一条响应中可以先给出任务对象,再给状态更新与产物更新。客户端必须按事件类型读取内容,记录它们对应的 task_id。课程的 async for event in client.send_message(request) 就是在逐条消费这些事件。

协议对象的含义可对照官方 核心概念;这里的时序图另外画出了课程代码自己的最终 GetTask 核对步骤,方便你把规范与具体实现分开理解。

1. 单独委派一次资料查询

在项目根目录运行:

.\.venv\Scripts\python.exe labs.py 8

这个实验发送“产品 规范”。先看几条 A2A 事件,再看最后的结果:kind 应为 research,包含资料来源、文本和远程任务编号。编号每次会变化,来源内容则来自课程的虚构资料卡。

跨进程 A2A 调用返回状态事件和资料产物

试读到这里 · 后续内容已封存

关注公众号,继续把这章学完

在「AI面包君」发送关键词「学习AI」拿到口令。验证一次,这个浏览器就能继续阅读全部课程。