feat(bidi): support request_state stop_event_loop flag#1954
Open
agent-of-mkmeral wants to merge 2 commits intostrands-agents:mainfrom
Open
feat(bidi): support request_state stop_event_loop flag#1954agent-of-mkmeral wants to merge 2 commits intostrands-agents:mainfrom
agent-of-mkmeral wants to merge 2 commits intostrands-agents:mainfrom
Conversation
Replace the built-in stop_conversation tool with a generic request_state['stop_event_loop'] mechanism. This allows any tool (e.g. strands_tools.stop) to signal the BidiAgent to gracefully close the connection by setting request_state['stop_event_loop'] = True. Changes: - Remove stop_conversation tool and its exports - Add request_state initialization in _run_tool to ensure tools that access request_state work correctly - Replace tool name-based check with stop_event_loop flag check - Add comprehensive tests for request_state initialization, stop_event_loop flag, and invocation_state preservation Based on: strands-agents@657ddcd
mkmeral
reviewed
Mar 23, 2026
Contributor
mkmeral
left a comment
There was a problem hiding this comment.
also check the docs, if we need to update anything there, create a related PR. check if stop event loop is documented somewhere. also check if stop conversation tool is used, etc.
| await self._event_queue.put(ToolResultMessageEvent(tool_result_message)) | ||
|
|
||
| # Check for stop_conversation before sending to model | ||
| if tool_use["name"] == "stop_conversation": |
Contributor
There was a problem hiding this comment.
@agent-of-mkmeral we should probably keep it for now, but add a warning that we will remove in next versions. So we support both, and we can remove the tool later.
It gives users who depend on it some time
Author
There was a problem hiding this comment.
Done! Commit 1381ba1 keeps stop_conversation with backward compatibility:
| What | How |
|---|---|
stop_conversation tool |
Restored — emits DeprecationWarning when called |
bidi/__init__.py export |
Restored — from strands.experimental.bidi import stop_conversation works |
| Loop check | Primary: request_state["stop_event_loop"] flag. Fallback: tool_use["name"] == "stop_conversation" with deprecation warning |
| Tests | New test_bidi_agent_loop_stop_conversation_deprecated_but_works verifies both the tool works AND the warning is emitted |
Users who depend on stop_conversation get a clear deprecation message pointing them to strands_tools.stop or request_state["stop_event_loop"].
Address review feedback from @mkmeral to keep backward compatibility: - Restore stop_conversation tool with deprecation warning (DeprecationWarning emitted at runtime when the tool is called) - Restore stop_conversation export in bidi/__init__.py - Support both mechanisms in loop.py: 1. request_state['stop_event_loop'] flag (new, recommended) 2. tool name 'stop_conversation' check (deprecated, backward compatible) - Add test_bidi_agent_loop_stop_conversation_deprecated_but_works - Update existing tests to work with both mechanisms
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
Replace the hard-coded
stop_conversationtool name check with a genericrequest_state["stop_event_loop"]mechanism, while keepingstop_conversationwith a deprecation warning for backward compatibility.Motivation
The previous approach hard-coded a
stop_conversationtool name check in the bidi agent loop. This was:strands_toolsalready has astoptool that usesrequest_stateChanges
Deprecated (kept for backward compatibility)
stop_conversationtool now emitsDeprecationWarningwhen calledDeprecationWarningas a fallbackbidi/__init__.pyare preservedChanged
agent/loop.py:request_statein_invocation_statebefore tool executionrequest_state.get("stop_event_loop", False)flagtool_use["name"] == "stop_conversation"with deprecation warningtools/stop_conversation.py: AddedDeprecationWarningpointing users tostrands_tools.stoptools/__init__.py: Updated docstring with deprecation noticeio/text.py: Updated log messageAdded
test_bidi_agent_loop_stop_conversation_deprecated_but_works— verifies backward compatibility with deprecationtest_bidi_agent_loop_stop_event_loop_flag— verifies new flag mechanismtest_bidi_agent_loop_request_state_initialized_for_tools— verifiesrequest_stateavailabilitytest_bidi_agent_loop_request_state_preserved_with_invocation_state— verifies existing state preservedMigration Path
Before (deprecated):
After (recommended):
Or any custom tool:
Based on: 657ddcd