Skip to content

Commit ec38560

Browse files
committed
fix: filter 'SDK_UNKNOWN_MEMBER' from response content
1 parent 2db5226 commit ec38560

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/strands/models/bedrock.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ def _format_bedrock_messages(self, messages: Messages) -> Messages:
256256
"""Format messages for Bedrock API compatibility.
257257
258258
This function ensures messages conform to Bedrock's expected format by:
259+
- Filtering out SDK_UNKNOWN_MEMBER content blocks
259260
- Cleaning tool result content blocks by removing additional fields that may be
260261
useful for retaining information in hooks but would cause Bedrock validation
261262
exceptions when presented with unexpected fields
@@ -273,11 +274,17 @@ def _format_bedrock_messages(self, messages: Messages) -> Messages:
273274
https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolResultBlock.html
274275
"""
275276
cleaned_messages = []
277+
filtered_unknown_members = False
276278

277279
for message in messages:
278280
cleaned_content: list[ContentBlock] = []
279281

280282
for content_block in message["content"]:
283+
# Filter out SDK_UNKNOWN_MEMBER content blocks
284+
if "SDK_UNKNOWN_MEMBER" in content_block:
285+
filtered_unknown_members = True
286+
continue
287+
281288
if "toolResult" in content_block:
282289
# Create a new content block with only the cleaned toolResult
283290
tool_result: ToolResult = content_block["toolResult"]
@@ -297,6 +304,11 @@ def _format_bedrock_messages(self, messages: Messages) -> Messages:
297304
cleaned_message: Message = Message(content=cleaned_content, role=message["role"])
298305
cleaned_messages.append(cleaned_message)
299306

307+
if filtered_unknown_members:
308+
logger.warning(
309+
"Filtered out SDK_UNKNOWN_MEMBER content blocks from messages, consider upgrading boto3 version"
310+
)
311+
300312
return cleaned_messages
301313

302314
def _has_blocked_guardrail(self, guardrail_data: dict[str, Any]) -> bool:

tests/strands/models/test_bedrock.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,3 +1301,27 @@ def test_format_request_cleans_tool_result_content_blocks(model, model_id):
13011301
assert tool_result == expected
13021302
assert "extraField" not in tool_result
13031303
assert "mcpMetadata" not in tool_result
1304+
1305+
1306+
def test_format_request_filters_sdk_unknown_member_content_blocks(model, model_id, caplog):
1307+
"""Test that format_request filters out SDK_UNKNOWN_MEMBER content blocks."""
1308+
messages = [
1309+
{
1310+
"role": "assistant",
1311+
"content": [
1312+
{"text": "Hello"},
1313+
{"SDK_UNKNOWN_MEMBER": {"name": "reasoningContent"}},
1314+
{"text": "World"},
1315+
],
1316+
}
1317+
]
1318+
1319+
formatted_request = model.format_request(messages)
1320+
1321+
content = formatted_request["messages"][0]["content"]
1322+
assert len(content) == 2
1323+
assert content[0] == {"text": "Hello"}
1324+
assert content[1] == {"text": "World"}
1325+
1326+
for block in content:
1327+
assert "SDK_UNKNOWN_MEMBER" not in block

0 commit comments

Comments
 (0)