Skip to content

ComputerUseToolset: safety_decision for click_at requires safety_acknowledgement even after user confirms in ADK UI #97

@anant-acog

Description

@anant-acog

Description of the bug:

When using the ComputerUseToolset sample with gemini-2.5-computer-use-preview-10-2025, I get a 400 INVALID_ARGUMENT error from the Gemini API after confirming a safety prompt in the ADK web UI.

The error:

400 INVALID_ARGUMENT. {
"error": {
"code": 400,
"message": "The safety decision from function call click_at must be acknowledged in the corresponding function response.",
"status": "INVALID_ARGUMENT"
}
}

From the message, it looks like the tool response that ADK sends back to Gemini is missing the required safety_acknowledgement field for a click_at call that has a safety_decision.

I am not running my own model loop – I’m using the standard ADK Agent + ComputerUseToolset + adk web UX. I do click “Yes” when the safety confirmation dialog appears in the UI, but the next call to generate_content still fails with the error above.

Environment / Versions

OS: macOS (Apple Silicon)

Python: 3.13.9

google-adk: 1.20.0

google-genai: >=1.52.0

playwright: 1.56.0

browserbase: >=1.4.0 (installed, but not actively using Browserbase for this repro)

rich: >=14.2.0

termcolor: 3.2.0

Model: gemini-2.5-computer-use-preview-10-2025

Dependency block:

dependencies = [
"browserbase>=1.4.0", # only if you actually use Browserbase
"google-adk==1.20.0",
"google-genai>=1.52.0",
"playwright==1.56.0",
"rich>=14.2.0",
"termcolor==3.2.0",
]

Code / Setup

I’m using the sample Computer Use project from the ADK repo:

https://github.com/google/adk-python/tree/main/contributing/samples/computer_use

With a minimal agent that looks like this:

agent.py

from google.adk import Agent
from google.adk.models.google_llm import Gemini
from google.adk.tools.computer_use.computer_use_toolset import ComputerUseToolset
from typing_extensions import override

from .playwright import PlaywrightComputer

root_agent = Agent(
model="gemini-2.5-computer-use-preview-10-2025",
name="hello_world_agent",
description=(
"computer use agent that can operate a browser on a computer to finish user tasks"
),
instruction="you are a computer use agent",
tools=[
ComputerUseToolset(
computer=PlaywrightComputer(screen_size=(800, 600))
)
],
)

PlaywrightComputer is basically the same as the sample in contributing/samples/computer_use/playwright.py (Chromium via Playwright, returns ComputerState(screenshot, url)). I haven’t added any custom LLM loop logic – I let ADK run everything via adk web.

Steps to Reproduce

Clone the ADK repo and/or the contributing/samples/computer_use sample, or set up the equivalent project with the Agent above.

Install dependencies:

pip install google-adk==1.20.0 google-genai>=1.52.0 playwright==1.56.0 browserbase>=1.4.0 rich>=14.2.0 termcolor==3.2.0
playwright install chromium

Run the ADK dev server (from the sample project):

adk web .

Open the web UI in the browser and talk to the hello_world_agent.
For example, ask:

“Go to biohaven.com and go to pipeline page and grab information.”

At some point the model issues a click_at with a safety_decision, and the ADK UI shows a safety confirmation dialog.

Click “Yes” in the UI to allow the action.

Observe in the backend logs:

google.genai.errors.ClientError: 400 INVALID_ARGUMENT. {
"error": {
"code": 400,
"message": "The safety decision from function call click_at must be acknowledged in the corresponding function response.",
"status": "INVALID_ARGUMENT"
}
}

The stack trace points back into:

google/adk/models/google_llm.py::generate_content_async

google/genai/_api_client.py

with the 400 ClientError from models.generate_content(...).

Actual vs expected behavior:

No response

Any other information you'd like to share?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions