fix: strip reasoningContent blocks in filter_restored_tool_context - #627
fix: strip reasoningContent blocks in filter_restored_tool_context#627gingeekrishna wants to merge 2 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. |
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