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
AgentToolalternative wraps an agent as a callable tool instead). - Workflow agents —
SequentialAgent,ParallelAgent,LoopAgent— orchestrate children with code, not prompts; mixing them with LLM agents yields explicit control flow. - Session, State, Memory:
SessionServicestores events and a key-valuestateshared across agents (output_keywrites an agent's result into it);MemoryServiceis 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 webUI 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
statedict 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
SessionServicebackend.
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, SequentialAgent2from google.adk.runners import InMemoryRunner3 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-sensitive10 instruction="Pull metrics for the named service and state anomalies as bullets.",11 tools=[fetch_metrics], output_key="analysis", # writes into session.state12)13writer = LlmAgent(14 name="writer", model="gemini-2.5-flash",15 instruction="Write a 3-sentence incident summary from {analysis}.", # reads session.state16)17pipeline = SequentialAgent(name="incident_report", sub_agents=[analyst, writer]) # deterministic order18 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)