chore: import upstream snapshot with attribution
Continuous Integration / Pre-commit Linter (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.10) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.11) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.12) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.12) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Has been cancelled
Copybara PR Handler / close-imported-pr (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 13:25:13 +08:00
commit ec2b666284
2231 changed files with 491535 additions and 0 deletions
+91
View File
@@ -0,0 +1,91 @@
# Abort Agent Sample
## Overview
This sample demonstrates a standalone ADK agent designed specifically to showcase cooperative task cancellation on client disconnections.
The agent leverages a custom tool that counts from 1 to a target number requested by the user, pausing 1 second between each count and printing the progress directly to the server's stdout terminal. This delay allows you to easily trigger connection drops (by cancelling client requests mid-execution) and visually observe that background agent execution halts immediately in the server terminal, resolving resource leaks.
## Sample Inputs
- `Count to 10 seconds`
The agent will call the `count_seconds` tool with a target count of 10, pausing 1 second between each increment.
- `Please count up to 20`
The agent will invoke the tool to count to 20. If you close the client connection (such as pressing `Ctrl+C` in a cURL window or closing your browser tab) while the loop is running, counting halts immediately.
## Graph
```mermaid
graph TD
START --> AbortAgent
AbortAgent --> |"Invoke Tool"| count_seconds
count_seconds --> |"Abort if Disconnected / Done"| AbortAgent
AbortAgent --> ANSWER
```
## How To
### 1. Running Locally via the CLI
To interact with the agent in your local shell terminal:
```bash
adk run contributing/samples/core/abort/
```
Type `count to 10` at the `[user]:` prompt. Pressing `Ctrl+C` mid-run will abort counting and exit.
### 2. Running via HTTP Server and cURL
To verify connection-drop abortion over network protocols (e.g. simple HTTP REST request):
1. Start the local development server to watch the sample workspace:
```bash
adk web --allow_origins=http://localhost:4200 contributing/samples/
```
1. In a separate terminal, register the test session (local CLI development servers run with `--auto_create_session` set to `False` by default):
```bash
curl -X POST http://localhost:8000/apps/abort_agent/users/user/sessions \
-H "Content-Type: application/json" \
-d '{"session_id": "8b24e6ed-1fff-4f0c-a06a-e065692a446e"}'
```
1. Initiate the count request (this blocks waiting for a response):
```bash
curl -X POST http://localhost:8000/run \
-H "Content-Type: application/json" \
-d '{
"app_name": "abort_agent",
"user_id": "user",
"session_id": "8b24e6ed-1fff-4f0c-a06a-e065692a446e",
"new_message": {
"role": "user",
"parts": [{"text": "count to 100"}]
}
}'
```
1. Observe your `adk web` terminal window. You will see the counting progress logging.
1. **Trigger the Abort**: Press `Ctrl+C` in your cURL terminal window to close the client connection.
1. Observe the server console window. Counting halts instantly and prints:
```text
[Counting Tool] Count was ABORTED mid-run at progress: X/100 (Client Disconnected)!
```
### 3. Running and Testing via ADK Web (Dev UI)
To observe cooperative aborts interactively in the web-based developer interface:
1. Start the local development server:
```bash
adk web --allow_origins=http://localhost:4200 contributing/samples/
```
1. Open the ADK Web interface (`http://localhost:4200`) in your web browser.
1. Select the **`abort_agent`** app from the left sidebar panel.
1. Type `count to 100` in the message input box and click submit.
1. **Trigger the Abort**: Simply close your browser tab, refresh the page, or navigate away from the chat panel.
1. Observe the server's stdout terminal console. You will see that counting halts immediately and logs:
```text
[Counting Tool] Count was ABORTED mid-run (Client Disconnected)!
```
@@ -0,0 +1,15 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from . import agent
+70
View File
@@ -0,0 +1,70 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
import logging
from google.adk import Agent
logger = logging.getLogger("google_adk." + __name__)
async def count_seconds(target: int) -> str:
"""Counts from 1 to the target number, pausing 1 second between counts, and prints each count.
Args:
target: The target number to count to.
"""
logger.info("Starting count from 1 to %d...", target)
print(
f"\n[Counting Tool] Starting counting up to {target} in console...",
flush=True,
)
i = 0
try:
for i in range(1, target + 1):
await asyncio.sleep(1)
# Print to standard stdout so it shows directly in the server terminal
print(f"[Counting Tool] Progress: {i}/{target}", flush=True)
logger.info("Counted: %d/%d", i, target)
print(
f"[Counting Tool] Finished counting up to {target}.\n",
flush=True,
)
return f"Successfully counted from 1 to {target} in the console."
except asyncio.CancelledError:
print(
f"\n[Counting Tool] Count was ABORTED mid-run at progress: {i}/{target}"
" (Client Disconnected)!\n",
flush=True,
)
logger.warning("Counting tool was cancelled mid-run.")
raise
root_agent = Agent(
name="abort_agent",
description=(
"An agent designed to demonstrate how ADK handles client disconnects"
" and aborts agent executions mid-run using a counting loop with a"
" 1-second delay."
),
instruction="""You are an abort coordinator.
Your goal is to demonstrate cooperative task abortion.
When asked to count to a number (or count for a number of seconds), invoke the `count_seconds` tool with the target number.
Do not try to count by yourself; always delegate counting to the `count_seconds` tool so that progress is accurately printed and logs can show task cancellation when a disconnect happens.""",
tools=[count_seconds],
)