Google Cloud Blog

One Agent Development Kit, five languages

8.5内容质量
One Agent Development Kit, five languages

TL;DR · AI 摘要

Google推出支持五种语言的Agent Development Kit,通过统一协议实现多语言代理互操作,消除Python依赖限制。

核心要点

  • ADK支持Python/Go/TypeScript/Java/Kotlin五种语言,避免强制使用Python
  • MCP协议实现工具调用互操作,A2A协议支持跨语言代理通信
  • Python示例中无需装饰器,通过函数签名自动生成工具声明

结构提纲

按章节快速跳转。

  1. 指出当前代理框架的Python依赖限制及ADK的多语言解决方案

  2. 五种语言均支持MCP协议实现工具调用互操作

  3. ·A2A协议

    通过HTTP实现跨语言代理通信的标准化协议

  4. 包含CLI初始化、项目脚手架生成和部署配置步骤

  5. 展示无需装饰器的函数式工具定义方式

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • ADK多语言架构
    • 核心协议
      • MCP工具调用
      • A2A通信
    • 支持语言
      • Python
      • Go
      • TypeScript
      • Java
      • Kotlin
    • 开发流程
      • CLI初始化
      • 项目脚手架
      • 部署配置

金句 / Highlights

值得收藏与分享的关键句。

#Agent Development Kit#多语言支持#Google Cloud#协议互操作性
打开原文

One Agent 开发工具包,支持五种语言 | Google Cloud 博客

开发者与实践者

One Agent 开发工具包,支持五种语言

2026年10月14日

##### Karl Weinmeister

开发者关系总监

当我们谈论代理时,并不一定意味着我们只在谈论 Python。在当今的现代生态系统中,一个代理可能作为高并发的 Go 微服务在 Cloud Run 上运行,或者驻留在浏览器标签页中并调用 Chrome 的设备端模型。然而许多代理框架假设仅使用 Python 栈。这种假设迫使团队要么只为代理工作负载启动一个 Python 服务,要么需要在自己的语言中从零开始构建代理编排逻辑。

Google 的代理开发工具包(ADK)通过支持 Python、Go、TypeScript、Java 和 Kotlin,消除了这种权衡。每个 ADK 版本都为其运行时和类型系统从零构建,同时通过开放协议实现统一架构的互操作性。

共享的基础架构

选择语言不会锁定你的架构:所有五种语言都支持相同的开放协议。ADK 在每种语言中都包含 Model Context Protocol 客户端,因此作为 MCP 服务器公开的自定义工具可以立即被任何语言调用。

对于多代理系统,ADK 支持 Agent2Agent(A2A)协议,允许代理通过 HTTP 与远程代理通信。通过 A2A,使用不同语言或框架编写的代理可以实现互操作性。

以代理为中心的起点

要开始使用,请运行一次性设置命令以检查 Google Cloud 身份验证、安装 CLI,然后在 Antigravity、Claude Code 或 Codex 等编码代理中设置第一方 ADK 技能:

加载中...

uvx google-agents-cli setup

然后,运行 scaffold 命令生成一个包含 A2A 端点和 Cloud Run、Gemini Enterprise Agent Runtime 或 Google Kubernetes Engine(GKE)部署配置的可用项目:

架构一个 ADK 项目(使用 --agent adk 表示 Python 或 --agent adk_go 表示 Go)

agents-cli scaffold create my-go-agent \ --agent adk_go \ --deployment-target cloud_run \ --region us-central1

Python 和 Kotlin 的 ADK 仓库在其源代码树中也提供了代理构建技能,而 adk.dev/llms.txt 资源可为所有五种语言的任何编码代理提供按需 API 文档。

编码代理技能会构建你的项目,同时 MCP 和 A2A 连接所有五种语言的运行时。

每个 ADK 的实践视角

最清晰感受五种语言差异的方式是:在每种语言中定义相同的天气工具,并观察其设计如何适应运行时。

Python

在 Python 的 ADK 中,你不需要装饰器或模式构建器类。只需将一个普通的 Python 函数传递给 tools 参数,ADK 在启动时会检查其签名、类型提示和文档字符串,自动构建工具声明和 Pydantic 参数模式:

lang-py

from google.adk.agents.llm_agent import Agent

def get_weather(city: str) -> dict: """获取指定城市的当前天气报告。 Args: city (str): 要获取天气报告的城市名称。 """ return {"status": "success", "report": f"Sunny and 72F in {city}."}

root_agent = Agent( name="weather_agent", model="gemini-3.8-flash", instruction="回答有关城市天气的问题。", tools=[get_weather], )

除了快速原型开发,Python是ADK的参考实现,提供最全面的Google Cloud集成(BigQuery、Spanner、Bigtable)和模型适配器(Gemini、Anthropic、OpenAI、LiteLLM)。结合adk eval或agents-cli eval run命令,其评估工具可在持续集成(CI)中将代理轨迹与黄金数据集进行评分,实现端到端系统测试,即使生产服务使用其他语言运行。

Go

虽然Python在实验和评估方面占优,但Go版ADK在生产后端工程中表现更佳。

Go工具函数接收agent.Context配置和强类型输入结构体。functiontool.New函数利用Go泛型从结构体标签推断输入和输出模式:

type GetWeatherArgs struct { City string json:"city" jsonschema:"The city to look up weather for." } type GetWeatherResult struct { Report string json:"report" } func getWeather(_ agent.Context, args GetWeatherArgs) (GetWeatherResult, error) { return GetWeatherResult{Report: "Sunny and 72F in " + args.City}, nil } weatherTool, err := functiontool.New(functiontool.Config{ Name: "get_weather", Description: "Retrieves the current weather report for a city.", }, getWeather)

由于functiontool.New函数对处理程序签名是泛型的,Go编译器会在二进制文件运行前验证函数是否符合预期契约。

Go也是首个在Python之后提供ADK 2.0图工作流运行时的语言。当需要将LLM推理与确定性控制流结合时,workflow.New函数会将代理和普通Go函数连接成带条件路由和并行步骤的有向图:

ag, err := workflowagent.New("order_pipeline", []workflow.Edge{ {From: workflow.Start, To: triageNode}, {From: triageNode, To: fulfillNode, Route: workflow.StringRoute("fulfill")}, {From: fulfillNode, To: notifyNode}, })

Go在Cloud Run和GKE生产环境中的表现尤为突出。编译后的Go代理可打包到约2 MiB的Google无语言虚拟机静态基础镜像中,无需语言VM或重型依赖树。静态Go二进制文件在容器启动时立即绑定端口,跳过动态语言的模块导入和JVM服务的JAR解包及JIT预热过程。

运行后,Go的并发模型天然适配代理工作负载。每个goroutine初始栈大小为2 KB且调度开销极小,因此单个实例可同时处理数千个并发流式请求和工具调用。Go版ADK还内置A2A服务器处理器和开箱即用的OpenTelemetry追踪功能。

TypeScript

TypeScript在编译为JavaScript时会擦除类型注解,因此运行时反射不可行。ADK for TypeScript采用Zod方案替代。你只需将z.object(...)模式传递给FunctionTool函数,TypeScript即可从该声明静态推断execute回调的参数类型:

import { FunctionTool, LlmAgent } from "@google/adk"; import { z } from "zod"; const getWeatherTool = new FunctionTool({ name: "get_weather", description: "Retrieves the current weather report for a city.", parameters: z.object({ city: z.string().describe("The name of the city."), }), execute: async ({ city }) => { return { status: "success", report: Sunny and 72F in ${city}. }; }, }); export const rootAgent = new LlmAgent({ name: "weather_agent", model: "gemini-3.8-flash", instruction: "Answer questions about the weather in a city.", tools: [getWeatherTool], });

运行时输入验证、发送给模型的 JSON Schema 以及 execute 回调中 IDE 的自动补全功能都源自同一个统一的数据源。

TypeScript 还运行在 ADK 2.0 图工作流引擎上,并提供独立的浏览器打包版本。除了 Node.js 服务,你还可以通过 WebMCP 在浏览器标签页中直接运行 ADK 代理,使用 Chrome 的设备端 Prompt API 实现页面级工具。

Java

对于已采用 Maven、Gradle 和 Spring Boot 的团队,Java 版 ADK 可以无缝集成。你只需向方法参数添加 @Schema 注解,通过流畅的 LlmAgent.builder() API 组装代理:

public class WeatherTools { public static Map<String, String> getWeather( @Schema(name = "city", description = "The name of the city") String city) { return Map.of("status", "success", "report", "Sunny and 72F in " + city); } } LlmAgent agent = LlmAgent.builder() .name("weather_agent") .model("gemini-3.8-flash") .instruction("Answer questions about the weather in a city.") .tools(FunctionTool.create(WeatherTools.class, "getWeather")) .build();

运行时,执行器会通过 RxJava 以响应式方式流式传输代理事件。对于本地测试和现有 JVM 应用,Java 版 ADK 提供 Maven Dev UI 插件,并提供与 Spring AI 和 LangChain4j 的官方桥接工具。

Kotlin

Kotlin 版 ADK 在构建时安全性方面有明确立场。其 Kotlin 符号处理(KSP)编译器插件会在构建时读取 @Tool 和 @Param 注解,并直接将工具模式写入字节码:

class WeatherTools { @Tool( name = "get_weather", description = "Retrieves the current weather report for a city.", ) suspend fun getWeather( @Param("The name of the city.") city: String ): Map<String, String> = mapOf("status" to "success", "report" to "Sunny and 72F in $city") } val agent = LlmAgent( model = Gemini("gemini-3.8-flash"), name = "weather_agent", instruction = Instruction("Answer questions about the weather in a city."), tools = WeatherTools().generatedTools(), )

如果工具签名使用了不支持的类型,或在非空参数上声明了默认值,你的 Gradle 构建会立即失败,而不是在生产环境中崩溃。由于 .generatedTools() 函数不使用任何运行时反射,它可以兼容 Android R8 代码缩减。

这种零反射设计使得可以在 Android 上本地运行整个代理循环。它提供 JVM 服务器支持,包括 Spring AI 桥接工具和实验性的 ADK 2.0 图工作流。在设备端,Kotlin 版 ADK 与 LiteRT-LM 集成用于工具调用,与 ML Kit(Gemini Nano)集成用于文本生成。它还支持与 Room 和 AppSearch 集成实现本地状态管理,以及与 Android AppFunctions 集成实现操作系统级操作,所有功能均无需网络连接。

无妥协的选择

ADK 支持五种本地语言,这意味着您无需为整个组织选择单一的运行时环境。由于 ADK 的每个版本都使用 MCP 和 A2A 协议,系统中的每个组件都可以选择最适合自己的语言进行开发。

您使用过哪些语言来构建 Google ADK 的代理?欢迎在 X、LinkedIn 或 Bluesky 上分享您使用的技术栈。

发布于

  • 开发者与实践者