07 · Google ADK:最像「企业软件」的 Agent 框架
图片来源:google/adk-python
| 仓库 | google/adk-python |
| Star | 21.2k(Go 版 8.7k、Java 版 1.7k) |
| 版本 | 2.7.1(相对 1.x 有破坏性变更) |
| 语言 | Python / TypeScript / Go / Java / Kotlin 五种 |
| 许可证 | Apache 2.0 |
| 层级 | Framework,自带 Runtime 能力 |
| 一句话 | 把软件工程规范(分层、测试、评测、部署、协议)套到 Agent 开发上,Gemini 优化但不锁定 |
一、定位:它是本专题里「最不像玩具」的一个
其他框架的文档从「20 行代码跑通一个 Agent」开始,ADK 的文档从目录结构、配置、评测集、部署目标开始。这不是缺点,是它的目标用户不同 —— 它面向的是要把 Agent 交付到生产、还要被合规审查的团队。
体现在这几个地方:
- 五种语言官方实现 —— Python / TypeScript / Go / Java / Kotlin。Java 和 Go 版的存在直接说明它想进的是什么样的公司
- 自带评测:
adk eval跑 evalset,是本专题里少数把评测做进核心的框架 - 自带 Web 调试 UI:
adk web,不用连第三方 SaaS - Agent Config:YAML 定义 Agent,不写代码
- A2A 协议:跨框架、跨组织的 Agent 互通
二、两个主类:Agent 和 Workflow
官方给新手的定位很清楚:Agent 定义「一个 AI 怎么想」,Workflow 定义「多个步骤怎么走」。
Agent
from google.adk import Agent
# ADK 约定:模块里名为 root_agent 的变量就是入口,
# `adk run` / `adk web` 会自动找它,不用你写启动代码
root_agent = Agent(
name="greeting_agent", # 名字要唯一,多 Agent 时用来互相引用
model="gemini-2.5-flash", # 也可以换成其他厂商的模型
instruction="You are a helpful assistant. Greet the user warmly.", # 系统提示词
)
Workflow:ADK 2.0 的核心新东西
from google.adk import Agent, Workflow
# 两个各司其职的小 Agent
generate_fruit_agent = Agent(
name="generate_fruit_agent",
instruction="Return the name of a random fruit. Return only the name.",
)
generate_benefit_agent = Agent(
name="generate_benefit_agent",
instruction="Tell me a health benefit about the specified fruit.",
)
# Workflow 负责编排:谁先跑、谁后跑、怎么分支
root_agent = Workflow(
name="root_agent",
# 一个元组就是一条链:START → 先出水果名 → 再讲这个水果的好处。
# 上一个节点的输出会自动成为下一个节点的输入
edges=[("START", generate_fruit_agent, generate_benefit_agent)],
)
三、Workflow 图:和 LangGraph 的同与不同
ADK 2.0 把工作流做成有向图,节点(NodeLike)可以是:
@node装饰的 Python 函数(同步 / 异步 / 生成器)LlmAgent实例BaseTool实例- 另一个
Workflow(可嵌套) START哨兵节点
边的三种写法:链式元组是亮点
from google.adk.workflow import DEFAULT_ROUTE, START
# ① 顺序:元组里从左到右依次执行,START -> a -> b -> c
edges = [(START, step_a, step_b, step_c)]
# ② 并行 fan-out:位置上放一个「元组」,里面的节点同时开跑
# 含义是 START -> a,然后 a -> b 和 a -> c 并发
edges = [(START, step_a, (step_b, step_c))]
# ③ 条件路由:位置上放一个「字典」,键是路由标签,值是去向节点。
# step_a 内部通过 yield Event(route="success") 发出标签,框架据此选边
edges = [
(START, step_a, {
"success": step_b, # a 发出 "success" 就走 b
"failure": step_c, # 发出 "failure" 就走 c
DEFAULT_ROUTE: fallback_step, # 发出别的标签一律走兜底分支
}),
]
节点通过 yield Event(route="success") 发出路由信号。也支持显式的 Edge 对象写法:
from google.adk.workflow import Edge, START
# 和上面的链式元组等价,只是把每条边显式写出来。
# 图很复杂时这种写法更好读,也更容易在代码里动态拼装
edges = [
Edge(from_node=START, to_node=step_a), # 无条件边
Edge(from_node=step_a, to_node=step_b, route="success"), # 带路由标签的条件边
Edge(from_node=step_a, to_node=step_c, route="failure"),
]
编译期校验 —— 这是它比 LangGraph 强的地方
Workflow 初始化时会跑 validate_graph(),把结构性错误在启动时就报出来:节点名必须唯一、必须有且只有一个 START、START 不能有入边等等。
| ADK 2.0 Workflow | LangGraph StateGraph | |
|---|---|---|
| 边的写法 | 链式元组,一行表达顺序 / 并行 / 条件 | add_edge / add_conditional_edges 逐条加 |
| 状态 | Session State(带作用域前缀) | TypedDict + Reducer |
| 并行合并 | Join node | Reducer 自动归并 |
| 图校验 | 实例化时强校验 | 编译时校验较弱 |
| 持久化 | SessionService(含 Vertex 托管) | Checkpointer(含 Postgres) |
| 心智负担 | 中等 | 高(reducer 语义要理解) |
ADK 的链式元组语法确实比 LangGraph 逐条 add_edge 更紧凑可读,代价是灵活度略低。
其他内置节点能力:retry_config 重试、join_node 汇合、parallel_worker 并行工人、dynamic_nodes 运行时动态生成节点。
四、Session / State / Memory:三层上下文
这是 ADK 设计里我认为最值得学的部分 —— 它把「状态该存多久、给谁看」做成了 key 前缀:
| 前缀 | 作用域 | 举例 |
|---|---|---|
| 无前缀 | 仅当前会话 | draft(这次对话的草稿) |
user: | 该用户的所有会话 | user:display_name |
app: | 整个应用所有用户 | app:model_tier |
temp: | 仅当前一次调用,不落盘 | temp:intermediate_calc |
from google.adk.sessions import InMemorySessionService
session = await session_service.create_session(
app_name="notes", # 应用名,app: 前缀的数据以它为作用域
user_id="ada", # 用户 ID,user: 前缀的数据以它为作用域
session_id="monday", # 这次会话的 ID,无前缀的数据只在这次会话里可见
state={
"app:model_tier": "pro", # 全应用共享:所有用户、所有会话都读得到
"user:display_name": "Ada", # 该用户的所有会话共享:明天新开会话还在
# 还可以写 "draft": "..."(只在本次会话)
# 或 "temp:calc": 1(只在本次调用内,根本不 落盘)
},
)
一个必须理解的机制:写入是 delta,靠 Event 落盘
代码不直接改 Session.state 那个 dict,而是写 ctx.state(工具里就是 ToolContext)。每次写会记录两遍:一遍进当前值(下一行代码能读到),一遍进 delta(挂在即将发出的 Event 上)。只有 event 被 append 时,delta 才真正持久化。
这个设计让「状态变更」和「执行事件」天然对齐 —— 事件流就是完整的状态变更审计日志。对要过合规的系统很友好。
三种 SessionService:InMemorySessionService(开发)、DatabaseSessionService(自托管)、VertexAiSessionService(GCP 托管)。另有独立的 MemoryService 管跨会话长期记忆。
官方明确:2.0 对 agent API、event model、session schema 都有破坏性变更。ADK 2.0 生成的 session 能被 1.28+ 读(多余字段忽略),但和更老的 1.x 不兼容。 老项目升级前先看迁移文档。
五、工具与人工确认
工具来源:自定义函数、OpenAPI spec 自动生成、MCP tools、内置工具(google_search 等)、以及跨框架工具适配。
Tool Confirmation 是它的 HITL 机制 —— 在工具执行前要求显式确认,还能带自定义输入表单。对照 01 D6 维度,这属于第 3 档(工具级审批协议)。