chore: Update a2a-sdk to 0.2.16

Convert a2a types to use snake_case fields

https://github.com/a2aproject/a2a-python/releases/tag/v0.2.16

PiperOrigin-RevId: 786279179
This commit is contained in:
Holt Skinner
2025-07-23 07:54:03 -07:00
committed by Copybara-Service
parent ce7253f63f
commit a911469616
14 changed files with 196 additions and 194 deletions
@@ -193,7 +193,7 @@ def convert_a2a_task_to_event(
message = None
if a2a_task.artifacts:
message = Message(
messageId="", role=Role.agent, parts=a2a_task.artifacts[-1].parts
message_id="", role=Role.agent, parts=a2a_task.artifacts[-1].parts
)
elif a2a_task.status and a2a_task.status.message:
message = a2a_task.status.message
@@ -353,7 +353,7 @@ def convert_event_to_a2a_message(
_process_long_running_tool(a2a_part, event)
if a2a_parts:
return Message(messageId=str(uuid.uuid4()), role=role, parts=a2a_parts)
return Message(message_id=str(uuid.uuid4()), role=role, parts=a2a_parts)
except Exception as e:
logger.error("Failed to convert event to status message: %s", e)
@@ -387,13 +387,13 @@ def _create_error_status_event(
event_metadata[_get_adk_metadata_key("error_code")] = str(event.error_code)
return TaskStatusUpdateEvent(
taskId=task_id,
contextId=context_id,
task_id=task_id,
context_id=context_id,
metadata=event_metadata,
status=TaskStatus(
state=TaskState.failed,
message=Message(
messageId=str(uuid.uuid4()),
message_id=str(uuid.uuid4()),
role=Role.agent,
parts=[TextPart(text=error_message)],
metadata={
@@ -463,8 +463,8 @@ def _create_status_update_event(
status.state = TaskState.input_required
return TaskStatusUpdateEvent(
taskId=task_id,
contextId=context_id,
task_id=task_id,
context_id=context_id,
status=status,
metadata=_get_context_metadata(event, invocation_context),
final=False,
@@ -64,7 +64,7 @@ def convert_a2a_part_to_genai_part(
if isinstance(part.file, a2a_types.FileWithUri):
return genai_types.Part(
file_data=genai_types.FileData(
file_uri=part.file.uri, mime_type=part.file.mimeType
file_uri=part.file.uri, mime_type=part.file.mime_type
)
)
@@ -72,7 +72,7 @@ def convert_a2a_part_to_genai_part(
return genai_types.Part(
inline_data=genai_types.Blob(
data=base64.b64decode(part.file.bytes),
mime_type=part.file.mimeType,
mime_type=part.file.mime_type,
)
)
else:
@@ -157,7 +157,7 @@ def convert_genai_part_to_a2a_part(
root=a2a_types.FilePart(
file=a2a_types.FileWithUri(
uri=part.file_data.file_uri,
mimeType=part.file_data.mime_type,
mime_type=part.file_data.mime_type,
)
)
)
@@ -166,7 +166,7 @@ def convert_genai_part_to_a2a_part(
a2a_part = a2a_types.FilePart(
file=a2a_types.FileWithBytes(
bytes=base64.b64encode(part.inline_data.data).decode('utf-8'),
mimeType=part.inline_data.mime_type,
mime_type=part.inline_data.mime_type,
)
)
@@ -133,13 +133,13 @@ class A2aAgentExecutor(AgentExecutor):
if not context.current_task:
await event_queue.enqueue_event(
TaskStatusUpdateEvent(
taskId=context.task_id,
task_id=context.task_id,
status=TaskStatus(
state=TaskState.submitted,
message=context.message,
timestamp=datetime.now(timezone.utc).isoformat(),
),
contextId=context.context_id,
context_id=context.context_id,
final=False,
)
)
@@ -153,17 +153,17 @@ class A2aAgentExecutor(AgentExecutor):
try:
await event_queue.enqueue_event(
TaskStatusUpdateEvent(
taskId=context.task_id,
task_id=context.task_id,
status=TaskStatus(
state=TaskState.failed,
timestamp=datetime.now(timezone.utc).isoformat(),
message=Message(
messageId=str(uuid.uuid4()),
message_id=str(uuid.uuid4()),
role=Role.agent,
parts=[TextPart(text=str(e))],
),
),
contextId=context.context_id,
context_id=context.context_id,
final=True,
)
)
@@ -196,12 +196,12 @@ class A2aAgentExecutor(AgentExecutor):
# publish the task working event
await event_queue.enqueue_event(
TaskStatusUpdateEvent(
taskId=context.task_id,
task_id=context.task_id,
status=TaskStatus(
state=TaskState.working,
timestamp=datetime.now(timezone.utc).isoformat(),
),
contextId=context.context_id,
context_id=context.context_id,
final=False,
metadata={
_get_adk_metadata_key('app_name'): runner.app_name,
@@ -229,11 +229,11 @@ class A2aAgentExecutor(AgentExecutor):
# the final result according to a2a protocol.
await event_queue.enqueue_event(
TaskArtifactUpdateEvent(
taskId=context.task_id,
lastChunk=True,
contextId=context.context_id,
task_id=context.task_id,
last_chunk=True,
context_id=context.context_id,
artifact=Artifact(
artifactId=str(uuid.uuid4()),
artifact_id=str(uuid.uuid4()),
parts=task_result_aggregator.task_status_message.parts,
),
)
@@ -241,25 +241,25 @@ class A2aAgentExecutor(AgentExecutor):
# public the final status update event
await event_queue.enqueue_event(
TaskStatusUpdateEvent(
taskId=context.task_id,
task_id=context.task_id,
status=TaskStatus(
state=TaskState.completed,
timestamp=datetime.now(timezone.utc).isoformat(),
),
contextId=context.context_id,
context_id=context.context_id,
final=True,
)
)
else:
await event_queue.enqueue_event(
TaskStatusUpdateEvent(
taskId=context.task_id,
task_id=context.task_id,
status=TaskStatus(
state=task_result_aggregator.task_state,
timestamp=datetime.now(timezone.utc).isoformat(),
message=task_result_aggregator.task_status_message,
),
contextId=context.context_id,
context_id=context.context_id,
final=True,
)
)
+13 -13
View File
@@ -172,10 +172,10 @@ Method: {req.method}
JSON-RPC: {req.jsonrpc}
-----------------------------------------------------------
Message:
ID: {req.params.message.messageId}
ID: {req.params.message.message_id}
Role: {req.params.message.role}
Task ID: {req.params.message.taskId}
Context ID: {req.params.message.contextId}{message_metadata_section}
Task ID: {req.params.message.task_id}
Context ID: {req.params.message.context_id}{message_metadata_section}
-----------------------------------------------------------
Message Parts:
{_NEW_LINE.join(message_parts_logs) if message_parts_logs else "No parts"}
@@ -221,7 +221,7 @@ JSON-RPC: {resp.root.jsonrpc}
if _is_a2a_task(result):
result_details.extend([
f"Task ID: {result.id}",
f"Context ID: {result.contextId}",
f"Context ID: {result.context_id}",
f"Status State: {result.status.state}",
f"Status Timestamp: {result.status.timestamp}",
f"History Length: {len(result.history) if result.history else 0}",
@@ -238,10 +238,10 @@ JSON-RPC: {resp.root.jsonrpc}
elif _is_a2a_message(result):
result_details.extend([
f"Message ID: {result.messageId}",
f"Message ID: {result.message_id}",
f"Role: {result.role}",
f"Task ID: {result.taskId}",
f"Context ID: {result.contextId}",
f"Task ID: {result.task_id}",
f"Context ID: {result.context_id}",
])
# Add message parts
@@ -288,10 +288,10 @@ JSON-RPC: {resp.root.jsonrpc}
Metadata:
{json.dumps(result.status.message.metadata, indent=2)}"""
status_message_section = f"""ID: {result.status.message.messageId}
status_message_section = f"""ID: {result.status.message.message_id}
Role: {result.status.message.role}
Task ID: {result.status.message.taskId}
Context ID: {result.status.message.contextId}
Task ID: {result.status.message.task_id}
Context ID: {result.status.message.context_id}
Message Parts:
{_NEW_LINE.join(status_parts_logs) if status_parts_logs else "No parts"}{status_metadata_section}"""
@@ -317,10 +317,10 @@ Message Parts:
history_logs.append(
f"""Message {i + 1}:
ID: {message.messageId}
ID: {message.message_id}
Role: {message.role}
Task ID: {message.taskId}
Context ID: {message.contextId}
Task ID: {message.task_id}
Context ID: {message.context_id}
Message Parts:
{_NEW_LINE.join(message_parts_logs) if message_parts_logs else " No parts"}{message_metadata_section}"""
)
+19 -19
View File
@@ -90,11 +90,11 @@ class AgentCardBuilder:
version=self._agent_version,
capabilities=self._capabilities,
skills=all_skills,
defaultInputModes=['text/plain'],
defaultOutputModes=['text/plain'],
supportsAuthenticatedExtendedCard=False,
default_input_modes=['text/plain'],
default_output_modes=['text/plain'],
supports_authenticated_extended_card=False,
provider=self._provider,
securitySchemes=self._security_schemes,
security_schemes=self._security_schemes,
)
except Exception as e:
raise RuntimeError(
@@ -125,8 +125,8 @@ async def _build_llm_agent_skills(agent: LlmAgent) -> List[AgentSkill]:
name='model',
description=agent_description,
examples=agent_examples,
inputModes=_get_input_modes(agent),
outputModes=_get_output_modes(agent),
input_modes=_get_input_modes(agent),
output_modes=_get_output_modes(agent),
tags=['llm'],
)
)
@@ -160,8 +160,8 @@ async def _build_sub_agent_skills(agent: BaseAgent) -> List[AgentSkill]:
name=f'{sub_agent.name}: {skill.name}',
description=skill.description,
examples=skill.examples,
inputModes=skill.inputModes,
outputModes=skill.outputModes,
input_modes=skill.input_modes,
output_modes=skill.output_modes,
tags=[f'sub_agent:{sub_agent.name}'] + (skill.tags or []),
)
sub_agent_skills.append(aggregated_skill)
@@ -197,8 +197,8 @@ async def _build_tool_skills(agent: LlmAgent) -> List[AgentSkill]:
name=tool_name,
description=getattr(tool, 'description', f'Tool: {tool_name}'),
examples=None,
inputModes=None,
outputModes=None,
input_modes=None,
output_modes=None,
tags=['llm', 'tools'],
)
)
@@ -213,8 +213,8 @@ def _build_planner_skill(agent: LlmAgent) -> AgentSkill:
name='planning',
description='Can think about the tasks to do and make plans',
examples=None,
inputModes=None,
outputModes=None,
input_modes=None,
output_modes=None,
tags=['llm', 'planning'],
)
@@ -226,8 +226,8 @@ def _build_code_executor_skill(agent: LlmAgent) -> AgentSkill:
name='code-execution',
description='Can execute codes',
examples=None,
inputModes=None,
outputModes=None,
input_modes=None,
output_modes=None,
tags=['llm', 'code_execution'],
)
@@ -250,8 +250,8 @@ async def _build_non_llm_agent_skills(agent: BaseAgent) -> List[AgentSkill]:
name=agent_name,
description=agent_description,
examples=agent_examples,
inputModes=_get_input_modes(agent),
outputModes=_get_output_modes(agent),
input_modes=_get_input_modes(agent),
output_modes=_get_output_modes(agent),
tags=[agent_type],
)
)
@@ -282,8 +282,8 @@ def _build_orchestration_skill(
name='sub-agents',
description='Orchestrates: ' + '; '.join(sub_agent_descriptions),
examples=None,
inputModes=None,
outputModes=None,
input_modes=None,
output_modes=None,
tags=[agent_type, 'orchestration'],
)
@@ -525,7 +525,7 @@ def _get_input_modes(agent: BaseAgent) -> Optional[List[str]]:
return None
# This could be enhanced to check model capabilities
# For now, return None to use defaultInputModes
# For now, return None to use default_input_modes
return None