Up to this point, I have been experimenting with my own home-grown agent framework, based on Simon Willison’s great LLM project to handle wrapping the different LLMs. Armed with some experience, I want to start looking at real frameworks. Google released an Agent Development Kit at Google Next. It supports many of the features I have been playing with, including tool calling, planning, MCP, and local models. It also supports some advanced concepts like agent orchestration.
TLDR: Here’s the code repo for my initial ADK exploration.
Features
Google’s ADK has many features that are becoming common in agent frameworks:
- Agent with support for multiple LLMs, including local using LiteLLM
- Tools that support custom methods, a set of built-ins, 3rd party wrappers (including MCP), and even an easy AgentTool
- Session and Memory capabilities with in-memory and persistent examples
- Orchestration with different types of Agents to handle parallel, loops, and sequential workflows
- Built-in system of Evals for testing your Agents
ADK has a command line interface that is somewhat unique to agent frameworks. It reminds me of the Flask command line system:
adk run <agent>
adk web
adk api_server
ADK also supports a mechanism to deploy your agents to Google infrastructure (Agent Engine or Cloud Run). I’m hoping this could be used to deploy to other infrastructure too.
Converting ToolAgent
I wanted to see how easily I could convert my ToolAgent
to use ADK. The core Agent was fairly small and simple:
root_agent = Agent(
name="multi_tool_agent",
model="gemini-2.0-flash",
instruction=SYSTEM_PROMPT,
generate_content_config=types.GenerateContentConfig(
temperature=0 # More deterministic output
),
planner=PlanReActPlanner(),
tools=[
FunctionTool(func=get_weather),
FunctionTool(func=get_datetime),
FunctionTool(func=get_current_location),
FunctionTool(func=get_zipcode),
FunctionTool(func=calculate),
FunctionTool(func=get_appointment_specialties),
FunctionTool(func=get_available_appointments),
FunctionTool(func=get_appointment_details),
FunctionTool(func=book_appointment),
FunctionTool(func=cancel_appointment),
],
)
This code uses a much simpler system prompt because much of the “PLEASE USE TOOLS” prompt is handled by the tool calling system. I use a ReAct planner to get the “thinking” aspects I had in ToolAgent
. The tools themselves are still simple, mocked Python methods. ADK, like other frameworks, uses Python Typing and Docstrings to extract the specification details for the tool methods, so I changed my code (for the better):
def get_available_appointments(specialty: str) -> list[dict]:
"""
Gets the available appointments for the given specialty.
Args:
specialty (str): the specialty name
Returns:
list: a list of available appointments
Example:
>>> get_available_appointments('dentist')
[{'id': '1', 'date': '2022-01-01', 'time': '10:00 AM'}, ...]
"""
<IMPL REMOVED>
Here’s a simple exchange that required a few tools:
user: what dentist appointments are available tomorrow?
[multi_tool_agent]: /*PLANNING*/
1. Get the current date using the `get_datetime` tool.
2. Extract the date from the response and calculate tomorrow's date.
3. Get the available dentist appointments using the `get_available_appointments` tool with the specialty set to "dentist".
4. Filter the appointments to only include those that are on tomorrow's date.
5. Respond to the user with the available appointments for tomorrow.
/*ACTION*/
[multi_tool_agent]: /*REASONING*/
1. The current date is 2025-04-13.
2. Tomorrow's date is 2025-04-14.
3. Now I need to find the available dentist appointments.
/*ACTION*/
[multi_tool_agent]: /*REASONING*/
I have the available dentist appointments. I need to filter the appointments to only include those that are on tomorrow's date, which is 2025-04-14.
The available appointments for tomorrow are:
- id: 3, time: 11:00 AM
- id: 4, time: 3:00 PM
/*FINAL_ANSWER*/
The available dentist appointments for tomorrow, 2025-04-14, are:
- id: 3, time: 11:00 AM
- id: 4, time: 3:00 PM
Overall, I thought it was pretty easy to get a basic agent working. Maybe I’ll try to create a WebAgent
too. I’ll keep exploring some of the more advanced concepts to see how those can be used.
Checkout the code repo