Repository navigation
fix: strip reasoningContent blocks in filter_restored_tool_context - #627
gingeekrishna wants to merge 3 commits into
Conversation
When extended thinking is enabled, assistant messages contain reasoningContent blocks alongside toolUse blocks. The filter was stripping toolUse/toolResult but leaving reasoningContent intact, producing a partial assistant message that Bedrock rejects with: ValidationException: `thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified. reasoningContent blocks are semantically coupled to the tool calls that follow them — stripping the tool context without the accompanying reasoning leaves an incoherent and API-rejected message. The fix adds reasoningContent to the set of block types removed by the filter. Fixes aws#621 Signed-off-by: gingeekrishna <gingeekrishna@gmail.com>
There was a problem hiding this comment.
Pull request overview
This PR fixes restored-session filtering for Bedrock extended thinking by ensuring reasoningContent blocks are removed alongside toolUse/toolResult blocks, preventing invalid assistant messages from being sent to Bedrock.
Changes:
- Update
_filter_restored_tool_context()to also stripreasoningContentblocks when filtering restored history. - Expand the session manager integration test suite with regression cases covering reasoning+tool interactions and preservation of plain text.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| tests/bedrock_agentcore/memory/integrations/strands/test_agentcore_memory_session_manager.py | Adds regression tests validating restored-history filtering when reasoningContent is present. |
| src/bedrock_agentcore/memory/integrations/strands/session_manager.py | Extends restored tool-context filtering to remove reasoningContent blocks and documents the rationale. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| """Strip historical toolUse/toolResult context from restored messages. | ||
|
|
||
| Extended-thinking (reasoningContent) blocks are coupled to the tool | ||
| calls that follow them. Bedrock rejects an assistant message whose | ||
| reasoningContent blocks have been separated from their companion |
…_context Clarify that the flag strips reasoningContent (extended thinking) blocks in addition to toolUse/toolResult, and explain why the two are always removed together. Signed-off-by: gingeekrishna <gingeekrishna@gmail.com>
|
Done - addressed Copilot review: updated the filter_restored_tool_context docstring in AgentCoreMemoryConfig (commit d4f9b5d) to clarify that it strips toolUse, toolResult, and reasoningContent (extended thinking) blocks, with a note explaining that reasoning blocks must always be removed alongside the tool calls that followed them. |
|
Independent confirmation from a different model generation, plus one case the tests do not pin down. Reproduction, Claude Haiku 5.5 (adaptive thinking on by default), The root cause is broader than tool coupling. The PR's docstring and all five tests frame Suggested addition: one test where an assistant message is Happy to open that as a follow-up commit on this branch if useful. This fix is the right shape and we would like to drop our wrapper once it ships. |
|
@art-aws thanks for the independent confirmation and the sharper framing -- you're right that the real invariant is "bound to the context it was produced in," not "coupled to the following tool call." Done in eff72ee:
The implementation was already correct for your text-only case (it strips reasoningContent unconditionally), so this closes the gap you flagged where a future reviewer could otherwise "fix" it into only stripping when paired with a tool and silently reintroduce the failure. All 188 tests in the file pass. Glad to hear this lets you drop the SMART wrapper once it ships. |
reasoningContent is invalidated by any change earlier in the context, not just tool stripping, so the filter must drop it unconditionally rather than only when paired with toolUse. Adds the missing text-only case and clarifies the docstring accordingly.
eff72ee to
4c44c6e
Compare
Summary
_filter_restored_tool_context()strippedtoolUse/toolResultblocks from restored session history but leftreasoningContent(extended thinking) blocks intact.reasoningContentblocks are present without their companiontoolUseblocks, raising aValidationException."reasoningContent" not in contentto the filter predicate so thinking blocks are stripped together with the tool calls they preceded.Root cause
When extended thinking is enabled, an assistant turn produces a message like:
{ "role": "assistant", "content": [ {"reasoningContent": {"reasoningText": {"text": "…"}}}, {"toolUse": {"toolUseId": "t1", "name": "my_tool", "input": {}}} ] }reasoningContentandtoolUseare semantically coupled — the Bedrock API requires them to appear together.filter_restored_tool_contextwas removingtoolUsewhile keepingreasoningContent, producing a partial message that the API refuses.Test plan
test_strips_reasoning_content_alongside_tool_use— assistant message with reasoningContent+toolUse → both stripped, only plain-text assistant message survivestest_message_with_only_reasoning_and_tool_use_is_dropped_entirely— message becomes empty after stripping → excluded from outputtest_text_alongside_reasoning_and_tool_use_is_preserved— text content survives after stripping reasoning+toolUsetest_messages_without_tool_context_are_unchanged— plain text messages pass through unchanged (no regression)test_existing_tool_use_filtering_still_works— original toolUse/toolResult behaviour preservedFixes #621