Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Feature Request: Run Cancellation / Abort Support for Java ADK

Open
#1,341 2 comments 0 reactions 1 assignee View on GitHub

Maintainers usually reply within 1 day

@hemasekhar-p is already working on this.

Since Jul 9, 2026.

  • #1434 by @rohan-naik07 — open
  • #1621 by @sangkyoonnam — open

Assessment

This issue has not been assessed yet.

Description

needs review

Summary

Java ADK currently lacks a mechanism to cancel/abort a running agent invocation. TypeScript ADK already ships mature AbortSignal-based cancellation (docs/runtime/cancel.md), and Python ADK has active work in progress (google/adk-python#4825, google/adk-python#5983). Java ADK has no equivalent — no API, no internal checkpoints, and no graceful shutdown path.

Motivation

Cancellation is essential for production agent deployments:

  • User-facing "Stop" button — long-running multi-tool loops need immediate, graceful termination when the user clicks stop.
  • Timeout enforcement — server-side request deadlines (e.g., HTTP gateway timeouts) must propagate into the agent execution.
  • Resource cleanup — without cooperative cancellation, in-flight LLM streaming connections and tool executions leak resources.
  • Cost control — aborting early avoids unnecessary LLM token consumption.

Current State

Language Status Mechanism
TypeScript ✅ Shipped runner.runAsync(params, { signal }) with AbortSignal; checkpoints in LLM call, tool execution, and plugin callbacks; graceful generator completion (no throw)
Python 🚧 In progress google/adk-python#4825 (stop_event: asyncio.Event), google/adk-python#5983 (/cancel API + task.cancel())
Java ❌ Missing Only InvocationContext.endInvocation (internal flag, not externally triggerable); Disposable.dispose() is a hard RxJava cut (not graceful, tools don't check it); no RunConfig timeout/cancel field

Proposed Design (aligned with TypeScript)

API Surface
// Option A: CancellationToken (similar to .NET / structured concurrency)
CancellationTokenSource cts = new CancellationTokenSource();
RunConfig config = RunConfig.builder()
    .cancellationToken(cts.token())
    .build();

Flowable<Event> events = runner.runAsync(userId, sessionId, content, config);
// Later:
cts.cancel(); // triggers graceful shutdown

// Option B: RxJava-native (Disposable already exists, but needs cooperative checks)
// Enhance internal checkpoints to check subscription disposal state
Internal Checkpoints (minimum)

Following TypeScript's lead, cancellation should be checked at:

  1. Before each LLM call — BaseLlmFlow.runOneStep() (already checks endInvocation, easy to extend)
  2. Before each tool execution — Functions.handleFunctionCalls() (currently has NO cancellation check)
  3. During LLM streaming — between chunks (for long generations)
  4. Plugin/callback boundaries — beforeModel / afterModel / beforeTool / afterTool
Semantics (align with TypeScript cancel.md)
  • Graceful: the Flowable completes normally (no error signal), already-emitted events are preserved in the session.
  • Cooperative: cancellation is checked at defined points; in-flight atomic operations (single LLM call, single tool run) may complete before the next checkpoint.
  • Idempotent: calling cancel multiple times is safe.

Questions for Maintainers

  1. API preference: CancellationToken (explicit, testable) vs. leveraging RxJava Disposable semantics (less new API surface but less portable)?
  2. Scope: Should cancellation also cover runLive (streaming/live mode), or start with runAsync only?
  3. Event emission on cancel: Should the framework emit a final "cancelled" event (like Python's temp:cancelled state proposal), or just complete silently (like TypeScript)?

References


I'm happy to contribute the implementation once the API direction is agreed upon. I have production experience implementing cooperative cancellation in a Java ADK-based agent platform (checkpoint-based, with checks at beforeModel/beforeTool/afterEvent boundaries).

Dominant language
Java
Stars
1.7k
Forks
433
Avg merge
3d 9h
Merged PRs (30d)
46

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from google/adk-java

All issues in google/adk-java

Similar issues

More Java issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.