2222from a2a .server .routes import create_jsonrpc_routes
2323from a2a .server .tasks import TaskUpdater
2424from a2a .types import AgentCapabilities , AgentCard , AgentInterface , AgentSkill
25+ from google .protobuf .json_format import ParseDict
2526from starlette .applications import Starlette
2627from starlette .responses import JSONResponse
2728from starlette .routing import Route
3233from select_ai .agent .a2a .task_store import OracleTaskStore
3334from select_ai .version import __version__
3435
35- _A2UI_MIME_TYPE = "application/a2ui+json"
3636
37-
38- def _a2ui_payload (result : str | None ) -> dict | None :
39- """Return an A2UI response envelope, if ``RUN_TEAM`` returned one."""
37+ def _message_parts (result : str | None ):
38+ """Convert a serialized A2A message into its constituent parts."""
4039 if not result :
4140 return None
4241 try :
@@ -45,11 +44,24 @@ def _a2ui_payload(result: str | None) -> dict | None:
4544 return None
4645 if not isinstance (payload , dict ):
4746 return None
48- if payload .get ("metadata" , {}).get ("mimeType" ) != _A2UI_MIME_TYPE :
49- return None
50- if not isinstance (payload .get ("data" ), list ):
47+ message_parts = payload .get ("parts" )
48+ if payload .get ("kind" ) != "message" or not isinstance (message_parts , list ):
5149 return None
52- return payload
50+ parts = []
51+ for part in message_parts :
52+ if not isinstance (part , dict ):
53+ return None
54+ if part .get ("kind" ) == "text" and isinstance (part .get ("text" ), str ):
55+ parts .append (new_text_part (part ["text" ]))
56+ elif part .get ("kind" ) == "data" and "data" in part :
57+ output_part = new_data_part (part ["data" ])
58+ if isinstance (part .get ("metadata" ), dict ):
59+ ParseDict (part ["metadata" ], output_part .metadata )
60+ parts .append (output_part )
61+ else :
62+ # Avoid silently discarding an unsupported part type.
63+ return None
64+ return parts or None
5365
5466
5567class DatabaseTeamExecutor (AgentExecutor ):
@@ -81,11 +93,11 @@ async def execute(self, context, event_queue):
8193 prompt = context .get_user_input (),
8294 params = {"conversation_id" : conversation_id },
8395 )
84- a2ui_payload = _a2ui_payload (result )
96+ message_parts = _message_parts (result )
8597 await updater .add_artifact (
8698 parts = (
87- [ new_data_part ( a2ui_payload )]
88- if a2ui_payload is not None
99+ message_parts
100+ if message_parts is not None
89101 else [new_text_part (result or "" )]
90102 ),
91103 name = "database-agent-result" ,
0 commit comments