Google ADK 与 A2A 协议:跨语言多智能体团队构建实战
Build Cross-Language Multi-Agent Team with Google’s Agent Development Kit and A2A
一篇技术博客展示了如何用 Google Agent Development Kit (ADK) 与 Agent2Agent (A2A) 协议搭建跨语言多智能体流水线:Python agent 调用 Gemini 解析合同条款,Go agent 用纯确定性逻辑校验合规性。A2A 协议通过 Agent Card 实现能力发现、JSON-RPC 2.0 完成通信、Task 状态机管理任务生命周期;ADK 的 RemoteA2aAgent 抽象可将任意 A2A 兼容服务封装成本地子智能体。文中强调将单体提示词分解为专业化微智能体,以解决上下文退化、故障爆炸半径和不可测试性问题。完整源码已在 GitHub 发布。
Google 这篇教程把跨语言多智能体协作说得很实,A2A 协议像代理世界的 HTTP,不过整套方案还是绑在 Google 生态上,自己玩的话迁移成本不低。

Python 智能体与 Go 智能体如何借助 Agent2Agent 协议在合同合规场景中协作
你的合同合规流水线存在一个问题。数据科学团队用 Python 编写了一个出色的提取智能体。它使用 Gemini 解析法律合同并提取出每一项关键条款。安全工程团队用 Go 构建了一个极速的合规校验器,完全采用确定性逻辑,不使用任何 LLM。两者单独运行时都完美无缺。但现在你需要让它们协同工作,组成一条统一的协调流水线,而两个团队都不愿意用另一种语言重写自己的服务。
这就是生产级 AI 系统的现实:不同的团队、不同的语言、不同的部署目标。问题不在于你是否会遇到这种情况,而在于你将如何解决它。
在本文中,我们将构建一条合同合规多智能体流水线,其中 Python 智能体使用 Gemini 提取合同条款,Go 智能体则依据企业政策对其进行校验。这两个服务通过 Agent2Agent(A2A) 协议连接,并由 Google 的 Agent Development Kit(ADK) 进行编排。
在此过程中,你将学到三种架构模式,它们正是生产级多智能体系统与单语言演示之间的分水岭:
- 跨语言智能体协作:使用 A2A 协议,让各团队能够用最适合任务的语言构建智能体,而无需重写代码。
- ADK 的 RemoteA2aAgent 抽象,只需几行代码就能把任何远程的 A2A 兼容服务变成本地子智能体
- 多智能体流水线编排,用职责范围狭窄的专用智能体取代试图包揽一切的单一庞大提示词
完整源代码已在 GitHub 上提供。

当单个智能体不够用时
大多数 AI 项目的起步方式都一样:一个庞大的智能体,一段超长的提示词,所有工具都塞进同一个上下文窗口。这在演示中行得通,但在生产环境中会因三个关键原因而崩溃:
- 上下文退化:当工具数量超过 10-15 个时,模型开始遗漏指令、调用错误的工具,或对参数产生幻觉。每增加一个工具,都会在更广的范围内稀释模型的注意力。一个既负责合同提取、又兼顾翻译、摘要和邮件起草的智能体,最终会搞不清在什么时候该调用哪个工具。
- 爆炸半径:某个次要功能中一个未处理的异常就会让整个智能体回合崩溃。翻译 API 上的一个速率限制不应该拖垮你的整个工作流。但在单体式智能体中,任何一次失败都是彻底的失败。
- 无法测试:你无法对一个背负着 50 项相互纠缠职责的系统进行干净的单元测试。当每一次提示词的改动都可能影响每一个下游行为时,评估回归就变成了猜测。
解决方案与十年前彻底改变后端工程的那个模式如出一辙:把单体拆解为专门化的微服务。每个智能体只承担一项职责、使用一个聚焦的提示词,以及一套最小化的工具集。

A2A 协议:智能体如何相互发现并通信
Agent-to-Agent(A2A)协议是一项开放标准,它使任何语言或框架构建的智能体都能互操作。可以把它想象成智能体世界的 HTTP:一份共享契约,让任意两个智能体无论内部如何构建都能相互通信。
A2A 解决了三个根本性问题:
- 发现:智能体通过 Agent Card 来公布自身能力,这是一种以 JSON 格式呈现的元数据,托管在 /.well-known/agent.json。类似于 REST API 的 OpenAPI 规范,该卡片声明了智能体的名称、URL、版本、技能以及支持的输入/输出格式。调用方智能体会先获取该卡片,以了解远端智能体能够做什么。
- 通信: 所有数据交换都通过 JSON-RPC 2.0 进行,经由单一端点路由。智能体通信的核心方法是 message/send(我们的实现用它来同步提交合同数据并接收结果),此外还有 tasks/send 和 tasks/get 等其他协议方法,用于任务提交和检索。数据在带类型的 Message Parts 中传输:TextParts 用于自然语言,DataParts 用于结构化 JSON。
- 任务生命周期: 每一次交互都被封装在一个 Task 中,它会经历明确定义的状态转换:submitted、working、completed 或 failed。这个状态机意味着智能体可以用同一套协议处理同步工作流(立即检查这份合同)和异步工作流(在 48 小时内验证这份文档)。
这种方法的妙处在于,两个智能体都不需要了解对方的实现细节。Python 智能体不会导入 Go 包。Go 智能体不会运行 Python 代码。它们只是在 HTTP 上使用一套共享协议进行通信。

Agent Card 实际长什么样
以下是 Go 合规服务在‘/.well-known/agent.json’处暴露的 Agent Card:
// go-compliance-agent/internal/agentcard/card.go
func GetCard() AgentCard {
agentURL := os.Getenv("AGENT_URL")
if agentURL == "" {
agentURL = "http://localhost:8888"
}
return AgentCard{
Name: "Security Compliance Validator",
Description: "Go-based validation engine that checks vendor contracts against corporate compliance policy rules.",
Version: "1.0.0",
SupportedInterfaces: []AgentInterface{
{
URL: agentURL,
ProtocolBinding: "JSONRPC",
ProtocolVersion: "1.0",
},
},
Capabilities: Capabilities{
ExtendedAgentCard: false,
},
DefaultInputModes: []string{"application/json"},
DefaultOutputModes: []string{"application/json"},
Skills: []Skill{
{
ID: "contract_compliance_check",
Name: "Contract Compliance Check",
Description: "Validates extracted contract fields against corporate policy rules.",
Tags: []string{"compliance", "contract", "validation"},
Examples: []string{
"Check this contract for compliance violations",
"Validate vendor agreement terms against policy",
},
},
},
}
}该 URL 从环境变量中读取,因此同一份代码既能在本地(‘localhost:8888’)运行,也能在容器中(‘go-compliance-agent:8888’)运行。Skills 数组意味着单个智能体可以对外声明多项能力。
代码实现详解
下面展示了使用 Python 中的 ADK 和 Go 中的标准 HTTP 服务器来组装这个跨语言团队有多么简单。
共享状态:智能体之间的数据总线
在深入了解各个智能体之前,理解它们如何通信非常重要。ADK 的 ToolContext.state 提供了一个共享字典,流水线中的所有子智能体都可以读写它。智能体之间不是通过函数参数或返回值来传递数据,而是通过共享的会话状态进行通信。
我们合规流水线中的每一步都映射到一个特定的检查点:
class ComplianceStep(str, Enum):
INGESTED = "INGESTED" # Contract uploaded, awaiting extraction
EXTRACTED = "EXTRACTED" # Fields parsed by Gemini
COMPLIANCE_PENDING = "COMPLIANCE_PENDING" # Sent to Go agent, awaiting result
COMPLIANCE_COMPLETE = "COMPLIANCE_COMPLETE"# Go agent returned verdict
MANUAL_REVIEW = "MANUAL_REVIEW" # Timeout or error, routed to human
REVIEW_READY = "REVIEW_READY" # Report generated, violations found
APPROVED = "APPROVED" # All checks passedMANUAL_REVIEW 状态值得特别关注。如果 Go 合规智能体因服务器崩溃、网络超时、容器未启动等原因而无法访问,流水线不会直接失败。它会转换到 MANUAL_REVIEW,将案件路由给人工法律审核员。这种故障安全模式对于下游服务可能间歇性不可用的生产系统来说至关重要。
1. 完整的多智能体流水线:在 Python 中封装 Go 智能体
使用 ADK,你可以通过 `RemoteA2aAgent` 在本地定义一个 兼容 A2A 的远程 智能体。SDK 会在后台自动处理 Agent Card 握手、参数序列化和 JSON-RPC 网络请求。
# python-extraction-agent/app/agent.py
from google.adk.agents import Agent, SequentialAgent
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent
from google.adk.models import Gemini
# Sub-Agent 1: Ingests & extracts details using LLM reasoning
extractor_agent = Agent(
name="extractor_agent",
model=Gemini(model="gemini-3.5-flash"),
instruction="You are a Legal Data Extraction Agent. Extract contract fields: value, contractor, dates, insurance...",
tools=[read_contract_text, save_extracted_fields, classify_risk_level]
)
# Sub-Agent 2: Go A2A Compliance Service wrapped as a local agent
compliance_agent = RemoteA2aAgent(
name="compliance_agent",
agent_card=GO_AGENT_CARD_URL,
description="Validates extracted contract fields against corporate policies."
)
# Sub-Agent 3: Generates the final audit summary report
report_agent = Agent(
name="report_agent",
model=Gemini(model="gemini-3.5-flash"),
instruction="Generate the final compliance report and Markdown summary.",
tools=[generate_summary_report]
)
# Coordinator: Chains them together sequentially
root_agent = SequentialAgent(
name="contract_compliance_coordinator",
description="Orchestrates contract parsing, A2A compliance validation, and final reporting in sequence.",
sub_agents=[extractor_agent, compliance_agent, report_agent],
)2. Go 合规端点
在 Go 侧,合规智能体是一个标准的 HTTP 服务器,实现了 A2A 协议。它暴露一个用于发现的 Agent Card,以及一个单一的 JSON-RPC 端点,该端点接受 message/send 请求,对提取出的合同字段执行确定性策略检查,并返回通过/不通过的判定结果。无需任何 AI 框架或 SDK——只需 Go 标准库。
以下是简化后的流程(完整实现在代码仓库中):
// Simplified pseudo-code — see GitHub repository for full implementation
func HandleJSONRPC(w http.ResponseWriter, r *http.Request) {
var req JSONRPCRequest
json.NewDecoder(r.Body).Decode(&req)
// Extract contract details from the A2A message
var details compliance.ContractDetails
extractContractFromMessage(req.Params, &details)
// Run deterministic policy checks
result := compliance.CheckCompliance(details, policy)
// Return verdict as a JSON-RPC response
writeJSONRPCResult(w, req.ID, result)
}开源应用:合同合规引擎
整个流水线以一个开源应用的形式交付,你可以部署并扩展它。该代码仓库包含一个由 FastAPI 服务提供的功能完备的运营驾驶舱。
- 三面板运营驾驶舱:左侧面板让操作员选择或上传合同。中间面板显示实时结果:通过合同的合规证书,以及未通过合同的违规报告。右侧面板是一个开发者控制台,包含策略控制、网络模拟,以及两个智能体之间数据流动的实时视图。
- 网络故障模拟:一个开关可让你在 Normal、Delayed 和 Crashed 状态之间切换 Go 智能体。将其设为 Crashed 即可展示故障保护机制的实际运作:Python 智能体检测到中断,暂停流水线,并将合同转交人工审核,而不是静默失败。
- 实时智能体交接检查器: 右侧面板会显示从 Python 发送到 Go 的确切请求以及返回的响应,因此你可以实时看到跨越语言边界的结构化契约数据。

ADK 与 A2A 方案的优势
- 技术自由:你的数据科学团队可以用 Python 编写复杂的认知智能体,而你的系统团队可以用 Go、Rust 或 C++ 编写高性能、安全的合规验证器。
- 简化集成:Python 编排器与 Go 智能体通信时,就像调用本地类一样。你无需编写自定义 HTTP 客户端,也无需手动处理 JSON-RPC 载荷封装。
- 韧性:由于智能体之间是解耦的,你可以配置细粒度的超时和重试逻辑。如果 Go 验证器宕机,Python 智能体会保存当前状态检查点,并等待人工审批。
- 隔离审计:Go 合规验证器是完全确定性的。出于审计目的,你可以传入相同的输入,并验证它们产生完全一致的政策裁决,从而绕过 LLM 的非确定性。
结论
多智能体编排不仅仅是串联提示词;它关乎构建健壮、跨语言的分布式系统。
通过使用 Google ADK 和开放的 A2A 协议,将 Python 的 AI 生态与 Go 的运行时可靠性连接起来,你就能兼得两者之长:在存在歧义之处进行认知推理,在存在策略之处进行确定性执行。
准备好自己运行了吗?
- 克隆 contract-compliance-engine,并在本地运行实时演示
- 浏览 ADK 文档,了解会话管理、多智能体模式和评估框架
- 浏览 Agent2Agent 协议文档以了解更多详情。
来源:Google Developers Blog(RSS) · developers.googleblog.com