Skip to content

Commit f4a05b7

Browse files
committed
GH-4596: Handle candidates containing both text and tool calls in VertexAiGeminiChatModel
Signed-off-by: NathanGrand <[email protected]>
1 parent bd51e34 commit f4a05b7

File tree

1 file changed

+18
-29
lines changed

1 file changed

+18
-29
lines changed

models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222
import java.util.Map;
23+
import java.util.stream.Collectors;
2324

2425
import com.fasterxml.jackson.annotation.JsonInclude;
2526
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -600,39 +601,27 @@ protected List<Generation> responseCandidateToGeneration(Candidate candidate) {
600601
.finishReason(candidateFinishReason.name())
601602
.build();
602603

603-
boolean isFunctionCall = candidate.getContent().getPartsList().stream().allMatch(Part::hasFunctionCall);
604+
List<Part> parts = candidate.getContent().getPartsList();
604605

605-
if (isFunctionCall) {
606-
List<AssistantMessage.ToolCall> assistantToolCalls = candidate.getContent()
607-
.getPartsList()
608-
.stream()
609-
.filter(part -> part.hasFunctionCall())
610-
.map(part -> {
611-
FunctionCall functionCall = part.getFunctionCall();
612-
var functionName = functionCall.getName();
613-
String functionArguments = structToJson(functionCall.getArgs());
614-
return new AssistantMessage.ToolCall("", "function", functionName, functionArguments);
615-
})
616-
.toList();
606+
List<AssistantMessage.ToolCall> assistantToolCalls = parts.stream().filter(Part::hasFunctionCall).map(part -> {
607+
FunctionCall functionCall = part.getFunctionCall();
608+
var functionName = functionCall.getName();
609+
String functionArguments = structToJson(functionCall.getArgs());
610+
return new AssistantMessage.ToolCall("", "function", functionName, functionArguments);
611+
}).toList();
617612

618-
AssistantMessage assistantMessage = AssistantMessage.builder()
619-
.content("")
620-
.properties(messageMetadata)
621-
.toolCalls(assistantToolCalls)
622-
.build();
613+
String text = parts.stream()
614+
.filter(part -> part.hasText() && !part.getText().isEmpty())
615+
.map(Part::getText)
616+
.collect(Collectors.joining(" "));
623617

624-
return List.of(new Generation(assistantMessage, chatGenerationMetadata));
625-
}
626-
else {
627-
List<Generation> generations = candidate.getContent()
628-
.getPartsList()
629-
.stream()
630-
.map(part -> AssistantMessage.builder().content(part.getText()).properties(messageMetadata).build())
631-
.map(assistantMessage -> new Generation(assistantMessage, chatGenerationMetadata))
632-
.toList();
618+
AssistantMessage assistantMessage = AssistantMessage.builder()
619+
.content(text)
620+
.properties(messageMetadata)
621+
.toolCalls(assistantToolCalls)
622+
.build();
633623

634-
return generations;
635-
}
624+
return List.of(new Generation(assistantMessage, chatGenerationMetadata));
636625
}
637626

638627
private ChatResponseMetadata toChatResponseMetadata(Usage usage) {

0 commit comments

Comments
 (0)