From 94367cd9161bf8c15b327e6237ac3b9e89e463c9 Mon Sep 17 00:00:00 2001 From: NNIIOVO Date: Tue, 10 Nov 2026 12:19:28 -0600 Subject: [PATCH] Python: default A2A raw parts without a media type to application/octet-stream Signed-off-by: NNIIOVO --- python/packages/a2a/agent_framework_a2a/_agent.py | 3 ++- python/packages/a2a/tests/test_a2a_agent.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/python/packages/a2a/agent_framework_a2a/_agent.py b/python/packages/a2a/agent_framework_a2a/_agent.py index da70753719f..e58ffb87293 100644 --- a/python/packages/a2a/agent_framework_a2a/_agent.py +++ b/python/packages/a2a/agent_framework_a2a/_agent.py @@ -1347,7 +1347,8 @@ def _parse_contents_from_a2a( contents.append( Content.from_data( data=part.raw, - media_type=part.media_type or "", + # media_type is optional in A2A; "data:;base64,..." would not parse later. + media_type=part.media_type or "application/octet-stream", additional_properties=part_metadata, raw_representation=part, ) diff --git a/python/packages/a2a/tests/test_a2a_agent.py b/python/packages/a2a/tests/test_a2a_agent.py index 81f3e271a40..d96e97658a2 100644 --- a/python/packages/a2a/tests/test_a2a_agent.py +++ b/python/packages/a2a/tests/test_a2a_agent.py @@ -787,6 +787,19 @@ def test_parse_contents_from_a2a_with_hosted_file_uri() -> None: assert contents[0].media_type == "" # Converted None to empty string +def test_parse_contents_from_a2a_raw_part_without_media_type_round_trips() -> None: + """A raw part without media_type becomes a valid data URI that can be sent back to an A2A agent.""" + + agent = A2AAgent(client=MagicMock(), http_client=None) + + contents = agent._parse_contents_from_a2a([Part(raw=b"%PDF-1.7", filename="report.pdf")]) # noqa: SLF001 + + assert contents[0].type == "data" + assert contents[0].media_type == "application/octet-stream" + result = agent._prepare_message_for_a2a(Message(role="user", contents=contents)) # noqa: SLF001 + assert result.parts[0].raw == b"%PDF-1.7" + + def test_auth_interceptor_parameter() -> None: """Test that auth_interceptor parameter is accepted without errors.""" # Create a mock auth interceptor