Skip to content

Commit 9ba4e98

Browse files
glaforgeyongkiy-google
authored andcommitted
fix: handle null AiMessage.text() to prevent NPE and add unit test (PR #1035)
1 parent 4e56e19 commit 9ba4e98

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

contrib/langchain4j/src/main/java/com/google/adk/models/langchain4j/LangChain4j.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,8 +607,11 @@ private List<Part> toParts(AiMessage aiMessage) {
607607
});
608608
return parts;
609609
} else {
610-
Part part = Part.builder().text(aiMessage.text()).build();
611-
return List.of(part);
610+
String text = aiMessage.text();
611+
if (text == null) {
612+
return List.of();
613+
}
614+
return List.of(Part.builder().text(text).build());
612615
}
613616
}
614617

contrib/langchain4j/src/test/java/com/google/adk/models/langchain4j/LangChain4jTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,4 +970,27 @@ void testNoUsageMetadataWithoutEstimator() {
970970
// IMPORTANT: usageMetadata should be empty when no TokenUsage and no estimator
971971
assertThat(response.usageMetadata()).isEmpty();
972972
}
973+
974+
@Test
975+
@DisplayName("Should handle null AiMessage text without throwing NPE")
976+
void testGenerateContentWithNullAiMessageText() {
977+
// Given
978+
final LlmRequest llmRequest =
979+
LlmRequest.builder().contents(List.of(Content.fromParts(Part.fromText("Hello")))).build();
980+
981+
final ChatResponse chatResponse = mock(ChatResponse.class);
982+
final AiMessage aiMessage = mock(AiMessage.class);
983+
when(aiMessage.text()).thenReturn(null);
984+
when(aiMessage.hasToolExecutionRequests()).thenReturn(false);
985+
when(chatResponse.aiMessage()).thenReturn(aiMessage);
986+
when(chatModel.chat(any(ChatRequest.class))).thenReturn(chatResponse);
987+
988+
// When
989+
final Flowable<LlmResponse> responseFlowable = langChain4j.generateContent(llmRequest, false);
990+
final LlmResponse response = responseFlowable.blockingFirst();
991+
// Then - no NPE thrown, and content has no text parts
992+
assertThat(response).isNotNull();
993+
assertThat(response.content()).isPresent();
994+
assertThat(response.content().get().parts().orElse(List.of())).isEmpty();
995+
}
973996
}

0 commit comments

Comments
 (0)