ApplicationIntegrationToolset silently builds no tools when a Connectors schema operation fails, and waits forever on one that never finishes

Aperta
#7,165 2 commenti 0 reazioni 1 assegnatario Vedi su GitHub

@sanketpatil06 ci sta già lavorando.

Dal 18/9/2026.

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

tools

🔴 Required Information

Describe the Bug:

ConnectionsClient._poll_operation() (used by ApplicationIntegrationToolset for connection entities and actions) has two problems:

  1. A failed operation is treated as success. A finished Connectors long-running operation carries either response or error (google.longrunning.Operation). The loop only checks done, and the callers then read response.jsonSchema / response.operations, falling back to {} / []. So when the lookup fails, for example because of a mistyped entity or action name or a missing permission on the connection, the toolset builds without error and with no tools for that entity. With explicit operations it builds tools against an empty schema, and a failed action produces a tool with an empty display name. Nothing tells the developer why the agent can't reach the connector.
  2. The wait is unbounded. while not operation_done: has no deadline, so an operation that never finishes blocks toolset construction, and therefore agent startup, forever. bf4143ac bounded each HTTP call in this client for exactly this reason ("an unavailable endpoint could block agent execution indefinitely"), but the polling loop around those calls is still open-ended.

It also sleeps one extra second after the operation is already done, which slows every entity and action lookup.

Steps to Reproduce:

  1. pip install google-adk (reproduced on main @ f33d4923 / 2.9.0).
  2. Run the script below. It builds a real ApplicationIntegrationToolset for a connection whose getEntityType operation finishes with error (entity Acount does not exist). HTTP is stubbed, so no GCP project is needed.

Expected Behavior:
Toolset construction fails with the operation's error message, and a stuck operation fails after a bounded wait.

Observed Behavior:

toolset built; tools: []
elapsed: 1.0s

Environment Details:

  • ADK Library Version (pip show google-adk): 2.9.0 (main @ f33d4923)
  • Desktop OS: Windows 11
  • Python Version (python -V): 3.12.10

Model Information:

  • Are you using LiteLLM: No
  • Which model is being used: N/A (toolset construction, no model call)

🟡 Optional Information

Minimal Reproduction Code:

import asyncio
from unittest import mock

from google.adk.tools.application_integration_tool import ApplicationIntegrationToolset
from google.adk.tools.application_integration_tool.clients.connections_client import ConnectionsClient

FAILED_OP = {
    "name": "operations/op-1",
    "done": True,
    "error": {"code": 5, "message": "Entity type 'Acount' not found."},
}


def fake_get(url, headers=None, timeout=None):
  resp = mock.MagicMock(status_code=200)
  if url.endswith("?view=BASIC"):
    resp.json.return_value = {"name": "projects/p/locations/us-central1/connections/sfdc",
                              "serviceDirectory": "sd", "host": ""}
  elif "getEntityType" in url:
    resp.json.return_value = {"name": "operations/op-1"}
  else:
    resp.json.return_value = FAILED_OP
  return resp


mod = "google.adk.tools.application_integration_tool.clients.connections_client"
with mock.patch(f"{mod}._mtls_utils.get_api_endpoint", return_value="connectors.googleapis.com"), \
     mock.patch.object(ConnectionsClient, "_get_access_token", return_value="token"), \
     mock.patch(f"{mod}.requests.get", side_effect=fake_get):
  toolset = ApplicationIntegrationToolset(
      project="p", location="us-central1", connection="sfdc",
      entity_operations={"Acount": []},  # typo for "Account"
  )
  print("toolset built; tools:", [t.name for t in asyncio.run(toolset.get_tools())])

Suggested fix: in _poll_operation, raise ValueError with the operation's error message when a finished operation carries error. That's the error type the callers already document. Stop polling after a deadline with TimeoutError, and don't sleep once done is set. I have a PR ready with tests.

How often has this issue occurred?:

  • Always (100%): any failed entity or action schema lookup.
Lingua principale
Python
Stelle
21.6k
Fork
4k
Merge medio
13h 49m
PR unite (30g)
10

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di google/adk-python

Tutte le issue di google/adk-python

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.