PythonTypeScriptMedium — primitives with opinions

Google Agent Development Kit (ADK)

Composable agent hierarchies (LLM agents plus deterministic sequential/parallel/loop agents) with a built-in dev UI and a path to Vertex AI Agent Engine deployment.

Architecture

  • LlmAgent = model + instruction + tools + sub-agents; the model can transfer control to a sub-agent by name (an AgentTool alternative wraps an agent as a callable tool instead).
  • Workflow agentsSequentialAgent, ParallelAgent, LoopAgent — orchestrate children with code, not prompts; mixing them with LLM agents yields explicit control flow.
  • Session, State, Memory: SessionService stores events and a key-value state shared across agents (output_key writes an agent's result into it); MemoryService is the cross-session store.
  • Runner drives the event loop and yields typed events (text, tool call, state delta) suitable for streaming; callbacks (before_model, after_tool) act as guardrail and instrumentation hooks.
  • Tools include Python functions, OpenAPI specs, MCP servers, and Google-hosted tools (Search, Code Execution); an adk web UI traces runs locally.

Best use cases

  • Teams building on Gemini and Google Cloud who want managed deployment (Agent Engine) and Vertex tooling.
  • Hierarchies combining deterministic stages with LLM agents.
  • Voice/streaming agents using Gemini Live via the bidi-streaming support.

Weaknesses

  • Gemini-first: other models work through LiteLLM adapters, with weaker support for provider-specific features.
  • The sub-agent transfer mechanism relies on the model choosing to delegate; misrouting shows up as silent wrong-agent answers unless you trace.
  • Shared state dict is untyped; agents reading keys other agents write is a source of hard-to-find coupling.
  • Young project with rapid releases; TypeScript and Java ports trail the Python API.
  • Deployment story is strongest on Google infrastructure; self-hosting durable sessions means wiring your own SessionService backend.

When NOT to use it

  • No Google Cloud footprint and no Gemini requirement — the ecosystem advantages disappear.
  • Simple single-agent tools where the hierarchy machinery is dead weight.
  • You need a mature, widely documented graph runtime today.

Code example

Illustrative — APIs change between versions.

1from google.adk.agents import LlmAgent, SequentialAgent
2from google.adk.runners import InMemoryRunner
3
4def fetch_metrics(service: str, window_h: int = 24) -> dict:
5 """Return error rate and p95 latency for a service."""
6 return metrics_api.query(service, window_h)
7
8analyst = LlmAgent(
9 name="analyst", model="gemini-2.5-flash", # model id is version-sensitive
10 instruction="Pull metrics for the named service and state anomalies as bullets.",
11 tools=[fetch_metrics], output_key="analysis", # writes into session.state
12)
13writer = LlmAgent(
14 name="writer", model="gemini-2.5-flash",
15 instruction="Write a 3-sentence incident summary from {analysis}.", # reads session.state
16)
17pipeline = SequentialAgent(name="incident_report", sub_agents=[analyst, writer]) # deterministic order
18
19runner = InMemoryRunner(agent=pipeline)
20async for event in runner.run_async(user_id="u1", session_id="s1", new_message=text("checkout-api")):
21 if event.is_final_response():
22 print(event.content.parts[0].text)

Alternatives

Related lessons