diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java index 383065fc209..9f2e8a9ebdb 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java @@ -21,6 +21,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -144,11 +145,20 @@ public OpenAiApi(String baseUrl, ApiKey apiKey, MultiValueMap he .build(); // @formatter:on } + /** + * Returns a string containing all text values from the given media content list. Only + * elements of type "text" are processed and concatenated in order. + * @param content The list of {@link ChatCompletionMessage.MediaContent} + * @return a string containing all text values from "text" type elements + * @throws IllegalArgumentException if content is null + */ public static String getTextContent(List content) { + Assert.notNull(content, "content cannot be null"); + return content.stream() .filter(c -> "text".equals(c.type())) .map(ChatCompletionMessage.MediaContent::text) - .reduce("", (a, b) -> a + b); + .collect(Collectors.joining()); } /**