aws / aws/bedrock-agentcore-sdk-python

AgentCore Memory + Browser Tool: Conversation history corruption causing orphaned toolUse

Open
#245 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
761
Forks
147
Avg merge
1d 23h
Merged PRs (30d)
7

Description

# Bug Description

When using `AgentCoreMemorySessionManager` with `AgentCoreBrowser` (Browser Tool) in Strands Agents, the conversation history becomes corrupted after the first message, leading to ValidationException errors.

## Environment

- **bedrock-agentcore**: Latest version
- **Strands Agents**: Latest version
- **strands-agents-tools**: Latest version
- **Region**: us-east-1
- **Memory ID**: memory_agentcore_demo_complex-MOvGs2AZQ5

## Problem Description

### Error Message
```
Session message history has an orphaned toolUse with no toolResult.
Adding toolResult content blocks to create valid conversation.

ValidationException: The number of toolResult blocks at messages.27.content
exceeds the number of toolUse blocks of previous turn.
```

### Behavior
- ✅ **First message in session**: Works correctly
- ❌ **Subsequent messages in same session**: Fails with ValidationException
- ✅ **Without Browser Tool**: Memory works correctly with other tools (Gateway tools)
- ❌ **With Browser Tool**: Memory appears to save corrupted conversation history

## Code Example

```python
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
from strands import Agent
from strands_tools.browser import AgentCoreBrowser

# Memory configuration
memory_config = AgentCoreMemoryConfig(
memory_id="memory_agentcore_demo_complex-MOvGs2AZQ5",
session_id="test_session_123",
actor_id="test_user"
)

session_manager = AgentCoreMemorySessionManager(
agentcore_memory_config=memory_config,
region_name="us-east-1"
)

# Browser Tool
browser_tool = AgentCoreBrowser(region="us-east-1")

# Agent with Browser Tool + Memory
agent = Agent(
model="us.anthropic.claude-sonnet-4-5-20250929-v1:0",
system_prompt="You are a helpful assistant.",
session_manager=session_manager,
tools=[browser_tool.browser]
)

# First call: SUCCESS ✅
result1 = agent("Hello")

# Second call in same session: FAILS ❌
# Memory loads corrupted history with orphaned toolUse
result2 = agent("How are you?")
```

## Root Cause Hypothesis

The issue appears to be in how **AgentCoreMemorySessionManager saves and loads conversation history** when Browser Tool is involved:

### Possible Causes:

1. **Incomplete tool call persistence**:
- Browser Tool creates `tool_use` blocks
- Memory saves the conversation
- On reload, `tool_use` blocks are missing or corrupted
- But `tool_result` blocks are preserved
- This creates "orphaned toolUse"

2. **Serialization/Deserialization issue**:
- Browser Tool's conversation format may not be fully compatible with Memory's storage format
- Some data is lost during save/load cycle

3. **Context truncation without cleanup**:
- Memory may truncate conversation history
- But doesn't properly clean up orphaned tool blocks

## Logs

```
2026-02-02T10:12:24.909000+00:00 Session message history has an orphaned toolUse with no toolResult. Adding toolResult content blocks to create valid conversation.

2026-02-02T10:12:25.876000+00:00 botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The number of toolResult blocks at messages.27.content exceeds the number of toolUse blocks of previous turn.
```

## Testing Results

| Configuration | Result |
|--------------|--------|
| Memory + Gateway Tools | ✅ Works |
| Memory + Browser Tool | ❌ Fails after first message |
| No Memory + Browser Tool | ❓ Not tested (Memory required) |
| Memory + Gateway + Browser | ❌ Fails after first message |

This strongly suggests the issue is in how **Memory handles Browser Tool's conversation history**.

## Questions

1. Is Browser Tool + Memory a tested and supported combination?
2. Are there known limitations or special handling required for Browser Tool with Memory?
3. Does Memory have special serialization logic for different tool types?
4. Is there documentation on conversation history format requirements?

## Expected Behavior

AgentCore Memory should correctly save and restore conversation history when Browser Tool is used, maintaining proper `tool_use`/`tool_result` pairing.

## Actual Behavior

After the first message, Memory loads corrupted conversation history with orphaned tool blocks, causing Bedrock API to reject subsequent requests.

## Related Issues

- Similar issue reported in Strands Agents: strands-agents/sdk-python#1610
- Anthropic Claude Code #13964: orphaned tool_result blocks after context truncation
- browser-use #710: Browser-use fails with Bedrock Converse API

## Suggested Investigation

1. Add logging to show exactly what Memory saves vs. what it loads
2. Compare conversation history format for Browser Tool vs. other tools
3. Check if Browser Tool's message format requires special handling
4. Verify that all tool blocks are properly paired during save/load

## Suggested Fix

Add validation and cleanup in `AgentCoreMemorySessionManager`:

1. Before saving: Validate that all `tool_use` blocks have corresponding `tool_result` blocks
2. After loading: Sanitize conversation history to remove orphaned tool blocks
3. Add specific handling for Browser Tool if its format differs from standard tools

## Impact

This bug prevents using Browser Tool with Memory, which is a critical limitation for building context-aware agents that need web browsing capabilities.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.