aws / aws/bedrock-agentcore-sdk-python

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

Aperta
#245 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Python
Stelle
761
Fork
147
Merge medio
1g 23h
PR unite (30g)
7

Descrizione

# 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.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia con AgentCoreMemorySessionManager e riproduci il problema utilizzando il Browser Tool e la configurazione della memoria forniti, confrontando la cronologia della conversazione prima del salvataggio e dopo il caricamento. Il lavoro è completato quando la seconda chiamata all’agente ha esito positivo e la cronologia caricata conserva un’associazione valida tra toolUse e toolResult; nell’issue non sono indicati file o test specifici.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
aws, python
Ambito
ai, backend-api-design
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.