diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelper.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelper.java index 560d5db950..fe956cb465 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelper.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelper.java @@ -63,14 +63,15 @@ public ChatCompletionChunk merge(ChatCompletionChunk previous, ChatCompletionChu String id = (current.requestId() != null ? current.requestId() : previous.requestId()); TokenUsage usage = (current.usage() != null ? current.usage() : previous.usage()); - Choice previousChoice0 = previous.output() == null ? null : previous.output().choices().get(0); - Choice currentChoice0 = current.output() == null ? null : current.output().choices().get(0); + Choice previousChoice0 = previous.output() == null ? null + : CollectionUtils.isEmpty(previous.output().choices()) ? null : previous.output().choices().get(0); + Choice currentChoice0 = current.output() == null ? null + : CollectionUtils.isEmpty(current.output().choices()) ? null : current.output().choices().get(0); // compatibility of incremental_output false for streaming function call if (!incrementalOutput && isStreamingToolFunctionCall(current)) { if (!isStreamingToolFunctionCallFinish(current)) { - return new ChatCompletionChunk(id, new ChatCompletionOutput(null, List.of(new Choice(null, null))), - usage); + return new ChatCompletionChunk(id, new ChatCompletionOutput(null, List.of()), usage); } else { return new ChatCompletionChunk(id, new ChatCompletionOutput(null, List.of(currentChoice0)), usage); diff --git a/spring-ai-alibaba-core/src/test/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelperTests.java b/spring-ai-alibaba-core/src/test/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelperTests.java index 3c1b659990..2f0f5f1758 100644 --- a/spring-ai-alibaba-core/src/test/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelperTests.java +++ b/spring-ai-alibaba-core/src/test/java/com/alibaba/cloud/ai/dashscope/api/DashScopeAiStreamFunctionCallingHelperTests.java @@ -15,17 +15,8 @@ */ package com.alibaba.cloud.ai.dashscope.api; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.util.List; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.ChatCompletionChunk; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.ChatCompletionFinishReason; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.ChatCompletionMessage; @@ -35,6 +26,10 @@ import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.ChatCompletionOutput; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.ChatCompletionOutput.Choice; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi.TokenUsage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; /** * Tests for DashScopeAiStreamFunctionCallingHelper class functionality @@ -146,7 +141,8 @@ void testChunkToChatCompletion() { void testMergeWithNonIncrementalOutput() { // Test merging in non-incremental output mode ChatCompletionChunk previous = createChunkWithToolCall("request-1", "tool-1", "function-1", "{\"param"); - ChatCompletionChunk current = createChunkWithToolCall("request-1", "tool-1", "function-1", "\":\"value\"}"); + ChatCompletionChunk current = createChunkWithToolCall("request-1", "tool-1", "function-1", + "{\"param\":\"value\"}"); // Use helper with non-incremental output ChatCompletionChunk result = helper.merge(previous, current); @@ -156,16 +152,15 @@ void testMergeWithNonIncrementalOutput() { assertNotNull(result); assertEquals("request-1", result.requestId()); assertNotNull(result.output().choices()); - assertEquals(1, result.output().choices().size()); - assertNull(result.output().choices().get(0).message()); + assertEquals(0, result.output().choices().size()); } @Test void testMergeWithNonIncrementalOutputFinished() { // Test merging of finished tool calls in non-incremental output mode ChatCompletionChunk previous = createChunkWithToolCall("request-1", "tool-1", "function-1", "{\"param"); - ChatCompletionChunk current = createChunkWithToolCall("request-1", "tool-1", "function-1", "\":\"value\"}", - ChatCompletionFinishReason.TOOL_CALLS); + ChatCompletionChunk current = createChunkWithToolCall("request-1", "tool-1", "function-1", + "{\"param\":\"value\"}", ChatCompletionFinishReason.TOOL_CALLS); // Use helper with non-incremental output ChatCompletionChunk result = helper.merge(previous, current); @@ -182,7 +177,7 @@ void testMergeWithNonIncrementalOutputFinished() { assertEquals(1, toolCalls.size()); assertEquals("tool-1", toolCalls.get(0).id()); assertEquals("function-1", toolCalls.get(0).function().name()); - assertEquals("\":\"value\"}", toolCalls.get(0).function().arguments()); + assertEquals("{\"param\":\"value\"}", toolCalls.get(0).function().arguments()); } @Test diff --git a/spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/pom.xml b/spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/pom.xml index dcb3a50b0f..4993961d21 100644 --- a/spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/pom.xml +++ b/spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/pom.xml @@ -1,5 +1,6 @@ - +