| 
21 | 21 | import java.util.concurrent.atomic.AtomicBoolean;  | 
22 | 22 | import java.util.function.Consumer;  | 
23 | 23 | import java.util.function.Predicate;  | 
24 |  | - | 
25 |  | -import com.fasterxml.jackson.annotation.JsonFormat;  | 
26 |  | -import com.fasterxml.jackson.annotation.JsonIgnore;  | 
27 |  | -import com.fasterxml.jackson.annotation.JsonIgnoreProperties;  | 
28 |  | -import com.fasterxml.jackson.annotation.JsonInclude;  | 
29 |  | -import com.fasterxml.jackson.annotation.JsonInclude.Include;  | 
30 |  | -import com.fasterxml.jackson.annotation.JsonProperty;  | 
31 |  | -import reactor.core.publisher.Flux;  | 
32 |  | -import reactor.core.publisher.Mono;  | 
 | 24 | +import java.util.stream.Collectors;  | 
33 | 25 | 
 
  | 
34 | 26 | import org.springframework.ai.model.ApiKey;  | 
35 | 27 | import org.springframework.ai.model.ChatModelDescription;  | 
 | 
50 | 42 | import org.springframework.web.client.RestClient;  | 
51 | 43 | import org.springframework.web.reactive.function.client.WebClient;  | 
52 | 44 | 
 
  | 
 | 45 | +import com.fasterxml.jackson.annotation.JsonFormat;  | 
 | 46 | +import com.fasterxml.jackson.annotation.JsonIgnore;  | 
 | 47 | +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;  | 
 | 48 | +import com.fasterxml.jackson.annotation.JsonInclude;  | 
 | 49 | +import com.fasterxml.jackson.annotation.JsonInclude.Include;  | 
 | 50 | +import com.fasterxml.jackson.annotation.JsonProperty;  | 
 | 51 | + | 
 | 52 | +import reactor.core.publisher.Flux;  | 
 | 53 | +import reactor.core.publisher.Mono;  | 
 | 54 | + | 
53 | 55 | /**  | 
54 | 56 |  * Single class implementation of the  | 
55 | 57 |  * <a href="https://platform.openai.com/docs/api-reference/chat">OpenAI Chat Completion  | 
@@ -144,11 +146,20 @@ public OpenAiApi(String baseUrl, ApiKey apiKey, MultiValueMap<String, String> he  | 
144 | 146 | 			.build(); // @formatter:on  | 
145 | 147 | 	}  | 
146 | 148 | 
 
  | 
 | 149 | +	/**  | 
 | 150 | +	 * Returns a string containing all text values from the given media content list. Only  | 
 | 151 | +	 * elements of type "text" are processed and concatenated in order.  | 
 | 152 | +	 * @param content The list of {@link ChatCompletionMessage.MediaContent}  | 
 | 153 | +	 * @return a string containing all text values from "text" type elements  | 
 | 154 | +	 * @throws IllegalArgumentException if content is null  | 
 | 155 | +	 */  | 
147 | 156 | 	public static String getTextContent(List<ChatCompletionMessage.MediaContent> content) {  | 
 | 157 | +		Assert.notNull(content, "content cannot be null");  | 
 | 158 | + | 
148 | 159 | 		return content.stream()  | 
149 | 160 | 			.filter(c -> "text".equals(c.type()))  | 
150 | 161 | 			.map(ChatCompletionMessage.MediaContent::text)  | 
151 |  | -			.reduce("", (a, b) -> a + b);  | 
 | 162 | +			.collect(Collectors.joining());  | 
152 | 163 | 	}  | 
153 | 164 | 
 
  | 
154 | 165 | 	/**  | 
 | 
0 commit comments