From 3368c6d690fbc6ec5132645340e8b2056e4e41c1 Mon Sep 17 00:00:00 2001 From: JGoP-L <741047428@qq.com> Date: Wed, 6 May 2026 11:38:25 +0800 Subject: [PATCH] fix --- .../a2a/agent/message/DataPartParser.java | 19 +++++++++++--- .../a2a/agent/message/DataPartParserTest.java | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/main/java/io/agentscope/core/a2a/agent/message/DataPartParser.java b/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/main/java/io/agentscope/core/a2a/agent/message/DataPartParser.java index fd5c1aaca..96385dc3d 100644 --- a/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/main/java/io/agentscope/core/a2a/agent/message/DataPartParser.java +++ b/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/main/java/io/agentscope/core/a2a/agent/message/DataPartParser.java @@ -22,6 +22,8 @@ import io.agentscope.core.message.TextBlock; import io.agentscope.core.message.ToolResultBlock; import io.agentscope.core.message.ToolUseBlock; +import io.agentscope.core.util.JsonUtils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -86,16 +88,25 @@ private ContentBlock parseToToolResultBlock(DataPart part) { // Adapter Python Agentscope ToolResultBlock define, python tool result output spec is // `str | List[TextBlock | ImageBlock | AudioBlock | VideoBlock]` builder.output(TextBlock.builder().text(output.toString()).build()); - } else if (output instanceof List) { - @SuppressWarnings("unchecked") - List outputList = (List) output; - builder.output(outputList); + } else if (output instanceof List outputList) { + List contentBlocks = new ArrayList<>(outputList.size()); + for (Object outputItem : outputList) { + contentBlocks.add(parseToContentBlock(outputItem)); + } + builder.output(contentBlocks); } else { builder.output(List.of()); } return builder.build(); } + private ContentBlock parseToContentBlock(Object output) { + if (output instanceof ContentBlock contentBlock) { + return contentBlock; + } + return JsonUtils.getJsonCodec().convertValue(output, ContentBlock.class); + } + private String getToolCallId(DataPart part) { Object toolCallId = part.getMetadata().get(MessageConstants.TOOL_CALL_ID_METADATA_KEY); return null != toolCallId ? toolCallId.toString() : null; diff --git a/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/test/java/io/agentscope/core/a2a/agent/message/DataPartParserTest.java b/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/test/java/io/agentscope/core/a2a/agent/message/DataPartParserTest.java index 3955de485..534e10481 100644 --- a/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/test/java/io/agentscope/core/a2a/agent/message/DataPartParserTest.java +++ b/agentscope-extensions/agentscope-extensions-a2a/agentscope-extensions-a2a-client/src/test/java/io/agentscope/core/a2a/agent/message/DataPartParserTest.java @@ -25,6 +25,7 @@ import io.agentscope.core.message.TextBlock; import io.agentscope.core.message.ToolResultBlock; import io.agentscope.core.message.ToolUseBlock; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -141,6 +142,31 @@ void testParseToolResultBlockWithListOutput() { assertEquals(outputList, toolResultBlock.getOutput()); } + @Test + @DisplayName("Should parse ToolResultBlock with deserialized map list output") + void testParseToolResultBlockWithDeserializedMapListOutput() { + Map serializedTextBlock = new LinkedHashMap<>(); + serializedTextBlock.put("type", "text"); + serializedTextBlock.put("text", "test output"); + + Map metadata = + Map.of( + "_agentscope_block_type", "tool_result", + "_agentscope_tool_name", "calculator", + "_agentscope_tool_call_id", "123"); + Map data = Map.of("_agentscope_tool_output", List.of(serializedTextBlock)); + DataPart part = new DataPart(data, metadata); + + ContentBlock result = parser.parse(part); + + assertNotNull(result); + assertEquals(ToolResultBlock.class, result.getClass()); + ToolResultBlock toolResultBlock = (ToolResultBlock) result; + ContentBlock outputBlock = toolResultBlock.getOutput().get(0); + assertEquals(TextBlock.class, outputBlock.getClass()); + assertEquals("test output", ((TextBlock) outputBlock).getText()); + } + @Test @DisplayName("Should parse ToolResultBlock with non-String and non-List output") void testParseToolResultBlockWithNonStringNonListOutput() {