A2A协议剖析
继AI MCP协议之后,Google又提出了一个新协议,A2A,全称为Agent-to-Agent,他允许一个Agent调用另一个Agent。
简单使用
在官方A2A文档中,提供的Python和NodeJS的代码,本篇文章中使用NodeJS作为演示。
- 拉取官方示例代码,主要需要
这两个文件夹的代码
- 编写服务端代码,其实就是包装一个Agent
- 我们需要
new A2AServer
创建一个A2A的服务端,他有两个入参TaskHandler
和options
- 对于
TaskHandler
- 这里不多说关于编程语言,在这个方法定义里你需要
- 确认当前Agent状态并且告诉taskStore来传递给客户端
- 实现Agent
- 这里不多说关于编程语言,在这个方法定义里你需要
- 我们需要
- 编写客户端代码
- 我们需要
new A2AClient
创建一个A2A的客户端,他需要一个serverUrl
,也就是服务端的地址 - 通过
/.well-known/agent.json
获取到服务端Agent的能力,这里返回的信息就是在服务端的card中定义的信息 - 通过
client.sendTaskSubscribe
调用服务端AgentsendTaskSubscribe
是流式sendTask
是阻塞式
- 我们需要
- 运行服务端代码,会通过express开启一个端口号默认为41241的应用
- 运行客户端代码,我们现在就可以通过客户端调用服务端Agent了
剖析
服务端
A2AServer都干了什么
最主要的就是创建一个express应用,将自己暴露出去
TaskHandler
下面是taskhandler的定义源码
/** |
我们可以看到入参是context,可以持续返回TaskYieldUpdate,最终返回一个Task或者空
context
/** |
- Task:指的就是当前这个任务
- 任务中的TaskStatus包含working,input-required,completed,canceled,failed。看名字大家就知道这几个分别代表着什么哈
- 任务中还有sessionId,artifacts,metadata这里不细说
- userMessage:这个就是用户发送的消息
- history:这个就是用户发送的消息的集合
TaskYieldUpdate
TaskStatusUpdateEvent主要包含的也是任务中的TaskStatus,持续返回告诉客户端目前任务是什么状态
Task
在上文已经讲过了
A2AServerOptions
options
包含了
- taskStore 上下文存储
- corsOptions 是否接受跨域
- basePath 路由前缀
- card 这个是最重要的,可以把这个card理解为MCP的描述和参数描述
card
基础信息name,description,url等
还有skills,相当于大模型的FunctionCalling
实例中的card是
{ |
根据这个示例来修改
客户端
A2AClient都干了什么
获取服务端的card
上文提到过,这个功能标准的A2AClient并没有帮我们实现,我们需要手动去做
sendTask&sendTaskSubscribe
发送阻塞请求和流式请求,分别调用的是服务端的tasks/send
和tasks/sendSubscribe
两个接口,其实也就是Http请求
getTask
通过taskid获取任务,调用tasks/get
接口
cancelTask
不多解释,就是调用tasks/cancel
接口
setTaskPushNotification&getTaskPushNotification
调用tasks/pushNotification/set
,tasks/pushNotification/get
NodeJS的示例还没有实现
// Add other methods like tasks/pushNotification/*, tasks/resubscribe later if needed |
resubscribeTask
调用tasks/resubscribe
接口,对于中断的任务做重新连接的方法,也没有实现,同上
A2AClient是如何与A2AServer交互的呢
事例中没有是Agent调用Agent的路径,只是给大家介绍了之间的协议
延展阅读
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 喵喵博客!