aws / aws/bedrock-agentcore-sdk-python
AgentCore Memory + Browser Tool: Conversation history corruption causing orphaned toolUse
- 主要言語
- Python
- スター
- 761
- フォーク
- 147
- 平均マージ
- 1日 23時間
- マージ済み PR(30日)
- 7
説明
# 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.
コントリビューションガイド
調査の方向性
AgentCoreMemorySessionManager から始め、提供されている Browser Tool とメモリ設定を使用して失敗を再現し、保存前と読み込み後の会話履歴を比較します。2 回目のエージェント呼び出しが成功し、読み込まれた履歴で有効な toolUse/toolResult の対応関係が維持されていれば完了です。issue では特定のファイルやテストは指定されていません。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- aws, python
- 領域
- ai, backend-api-design
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100