From 012dc572d8d610e202e91d18e86abff590aecaef Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Wed, 20 May 2026 15:52:27 +0800 Subject: [PATCH] fix(bedrock): normalize 3gp video format --- src/strands/models/bedrock.py | 9 ++++++++- tests/strands/models/test_bedrock.py | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/strands/models/bedrock.py b/src/strands/models/bedrock.py index 4cd6f7fbc..9b0bb7dd8 100644 --- a/src/strands/models/bedrock.py +++ b/src/strands/models/bedrock.py @@ -43,6 +43,12 @@ _DEFAULT_BEDROCK_MODEL_ID = "{}.anthropic.claude-sonnet-4-6" DEFAULT_BEDROCK_REGION = "us-west-2" +_BEDROCK_VIDEO_FORMAT_ALIASES = { + "3gp": "three_gp", + "3g2": "three_gp", + "3gpp": "three_gp", +} + BEDROCK_CONTEXT_WINDOW_OVERFLOW_MESSAGES = [ "Input is too long for requested model", "input length and `max_tokens` exceed context limit", @@ -702,7 +708,8 @@ def _format_request_message_content(self, content: ContentBlock) -> dict[str, An return None elif "bytes" in source: formatted_video_source = {"bytes": source["bytes"]} - result = {"format": video["format"], "source": formatted_video_source} + video_format = _BEDROCK_VIDEO_FORMAT_ALIASES.get(video["format"], video["format"]) + result = {"format": video_format, "source": formatted_video_source} return {"video": result} # https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_CitationsContentBlock.html diff --git a/tests/strands/models/test_bedrock.py b/tests/strands/models/test_bedrock.py index 319b5574f..ace2c8683 100644 --- a/tests/strands/models/test_bedrock.py +++ b/tests/strands/models/test_bedrock.py @@ -2254,6 +2254,28 @@ def test_format_request_video_s3_location(model, model_id): assert video_source == {"s3Location": {"uri": "s3://my-bucket/video.mp4"}} +@pytest.mark.parametrize("video_format", ["3gp", "3g2", "3gpp"]) +def test_format_request_maps_3gp_video_formats(model, model_id, video_format): + messages = [ + { + "role": "user", + "content": [ + { + "video": { + "format": video_format, + "source": {"bytes": b"video_data"}, + } + }, + ], + } + ] + + formatted_request = model._format_request(messages) + + video_block = formatted_request["messages"][0]["content"][0]["video"] + assert video_block == {"format": "three_gp", "source": {"bytes": b"video_data"}} + + def test_format_request_filters_document_content_blocks(model, model_id): """Test that format_request filters extra fields from document content blocks.""" messages = [