Remove deprecated UserMessage constructors

- Remove deprecated constructor methods
 - Replace them with the builder methods

Signed-off-by: Ilayaperumal Gopinathan <ilayaperumal.gopinathan@broadcom.com>
This commit is contained in:
Ilayaperumal Gopinathan
2025-05-02 12:04:48 +01:00
parent 722c77e812
commit 06edee4069
20 changed files with 179 additions and 145 deletions

View File

@@ -140,7 +140,7 @@ public class VectorStoreChatMemoryAdvisor extends AbstractChatMemoryAdvisor<Vect
.systemParams(advisedSystemParams)
.build();
UserMessage userMessage = new UserMessage(request.userText(), request.media());
UserMessage userMessage = UserMessage.builder().text(request.userText()).media(request.media()).build();
this.getChatMemoryStore()
.write(toDocuments(List.of(userMessage), this.doGetConversationId(request.adviseContext())));

View File

@@ -101,7 +101,7 @@ class Neo4jChatMemoryAutoConfigurationIT {
.data("hello".getBytes(StandardCharsets.UTF_8))
.build(),
Media.builder().data(URI.create("http://www.google.com").toURL()).mimeType(textPlain).build());
UserMessage userMessageWithMedia = new UserMessage("Message with media", media);
UserMessage userMessageWithMedia = UserMessage.builder().text("Message with media").media(media).build();
memory.add(sessionId, userMessageWithMedia);
messages = memory.get(sessionId, Integer.MAX_VALUE);

View File

@@ -265,8 +265,11 @@ public class Neo4jChatMemory implements ChatMemory {
List<Media> mediaList) {
Message message;
Map<String, Object> metadata = record.get("metadata").asMap();
message = new UserMessage(messageMap.get(MessageAttributes.TEXT_CONTENT.getValue()).toString(), mediaList,
metadata);
message = UserMessage.builder()
.text(messageMap.get(MessageAttributes.TEXT_CONTENT.getValue()).toString())
.media(mediaList)
.metadata(metadata)
.build();
return message;
}

View File

@@ -247,8 +247,10 @@ class AnthropicChatModelIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel.call(new Prompt(List.of(userMessage)));
@@ -262,9 +264,10 @@ class AnthropicChatModelIT {
var pdfData = new ClassPathResource("/spring-ai-reference-overview.pdf");
var userMessage = new UserMessage(
"You are a very professional document summarization specialist. Please summarize the given document.",
List.of(new Media(new MimeType("application", "pdf"), pdfData)));
var userMessage = UserMessage.builder()
.text("You are a very professional document summarization specialist. Please summarize the given document.")
.media(List.of(new Media(new MimeType("application", "pdf"), pdfData)))
.build();
var response = this.chatModel.call(new Prompt(List.of(userMessage),
ToolCallingChatOptions.builder().model(AnthropicApi.ChatModel.CLAUDE_3_5_SONNET.getName()).build()));

View File

@@ -245,8 +245,10 @@ class BedrockProxyChatModelIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel.call(new Prompt(List.of(userMessage)));

View File

@@ -276,8 +276,10 @@ class MistralAiChatModelIT {
void multiModalityEmbeddedImage(String modelName) {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel
.call(new Prompt(List.of(userMessage), ChatOptions.builder().model(modelName).build()));
@@ -290,11 +292,13 @@ class MistralAiChatModelIT {
@ParameterizedTest(name = "{0} : {displayName} ")
@ValueSource(strings = { "pixtral-large-latest" })
void multiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), ChatOptions.builder().model(modelName).build()));
@@ -306,11 +310,13 @@ class MistralAiChatModelIT {
@Test
void streamingMultiModalityImageUrl() throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
Flux<ChatResponse> response = this.streamingChatModel.stream(new Prompt(List.of(userMessage),
ChatOptions.builder().model(MistralAiApi.ChatModel.PIXTRAL_LARGE.getValue()).build()));

View File

@@ -51,8 +51,10 @@ class OllamaChatModelMultimodalIT extends BaseOllamaIT {
void unsupportedMediaType() {
var imageData = new ClassPathResource("/norway.webp");
var userMessage = new UserMessage("Explain what do you see in this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see in this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
assertThatThrownBy(() -> this.chatModel.call(new Prompt(List.of(userMessage))))
.isInstanceOf(RuntimeException.class);
@@ -62,8 +64,10 @@ class OllamaChatModelMultimodalIT extends BaseOllamaIT {
void multiModalityTest() {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see in this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see in this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel.call(new Prompt(List.of(userMessage)));

View File

@@ -17,6 +17,7 @@
package org.springframework.ai.openai.chat;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.List;
import java.util.Map;
@@ -127,8 +128,10 @@ public class MessageTypeContentTests {
.willReturn(Mockito.mock(ResponseEntity.class));
URL mediaUrl = new URL("http://test");
this.chatModel.call(new Prompt(List.of(new UserMessage("test message",
List.of(Media.builder().mimeType(MimeTypeUtils.IMAGE_JPEG).data(mediaUrl).build())))));
this.chatModel.call(new Prompt(List.of(UserMessage.builder()
.text("test message")
.media(List.of(Media.builder().mimeType(MimeTypeUtils.IMAGE_JPEG).data(mediaUrl).build()))
.build())));
validateComplexContent(this.pomptCaptor.getValue());
}
@@ -139,10 +142,11 @@ public class MessageTypeContentTests {
given(this.openAiApi.chatCompletionStream(this.pomptCaptor.capture(), this.headersCaptor.capture()))
.willReturn(this.fluxResponse);
URL mediaUrl = new URL("http://test");
this.chatModel.stream(new Prompt(List.of(new UserMessage("test message",
List.of(Media.builder().mimeType(MimeTypeUtils.IMAGE_JPEG).data(mediaUrl).build())))))
.subscribe();
URI mediaUrl = URI.create("http://test");
this.chatModel.stream(new Prompt(List.of(UserMessage.builder()
.text("test message")
.media(List.of(Media.builder().mimeType(MimeTypeUtils.IMAGE_JPEG).data(mediaUrl).build()))
.build()))).subscribe();
validateComplexContent(this.pomptCaptor.getValue());
}

View File

@@ -470,8 +470,10 @@ public class OpenAiChatModelIT extends AbstractIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -485,11 +487,13 @@ public class OpenAiChatModelIT extends AbstractIT {
@ValueSource(strings = { "gpt-4o" })
void multiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -502,11 +506,13 @@ public class OpenAiChatModelIT extends AbstractIT {
@Test
void streamingMultiModalityImageUrl() throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
Flux<ChatResponse> response = this.streamingChatModel.stream(new Prompt(List.of(userMessage),
OpenAiChatOptions.builder().model(OpenAiApi.ChatModel.GPT_4_O.getValue()).build()));
@@ -565,8 +571,10 @@ public class OpenAiChatModelIT extends AbstractIT {
@ValueSource(strings = { "gpt-4o-audio-preview" })
void multiModalityInputAudio(String modelName) {
var audioResource = new ClassPathResource("speech1.mp3");
var userMessage = new UserMessage("What is this recording about?",
List.of(new Media(MimeTypeUtils.parseMimeType("audio/mp3"), audioResource)));
var userMessage = UserMessage.builder()
.text("What is this recording about?")
.media(List.of(new Media(MimeTypeUtils.parseMimeType("audio/mp3"), audioResource)))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), ChatOptions.builder().model(modelName).build()));
@@ -580,8 +588,10 @@ public class OpenAiChatModelIT extends AbstractIT {
@ValueSource(strings = { "gpt-4o-audio-preview" })
void streamingMultiModalityInputAudio(String modelName) {
var audioResource = new ClassPathResource("speech1.mp3");
var userMessage = new UserMessage("What is this recording about?",
List.of(new Media(MimeTypeUtils.parseMimeType("audio/mp3"), audioResource)));
var userMessage = UserMessage.builder()
.text("What is this recording about?")
.media(List.of(new Media(MimeTypeUtils.parseMimeType("audio/mp3"), audioResource)))
.build();
Flux<ChatResponse> response = this.chatModel
.stream(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));

View File

@@ -312,8 +312,10 @@ class GroqWithOpenAiChatModelIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -328,11 +330,13 @@ class GroqWithOpenAiChatModelIT {
@ValueSource(strings = { "llama3-70b-8192" })
void multiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -346,11 +350,13 @@ class GroqWithOpenAiChatModelIT {
@Test
void streamingMultiModalityImageUrl() throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
Flux<ChatResponse> response = this.chatModel.stream(new Prompt(List.of(userMessage)));

View File

@@ -17,6 +17,7 @@
package org.springframework.ai.openai.chat.proxy;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
@@ -318,8 +319,10 @@ class MistralWithOpenAiChatModelIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -334,11 +337,13 @@ class MistralWithOpenAiChatModelIT {
@ValueSource(strings = { "mistral-small-latest" })
void multiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -352,11 +357,13 @@ class MistralWithOpenAiChatModelIT {
@Test
void streamingMultiModalityImageUrl() throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(URI.create("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
Flux<ChatResponse> response = this.chatModel.stream(new Prompt(List.of(userMessage)));

View File

@@ -17,6 +17,7 @@
package org.springframework.ai.openai.chat.proxy;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
@@ -341,8 +342,10 @@ class OllamaWithOpenAiChatModelIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -357,11 +360,13 @@ class OllamaWithOpenAiChatModelIT {
@ValueSource(strings = { "llava" })
void multiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(URI.create("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));
@@ -376,11 +381,13 @@ class OllamaWithOpenAiChatModelIT {
@ValueSource(strings = { "llava" })
void streamingMultiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
Flux<ChatResponse> response = this.chatModel
.stream(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().model(modelName).build()));

View File

@@ -17,6 +17,7 @@
package org.springframework.ai.vertexai.gemini;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.List;
@@ -83,8 +84,11 @@ public class CreateGeminiRequestTests {
var systemMessage = new SystemMessage("System Message Text");
var userMessage = new UserMessage("User Message Text",
List.of(Media.builder().mimeType(MimeTypeUtils.IMAGE_PNG).data(new URL("http://example.com")).build()));
var userMessage = UserMessage.builder()
.text("User Message Text")
.media(List
.of(Media.builder().mimeType(MimeTypeUtils.IMAGE_PNG).data(URI.create("http://example.com")).build()))
.build();
var client = VertexAiGeminiChatModel.builder()
.vertexAI(this.vertexAI)

View File

@@ -261,8 +261,10 @@ class VertexAiGeminiChatModelIT {
var data = new ClassPathResource("/vertex.test.png");
var userMessage = new UserMessage("Explain what do you see o this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, data)));
var userMessage = UserMessage.builder()
.text("Explain what do you see o this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, data)))
.build();
var response = this.chatModel.call(new Prompt(List.of(userMessage)));
@@ -299,9 +301,10 @@ class VertexAiGeminiChatModelIT {
var pdfData = new ClassPathResource("/spring-ai-reference-overview.pdf");
var userMessage = new UserMessage(
"You are a very professional document summarization specialist. Please summarize the given document.",
List.of(new Media(new MimeType("application", "pdf"), pdfData)));
var userMessage = UserMessage.builder()
.text("You are a very professional document summarization specialist. Please summarize the given document.")
.media(List.of(new Media(new MimeType("application", "pdf"), pdfData)))
.build();
var response = this.chatModel.call(new Prompt(List.of(userMessage)));

View File

@@ -17,6 +17,7 @@
package org.springframework.ai.zhipuai.chat;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
@@ -298,8 +299,10 @@ class ZhiPuAiChatModelIT {
var imageData = new ClassPathResource("/test.png");
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)))
.build();
var response = this.chatModel
.call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().model(modelName).build()));
@@ -313,11 +316,13 @@ class ZhiPuAiChatModelIT {
@ValueSource(strings = { "glm-4v" })
void multiModalityImageUrl(String modelName) throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(URI.create("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
ChatResponse response = this.chatModel
.call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().model(modelName).build()));
@@ -330,11 +335,13 @@ class ZhiPuAiChatModelIT {
@Test
void streamingMultiModalityImageUrl() throws IOException {
var userMessage = new UserMessage("Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));
var userMessage = UserMessage.builder()
.text("Explain what do you see on this picture?")
.media(List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(URI.create("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()))
.build();
Flux<ChatResponse> response = this.streamingChatModel.stream(new Prompt(List.of(userMessage),
ZhiPuAiChatOptions.builder().model(ZhiPuAiApi.ChatModel.GLM_4V.getValue()).build()));

View File

@@ -94,7 +94,7 @@ public class MessageChatMemoryAdvisor extends AbstractChatMemoryAdvisor<ChatMemo
AdvisedRequest advisedRequest = AdvisedRequest.from(request).messages(advisedMessages).build();
// 4. Add the new user input to the conversation memory.
UserMessage userMessage = new UserMessage(request.userText(), request.media());
UserMessage userMessage = UserMessage.builder().text(request.userText()).media(request.media()).build();
this.getChatMemoryStore().add(this.doGetConversationId(request.adviseContext()), userMessage);
return advisedRequest;

View File

@@ -130,7 +130,7 @@ public class PromptChatMemoryAdvisor extends AbstractChatMemoryAdvisor<ChatMemor
.build();
// 4. Add the new user input to the conversation memory.
UserMessage userMessage = new UserMessage(request.userText(), request.media());
UserMessage userMessage = UserMessage.builder().text(request.userText()).media(request.media()).build();
this.getChatMemoryStore().add(this.doGetConversationId(request.adviseContext()), userMessage);
return advisedRequest;

View File

@@ -246,7 +246,7 @@ public record AdvisedRequest(
.build()
.render();
}
messages.add(new UserMessage(processedUserText, this.media()));
messages.add(UserMessage.builder().text(processedUserText).media(this.media()).build());
}
if (this.chatOptions() instanceof ToolCallingChatOptions toolCallingChatOptions) {

View File

@@ -478,7 +478,7 @@ public class ChatClientTest {
var media = new Media(MimeTypeUtils.IMAGE_JPEG,
new DefaultResourceLoader().getResource("classpath:/bikes.json"));
UserMessage message = new UserMessage("User prompt", List.of(media));
UserMessage message = UserMessage.builder().text("User prompt").media(List.of(media)).build();
Prompt prompt = new Prompt(message);
assertThat(ChatClient.builder(this.chatModel).build().prompt(prompt).call().content()).isEqualTo("response");
@@ -605,7 +605,7 @@ public class ChatClientTest {
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("response")))));
var chatClient = ChatClient.builder(this.chatModel).build();
var prompt = new Prompt(new SystemMessage("instructions"), new UserMessage("my question"));
var prompt = new Prompt(new SystemMessage("instructions"), UserMessage.builder().text("my question").build());
var content = chatClient.prompt(prompt).call().content();
assertThat(content).isEqualTo("response");

View File

@@ -44,47 +44,15 @@ public class UserMessage extends AbstractMessage implements MediaContent {
this(textContent, new ArrayList<>(), Map.of());
}
public UserMessage(Resource resource) {
this(MessageUtils.readResource(resource));
}
/**
* @deprecated use {@link #builder()} instead.
*/
@Deprecated
public UserMessage(String textContent, List<Media> media) {
this(MessageType.USER, textContent, media, Map.of());
}
/**
* @deprecated use {@link #builder()} instead.
*/
@Deprecated
public UserMessage(String textContent, Media... media) {
this(textContent, Arrays.asList(media));
}
/**
* @deprecated use {@link #builder()} instead. Will be made private in the next
* release.
*/
@Deprecated
public UserMessage(String textContent, Collection<Media> media, Map<String, Object> metadata) {
private UserMessage(String textContent, Collection<Media> media, Map<String, Object> metadata) {
super(MessageType.USER, textContent, metadata);
Assert.notNull(media, "media cannot be null");
Assert.noNullElements(media, "media cannot have null elements");
this.media = new ArrayList<>(media);
}
/**
* @deprecated use {@link #builder()} instead.
*/
@Deprecated
public UserMessage(MessageType messageType, String textContent, Collection<Media> media,
Map<String, Object> metadata) {
super(messageType, textContent, metadata);
Assert.notNull(media, "media data must not be null");
this.media = new ArrayList<>(media);
public UserMessage(Resource resource) {
this(MessageUtils.readResource(resource));
}
@Override
@@ -105,7 +73,7 @@ public class UserMessage extends AbstractMessage implements MediaContent {
}
public UserMessage copy() {
return new UserMessage(getText(), List.copyOf(getMedia()), Map.copyOf(getMetadata()));
return new Builder().text(getText()).media(List.copyOf(getMedia())).metadata(Map.copyOf(getMetadata())).build();
}
public Builder mutate() {