Skip to content

Commit 160931e

Browse files
committed
Drop partTypes, use application/x-a2a-datapart
1 parent b1e42c8 commit 160931e

2 files changed

Lines changed: 22 additions & 30 deletions

File tree

src/a2a/contrib/tasks/vertex_task_converter.py

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@
3434
_EXTENSIONS_KEY = 'extensions'
3535
_REFERENCE_TASK_IDS_KEY = 'referenceTaskIds'
3636
_PART_METADATA_KEY = 'partMetadata'
37-
_PART_TYPES_KEY = 'partTypes'
3837
_METADATA_VERSION_KEY = '__vertex_compat_v'
3938
_METADATA_VERSION_NUMBER = 1.0
4039

40+
_DATA_PART_MIME_TYPE = 'application/x-a2a-datapart'
41+
4142

4243
_TO_SDK_TASK_STATE = {
4344
vertexai_types.A2aTaskState.STATE_UNSPECIFIED: TaskState.unknown,
@@ -81,14 +82,7 @@ def to_stored_metadata(
8182
if reference_task_ids:
8283
metadata[_REFERENCE_TASK_IDS_KEY] = reference_task_ids
8384

84-
part_types = []
85-
part_metadata = []
86-
for part in parts:
87-
part_types.append('data' if isinstance(part.root, DataPart) else '')
88-
part_metadata.append(part.root.metadata)
89-
90-
metadata[_PART_TYPES_KEY] = part_types
91-
metadata[_PART_METADATA_KEY] = part_metadata
85+
metadata[_PART_METADATA_KEY] = [part.root.metadata for part in parts]
9286

9387
return metadata
9488

@@ -99,7 +93,6 @@ class _UnpackedMetadata:
9993
extensions: list[str] | None = None
10094
reference_task_ids: list[str] | None = None
10195
part_metadata: list[dict[str, Any] | None] | None = None
102-
part_types: list[str] | None = None
10396

10497

10598
def to_sdk_metadata(
@@ -118,7 +111,6 @@ def to_sdk_metadata(
118111
extensions=stored_metadata.get(_EXTENSIONS_KEY),
119112
reference_task_ids=stored_metadata.get(_REFERENCE_TASK_IDS_KEY),
120113
part_metadata=stored_metadata.get(_PART_METADATA_KEY),
121-
part_types=stored_metadata.get(_PART_TYPES_KEY),
122114
)
123115

124116

@@ -130,7 +122,7 @@ def to_stored_part(part: Part) -> genai_types.Part:
130122
data_bytes = json.dumps(part.root.data).encode('utf-8')
131123
return genai_types.Part(
132124
inline_data=genai_types.Blob(
133-
mime_type='application/json', data=data_bytes
125+
mime_type=_DATA_PART_MIME_TYPE, data=data_bytes
134126
)
135127
)
136128
if isinstance(part.root, FilePart):
@@ -155,7 +147,6 @@ def to_stored_part(part: Part) -> genai_types.Part:
155147
def to_sdk_part(
156148
stored_part: genai_types.Part,
157149
part_metadata: dict[str, Any] | None = None,
158-
part_type: str = '',
159150
) -> Part:
160151
"""Converts a proto Part to a SDK Part."""
161152
if stored_part.text:
@@ -164,7 +155,7 @@ def to_sdk_part(
164155
)
165156
if stored_part.inline_data:
166157
mime_type = stored_part.inline_data.mime_type
167-
if part_type == 'data' and mime_type == 'application/json':
158+
if mime_type == _DATA_PART_MIME_TYPE:
168159
data_dict = json.loads(stored_part.inline_data.data or b'{}')
169160
return Part(root=DataPart(data=data_dict, metadata=part_metadata))
170161

@@ -214,17 +205,13 @@ def to_sdk_artifact(stored_artifact: vertexai_types.TaskArtifact) -> Artifact:
214205
"""Converts a proto TaskArtifact to a SDK Artifact."""
215206
unpacked_meta = to_sdk_metadata(stored_artifact.metadata)
216207
part_metadata_list = unpacked_meta.part_metadata or []
217-
part_types = unpacked_meta.part_types or []
218208

219209
parts = []
220210
for i, part in enumerate(stored_artifact.parts or []):
221211
meta: dict[str, Any] | None = None
222212
if i < len(part_metadata_list):
223213
meta = part_metadata_list[i]
224-
ptype = ''
225-
if i < len(part_types):
226-
ptype = part_types[i]
227-
parts.append(to_sdk_part(part, part_metadata=meta, part_type=ptype))
214+
parts.append(to_sdk_part(part, part_metadata=meta))
228215

229216
return Artifact(
230217
artifact_id=stored_artifact.artifact_id,
@@ -264,19 +251,13 @@ def to_sdk_message(
264251
return None
265252
unpacked_meta = to_sdk_metadata(stored_msg.metadata)
266253
part_metadata_list = unpacked_meta.part_metadata or []
267-
part_types = unpacked_meta.part_types or []
268254

269255
parts = []
270256
for i, part in enumerate(stored_msg.parts or []):
271257
part_metadata: dict[str, Any] | None = None
272258
if i < len(part_metadata_list):
273259
part_metadata = part_metadata_list[i]
274-
part_type = ''
275-
if i < len(part_types):
276-
part_type = part_types[i]
277-
parts.append(
278-
to_sdk_part(part, part_metadata=part_metadata, part_type=part_type)
279-
)
260+
parts.append(to_sdk_part(part, part_metadata=part_metadata))
280261

281262
return Message(
282263
message_id=stored_msg.message_id,

tests/contrib/tasks/test_vertex_task_converter.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from vertexai import types as vertexai_types
1010
from google.genai import types as genai_types
1111
from a2a.contrib.tasks.vertex_task_converter import (
12+
_DATA_PART_MIME_TYPE,
1213
to_sdk_artifact,
1314
to_sdk_message,
1415
to_sdk_part,
@@ -127,7 +128,7 @@ def test_to_stored_part_data() -> None:
127128
sdk_part = Part(root=DataPart(data={'key': 'value'}))
128129
stored_part = to_stored_part(sdk_part)
129130
assert stored_part.inline_data is not None
130-
assert stored_part.inline_data.mime_type == 'application/json'
131+
assert stored_part.inline_data.mime_type == _DATA_PART_MIME_TYPE
131132
assert stored_part.inline_data.data == b'{"key": "value"}'
132133

133134

@@ -194,6 +195,18 @@ def test_to_sdk_part_inline_data() -> None:
194195
assert sdk_part.root.file.bytes == expected_b64
195196

196197

198+
def test_to_sdk_part_inline_data_datapart() -> None:
199+
stored_part = genai_types.Part(
200+
inline_data=genai_types.Blob(
201+
mime_type=_DATA_PART_MIME_TYPE,
202+
data=b'{"key": "val"}',
203+
)
204+
)
205+
sdk_part = to_sdk_part(stored_part)
206+
assert isinstance(sdk_part.root, DataPart)
207+
assert sdk_part.root.data == {'key': 'val'}
208+
209+
197210
def test_to_sdk_part_file_data() -> None:
198211
stored_part = genai_types.Part(
199212
file_data=genai_types.FileData(
@@ -319,9 +332,7 @@ def test_sdk_part_text_conversion_round_trip() -> None:
319332
def test_sdk_part_data_conversion_round_trip() -> None:
320333
sdk_part = Part(root=DataPart(data={'key': 'value'}))
321334
stored_part = to_stored_part(sdk_part)
322-
round_trip_sdk_part = to_sdk_part(
323-
stored_part, part_metadata=None, part_type='data'
324-
)
335+
round_trip_sdk_part = to_sdk_part(stored_part, part_metadata=None)
325336

326337
assert round_trip_sdk_part == sdk_part
327338

0 commit comments

Comments
 (0)