Restored history with `filter_restored_tool_context` can be Converse-invalid (assistant-prefill ValidationException)

Open
#547 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
70/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Quiet
Tech stack
aws, python
Domain
ai, backend

Research direction

Start in bedrock_agentcore.memory.integrations.strands, focusing on AgentCoreMemorySessionManager and _filter_restored_tool_context. Reproduce the user → assistant/toolUse → user/toolResult → assistant history with filtering enabled, then verify that restored messages start with a user turn, preserve strict role alternation, and remain valid before the next Converse call.

Written by the indexing model from the issue text.

Description

Describe the bug

When AgentCoreMemorySessionManager is configured with filter_restored_tool_context=True, restoring a session can produce a message array that Bedrock Converse rejects.

_filter_restored_tool_context strips toolUse/toolResult blocks from restored history. A user turn that carried only a toolResult becomes empty and is dropped. Dropping it leaves the two surrounding assistant turns adjacent, which breaks Converse's strict role alternation. The history can also end up starting on an assistant turn.

On the next invocation Bedrock rejects the array. On models that reject assistant prefill it surfaces as:

ValidationException (ConverseStream): This model does not support assistant message prefill.
The conversation must end with a user message.

In a Strands agent on AgentCore Runtime this fails the event loop and the invocation returns a 500. The invalid array is built by the tool-use loop plus restore regardless of model — a prefill-tolerant model silently accepts it, so the issue can stay hidden until a model switch surfaces it (observed: the same restored history failed on Claude Opus 4.8 but was accepted by Claude Sonnet 4.6).

To Reproduce

A restored conversation of this shape is enough to trigger it:

user(query) → assistant(text + toolUse) → user(toolResult only) → assistant(answer)
  1. Configure AgentCoreMemoryConfig(..., filter_restored_tool_context=True).
  2. Persist a turn where the assistant calls a tool and the following user turn contains only the toolResult.
  3. Restore the session (e.g. construct a new Agent with the same session manager) and invoke it.
  4. After stripping, the toolResult-only user turn is dropped and the history collapses to two adjacent assistant turns; the next Converse call fails with the ValidationException above.

Expected behavior

After stripping tool blocks, the restored history should stay valid for Bedrock Converse: strict role alternation, starting on a user turn. Adjacent same-role turns left behind by the strip should be merged so the array remains valid once the runtime appends the next user turn before the model call.

Environment

  • bedrock-agentcore (Strands integration: bedrock_agentcore.memory.integrations.strands)
  • Strands agent running on Amazon Bedrock AgentCore Runtime
  • Bedrock model that rejects assistant prefill, ConverseStream
Dominant language
Python
Stars
764
Forks
149
Avg merge
1d 19h
Merged PRs (30d)
7

Contributor guide

Open the contributing guide

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 aws/bedrock-agentcore-sdk-python

All issues in aws/bedrock-agentcore-sdk-python

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.