Agent Development Kit

Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. ADK can be used with popular LLMs and open-source generative AI tools and is designed with a focus on tight integration with the Google ecosystem and Gemini models. ADK makes it easy to get started with simple agents powered by Gemini models and Google AI tools while providing the control and structure needed for more complex agent architectures and orchestration.

Opik integrates with ADK to log traces for all ADK agent executions.

Getting started

First, ensure you have both opik and google-adk installed:

$pip install opik google-adk

You can also set up Opik by using the opik configure command. This will ask you to enter either your local server address or your API key if you’re using the Cloud version:

$opik configure

Logging ADK agent executions

To track your ADK agent’s activity, use OpikTracer. This tracker records everything your agent does and saves it to Opik:

1import datetime
2from zoneinfo import ZoneInfo
3
4from google.adk.agents import Agent
5from opik.integrations.adk import OpikTracer
6
7
8def get_weather(city: str) -> dict:
9 if city.lower() == "new york":
10 return {
11 "status": "success",
12 "report": (
13 "The weather in New York is sunny with a temperature of 25 degrees"
14 " Celsius (41 degrees Fahrenheit)."
15 ),
16 }
17 else:
18 return {
19 "status": "error",
20 "error_message": f"Weather information for '{city}' is not available.",
21 }
22
23
24def get_current_time(city: str) -> dict:
25 if city.lower() == "new york":
26 tz_identifier = "America/New_York"
27 else:
28 return {
29 "status": "error",
30 "error_message": (f"Sorry, I don't have timezone information for {city}."),
31 }
32
33 tz = ZoneInfo(tz_identifier)
34 now = datetime.datetime.now(tz)
35 report = f'The current time in {city} is {now.strftime("%Y-%m-%d %H:%M:%S %Z%z")}'
36 return {"status": "success", "report": report}
37
38
39opik_tracer = OpikTracer()
40
41root_agent = Agent(
42 name="weather_time_agent",
43 model="gemini-2.0-flash-exp",
44 description=("Agent to answer questions about the time and weather in a city."),
45 instruction=("I can answer your questions about the time and weather in a city."),
46 tools=[get_weather, get_current_time],
47 before_agent_callback=opik_tracer.before_agent_callback,
48 after_agent_callback=opik_tracer.after_agent_callback,
49 before_model_callback=opik_tracer.before_model_callback,
50 after_model_callback=opik_tracer.after_model_callback,
51 before_tool_callback=opik_tracer.before_tool_callback,
52 after_tool_callback=opik_tracer.after_tool_callback,
53)

Each agent execution will now be automatically logged to the Opik platform:

Troubleshooting: Missing Trace

When using Runner.run_async, make sure to process all events completely, even after finding the final response (when event.is_final_response() is True). If you exit the loop too early, OpikTracer won’t log the final response and your trace will be incomplete. Don’t use code that stops processing events prematurely:

1async for event in runner.run_async(user_id=user_id, session_id=session_id, new_message=content):
2 if event.is_final_response():
3 ...
4 break # Stop processing events once the final response is found

There is an upstream discussion about how to best solve this source of confusion: https://github.com/google/adk-python/issues/1695.

Multi-agent instrumentation

Adding OpikTracer callbacks to a multi-agent system can be time-consuming. To make this simpler, we’ve created an experimental feature that lets you add OpikTracer callbacks to all agents at once track_adk_agent_recursive:

1from opik.integrations.adk import OpikTracer, track_adk_agent_recursive
2opik_tracer = OpikTracer()
3
4translator_to_english = adk_agents.Agent(
5 name="Translator",
6 model=MODEL_NAME,
7 description="Translates text to English.",
8)
9summarizer = adk_agents.Agent(
10 name="Summarizer",
11 model=MODEL_NAME,
12 description="Summarizes text to 1 sentence.",
13)
14root_agent = adk_agents.SequentialAgent(
15 name="TextProcessingAssistant",
16 sub_agents=[translator_to_english, summarizer],
17 description="Runs translator to english then summarizer, in order.",
18)
19
20track_adk_agent_recursive(root_agent, opik_tracer)
opik.integrations.adk.track_adk_agent_recursive is an experimental feature. If you find any problems while using it, please report them so they can be fixed.

Logging threads

The Opik integration automatically retrieves key information from ADK Session:

  • It uses the session ID as Opik Thread ID, allowing you to easily group and review traces from the same thread
  • It logs the app_name and userId as metadata