Google ADK (Python) 2.13.0: our test log
Google ADK (Python) 2.13.0 passed our one-tool task on a local 3B model: 3 of 3 trials; cold uv install 1.7 s.
Tested by us on 2026-10-25. Local open-weight model, not the vendor's hosted models. A smoke test on a CPU-only box, not a benchmark.
Result at a glance
| Field | Value |
|---|---|
| Result | Passed |
| Version tested | 2.13.0 |
| Date and time | 2026-10-25, 23:21 to 23:21 CDT (America/Chicago) |
| Task | Give a local model one Python function, add_numbers(a, b), and ask it to use that tool to compute 17 + 25 and report the result. Pass means the function was called with 17 and 25 and the final answer contains 42. Three trials per tool, all on the same local model. |
| Model used | Qwen2.5-3B-Instruct (Q4_K_M) through Ollama 0.40.11 |
| Hardware | Linux x86_64 virtual machine (Debian 13), 8 vCPU (Intel Xeon, 1 thread per core), 15 GiB RAM, no GPU |
| Installed size (uv) | 71 MB in 48 packages |
| Install time (uv, cold) | 1.7 s |
| Install time (pip, cold) | 13.2 s |
| Installed size (pip) | 120 MB in 49 packages |
| Task trials passed | 3 of 3 |
| Task wall time (median, includes imports) | 7.6 s (range 7.0 to 9.3 s) |
| Machine load during trials | 5.3 to 6.2 (1-minute load average, 8 vCPU) |
What we found
- 3 of 3 task trials passed: the model's tool call reached the framework, the function ran with 17 and 25, and the final answer contained 42.
- Cold install took 1.7 s with uv and 13.2 s with pip, and left 71 MB in 48 packages (uv).
- Used the LiteLlm wrapper to reach a non-Google model. That path needs the google-adk[extensions] extra, which grew the environment from 71 MB to 652 MB and took 19.6 s more with uv;
mcpwas also missing and installed separately (1.0 s).
What we ran, step by step
| Step | Wall time | Exit code | Notes |
|---|---|---|---|
| Install with uv (cold, no cache) | 1.7 s | 0 | Machine load average before the run: 0.70. |
| Install with pip (cold, no cache) | 13.2 s | 0 | Load average before: 3.98. Second run; the first pip run was discarded (see the research page). |
| Install google-adk[extensions] on top | 19.57 s | 0 | Environment 652 MB afterwards. |
| Install mcp on top | 1.04 s | 0 | |
| Task command (all trials) | n/a | n/a | Run from a directory that contains common.py (shown below). Telemetry switches were set for tools that have them. |
| Task trial 1 | 9.3 s | 0 | Tool called with [[17, 25]]; answer: The result of adding 17 and 25 is 42. Load 6.22. |
| Task trial 2 | 7.6 s | 0 | Tool called with [[17, 25]]; answer: The result of adding 17 and 25 is 42. Load 6.06. |
| Task trial 3 | 7 s | 0 | Tool called with [[17, 25]]; answer: The result of adding 17 and 25 is 42. Load 5.28. |
# Install with uv (cold, no cache)
uv venv -q -p 3.13 work/py/google-adk && VIRTUAL_ENV=work/py/google-adk uv pip install --no-cache -q google-adk
# Install with pip (cold, no cache)
uv venv -q --seed -p 3.13 work/pip/google-adk && work/pip/google-adk/bin/pip install --no-cache-dir -q google-adk
# Install google-adk[extensions] on top
VIRTUAL_ENV=work/py/google-adk uv pip install --no-cache -q 'google-adk[extensions]'
# Install mcp on top
VIRTUAL_ENV=work/py/google-adk uv pip install --no-cache -q mcp
# Task command (all trials)
OTEL_SDK_DISABLED=true work/py/google-adk/bin/python tasks/google_adk_agent.pyRaw output (excerpts)
from common import *
import asyncio
from google.adk.agents import Agent
from google.adk.models.lite_llm import LiteLlm
from google.adk.runners import InMemoryRunner
from google.genai import types
agent = Agent(name="calc", model=LiteLlm(model=f"openai/{MODEL}", api_base=BASE, api_key=KEY), instruction="Use tools.", tools=[add_numbers])
async def main():
runner = InMemoryRunner(agent=agent, app_name="t")
s = await runner.session_service.create_session(app_name="t", user_id="u")
out = ""
async for ev in runner.run_async(user_id="u", session_id=s.id, new_message=types.Content(role="user", parts=[types.Part(text=TASK)])):
if ev.is_final_response() and ev.content and ev.content.parts: out = ev.content.parts[0].text
return out
report(asyncio.run(main()))import json, os
BASE = "http://127.0.0.1:11434/v1"
MODEL = os.environ.get("MODEL", "qwen2.5-3b")
KEY = "ollama"
TASK = "Use the add_numbers tool to compute 17 + 25, then tell me the result."
CALLS = []
def add_numbers(a: int, b: int) -> int:
"""Add two integers and return the sum."""
CALLS.append((a, b))
return int(a) + int(b)
def report(final):
ok = any({int(x), int(y)} == {17, 25} for x, y in CALLS) and "42" in str(final)
print("RESULT_JSON " + json.dumps({"calls": CALLS, "final": str(final)[:300], "ok": ok}))RESULT_JSON {"calls": [[17, 25]], "final": "The result of adding 17 and 25 is 42.", "ok": true}Gotchas and things that broke
- The bare google-adk install cannot talk to a local OpenAI-compatible model: you need the extensions extra, and import errors name a missing
mcppackage until you install it.
What we did not test
- Any vendor-hosted model: everything ran on a local 3B model, so tool-call reliability with frontier models is not measured here.
- Multi-agent flows, memory, long conversations, streaming, tracing and cloud deployment.
- Anything beyond one tool and one question; three trials is a smoke test, not a benchmark.
Reproduce it
Versions change. These commands install whatever is latest on the day you run them unless a version is pinned, so expect different results later. The version we measured is in the table above.
# 1. Serve any local model that supports tool calling behind an OpenAI-compatible endpoint, registered as qwen2.5-3b:
# http://127.0.0.1:11434/v1 (we used Ollama with a Qwen2.5-3B-Instruct Q4_K_M GGUF)
uv venv -p 3.13 .venv && VIRTUAL_ENV=.venv uv pip install google-adk
# 2. Save common.py (above) and the task script next to each other, then:
.venv/bin/python google_adk_agent.pyHow to read this test
Every number on this page was measured on this one machine, which also ran other jobs, so timings are indicative and vary run to run. A pass means our small task worked once or as stated, a fail means it did not work as we ran it; neither says how the tool behaves with a vendor's frontier model, on a GPU, or at scale. Where a tool could not run without an account or a GPU, we say so instead of guessing.
See the testing rig for the hardware, the local model and the rules we follow, and the test hub for every other test.
Related tests: agent frameworks and sdks
- Haystack: Haystack 3.4.1 passed our one-tool task on a local 3B model: 3 of 3 trials; cold uv install 2.3 s.
- Instructor: Instructor 1.17.0 returned a validated Pydantic object from a local 3B model in 3 of 3 trials (structured extraction, not a tool call); cold uv install 1.4 s.
- LangChain: LangChain 1.4.7 passed our one-tool task on a local 3B model: 3 of 3 trials; cold uv install 0.8 s.
- LangChain.js: LangChain.js 1.5.19 passed our one-tool task 3 of 3 on Node 20 and 3 of 3 on Node 24; about 101 MB in 36 packages.
- LangGraph: LangGraph 1.2.17 passed our one-tool task on a local 3B model: 3 of 3 trials; cold uv install 2.5 s.
- LiteLLM: LiteLLM 1.106.4 passed our one-tool task on a local 3B model: 3 of 3 trials; cold uv install 2.3 s.
FAQ
Does Google ADK (Python) work with a local model?
In our run it did for this one task: 3 of 3 trials passed against a local Qwen2.5-3B model served by Ollama. We did not test other models, and results depend heavily on the model's tool-calling ability.
How big is a fresh Google ADK (Python) install?
71 MB in 48 packages with uv on 2.13.0, measured on 2026-10-25.
Sources
- adk-python repository (fetched 2026-10-25)
Related
Markdown version for agents: /tests/google-adk.md