generated from amazon-archives/__template_Apache-2.0
-
Notifications
You must be signed in to change notification settings - Fork 677
feat: add CancellationToken for graceful agent execution cancellation #1772
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
jgoyani1
wants to merge
1
commit into
strands-agents:main
Choose a base branch
from
jgoyani1:feat/cancellation-token-impl
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,6 @@ | ||
| """SDK type definitions.""" | ||
|
|
||
| from .cancellation import CancellationToken | ||
| from .collections import PaginatedList | ||
|
|
||
| __all__ = ["PaginatedList"] | ||
| __all__ = ["CancellationToken", "PaginatedList"] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| """Cancellation token types for graceful agent termination.""" | ||
|
|
||
| import threading | ||
|
|
||
|
|
||
| class CancellationToken: | ||
| """Thread-safe cancellation token for graceful agent termination. | ||
|
|
||
| This token can be used to signal cancellation requests from any thread | ||
| and checked synchronously during agent execution. When cancelled, the | ||
| agent will stop processing and yield a stop event with interrupt reasoning. | ||
|
|
||
| Example: | ||
| ```python | ||
| token = CancellationToken() | ||
|
|
||
| # In another thread or external system | ||
| token.cancel() | ||
|
|
||
| # In agent execution | ||
| if token.is_cancelled(): | ||
| # Stop processing | ||
| pass | ||
| ``` | ||
|
|
||
| Note: | ||
| This is a minimal implementation focused on cancellation signaling. | ||
| Callback registration for resource cleanup can be added in a future | ||
| phase if resource cleanup use cases emerge. | ||
| """ | ||
|
|
||
| def __init__(self) -> None: | ||
| """Initialize a new cancellation token.""" | ||
| self._cancelled = False | ||
| self._lock = threading.Lock() | ||
|
|
||
| def cancel(self) -> None: | ||
| """Signal cancellation request. | ||
|
|
||
| This method is thread-safe and can be called from any thread. | ||
| Multiple calls to cancel() are safe and idempotent. | ||
| """ | ||
| with self._lock: | ||
| self._cancelled = True | ||
|
|
||
| def is_cancelled(self) -> bool: | ||
| """Check if cancellation has been requested. | ||
|
|
||
| This method is thread-safe and can be called from any thread. | ||
|
|
||
| Returns: | ||
| True if cancellation has been requested, False otherwise. | ||
| """ | ||
| with self._lock: | ||
| return self._cancelled | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
During design review, I would recommend bringing up the naming of this. Throughout the SDK we now use
stop,interrupt, andcancel. In my mind, they have the following meanings:stop: Stop the agent loop and exit out.interrupt: Interrupt the agent loop to get a user response. Once received, resume from where agent loop was interrupted.cancel: We use this specifically on components. For example, we can cancel a tool call that is about to happen. So it isn't so much stopping as it is about preventing something from getting started.I am thinking
cancelis the right word here because we are checking it at certain points in the loop to essentially say, don't go forward with this action.stopas a verb is probably something we should avoid using going forward. So we could still have a "stop event" or "stop reason", but the underlying reason is because of things like "interrupted", "cancelled", etc.So with all that said, I would probably recommend calling this CancelSignal. It also fits in line with python's asyncio
task.cancel()terminology.