google-adk
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGoogle Agent Development Kit (ADK)
Google Agent Development Kit (ADK)
Google ADK is a Python framework for building, orchestrating, and evaluating LLM-powered agents. It provides structured patterns for single agents, multi-agent pipelines, custom tools, session state, safety controls, and evaluation.
Google ADK是一个用于构建、编排和评估基于LLM的Agent的Python框架。它为单Agent、多Agent流水线、自定义工具、会话状态、安全控制和评估提供了结构化模式。
Core Concepts
核心概念
LLM Agent
LLM Agent
The fundamental building block is (aliased as ):
LlmAgentAgentpython
from google.adk.agents import LlmAgent
agent = LlmAgent(
name="research_agent", # unique, snake_case
model="gemini-2.5-flash",
description="Searches and summarizes research papers.", # used for multi-agent routing
instruction="You are a research assistant. ...", # most critical field
tools=[search_tool, summarize_tool],
)Key fields:
| Field | Purpose |
|---|---|
| Unique identifier; used for agent transfer |
| Shown to parent agents for routing decisions |
| Gemini model string (e.g. |
| System prompt — the most critical field |
| List of callable tools or |
| Write agent response to |
| Pydantic model for structured JSON output |
| |
最基础的构建块是(别名):
LlmAgentAgentpython
from google.adk.agents import LlmAgent
agent = LlmAgent(
name="research_agent", # 唯一标识,采用蛇形命名法
model="gemini-2.5-flash",
description="Searches and summarizes research papers.", # 用于多Agent路由
instruction="You are a research assistant. ...", # 最关键的字段
tools=[search_tool, summarize_tool],
)关键字段说明:
| 字段 | 用途 |
|---|---|
| 唯一标识符;用于Agent间的控制权转移 |
| 供父Agent参考以做出路由决策 |
| Gemini模型字符串(例如 |
| 系统提示词 — 最关键的配置字段 |
| 可调用工具或 |
| 将Agent响应写入 |
| 用于结构化JSON输出的Pydantic模型 |
| |
Instructions
提示词配置
Instructions are the most important configuration. Write them clearly:
- Use markdown formatting (headers, bullets, code blocks)
- Provide few-shot examples for complex behaviors
- Guide tool selection explicitly: "Use when the user asks about..."
search_tool - Inject state values with or artifact values with
{state_key}{artifact.name} - Keep instructions specific and task-scoped; avoid generic prompts
python
instruction="""
You are a customer support agent for Acme Corp.提示词是最重要的配置项,需清晰编写:
- 使用Markdown格式(标题、项目符号、代码块)
- 针对复杂行为提供少量示例
- 明确指导工具选择:“当用户询问...时,使用”
search_tool - 通过注入状态值,或通过
{state_key}注入工件值{artifact.name} - 保持提示词具体且任务聚焦;避免通用化提示
python
instruction="""
You are a customer support agent for Acme Corp.Behavior
Behavior
- Greet the user by name using {user_name}
- For billing questions, always use before responding
lookup_invoice - Escalate to human if sentiment is negative three times in a row
- Greet the user by name using {user_name}
- For billing questions, always use before responding
lookup_invoice - Escalate to human if sentiment is negative three times in a row
Examples
Examples
User: "What's my balance?"
Action: Call lookup_invoice(account_id="{account_id}")
""",
undefinedUser: "What's my balance?"
Action: Call lookup_invoice(account_id="{account_id}")
""",
undefinedStructured Output
结构化输出
Use when a downstream step requires machine-readable JSON:
output_schemapython
from pydantic import BaseModel
class Report(BaseModel):
title: str
summary: str
confidence: float
agent = LlmAgent(
...,
output_schema=Report,
output_key="report", # writes JSON to session.state["report"]
)Avoid combining with unless using Gemini 3.0+.
output_schematools当下游步骤需要机器可读的JSON时,使用:
output_schemapython
from pydantic import BaseModel
class Report(BaseModel):
title: str
summary: str
confidence: float
agent = LlmAgent(
...,
output_schema=Report,
output_key="report", # 将JSON写入session.state["report"]
)除非使用Gemini 3.0+,否则避免同时使用和。
output_schematoolsFunction Tools
函数工具
Python functions are automatically wrapped as tools. The docstring becomes the tool description — write it carefully.
python
def get_weather(city: str, units: str = "celsius") -> dict:
"""Get current weather for a city.
Args:
city: The city name to look up.
units: Temperature units, either 'celsius' or 'fahrenheit'.
Returns:
dict with keys: temperature, condition, humidity.
"""
# implementation ...
return {"temperature": 22, "condition": "sunny", "humidity": 60}Rules:
- Required params: typed, no default → model must supply them
- Optional params: typed with default or
Optional[T] = None - Return type: always ; include a
dictkey ("status"/"success")"error" - /
*args: ignored by ADK schema generation — avoid them**kwargs - Make return values descriptive; the LLM reads them to decide next steps
Python函数会被自动包装为工具。文档字符串将成为工具描述 — 需仔细编写。
python
def get_weather(city: str, units: str = "celsius") -> dict:
"""Get current weather for a city.
Args:
city: The city name to look up.
units: Temperature units, either 'celsius' or 'fahrenheit'.
Returns:
dict with keys: temperature, condition, humidity.
"""
# 实现代码 ...
return {"temperature": 22, "condition": "sunny", "humidity": 60}规则:
- 必填参数:带类型标注,无默认值 → 模型必须提供这些参数
- 可选参数:带类型标注且有默认值,或为
Optional[T] = None - 返回类型:必须为;需包含
dict键("status"/"success")"error" - /
*args:ADK schema生成会忽略这些参数 — 避免使用**kwargs - 使返回值具有描述性;LLM会读取这些值以决定后续步骤
Passing Data Between Tools
工具间传递数据
Use with the prefix for transient inter-tool data:
session.statetemp:python
from google.adk.tools import ToolContext
def store_result(data: str, tool_context: ToolContext) -> dict:
"""Store intermediate result for downstream tools."""
tool_context.state["temp:last_result"] = data
return {"status": "success"}
def read_result(tool_context: ToolContext) -> dict:
"""Read the stored intermediate result."""
value = tool_context.state.get("temp:last_result", "")
return {"status": "success", "result": value}使用带前缀的存储工具间的临时数据:
temp:session.statepython
from google.adk.tools import ToolContext
def store_result(data: str, tool_context: ToolContext) -> dict:
"""Store intermediate result for downstream tools."""
tool_context.state["temp:last_result"] = data
return {"status": "success"}
def read_result(tool_context: ToolContext) -> dict:
"""Read the stored intermediate result."""
value = tool_context.state.get("temp:last_result", "")
return {"status": "success", "result": value}Long-Running and Agent Tools
长时运行工具与Agent工具
python
from google.adk.tools import LongRunningFunctionTool, AgentToolpython
from google.adk.tools import LongRunningFunctionTool, AgentToolWrap async/long-running operations
包装异步/长时运行操作
slow_tool = LongRunningFunctionTool(func=run_batch_job)
slow_tool = LongRunningFunctionTool(func=run_batch_job)
Invoke a sub-agent as an explicit tool call
将子Agent作为显式工具调用
sub_agent_tool = AgentTool(agent=specialist_agent)
undefinedsub_agent_tool = AgentTool(agent=specialist_agent)
undefinedMulti-Agent Systems
多Agent系统
Hierarchy
层级结构
Compose agents using . Each agent can have only one parent.
sub_agentspython
orchestrator = LlmAgent(
name="orchestrator",
model="gemini-2.5-flash",
instruction="Route tasks to the appropriate specialist.",
sub_agents=[research_agent, writer_agent, reviewer_agent],
)使用组合Agent。每个Agent只能有一个父Agent。
sub_agentspython
orchestrator = LlmAgent(
name="orchestrator",
model="gemini-2.5-flash",
instruction="Route tasks to the appropriate specialist.",
sub_agents=[research_agent, writer_agent, reviewer_agent],
)Sequential Pipeline
顺序流水线
SequentialAgentoutput_key{state_key}python
from google.adk.agents import SequentialAgent
pipeline = SequentialAgent(
name="report_pipeline",
sub_agents=[
LlmAgent(name="researcher", ..., output_key="research_notes"),
LlmAgent(name="writer",
instruction="Write a report based on: {research_notes}",
output_key="draft"),
LlmAgent(name="reviewer",
instruction="Review this draft: {draft}"),
],
)SequentialAgentoutput_key{state_key}python
from google.adk.agents import SequentialAgent
pipeline = SequentialAgent(
name="report_pipeline",
sub_agents=[
LlmAgent(name="researcher", ..., output_key="research_notes"),
LlmAgent(name="writer",
instruction="Write a report based on: {research_notes}",
output_key="draft"),
LlmAgent(name="reviewer",
instruction="Review this draft: {draft}"),
],
)Parallel Pipeline
并行流水线
ParallelAgentoutput_keypython
from google.adk.agents import ParallelAgent
parallel = ParallelAgent(
name="multi_search",
sub_agents=[
LlmAgent(name="web_searcher", ..., output_key="web_results"),
LlmAgent(name="doc_searcher", ..., output_key="doc_results"),
LlmAgent(name="db_searcher", ..., output_key="db_results"),
],
)ParallelAgentoutput_keypython
from google.adk.agents import ParallelAgent
parallel = ParallelAgent(
name="multi_search",
sub_agents=[
LlmAgent(name="web_searcher", ..., output_key="web_results"),
LlmAgent(name="doc_searcher", ..., output_key="doc_results"),
LlmAgent(name="db_searcher", ..., output_key="db_results"),
],
)Loop Pipeline
循环流水线
LoopAgentmax_iterationsescalate=Truepython
from google.adk.agents import LoopAgent
refiner = LoopAgent(
name="refinement_loop",
max_iterations=5,
sub_agents=[draft_agent, critic_agent],
)LoopAgentmax_iterationsescalate=Truepython
from google.adk.agents import LoopAgent
refiner = LoopAgent(
name="refinement_loop",
max_iterations=5,
sub_agents=[draft_agent, critic_agent],
)LLM-Driven Transfer
LLM驱动的控制权转移
An LLM agent can transfer control by calling . For this to work reliably, every agent must have a clear field.
transfer_to_agent(agent_name="...")descriptionLLM Agent可通过调用转移控制权。为确保此功能可靠运行,每个Agent必须有清晰的字段。
transfer_to_agent(agent_name="...")descriptionSession State
会话状态
Session state is a persisted across turns. Keys follow naming conventions:
dict| Prefix | Scope | Example |
|---|---|---|
| (none) | Persistent across session | |
| Current turn only | |
| User-level across sessions | |
| Application-level global | |
Access state from tools via , from agents via in instructions.
ToolContext{state_key}会话状态是一个跨轮次持久化的。键遵循命名约定:
dict| 前缀 | 作用域 | 示例 |
|---|---|---|
| (无) | 跨会话持久化 | |
| 仅当前轮次 | |
| 跨会话的用户级 | |
| 应用级全局 | |
可通过从工具中访问状态,或通过提示词中的从Agent中访问状态。
ToolContext{state_key}Safety
安全
In-Tool Guardrails
工具内防护
Use to enforce policies deterministically before the LLM sees results:
ToolContextpython
def sensitive_lookup(query: str, tool_context: ToolContext) -> dict:
"""Look up sensitive records."""
if not tool_context.state.get("user:verified"):
return {"status": "error", "message": "User not verified."}
# proceed with lookup ...使用在LLM看到结果前确定性地执行策略:
ToolContextpython
def sensitive_lookup(query: str, tool_context: ToolContext) -> dict:
"""Look up sensitive records."""
if not tool_context.state.get("user:verified"):
return {"status": "error", "message": "用户未验证。"}
# 继续执行查询 ...Callbacks
回调函数
Use to validate tool arguments before execution:
before_tool_callbackpython
from google.adk.tools import ToolContext
def validate_args(tool_name: str, args: dict, tool_context: ToolContext):
if tool_name == "delete_record" and not args.get("confirm"):
raise ValueError("delete_record requires confirm=True")
agent = LlmAgent(..., before_tool_callback=validate_args)使用在执行前验证工具参数:
before_tool_callbackpython
from google.adk.tools import ToolContext
def validate_args(tool_name: str, args: dict, tool_context: ToolContext):
if tool_name == "delete_record" and not args.get("confirm"):
raise ValueError("delete_record需要传入confirm=True")
agent = LlmAgent(..., before_tool_callback=validate_args)Built-in Safety
内置安全机制
Configure Gemini's content filters via :
generate_content_configpython
from google.genai.types import GenerateContentConfig, SafetySetting, HarmCategory, HarmBlockThreshold
agent = LlmAgent(
...,
generate_content_config=GenerateContentConfig(
temperature=0.2,
max_output_tokens=2048,
safety_settings=[
SafetySetting(
category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
)
],
),
)通过配置Gemini的内容过滤器:
generate_content_configpython
from google.genai.types import GenerateContentConfig, SafetySetting, HarmCategory, HarmBlockThreshold
agent = LlmAgent(
...,
generate_content_config=GenerateContentConfig(
temperature=0.2,
max_output_tokens=2048,
safety_settings=[
SafetySetting(
category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
)
],
),
)Evaluation
评估
ADK supports two evaluation file formats:
| Format | File | Use |
|---|---|---|
| Unit tests | | Single-turn, deterministic assertions |
| Integration tests | | Multi-turn conversation flows |
Run evaluations:
bash
undefinedADK支持两种评估文件格式:
| 格式 | 文件 | 用途 |
|---|---|---|
| 单元测试 | | 单轮次、确定性断言 |
| 集成测试 | | 多轮次对话流程 |
运行评估:
bash
undefinedLaunch interactive web UI
启动交互式Web UI
adk web
adk web
CLI evaluation
CLI评估
adk eval path/to/agent path/to/tests.evalset.json
adk eval path/to/agent path/to/tests.evalset.json
pytest integration
pytest集成
pytest tests/ -k "eval"
Key metrics:
| Metric | Description |
|---|---|
| `tool_trajectory_avg_score` | Exact match on tool call sequence |
| `response_match_score` | ROUGE-1 similarity to expected response |
| `final_response_match_v2` | LLM-based semantic match |
| `hallucinations_v1` | Detects fabricated facts |
| `safety_v1` | Flags safety violations |pytest tests/ -k "eval"
关键指标:
| 指标 | 描述 |
|---|---|
| `tool_trajectory_avg_score` | 工具调用序列的精确匹配度 |
| `response_match_score` | 与预期响应的ROUGE-1相似度 |
| `final_response_match_v2` | 基于LLM的语义匹配度 |
| `hallucinations_v1` | 检测编造的事实 |
| `safety_v1` | 标记安全违规行为 |Quick Reference
快速参考
Install:
bash
pip install google-adkMinimal agent:
python
from google.adk.agents import LlmAgent
agent = LlmAgent(
name="my_agent",
model="gemini-2.5-flash",
instruction="You are a helpful assistant.",
)Run locally:
bash
adk web # web UI
adk run # CLI interactive
adk api_server # REST API serverPlanners (for complex reasoning):
- — uses Gemini's native thinking capability
BuiltInPlanner - — plan→act→reason loop for non-thinking models
PlanReActPlanner
安装:
bash
pip install google-adk最小化Agent:
python
from google.adk.agents import LlmAgent
agent = LlmAgent(
name="my_agent",
model="gemini-2.5-flash",
instruction="You are a helpful assistant.",
)本地运行:
bash
adk web # Web UI
adk run # CLI交互式运行
adk api_server # REST API服务器规划器(用于复杂推理):
- — 使用Gemini原生的思考能力
BuiltInPlanner - — 针对无思考能力模型的“规划→执行→推理”循环
PlanReActPlanner
Additional Resources
额外资源
- — Detailed LLM agent configuration, multi-agent patterns, and orchestration strategies
references/agent-design.md - — Function tool patterns, session state management, artifacts, and memory
references/tools-and-sessions.md - — Safety architecture, guardrail patterns, and evaluation framework details
references/safety-and-evaluation.md
- — 详细的LLM Agent配置、多Agent模式和编排策略
references/agent-design.md - — 函数工具模式、会话状态管理、工件和内存
references/tools-and-sessions.md - — 安全架构、防护模式和评估框架细节
references/safety-and-evaluation.md