What Is Google's Agent Development Kit (ADK)? A 2026 Field Guide
What Is Google's Agent Development Kit (ADK)? A 2026 Field Guide
If you have been waiting for the agent framework story to settle before committing — it has, mostly. As of 2026, three frameworks dominate production use: LangChain (broadest, oldest, biggest ecosystem), CrewAI (role-based multi-agent collaboration), and Google's Agent Development Kit (ADK), released by Google in 2025 and positioned as the GCP-native production framework for building, evaluating, and deploying AI agents.
This post is a practical field guide to ADK from the perspective of TagSpecialist, where we have shipped ADK agents in production for marketing analytics, BigQuery natural-language interfaces, and multi-agent diagnostics workflows. It covers what ADK actually is, when to use it (and when not), how it compares to LangChain and CrewAI, and what a production ADK deployment looks like end-to-end. If you are evaluating frameworks for an agent project on GCP, this is the version we wish existed when we were doing the same evaluation in mid-2025.
Versions and dates: ADK is moving fast. All examples and architectural notes below reflect the public ADK release as of mid-2026 and Vertex AI Agent Engine GA features available at the same point. APIs and best practices are still evolving — check the official ADK docs for breaking changes before adopting verbatim.
What ADK Actually Is
The Agent Development Kit is an open-source Python framework (with a TypeScript flavor, though the Python implementation is the production-ready one) for building agents. The mental model has six primitives:
- Agents — an LLM (Gemini by default, others via LiteLLM) plus a system prompt, a set of tools, and an output schema. The agent runs a loop: read input → reason → optionally call tools → reason about results → produce output.
- Tools — Python functions the agent can call. Strongly-typed signatures (Pydantic models) mean the LLM gets schema information it can use to call the tool correctly.
- Sessions — durable state across agent invocations. Persisted in Cloud Storage, Firestore, or in-memory for local dev. Sessions hold conversation history, intermediate results, and any user-scoped state.
- Memory — a layer above sessions for long-term, retrieval-augmented context. ADK has built-in support for Vertex AI Search as the retrieval backend.
- Multi-Agent Orchestration — explicit support for sub-agents (one agent calling another), sequential workflows (agent A → agent B → agent C), and parallel workflows (fan out to multiple sub-agents, gather results).
- Evaluation —
AgentEvaluatorruns the agent against a golden test set, scores outputs against reference responses, and integrates into CI/CD. This is the primitive most other frameworks treat as an afterthought.
The defining design choice is how opinionated ADK is about production. Sessions are not a free-for-all dict; they are typed objects. Tools are not free-form Python; they are decorated functions with Pydantic models. Deployment is not "figure out a container yourself"; it is agent.deploy() to Vertex AI Agent Engine. Every primitive trades flexibility for production-readiness.
A Minimum ADK Agent
Concretely, here is what the smallest meaningful ADK agent looks like:
from google.adk import Agent
from google.adk.tools import tool
@tool
def get_campaign_performance(campaign_id: str, days: int = 7) -> dict:
"""Look up performance metrics for a campaign over the last N days.
Args:
campaign_id: Google Ads campaign ID (numeric string).
days: Lookback window in days. Default 7.
Returns:
Dict with impressions, clicks, conversions, spend, CPA.
"""
# In real code, this hits BigQuery — see our BigQuery posts.
# Here we return a stub for illustration.
return {
"impressions": 152_341,
"clicks": 4_812,
"conversions": 287,
"spend": 18_452.50,
"cpa": 64.30,
}
agent = Agent(
name="performance_analyst",
model="gemini-2.5-pro",
instruction=(
"You are a paid-media performance analyst. "
"Use the available tools to answer questions about campaign performance. "
"Always cite the specific metrics you used and over what time window."
),
tools=[get_campaign_performance],
)
response = agent.run("How is campaign 12345678 doing this week?")
print(response.output)
That's the floor — about 30 lines for a working agent that can answer a marketing question by calling a BigQuery-backed tool. Everything else (sessions, memory, multi-agent, deployment) is incremental on top.
When ADK Is the Right Framework
ADK is the right pick under three conditions:
1. You are deploying on GCP. ADK + Vertex AI Agent Engine + BigQuery + Cloud Run is one IAM boundary, one billing surface, one observability stack. The tools the agent needs (BigQuery queries, Cloud Storage reads, Vertex AI Search retrieval) have native ADK helpers. Cross-cloud is possible but you give up most of the integration value.
2. You want production discipline as a default, not as a retrofit. Evals, structured logging, deterministic deployment, and IAM-bounded tool access are first-class. The cost is less freedom to experiment quickly outside those rails — which is the right cost for production but the wrong cost for a hackathon.
3. The use case maps cleanly to the agent model. ADK is excellent at "LLM with tools" agents and at structured multi-agent workflows. It is overkill for simple LLM-only tasks (just call Gemini directly) and underkill for highly dynamic, free-form orchestration (where LangGraph's state-machine model fits better).
We have built ADK agents at TagSpecialist for: marketing analytics natural-language interfaces (NL → BigQuery SQL), campaign anomaly detection with Slack alerts, attribution explainer agents, multi-agent campaign diagnostics, and a customer-facing onboarding agent. All five fit ADK's strengths cleanly.
When ADK Is the Wrong Framework
Three cases where it is not.
1. Multi-cloud or non-GCP primary. If your stack is AWS Bedrock + Anthropic + Snowflake, you are paying for ADK's GCP integration and getting a generic Python framework in return. LangChain or building directly against Anthropic's SDK fits better.
2. You need an enormous, current ecosystem of integrations. LangChain has 700+ integrations against everything from Discord to legacy SAP connectors. ADK's ecosystem is smaller and growing. If "connect to [niche tool]" is your dominant need, LangChain saves time.
3. You want highly dynamic orchestration with arbitrary state machines. LangGraph models agents as graph nodes with explicit state transitions, which is the right primitive for some workflows (especially long-running, branching, multi-checkpoint flows). ADK's multi-agent primitives are simpler — sub-agents, sequential, parallel — and less expressive for the most complex flows.
How ADK Compares
A direct comparison of the four major frameworks in 2026, by the dimensions that matter for production:
| Dimension | ADK | LangChain | LangGraph | CrewAI |
|---|---|---|---|---|
| Primary use case | Production agents on GCP | Broad LLM apps | Complex stateful workflows | Role-based multi-agent collab |
| Production-first design | Yes (evals, deploy, IAM) | Retrofit via LangSmith | Yes | Partial |
| Deployment | One command to Vertex AI Agent Engine | Bring your own | Bring your own | Bring your own |
| Multi-agent | Yes (sub-agents, workflows) | Yes (lower-level) | Yes (graph state) | Yes (roles, crews) |
| Eval primitives | Built-in AgentEvaluator | LangSmith (separate) | LangSmith (separate) | Limited |
| Observability | Cloud Trace, structured logs | LangSmith / OpenTelemetry | LangSmith / OpenTelemetry | Limited |
| Provider support | Gemini-first, others via LiteLLM | Universal | Universal | Universal |
| Ecosystem size | Smaller, growing | Largest | Growing | Mid-sized |
| Learning curve | Moderate | Moderate-high | High | Low |
The headline: ADK trades ecosystem breadth for production discipline and GCP integration. That trade is the right one for many production agent projects on GCP and the wrong one for almost everything else.
Production Architecture for an ADK Agent
A real ADK deployment has more shape than a single agent script. The reference architecture we use at TagSpecialist:
graph TD
A[User / Caller<br/>Slack, web, internal API] --> B[API Gateway / Cloud Run<br/>Auth + rate limit]
B --> C[ADK Agent<br/>Vertex AI Agent Engine]
C --> D[Gemini 2.5<br/>via Vertex AI]
C --> E[Tools Layer]
E --> F[BigQuery<br/>read-only, scoped IAM]
E --> G[Vertex AI Search<br/>RAG retrieval]
E --> H[External APIs<br/>Google Ads, Meta, etc.]
E --> I[MCP Servers<br/>shared tool ecosystem]
C --> J[Sessions<br/>Firestore / Cloud Storage]
C --> K[Memory<br/>Vertex AI Search index]
C -.observability.-> L[Cloud Trace + Cloud Logging<br/>per-step spans]
C -.evals.-> M[Eval harness in CI/CD<br/>golden + adversarial tests]
Five distinct concerns, each its own configuration surface:
- The agent itself — model, prompt, output schema, tools.
- The tools layer — typed functions, MCP servers, OpenAPI integrations.
- State (sessions + memory) — durable storage so the agent isn't goldfish.
- Observability — Cloud Trace per step, structured logging, cost tracking per invocation.
- Evals — golden tests + adversarial tests run on every prompt or tool change.
The biggest difference between an ADK agent that ships and an ADK agent that gets stuck in eternal proof-of-concept is whether all five concerns are addressed. We see roughly half of audit engagements where teams have built a working agent in a notebook and stalled out at deployment because the tools layer is not safe (full BigQuery write access from the agent), the eval set does not exist (so changes are scary), or observability is missing (so debugging requires log diving).
A Real Use Case: Marketing Analytics Agent
The most common ADK use case in marketing is the natural-language analytics agent — "tell me which campaigns are underperforming this week" or "explain why CPA spiked yesterday." A real implementation has three tools:
@tool
def query_campaign_performance(
start_date: str,
end_date: str,
metrics: list[str],
group_by: list[str] | None = None,
) -> dict:
"""Query BigQuery for campaign performance metrics over a date range.
Read-only access to a single curated `marketing_marts.campaign_daily` view."""
# ...
@tool
def detect_anomalies(
metric: str,
lookback_days: int = 30,
sensitivity: float = 2.0,
) -> list[dict]:
"""Run BQML anomaly detection on a metric. Returns list of anomalies."""
# ...
@tool
def explain_change(
metric: str,
change_pct: float,
period_a: str,
period_b: str,
) -> dict:
"""Decompose a metric change across dimensions (campaign, geo, device)
to identify which segments drove the change."""
# ...
agent = Agent(
name="marketing_analyst",
model="gemini-2.5-pro",
instruction=open("prompts/marketing_analyst.md").read(),
tools=[query_campaign_performance, detect_anomalies, explain_change],
)
The interesting work is not in the agent — it is in the three tools. Each tool is a typed Python function that hits BigQuery via a service account with scoped read-only IAM. The agent picks which tools to call and in what order based on the question. It cannot run arbitrary SQL; it can only call the three tools.
This is the safety story that most LangChain marketing-analytics demos fail at. A LangChain agent with a generic BigQuerySQLTool can run any SELECT — and, if the IAM is wrong, can run any UPDATE or DELETE. An ADK agent with three typed tools can only do what those three tools allow, with full audit-log traceability of every BigQuery call back to the agent invocation.
Evaluation: The Difference Between a Demo and Production
The single most overlooked aspect of agent development is evaluation. ADK builds it in via AgentEvaluator:
from google.adk.evaluation import AgentEvaluator
evaluator = AgentEvaluator(agent=agent)
# Golden tests — happy-path cases that should always pass
golden = evaluator.run_eval_set("evals/golden.yaml")
assert golden.pass_rate >= 0.95
# Adversarial tests — edge cases, prompt injections, off-topic
adversarial = evaluator.run_eval_set("evals/adversarial.yaml")
assert adversarial.pass_rate >= 0.85
The eval YAML looks like:
- name: "weekly_performance_question"
input: "How are my Google Ads campaigns doing this week?"
expected_tool_calls:
- query_campaign_performance:
start_date: "{last_week_start}"
end_date: "{today}"
expected_output_contains:
- "campaign"
- "this week"
- name: "off_topic_rejection"
input: "Write me a poem about cats."
expected_output_contains:
- "marketing analytics"
expected_tool_calls: []
These run in CI on every commit. A change to the agent prompt that breaks the off-topic rejection case fails the build before it ships. This is the hygiene that separates the agents that work today and tomorrow from the ones that work in a demo and break next week.
Common Mistakes Teams Make with ADK
After ~12 ADK production deployments at TagSpecialist, the patterns that recur:
-
Building the agent before the tools. The agent is the easy part. The tools are 80% of the work and the source of 95% of bugs. Start with the tools, test them in isolation, then layer the agent on top.
-
No eval set on day one. Without golden tests, every prompt change is a leap of faith. Every team that skips evals at the start ends up retrofitting them painfully when the third "this used to work" regression lands.
-
Over-broad tool access. Giving the agent a generic
run_sqltool with full BigQuery access is a footgun. Give it three to seven typed tools that each do one thing, with read-only IAM scoped to specific tables or views. -
Cold starts on Vertex AI Agent Engine. The first request to an idle agent takes 3-8 seconds to spin up the runtime. For interactive use cases, configure min instances >= 1.
-
Not testing on the actual model you'll ship. Many teams develop against
gemini-2.5-flashfor cost reasons and then swap togemini-2.5-profor production. Behavior differs subtly. Test on the model you'll ship from day one. -
Skipping Cloud Trace. When an agent does the wrong thing, the only way to debug efficiently is the trace tree showing which tool got called with what arguments and what the LLM did between calls. Cloud Trace is free at typical agent volumes; turn it on.
-
Forgetting per-invocation cost tracking. Gemini calls + BigQuery queries + Vertex AI Search retrievals add up faster than people expect, especially with multi-agent setups. Tag every invocation with a
request_idand roll up costs per request. We have seen teams discover their agent costs $0.40 per query at month three when their budget assumed $0.04.
How TagSpecialist Helps
If you are evaluating ADK for a real project, the Google ADK specialist engagements we offer are:
- Agent prototype ($5,000-$12,000, 2-3 weeks) — validate an agent use case end-to-end before bigger commitment. Includes ADK scaffolding, three to five tools, basic eval set, and a live demo deployed to Vertex AI Agent Engine.
- Marketing analytics agent ($8,000-$18,000, 3-5 weeks) — production single-agent loop with BigQuery tool layer, Slack/email integration, anomaly detection, and full eval harness.
- Production multi-agent system ($25,000-$60,000, 6-10 weeks) — full multi-agent orchestration with sub-agents, evals, observability, deployment pipeline, and runbooks.
- Managed agent operations (from $400/month) — ongoing eval runs, prompt updates, model upgrades, and on-call response.
For broader 2026 context on the data infrastructure ADK agents typically sit on top of, see Server-Side Tagging Best Practices 2026 and our BigQuery specialist page.
If you want a no-commitment scoping call to walk through your use case, book 15 minutes. We will tell you honestly whether ADK is the right tool for the job — including the cases where a simpler approach would work better.
The framing that matters in 2026: agents are not magic; they are software. ADK is the framework that treats them like software — with types, tests, deploys, and observability — instead of like Jupyter cells with extra steps. For production work on GCP, that's the right trade.
Need Help Building Your Data Infrastructure?
Our data engineers build production-ready BigQuery warehouses and ETL pipelines. Own your data infrastructure.