Skip to content

๐Ÿค– Agent Development Kits (ADK) Overview

Label: Your Toolkit for Building AI Agents

An Agent Development Kit (ADK) is an open-source, code-first toolkit for building, evaluating, and deploying AI agents. ADKs provide the foundational components and patterns you need to create sophisticated multi-agent systems.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Agent Development Kit (ADK) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Agents โ”‚ โ”‚ Tools โ”‚ โ”‚
โ”‚ โ”‚ Framework โ”‚ โ”‚ Ecosystem โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚Orchestrationโ”‚ โ”‚ Evaluation โ”‚ โ”‚
โ”‚ โ”‚ Engine โ”‚ โ”‚ Framework โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Deployment โ”‚ โ”‚ Monitoring โ”‚ โ”‚
โ”‚ โ”‚ Tools โ”‚ โ”‚ & Logging โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ADKs are built for multi-agent systems from the ground up:

from adk import Agent, Workflow
# Define specialized agents
researcher = Agent(
name="Researcher",
role="Information Gatherer",
tools=[web_search, database_query]
)
analyst = Agent(
name="Analyst",
role="Data Processor",
tools=[data_analysis, visualization]
)
writer = Agent(
name="Writer",
role="Content Creator",
tools=[document_generator, style_checker]
)
# Orchestrate them together
workflow = Workflow(agents=[researcher, analyst, writer])
result = workflow.run("Create a market analysis report")

ADKs connect to existing tools and data:

Your Agent (via ADK)
โ”‚
โ”œโ”€โ”€โ†’ Productivity Tools (Notion, Slack, Email)
โ”‚
โ”œโ”€โ”€โ†’ Business Systems (HubSpot, Salesforce)
โ”‚
โ”œโ”€โ”€โ†’ Development Tools (GitHub, Jira)
โ”‚
โ”œโ”€โ”€โ†’ Tool Frameworks (LangChain, LlamaIndex)
โ”‚
โ””โ”€โ”€โ†’ Agent Frameworks (LangGraph, CrewAI)

ADKs support multiple orchestration patterns:

class SequentialWorkflow:
"""
Execute agents one after another
"""
def __init__(self, agents: List[Agent]):
self.agents = agents
async def execute(self, task: str) -> dict:
"""
Each agent processes output from previous agent
"""
result = {"input": task}
for agent in self.agents:
result = await agent.process(result)
print(f"{agent.name} completed: {result['status']}")
return result
# Example: Content creation pipeline
workflow = SequentialWorkflow([
researcher, # Gathers information
analyst, # Analyzes data
writer # Creates content
])
result = await workflow.execute("Write about AI trends")
class ParallelWorkflow:
"""
Execute multiple agents simultaneously
"""
def __init__(self, agents: List[Agent]):
self.agents = agents
async def execute(self, task: str) -> dict:
"""
All agents work on same task in parallel
"""
# Execute all agents concurrently
results = await asyncio.gather(*[
agent.process(task) for agent in self.agents
])
# Combine results
combined = self.merge_results(results)
return combined
# Example: Multi-perspective analysis
workflow = ParallelWorkflow([
technical_analyst,
business_analyst,
user_experience_analyst
])
analysis = await workflow.execute("Evaluate this product feature")
class DynamicWorkflow:
"""
Adapt execution based on intermediate results
"""
def __init__(self, coordinator: Agent, specialists: dict[Agent]):
self.coordinator = coordinator
self.specialists = specialists
async def execute(self, task: str) -> dict:
"""
Coordinator decides which specialists to engage
"""
# Coordinator analyzes task
plan = await self.coordinator.create_plan(task)
results = {}
for step in plan['steps']:
# Select appropriate specialist
specialist = self.specialists[step['agent_type']]
# Execute with context from previous steps
result = await specialist.process(step['subtask'], context=results)
results[step['id']] = result
# Coordinator evaluates progress
evaluation = await self.coordinator.evaluate(results)
if evaluation['should_adjust']:
plan = await self.coordinator.replan(task, results)
return results
# Example: Adaptive project management
coordinator = Agent("Project Manager", tools=[planning, evaluation])
specialists = {
"code": Agent("Developer", tools=[code_generation, testing]),
"design": Agent("Designer", tools=[ui_design, prototyping]),
"docs": Agent("Technical Writer", tools=[documentation])
}
workflow = DynamicWorkflow(coordinator, specialists)
result = await workflow.execute("Build user authentication feature")
from adk import Tool, Agent
# Define tools
@Tool
def search_notion(query: str) -> dict:
"""
Search Notion workspace for documents
Args:
query: Search query string
Returns:
dict: Search results with page titles and content
"""
notion_client = NotionClient(api_key=NOTION_API_KEY)
results = notion_client.search(query)
return {
"results": results,
"count": len(results)
}
@Tool
def send_slack_message(channel: str, message: str) -> dict:
"""
Send message to Slack channel
Args:
channel: Slack channel name
message: Message content
Returns:
dict: Message delivery status
"""
slack_client = SlackClient(token=SLACK_TOKEN)
response = slack_client.chat_postMessage(
channel=channel,
text=message
)
return {"status": "sent", "timestamp": response['ts']}
@Tool
def update_hubspot_contact(contact_id: str, updates: dict) -> dict:
"""
Update HubSpot contact record
Args:
contact_id: HubSpot contact identifier
updates: Dictionary of fields to update
Returns:
dict: Updated contact information
"""
hubspot_client = HubSpotClient(api_key=HUBSPOT_API_KEY)
contact = hubspot_client.contacts.update(contact_id, updates)
return contact
# Create agent with tools
assistant = Agent(
name="ProductivityAssistant",
tools=[search_notion, send_slack_message, update_hubspot_contact],
instructions="""
You are a productivity assistant that helps users:
1. Find information in Notion
2. Communicate via Slack
3. Manage contacts in HubSpot
Use the appropriate tool for each task.
"""
)
# Agent automatically uses tools as needed
response = await assistant.process(
"Find the Q4 planning doc in Notion and share it in #strategy channel"
)
from langchain.tools import Tool as LangChainTool
from adk import Agent, adapt_langchain_tool
# Adapt LangChain tools for ADK
langchain_tool = LangChainTool(
name="Calculator",
func=lambda x: eval(x),
description="Performs mathematical calculations"
)
adk_tool = adapt_langchain_tool(langchain_tool)
# Use in ADK agent
calculator_agent = Agent(
name="MathAssistant",
tools=[adk_tool]
)
from crewai import Crew, Task
from adk import Agent as ADKAgent
# Bridge ADK agents with CrewAI
def adk_to_crewai(adk_agent: ADKAgent):
"""Convert ADK agent to CrewAI agent"""
return CrewAgent(
role=adk_agent.role,
goal=adk_agent.goal,
backstory=adk_agent.backstory,
tools=adk_agent.tools
)
# Use both frameworks together
adk_researcher = ADKAgent("Researcher", tools=[web_search])
crew_writer = CrewAgent(role="Writer", tools=[content_gen])
crew = Crew(
agents=[adk_to_crewai(adk_researcher), crew_writer]
)
from adk import Agent, MCPServer
# Create agent with MCP server
agent = Agent("DocumentExpert", tools=[doc_search, doc_summary])
# Expose agent via MCP
mcp_server = MCPServer(agent)
mcp_server.start(port=8080)
# Now any MCP-compatible client can use this agent
from adk import Agent, A2AClient
class CollaborativeAgent(Agent):
"""
Agent that can collaborate with other agents via A2A
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.a2a_client = A2AClient()
async def collaborate(self, task: str):
"""
Delegate subtasks to specialist agents
"""
# Analyze task
subtasks = await self.break_down_task(task)
# Find appropriate agents via A2A
for subtask in subtasks:
specialist = await self.a2a_client.find_agent(
capability=subtask['required_skill']
)
# Delegate via A2A protocol
result = await self.a2a_client.send_request(
agent_id=specialist['id'],
task=subtask['description'],
context=subtask['context']
)
self.incorporate_result(result)
# Usage
agent = CollaborativeAgent("Coordinator")
result = await agent.collaborate("Create comprehensive market report")
# Agent automatically finds and delegates to research, analysis, and writing agents
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ What's Your Priority? โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚
โ”œโ”€โ†’ Quick Prototyping โ”€โ”€โ”€โ”€โ”€โ”€โ†’ LangChain
โ”‚ + Simple ADK wrapper
โ”‚
โ”œโ”€โ†’ Production Scale โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ Full-featured ADK
โ”‚ (Google ADK, etc.)
โ”‚
โ”œโ”€โ†’ Team Collaboration โ”€โ”€โ”€โ”€โ”€โ”€โ†’ CrewAI-compatible ADK
โ”‚
โ”œโ”€โ†’ Custom Workflows โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ LangGraph
โ”‚ + ADK integration
โ”‚
โ””โ”€โ†’ Research/Experimentation โ†’ Lightweight custom ADK

Best for: Enterprise applications, production deployment

from google_adk import Agent, Workflow
agent = Agent.from_config("config.yaml")
workflow = Workflow.create(agents=[agent])

Best for: Rapid prototyping, rich tool ecosystem

from langchain.agents import create_agent
from custom_adk import Orchestrator
agent = create_agent(tools=[...])
orchestrator = Orchestrator([agent])

Best for: Full control, specialized requirements

class CustomADK:
def create_agent(self, config):
# Your implementation
pass
from adk import Agent, SequentialWorkflow
# Step 1: Define agents
task_breakdown_agent = Agent(
name="Task Breakdown Agent",
instructions="Analyze tasks and break them into subtasks"
)
execution_agents = [
Agent(name="Code Agent", instructions="Generate code"),
Agent(name="Design Agent", instructions="Create designs"),
Agent(name="Docs Agent", instructions="Write documentation")
]
review_agent = Agent(
name="Review Agent",
instructions="Quality check all outputs"
)
# Step 2: Create workflow
workflow = SequentialWorkflow([
task_breakdown_agent,
*execution_agents,
review_agent
])
# Step 3: Execute
result = await workflow.run(
"Build a user authentication system with docs"
)
print(f"Project completed: {result['status']}")
class CustomADK:
"""
Custom ADK with specialized features
"""
def __init__(self):
self.agents = {}
self.workflows = {}
self.tool_registry = ToolRegistry()
def register_agent(self, agent: Agent):
"""Register an agent"""
self.agents[agent.id] = agent
agent.set_tool_registry(self.tool_registry)
def create_workflow(self, workflow_type: str, config: dict):
"""Factory for creating workflows"""
if workflow_type == "sequential":
return SequentialWorkflow(config)
elif workflow_type == "parallel":
return ParallelWorkflow(config)
elif workflow_type == "dynamic":
return DynamicWorkflow(config)
else:
raise ValueError(f"Unknown workflow type: {workflow_type}")
def deploy(self, agent: Agent, platform: str):
"""Deploy agent to production platform"""
deployer = DeploymentManager(platform)
endpoint = deployer.deploy(agent)
return endpoint
  • ADKs provide comprehensive toolkits for agent development
  • Multi-agent orchestration is built-in and flexible
  • Tool integration connects agents to real-world systems
  • Framework compatibility lets you mix and match approaches
  • MCP and A2A enable sharing and collaboration

Continue to Agent Types to learn about different agent architectures and when to use each.


๐Ÿ’ก Pro Tip: Start with an established ADK for your first project, then customize or build your own as you understand your specific needs.