tRPC 团队发布了 A2A 协议的 Go 语言实现 trpc-a2a-go,为开发者提供构建可互操作智能体的 SDK。trpc-a2a-go 遵循 Google 发起的 Agent2Agent (A2A) 协议标准,解决了不同智能体系统之间的互操作性难题,使各种智能体能够无缝协作完成复杂任务。
代码已开源至 GitHub:https://github.com/trpc-group/trpc-a2a-go
背景
大模型(Large Language Model, LLM)的兴起,让人们可以从一个对话框中获取他们想要知道的知识与信息,它就像海绵宝宝的"神奇海螺🐚",引起众人的惊叹与好奇。
尽管在一层层的多头注意力(Multi-Head Attention)与多层感知机(Multi-Layer Perceptron, MLP)的堆叠下,LLM 通过海量参数内置了大量的知识与信息,甚至发展出推理能力,但是它依然会产生幻觉与事实错误,无法提供给人们当下最新的信息,它好像一颗静态的大脑,缺少了手和脚。
而当 LLM 与智能体(Agent)结合之后,他可以通过工具的调用,以获取它本身并不拥有的数据与能力:
当你询问明天的天气时,它可以调用天气 API 获取最新的天气信息
当你想要提交代码时,它可以调用代码编辑器工具,将代码提交到仓库中
然而,为了让智能体能够获取这些数据和能力,这些数据和能力的提供者需要专门开发相应的接口,将这些接口暴露给智能体,而数据与能力的所有者与开发者并非是中心化的,而是散落在世界上的各个组织和个人中,它们可能提供迥然不同的接口,导致智能体本身需要对接各种不同的接口。
因此,2024 年 11 月 25 日,Anthropic 推出了 Introducing the Model Context Protocol \ Anthropic,旨在为这些数据和能力提供者提供一个标准化的接口,凡是实现这种接口的服务,Agent 都可以用一套标准化接口的客户端来进行调用,大大减少了开发成本。
MCP 协议规范了 Agent 与工具之间的交互,然而,智能体与智能体之间的交互同样需要规范化,比如不同厂商有不同的 Agent 实现,他们可能使用了不同的框架(如 LangGraph、CrewAI、Google ADK、Genkit 等),这些 Agent 之间需要能够发现彼此的能力,并进行协作。
因此,2025 年 4 月 9 日,Google 推出了 Agent2Agent (A2A) 协议,旨在为 Agent 的实现提供标准化的接口,凡是实现这种接口的 Agent,都可以通过一个 Root Agent 来发现彼此的能力,并进行协作。
现在,tRPC 团队第一时间支持了 A2A 协议的 Go 语言实现 trpc-a2a-go,并将其开源在 github 上:https://github.com/trpc-group/trpc-a2a-go
A2A 协议概述与 MCP 协议对比
A2A 协议简介
Agent2Agent (A2A) 协议是由 Google 发起并与 50 多家技术合作伙伴共同开发的开放式协议,旨在解决不同智能体系统间互操作性的关键问题。在企业场景中,各种自主智能体正被用于自动化并增强工作流程,从处理设备订购到辅助客户服务再到供应链规划。然而,这些智能体往往被限制在各自独立的系统中运行,无法高效协作。
A2A 协议的核心目标是让不同厂商或框架(如 LangGraph、CrewAI、Google ADK、Genkit 等)构建的智能体能够互相发现能力、协商交互方式并安全地在任务上协作,从而释放多智能体生态系统的潜力。该协议建立在现有标准之上,包括 HTTP、SSE(Server-Sent Events)和 JSON-RPC,使其易于与企业现有的技术基础设施集成。
A2A 协议定义了以下核心概念:
1.AgentCard(智能体卡片):智能体的身份与能力声明,包含名称、描述、URL、版本、提供者信息、能力声明、认证方式、交互模式和技能列表等。智能体通过发布 AgentCard 使其他智能体能够发现并了解其能力。
2.Task(任务):代表智能体处理的工作单元,具有唯一标识符、生命周期状态、会话关联、产物、历史记录和元数据等属性。
3.Message(消息):用户与智能体或智能体间通信的载体,包含角色("user"或"agent")、 消息元素(Parts)和元数据。
4.Part(消息元素):消息的基本组成单元,支持文本、文件、结构化数据等多种数据类型。
5.Artifact(产物):任务执行的结果输出,包含名称、内容和流控制信息。
这些概念共同构成了 A2A 协议的基础,支持智能体间的发现、协商和协作。
A2A 与 MCP 的区别与互补
A2A 协议与 Anthropic 的 Model Context Protocol (MCP) 看似有相似之处,但它们解决的是不同层面的问题:
MCP 协议:着重于为单个模型或智能体提供结构化的上下文和工具。MCP 定义了模型如何接收输入数据、获取外部工具访问权限并生成输出的标准方式。它主要关注单个模型与其执行环境之间的交互。
A2A 协议:专注于多个智能体之间的通信和任务协调。它解决的是让已经具备各自能力的智能体能够相互发现、交换信息并协调完成复杂任务的问题。
这两个协议可以说是互补的:
MCP 为单个智能体提供强大的环境感知和工具使用能力,而 A2A 则使这些智能体能够组成协作网络,共同完成复杂任务。两者结合使用时,可以构建出既具备强大个体能力又能高效协作的智能体生态系统。
tRPC a2a-go 的实现与使用
tRPC a2a-go 概述
trpc-a2a-go (https://github.com/trpc-group/trpc-a2a-go )是 tRPC 推出的 A2A 协议的 Go 语言实现,为开发者提供了构建支持 A2A 协议的客户端和服务端的完整框架。它采用模块化设计,围绕核心协议规范提供了丰富的功能,同时保持了 Go 语言高性能、强类型的特点。
该实现遵循 A2A 协议的设计原则:
专注于智能体协作
构建在现有标准之上(HTTP、JSON-RPC、SSE)
安全优先
支持长时间运行的任务
模态无关(支持文本、文件、结构化数据等多种交互方式)
核心架构
trpc-a2a-go 的核心架构包含以下主要组件:
主要模块功能:
1.protocol/: 定义 A2A 协议的核心数据结构,如 Artifact、Task、Message、Part 等,遵循协议规范中的 JSON Schema。
2.client/: 提供与 A2A 服务端交互的客户端实现,包括:智能体发现、任务发送和接收、流式更新订阅、推送通知配置
3.server/: 实现接收和处理 A2A 请求的服务端功能,包括:HTTP 端点处理、请求验证、流式响应、请求路由到对应任务管理器
4.taskmanager/: 负责任务生命周期管理,处理任务状态转换、资源跟踪和运行中任务的协调。
5.auth/: 提供身份验证和授权机制,支持多种认证方案。
6.jsonrpc/: 处理 JSON-RPC 2.0 协议相关的请求解析和响应格式化。
核心数据结构
trpc-a2a-go 实现了 A2A 协议规范中定义的核心数据结构:
// AgentCard 表示智能体的元数据和能力type AgentCard struct { Name string `json:"name"` Description *string `json:"description,omitempty"` URL string `json:"url"` Provider *AgentProvider `json:"provider,omitempty"` Version string `json:"version"` DocumentationURL *string `json:"documentationUrl,omitempty"` Capabilities AgentCapabilities `json:"capabilities"` Authentication *Authentication `json:"authentication,omitempty"` DefaultInputModes []string `json:"defaultInputModes"` DefaultOutputModes[]string `json:"defaultOutputModes"` Skills []AgentSkill `json:"skills"`}// Task 表示智能体处理的工作单元type Task struct { ID string `json:"id"` SessionID *string `json:"sessionId,omitempty"` Status TaskStatus `json:"status"` Artifacts []Artifact `json:"artifacts,omitempty"` History []Message `json:"history,omitempty"` Metadata interface{} `json:"metadata,omitempty"`}// Message 表示用户和智能体之间的通信type Message struct { Role string `json:"role"` // "user" 或 "agent" Parts []Part `json:"parts"` Metadata interface{} `json:"metadata,omitempty"`}
这些数据结构与 A2A 协议的 JSON Schema 完全对应,确保了协议兼容性。
实用功能示例
下面是几个实际场景中常用的代码示例,可以帮助你快速上手 trpc-a2a-go。代码已经精简为核心部分,便于理解主要概念。
客户端使用
和大多数 SDK 类似,使用 trpc-a2a-go 的第一步是创建一个客户端。客户端负责与智能体服务通信,发送请求和接收响应:
package mainimport ( "context" "log" "trpc.group/trpc-go/trpc-a2a-go/client" "trpc.group/trpc-go/trpc-a2a-go/protocol")func main() { // 创建客户端 a2aClient, err := client.NewClient("https://example-agent.com/a2a") if err != nil { log.Fatalf("创建客户端失败: %v", err) } // 创建并发送任务 task, err := a2aClient.SendTask(context.Background(), &protocol.TaskSendParams{ ID: "task-123", Message: protocol.Message{ Role: "user", Parts: []protocol.Part{{Type: "text", Text: "你能帮我分析这份数据吗?"}}, }, }) log.Printf("任务状态: %s", task.Status.State)}
如你所见,使用相当直观。首先创建一个客户端并指定智能体的 URL,然后构造任务请求并发送。实际应用中,客户端还提供更多功能,比如获取智能体能力清单、查询任务状态和管理长时间运行的任务等。完整 API 可以参考 GitHub 上的文档和示例(https://github.com/trpc-group/trpc-a2a-go)。
服务端使用
如果你需要实现一个智能体服务,则需要编写服务端代码。核心是实现一个任务处理器来响应用户请求:
package mainimport ( "context" "fmt" "log" "trpc.group/trpc-go/trpc-a2a-go/server" "trpc.group/trpc-go/trpc-a2a-go/taskmanager")// TextProcessor 实现一个简单的文本处理器type TextProcessor struct{}// 处理任务并返回文本反转结果func (p *TextProcessor) Process(ctx context.Context, taskID string, message taskmanager.Message, handle taskmanager.TaskHandle) error { // 提取文本并处理(示例中是反转文本) text := extractText(message.Parts) reversed := reverseText(text) // 构建响应并更新任务状态 responsePart := taskmanager.NewTextPart(reversed) handle.UpdateStatus(taskmanager.TaskStateCompleted, &taskmanager.Message{ Role: taskmanager.MessageRoleAgent, Parts: []taskmanager.Part{responsePart}, }) return nil}func main() { // 创建智能体卡片定义 agentCard := server.AgentCard{ Name: "文本反转智能体", Version: "1.0.0", URL: "http://localhost:8080/", // 其他必要配置... } // 创建任务处理器和管理器 processor := &TextProcessor{} taskManager, _ := taskmanager.NewMemoryTaskManager(processor) // 创建并启动服务器 srv, _ := server.NewA2AServer(agentCard, taskManager) log.Fatal(srv.Start("localhost:8080"))}
服务端代码主要包含几个关键部分:定义处理器、创建智能体卡片(即服务的身份和能力声明)、初始化任务管理器和启动服务。真正的业务逻辑在 Process 方法中实现,示例中只是简单反转文本,实际应用中可能会调用大语言模型、查询数据库或与其他服务交互。
在实际开发中,建议将任务处理逻辑与服务配置代码分离,这样便于单元测试和后期维护。
流式处理示例
如果你使用过现代 AI 对话应用,就会注意到渐进式输出(类似打字机效果)提供了更好的用户体验。trpc-a2a-go 也支持这种流式响应:
package mainimport ( "context" "fmt" "time" "github.com/google/uuid" "trpc.group/trpc-go/trpc-a2a-go/client" "trpc.group/trpc-go/trpc-a2a-go/taskmanager")func main() { // 创建A2A客户端 c, _ := client.NewA2AClient("http://localhost:8080") // 定义流式任务参数 taskParams := taskmanager.SendTaskParams{ ID: fmt.Sprintf("task-%s", uuid.New().String()), Message: taskmanager.Message{ Role: taskmanager.MessageRoleUser, Parts: []taskmanager.Part{taskmanager.NewTextPart("分析这段文本")}, }, AcceptedOutputModes: []string{"stream"}, } // 启动流式任务 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() streamChan, _ := c.StreamTask(ctx, taskParams) // 处理流式更新 for event := range streamChan { switch e := event.(type) { case taskmanager.TaskStatusUpdateEvent: fmt.Printf("状态更新: %s\n", e.Status.State) case taskmanager.TaskArtifactUpdateEvent: fmt.Printf("产物更新: %v\n", e.Artifact.LastChunk) } }}
流式处理是 trpc-a2a-go 的一个重要特性。对于耗时较长的任务,如复杂分析或大型文档生成,用户通常不希望等待全部完成才看到结果。通过流式处理,可以将中间结果实时展示给用户,大幅提升交互体验。
该 API 设计采用事件监听模式,主要处理两类事件:状态更新事件和内容更新事件。状态更新事件告知任务的当前进度(如进行中、已完成或失败),内容更新事件则包含实际的返回数据。
trpc-a2a-go 还实现了认证鉴权以及基于 redis 的任务管理器,并提供了多智能体使用示例,最新内容请参考 https://github.com/trpc-group/trpc-a2a-go
后续规划
协议演进
trpc-a2a-go 的发展路线将与 A2A 协议标准保持同步。我们计划在智能体发现机制方面实现更完善的分布式目录系统,并在 AgentCard 中增强授权模型。对于智能体协作模式,将着重开发动态技能查询能力,使智能体能够更灵活地适应复杂任务需求。
用户体验方面的增强也在计划之中,特别是支持任务过程中的动态协商能力,例如让智能体能够在对话过程中根据需要无缝切换文本、音频或视频等交互方式。与此同时,我们也在完善安全机制,增加对企业级认证标准的支持,并提供更精细的权限控制能力。
与 trpc 生态融合
作为 tRPC 团队的产品,trpc-a2a-go 将与 trpc-go 框架深度整合。这包括提供 trpc-go 插件支持,实现基于 trpc 协议的通信层,以及通过 trpc-go 标准配置管理 A2A 服务。
在服务治理方面,我们将接入 trpc 的注册发现机制,使智能体能够自动注册并被发现。同时,对接 trpc 的可观测性生态,为智能体服务提供全面的监控和诊断能力。这些整合将使开发者能够利用 trpc 生态的熔断、限流和负载均衡等成熟治理能力,构建更可靠的智能体系统。
工具链方面,我们将开发命令行工具插件,简化 A2A 服务的创建和管理,并提供与 trpc-admin 的管理面板集成,使开发者能够直观地管理和监控智能体。这些工具将大幅降低开发和运维的复杂度。
性能与开发体验优化
针对高并发场景,我们正在设计更高效的任务处理管道和缓存机制,优化流式数据处理,并增强任务管理器的分布式能力。这些优化将提升系统在大规模部署环境下的性能和稳定性。
开发体验方面,我们将提供更丰富的命令行工具和可视化仪表板,帮助开发者快速测试和调试智能体。同时,我们也在扩展示例库和完善文档,覆盖更多实际应用场景,降低学习曲线。
社区与生态建设
作为一个开源项目,trpc-a2a-go 的长期发展离不开社区的参与。我们将建立清晰的贡献指南和路线图,设计灵活的插件机制,定期组织社区交流活动,并与其他智能体框架建立合作关系。
我们相信,通过与社区的紧密协作,trpc-a2a-go 将能够不断创新和进化,更好地满足不同场景下的智能体协作需求。如果你对智能体技术感兴趣,欢迎加入我们,共同推动 trpc-a2a-go 的发展。
结语
A2A 协议代表了智能体互操作性的重要进步。通过提供标准化的通信方式,A2A 使不同智能体能够像人类团队一样协作,从而实现更复杂、更强大的自动化系统。trpc-a2a-go 作为 tRPC 推出的 A2A 协议的 Go 语言实现,为开发者提供了构建互操作智能体的强大工具包。
随着智能体技术的不断成熟,A2A 协议和 trpc-a2a-go 将继续发展,以支持更复杂的协作模式和更广泛的应用场景。通过促进开放标准和互操作性,A2A 协议有望成为推动智能体生态系统发展的关键技术。
欢迎开发者体验 tRPC a2a-go,项目开源地址
https://github.com/trpc-group/trpc-a2a-go
如有问题或建议,欢迎在 GitHub 上提交 issue
( https://github.com/trpc-group/trpc-a2a-go/issues )
或 PR
( https://github.com/trpc-group/trpc-a2a-go/pulls )
加入 tRPC 智能体生态建设!
参考文献
Agent2Agent Protocol (A2A)
https://google.github.io/A2A/#/documentation
google/A2A
https://github.com/google/A2A
Announcing the Agent2Agent Protocol (A2A)
https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/