Skip to content

Commit dc05a52

Browse files
refactor(deps): Update Python SDK to 0.3.0 (#294)
* Update python sdk to 0.3.0 * Update refactor script to only edit files with a2a in the contents * Edit multi_language to use snake_case * Update agents to snake_case * Convert Demo UI to use snake_case * Fix known issues in a2a_evaluation * Convert old well-known path to new path * Update formatter * formatting * Formatting * Update samples/python/agents/a2a_mcp/src/a2a_mcp/common/workflow.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Add telemetry optional dependency for a2a_telemetry --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent 63ddcfc commit dc05a52

File tree

60 files changed

+3646
-1915
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+3646
-1915
lines changed

‎demo/ui/components/agent_list.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ def agents_list(
2626
df_data['Organization'].append(
2727
agent_info.provider.organization if agent_info.provider else ''
2828
)
29-
df_data['Input Modes'].append(', '.join(agent_info.defaultInputModes))
30-
df_data['Output Modes'].append(', '.join(agent_info.defaultOutputModes))
29+
df_data['Input Modes'].append(', '.join(agent_info.default_input_modes))
30+
df_data['Output Modes'].append(
31+
', '.join(agent_info.default_output_modes)
32+
)
3133
df_data['Streaming'].append(agent_info.capabilities.streaming)
3234
df = pd.DataFrame(
3335
pd.DataFrame(df_data),

‎demo/ui/components/conversation.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ async def send_message(message: str, message_id: str = ''):
4242
if not c:
4343
print('Conversation id ', state.conversation_id, ' not found')
4444
request = Message(
45-
messageId=message_id,
46-
contextId=state.conversation_id,
45+
message_id=message_id,
46+
context_id=state.conversation_id,
4747
role=Role.user,
4848
parts=[Part(root=TextPart(text=message))],
4949
)

‎demo/ui/components/form_render.py‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ async def cancel_form(e: me.ClickEvent):
314314
app_state.background_tasks[message_id] = ''
315315
app_state.completed_forms[form_message_id] = None
316316
request = Message(
317-
messageId=message_id,
318-
taskId=task_id,
319-
contextId=app_state.current_conversation_id,
317+
message_id=message_id,
318+
task_id=task_id,
319+
context_id=app_state.current_conversation_id,
320320
role=Role.user,
321321
parts=[Part(root=TextPart(text='rejected form entry'))],
322322
)
@@ -332,9 +332,9 @@ async def send_response(
332332
form = FormState(**json.loads(state.forms[id]))
333333
print('Sending form response', form)
334334
request = Message(
335-
messageId=message_id,
336-
taskId=task_id,
337-
contextId=app_state.current_conversation_id,
335+
message_id=message_id,
336+
task_id=task_id,
337+
context_id=app_state.current_conversation_id,
338338
role=Role.user,
339339
parts=[Part(root=DataPart(data=form.data))],
340340
)

‎demo/ui/pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ dependencies = [
1212
"fastapi>=0.115.0",
1313
"uvicorn>=0.34.0",
1414
"mesop>=1.0.0",
15-
"a2a-sdk>=0.2.16",
15+
"a2a-sdk>=0.3.0",
1616
"pandas>=2.2.0",
1717
"google-genai>=1.9.0",
1818
"google-adk[a2a]>=1.7.0",

‎demo/ui/service/server/adk_host_manager.py‎

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -127,27 +127,27 @@ def update_api_key(self, api_key: str):
127127
self._task_map = {}
128128

129129
def sanitize_message(self, message: Message) -> Message:
130-
if message.contextId:
131-
conversation = self.get_conversation(message.contextId)
130+
if message.context_id:
131+
conversation = self.get_conversation(message.context_id)
132132
if not conversation:
133133
return message
134134
# Check if the last event in the conversation was tied to a task.
135135
if conversation.messages:
136-
task_id = conversation.messages[-1].taskId
136+
task_id = conversation.messages[-1].task_id
137137
if task_id and task_still_open(
138138
next(
139139
filter(lambda x: x and x.id == task_id, self._tasks),
140140
None,
141141
)
142142
):
143-
message.taskId = task_id
143+
message.task_id = task_id
144144
return message
145145

146146
async def process_message(self, message: Message):
147-
message_id = message.messageId
147+
message_id = message.message_id
148148
if message_id:
149149
self._pending_message_ids.append(message_id)
150-
context_id = message.contextId
150+
context_id = message.context_id
151151
conversation = self.get_conversation(context_id)
152152
self._messages.append(message)
153153
if conversation:
@@ -165,12 +165,12 @@ async def process_message(self, message: Message):
165165
session = await self._session_service.get_session(
166166
app_name='A2A', user_id='test_user', session_id=context_id
167167
)
168-
task_id = message.taskId
168+
task_id = message.task_id
169169
# Update state must happen in an event
170170
state_update = {
171171
'task_id': task_id,
172172
'context_id': context_id,
173-
'message_id': message.messageId,
173+
'message_id': message.message_id,
174174
}
175175
# Need to upsert session state now, only way is to append an event.
176176
await self._session_service.append_event(
@@ -254,25 +254,25 @@ def task_callback(self, task: TaskCallbackArg, agent_card: AgentCard):
254254

255255
def emit_event(self, task: TaskCallbackArg, agent_card: AgentCard):
256256
content = None
257-
context_id = task.contextId
257+
context_id = task.context_id
258258
if isinstance(task, TaskStatusUpdateEvent):
259259
if task.status.message:
260260
content = task.status.message
261261
else:
262262
content = Message(
263263
parts=[Part(root=TextPart(text=str(task.status.state)))],
264264
role=Role.agent,
265-
messageId=str(uuid.uuid4()),
266-
contextId=context_id,
267-
taskId=task.taskId,
265+
message_id=str(uuid.uuid4()),
266+
context_id=context_id,
267+
task_id=task.task_id,
268268
)
269269
elif isinstance(task, TaskArtifactUpdateEvent):
270270
content = Message(
271271
parts=task.artifact.parts,
272272
role=Role.agent,
273-
messageId=str(uuid.uuid4()),
274-
contextId=context_id,
275-
taskId=task.taskId,
273+
message_id=str(uuid.uuid4()),
274+
context_id=context_id,
275+
task_id=task.task_id,
276276
)
277277
elif task.status and task.status.message:
278278
content = task.status.message
@@ -283,17 +283,17 @@ def emit_event(self, task: TaskCallbackArg, agent_card: AgentCard):
283283
content = Message(
284284
parts=parts,
285285
role=Role.agent,
286-
messageId=str(uuid.uuid4()),
287-
taskId=task.id,
288-
contextId=context_id,
286+
message_id=str(uuid.uuid4()),
287+
task_id=task.id,
288+
context_id=context_id,
289289
)
290290
else:
291291
content = Message(
292292
parts=[Part(root=TextPart(text=str(task.status.state)))],
293293
role=Role.agent,
294-
messageId=str(uuid.uuid4()),
295-
taskId=task.id,
296-
contextId=context_id,
294+
message_id=str(uuid.uuid4()),
295+
task_id=task.id,
296+
context_id=context_id,
297297
)
298298
if content:
299299
self.add_event(
@@ -307,52 +307,52 @@ def emit_event(self, task: TaskCallbackArg, agent_card: AgentCard):
307307

308308
def attach_message_to_task(self, message: Message | None, task_id: str):
309309
if message:
310-
self._task_map[message.messageId] = task_id
310+
self._task_map[message.message_id] = task_id
311311

312312
def insert_message_history(self, task: Task, message: Message | None):
313313
if not message:
314314
return
315315
if task.history is None:
316316
task.history = []
317-
message_id = message.messageId
317+
message_id = message.message_id
318318
if not message_id:
319319
return
320320
if task.history and (
321321
task.status.message
322-
and task.status.message.messageId
323-
not in [x.messageId for x in task.history]
322+
and task.status.message.message_id
323+
not in [x.message_id for x in task.history]
324324
):
325325
task.history.append(task.status.message)
326326
elif not task.history and task.status.message:
327327
task.history = [task.status.message]
328328
else:
329329
print(
330330
'Message id already in history',
331-
task.status.message.messageId if task.status.message else '',
331+
task.status.message.message_id if task.status.message else '',
332332
task.history,
333333
)
334334

335335
def add_or_get_task(self, event: TaskCallbackArg):
336336
task_id = None
337337
if isinstance(event, Message):
338-
task_id = event.taskId
338+
task_id = event.task_id
339339
elif isinstance(event, Task):
340340
task_id = event.id
341341
else:
342-
task_id = event.taskId
342+
task_id = event.task_id
343343
if not task_id:
344344
task_id = str(uuid.uuid4())
345345
current_task = next(
346346
filter(lambda x: x.id == task_id, self._tasks), None
347347
)
348348
if not current_task:
349-
context_id = event.contextId
349+
context_id = event.context_id
350350
current_task = Task(
351351
id=task_id,
352352
# initialize with submitted
353353
status=TaskStatus(state=TaskState.submitted),
354354
artifacts=[],
355-
contextId=context_id,
355+
context_id=context_id,
356356
)
357357
self.add_task(current_task)
358358
return current_task
@@ -366,32 +366,32 @@ def process_artifact_event(
366366
if not task_update_event.append:
367367
# received the first chunk or entire payload for an artifact
368368
if (
369-
task_update_event.lastChunk is None
370-
or task_update_event.lastChunk
369+
task_update_event.last_chunk is None
370+
or task_update_event.last_chunk
371371
):
372-
# lastChunk bit is missing or is set to true, so this is the entire payload
372+
# last_chunk bit is missing or is set to true, so this is the entire payload
373373
# add this to artifacts
374374
if not current_task.artifacts:
375375
current_task.artifacts = []
376376
current_task.artifacts.append(artifact)
377377
else:
378378
# this is a chunk of an artifact, stash it in temp store for assembling
379-
if artifact.artifactId not in self._artifact_chunks:
380-
self._artifact_chunks[artifact.artifactId] = []
381-
self._artifact_chunks[artifact.artifactId].append(artifact)
379+
if artifact.artifact_id not in self._artifact_chunks:
380+
self._artifact_chunks[artifact.artifact_id] = []
381+
self._artifact_chunks[artifact.artifact_id].append(artifact)
382382
else:
383383
# we received an append chunk, add to the existing temp artifact
384-
current_temp_artifact = self._artifact_chunks[artifact.artifactId][
384+
current_temp_artifact = self._artifact_chunks[artifact.artifact_id][
385385
-1
386386
]
387387
# TODO handle if current_temp_artifact is missing
388388
current_temp_artifact.parts.extend(artifact.parts)
389-
if task_update_event.lastChunk:
389+
if task_update_event.last_chunk:
390390
if current_task.artifacts:
391391
current_task.artifacts.append(current_temp_artifact)
392392
else:
393393
current_task.artifacts = [current_temp_artifact]
394-
del self._artifact_chunks[artifact.artifactId][-1]
394+
del self._artifact_chunks[artifact.artifact_id][-1]
395395

396396
def add_event(self, event: Event):
397397
self._events[event.id] = event
@@ -475,14 +475,14 @@ def adk_content_from_message(self, message: Message) -> types.Content:
475475
parts.append(
476476
types.Part.from_uri(
477477
file_uri=part.file.uri,
478-
mime_type=part.file.mimeType,
478+
mime_type=part.file.mime_type,
479479
)
480480
)
481481
else:
482482
parts.append(
483483
types.Part.from_bytes(
484484
data=part.file.bytes.encode('utf-8'),
485-
mime_type=part.file.mimeType,
485+
mime_type=part.file.mime_type,
486486
)
487487
)
488488
return types.Content(parts=parts, role=message.role)
@@ -498,9 +498,9 @@ async def adk_content_to_message(
498498
return Message(
499499
parts=[],
500500
role=content.role if content.role == Role.user else Role.agent,
501-
contextId=context_id,
502-
taskId=task_id,
503-
messageId=str(uuid.uuid4()),
501+
context_id=context_id,
502+
task_id=task_id,
503+
message_id=str(uuid.uuid4()),
504504
)
505505
for part in content.parts:
506506
if part.text:
@@ -516,7 +516,7 @@ async def adk_content_to_message(
516516
root=FilePart(
517517
file=FileWithBytes(
518518
bytes=part.inline_data.decode('utf-8'),
519-
mimeType=part.file_data.mime_type,
519+
mime_type=part.file_data.mime_type,
520520
),
521521
)
522522
)
@@ -527,7 +527,7 @@ async def adk_content_to_message(
527527
root=FilePart(
528528
file=FileWithUri(
529529
uri=part.file_data.file_uri,
530-
mimeType=part.file_data.mime_type,
530+
mime_type=part.file_data.mime_type,
531531
)
532532
)
533533
)
@@ -559,9 +559,9 @@ async def adk_content_to_message(
559559
return Message(
560560
role=content.role if content.role == Role.user else Role.agent,
561561
parts=parts,
562-
contextId=context_id,
563-
taskId=task_id,
564-
messageId=str(uuid.uuid4()),
562+
context_id=context_id,
563+
task_id=task_id,
564+
message_id=str(uuid.uuid4()),
565565
)
566566

567567
async def _handle_function_response(
@@ -594,7 +594,7 @@ async def _handle_function_response(
594594
root=FilePart(
595595
file=FileWithBytes(
596596
bytes=base64_data,
597-
mimeType=file_data.mime_type,
597+
mime_type=file_data.mime_type,
598598
name='artifact_file',
599599
)
600600
)
@@ -606,9 +606,9 @@ async def _handle_function_response(
606606
content = Message(
607607
parts=[Part(root=TextPart(text='Unknown content'))],
608608
role=Role.agent,
609-
messageId=str(uuid.uuid4()),
610-
taskId=task_id,
611-
contextId=context_id,
609+
message_id=str(uuid.uuid4()),
610+
task_id=task_id,
611+
context_id=context_id,
612612
)
613613
except Exception as e:
614614
print("Couldn't convert to messages:", e)

0 commit comments

Comments
 (0)